21 #include "packet.pb-c.h"
26 packet_pcap_init(
void *clos, nmsg_pcap_t);
29 packet_pkt_to_payload(
void *clos, nmsg_pcap_t, nmsg_message_t *);
36 .name =
"payload_type",
48 NMSG_MSGMOD_REQUIRED_INIT,
49 .vendor = NMSG_VENDOR_BASE,
50 .msgtype = { NMSG_VENDOR_BASE_PACKET_ID, NMSG_VENDOR_BASE_PACKET_NAME },
51 .pbdescr = &nmsg__base__packet__descriptor,
52 .fields = packet_fields,
53 .pkt_to_payload = packet_pkt_to_payload,
54 .pcap_init = packet_pcap_init
58 packet_pcap_init(
void *clos, nmsg_pcap_t pcap)
60 const char *dlt_name = NULL;
64 dlt_name = pcap_datalink_val_to_name(dlt);
66 dlt_name =
"(unknown)";
84 dlt_name = pcap_datalink_val_to_name(dlt);
85 fprintf(stderr,
"%s: ERROR: Refusing to process packets from "
86 "a non-live pcap handle with datalink type %s\n",
92 fprintf(stderr,
"%s: ERROR: Unable to open pcap handle with "
93 "datalink type %s\n", __func__, dlt_name);
99 fprintf(stderr,
"%s: opening pcap handle with datalink type %s\n",
105 packet_load(nmsg_pcap_t pcap, Nmsg__Base__Packet *packet,
106 struct pcap_pkthdr *pkt_hdr,
109 #define advance_pkt(_pkt, _len, _sz) do { \
113 size_t len = pkt_hdr->caplen;
117 if (pkt_hdr->caplen != pkt_hdr->len)
120 packet->payload_type = NMSG__BASE__PACKET_TYPE__IP;
126 advance_pkt(pkt, len, offsetof(
struct nmsg_ethhdr, ether_type));
127 load_net16(pkt, &type);
128 advance_pkt(pkt, len, 2);
129 if (type == ETHERTYPE_VLAN) {
132 advance_pkt(pkt, len, 2);
133 load_net16(pkt, &type);
134 advance_pkt(pkt, len, 2);
136 if (type == ETHERTYPE_IP || type == ETHERTYPE_IPV6)
147 advance_pkt(pkt, len, 14);
148 load_net16(pkt, &type);
149 advance_pkt(pkt, len, 2);
150 if (type == ETHERTYPE_IP || type == ETHERTYPE_IPV6)
156 if (len <
sizeof(type))
158 memcpy(&type, pkt,
sizeof(type));
159 advance_pkt(pkt, len,
sizeof(type));
160 if (type == PF_INET || type == PF_INET6)
165 if (len <
sizeof(type))
167 load_net32(pkt, &type);
168 advance_pkt(pkt, len,
sizeof(type));
169 if (type == PF_INET || type == PF_INET6)
178 packet->payload.data = (uint8_t *) pkt;
179 packet->payload.len = len;
185 packet_pkt_to_payload(
void *clos, nmsg_pcap_t pcap, nmsg_message_t *m)
187 Nmsg__Base__Packet packet;
188 ProtobufCBufferSimple sbuf;
190 const uint8_t *pkt_data;
191 struct pcap_pkthdr *pkt_hdr;
199 nmsg__base__packet__init(&packet);
201 res = packet_load(pcap, &packet, pkt_hdr, pkt_data);
205 sbuf.base.append = protobuf_c_buffer_simple_append;
207 sbuf.alloced = pkt_hdr->caplen + 64;
208 sbuf.data = malloc(sbuf.alloced);
209 if (sbuf.data == NULL)
211 sbuf.must_free_data = 1;
213 buf_sz = nmsg__base__packet__pack_to_buffer(&packet, (ProtobufCBuffer *) &sbuf);
214 if (sbuf.data == NULL)
218 NMSG_VENDOR_BASE_PACKET_ID,
219 sbuf.data, buf_sz, &ts);
Structure exported by message modules to implement a new message type.
nmsg_msgmod_type type
Module type.
Structure mapping protocol buffer schema fields to nmsg_msgmod_field_type values for "transparent" mo...
nmsg_msgmod_field_type type
Intended (nmsg) type of this protobuf field.
nmsg_message_t nmsg_message_from_raw_payload(unsigned vid, unsigned msgtype, uint8_t *data, size_t sz, const struct timespec *ts)
Initialize a new message object from an opaque payload blob.
int nmsg_get_debug(void)
Retrieve the current debug level.