wm: dnsparser

ref: 03a44eb1a1da64f1269f21217abe3253cdf47b5a
dir: /pkt.c/

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