From 0fceb64d25ff3d9586549bb43d971c5eef904330 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Mon, 7 Jun 1999 10:23:42 +0200 Subject: Import ax25-apps 0.0.1 from tarball --- listen/flexnetdump.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 listen/flexnetdump.c (limited to 'listen/flexnetdump.c') diff --git a/listen/flexnetdump.c b/listen/flexnetdump.c new file mode 100644 index 0000000..3269390 --- /dev/null +++ b/listen/flexnetdump.c @@ -0,0 +1,149 @@ +/* + * FlexNet internode communication dump + */ + +#include +#include +#include +#include "listen.h" + +/* + * This was hacked by Thomas Sailer, sailer@ife.ee.ethz.ch, HB9JNX/AE4WA, with + * some bits stolen from Dieter Deyke (Wampes), such as these defines :-) + */ + +#define FLEX_INIT '0' /* Link initialization */ +#define FLEX_RPRT '1' /* Poll answer */ +#define FLEX_POLL '2' /* Poll */ +#define FLEX_ROUT '3' /* Routing information */ +#define FLEX_QURY '6' /* Path query */ +#define FLEX_RSLT '7' /* Query result */ + +static int flx_get_number(unsigned char **data, int *length) +{ + int l = *length; + unsigned char *d = *data; + int res = 0; + + if (l <= 0 || *d < '0' || *d > '9') + return -1; + while (l > 0 && *d >= '0' && *d <= '9') { + res = res * 10 + (*d++) - '0'; + l--; + } + *data = d; + *length = l; + return res; +} + +static void dump_end(unsigned char *data, int length) +{ + if (length <= 0) + return; + for (; length > 0; length--, data++) + lprintf(T_FLEXNET, " %02x", *data); + lprintf(T_FLEXNET, "\n"); +} + +void flexnet_dump(unsigned char *data, int length, int hexdump) +{ + int i; + int hopcnt, qsonr; + unsigned char *cp; + + lprintf(T_PROTOCOL, "FlexNet:"); + + if (length < 1) { + lprintf(T_ERROR, " bad packet\n"); + return; + } + switch (data[0]) { + default: + lprintf(T_ERROR, " unknown packet type\n"); + data_dump(data, length, hexdump); + return; + + case FLEX_INIT: + if (length < 2) { + lprintf(T_ERROR, " bad packet\n"); + dump_end(data+1, length-1); + return; + } + lprintf(T_FLEXNET, " Link setup - max SSID %d ", data[1] & 0xf); + dump_end(data+1, length-1); + return; + + case FLEX_RPRT: + lprintf(T_FLEXNET, " Poll response -"); + data++; + length--; + i = flx_get_number(&data, &length); + data++; + length--; + if (i < 0) + goto too_short; + lprintf(T_FLEXNET, " delay: %d\n", i); + dump_end(data, length); + return; + + case FLEX_POLL: + lprintf(T_FLEXNET, " Poll"); + return; + + case FLEX_ROUT: + data++; + length--; + lprintf(T_FLEXNET, " Routing\n"); + while (length > 0) { + if (isdigit(*data) || isupper(*data)) { + if (length < 10) + goto too_short; + lprintf(T_FLEXNET, " %.6s %2d-%2d ", data, data[6]-'0', data[7]-'0'); + data += 8; + length -= 8; + i = flx_get_number(&data, &length); + data++; + length--; + if (!i) + lprintf(T_FLEXNET, "link down\n"); + else + lprintf(T_FLEXNET, "delay: %d\n", i); + } else { + if (*data == '+') + lprintf(T_FLEXNET, " Request token\n"); + else if (*data == '-') + lprintf(T_FLEXNET, " Release token\n"); + else if (*data != '\r') + lprintf(T_FLEXNET, " invalid char: %02x\n", *data); + data++; + length--; + } + } + return; + + case FLEX_QURY: + case FLEX_RSLT: + lprintf(T_FLEXNET, " Route query"); + if (*data == FLEX_RSLT) + lprintf(T_FLEXNET, " response"); + if (length < 2) + goto too_short; + hopcnt = data[1] - ' '; + data += 2; + length -= 2; + qsonr = flx_get_number(&data, &length); + data++; + length--; + lprintf(T_FLEXNET, " - hop count: %d QSO number: %d\n", hopcnt, qsonr); + cp = memchr(data, '\r', length); + if (cp) + *cp = 0; + lprintf(T_FLEXNET, " data"); + return; + } + +too_short: + lprintf(T_ERROR, " packet too short\n"); + dump_end(data, length); +} + -- cgit v1.2.3