ref: 272dec2602bfb557af9464d21426d195b8e8e1a5
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,
};