diff options
Diffstat (limited to 'listen/nrdump.c')
-rw-r--r-- | listen/nrdump.c | 127 |
1 files changed, 91 insertions, 36 deletions
diff --git a/listen/nrdump.c b/listen/nrdump.c index 190ac8d..419c8e8 100644 --- a/listen/nrdump.c +++ b/listen/nrdump.c @@ -1,8 +1,11 @@ -/* @(#) $Header: /cvsroot/ax25/ax25-apps/listen/nrdump.c,v 1.1.1.1 2001/04/10 01:58:54 csmall Exp $ */ +/* @(#) $Header: /home/ax25-cvs/ax25-apps/listen/nrdump.c,v 1.3 2001/11/27 04:57:43 csmall Exp $ */ /* NET/ROM header tracing routines * Copyright 1991 Phil Karn, KA9Q + * + * Added decoding of INP route information frames, Jeroen (PE1RXQ) */ + #include <stdio.h> #include <string.h> #include "listen.h" @@ -28,36 +31,80 @@ #define NR3NODESIG 0xFF #define NR3POLLSIG 0xFE +#define UI 0x03 + static void netrom_flags(int); +/* Display INP route information frames */ +static void netrom_inp_dump(unsigned char *data, int length) +{ + char node[10]; + char alias[7]; + int hops; + int tt; + int alen; + int i; + + if (data[0]==0xff) { + lprintf(T_AXHDR, "INP Route Information Frame:\n"); + i=1; + while (i<length-10) { + pax25(node, data+i); + i+=7; + hops=data[i++]; + tt=data[i++]*256; + tt+=data[i++]; + alias[0]=0; + while (i<length-data[i] && data[i]) { + if (data[i+1]==0x00) { + alen=data[i]-2; + alen=alen < 7 ? alen : 6; + memcpy(alias, data+i+2, alen); + alias[alen]=0; + } + i+=data[i]; + } + i++; + lprintf(T_DATA, " %12s %-6s %6u %6u\n", node, alias, hops, tt); + } + } +} + /* Display NET/ROM network and transport headers */ -void netrom_dump(unsigned char *data, int length, int hexdump) +void netrom_dump(unsigned char *data, int length, int hexdump, int type) { char tmp[15]; register int i; /* See if it is a routing broadcast */ if (data[0] == NR3NODESIG) { + /* Filter out INP routing frames */ + if (type!=UI) { + netrom_inp_dump(data, length); + return; + } memcpy(tmp, data + 1, ALEN); tmp[ALEN] = '\0'; lprintf(T_AXHDR, "NET/ROM Routing: %s\n", tmp); - - data += (ALEN + 1); + + data += (ALEN + 1); length -= (ALEN + 1); - for(i = 0;i < NRDESTPERPACK;i++) { - if (length < AXLEN) break; - - lprintf(T_DATA," %12s", pax25(tmp, data)); + for (i = 0; i < NRDESTPERPACK; i++) { + if (length < AXLEN) + break; + lprintf(T_DATA, " %12s", pax25(tmp, data)); memcpy(tmp, data + AXLEN, ALEN); tmp[ALEN] = '\0'; lprintf(T_DATA, "%8s", tmp); - lprintf(T_DATA, " %12s", pax25(tmp, data + AXLEN + ALEN)); - lprintf(T_DATA, " %3u\n", data[AXLEN + ALEN + AXLEN]); + lprintf(T_DATA, " %12s", + pax25(tmp, data + AXLEN + ALEN)); + lprintf(T_DATA, " %3u\n", + data[AXLEN + ALEN + AXLEN]); - data += (AXLEN + ALEN + AXLEN + 1); + data += (AXLEN + ALEN + AXLEN + 1); length -= (AXLEN + ALEN + AXLEN + 1); } @@ -76,63 +123,73 @@ void netrom_dump(unsigned char *data, int length, int hexdump) lprintf(T_AXHDR, "NET/ROM: "); lprintf(T_ADDR, "%s->", pax25(tmp, data)); lprintf(T_ADDR, "%s", pax25(tmp, data + AXLEN)); - lprintf(T_AXHDR," ttl %d\n", data[AXLEN + AXLEN]); + lprintf(T_AXHDR, " ttl %d\n", data[AXLEN + AXLEN]); - data += (AXLEN + AXLEN + 1); + data += (AXLEN + AXLEN + 1); length -= (AXLEN + AXLEN + 1); switch (data[4] & NR4OPCODE) { - case NR4OPPID: /* network PID extension */ + case NR4OPPID: /* network PID extension */ if (data[0] == NRPROTO_IP && data[1] == NRPROTO_IP) { ip_dump(data + 5, length - 5, hexdump); return; } else { - lprintf(T_AXHDR, " protocol family %x, proto %x", - data[0], data[1]); + lprintf(T_AXHDR, + " protocol family %x, proto %x", + data[0], data[1]); } break; - case NR4OPCONRQ: /* Connect request */ - lprintf(T_AXHDR, " conn rqst: my ckt %02X/%02X", data[0], data[1]); + case NR4OPCONRQ: /* Connect request */ + lprintf(T_AXHDR, " conn rqst: my ckt %02X/%02X", + data[0], data[1]); lprintf(T_AXHDR, " wnd %d", data[5]); lprintf(T_ADDR, " %s", pax25(tmp, data + 6)); lprintf(T_ADDR, "@%s", pax25(tmp, data + 6 + AXLEN)); - data += AXLEN + AXLEN + 6; + data += AXLEN + AXLEN + 6; length -= AXLEN + AXLEN + 6; if (length > 0) - lprintf(T_AXHDR, " timeout %d", data[1] * 256 + data[0]); + lprintf(T_AXHDR, " timeout %d", + data[1] * 256 + data[0]); lprintf(T_AXHDR, "\n"); break; - case NR4OPCONAK: /* Connect acknowledgement */ - lprintf(T_AXHDR," conn ack: ur ckt %02X/%02X my ckt %02X/%02X", data[0], data[1], data[2], data[3]); + case NR4OPCONAK: /* Connect acknowledgement */ + lprintf(T_AXHDR, + " conn ack: ur ckt %02X/%02X my ckt %02X/%02X", + data[0], data[1], data[2], data[3]); lprintf(T_AXHDR, " wnd %d", data[5]); netrom_flags(data[4]); break; - case NR4OPDISRQ: /* Disconnect request */ - lprintf(T_AXHDR, " disc: ur ckt %02X/%02X\n", data[0], data[1]); + case NR4OPDISRQ: /* Disconnect request */ + lprintf(T_AXHDR, " disc: ur ckt %02X/%02X\n", + data[0], data[1]); break; - case NR4OPDISAK: /* Disconnect acknowledgement */ - lprintf(T_AXHDR, " disc ack: ur ckt %02X/%02X\n", data[0], data[1]); + case NR4OPDISAK: /* Disconnect acknowledgement */ + lprintf(T_AXHDR, " disc ack: ur ckt %02X/%02X\n", + data[0], data[1]); break; - case NR4OPINFO: /* Information (data) */ - lprintf(T_AXHDR, " info: ur ckt %02X/%02X", data[0], data[1]); + case NR4OPINFO: /* Information (data) */ + lprintf(T_AXHDR, " info: ur ckt %02X/%02X", + data[0], data[1]); lprintf(T_AXHDR, " txseq %d rxseq %d", data[2], data[3]); netrom_flags(data[4]); data_dump(data + 5, length - 5, hexdump); break; - case NR4OPACK: /* Information acknowledgement */ - lprintf(T_AXHDR, " info ack: ur ckt %02X/%02X", data[0], data[1]); + case NR4OPACK: /* Information acknowledgement */ + lprintf(T_AXHDR, " info ack: ur ckt %02X/%02X", + data[0], data[1]); lprintf(T_AXHDR, " rxseq %d", data[3]); netrom_flags(data[4]); break; default: - lprintf(T_AXHDR, " unknown transport type %d\n", data[4] & 0x0f) ; + lprintf(T_AXHDR, " unknown transport type %d\n", + data[4] & 0x0f); break; } } @@ -141,15 +198,13 @@ void netrom_dump(unsigned char *data, int length, int hexdump) static void netrom_flags(int flags) { if (flags & NR4CHOKE) - lprintf(T_AXHDR," CHOKE"); + lprintf(T_AXHDR, " CHOKE"); if (flags & NR4NAK) - lprintf(T_AXHDR," NAK"); + lprintf(T_AXHDR, " NAK"); if (flags & NR4MORE) - lprintf(T_AXHDR," MORE"); + lprintf(T_AXHDR, " MORE"); lprintf(T_AXHDR, "\n"); } - - |