ndisc: Remove unused space at tail of skb for ndisc messages. (TAKE 3)
Subsystems (3)
PATCH 1/1 ndisc: Remove unused space at tail of skb for ndisc messages. (TAKE 3)
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) tailroomAs 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) tailroomOption 2:
head data tail end
+--------------------------------------------------+
+ | | |
+--------------------------------------------------+
|<--MAX_HEADER-->|<---ipv6 packet------>|<--tlen-->|
= dev
->needed_
tailroomOption 3:
head data tail end
+--------------------------------------------------------------+
+ | | | |
+--------------------------------------------------------------+
|<--MAX_HEADER-->|<-hlen---->|<---ipv6 packet------>|<--tlen-->|
=LL_ = dev
RESERVED_ ->needed_
SPACE(dev) tailroomOur 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.
--- net/ipv6/ndisc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv6/ndisc.c +2 -2
@@ -395,7 +395,7 @@ static struct sk_buff *ndisc_build_skb(struct net_device *dev, len +=ndisc_opt_addr_space (dev); skb =sock_alloc_send_skb (sk, - (MAX_HEADER +sizeof (struct ipv6hdr ) + + (sizeof (struct ipv6hdr ) + len + hlen + tlen),1 , &err);if (!skb) {
@@ -1439,7 +1439,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target) hlen =LL_RESERVED_SPACE (dev); tlen = dev->needed_tailroom; buff =sock_alloc_send_skb (sk, - (MAX_HEADER +sizeof (struct ipv6hdr ) + + (sizeof (struct ipv6hdr ) + len + hlen + tlen),1 , &err);if (buff ==NULL ) {
Signature · 1 line
1.7.9.5
Quoted 24 lines · YOSHIFUJI Hideaki
Currently, the size of skb allocated for NDISC is
MAX_HEADER+LL_RESERVED_SPACE(dev)+ packet length +dev->needed_tailroom, but onlyLL_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) tailroomAs 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:
Quoted 8 lines
head data tail end
+---------------------------------------------+ + | | | +---------------------------------------------+ |<-hlen---->|<---ipv6 packet------>|<--tlen-->| =LL_ = dev RESERVED_ ->needed_ SPACE(dev) tailroom
Thanks !
From: Eric Dumazet <[email protected]>
Date: Fri, 04 Jan 2013 08:00:19 -0800
Quoted 34 lines · YOSHIFUJI Hideaki
Quoted 24 lines
Currently, the size of skb allocated for NDISC is
MAX_HEADER+LL_RESERVED_SPACE(dev)+ packet length +dev->needed_tailroom, but onlyLL_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) tailroomAs 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:
Quoted 8 lines
head data tail end
+---------------------------------------------+ + | | | +---------------------------------------------+ |<-hlen---->|<---ipv6 packet------>|<--tlen-->| =LL_ = dev RESERVED_ ->needed_ SPACE(dev) tailroom
Quoted 1 line
Acked-by Eric Dumazet <[email protected]>
Applied, thanks for your persistence.