ref: 16d016b87e7783cecedb1078c1327fa1244da4d7
dir: /ether.c/
#include <stdio.h> #include <stdint.h> #include <pcap.h> #include "common.h" char* etherTypeToStr(uint16_t frame) { switch(frame) { case ETHER_IP4: return "IPv4"; case ETHER_IP6: return "IPv6"; default: err(1, "etherTypeToStr(%d): unkown type", frame); return "unkown"; } } int parseEther(const u_char *pkt, Ether *e) { e->start = pos; for(int i = 0 ; i < ETHER_ADDR_LEN ; i++) e->dst[i] = pkt[i]; pos += ETHER_DST; for(int i = 0 ; i < ETHER_ADDR_LEN ; i++) e->src[i] = pkt[i+ETHER_ADDR_LEN]; pos += ETHER_SRC; get(pkt, ETHER_TYPE, &e->type); return 1; } void printEther(Ether e) { printf("ether info:\n\tdst: "); for(int i = 0 ; i < ETHER_ADDR_LEN ; i++) printf("%x:", e.dst[i]); printf("\tsrc: "); for(int i = 0 ; i < ETHER_ADDR_LEN ; i++) printf("%x:", e.src[i]); printf("\ttype: 0x%x (%s)\n", e.type, etherTypeToStr(e.type)); } Parser etherParser = { .name = "ethernet", .parse = parseEther, .print = printEther, };