void ipx_sap_print(const u_short *ipx, u_int length) { int command, i; TCHECK(ipx[0]); command = EXTRACT_16BITS(ipx); ipx++; length -= 2; switch (command) { case 1: case 3: if (command == 1) (void)printf("ipx-sap-req"); else (void)printf("ipx-sap-nearest-req"); if (length > 0) { TCHECK(ipx[1]); (void)printf(" %x '", EXTRACT_16BITS(&ipx[0])); fn_print((u_char *)&ipx[1], min(snapend, (u_char *)&ipx[1] + 48)); putchar('\''); } break; case 2: case 4: if (command == 2) (void)printf("ipx-sap-resp"); else (void)printf("ipx-sap-nearest-resp"); for (i = 0; i < 8 && length > 0; i++) { TCHECK2(ipx[27], 1); (void)printf(" %x '", EXTRACT_16BITS(&ipx[0])); fn_print((u_char *)&ipx[1], min(snapend, (u_char *)&ipx[1] + 48)); printf("' addr %s", ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27])); ipx += 32; length -= 64; } break; default: (void)printf("ipx-sap-?%x", command); break; } return; trunc: printf("[|ipx %d]", length); }
static int handle_reassoc_request(const u_char *p) { struct mgmt_body_t pbody; int offset = 0; memset(&pbody, 0, sizeof(pbody)); if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN + IEEE802_11_AP_LEN)) return 0; pbody.capability_info = EXTRACT_LE_16BITS(p); offset += IEEE802_11_CAPINFO_LEN; pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); offset += IEEE802_11_LISTENINT_LEN; memcpy(&pbody.ap, p+offset, IEEE802_11_AP_LEN); offset += IEEE802_11_AP_LEN; if (!parse_elements(&pbody, p, offset)) return 0; printf(" ("); fn_print(pbody.ssid.ssid, NULL); printf(") AP : %s", etheraddr_string( pbody.ap )); return 1; }
static int handle_probe_response(const u_char *p) { struct mgmt_body_t pbody; int offset = 0; memset(&pbody, 0, sizeof(pbody)); if (!TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + IEEE802_11_CAPINFO_LEN)) return 0; memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); offset += IEEE802_11_TSTAMP_LEN; pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); offset += IEEE802_11_BCNINT_LEN; pbody.capability_info = EXTRACT_LE_16BITS(p+offset); offset += IEEE802_11_CAPINFO_LEN; if (!parse_elements(&pbody, p, offset)) return 0; printf(" ("); fn_print(pbody.ssid.ssid, NULL); printf(") "); PRINT_RATES(pbody); printf(" CH: %u%s", pbody.ds.channel, CAPABILITY_PRIVACY(pbody.capability_info) ? ", PRIVACY" : "" ); return 1; }
void timed_print(netdissect_options *ndo, const u_char *bp) { const struct tsp *tsp = (const struct tsp *)bp; uint8_t tsp_type; int sec, usec; ndo->ndo_protocol = "timed"; ND_TCHECK_1(tsp->tsp_type); tsp_type = EXTRACT_U_1(tsp->tsp_type); if (tsp_type < TSPTYPENUMBER) ND_PRINT("TSP_%s", tsptype[tsp_type]); else ND_PRINT("(tsp_type %#x)", tsp_type); ND_TCHECK_1(tsp->tsp_vers); ND_PRINT(" vers %u", EXTRACT_U_1(tsp->tsp_vers)); ND_TCHECK_2(tsp->tsp_seq); ND_PRINT(" seq %u", EXTRACT_BE_U_2(tsp->tsp_seq)); switch (tsp_type) { case TSP_LOOP: ND_TCHECK_1(tsp->tsp_hopcnt); ND_PRINT(" hopcnt %u", EXTRACT_U_1(tsp->tsp_hopcnt)); break; case TSP_SETTIME: case TSP_ADJTIME: case TSP_SETDATE: case TSP_SETDATEREQ: ND_TCHECK_8(&tsp->tsp_time); sec = EXTRACT_BE_S_4(tsp->tsp_time.tv_sec); usec = EXTRACT_BE_S_4(tsp->tsp_time.tv_usec); /* XXX The comparison below is always false? */ if (usec < 0) /* invalid, skip the rest of the packet */ return; ND_PRINT(" time "); if (sec < 0 && usec != 0) { sec++; if (sec == 0) ND_PRINT("-"); usec = 1000000 - usec; } ND_PRINT("%d.%06d", sec, usec); break; } ND_PRINT(" name "); if (fn_print(ndo, (const u_char *)tsp->tsp_name, (const u_char *)tsp->tsp_name + sizeof(tsp->tsp_name))) goto trunc; return; trunc: ND_PRINT(" %s", tstr); }
/* ibid */ static const u_char * of10_desc_stats_reply_print(const u_char *cp, const u_char *ep, const u_int len) { if (len != sizeof(struct ofp_desc_stats)) goto corrupt; /* mfr_desc */ TCHECK2(*cp, DESC_STR_LEN); printf("\n\t mfr_desc '"); fn_print(cp, cp + DESC_STR_LEN); printf("'"); cp += DESC_STR_LEN; /* hw_desc */ TCHECK2(*cp, DESC_STR_LEN); printf("\n\t hw_desc '"); fn_print(cp, cp + DESC_STR_LEN); printf("'"); cp += DESC_STR_LEN; /* sw_desc */ TCHECK2(*cp, DESC_STR_LEN); printf("\n\t sw_desc '"); fn_print(cp, cp + DESC_STR_LEN); printf("'"); cp += DESC_STR_LEN; /* serial_num */ TCHECK2(*cp, SERIAL_NUM_LEN); printf("\n\t serial_num '"); fn_print(cp, cp + SERIAL_NUM_LEN); printf("'"); cp += SERIAL_NUM_LEN; /* dp_desc */ TCHECK2(*cp, DESC_STR_LEN); printf("\n\t dp_desc '"); fn_print(cp, cp + DESC_STR_LEN); printf("'"); return cp + DESC_STR_LEN; corrupt: /* skip the message body */ printf(" (corrupt)"); TCHECK2(*cp, len); return cp + len; trunc: printf(" [|openflow]"); return ep; }
/* ibid */ static const u_char * of10_table_stats_reply_print(const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; while (len) { if (len < sizeof(struct ofp_table_stats)) goto corrupt; /* table_id */ TCHECK2(*cp, 1); printf("\n\t table_id %s", tok2str(tableid_str, "%u", *cp)); cp += 1; /* pad */ TCHECK2(*cp, 3); cp += 3; /* name */ TCHECK2(*cp, OFP_MAX_TABLE_NAME_LEN); printf(", name '"); fn_print(cp, cp + OFP_MAX_TABLE_NAME_LEN); printf("'"); cp += OFP_MAX_TABLE_NAME_LEN; /* wildcards */ TCHECK2(*cp, 4); printf("\n\t wildcards 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofpfw_bm, EXTRACT_32BITS(cp), OFPFW_U); cp += 4; /* max_entries */ TCHECK2(*cp, 4); printf("\n\t max_entries %u", EXTRACT_32BITS(cp)); cp += 4; /* active_count */ TCHECK2(*cp, 4); printf(", active_count %u", EXTRACT_32BITS(cp)); cp += 4; /* lookup_count */ TCHECK2(*cp, 8); printf(", lookup_count %" PRIu64, EXTRACT_64BITS(cp)); cp += 8; /* matched_count */ TCHECK2(*cp, 8); printf(", matched_count %" PRIu64, EXTRACT_64BITS(cp)); cp += 8; len -= sizeof(struct ofp_table_stats); } /* while */ return cp; corrupt: /* skip the undersized trailing data */ printf(" (corrupt)"); TCHECK2(*cp0, len0); return cp0 + len0; trunc: printf(" [|openflow]"); return ep; }
void timed_print(netdissect_options *ndo, register const u_char *bp) { struct tsp *tsp = (struct tsp *)bp; long sec, usec; ND_TCHECK(tsp->tsp_type); if (tsp->tsp_type < TSPTYPENUMBER) ND_PRINT((ndo, "TSP_%s", tsptype[tsp->tsp_type])); else ND_PRINT((ndo, "(tsp_type %#x)", tsp->tsp_type)); ND_TCHECK(tsp->tsp_vers); ND_PRINT((ndo, " vers %u", tsp->tsp_vers)); ND_TCHECK(tsp->tsp_seq); ND_PRINT((ndo, " seq %u", tsp->tsp_seq)); switch (tsp->tsp_type) { case TSP_LOOP: ND_TCHECK(tsp->tsp_hopcnt); ND_PRINT((ndo, " hopcnt %u", tsp->tsp_hopcnt)); break; case TSP_SETTIME: case TSP_ADJTIME: case TSP_SETDATE: case TSP_SETDATEREQ: ND_TCHECK(tsp->tsp_time); sec = EXTRACT_32BITS(&tsp->tsp_time.tv_sec); usec = EXTRACT_32BITS(&tsp->tsp_time.tv_usec); /* XXX The comparison below is always false? */ if (usec < 0) /* corrupt, skip the rest of the packet */ return; ND_PRINT((ndo, " time ")); if (sec < 0 && usec != 0) { sec++; if (sec == 0) ND_PRINT((ndo, "-")); usec = 1000000 - usec; } ND_PRINT((ndo, "%ld.%06ld", sec, usec)); break; } ND_TCHECK(tsp->tsp_name); ND_PRINT((ndo, " name ")); if (fn_print(ndo, (u_char *)tsp->tsp_name, (u_char *)tsp->tsp_name + sizeof(tsp->tsp_name))) goto trunc; return; trunc: ND_PRINT((ndo, " %s", tstr)); }
/** * @brief Prints the queue contents. * @param Function pointer to printing a single queue element. */ void queue_print( void (*fn_print)(queue_data_t *element) ) { int i = head_idx; printf( "Queue (size %d)\n", queue_size() ); while ( i != tail_idx ) { printf( "[" ); fn_print( &q_buf[i] ); printf( "]" ); // Increment index i = ( i + 1 ) % QUEUE_BUF_SIZE; } puts(""); }
static int wb_id(netdissect_options *ndo, const struct pkt_id *id, u_int len) { int i; const char *cp; const struct id_off *io; char c; int nid; ND_PRINT((ndo, " wb-id:")); if (len < sizeof(*id) || !ND_TTEST(*id)) return (-1); len -= sizeof(*id); ND_PRINT((ndo, " %u/%s:%u (max %u/%s:%u) ", EXTRACT_32BITS(&id->pi_ps.slot), ipaddr_string(ndo, &id->pi_ps.page.p_sid), EXTRACT_32BITS(&id->pi_ps.page.p_uid), EXTRACT_32BITS(&id->pi_mslot), ipaddr_string(ndo, &id->pi_mpage.p_sid), EXTRACT_32BITS(&id->pi_mpage.p_uid))); nid = EXTRACT_16BITS(&id->pi_ps.nid); len -= sizeof(*io) * nid; io = (const struct id_off *)(id + 1); cp = (const char *)(io + nid); if (ND_TTEST2(cp, len)) { ND_PRINT((ndo, "\"")); fn_print(ndo, (const u_char *)cp, (const u_char *)cp + len); ND_PRINT((ndo, "\"")); } c = '<'; for (i = 0; i < nid && ND_TTEST(*io); ++io, ++i) { ND_PRINT((ndo, "%c%s:%u", c, ipaddr_string(ndo, &io->id), EXTRACT_32BITS(&io->off))); c = ','; } if (i >= nid) { ND_PRINT((ndo, ">")); return (0); } return (-1); }
static int handle_probe_request(const u_char *p) { struct mgmt_body_t pbody; int offset = 0; memset(&pbody, 0, sizeof(pbody)); if (!parse_elements(&pbody, p, offset)) return 0; printf(" ("); fn_print(pbody.ssid.ssid, NULL); printf(")"); PRINT_RATES(pbody); return 1; }
static int wb_id(const struct pkt_id *id, u_int len) { int i; const char *cp; const struct id_off *io; char c; int nid; printf(" wb-id:"); if (len < sizeof(*id) || (u_char *)(id + 1) > snapend) return (-1); len -= sizeof(*id); printf(" %u/%s:%u (max %u/%s:%u) ", (u_int32_t)ntohl(id->pi_ps.slot), ipaddr_string(&id->pi_ps.page.p_sid), (u_int32_t)ntohl(id->pi_ps.page.p_uid), (u_int32_t)ntohl(id->pi_mslot), ipaddr_string(&id->pi_mpage.p_sid), (u_int32_t)ntohl(id->pi_mpage.p_uid)); nid = ntohs(id->pi_ps.nid); len -= sizeof(*io) * nid; io = (struct id_off *)(id + 1); cp = (char *)(io + nid); if ((u_char *)cp + len <= snapend) { putchar('"'); (void)fn_print((u_char *)cp, (u_char *)cp + len); putchar('"'); } c = '<'; for (i = 0; i < nid && (u_char *)io < snapend; ++io, ++i) { printf("%c%s:%u", c, ipaddr_string(&io->id), (u_int32_t)ntohl(io->off)); c = ','; } if (i >= nid) { printf(">"); return (0); } return (-1); }
int handle_beacon(const uchar *p, u_int length, struct rcv_pkt * paket) { struct mgmt_body_t pbody; int offset = 0; int ret; memset(&pbody, 0, sizeof(pbody)); if (!TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + IEEE802_11_CAPINFO_LEN)) return 0; if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + IEEE802_11_CAPINFO_LEN) return 0; memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); offset += IEEE802_11_TSTAMP_LEN; length -= IEEE802_11_TSTAMP_LEN; pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); offset += IEEE802_11_BCNINT_LEN; length -= IEEE802_11_BCNINT_LEN; pbody.capability_info = EXTRACT_LE_16BITS(p+offset); offset += IEEE802_11_CAPINFO_LEN; length -= IEEE802_11_CAPINFO_LEN; ret = parse_elements(&pbody, p, offset, length,paket); if (pbody.ssid_present) { fn_print(pbody.ssid.ssid, NULL,paket); } if (pbody.ds_present) { paket->p.mgmt_pkt.channel=pbody.ds.channel; // printf("packet channel = %d\n",pbody.ds.channel); } paket->p.mgmt_pkt.cap_privacy= CAPABILITY_PRIVACY(pbody.capability_info) ? 1 :0 ; // printf("%s \n", CAPABILITY_ESS(pbody.capability_info) ? "ESS" : "IBSS"); u_int8_t _r; if (pbody.rates_present) { _r= pbody.rates.rate[pbody.rates.length -1] ; paket->p.mgmt_pkt.rate_max=(float)((.5 * ((_r) & 0x7f))); // printf("packet rate is %f \n", paket->p.mgmt_pkt.rate_max); } else { paket->p.mgmt_pkt.rate_max=0.0; // undefined rate, because of bad fcs (might be a reason) } paket->p.mgmt_pkt.cap_ess_ibss = paket->p.mgmt_pkt.cap_ess_ibss= CAPABILITY_ESS(pbody.capability_info) ? 1:2; return ret; }
/** * @brief Prints the queue buffer (including unused data). * @param Function pointer to printing a single queue element. */ void queue_print_buf( void (*fn_print)(queue_data_t *element) ) { int i; printf( "Queue buf\n" ); for ( i = 0; i < QUEUE_BUF_SIZE; i++ ) { printf( "[" ); if ( i == head_idx ) { printf( "{h}" ); } if ( i == tail_idx ) { printf( "{t}" ); } fn_print( &q_buf[i] ); printf( "]" ); } puts(""); }
/* * Print trivial file transfer program requests */ void tftp_print(register const u_char *bp, u_int length) { register const struct tftphdr *tp; register const char *cp; register const u_char *p; register int opcode, i; static char tstr[] = " [|tftp]"; tp = (const struct tftphdr *)bp; /* Print length */ printf(" %d", length); /* Print tftp request type */ TCHECK(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: /* * XXX Not all arpa/tftp.h's specify th_stuff as any * array; use address of th_block instead */ #ifdef notdef p = (u_char *)tp->th_stuff; #else p = (u_char *)&tp->th_block; #endif 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 = (const u_char *)strchr((const char *)p, '\0')) != NULL) { if (length <= (u_int)(p - (const u_char *)&tp->th_block)) break; p++; if (*p != '\0') { putchar(' '); fn_print(p, snapend); } } if (i) goto trunc; break; case ACK: case DATA: TCHECK(tp->th_block); printf(" block %d", EXTRACT_16BITS(&tp->th_block)); break; case ERROR: /* Print error code string */ TCHECK(tp->th_code); printf(" %s \"", tok2str(err2str, "tftp-err-#%d \"", EXTRACT_16BITS(&tp->th_code))); /* Print error message string */ i = fn_print((const u_char *)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; }
/* [OF10] Section 5.2.1 */ static const u_char * of10_phy_ports_print(const u_char *cp, const u_char *ep, u_int len) { const u_char *cp0 = cp; const u_int len0 = len; while (len) { if (len < sizeof(struct ofp_phy_port)) goto corrupt; /* port_no */ TCHECK2(*cp, 2); printf("\n\t port_no %s", tok2str(ofpp_str, "%u", EXTRACT_16BITS(cp))); cp += 2; /* hw_addr */ TCHECK2(*cp, OFP_ETH_ALEN); printf(", hw_addr %s", etheraddr_string(cp)); cp += OFP_ETH_ALEN; /* name */ TCHECK2(*cp, OFP_MAX_PORT_NAME_LEN); printf(", name '"); fn_print(cp, cp + OFP_MAX_PORT_NAME_LEN); printf("'"); cp += OFP_MAX_PORT_NAME_LEN; if (vflag < 2) { TCHECK2(*cp, 24); cp += 24; goto next_port; } /* config */ TCHECK2(*cp, 4); printf("\n\t config 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofppc_bm, EXTRACT_32BITS(cp), OFPPC_U); cp += 4; /* state */ TCHECK2(*cp, 4); printf("\n\t state 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofpps_bm, EXTRACT_32BITS(cp), OFPPS_U); cp += 4; /* curr */ TCHECK2(*cp, 4); printf("\n\t curr 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* advertised */ TCHECK2(*cp, 4); printf("\n\t advertised 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* supported */ TCHECK2(*cp, 4); printf("\n\t supported 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; /* peer */ TCHECK2(*cp, 4); printf("\n\t peer 0x%08x", EXTRACT_32BITS(cp)); of10_bitmap_print(ofppf_bm, EXTRACT_32BITS(cp), OFPPF_U); cp += 4; next_port: len -= sizeof(struct ofp_phy_port); } /* while */ return cp; corrupt: /* skip the undersized trailing data */ printf(" (corrupt)"); TCHECK2(*cp0, len0); return cp0 + len0; trunc: printf(" [|openflow]"); return ep; }
/* * Print bootp requests */ void bootp_print(netdissect_options *ndo, register const u_char *cp, u_int length) { register const struct bootp *bp; static const u_char vm_cmu[4] = VM_CMU; static const u_char vm_rfc1048[4] = VM_RFC1048; bp = (const struct bootp *)cp; ND_TCHECK(bp->bp_op); ND_PRINT((ndo, "BOOTP/DHCP, %s", tok2str(bootp_op_values, "unknown (0x%02x)", bp->bp_op))); if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) { ND_TCHECK2(bp->bp_chaddr[0], 6); ND_PRINT((ndo, " from %s", etheraddr_string(ndo, bp->bp_chaddr))); } ND_PRINT((ndo, ", length %u", length)); if (!ndo->ndo_vflag) return; ND_TCHECK(bp->bp_secs); /* The usual hardware address type is 1 (10Mb Ethernet) */ if (bp->bp_htype != 1) ND_PRINT((ndo, ", htype %d", bp->bp_htype)); /* The usual length for 10Mb Ethernet address is 6 bytes */ if (bp->bp_htype != 1 || bp->bp_hlen != 6) ND_PRINT((ndo, ", hlen %d", bp->bp_hlen)); /* Only print interesting fields */ if (bp->bp_hops) ND_PRINT((ndo, ", hops %d", bp->bp_hops)); if (EXTRACT_32BITS(&bp->bp_xid)) ND_PRINT((ndo, ", xid 0x%x", EXTRACT_32BITS(&bp->bp_xid))); if (EXTRACT_16BITS(&bp->bp_secs)) ND_PRINT((ndo, ", secs %d", EXTRACT_16BITS(&bp->bp_secs))); ND_PRINT((ndo, ", Flags [%s]", bittok2str(bootp_flag_values, "none", EXTRACT_16BITS(&bp->bp_flags)))); if (ndo->ndo_vflag > 1) ND_PRINT((ndo, " (0x%04x)", EXTRACT_16BITS(&bp->bp_flags))); /* Client's ip address */ ND_TCHECK(bp->bp_ciaddr); if (EXTRACT_32BITS(&bp->bp_ciaddr.s_addr)) ND_PRINT((ndo, "\n\t Client-IP %s", ipaddr_string(ndo, &bp->bp_ciaddr))); /* 'your' ip address (bootp client) */ ND_TCHECK(bp->bp_yiaddr); if (EXTRACT_32BITS(&bp->bp_yiaddr.s_addr)) ND_PRINT((ndo, "\n\t Your-IP %s", ipaddr_string(ndo, &bp->bp_yiaddr))); /* Server's ip address */ ND_TCHECK(bp->bp_siaddr); if (EXTRACT_32BITS(&bp->bp_siaddr.s_addr)) ND_PRINT((ndo, "\n\t Server-IP %s", ipaddr_string(ndo, &bp->bp_siaddr))); /* Gateway's ip address */ ND_TCHECK(bp->bp_giaddr); if (EXTRACT_32BITS(&bp->bp_giaddr.s_addr)) ND_PRINT((ndo, "\n\t Gateway-IP %s", ipaddr_string(ndo, &bp->bp_giaddr))); /* Client's Ethernet address */ if (bp->bp_htype == 1 && bp->bp_hlen == 6) { ND_TCHECK2(bp->bp_chaddr[0], 6); ND_PRINT((ndo, "\n\t Client-Ethernet-Address %s", etheraddr_string(ndo, bp->bp_chaddr))); } ND_TCHECK2(bp->bp_sname[0], 1); /* check first char only */ if (*bp->bp_sname) { ND_PRINT((ndo, "\n\t sname \"")); if (fn_print(ndo, bp->bp_sname, ndo->ndo_snapend)) { ND_PRINT((ndo, "\"")); ND_PRINT((ndo, "%s", tstr + 1)); return; } ND_PRINT((ndo, "\"")); } ND_TCHECK2(bp->bp_file[0], 1); /* check first char only */ if (*bp->bp_file) { ND_PRINT((ndo, "\n\t file \"")); if (fn_print(ndo, bp->bp_file, ndo->ndo_snapend)) { ND_PRINT((ndo, "\"")); ND_PRINT((ndo, "%s", tstr + 1)); return; } ND_PRINT((ndo, "\"")); } /* Decode the vendor buffer */ ND_TCHECK(bp->bp_vend[0]); if (memcmp((const char *)bp->bp_vend, vm_rfc1048, sizeof(uint32_t)) == 0) rfc1048_print(ndo, bp->bp_vend); else if (memcmp((const char *)bp->bp_vend, vm_cmu, sizeof(uint32_t)) == 0) cmu_print(ndo, bp->bp_vend); else { uint32_t ul; ul = EXTRACT_32BITS(&bp->bp_vend); if (ul != 0) ND_PRINT((ndo, "\n\t Vendor-#0x%x", ul)); } return; trunc: ND_PRINT((ndo, "%s", tstr)); }
/* * 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; }
/* * Print trivial file transfer program requests */ void tftp_print(register const u_char *bp, u_int length) { register const struct tftphdr *tp; register const char *cp; register const u_char *p; register int opcode, i; static char tstr[] = " [|tftp]"; tp = (const struct tftphdr *)bp; /* Print length */ printf(" %d", length); /* Print tftp request type */ TCHECK(tp->th_opcode); opcode = ntohs(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: /* * XXX Not all arpa/tftp.h's specify th_stuff as any * array; use address of th_block instead */ #ifdef notdef p = (u_char *)tp->th_stuff; #else p = (u_char *)&tp->th_block; #endif fputs(" \"", stdout); i = fn_print(p, snapend); putchar('"'); if (i) goto trunc; break; case ACK: case DATA: TCHECK(tp->th_block); printf(" block %d", ntohs(tp->th_block)); break; case ERROR: /* Print error code string */ TCHECK(tp->th_code); printf(" %s ", tok2str(err2str, "tftp-err-#%d \"", ntohs(tp->th_code))); /* Print error message string */ i = fn_print((const u_char *)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; }
void rip_print(const u_char *dat, u_int length) { register const struct rip *rp; register const struct rip_netinfo *ni; register int i, j, trunc; i = min(length, snapend - dat) - sizeof(*rp); if (i < 0) return; rp = (struct rip *)dat; switch (rp->rip_cmd) { case RIPCMD_REQUEST: printf(" rip-req %d", length); break; case RIPCMD_RESPONSE: j = length / sizeof(*ni); if (j * sizeof(*ni) != length - 4) printf(" rip-resp %d[%d]:", j, length); else printf(" rip-resp %d:", j); trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i); ni = (struct rip_netinfo *)(rp + 1); for (; (i -= sizeof(*ni)) >= 0; ++ni) rip_entry_print(rp->rip_vers, ni); if (trunc) printf("[|rip]"); break; case RIPCMD_TRACEON: printf(" rip-traceon %d: \"", length); (void)fn_print((const u_char *)(rp + 1), snapend); fputs("\"\n", stdout); break; case RIPCMD_TRACEOFF: printf(" rip-traceoff %d", length); break; case RIPCMD_POLL: printf(" rip-poll %d", length); break; case RIPCMD_POLLENTRY: printf(" rip-pollentry %d", length); break; default: printf(" rip-#%d %d", rp->rip_cmd, length); break; } switch (rp->rip_vers) { case 1: case 2: break; default: printf(" [vers %d]", rp->rip_vers); break; } }
/* * Print bootp requests */ void bootp_print(const u_char *cp, u_int length, u_short sport, u_short dport) { const struct bootp *bp; static u_char vm_cmu[4] = VM_CMU; static u_char vm_rfc1048[4] = VM_RFC1048; bp = (struct bootp *)cp; TCHECK(bp->bp_op); switch (bp->bp_op) { case BOOTREQUEST: /* Usually, a request goes from a client to a server */ if (sport != IPPORT_BOOTPC || dport != IPPORT_BOOTPS) printf(" (request)"); break; case BOOTREPLY: /* Usually, a reply goes from a server to a client */ if (sport != IPPORT_BOOTPS || dport != IPPORT_BOOTPC) printf(" (reply)"); break; default: printf(" bootp-#%d", bp->bp_op); } TCHECK(bp->bp_flags); /* The usual hardware address type is 1 (10Mb Ethernet) */ if (bp->bp_htype != 1) printf(" htype-#%d", bp->bp_htype); /* The usual length for 10Mb Ethernet address is 6 bytes */ if (bp->bp_htype != 1 || bp->bp_hlen != 6) printf(" hlen:%d", bp->bp_hlen); /* Only print interesting fields */ if (bp->bp_hops) printf(" hops:%d", bp->bp_hops); if (bp->bp_xid) printf(" xid:0x%x", (u_int32_t)ntohl(bp->bp_xid)); if (bp->bp_secs) printf(" secs:%d", ntohs(bp->bp_secs)); if (bp->bp_flags) printf(" flags:0x%x", ntohs(bp->bp_flags)); /* Client's ip address */ TCHECK(bp->bp_ciaddr); if (bp->bp_ciaddr.s_addr) printf(" C:%s", ipaddr_string(&bp->bp_ciaddr)); /* 'your' ip address (bootp client) */ TCHECK(bp->bp_yiaddr); if (bp->bp_yiaddr.s_addr) printf(" Y:%s", ipaddr_string(&bp->bp_yiaddr)); /* Server's ip address */ TCHECK(bp->bp_siaddr); if (bp->bp_siaddr.s_addr) printf(" S:%s", ipaddr_string(&bp->bp_siaddr)); /* Gateway's ip address */ TCHECK(bp->bp_giaddr); if (bp->bp_giaddr.s_addr) printf(" G:%s", ipaddr_string(&bp->bp_giaddr)); /* Client's Ethernet address */ if (bp->bp_htype == 1 && bp->bp_hlen == 6) { const struct ether_header *eh; const char *e; TCHECK2(bp->bp_chaddr[0], 6); eh = (struct ether_header *)packetp; if (bp->bp_op == BOOTREQUEST) e = (const char *)ESRC(eh); else if (bp->bp_op == BOOTREPLY) e = (const char *)EDST(eh); else e = NULL; if (e == 0 || memcmp((char *)bp->bp_chaddr, e, 6) != 0) printf(" ether %s", etheraddr_string(bp->bp_chaddr)); } TCHECK2(bp->bp_sname[0], 1); /* check first char only */ if (*bp->bp_sname) { printf(" sname \""); if (fn_print(bp->bp_sname, snapend)) { putchar('"'); fputs(tstr + 1, stdout); return; } putchar('"'); } TCHECK2(bp->bp_file[0], 1); /* check first char only */ if (*bp->bp_file) { printf(" file \""); if (fn_print(bp->bp_file, snapend)) { putchar('"'); fputs(tstr + 1, stdout); return; } putchar('"'); } /* Decode the vendor buffer */ TCHECK2(bp->bp_vend[0], sizeof(u_int32_t)); length -= sizeof(*bp) - sizeof(bp->bp_vend); if (memcmp((char *)bp->bp_vend, (char *)vm_rfc1048, sizeof(u_int32_t)) == 0) rfc1048_print(bp->bp_vend, length); else if (memcmp((char *)bp->bp_vend, (char *)vm_cmu, sizeof(u_int32_t)) == 0) cmu_print(bp->bp_vend, length); else { u_int32_t ul; memcpy((char *)&ul, (char *)bp->bp_vend, sizeof(ul)); if (ul != 0) printf("vend-#0x%x", ul); } return; trunc: fputs(tstr, stdout); }