Patch "mld, igmp: Fix reserved tailroom calculation" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mld, igmp: Fix reserved tailroom calculation
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mld-igmp-fix-reserved-tailroom-calculation.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Apr 16 10:02:53 PDT 2016
From: Benjamin Poirier <[email protected]>
Date: Mon, 29 Feb 2016 15:03:33 -0800
Subject: mld, igmp: Fix reserved tailroom calculation
From: Benjamin Poirier <[email protected]>
[ Upstream commit 1837b2e2bcd23137766555a63867e649c0b637f0 ]
The current reserved_tailroom calculation fails to take hlen and tlen into account.
skb:
[__hlen__|__data____________|__tlen___|__extra__]
^ ^
head skb_end_offset
In this representation, hlen + data + tlen is the size passed to alloc_skb. "extra" is the extra space made available in __alloc_skb because of rounding up by kmalloc. We can reorder the representation like so:
[__hlen__|__data____________|__extra__|__tlen___]
^ ^
head skb_end_offset
The maximum space available for ip headers and payload without fragmentation is min(mtu, data + extra). Therefore, reserved_tailroom
= data + extra + tlen - min(mtu, data + extra)
= skb_end_offset - hlen - min(mtu, skb_end_offset - hlen - tlen) = skb_tailroom - min(mtu, skb_tailroom - tlen) ; after skb_reserve(hlen)
Compare the second line to the current expression:reserved_tailroom = skb_end_offset - min(mtu, skb_end_offset) and we can see that hlen and tlen are not taken into account.
The min() in the third line can be expanded into:
if mtu < skb_tailroom - tlen:
reserved_tailroom = skb_tailroom - mtu
else:
reserved_tailroom = tlen
Depending on hlen, tlen, mtu and the number of multicast address records, the current code may output skbs that have less tailroom than dev->needed_tailroom or it may output more skbs than needed because not all space available is used.
--- include/linux/skbuff.h | 24 ++++++++++++++++++++++++ net/ipv4/igmp.c | 3 +-- net/ipv6/mcast.c | 3 +-- 3 files changed, 26 insertions(+), 4 deletions(-)
include/linux/skbuff.h +24 -0
@@ -1908,6 +1908,30 @@ static inline void skb_reserve(struct sk skb->tail += len; } +/** +* skb_tailroom_reserve - adjust reserved_tailroom +* @skb: buffer to alter +* @mtu: maximum amount of headlen permitted +* @needed_tailroom: minimum amount of reserved_tailroom +* +* Set reserved_tailroom so that headlen can be as large as possible but +* not larger than mtu and tailroom cannot be smaller than +* needed_tailroom. +* The required headroom should already have been reserved before using +* this function. +*/ +static inline void skb_tailroom_reserve (struct sk_buff *skb,unsigned int mtu, +unsigned int needed_tailroom) +{ +SKB_LINEAR_ASSERT (skb); +if (mtu <skb_tailroom (skb) - needed_tailroom) +/* use at most mtu */ + skb->reserved_tailroom =skb_tailroom (skb) - mtu; +else +/* use up to all available space */ + skb->reserved_tailroom = needed_tailroom; +} +#define ENCAP_TYPE_ETHER 0#define ENCAP_TYPE_IPPROTO 1
net/ipv4/igmp.c +1 -2
@@ -356,9 +356,8 @@ static struct sk_buff *igmpv3_newpack(stskb_dst_set (skb, &rt->dst); skb->dev = dev; - skb->reserved_tailroom =skb_end_offset (skb) - -min (mtu,skb_end_offset (skb));skb_reserve (skb, hlen); +skb_tailroom_reserve (skb, mtu, tlen);skb_reset_network_header (skb); pip =ip_hdr (skb);
net/ipv6/mcast.c +1 -2
@@ -1574,9 +1574,8 @@ static struct sk_buff *mld_newpack(strucreturn NULL ; skb->priority =TC_PRIO_CONTROL ; - skb->reserved_tailroom =skb_end_offset (skb) - -min (mtu,skb_end_offset (skb));skb_reserve (skb, hlen); +skb_tailroom_reserve (skb, mtu, tlen);if (__ipv6_get_lladdr (idev, &addr_buf,IFA_F_TENTATIVE )) {/* <draft-ietf-magma-mld-source-05.txt>:
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/mld-igmp-fix-reserved-tailroom-calculation.patch