#define PACKET_VERSION 1 #define DNSNAME_MAX 20 struct packet { u_int8_t ver; u_int8_t type; /* XXX nicer way for _SIZE ... ? */ #define PACKET_NEWCONN 0 #define PACKET_NEWCONN_SIZE (2 + sizeof((struct packet *)0)->pdat.newconn) #define PACKET_DELCONN 1 #define PACKET_DELCONN_SIZE (2 + sizeof((struct packet *)0)->pdat.delconn) #define PACKET_DATA 2 #define PACKET_DATA_SIZE (2 + sizeof((struct packet *)0)->pdat.data) #define PACKET_NAME 3 #define PACKET_NAME_SIZE ((2 + sizeof((struct packet *)0)->pdat.name) - DNSNAME_MAX) union { struct newconn { u_int16_t id; u_int32_t src; u_int32_t dst; u_int8_t proto; u_int8_t size; } newconn; struct delconn { u_int16_t id; } delconn; struct data { u_int16_t connid; u_int8_t size; } data; struct name { u_int32_t addr; u_int8_t len; u_char fqdn[DNSNAME_MAX]; } name; } pdat; #define newconn_id pdat.newconn.id #define newconn_src pdat.newconn.src #define newconn_dst pdat.newconn.dst #define newconn_proto pdat.newconn.proto #define newconn_size pdat.newconn.size #define delconn_id pdat.delconn.id #define data_connid pdat.data.connid #define data_size pdat.data.size #define name_addr pdat.name.addr #define name_len pdat.name.len #define name_fqdn pdat.name.fqdn };