- register u_char *cp, *ep;
-
- if (EXTRACT_16BITS(&ni->rip_family) != AF_INET) {
-
- printf(" [family %d:", EXTRACT_16BITS(&ni->rip_family));
- cp = (u_char *)&ni->rip_tag;
- ep = (u_char *)&ni->rip_metric + sizeof(ni->rip_metric);
- for (; cp < ep; cp += 2)
- printf(" %04x", EXTRACT_16BITS(cp));
- printf("]");
- } else if (vers < 2) {
- /* RFC 1058 */
- printf(" %s", ipaddr_string(&ni->rip_dest));
- } else {
- /* RFC 1723 */
- printf(" {%s", ipaddr_string(&ni->rip_dest));
- if (ni->rip_dest_mask)
- printf("/%s", ipaddr_string(&ni->rip_dest_mask));
- if (ni->rip_router)
- printf("->%s", ipaddr_string(&ni->rip_router));
- if (ni->rip_tag)
- printf(" tag %04x", EXTRACT_16BITS(&ni->rip_tag));
- printf("}");
+ register u_char *p;
+ register u_short family;
+ u_char buf[RIP_AUTHLEN];
+
+ family = EXTRACT_16BITS(&ni->rip_family);
+ if (family == 0xFFFF) { /* 16 bytes authentication ? */
+ if (EXTRACT_16BITS(&ni->rip_tag) == 2) { /* simple text authentication ? */
+ memcpy(buf, &ni->rip_dest, sizeof(buf));
+ buf[sizeof(buf)-1] = '\0';
+ for (p = buf; *p; p++) {
+ if (!isprint(*p))
+ break;
+ }
+ printf("\n\t Simple Text Authentication data: %s", buf);
+ } else {
+ printf("\n\t Unknown (%u) Authentication data:",
+ EXTRACT_16BITS(&ni->rip_tag));
+ print_unknown_data((u_int8_t *)&ni->rip_dest,"\n\t ",RIP_AUTHLEN);
+ }
+ } else if (family != AF_INET) {
+ printf("\n\t AFI: %u", family);
+ print_unknown_data((u_int8_t *)&ni->rip_tag,"\n\t ",RIP_ROUTELEN-2);
+ return;
+ } else { /* AF_INET */
+ printf("\n\t AFI: IPv4: %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ",
+ ipaddr_string(&ni->rip_dest),
+ mask2plen(EXTRACT_32BITS(&ni->rip_dest_mask)),
+ EXTRACT_16BITS(&ni->rip_tag),
+ EXTRACT_32BITS(&ni->rip_metric));
+ if (EXTRACT_32BITS(&ni->rip_router))
+ printf("%s", ipaddr_string(&ni->rip_router));
+ else
+ printf("self");