Commit 5f509239eccc9d118d3474a22e78b3da1ceefe02

Authored by Alexander Aring
Committed by Marcel Holtmann
1 parent e98d6d6203

ieee802154: handle datagram variables as u16

This reverts commit 9abc378c66e3d6f437eed77c1c534cbc183523f7
("ieee802154: 6lowpan: change datagram var types").

The reason is that I forgot the IPv6 fragmentation here. Our MTU of
lowpan interface is 1280 and skb->len should not above of that. If we
reach a payload above 1280 in IPv6 header then we have a IPv6
fragmentation above 802.15.4 6LoWPAN fragmentation. The type "u16" was
fine, instead I added now a WARN_ON_ONCE if skb->len is above MTU which
should never happen otherwise IPv6 on minimum MTU size is broken.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

Showing 3 changed files with 9 additions and 7 deletions Side-by-side Diff

net/ieee802154/6lowpan/6lowpan_i.h
... ... @@ -18,7 +18,7 @@
18 18  
19 19 struct lowpan_create_arg {
20 20 u16 tag;
21   - unsigned int d_size;
  21 + u16 d_size;
22 22 const struct ieee802154_addr *src;
23 23 const struct ieee802154_addr *dst;
24 24 };
... ... @@ -29,7 +29,7 @@
29 29 struct inet_frag_queue q;
30 30  
31 31 u16 tag;
32   - unsigned int d_size;
  32 + u16 d_size;
33 33 struct ieee802154_addr saddr;
34 34 struct ieee802154_addr daddr;
35 35 };
net/ieee802154/6lowpan/reassembly.c
... ... @@ -37,7 +37,7 @@
37 37 static int lowpan_frag_reasm(struct lowpan_frag_queue *fq,
38 38 struct sk_buff *prev, struct net_device *ldev);
39 39  
40   -static unsigned int lowpan_hash_frag(u16 tag, unsigned int d_size,
  40 +static unsigned int lowpan_hash_frag(u16 tag, u16 d_size,
41 41 const struct ieee802154_addr *saddr,
42 42 const struct ieee802154_addr *daddr)
43 43 {
net/ieee802154/6lowpan/tx.c
... ... @@ -137,8 +137,8 @@
137 137  
138 138 static int
139 139 lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *ldev,
140   - const struct ieee802154_hdr *wpan_hdr,
141   - unsigned int dgram_size, unsigned int dgram_offset)
  140 + const struct ieee802154_hdr *wpan_hdr, u16 dgram_size,
  141 + u16 dgram_offset)
142 142 {
143 143 __be16 frag_tag;
144 144 u8 frag_hdr[5];
... ... @@ -203,7 +203,7 @@
203 203 }
204 204  
205 205 static int lowpan_header(struct sk_buff *skb, struct net_device *ldev,
206   - unsigned int *dgram_size, unsigned int *dgram_offset)
  206 + u16 *dgram_size, u16 *dgram_offset)
207 207 {
208 208 struct wpan_dev *wpan_dev = lowpan_dev_info(ldev)->wdev->ieee802154_ptr;
209 209 struct ieee802154_addr sa, da;
210 210  
... ... @@ -253,9 +253,11 @@
253 253 {
254 254 struct ieee802154_hdr wpan_hdr;
255 255 int max_single, ret;
256   - unsigned int dgram_size, dgram_offset;
  256 + u16 dgram_size, dgram_offset;
257 257  
258 258 pr_debug("package xmit\n");
  259 +
  260 + WARN_ON_ONCE(skb->len > IPV6_MIN_MTU);
259 261  
260 262 /* We must take a copy of the skb before we modify/replace the ipv6
261 263 * header as the header could be used elsewhere