aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2013-11-13 04:03:39 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-08 10:29:24 -0500
commit2d02839a2b8439eab70e53401029c7a6c0629ffd (patch)
treeda71ce44bfa985085ee50e4f883e2342dcab20ca
parent5a9b1ba637310f5bf1f684303dd5abdb65259357 (diff)
6lowpan: Uncompression of traffic class field was incorrect
[ Upstream commit 1188f05497e7bd2f2614b99c54adfbe7413d5749 ] If priority/traffic class field in IPv6 header is set (seen when using ssh), the uncompression sets the TC and Flow fields incorrectly. Example: This is IPv6 header of a sent packet. Note the priority/TC (=1) in the first byte. 00000000: 61 00 00 00 00 2c 06 40 fe 80 00 00 00 00 00 00 00000010: 02 02 72 ff fe c6 42 10 fe 80 00 00 00 00 00 00 00000020: 02 1e ab ff fe 4c 52 57 This gets compressed like this in the sending side 00000000: 72 31 04 06 02 1e ab ff fe 4c 52 57 ec c2 00 16 00000010: aa 2d fe 92 86 4e be c6 .... In the receiving end, the packet gets uncompressed to this IPv6 header 00000000: 60 06 06 02 00 2a 1e 40 fe 80 00 00 00 00 00 00 00000010: 02 02 72 ff fe c6 42 10 fe 80 00 00 00 00 00 00 00000020: ab ff fe 4c 52 57 ec c2 First four bytes are set incorrectly and we have also lost two bytes from destination address. The fix is to switch the case values in switch statement when checking the TC field. Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--net/ieee802154/6lowpan.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c
index 55e1fd5b3e56..31b127e8086b 100644
--- a/net/ieee802154/6lowpan.c
+++ b/net/ieee802154/6lowpan.c
@@ -862,7 +862,7 @@ lowpan_process_data(struct sk_buff *skb)
862 * Traffic class carried in-line 862 * Traffic class carried in-line
863 * ECN + DSCP (1 byte), Flow Label is elided 863 * ECN + DSCP (1 byte), Flow Label is elided
864 */ 864 */
865 case 1: /* 10b */ 865 case 2: /* 10b */
866 if (lowpan_fetch_skb_u8(skb, &tmp)) 866 if (lowpan_fetch_skb_u8(skb, &tmp))
867 goto drop; 867 goto drop;
868 868
@@ -875,7 +875,7 @@ lowpan_process_data(struct sk_buff *skb)
875 * Flow Label carried in-line 875 * Flow Label carried in-line
876 * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided 876 * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided
877 */ 877 */
878 case 2: /* 01b */ 878 case 1: /* 01b */
879 if (lowpan_fetch_skb_u8(skb, &tmp)) 879 if (lowpan_fetch_skb_u8(skb, &tmp))
880 goto drop; 880 goto drop;
881 881