blob: 4db288a58465f4edcddc5de669ba0cb24c53372d [file] [log] [blame] [raw]
/*
* Copyright (C) 2000-2005 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
* $Id$
*/
#include "ipf.h"
#ifndef IP_OFFMASK
# define IP_OFFMASK 0x3fff
#endif
void printpacket(dir, m)
int dir;
mb_t *m;
{
u_short len, off;
tcphdr_t *tcp;
ip_t *ip;
ip = MTOD(m, ip_t *);
if (IP_V(ip) == 6) {
len = ntohs(((u_short *)ip)[2]) + 40;
} else {
len = ntohs(ip->ip_len);
}
ASSERT(len == msgdsize(m));
if ((opts & OPT_HEX) == OPT_HEX) {
u_char *s;
int i;
for (; m != NULL; m = m->mb_next) {
len = m->mb_len;
for (s = (u_char *)m->mb_data, i = 0; i < len; i++) {
printf("%02x", *s++ & 0xff);
if (len - i > 1) {
i++;
printf("%02x", *s++ & 0xff);
}
putchar(' ');
}
}
putchar('\n');
putchar('\n');
return;
}
if (IP_V(ip) == 6) {
printpacket6(dir, m);
return;
}
if (dir)
printf("> ");
else
printf("< ");
off = ntohs(ip->ip_off);
tcp = (struct tcphdr *)((char *)ip + (IP_HL(ip) << 2));
printf("ip #%d %d(%d) %d", ntohs(ip->ip_id), ntohs(ip->ip_len),
IP_HL(ip) << 2, ip->ip_p);
if (off & IP_OFFMASK)
printf(" @%d", off << 3);
printf(" %s", inet_ntoa(ip->ip_src));
if (!(off & IP_OFFMASK))
if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
printf(",%d", ntohs(tcp->th_sport));
printf(" > ");
printf("%s", inet_ntoa(ip->ip_dst));
if (!(off & IP_OFFMASK)) {
if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
printf(",%d", ntohs(tcp->th_dport));
if ((ip->ip_p == IPPROTO_TCP) && (tcp->th_flags != 0)) {
putchar(' ');
if (tcp->th_flags & TH_FIN)
putchar('F');
if (tcp->th_flags & TH_SYN)
putchar('S');
if (tcp->th_flags & TH_RST)
putchar('R');
if (tcp->th_flags & TH_PUSH)
putchar('P');
if (tcp->th_flags & TH_ACK)
putchar('A');
if (tcp->th_flags & TH_URG)
putchar('U');
if (tcp->th_flags & TH_ECN)
putchar('E');
if (tcp->th_flags & TH_CWR)
putchar('C');
}
}
putchar('\n');
}