I can confirm that this fixes the problem. I will create some patches
when I get a chance.
Thanks
Simon
On 29/09/14 17:41, Alexander Aring wrote:
Hi Simon,
On Mon, Sep 29, 2014 at 03:12:21PM +0100, Simon Vincent wrote:
On 29/09/14 14:58, Alexander Aring wrote:
On Mon, Sep 29, 2014 at 02:51:51PM +0100, Simon Vincent wrote:
Sorry for the confusion. My problem is I am receiving all packets.
PACKET_OTHERHOST does not seem to be dropped. A suggestion from Varka was to
disable redirects however it now seems that this is not possible on a ipv6
interface.
I can fix the problem by dropping PACKET_OTHERHOST in mac802154_subif_frame.
The first what IPv6 does is [0].
See my previous mail. Also that we should handle on 6LoWPAN packet
handler function for receiving "lowpan_rcv" we should do the same,
otherwise we parsing PACKET_OTHERHOST sk_buff's and drop these directly
in IPv6 layer, which makes no sense.
But what I see is that the current behaviour should also work.
Instrument the IPv6 delivery function and be sure that the information
about PACKET_OTHERHOST was not dropped.
I do not catch any PACKET_OTHERHOST packets in the ip6_input.c ipv6_rcv
function.
I don't think the packets get this far. Also in the ieee802154_rcv function
they are dropped. I will add some more debug to find where the redirects
come from.
please try this:
diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index 142eef5..002cd7c 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -189,7 +189,6 @@ static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
new->protocol = htons(ETH_P_IPV6);
- new->pkt_type = PACKET_HOST;
new->dev = dev;
raw_dump_table(__func__, "raw skb data dump before receiving",
diff --git a/net/ieee802154/6lowpan_rtnl.c b/net/ieee802154/6lowpan_rtnl.c
index 4413629..820922a 100644
--- a/net/ieee802154/6lowpan_rtnl.c
+++ b/net/ieee802154/6lowpan_rtnl.c
@@ -515,6 +515,9 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
if (!netif_running(dev))
goto drop_skb;
+ if (skb->pkt_type == PACKET_OTHERHOST)
+ goto drop_skb;
+
if (dev->type != ARPHRD_IEEE802154)
goto drop_skb;
@@ -524,7 +527,6 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
/* check that it's our buffer */
if (skb->data[0] == LOWPAN_DISPATCH_IPV6) {
skb->protocol = htons(ETH_P_IPV6);
- skb->pkt_type = PACKET_HOST;
/* Pull off the 1-byte of 6lowpan header. */
skb_pull(skb, 1);
should fix the issue, somebody overwrite the pkt_type skb attribute always
with PACKET_HOST, which is wrong.
Also we can first check this in lowpan_rcv and drop the skb when it's
not belong to us.
If you want to fix this mainline please seperate it in 3 patches, one
for generic 6lowpan, other ieee802154 6lowpan and one for the check on
PACKET_OTHERHOST in lowpan_rcv.
- Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-wpan" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html