wm: dnsparser

ref: 13738d2aa200eeb5859525225ec1d7bec7e8134e
dir: /ether.c/

View raw version
#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,
};