[Linux-zigbee-devel] [PATCH 0/6] 6lowpan: uncompress of addresses fix

2013-08-13 Thread Alexander Aring
The current implementation to uncompress addresses in a 6lowpan header
is completely broken.

This patch series fixes the parsing of addresses in a 6lowpan header.
It contains a major rewrite of the uncompress address function to parse
the address in a correct way.

Alexander Aring (5):
  6lowpan: init ipv6hdr buffer to zero
  6lowpan: introduce lowpan_fetch_skb function
  6lowpan: add function to uncompress multicast addr
  6lowpan: lowpan_uncompress_addr with address_mode
  6lowpan: handle context based source address

David Hauweele (1):
  6lowpan: Fix fragmentation with link-local compressed addresses

 net/ieee802154/6lowpan.c | 284 +++
 net/ieee802154/6lowpan.h |  20 +++-
 2 files changed, 203 insertions(+), 101 deletions(-)

-- 
1.8.3.3


--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


[Linux-zigbee-devel] [PATCH 3/6] 6lowpan: introduce lowpan_fetch_skb function

2013-08-13 Thread Alexander Aring
This patch adds a helper function to parse the ipv6 header to a
6lowpan header in stream.

This function checks first if we can pull data with a specific
length from a skb. If this seems to be okay, we copy skb data to
a destination pointer and run skb_pull.

Signed-off-by: Alexander Aring 
---
 net/ieee802154/6lowpan.h | 12 
 1 file changed, 12 insertions(+)

diff --git a/net/ieee802154/6lowpan.h b/net/ieee802154/6lowpan.h
index 61f0ce9..e3348ec 100644
--- a/net/ieee802154/6lowpan.h
+++ b/net/ieee802154/6lowpan.h
@@ -233,4 +233,16 @@
dest = 16 bit inline */
 #define LOWPAN_NHC_UDP_CS_P_11 0xF3 /* source & dest = 0xF0B + 4bit inline */
 
+static inline bool lowpan_fetch_skb(struct sk_buff *skb,
+   void *data, const unsigned int len)
+{
+   if (unlikely(!pskb_may_pull(skb, len)))
+   return true;
+
+   skb_copy_from_linear_data(skb, data, len);
+   skb_pull(skb, len);
+
+   return false;
+}
+
 #endif /* __6LOWPAN_H__ */
-- 
1.8.3.3


--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


[Linux-zigbee-devel] [PATCH 2/6] 6lowpan: Fix fragmentation with link-local compressed addresses

2013-08-13 Thread Alexander Aring
From: David Hauweele 

When a new 6lowpan fragment is received, a skbuff is allocated for
the reassembled packet. However when a 6lowpan packet compresses
link-local addresses based on link-layer addresses, the processing
function relies on the skb mac control block to find the related
link-layer address.

This patch copies the control block from the first fragment into
the newly allocated skb to keep a trace of the link-layer addresses
in case of a link-local compressed address.

Edit: small changes on comment issue

Signed-off-by: David Hauweele 
Signed-off-by: Alexander Aring 
---
 net/ieee802154/6lowpan.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c
index 92429db..632b3fd 100644
--- a/net/ieee802154/6lowpan.c
+++ b/net/ieee802154/6lowpan.c
@@ -698,6 +698,12 @@ lowpan_alloc_new_frame(struct sk_buff *skb, u16 len, u16 
tag)
skb_reserve(frame->skb, sizeof(struct ipv6hdr));
skb_put(frame->skb, frame->length);
 
+   /* copy the first control block to keep a
+* trace of the link-layer addresses in case
+* of a link-local compressed address
+*/
+   memcpy(frame->skb->cb, skb->cb, sizeof(skb->cb));
+
init_timer(&frame->timer);
/* time out is the same as for ipv6 - 60 sec */
frame->timer.expires = jiffies + LOWPAN_FRAG_TIMEOUT;
-- 
1.8.3.3


--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


[Linux-zigbee-devel] [PATCH] 6lowpan: handle only real link-local addresses

2013-08-13 Thread Alexander Aring
A link-local address isn't fe80::/10 it's fe80::/64
see http://tools.ietf.org/html/rfc4291#section-2.5.6
for more details.

Also fix a comment issue "local link" -> "link-local"

Signed-off-by: Alexander Aring 
---
 net/ieee802154/6lowpan.h | 7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/net/ieee802154/6lowpan.h b/net/ieee802154/6lowpan.h
index 4b8f917..61f0ce9 100644
--- a/net/ieee802154/6lowpan.h
+++ b/net/ieee802154/6lowpan.h
@@ -83,8 +83,11 @@
 #define ipaddr_prefixcmp(addr1, addr2, length) \
