1. 10 1月, 2013 11 次提交
  2. 09 1月, 2013 9 次提交
  3. 08 1月, 2013 5 次提交
  4. 07 1月, 2013 14 次提交
  5. 05 1月, 2013 1 次提交
    • Y
      ndisc: Remove unused space at tail of skb for ndisc messages. (TAKE 3) · b7dc8c39
      YOSHIFUJI Hideaki / 吉藤英明 提交于
      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: NYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
      Acked-by: NEric Dumazet <edumazet@google.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b7dc8c39