wm: dnsparser

ref: 16d016b87e7783cecedb1078c1327fa1244da4d7
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(0, "pktTypeToStr(%d): unkown type", pkt);
			return NULL;
	}
}

int
parsePkt(const u_char *pkt, Pkt *p)
{
	p->start = pos;
	
	/* they'r both half a byte */
	p->version = IP4_V(pkt[pos]);
	p->headerlen = IP4_HL(pkt[pos]) * 4;
	pos += PKT_VHL;

	get(pkt, PKT_DSFIELD, &p->dsfield);
	get(pkt, PKT_LEN, &p->len);
	get(pkt, PKT_ID, &p->id);
	
	/* flags are just 3 bits, smaller than a byte */
	p->flags = pkt[pos];

	/* this one is 12 bits */
	p->fragoffset = get2(pkt + pos);
	p->fragoffset &= 0x1FFF;
	pos += PKT_FRAGOFFSET;
	
	get(pkt, PKT_TTL, &p->ttl);
	get(pkt, PKT_PROTO, &p->proto);
	get(pkt, PKT_SUM, &p->sum);
	get(pkt, PKT_SRC, &p->srcip);
	get(pkt, PKT_SRC, &p->dstip);
	
	return 1;
}

void
printPkt(Pkt p)
{
	printf("ip packet info:\n"
	"\tversion: %#x\theaderlen: %#x\tdsfield: %b\n",
	p.version, p.headerlen, p.dsfield);

	printf("\tlen: %d (%#x)\tid: %#x (%d)\n",
	p.len, p.len, p.id, p.id);
	
	printf("\tflags: %b\tfragment offset: %b\n",
	p.flags, p.fragoffset);
	
	printf("\tttl: %#x (%d)\tproto %#x (%s)\tsum: %#x\n",
	p.ttl, p.ttl, p.proto, pktTypeToStr(p.proto), p.sum);
	
	printf("\tsrcip: %#x\tdstip: %#x\n", p.srcip, p.dstip);
}

Parser pktParser = {
	.name = "ipv4",
	.parse = parsePkt,
	.print = printPkt,
};