summaryrefslogtreecommitdiffstats
path: root/listen/nrdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'listen/nrdump.c')
-rw-r--r--listen/nrdump.c127
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");
}
-
-