6lowpan: iphc: override l2 packet information
authorAlexander Aring <aar@pengutronix.de>
Sun, 12 Mar 2017 08:19:35 +0000 (10:19 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Apr 2017 20:02:36 +0000 (22:02 +0200)
The skb->pkt_type need to be set by L2, but on 6LoWPAN there exists L2
e.g. BTLE which doesn't has multicast addressing. If it's a multicast or
not is detected by IPHC headers multicast bit. The IPv6 layer will
evaluate this pkt_type, so we force set this type while uncompressing.
Should be okay for 802.15.4 as well.

Signed-off-by: Alexander Aring <aar@pengutronix.de>
Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/6lowpan/iphc.c

index 79f1fa22509a350b35340897c1cb137357734713..fb5f6fa8f1dfa7fb9e3a51b4768f502c08d3611f 100644 (file)
@@ -666,6 +666,8 @@ int lowpan_header_decompress(struct sk_buff *skb, const struct net_device *dev,
 
        switch (iphc1 & (LOWPAN_IPHC_M | LOWPAN_IPHC_DAC)) {
        case LOWPAN_IPHC_M | LOWPAN_IPHC_DAC:
+               skb->pkt_type = PACKET_BROADCAST;
+
                spin_lock_bh(&lowpan_dev(dev)->ctx.lock);
                ci = lowpan_iphc_ctx_get_by_id(dev, LOWPAN_IPHC_CID_DCI(cid));
                if (!ci) {
@@ -681,11 +683,15 @@ int lowpan_header_decompress(struct sk_buff *skb, const struct net_device *dev,
                spin_unlock_bh(&lowpan_dev(dev)->ctx.lock);
                break;
        case LOWPAN_IPHC_M:
+               skb->pkt_type = PACKET_BROADCAST;
+
                /* multicast */
                err = lowpan_uncompress_multicast_daddr(skb, &hdr.daddr,
                                                        iphc1 & LOWPAN_IPHC_DAM_MASK);
                break;
        case LOWPAN_IPHC_DAC:
+               skb->pkt_type = PACKET_HOST;
+
                spin_lock_bh(&lowpan_dev(dev)->ctx.lock);
                ci = lowpan_iphc_ctx_get_by_id(dev, LOWPAN_IPHC_CID_DCI(cid));
                if (!ci) {
@@ -701,6 +707,8 @@ int lowpan_header_decompress(struct sk_buff *skb, const struct net_device *dev,
                spin_unlock_bh(&lowpan_dev(dev)->ctx.lock);
                break;
        default:
+               skb->pkt_type = PACKET_HOST;
+
                err = lowpan_iphc_uncompress_addr(skb, dev, &hdr.daddr,
                                                  iphc1 & LOWPAN_IPHC_DAM_MASK,
                                                  daddr);