Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
/* 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;
}
Exemplo n.º 6
0
/* 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;
}
Exemplo n.º 7
0
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));
}
Exemplo n.º 8
0
/**
 *  @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("");
}
Exemplo n.º 9
0
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);
}
Exemplo n.º 10
0
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;
}
Exemplo n.º 11
0
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);
}
Exemplo n.º 12
0
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;
}
Exemplo n.º 13
0
/**
 *  @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("");
}
Exemplo n.º 14
0
/*
 * 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;
}
Exemplo n.º 15
0
/* [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;
}
Exemplo n.º 16
0
/*
 * 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));
}
Exemplo n.º 17
0
/*
 * 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;
}
Exemplo n.º 18
0
/*
 * 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;
}
Exemplo n.º 19
0
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;
        }
}
Exemplo n.º 20
0
/*
 * 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);
}