Changeset 7fc0eaa2


Ignore:
Timestamp:
03/15/10 16:58:28 (11 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
4811b1e
Parents:
91c38f8
Message:
  • Correctly deal with the differences between PPP over HDLC and CHDLC - we can now decode both link headers correctly (tested against IPLS and Leipzig traces)
Location:
lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/format_legacy.c

    r238d50a r7fc0eaa2  
    349349         *      - Perry Lorier (2008-11-04)
    350350         */
     351       
     352        /* It can also be CHDLC, which is different again */
     353       
     354        /* This check matchs PPP over HDLC, a la RFC 1662 */
    351355        if (((char *)packet->payload)[0] == '\xFF'
    352356                && ((char*)packet->payload)[1] == '\x03')
    353357                return TRACE_TYPE_POS;
     358       
     359        /* This check matches unicast CHDLC */
     360        else if (((char *)packet->payload)[0] == '\x0F' &&
     361                ((char*)packet->payload)[1] == '\x00')
     362                return TRACE_TYPE_HDLC_POS;
     363       
     364        /* This check matches broadcast CHDLC */
     365        else if (((char *)packet->payload)[0] == '\x8F' &&
     366                ((char*)packet->payload)[1] == '\x00')
     367                return TRACE_TYPE_HDLC_POS;
     368
     369        /* Otherwise just assume raw PPP (?) */
    354370        else
    355371                return TRACE_TYPE_PPP;
  • lib/protocols_l2.c

    rf6730d8 r7fc0eaa2  
    251251}
    252252       
    253 
     253/* Header for CHDLC framing */
    254254typedef struct libtrace_chdlc_t {
    255255        uint8_t address;        /** 0xF0 for unicast, 0xF8 for multicast */
    256         uint8_t control;
     256        uint8_t control;        /** Always 0x00 */
    257257        uint16_t ethertype;
    258258} libtrace_chdlc_t;
    259259
    260 static void *trace_get_payload_from_chdlc(void *link,
     260/* Header for PPP in HDLC-like framing */
     261typedef struct libtrace_ppp_hdlc_t {
     262        uint8_t address;        /** Always should be 0xff */
     263        uint8_t control;        /** Always should be 0x03 */
     264        uint16_t protocol;     
     265} libtrace_ppp_hdlc_t;
     266
     267static void *trace_get_payload_from_chdlc(void *link, uint16_t *type,
     268                uint32_t *remaining) {
     269
     270        libtrace_chdlc_t *chdlc = (libtrace_chdlc_t *)link;
     271
     272        if (remaining) {
     273                if (*remaining < sizeof(libtrace_chdlc_t)) {
     274                        *remaining = 0;
     275                        return NULL;
     276                }
     277                *remaining -= sizeof(libtrace_chdlc_t);
     278        }
     279
     280        if (type) {
     281                *type = ntohs(chdlc->ethertype);
     282        }
     283
     284        return (void *)((char *)chdlc + sizeof(*chdlc));
     285
     286}
     287
     288static void *trace_get_payload_from_ppp_hdlc(void *link,
    261289                uint16_t *type, uint32_t *remaining)
    262290{
    263         libtrace_chdlc_t *chdlc = (libtrace_chdlc_t*)link;
    264 
    265         if (remaining) {
    266                 if (*remaining < sizeof(libtrace_chdlc_t)) {
    267                         *remaining = 0;
    268                         return NULL;
    269                 }
    270                 *remaining-=sizeof(libtrace_chdlc_t);
     291        libtrace_ppp_hdlc_t *ppp_hdlc = (libtrace_ppp_hdlc_t*)link;
     292
     293        if (remaining) {
     294                if (*remaining < sizeof(libtrace_ppp_hdlc_t)) {
     295                        *remaining = 0;
     296                        return NULL;
     297                }
     298                *remaining-=sizeof(libtrace_ppp_hdlc_t);
    271299        }
    272300
    273301        if (type) {
    274                 switch(ntohs(chdlc->ethertype)) {
     302                /* http://www.iana.org/assignments/ppp-numbers */
     303
     304                switch(ntohs(ppp_hdlc->protocol)) {
    275305                        case 0x0021: /* IP */
    276306                                *type = TRACE_ETHERTYPE_IP;
     
    281311
    282312                        default:
    283                                 printf("Unknown chdlc type: %04x\n",ntohs(chdlc->ethertype));
     313                                printf("Unknown chdlc type: %04x\n",
     314                                                ntohs(ppp_hdlc->protocol));
    284315                                *type = 0; /* Unknown */
    285316                }
     
    287318
    288319
    289         return (void*)((char *)chdlc+sizeof(*chdlc));
     320        return (void*)((char *)ppp_hdlc+sizeof(*ppp_hdlc));
    290321}
    291322
     
    413444                                        remaining);
    414445                case TRACE_TYPE_POS:
    415                         return trace_get_payload_from_chdlc(link,ethertype,
     446                        return trace_get_payload_from_ppp_hdlc(link,ethertype,
    416447                                        remaining);
    417448                /* TODO: Unsupported */
Note: See TracChangeset for help on using the changeset viewer.