]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-4.4/net-create-skb_gso_validate_mac_len.patch
Linux 4.9.181
[thirdparty/kernel/stable-queue.git] / queue-4.4 / net-create-skb_gso_validate_mac_len.patch
1 From foo@baz Tue 04 Jun 2019 04:46:27 PM CEST
2 From: Daniel Axtens <dja@axtens.net>
3 Date: Wed, 31 Jan 2018 14:15:33 +1100
4 Subject: net: create skb_gso_validate_mac_len()
5
6 From: Daniel Axtens <dja@axtens.net>
7
8 commit 2b16f048729bf35e6c28a40cbfad07239f9dcd90 upstream.
9
10 If you take a GSO skb, and split it into packets, will the MAC
11 length (L2 + L3 + L4 headers + payload) of those packets be small
12 enough to fit within a given length?
13
14 Move skb_gso_mac_seglen() to skbuff.h with other related functions
15 like skb_gso_network_seglen() so we can use it, and then create
16 skb_gso_validate_mac_len to do the full calculation.
17
18 Signed-off-by: Daniel Axtens <dja@axtens.net>
19 Signed-off-by: David S. Miller <davem@davemloft.net>
20 [bwh: Backported to 4.4: There is no GSO_BY_FRAGS case to handle, so
21 skb_gso_validate_mac_len() becomes a trivial comparison. Put it inline in
22 <linux/skbuff.h>.]
23 Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
24 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25 ---
26 include/linux/skbuff.h | 30 ++++++++++++++++++++++++++++++
27 net/sched/sch_tbf.c | 10 ----------
28 2 files changed, 30 insertions(+), 10 deletions(-)
29
30 --- a/include/linux/skbuff.h
31 +++ b/include/linux/skbuff.h
32 @@ -3664,5 +3664,35 @@ static inline unsigned int skb_gso_netwo
33 return hdr_len + skb_gso_transport_seglen(skb);
34 }
35
36 +/**
37 + * skb_gso_mac_seglen - Return length of individual segments of a gso packet
38 + *
39 + * @skb: GSO skb
40 + *
41 + * skb_gso_mac_seglen is used to determine the real size of the
42 + * individual segments, including MAC/L2, Layer3 (IP, IPv6) and L4
43 + * headers (TCP/UDP).
44 + */
45 +static inline unsigned int skb_gso_mac_seglen(const struct sk_buff *skb)
46 +{
47 + unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
48 + return hdr_len + skb_gso_transport_seglen(skb);
49 +}
50 +
51 +/**
52 + * skb_gso_validate_mac_len - Will a split GSO skb fit in a given length?
53 + *
54 + * @skb: GSO skb
55 + * @len: length to validate against
56 + *
57 + * skb_gso_validate_mac_len validates if a given skb will fit a wanted
58 + * length once split, including L2, L3 and L4 headers and the payload.
59 + */
60 +static inline bool
61 +skb_gso_validate_mac_len(const struct sk_buff *skb, unsigned int len)
62 +{
63 + return skb_gso_mac_seglen(skb) <= len;
64 +}
65 +
66 #endif /* __KERNEL__ */
67 #endif /* _LINUX_SKBUFF_H */
68 --- a/net/sched/sch_tbf.c
69 +++ b/net/sched/sch_tbf.c
70 @@ -142,16 +142,6 @@ static u64 psched_ns_t2l(const struct ps
71 return len;
72 }
73
74 -/*
75 - * Return length of individual segments of a gso packet,
76 - * including all headers (MAC, IP, TCP/UDP)
77 - */
78 -static unsigned int skb_gso_mac_seglen(const struct sk_buff *skb)
79 -{
80 - unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
81 - return hdr_len + skb_gso_transport_seglen(skb);
82 -}
83 -
84 /* GSO packet is too big, segment it so that tbf can transmit
85 * each segment in time
86 */