#include #include #ifndef RIPCMD_POLL #define RIPCMD_POLL 5 #endif #ifndef RIPCMD_POLLENTRY #define RIPCMD_POLLENTRY 6 #endif #include "main.h" #include "route.h" #include "util.h" #include "vars.h" void dump_route(void) { int rip_cmd; int rip_vers; printx(pkt,0); printf("RIP packet\n"); need(4,"minimum RIP packet"); rip_cmd = get8(0); printx(pkt,1); printf("rip_cmd %d",rip_cmd); switch (rip_cmd) { case RIPCMD_REQUEST: printf(" [REQUEST]"); break; case RIPCMD_RESPONSE: printf(" [RESPONSE]"); break; case RIPCMD_TRACEON: printf(" [TRACEON]"); break; case RIPCMD_TRACEOFF: printf(" [TRACEOFF]"); break; case RIPCMD_POLL: printf(" [POLL]"); break; case RIPCMD_POLLENTRY: printf(" [POLLENTRY]"); break; } printf("\n"); consume(1); rip_vers = get8(0); printx(pkt,1); printf("rip_vers %d\n",rip_vers); if (rip_vers == 0) return; consume(1); printx(pkt,2); printf("%s\n",(rip_vers==1)?"MBZ":"padding"); if ((rip_vers == 1) && get16(0)) { printf("*** nonzero MBZ field\n"); dumpabort(); } consume(2); switch (rip_cmd) { case RIPCMD_REQUEST: case RIPCMD_RESPONSE: while (pktleft >= 20) { unsigned short int af; unsigned long int addr; af = get16(0); printx(pkt,2); printf("address family %d",af); if (af == 2) printf(" [IP]"); printf("\n"); consume(2); printx(pkt,2); printf("%s\n",(rip_vers==1)?"MBZ":"padding"); if ((rip_vers == 1) && get16(0)) { printf("*** nonzero MBZ field\n"); dumpabort(); } consume(2); if (rip_vers == 1) { printx(pkt,4); printf("address"); if (af == 2) { addr = get32(0); printf(" [%lu.%lu.%lu.%lu]",addr>>24,(addr>>16)&0xff,(addr>>8)&0xff,addr&0xff); } printf("\n"); consume(4); printx(pkt,8); printf("%s\n",(rip_vers==1)?"MBZ":"padding"); if ((rip_vers == 1) && get32(0)) { printf("*** nonzero MBZ field\n"); dumpabort(); } consume(4); if ((rip_vers == 1) && get32(0)) { printf("*** nonzero MBZ field\n"); dumpabort(); } consume(4); } else { if (af == 2) { printx(pkt,4); printf("address"); addr = get32(0); printf(" [%lu.%lu.%lu.%lu]\n",addr>>24,(addr>>16)&0xff,(addr>>8)&0xff,addr&0xff); consume(4); printx(pkt,8); printf("padding\n"); consume(8); } else { printx(pkt,12); printf("address\n"); consume(12); } } printx(pkt,4); printf("metric %lu\n",get32(0)); consume(4); } break; } }