/* * Print IPX datagram packets. */ void ipx_print(packetbody_t p, u_int length) { __capability const struct ipxHdr *ipx = (__capability const struct ipxHdr *)p; if (!eflag) printf("IPX "); PACKET_HAS_ELEMENT_OR_TRUNC(ipx, srcSkt); (void)printf("%s.%04x > ", ipxaddr_string(EXTRACT_32BITS(ipx->srcNet), ipx->srcNode), EXTRACT_16BITS(&ipx->srcSkt)); (void)printf("%s.%04x: ", ipxaddr_string(EXTRACT_32BITS(ipx->dstNet), ipx->dstNode), EXTRACT_16BITS(&ipx->dstSkt)); /* take length from ipx header */ PACKET_HAS_ELEMENT_OR_TRUNC(ipx, length); length = EXTRACT_16BITS(&ipx->length); ipx_decode(ipx, (packetbody_t)ipx + ipxSize, length - ipxSize); return; trunc: printf("[|ipx %d]", length); }
/* * Mobility Header */ int mobility_print(packetbody_t bp, packetbody_t bp2 _U_) { __capability const struct ip6_mobility *mh; int mhlen, hlen, type; mh = (__capability const struct ip6_mobility *)bp; if (!PACKET_HAS_ELEMENT(mh, ip6m_len)) { /* * There's not enough captured data to include the * mobility header length. * * Our caller expects us to return the length, however, * so return a value that will run to the end of the * captured data. * * XXX - "ip6_print()" doesn't do anything with the * returned length, however, as it breaks out of the * header-processing loop. */ mhlen = PACKET_REMAINING(bp); goto trunc; } mhlen = (int)((mh->ip6m_len + 1) << 3); /* XXX ip6m_cksum */ PACKET_HAS_ELEMENT_OR_TRUNC(mh, ip6m_type); type = mh->ip6m_type; switch (type) { case IP6M_BINDING_REQUEST: printf("mobility: BRR"); hlen = IP6M_MINLEN; break; case IP6M_HOME_TEST_INIT: case IP6M_CAREOF_TEST_INIT: printf("mobility: %soTI", type == IP6M_HOME_TEST_INIT ? "H" : "C"); hlen = IP6M_MINLEN; if (vflag) { PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 8); printf(" %s Init Cookie=%08x:%08x", type == IP6M_HOME_TEST_INIT ? "Home" : "Care-of", EXTRACT_32BITS(&bp[hlen]), EXTRACT_32BITS(&bp[hlen + 4])); } hlen += 8; break; case IP6M_HOME_TEST: case IP6M_CAREOF_TEST: printf("mobility: %soT", type == IP6M_HOME_TEST ? "H" : "C"); PACKET_HAS_ELEMENT_OR_TRUNC(mh, ip6m_data16[0]); printf(" nonce id=0x%x", EXTRACT_16BITS(&mh->ip6m_data16[0])); hlen = IP6M_MINLEN; if (vflag) { PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 8); printf(" %s Init Cookie=%08x:%08x", type == IP6M_HOME_TEST ? "Home" : "Care-of", EXTRACT_32BITS(&bp[hlen]), EXTRACT_32BITS(&bp[hlen + 4])); } hlen += 8; if (vflag) { PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 8); printf(" %s Keygen Token=%08x:%08x", type == IP6M_HOME_TEST ? "Home" : "Care-of", EXTRACT_32BITS(&bp[hlen]), EXTRACT_32BITS(&bp[hlen + 4])); } hlen += 8; break; case IP6M_BINDING_UPDATE: printf("mobility: BU"); PACKET_HAS_ELEMENT_OR_TRUNC(mh, ip6m_data16[0]); printf(" seq#=%d", EXTRACT_16BITS(&mh->ip6m_data16[0])); hlen = IP6M_MINLEN; PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 1); if (bp[hlen] & 0xf0) printf(" "); if (bp[hlen] & 0x80) printf("A"); if (bp[hlen] & 0x40) printf("H"); if (bp[hlen] & 0x20) printf("L"); if (bp[hlen] & 0x10) printf("K"); /* Reserved (4bits) */ hlen += 1; /* Reserved (8bits) */ hlen += 1; PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 2); /* units of 4 secs */ printf(" lifetime=%d", EXTRACT_16BITS(&bp[hlen]) << 2); hlen += 2; break; case IP6M_BINDING_ACK: printf("mobility: BA"); PACKET_HAS_ELEMENT_OR_TRUNC(mh, ip6m_data8[0]); printf(" status=%d", mh->ip6m_data8[0]); if (mh->ip6m_data8[1] & 0x80) printf(" K"); /* Reserved (7bits) */ hlen = IP6M_MINLEN; PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 2); printf(" seq#=%d", EXTRACT_16BITS(&bp[hlen])); hlen += 2; PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 2); /* units of 4 secs */ printf(" lifetime=%d", EXTRACT_16BITS(&bp[hlen]) << 2); hlen += 2; break; case IP6M_BINDING_ERROR: printf("mobility: BE"); PACKET_HAS_ELEMENT_OR_TRUNC(mh, ip6m_data8[0]); printf(" status=%d", mh->ip6m_data8[0]); /* Reserved */ hlen = IP6M_MINLEN; PACKET_HAS_SPACE_OR_TRUNC(mh, hlen + 16); printf(" homeaddr %s", ip6addr_string(&bp[hlen])); hlen += 16; break; default: printf("mobility: type-#%d len=%d", type, mh->ip6m_len); return(mhlen); break; } if (vflag) mobility_opt_print(&bp[hlen], mhlen - hlen); return(mhlen); trunc: fputs("[|MOBILITY]", stdout); return(mhlen); }
/* * Print trivial file transfer program requests */ void tftp_print(packetbody_t bp, u_int length) { __capability const struct tftphdr *tp; const char *cp; packetbody_t p; register int opcode, i; static char tstr[] = " [|tftp]"; tp = (__capability const struct tftphdr *)bp; /* Print length */ printf(" %d", length); /* Print tftp request type */ PACKET_HAS_ELEMENT_OR_TRUNC(tp, th_opcode); opcode = EXTRACT_16BITS(&tp->th_opcode); cp = tok2str(op2str, "tftp-#%d", opcode); printf(" %s", cp); /* Bail if bogus opcode */ if (*cp == 't') return; switch (opcode) { case RRQ: case WRQ: case OACK: p = (packetbody_t)tp->th_stuff; putchar(' '); /* Print filename or first option */ if (opcode != OACK) putchar('"'); i = fn_print(p, snapend); if (opcode != OACK) putchar('"'); /* Print the mode (RRQ and WRQ only) and any options */ while ((p = p_strchr(p, '\0')) != NULL) { if (length <= (u_int)(p - (packetbody_t)&tp->th_block)) break; p++; if (*p != '\0') { putchar(' '); fn_print(p, snapend); } } if (i) goto trunc; break; case ACK: case DATA: PACKET_HAS_ELEMENT_OR_TRUNC(tp, th_block); printf(" block %d", EXTRACT_16BITS(&tp->th_block)); break; case TFTP_ERROR: /* Print error code string */ PACKET_HAS_ELEMENT_OR_TRUNC(tp, th_code); printf(" %s \"", tok2str(err2str, "tftp-err-#%d \"", EXTRACT_16BITS(&tp->th_code))); /* Print error message string */ i = fn_print((packetbody_t)tp->th_data, snapend); putchar('"'); if (i) goto trunc; break; default: /* We shouldn't get here */ printf("(unknown #%d)", opcode); break; } return; trunc: fputs(tstr, stdout); return; }