Changeset 1665


Ignore:
Timestamp:
11/24/10 10:34:17 (3 years ago)
Author:
salcock
Message:
  • IPv6 fragment extension headers use a rather different header format than other extensions.
Location:
trunk/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/libtrace.h.in

    r1661 r1665  
    501501} PACKED libtrace_ip6_ext_t; 
    502502 
     503typedef struct libtrace_ip6_frag  
     504{ 
     505        uint8_t nxt;    /**< Next header */ 
     506        uint8_t res;    /**< Reserved */ 
     507        uint16_t frag_off;      /**< Fragment Offset (includes M flag) */ 
     508        uint32_t ident; /** Fragment identification */ 
     509} PACKED libtrace_ip6_frag_t; 
     510 
    503511/** Generic IPv6 header structure 
    504512 * 
  • trunk/lib/protocols_l3.c

    r1645 r1665  
    141141        void *payload = (char*)ipptr+sizeof(libtrace_ip6_t); 
    142142        uint8_t nxt; 
     143        uint16_t len; 
    143144 
    144145        assert (ipptr != NULL); 
     
    156157                        case 0: /* hop by hop options */ 
    157158                        case TRACE_IPPROTO_ROUTING: 
    158                         case TRACE_IPPROTO_FRAGMENT: 
    159159                        case TRACE_IPPROTO_ESP: 
    160160                        case TRACE_IPPROTO_AH:  
    161161                        case TRACE_IPPROTO_DSTOPTS:  
    162162                                { 
    163                                         uint16_t len=((libtrace_ip6_ext_t*)payload)->len 
     163                                        len=((libtrace_ip6_ext_t*)payload)->len 
    164164                                        +sizeof(libtrace_ip6_ext_t); 
    165165 
     
    177177                                        continue; 
    178178                                } 
     179                        case TRACE_IPPROTO_FRAGMENT: 
     180                                { 
     181                                        len = sizeof(libtrace_ip6_frag_t); 
     182                                        if (remaining) { 
     183                                                if (*remaining < len) { 
     184                                                        /* Snap too short */ 
     185                                                        *remaining = 0; 
     186                                                        return NULL; 
     187                                                } 
     188                                                *remaining-=len; 
     189                                        } 
     190                                        payload=(char*)payload+len; 
     191                                        nxt=((libtrace_ip6_frag_t*)payload)->nxt; 
     192                                        continue; 
     193                                } 
     194 
    179195                        default: 
    180196                                if (prot) *prot=nxt; 
Note: See TracChangeset for help on using the changeset viewer.