(memcmp(addr1, addr2, length >> 3) == 0)
 
-/* local link, i.e. FE80::/10 */
-#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80))
+/* link-local, i.e. FE80::/64 */
+#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80) && \
+   (((a)->s6_addr16[1]) == 0) &&   \
+   (((a)->s6_addr16[2]) == 0) &&   \
+   (((a)->s6_addr16[3]) == 0))
 
 /*
  * check whether we can compress the IID to 16 bits,
-- 
1.8.3.3


--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


[Linux-zigbee-devel] [PATCH 4/6] 6lowpan: add function to uncompress multicast addr

2013-08-13 Thread Alexander Aring
Add function to uncompress multicast address.
This function split the uncompress function for a multicast address
in a seperate function.

To uncompress a multicast address is different than a other
non-multicasts addresses according to rfc6282.

Signed-off-by: Alexander Aring 
---
 net/ieee802154/6lowpan.c | 78 
 1 file changed, 59 insertions(+), 19 deletions(-)

diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c
index 632b3fd..0df8874 100644
--- a/net/ieee802154/6lowpan.c
+++ b/net/ieee802154/6lowpan.c
@@ -88,15 +88,6 @@ static const u8 lowpan_unc_llconf[] = {0x0f, 0x28, 0x22, 
0x20};
  */
 static const u8 lowpan_unc_ctxconf[] = {0x00, 0x88, 0x82, 0x80};
 
-/*
- * Uncompression of ctx-base
- *   0 -> 0 bits from packet
- *   1 -> 2 bytes from prefix - bunch of zeroes 5 from packet
- *   2 -> 2 bytes from prefix - zeroes + 3 from packet
- *   3 -> 2 bytes from prefix - infer 1 bytes from lladdr
- */
-static const u8 lowpan_unc_mxconf[] = {0x0f, 0x25, 0x23, 0x21};
-
 /* Link local prefix */
 static const u8 lowpan_llprefix[] = {0xfe, 0x80};
 
@@ -240,6 +231,63 @@ lowpan_uncompress_addr(struct sk_buff *skb, struct 
in6_addr *ipaddr,
return 0;
 }
 
+/* Uncompress function for multicast destination address,
+ * when M bit is set.
+ */
+static int
+lowpan_uncompress_multicast_daddr(struct sk_buff *skb,
+   struct in6_addr *ipaddr,
+   const u8 dam)
+{
+   bool fail;
+
+   switch (dam) {
+   case LOWPAN_IPHC_DAM_00:
+   /* 00:  128 bits.  The full address
+* is carried in-line.
+*/
+   fail = lowpan_fetch_skb(skb, ipaddr->s6_addr, 16);
+   break;
+   case LOWPAN_IPHC_DAM_01:
+   /* 01:  48 bits.  The address takes
+* the form ffXX::00XX::.
+*/
+   ipaddr->s6_addr[0] = 0xFF;
+   fail = lowpan_fetch_skb(skb, &ipaddr->s6_addr[1], 1);
+   fail |= lowpan_fetch_skb(skb, &ipaddr->s6_addr[11], 5);
+   break;
+   case LOWPAN_IPHC_DAM_10:
+   /* 10:  32 bits.  The address takes
+* the form ffXX::00XX:.
+*/
+   ipaddr->s6_addr[0] = 0xFF;
+   fail = lowpan_fetch_skb(skb, &ipaddr->s6_addr[1], 1);
+   fail |= lowpan_fetch_skb(skb, &ipaddr->s6_addr[13], 3);
+   break;
+   case LOWPAN_IPHC_DAM_11:
+   /* 11:  8 bits.  The address takes
+* the form ff02::00XX.
+*/
+   ipaddr->s6_addr[0] = 0xFF;
+   ipaddr->s6_addr[1] = 0x02;
+   fail = lowpan_fetch_skb(skb, &ipaddr->s6_addr[15], 1);
+   break;
+   default:
+   pr_debug("DAM value has a wrong value: 0x%x\n", dam);
+   return -EINVAL;
+   }
+
+   if (fail) {
+   pr_debug("Failed to fetch skb data\n");
+   return -EIO;
+   }
+
+   pr_debug("Reconstructed ipv6 multicast addr is:\n");
+   lowpan_raw_dump_inline(NULL, NULL, ipaddr->s6_addr, 16);
+
+   return 0;
+}
+
 static void
 lowpan_compress_udp_header(u8 **hc06_ptr, struct sk_buff *skb)
 {
@@ -927,16 +975,8 @@ lowpan_process_data(struct sk_buff *skb)
pr_debug("dest: context-based mcast compression\n");
/* TODO: implement this */
} else {
-   u8 prefix[] = {0xff, 0x02};
-
-   pr_debug("dest: non context-based mcast compression\n");
-   if (0 < tmp && tmp < 3) {
-   if (lowpan_fetch_skb_u8(skb, &prefix[1]))
-   goto drop;
-   }
-
-   err = lowpan_uncompress_addr(skb, &hdr.daddr, prefix,
-   lowpan_unc_mxconf[tmp], NULL);
+   err = lowpan_uncompress_multicast_daddr(
+   skb, &hdr.daddr, tmp);
if (err)
goto drop;
}
-- 
1.8.3.3


