• YOSHIFUJI Hideaki / 吉藤英明's avatar
    ndisc: Remove unused space at tail of skb for ndisc messages. (TAKE 3) · b7dc8c39
    YOSHIFUJI Hideaki / 吉藤英明 authored
    Currently, the size of skb allocated for NDISC is MAX_HEADER +
    LL_RESERVED_SPACE(dev) + packet length + dev->needed_tailroom,
    but only LL_RESERVED_SPACE(dev) bytes is "reserved" for headers.
    As a result, the skb looks like this (after construction of the
    message):
    
    head       data                   tail                       end
    +--------------------------------------------------------------+
    +           |                      |          |                |
    +--------------------------------------------------------------+
    |<-hlen---->|<---ipv6 packet------>|<--tlen-->|<--MAX_HEADER-->|
        =LL_                               = dev
         RESERVED_                           ->needed_
         SPACE(dev)                            tailroom
    
    As the name implies, "MAX_HEADER" is used for headers, and should
    be "reserved" in prior to packet construction.  Or, if some space
    is really required at the tail of ther skb, it should be
    explicitly documented.
    
    We have several option after construction of NDISC message:
    
    Option 1:
    
    head       data                   tail       end
    +---------------------------------------------+
    +           |                      |          |
    +---------------------------------------------+
    |<-hlen---->|<---ipv6 packet------>|<--tlen-->|
       =LL_                                = dev
        RESERVED_                           ->needed_
        SPACE(dev)                            tailroom
    
    Option 2:
    
    head            data                   tail       end
    +--------------------------------------------------+
    +                |                      |          |
    +--------------------------------------------------+
    |<--MAX_HEADER-->|<---ipv6 packet------>|<--tlen-->|
                                                = dev
                                                 ->needed_
                                                   tailroom
    
    Option 3:
    
    head                        data                   tail       end
    +--------------------------------------------------------------+
    +                |           |                      |          |
    +--------------------------------------------------------------+
    |<--MAX_HEADER-->|<-hlen---->|<---ipv6 packet------>|<--tlen-->|
                        =LL_                                = dev
                         RESERVED_                          ->needed_
                         SPACE(dev)                           tailroom
    
    Our tunnel drivers try expanding headroom and the space for tunnel
    encapsulation was not a mandatory space -- so we are not seeing
    bugs here --, but just for optimization for performance critial
    situations.
    
    Since NDISC messages are not performance critical unlike TCP,
    and as we know outgoing device, LL_RESERVED_SPACE(dev) should be
    just enough for the device in most (if not all) cases:
      LL_RESERVED_SPACE(dev) <= LL_MAX_HEADER <= MAX_HEADER
    Note that LL_RESERVED_SPACE(dev) is also enough for NDISC over
    SIT (e.g., ISATAP).
    
    So, I think Option 1 is just fine here.
    Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b7dc8c39
ndisc.c 42.1 KB