ref: eea3e7f97185f0c6ac097bad8009f23eee9b7b20
dir: /pkt.c/
#include <stdio.h> #include <stdint.h> #include <pcap.h> #include "common.h" /* * todo: replace IPROTO with our own */ char* pktTypeToStr(const u_char pkt) { switch(pkt) { case IPPROTO_UDP: return "UDP"; case IPPROTO_TCP: return "TCP"; default: err(1, "pktTypeToStr(%d): unkown type", pkt); return NULL; } } int parsePkt(const u_char *pkt, Pkt *p) { p->version = IP4_V(pkt[0]); p->headerlen = IP4_HL(pkt[0]) * 4; p->len = get2(pkt + PKT_LEN); p->ttl = pkt[PKT_TTL]; p->proto = pkt[PKT_PROTO]; p->sum = get2(pkt + PKT_SUM); p->srcip = get4(pkt + PKT_SRC); p->dstip = get4(pkt + PKT_DST); return 1; } void printPkt(Pkt p) { printf("ip packet info:\n" "\tversion: 0x%x\theaderlen: 0x%x\tlen: 0x%x\n", p.version, p.headerlen, p.len); printf("\tttl: 0%x (%d)\tproto 0%x (%s)\tsum: 0x%x\n", p.ttl, p.ttl, p.proto, pktTypeToStr(p.proto), p.sum); printf("\tsrcip: 0x%x\tdstip: 0x%x\n", p.srcip, p.dstip); } Parser pktParser = { .parse = parsePkt, .print = printPkt, };