--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


[Linux-zigbee-devel] [PATCH 1/6] 6lowpan: init ipv6hdr buffer to zero

2013-08-13 Thread Alexander Aring
This patch simplify the handling to set fields inside of struct ipv6hdr
to zero. Instead of setting some memory regions with memset to zero we
initialize the whole ipv6hdr to zero.

This is a optimization for parsing the 6lowpan header and not a bug fix.

Signed-off-by: Alexander Aring 
---
 net/ieee802154/6lowpan.c | 12 +---
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c
index 3b9d5f2..92429db 100644
--- a/net/ieee802154/6lowpan.c
+++ b/net/ieee802154/6lowpan.c
@@ -223,10 +223,6 @@ lowpan_uncompress_addr(struct sk_buff *skb, struct 
in6_addr *ipaddr,
if (prefcount > 0)
memcpy(ipaddr, prefix, prefcount);
 
-   if (prefcount + postcount < 16)
-   memset(&ipaddr->s6_addr[prefcount], 0,
-   16 - (prefcount + postcount));
-
if (postcount > 0) {
memcpy(&ipaddr->s6_addr[16 - postcount], skb->data, postcount);
skb_pull(skb, postcount);
@@ -723,7 +719,7 @@ frame_err:
 static int
 lowpan_process_data(struct sk_buff *skb)
 {
-   struct ipv6hdr hdr;
+   struct ipv6hdr hdr = {};
u8 tmp, iphc0, iphc1, num_context = 0;
u8 *_saddr, *_daddr;
int err;
@@ -868,8 +864,6 @@ lowpan_process_data(struct sk_buff *skb)
 
hdr.priority = ((tmp >> 2) & 0x0f);
hdr.flow_lbl[0] = ((tmp << 6) & 0xC0) | ((tmp >> 2) & 0x30);
-   hdr.flow_lbl[1] = 0;
-   hdr.flow_lbl[2] = 0;
break;
/*
 * Flow Label carried in-line
@@ -885,10 +879,6 @@ lowpan_process_data(struct sk_buff *skb)
break;
/* Traffic Class and Flow Label are elided */
case 3: /* 11b */
-   hdr.priority = 0;
-   hdr.flow_lbl[0] = 0;
-   hdr.flow_lbl[1] = 0;
-   hdr.flow_lbl[2] = 0;
break;
default:
break;
-- 
1.8.3.3


--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel


[Linux-zigbee-devel] [PATCH 5/6] 6lowpan: lowpan_uncompress_addr with address_mode

2013-08-13 Thread Alexander Aring
This patch drop the pre and postcount calculation from the
lowpan_uncompress_addr function.

We use instead a switch case over address_mode value, it's easier
to understand what's going on there.

Signed-off-by: Alexander Aring 
---
 net/ieee802154/6lowpan.c | 144 +--
 net/ieee802154/6lowpan.h |   8 ++-
 2 files changed, 82 insertions(+), 70 deletions(-)

diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c
index 0df8874..d299560 100644
--- a/net/ieee802154/6lowpan.c
+++ b/net/ieee802154/6lowpan.c
@@ -67,30 +67,6 @@ static const u8 lowpan_ttl_values[] = {0, 1, 64, 255};
 
 static LIST_HEAD(lowpan_devices);
 
-/*
- * Uncompression of linklocal:
- *   0 -> 16 bytes from packet
- *   1 -> 2  bytes from prefix - bunch of zeroes and 8 from packet
- *   2 -> 2  bytes from prefix - zeroes + 2 from packet
- *   3 -> 2  bytes from prefix - infer 8 bytes from lladdr
- *
- *  NOTE: => the uncompress function does change 0xf to 0x10
- *  NOTE: 0x00 => no-autoconfig => unspecified
- */
-static const u8 lowpan_unc_llconf[] = {0x0f, 0x28, 0x22, 0x20};
-
-/*
- * Uncompression of ctx-based:
- *   0 -> 0 bits  from packet [unspecified / reserved]
- *   1 -> 8 bytes from prefix - bunch of zeroes and 8 from packet
- *   2 -> 8 bytes from prefix - zeroes + 2 from packet
- *   3 -> 8 bytes from prefix - infer 8 bytes from lladdr
- */
-static const u8 lowpan_unc_ctxconf[] = {0x00, 0x88, 0x82, 0x80};
-
-/* Link local prefix */
-static const u8 lowpan_llprefix[] = {0xfe, 0x80};
-
 /* private device info */
 struct lowpan_dev_info {
struct net_device   *real_dev; /* real WPAN device ptr */
@@ -182,50 +158,86 @@ lowpan_compress_addr_64(u8 **hc06_ptr, u8 shift, const 
struct in6_addr *ipaddr,
return rol8(val, shift);
 }
 
-static void
-lowpan_uip_ds6_set_addr_iid(struct in6_addr *ipaddr, unsigned char *lladdr)
-{
-   memcpy(&ipaddr->s6_addr[8], lladdr, IEEE802154_ADDR_LEN);
-   /* second bit-flip (Universe/Local) is done according RFC2464 */
-   ipaddr->s6_addr[8] ^= 0x02;
-}
-
 /*
- * Uncompress addresses based on a prefix and a postfix with zeroes in
- * between. If the postfix is zero in length it will use the link address
- * to configure the IP address (autoconf style).
- * pref_post_count takes a byte where the first nibble specify prefix count
- * and the second postfix count (NOTE: 15/0xf => 16 bytes copy).
+ * Uncompress address function for source and
+ * destination address(non-multicast).
+ *
+ * address_mode is sam value or dam value.
  */
 static int
-lowpan_uncompress_addr(struct sk_buff *skb, struct in6_addr *ipaddr,
-   u8 const *prefix, u8 pref_post_count, unsigned char *lladdr)
+lowpan_uncompress_addr(struct sk_buff *skb,
+   struct in6_addr *ipaddr,
+   const u8 address_mode,
+   const struct ieee802154_addr *lladdr)
 {
-   u8 prefcount = pref_post_count >> 4;
-   u8 postcount = pref_post_count & 0x0f;
-
-   /* full nibble 15 => 16 */
-   prefcount = (prefcount == 15 ? 16 : prefcount);
-   postcount = (postcount == 15 ? 16 : postcount);
-
-   if (lladdr)
-   lowpan_raw_dump_inline(__func__, "linklocal address",
-   lladdr, IEEE802154_ADDR_LEN);
-   if (prefcount > 0)
-   memcpy(ipaddr, prefix, prefcount);
-
-   if (postcount > 0) {
-   memcpy(&ipaddr->s6_addr[16 - postcount], skb->data, postcount);
-   skb_pull(skb, postcount);
-   } else if (prefcount > 0) {
-   if (lladdr == NULL)
+   bool fail;
+
+   switch (address_mode) {
+   case LOWPAN_IPHC_ADDR_00:
+   /* for global link addresses */
+   fail = lowpan_fetch_skb(skb, ipaddr->s6_addr, 16);
+   break;
+   case LOWPAN_IPHC_ADDR_01:
+   /* fe:80::::: */
+   ipaddr->s6_addr[0] = 0xFE;
+   ipaddr->s6_addr[1] = 0x80;
+   fail = lowpan_fetch_skb(skb, &ipaddr->s6_addr[8], 8);
+   break;
+   case LOWPAN_IPHC_ADDR_02:
+   /* fe:80::ff:fe00: */
+   ipaddr->s6_addr[0] = 0xFE;
+   ipaddr->s6_addr[1] = 0x80;
+   ipaddr->s6_addr[11] = 0xFF;
+   ipaddr->s6_addr[12] = 0xFE;
+   fail = lowpan_fetch_skb(skb, &ipaddr->s6_addr[14], 2);
+   break;
+   case LOWPAN_IPHC_ADDR_03:
+   fail = false;
+   switch (lladdr->addr_type) {
+   case IEEE802154_ADDR_LONG:
+   /* fe:80:::::
+*\_/
+*  hwaddr
+*/
+   ipaddr->s6_addr[0] = 0xFE;
+   ipaddr->s6_addr[1] = 0x80;
+   memcpy(&ipaddr->s6_addr[8], lladdr->hwaddr,
+   IEEE802154_ADDR_LEN

Re: [Linux-zigbee-devel] [PATCH] 6lowpan: handle only real link-local addresses

2013-08-13 Thread David Miller

You're submitting 7 patches, one set is numbered 1-6 and this
one has no number.

What in the world do you want me to do with these patches?

What tree are they targetted at?

Are there dependencies?

What order should I apply them in?

You've given me none of this information, therefore I am tossing
all of these patches and you will need to submit them properly
all over again.

Thanks.

--
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
___
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel