⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print-juniper.c

📁 TCPDUMP的C语言源代码,是在数据链路层的应用
💻 C
📖 第 1 页 / 共 4 页
字号:
           tlv_value = *p;           break;       case 2:           tlv_value = EXTRACT_LE_16BITS(p);           break;       case 3:           tlv_value = EXTRACT_LE_24BITS(p);           break;       case 4:           tlv_value = EXTRACT_LE_32BITS(p);           break;       default:           tlv_value = -1;           break;       }   } else {       /* TLVs >= 128 are big endian encoded */       switch (tlv_len) {       case 1:           tlv_value = *p;           break;       case 2:           tlv_value = EXTRACT_16BITS(p);           break;       case 3:           tlv_value = EXTRACT_24BITS(p);           break;       case 4:           tlv_value = EXTRACT_32BITS(p);           break;       default:           tlv_value = -1;           break;       }   }   return tlv_value;}static intjuniper_parse_header (const u_char *p, const struct pcap_pkthdr *h, struct juniper_l2info_t *l2info) {    struct juniper_cookie_table_t *lp = juniper_cookie_table;    u_int idx, jnx_ext_len, jnx_header_len = 0;    u_int8_t tlv_type,tlv_len;    u_int32_t control_word;    int tlv_value;    const u_char *tptr;    l2info->header_len = 0;    l2info->cookie_len = 0;    l2info->proto = 0;    l2info->length = h->len;    l2info->caplen = h->caplen;    TCHECK2(p[0],4);    l2info->flags = p[3];    l2info->direction = p[3]&JUNIPER_BPF_PKT_IN;        if (EXTRACT_24BITS(p) != JUNIPER_MGC_NUMBER) { /* magic number found ? */        printf("no magic-number found!");        return 0;    }     if (eflag) /* print direction */        printf("%3s ",tok2str(juniper_direction_values,"---",l2info->direction));    /* magic number + flags */    jnx_header_len = 4;    if (vflag>1)        printf("\n\tJuniper PCAP Flags [%s]",               bittok2str(jnx_flag_values, "none", l2info->flags));    /* extensions present ?  - calculate how much bytes to skip */    if ((l2info->flags & JUNIPER_BPF_EXT ) == JUNIPER_BPF_EXT ) {        tptr = p+jnx_header_len;        /* ok to read extension length ? */        TCHECK2(tptr[0], 2);        jnx_ext_len = EXTRACT_16BITS(tptr);        jnx_header_len += 2;        tptr +=2;                /* nail up the total length -         * just in case something goes wrong         * with TLV parsing */        jnx_header_len += jnx_ext_len;                if (vflag>1)            printf(", PCAP Extension(s) total length %u",                   jnx_ext_len);                TCHECK2(tptr[0], jnx_ext_len);        while (jnx_ext_len > JUNIPER_EXT_TLV_OVERHEAD) {            tlv_type = *(tptr++);            tlv_len = *(tptr++);            tlv_value = 0;                        /* sanity check */            if (tlv_type == 0 || tlv_len == 0)                break;                        if (vflag>1)                printf("\n\t  %s Extension TLV #%u, length %u, value ",                       tok2str(jnx_ext_tlv_values,"Unknown",tlv_type),                       tlv_type,                       tlv_len);                        tlv_value = juniper_read_tlv_value(tptr, tlv_type, tlv_len);            switch (tlv_type) {            case JUNIPER_EXT_TLV_IFD_NAME:                /* FIXME */                break;            case JUNIPER_EXT_TLV_IFD_MEDIATYPE:            case JUNIPER_EXT_TLV_TTP_IFD_MEDIATYPE:                if (tlv_value != -1) {                    if (vflag>1)                        printf("%s (%u)",                               tok2str(juniper_ifmt_values, "Unknown", tlv_value),                               tlv_value);                }                break;            case JUNIPER_EXT_TLV_IFL_ENCAPS:            case JUNIPER_EXT_TLV_TTP_IFL_ENCAPS:                if (tlv_value != -1) {                    if (vflag>1)                        printf("%s (%u)",                               tok2str(juniper_ifle_values, "Unknown", tlv_value),                               tlv_value);                }                break;            case JUNIPER_EXT_TLV_IFL_IDX: /* fall through */            case JUNIPER_EXT_TLV_IFL_UNIT:            case JUNIPER_EXT_TLV_IFD_IDX:            default:                if (tlv_value != -1) {                    if (vflag>1)                        printf("%u",tlv_value);                }                break;            }                        tptr+=tlv_len;            jnx_ext_len -= tlv_len+JUNIPER_EXT_TLV_OVERHEAD;        }                if (vflag>1)            printf("\n\t-----original packet-----\n\t");    }         if ((l2info->flags & JUNIPER_BPF_NO_L2 ) == JUNIPER_BPF_NO_L2 ) {                    if (eflag)            printf("no-L2-hdr, ");        /* there is no link-layer present -         * perform the v4/v6 heuristics         * to figure out what it is         */        TCHECK2(p[jnx_header_len+4],1);        if(ip_heuristic_guess(p+jnx_header_len+4,l2info->length-(jnx_header_len+4)) == 0)            printf("no IP-hdr found!");        l2info->header_len=jnx_header_len+4;        return 0; /* stop parsing the output further */            }    l2info->header_len = jnx_header_len;    p+=l2info->header_len;    l2info->length -= l2info->header_len;    l2info->caplen -= l2info->header_len;    /* search through the cookie table and copy values matching for our PIC type */    while (lp->s != NULL) {        if (lp->pictype == l2info->pictype) {            l2info->cookie_len += lp->cookie_len;            switch (p[0]) {            case LS_COOKIE_ID:                l2info->cookie_type = LS_COOKIE_ID;                l2info->cookie_len += 2;                break;            case AS_COOKIE_ID:                l2info->cookie_type = AS_COOKIE_ID;                l2info->cookie_len = 8;                break;                        default:                l2info->bundle = l2info->cookie[0];                break;            }#ifdef DLT_JUNIPER_MFR            /* MFR child links don't carry cookies */            if (l2info->pictype == DLT_JUNIPER_MFR &&                (p[0] & MFR_BE_MASK) == MFR_BE_MASK) {                l2info->cookie_len = 0;            }#endif            l2info->header_len += l2info->cookie_len;            l2info->length -= l2info->cookie_len;            l2info->caplen -= l2info->cookie_len;            if (eflag)                printf("%s-PIC, cookie-len %u",                       lp->s,                       l2info->cookie_len);            if (l2info->cookie_len > 0) {                TCHECK2(p[0],l2info->cookie_len);                if (eflag)                    printf(", cookie 0x");                for (idx = 0; idx < l2info->cookie_len; idx++) {                    l2info->cookie[idx] = p[idx]; /* copy cookie data */                    if (eflag) printf("%02x",p[idx]);                }            }            if (eflag) printf(": "); /* print demarc b/w L2/L3*/                        l2info->proto = EXTRACT_16BITS(p+l2info->cookie_len);             break;        }        ++lp;    }    p+=l2info->cookie_len;    /* DLT_ specific parsing */    switch(l2info->pictype) {#ifdef DLT_JUNIPER_MLPPP    case DLT_JUNIPER_MLPPP:        switch (l2info->cookie_type) {        case LS_COOKIE_ID:            l2info->bundle = l2info->cookie[1];            break;        case AS_COOKIE_ID:            l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;            l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;                        break;        default:            l2info->bundle = l2info->cookie[0];            break;        }        break;#endif#ifdef DLT_JUNIPER_MLFR    case DLT_JUNIPER_MLFR:        switch (l2info->cookie_type) {        case LS_COOKIE_ID:            l2info->bundle = l2info->cookie[1];            l2info->proto = EXTRACT_16BITS(p);                    l2info->header_len += 2;            l2info->length -= 2;            l2info->caplen -= 2;            break;        case AS_COOKIE_ID:            l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;            l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;            break;        default:            l2info->bundle = l2info->cookie[0];            l2info->header_len += 2;            l2info->length -= 2;            l2info->caplen -= 2;            break;        }        break;#endif#ifdef DLT_JUNIPER_MFR    case DLT_JUNIPER_MFR:        switch (l2info->cookie_type) {        case LS_COOKIE_ID:            l2info->bundle = l2info->cookie[1];            l2info->proto = EXTRACT_16BITS(p);                    l2info->header_len += 2;            l2info->length -= 2;            l2info->caplen -= 2;            break;        case AS_COOKIE_ID:            l2info->bundle = (EXTRACT_16BITS(&l2info->cookie[6])>>3)&0xfff;            l2info->proto = (l2info->cookie[5])&JUNIPER_LSQ_L3_PROTO_MASK;            break;        default:            l2info->bundle = l2info->cookie[0];            break;        }        break;#endif#ifdef DLT_JUNIPER_ATM2    case DLT_JUNIPER_ATM2:        TCHECK2(p[0],4);        /* ATM cell relay control word present ? */        if (l2info->cookie[7] & ATM2_PKT_TYPE_MASK) {            control_word = EXTRACT_32BITS(p);            /* some control word heuristics */            switch(control_word) {            case 0: /* zero control word */            case 0x08000000: /* < JUNOS 7.4 control-word */            case 0x08380000: /* cntl word plus cell length (56) >= JUNOS 7.4*/                l2info->header_len += 4;                break;            default:                break;            }                        if (eflag)                printf("control-word 0x%08x ", control_word);        }        break;#endif#ifdef DLT_JUNIPER_GGSN    case DLT_JUNIPER_GGSN:        break;#endif#ifdef DLT_JUNIPER_ATM1    case DLT_JUNIPER_ATM1:        break;#endif#ifdef DLT_JUNIPER_PPP    case DLT_JUNIPER_PPP:        break;#endif#ifdef DLT_JUNIPER_CHDLC    case DLT_JUNIPER_CHDLC:        break;#endif#ifdef DLT_JUNIPER_ETHER    case DLT_JUNIPER_ETHER:        break;#endif#ifdef DLT_JUNIPER_FRELAY    case DLT_JUNIPER_FRELAY:        break;#endif    default:        printf("Unknown Juniper DLT_ type %u: ", l2info->pictype);        break;    }        if (eflag > 1)        printf("hlen %u, proto 0x%04x, ",l2info->header_len,l2info->proto);    return 1; /* everything went ok so far. continue parsing */ trunc:    printf("[|juniper_hdr], length %u",h->len);    return 0;}/* * Local Variables: * c-style: whitesmith * c-basic-offset: 4 * End: */

⌨️ 快捷键说明

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