Files
linux/include/linux
Benjamin Poirier 1837b2e2bc mld, igmp: Fix reserved tailroom calculation
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.

Fixes: 4c672e4b ("ipv6: mld: fix add_grhead skb_over_panic for devs with large MTUs")
Signed-off-by: Benjamin Poirier <bpoirier@suse.com>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2016-03-03 15:41:07 -05:00
..
2016-02-04 18:26:08 +01:00
2015-10-17 21:22:08 -07:00
2015-10-07 18:08:15 +01:00
2016-01-05 18:04:58 +01:00
2015-11-16 15:41:49 +00:00
2015-12-23 08:37:10 -07:00
2015-12-22 09:38:34 -07:00
2015-12-06 12:46:31 +01:00
2015-10-07 16:02:49 -07:00
2016-01-30 13:35:32 -08:00
2015-10-18 10:14:39 -07:00
2015-10-31 19:05:59 -04:00
2016-01-08 01:12:06 +01:00
2015-10-30 01:47:27 -04:00
2015-12-28 13:41:50 +01:00
2016-01-15 17:56:32 -08:00
2015-11-25 09:22:00 -07:00
2015-10-23 05:44:28 -07:00
2016-01-20 17:09:18 -08:00
2015-10-01 15:06:43 +02:00
2015-12-14 10:03:46 +01:00
2016-01-15 17:56:32 -08:00
2016-01-15 17:56:32 -08:00
2016-01-15 17:56:32 -08:00
2015-10-27 18:55:31 -07:00
2016-02-03 08:28:43 -08:00
2016-02-03 08:28:43 -08:00
2015-10-20 22:10:45 +08:00
2016-01-04 13:19:55 -05:00
2016-01-22 17:02:18 -08:00
2016-02-11 18:35:48 -08:00
2016-02-11 18:35:48 -08:00
2016-01-07 14:31:27 -05:00
2015-10-06 17:08:19 +02:00
2015-10-22 08:59:18 -07:00
2015-11-16 09:23:47 +01:00
2016-01-10 22:13:15 -05:00
2015-12-13 19:59:48 -08:00
2016-01-04 16:11:11 -05:00
2016-01-04 10:20:19 -05:00
2015-11-05 14:36:09 -05:00
2016-01-15 22:34:39 +01:00
2015-10-01 09:57:59 -07:00
2015-10-19 01:01:21 +02:00
2015-11-23 09:44:58 +01:00
2015-12-21 15:28:11 -07:00
2016-01-12 20:47:02 +02:00
2016-01-15 17:56:32 -08:00
2016-01-14 16:00:49 -08:00
2015-12-03 07:24:29 -08:00