Commit 5f509239eccc9d118d3474a22e78b3da1ceefe02
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 |