diff mbox

[v3,3/5] 6lowpan: iphc: override l2 packet information

Message ID 20170217155003.4594-4-luiz.dentz@gmail.com (mailing list archive)
State Superseded
Headers show

Commit Message

Luiz Augusto von Dentz Feb. 17, 2017, 3:50 p.m. UTC
From: Alexander Aring <aar@pengutronix.de>

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>
---
 net/6lowpan/iphc.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Stefan Schmidt Feb. 20, 2017, 10:03 p.m. UTC | #1
Hello.

On 02/17/2017 04:50 PM, Luiz Augusto von Dentz wrote:
> From: Alexander Aring <aar@pengutronix.de>
>
> 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>
> ---
>  net/6lowpan/iphc.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
> index 79f1fa2..fb5f6fa 100644
> --- a/net/6lowpan/iphc.c
> +++ b/net/6lowpan/iphc.c
> @@ -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);
>


Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>

regards
Stefan Schmidt
--
To unsubscribe from this list: send the line "unsubscribe linux-wpan" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index 79f1fa2..fb5f6fa 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -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);