print-sflow.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 578 行 · 第 1/2 页

C
578
字号
        return;    }    if (vflag < 1) {        printf("sFlowv%u, %s agent %s, agent-id %u, length %u",               EXTRACT_32BITS(sflow_datagram->version),               EXTRACT_32BITS(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6",	       ipaddr_string(sflow_datagram->agent),               EXTRACT_32BITS(sflow_datagram->samples),               len);        return;    }    /* ok they seem to want to know everything - lets fully decode it */    nsamples=EXTRACT_32BITS(sflow_datagram->samples);    printf("sFlowv%u, %s agent %s, agent-id %u, seqnum %u, uptime %u, samples %u, length %u",           EXTRACT_32BITS(sflow_datagram->version),           EXTRACT_32BITS(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6",           ipaddr_string(sflow_datagram->agent),           EXTRACT_32BITS(sflow_datagram->agent_id),           EXTRACT_32BITS(sflow_datagram->seqnum),           EXTRACT_32BITS(sflow_datagram->uptime),           nsamples,           len);    /* skip Common header */    tptr+=sizeof(const struct sflow_datagram_t);    tlen-=sizeof(const struct sflow_datagram_t);    while (nsamples > 0 && tlen > 0) {        sflow_sample = (const struct sflow_sample_header *)tptr;        sflow_sample_type = (EXTRACT_32BITS(sflow_sample->format)&0x0FFF);        sflow_sample_len = EXTRACT_32BITS(sflow_sample->len);        tptr+=sizeof(struct sflow_sample_header);        tlen-=sizeof(struct sflow_sample_header);          printf("\n\t%s (%u), length %u,",               tok2str(sflow_format_values, "Unknown", sflow_sample_type),               sflow_sample_type,               sflow_sample_len);        /* basic sanity check */        if (sflow_sample_type == 0 || sflow_sample_len ==0) {            return;        }        /* did we capture enough for fully decoding the sample ? */        if (!TTEST2(*tptr, sflow_sample_len))             goto trunc;	switch(sflow_sample_type) {        case SFLOW_FLOW_SAMPLE:				/* XXX */            break;        case SFLOW_COUNTER_SAMPLE:			/* XXX */            break;        case SFLOW_EXPANDED_FLOW_SAMPLE:            sflow_expanded_flow_sample = (const struct sflow_expanded_flow_sample_t *)tptr;            nrecords = EXTRACT_32BITS(sflow_expanded_flow_sample->records);            printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, records %u",                   EXTRACT_32BITS(sflow_expanded_flow_sample->seqnum),                   EXTRACT_32BITS(sflow_expanded_flow_sample->type),                   EXTRACT_32BITS(sflow_expanded_flow_sample->index),                   EXTRACT_32BITS(sflow_expanded_flow_sample->rate),                   EXTRACT_32BITS(sflow_expanded_flow_sample->pool),                   EXTRACT_32BITS(sflow_expanded_flow_sample->drops),                   EXTRACT_32BITS(sflow_expanded_flow_sample->records));            tptr+= sizeof(struct sflow_expanded_flow_sample_t);            tlen-= sizeof(struct sflow_expanded_flow_sample_t);	            while ( nrecords > 0 && tlen > 0) {				                /* decode Flow record - 2 bytes */                flow_type = EXTRACT_32BITS(tptr)&0x0FFF;                flow_len = EXTRACT_32BITS(tptr+4);                printf("\n\t  %s (%u) length %u",                       tok2str(sflow_flow_type_values,"Unknown",flow_type),                       flow_type,                       flow_len);                tptr += 8;                tlen -= 8;                /* did we capture enough for fully decoding the flow ? */                if (!TTEST2(*tptr, flow_len))                    goto trunc;                switch(flow_type) {                case SFLOW_FLOW_RAW_PACKET:                    sflow_flow_raw = (const struct sflow_expanded_flow_raw_t *)tptr;                    printf("\n\t    protocol %s (%u), length %u, stripped bytes %u, header_size %u",                           tok2str(sflow_flow_raw_protocol_values,"Unknown",EXTRACT_32BITS(sflow_flow_raw->protocol)),                           EXTRACT_32BITS(sflow_flow_raw->protocol),                           EXTRACT_32BITS(sflow_flow_raw->length),                           EXTRACT_32BITS(sflow_flow_raw->stripped_bytes),                           EXTRACT_32BITS(sflow_flow_raw->header_size));                    break;                    /*                     * FIXME those are the defined flow types that lack a decoder                     */                case SFLOW_FLOW_ETHERNET_FRAME:                case SFLOW_FLOW_IPV4_DATA:                case SFLOW_FLOW_IPV6_DATA:                case SFLOW_FLOW_EXTENDED_SWITCH_DATA:                case SFLOW_FLOW_EXTENDED_ROUTER_DATA:                case SFLOW_FLOW_EXTENDED_GATEWAY_DATA:                case SFLOW_FLOW_EXTENDED_USER_DATA:                case SFLOW_FLOW_EXTENDED_URL_DATA:                case SFLOW_FLOW_EXTENDED_MPLS_DATA:                case SFLOW_FLOW_EXTENDED_NAT_DATA:                case SFLOW_FLOW_EXTENDED_MPLS_TUNNEL:                case SFLOW_FLOW_EXTENDED_MPLS_VC:                case SFLOW_FLOW_EXTENDED_MPLS_FEC:                case SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC:                case SFLOW_FLOW_EXTENDED_VLAN_TUNNEL:                    break;                default:                    if (vflag <= 1)                        print_unknown_data(tptr, "\n\t      ", flow_len);                    break;                }                tptr += flow_len;                tlen -= flow_len;                nrecords--;            }            break;        case SFLOW_EXPANDED_COUNTER_SAMPLE:            sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)tptr;            nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records);            printf(" seqnum %u, type %u, idx %u, records %u",                   EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum),                   EXTRACT_32BITS(sflow_expanded_counter_sample->type),                   EXTRACT_32BITS(sflow_expanded_counter_sample->index),                   nrecords);            tptr+= sizeof(struct sflow_expanded_counter_sample_t);            tlen-= sizeof(struct sflow_expanded_counter_sample_t);            while ( nrecords > 0 && tlen > 0) {                /* decode counter record - 2 bytes */                counter_type = EXTRACT_32BITS(tptr)&0x0FFF;			                counter_len = EXTRACT_32BITS(tptr+4);                printf("\n\t    %s (%u) length %u",                       tok2str(sflow_counter_type_values,"Unknown",counter_type),                       counter_type,                       counter_len);                tptr += 8;                tlen -= 8;                /* did we capture enough for fully decoding the counter ? */                if (!TTEST2(*tptr, counter_len))                    goto trunc;                switch(counter_type) {                case SFLOW_COUNTER_GENERIC:			                    sflow_gen_counter = (const struct sflow_generic_counter_t *)tptr;                    printf("\n\t      ifindex %u, iftype %u, ifspeed %u, ifdirection %u (%s)",                           EXTRACT_32BITS(sflow_gen_counter->ifindex),                           EXTRACT_32BITS(sflow_gen_counter->iftype),                           EXTRACT_32BITS(sflow_gen_counter->ifspeed),                           EXTRACT_32BITS(sflow_gen_counter->ifdirection),                           tok2str(sflow_iface_direction_values, "Unknown",                                   EXTRACT_32BITS(sflow_gen_counter->ifdirection)));                    printf("\n\t      ifstatus %u, adminstatus: %s, operstatus: %s",                           EXTRACT_32BITS(sflow_gen_counter->ifstatus),                           EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down",                           (EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down");                    printf("\n\t      In octets %" PRIu64                           ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",                           EXTRACT_64BITS(sflow_gen_counter->ifinoctets),                           EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts),                           EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts),                           EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts),                           EXTRACT_32BITS(sflow_gen_counter->ifindiscards));                    printf("\n\t      In errors %u, unknown protos %u",                           EXTRACT_32BITS(sflow_gen_counter->ifinerrors),                           EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos));                    printf("\n\t      Out octets %" PRIu64                           ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",                           EXTRACT_64BITS(sflow_gen_counter->ifoutoctets),                           EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts),                           EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts),                           EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts),                           EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards));                    printf("\n\t      Out errors %u, promisc mode %u",                            EXTRACT_32BITS(sflow_gen_counter->ifouterrors),                           EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode));                    break;                case SFLOW_COUNTER_ETHERNET:                    sflow_eth_counter = (const struct sflow_ethernet_counter_t *)tptr;                    printf("\n\t      align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u",                           EXTRACT_32BITS(sflow_eth_counter->alignerrors),                           EXTRACT_32BITS(sflow_eth_counter->fcserrors),                           EXTRACT_32BITS(sflow_eth_counter->single_collision_frames),                           EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames),                           EXTRACT_32BITS(sflow_eth_counter->test_errors));                    printf("\n\t      deferred %u, late collision %u, excessive collision %u, mac trans error %u",                            EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions),                           EXTRACT_32BITS(sflow_eth_counter->late_collisions),                           EXTRACT_32BITS(sflow_eth_counter->excessive_collisions),                           EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors));                    printf("\n\t      carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u",	                           EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors),                           EXTRACT_32BITS(sflow_eth_counter->frame_too_longs),                           EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors),                           EXTRACT_32BITS(sflow_eth_counter->symbol_errors));                    break;                case SFLOW_COUNTER_TOKEN_RING:			/* XXX */                    break;                case SFLOW_COUNTER_BASEVG:                    sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)tptr;                    printf("\n\t      in high prio frames %u, in high prio octets %" PRIu64,                           EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames),                           EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets));                    printf("\n\t      in norm prio frames %u, in norm prio octets %" PRIu64,                           EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames),                           EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets));                    printf("\n\t      in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u",                           EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors),                           EXTRACT_32BITS(sflow_100basevg_counter->in_oversized),                           EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors),                           EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames));                    printf("\n\t      out high prio frames %u, out high prio octets %" PRIu64                           ", trans into frames %u",                           EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames),                           EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets),                           EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames));                    printf("\n\t      in hc high prio octets %" PRIu64                           ", in hc norm prio octets %" PRIu64                           ", out hc high prio octets %" PRIu64,                           EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets),                           EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets),                           EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets));                    break;                case SFLOW_COUNTER_VLAN:                    sflow_vlan_counter = (const struct sflow_vlan_counter_t *)tptr;                    printf("\n\t      vlan_id %u, octets %" PRIu64                           ", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u",                           EXTRACT_32BITS(sflow_vlan_counter->vlan_id),                           EXTRACT_64BITS(sflow_vlan_counter->octets),                           EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt),                           EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt),                           EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt),                           EXTRACT_32BITS(sflow_vlan_counter->discards));                    break;                case SFLOW_COUNTER_PROCESSOR:			/* XXX */                    break;                default:                    if (vflag <= 1)                        print_unknown_data(tptr, "\n\t\t", counter_len);                    break;                }                tptr += counter_len;                tlen -= counter_len;                nrecords--;            }            break;        default:            if (vflag <= 1)                print_unknown_data(tptr, "\n\t    ", sflow_sample_len);            break;        }        tptr += sflow_sample_len;        tlen -= sflow_sample_len;        nsamples--;    }    return; trunc:    printf("[|SFLOW]");}/* * Local Variables: * c-style: whitesmith * c-basic-offset: 4 * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?