linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes
@ 2014-07-29 21:46 Alexander Aring
  2014-07-29 21:46 ` [PATCH bluetooth-next 1/7] 6lowpan: iphc: rename hc06_ptr pointer to hc_ptr Alexander Aring
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:46 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

Hi,

this patch series contains some trivial changes. Changing current naming of
the header compression pointer. The current one is named hc06 which stands for
header compression draft-06. We are most rfc complaint for the things we
support right now. Other patches use some API functions which was introduced
in some previous patches and IPv6 API for detect ipv6 address-scopes instead own
implemented functions.

- Alex

Alexander Aring (7):
  6lowpan: iphc: rename hc06_ptr pointer to hc_ptr
  6lowpan: iphc: use sizeof in udp uncompression
  6lowpan: iphc: cleanup use of lowpan_fetch_skb
  6lowpan: iphc: cleanup use of lowpan_push_hc_data
  6lowpan: iphc: use ipv6 api to check address scope
  6lowpan: iphc: remove check on null
  6lowpan: remove unused LOWPAN_FRAG_SIZE define

 include/net/6lowpan.h |  24 -------
 net/6lowpan/iphc.c    | 177 +++++++++++++++++++++++++-------------------------
 2 files changed, 90 insertions(+), 111 deletions(-)

-- 
2.0.3

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 1/7] 6lowpan: iphc: rename hc06_ptr pointer to hc_ptr
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
@ 2014-07-29 21:46 ` Alexander Aring
  2014-07-29 21:46 ` [PATCH bluetooth-next 2/7] 6lowpan: iphc: use sizeof in udp uncompression Alexander Aring
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:46 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

The hc06_ptr pointer variable stands for header compression draft-06. We
are mostly rfc complaint. This patch rename the variable to normal hc_ptr.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 net/6lowpan/iphc.c | 112 ++++++++++++++++++++++++++---------------------------
 1 file changed, 56 insertions(+), 56 deletions(-)

diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index 211b568..a13eae5 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -515,9 +515,9 @@ drop:
 }
 EXPORT_SYMBOL_GPL(lowpan_process_data);
 
-static u8 lowpan_compress_addr_64(u8 **hc06_ptr, u8 shift,
-				const struct in6_addr *ipaddr,
-				const unsigned char *lladdr)
+static u8 lowpan_compress_addr_64(u8 **hc_ptr, u8 shift,
+				  const struct in6_addr *ipaddr,
+				  const unsigned char *lladdr)
 {
 	u8 val = 0;
 
@@ -526,24 +526,24 @@ static u8 lowpan_compress_addr_64(u8 **hc06_ptr, u8 shift,
 		pr_debug("address compression 0 bits\n");
 	} else if (lowpan_is_iid_16_bit_compressable(ipaddr)) {
 		/* compress IID to 16 bits xxxx::XXXX */
-		memcpy(*hc06_ptr, &ipaddr->s6_addr16[7], 2);
-		*hc06_ptr += 2;
+		memcpy(*hc_ptr, &ipaddr->s6_addr16[7], 2);
+		*hc_ptr += 2;
 		val = 2; /* 16-bits */
 		raw_dump_inline(NULL, "Compressed ipv6 addr is (16 bits)",
-			*hc06_ptr - 2, 2);
+				*hc_ptr - 2, 2);
 	} else {
 		/* do not compress IID => xxxx::IID */
-		memcpy(*hc06_ptr, &ipaddr->s6_addr16[4], 8);
-		*hc06_ptr += 8;
+		memcpy(*hc_ptr, &ipaddr->s6_addr16[4], 8);
+		*hc_ptr += 8;
 		val = 1; /* 64-bits */
 		raw_dump_inline(NULL, "Compressed ipv6 addr is (64 bits)",
-			*hc06_ptr - 8, 8);
+				*hc_ptr - 8, 8);
 	}
 
 	return rol8(val, shift);
 }
 
-static void compress_udp_header(u8 **hc06_ptr, struct sk_buff *skb)
+static void compress_udp_header(u8 **hc_ptr, struct sk_buff *skb)
 {
 	struct udphdr *uh = udp_hdr(skb);
 	u8 tmp;
@@ -555,46 +555,46 @@ static void compress_udp_header(u8 **hc06_ptr, struct sk_buff *skb)
 		pr_debug("UDP header: both ports compression to 4 bits\n");
 		/* compression value */
 		tmp = LOWPAN_NHC_UDP_CS_P_11;
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 		/* source and destination port */
 		tmp = ntohs(uh->dest) - LOWPAN_NHC_UDP_4BIT_PORT +
 		      ((ntohs(uh->source) - LOWPAN_NHC_UDP_4BIT_PORT) << 4);
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 	} else if ((ntohs(uh->dest) & LOWPAN_NHC_UDP_8BIT_MASK) ==
 			LOWPAN_NHC_UDP_8BIT_PORT) {
 		pr_debug("UDP header: remove 8 bits of dest\n");
 		/* compression value */
 		tmp = LOWPAN_NHC_UDP_CS_P_01;
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 		/* source port */
-		lowpan_push_hc_data(hc06_ptr, &uh->source, sizeof(uh->source));
+		lowpan_push_hc_data(hc_ptr, &uh->source, sizeof(uh->source));
 		/* destination port */
 		tmp = ntohs(uh->dest) - LOWPAN_NHC_UDP_8BIT_PORT;
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 	} else if ((ntohs(uh->source) & LOWPAN_NHC_UDP_8BIT_MASK) ==
 			LOWPAN_NHC_UDP_8BIT_PORT) {
 		pr_debug("UDP header: remove 8 bits of source\n");
 		/* compression value */
 		tmp = LOWPAN_NHC_UDP_CS_P_10;
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 		/* source port */
 		tmp = ntohs(uh->source) - LOWPAN_NHC_UDP_8BIT_PORT;
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 		/* destination port */
-		lowpan_push_hc_data(hc06_ptr, &uh->dest, sizeof(uh->dest));
+		lowpan_push_hc_data(hc_ptr, &uh->dest, sizeof(uh->dest));
 	} else {
 		pr_debug("UDP header: can't compress\n");
 		/* compression value */
 		tmp = LOWPAN_NHC_UDP_CS_P_00;
-		lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp));
+		lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
 		/* source port */
-		lowpan_push_hc_data(hc06_ptr, &uh->source, sizeof(uh->source));
+		lowpan_push_hc_data(hc_ptr, &uh->source, sizeof(uh->source));
 		/* destination port */
-		lowpan_push_hc_data(hc06_ptr, &uh->dest, sizeof(uh->dest));
+		lowpan_push_hc_data(hc_ptr, &uh->dest, sizeof(uh->dest));
 	}
 
 	/* checksum is always inline */
-	lowpan_push_hc_data(hc06_ptr, &uh->check, sizeof(uh->check));
+	lowpan_push_hc_data(hc_ptr, &uh->check, sizeof(uh->check));
 
 	/* skip the UDP header */
 	skb_pull(skb, sizeof(struct udphdr));
@@ -604,7 +604,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 			unsigned short type, const void *_daddr,
 			const void *_saddr, unsigned int len)
 {
-	u8 tmp, iphc0, iphc1, *hc06_ptr;
+	u8 tmp, iphc0, iphc1, *hc_ptr;
 	struct ipv6hdr *hdr;
 	u8 head[100] = {};
 
@@ -612,7 +612,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 		return -EINVAL;
 
 	hdr = ipv6_hdr(skb);
-	hc06_ptr = head + 2;
+	hc_ptr = head + 2;
 
 	pr_debug("IPv6 header dump:\n\tversion = %d\n\tlength  = %d\n"
 		 "\tnexthdr = 0x%02x\n\thop_lim = %d\n\tdest    = %pI6c\n",
@@ -649,7 +649,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 	 * class depends on the presence of version and flow label
 	 */
 
-	/* hc06 format of TC is ECN | DSCP , original one is DSCP | ECN */
+	/* hc format of TC is ECN | DSCP , original one is DSCP | ECN */
 	tmp = (hdr->priority << 4) | (hdr->flow_lbl[0] >> 4);
 	tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
 
@@ -663,8 +663,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 			iphc0 |= LOWPAN_IPHC_TC_C;
 		} else {
 			/* compress only the flow label */
-			*hc06_ptr = tmp;
-			hc06_ptr += 1;
+			*hc_ptr = tmp;
+			hc_ptr += 1;
 		}
 	} else {
 		/* Flow label cannot be compressed */
@@ -672,15 +672,15 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 		   ((hdr->flow_lbl[0] & 0xF0) == 0)) {
 			/* compress only traffic class */
 			iphc0 |= LOWPAN_IPHC_TC_C;
-			*hc06_ptr = (tmp & 0xc0) | (hdr->flow_lbl[0] & 0x0F);
-			memcpy(hc06_ptr + 1, &hdr->flow_lbl[1], 2);
-			hc06_ptr += 3;
+			*hc_ptr = (tmp & 0xc0) | (hdr->flow_lbl[0] & 0x0F);
+			memcpy(hc_ptr + 1, &hdr->flow_lbl[1], 2);
+			hc_ptr += 3;
 		} else {
 			/* compress nothing */
-			memcpy(hc06_ptr, hdr, 4);
+			memcpy(hc_ptr, hdr, 4);
 			/* replace the top byte with new ECN | DSCP format */
-			*hc06_ptr = tmp;
-			hc06_ptr += 4;
+			*hc_ptr = tmp;
+			hc_ptr += 4;
 		}
 	}
 
@@ -691,8 +691,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 		iphc0 |= LOWPAN_IPHC_NH_C;
 
 	if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
-		*hc06_ptr = hdr->nexthdr;
-		hc06_ptr += 1;
+		*hc_ptr = hdr->nexthdr;
+		hc_ptr += 1;
 	}
 
 	/*
@@ -713,8 +713,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 		iphc0 |= LOWPAN_IPHC_TTL_255;
 		break;
 	default:
-		*hc06_ptr = hdr->hop_limit;
-		hc06_ptr += 1;
+		*hc_ptr = hdr->hop_limit;
+		hc_ptr += 1;
 		break;
 	}
 
@@ -724,14 +724,14 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 		iphc1 |= LOWPAN_IPHC_SAC;
 	/* TODO: context lookup */
 	} else if (is_addr_link_local(&hdr->saddr)) {
-		iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
+		iphc1 |= lowpan_compress_addr_64(&hc_ptr,
 				LOWPAN_IPHC_SAM_BIT, &hdr->saddr, _saddr);
 		pr_debug("source address unicast link-local %pI6c "
 			"iphc1 0x%02x\n", &hdr->saddr, iphc1);
 	} else {
 		pr_debug("send the full source address\n");
-		memcpy(hc06_ptr, &hdr->saddr.s6_addr16[0], 16);
-		hc06_ptr += 16;
+		memcpy(hc_ptr, &hdr->saddr.s6_addr16[0], 16);
+		hc_ptr += 16;
 	}
 
 	/* destination address compression */
@@ -742,55 +742,55 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 			pr_debug("compressed to 1 octet\n");
 			iphc1 |= LOWPAN_IPHC_DAM_11;
 			/* use last byte */
-			*hc06_ptr = hdr->daddr.s6_addr[15];
-			hc06_ptr += 1;
+			*hc_ptr = hdr->daddr.s6_addr[15];
+			hc_ptr += 1;
 		} else if (lowpan_is_mcast_addr_compressable32(&hdr->daddr)) {
 			pr_debug("compressed to 4 octets\n");
 			iphc1 |= LOWPAN_IPHC_DAM_10;
 			/* second byte + the last three */
-			*hc06_ptr = hdr->daddr.s6_addr[1];
-			memcpy(hc06_ptr + 1, &hdr->daddr.s6_addr[13], 3);
-			hc06_ptr += 4;
+			*hc_ptr = hdr->daddr.s6_addr[1];
+			memcpy(hc_ptr + 1, &hdr->daddr.s6_addr[13], 3);
+			hc_ptr += 4;
 		} else if (lowpan_is_mcast_addr_compressable48(&hdr->daddr)) {
 			pr_debug("compressed to 6 octets\n");
 			iphc1 |= LOWPAN_IPHC_DAM_01;
 			/* second byte + the last five */
-			*hc06_ptr = hdr->daddr.s6_addr[1];
-			memcpy(hc06_ptr + 1, &hdr->daddr.s6_addr[11], 5);
-			hc06_ptr += 6;
+			*hc_ptr = hdr->daddr.s6_addr[1];
+			memcpy(hc_ptr + 1, &hdr->daddr.s6_addr[11], 5);
+			hc_ptr += 6;
 		} else {
 			pr_debug("using full address\n");
 			iphc1 |= LOWPAN_IPHC_DAM_00;
-			memcpy(hc06_ptr, &hdr->daddr.s6_addr[0], 16);
-			hc06_ptr += 16;
+			memcpy(hc_ptr, &hdr->daddr.s6_addr[0], 16);
+			hc_ptr += 16;
 		}
 	} else {
 		/* TODO: context lookup */
 		if (is_addr_link_local(&hdr->daddr)) {
-			iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
+			iphc1 |= lowpan_compress_addr_64(&hc_ptr,
 				LOWPAN_IPHC_DAM_BIT, &hdr->daddr, _daddr);
 			pr_debug("dest address unicast link-local %pI6c "
 				"iphc1 0x%02x\n", &hdr->daddr, iphc1);
 		} else {
 			pr_debug("dest address unicast %pI6c\n", &hdr->daddr);
-			memcpy(hc06_ptr, &hdr->daddr.s6_addr16[0], 16);
-			hc06_ptr += 16;
+			memcpy(hc_ptr, &hdr->daddr.s6_addr16[0], 16);
+			hc_ptr += 16;
 		}
 	}
 
 	/* UDP header compression */
 	if (hdr->nexthdr == UIP_PROTO_UDP)
-		compress_udp_header(&hc06_ptr, skb);
+		compress_udp_header(&hc_ptr, skb);
 
 	head[0] = iphc0;
 	head[1] = iphc1;
 
 	skb_pull(skb, sizeof(struct ipv6hdr));
 	skb_reset_transport_header(skb);
-	memcpy(skb_push(skb, hc06_ptr - head), head, hc06_ptr - head);
+	memcpy(skb_push(skb, hc_ptr - head), head, hc_ptr - head);
 	skb_reset_network_header(skb);
 
-	pr_debug("header len %d skb %u\n", (int)(hc06_ptr - head), skb->len);
+	pr_debug("header len %d skb %u\n", (int)(hc_ptr - head), skb->len);
 
 	raw_dump_table(__func__, "raw skb data dump compressed",
 				skb->data, skb->len);
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 2/7] 6lowpan: iphc: use sizeof in udp uncompression
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
  2014-07-29 21:46 ` [PATCH bluetooth-next 1/7] 6lowpan: iphc: rename hc06_ptr pointer to hc_ptr Alexander Aring
@ 2014-07-29 21:46 ` Alexander Aring
  2014-07-29 21:47 ` [PATCH bluetooth-next 3/7] 6lowpan: iphc: cleanup use of lowpan_fetch_skb Alexander Aring
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:46 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 net/6lowpan/iphc.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index a13eae5..d2654d4 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -271,27 +271,31 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
 	if (!uh)
 		goto err;
 
-	fail = lowpan_fetch_skb(skb, &tmp, 1);
+	fail = lowpan_fetch_skb(skb, &tmp, sizeof(tmp));
 
 	if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) {
 		pr_debug("UDP header uncompression\n");
 		switch (tmp & LOWPAN_NHC_UDP_CS_P_11) {
 		case LOWPAN_NHC_UDP_CS_P_00:
-			fail |= lowpan_fetch_skb(skb, &uh->source, 2);
-			fail |= lowpan_fetch_skb(skb, &uh->dest, 2);
+			fail |= lowpan_fetch_skb(skb, &uh->source,
+						 sizeof(uh->source));
+			fail |= lowpan_fetch_skb(skb, &uh->dest,
+						 sizeof(uh->dest));
 			break;
 		case LOWPAN_NHC_UDP_CS_P_01:
-			fail |= lowpan_fetch_skb(skb, &uh->source, 2);
-			fail |= lowpan_fetch_skb(skb, &val, 1);
+			fail |= lowpan_fetch_skb(skb, &uh->source,
+						 sizeof(uh->source));
+			fail |= lowpan_fetch_skb(skb, &val, sizeof(val));
 			uh->dest = htons(val + LOWPAN_NHC_UDP_8BIT_PORT);
 			break;
 		case LOWPAN_NHC_UDP_CS_P_10:
-			fail |= lowpan_fetch_skb(skb, &val, 1);
+			fail |= lowpan_fetch_skb(skb, &val, sizeof(val));
 			uh->source = htons(val + LOWPAN_NHC_UDP_8BIT_PORT);
-			fail |= lowpan_fetch_skb(skb, &uh->dest, 2);
+			fail |= lowpan_fetch_skb(skb, &uh->dest,
+						 sizeof(uh->dest));
 			break;
 		case LOWPAN_NHC_UDP_CS_P_11:
-			fail |= lowpan_fetch_skb(skb, &val, 1);
+			fail |= lowpan_fetch_skb(skb, &val, sizeof(val));
 			uh->source = htons(LOWPAN_NHC_UDP_4BIT_PORT +
 					   (val >> 4));
 			uh->dest = htons(LOWPAN_NHC_UDP_4BIT_PORT +
@@ -311,7 +315,8 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
 			pr_debug_ratelimited("checksum elided currently not supported\n");
 			goto err;
 		} else {
-			fail |= lowpan_fetch_skb(skb, &uh->check, 2);
+			fail |= lowpan_fetch_skb(skb, &uh->check,
+						 sizeof(uh->check));
 		}
 
 		/*
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 3/7] 6lowpan: iphc: cleanup use of lowpan_fetch_skb
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
  2014-07-29 21:46 ` [PATCH bluetooth-next 1/7] 6lowpan: iphc: rename hc06_ptr pointer to hc_ptr Alexander Aring
  2014-07-29 21:46 ` [PATCH bluetooth-next 2/7] 6lowpan: iphc: use sizeof in udp uncompression Alexander Aring
@ 2014-07-29 21:47 ` Alexander Aring
  2014-07-29 21:47 ` [PATCH bluetooth-next 4/7] 6lowpan: iphc: cleanup use of lowpan_push_hc_data Alexander Aring
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:47 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

We introduced the lowpan_fetch_skb function in some previous patches for
6lowpan to have a generic fetch function. This patch drops the old
function and use the generic lowpan_fetch_skb one.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 net/6lowpan/iphc.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index d2654d4..0376684 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -357,7 +357,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 	/* another if the CID flag is set */
 	if (iphc1 & LOWPAN_IPHC_CID) {
 		pr_debug("CID flag is set, increase header with one\n");
-		if (lowpan_fetch_skb_u8(skb, &num_context))
+		if (lowpan_fetch_skb(skb, &num_context, sizeof(num_context)))
 			goto drop;
 	}
 
@@ -370,7 +370,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 	 * ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)
 	 */
 	case 0: /* 00b */
-		if (lowpan_fetch_skb_u8(skb, &tmp))
+		if (lowpan_fetch_skb(skb, &tmp, sizeof(tmp)))
 			goto drop;
 
 		memcpy(&hdr.flow_lbl, &skb->data[0], 3);
@@ -384,7 +384,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 	 * ECN + DSCP (1 byte), Flow Label is elided
 	 */
 	case 2: /* 10b */
-		if (lowpan_fetch_skb_u8(skb, &tmp))
+		if (lowpan_fetch_skb(skb, &tmp, sizeof(tmp)))
 			goto drop;
 
 		hdr.priority = ((tmp >> 2) & 0x0f);
@@ -395,7 +395,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 	 * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided
 	 */
 	case 1: /* 01b */
-		if (lowpan_fetch_skb_u8(skb, &tmp))
+		if (lowpan_fetch_skb(skb, &tmp, sizeof(tmp)))
 			goto drop;
 
 		hdr.flow_lbl[0] = (skb->data[0] & 0x0F) | ((tmp >> 2) & 0x30);
@@ -412,7 +412,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 	/* Next Header */
 	if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
 		/* Next header is carried inline */
-		if (lowpan_fetch_skb_u8(skb, &(hdr.nexthdr)))
+		if (lowpan_fetch_skb(skb, &hdr.nexthdr, sizeof(hdr.nexthdr)))
 			goto drop;
 
 		pr_debug("NH flag is set, next header carried inline: %02x\n",
@@ -423,7 +423,8 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
 	if ((iphc0 & 0x03) != LOWPAN_IPHC_TTL_I)
 		hdr.hop_limit = lowpan_ttl_values[iphc0 & 0x03];
 	else {
-		if (lowpan_fetch_skb_u8(skb, &(hdr.hop_limit)))
+		if (lowpan_fetch_skb(skb, &hdr.hop_limit,
+				     sizeof(hdr.hop_limit)))
 			goto drop;
 	}
 
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 4/7] 6lowpan: iphc: cleanup use of lowpan_push_hc_data
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
                   ` (2 preceding siblings ...)
  2014-07-29 21:47 ` [PATCH bluetooth-next 3/7] 6lowpan: iphc: cleanup use of lowpan_fetch_skb Alexander Aring
@ 2014-07-29 21:47 ` Alexander Aring
  2014-07-29 21:47 ` [PATCH bluetooth-next 5/7] 6lowpan: iphc: use ipv6 api to check address scope Alexander Aring
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:47 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

This patch uses the lowpan_push_hc_data functions in several places
where we can use it. The lowpan_push_hc_data was introduced in some
previous patches.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 net/6lowpan/iphc.c | 45 ++++++++++++++++++++-------------------------
 1 file changed, 20 insertions(+), 25 deletions(-)

diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index 0376684..636edd0 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -532,15 +532,13 @@ static u8 lowpan_compress_addr_64(u8 **hc_ptr, u8 shift,
 		pr_debug("address compression 0 bits\n");
 	} else if (lowpan_is_iid_16_bit_compressable(ipaddr)) {
 		/* compress IID to 16 bits xxxx::XXXX */
-		memcpy(*hc_ptr, &ipaddr->s6_addr16[7], 2);
-		*hc_ptr += 2;
+		lowpan_push_hc_data(hc_ptr, &ipaddr->s6_addr16[7], 2);
 		val = 2; /* 16-bits */
 		raw_dump_inline(NULL, "Compressed ipv6 addr is (16 bits)",
 				*hc_ptr - 2, 2);
 	} else {
 		/* do not compress IID => xxxx::IID */
-		memcpy(*hc_ptr, &ipaddr->s6_addr16[4], 8);
-		*hc_ptr += 8;
+		lowpan_push_hc_data(hc_ptr, &ipaddr->s6_addr16[4], 8);
 		val = 1; /* 64-bits */
 		raw_dump_inline(NULL, "Compressed ipv6 addr is (64 bits)",
 				*hc_ptr - 8, 8);
@@ -696,10 +694,9 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 	if (hdr->nexthdr == UIP_PROTO_UDP)
 		iphc0 |= LOWPAN_IPHC_NH_C;
 
-	if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
-		*hc_ptr = hdr->nexthdr;
-		hc_ptr += 1;
-	}
+	if ((iphc0 & LOWPAN_IPHC_NH_C) == 0)
+		lowpan_push_hc_data(&hc_ptr, &hdr->nexthdr,
+				    sizeof(hdr->nexthdr));
 
 	/*
 	 * Hop limit
@@ -719,9 +716,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 		iphc0 |= LOWPAN_IPHC_TTL_255;
 		break;
 	default:
-		*hc_ptr = hdr->hop_limit;
-		hc_ptr += 1;
-		break;
+		lowpan_push_hc_data(&hc_ptr, &hdr->hop_limit,
+				    sizeof(hdr->hop_limit));
 	}
 
 	/* source address compression */
@@ -736,8 +732,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 			"iphc1 0x%02x\n", &hdr->saddr, iphc1);
 	} else {
 		pr_debug("send the full source address\n");
-		memcpy(hc_ptr, &hdr->saddr.s6_addr16[0], 16);
-		hc_ptr += 16;
+		lowpan_push_hc_data(&hc_ptr, &hdr->saddr.s6_addr[0], 16);
 	}
 
 	/* destination address compression */
@@ -748,27 +743,28 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 			pr_debug("compressed to 1 octet\n");
 			iphc1 |= LOWPAN_IPHC_DAM_11;
 			/* use last byte */
-			*hc_ptr = hdr->daddr.s6_addr[15];
-			hc_ptr += 1;
+			lowpan_push_hc_data(&hc_ptr,
+					    &hdr->daddr.s6_addr[15], 1);
 		} else if (lowpan_is_mcast_addr_compressable32(&hdr->daddr)) {
 			pr_debug("compressed to 4 octets\n");
 			iphc1 |= LOWPAN_IPHC_DAM_10;
 			/* second byte + the last three */
-			*hc_ptr = hdr->daddr.s6_addr[1];
-			memcpy(hc_ptr + 1, &hdr->daddr.s6_addr[13], 3);
-			hc_ptr += 4;
+			lowpan_push_hc_data(&hc_ptr,
+					    &hdr->daddr.s6_addr[1], 1);
+			lowpan_push_hc_data(&hc_ptr,
+					    &hdr->daddr.s6_addr[13], 3);
 		} else if (lowpan_is_mcast_addr_compressable48(&hdr->daddr)) {
 			pr_debug("compressed to 6 octets\n");
 			iphc1 |= LOWPAN_IPHC_DAM_01;
 			/* second byte + the last five */
-			*hc_ptr = hdr->daddr.s6_addr[1];
-			memcpy(hc_ptr + 1, &hdr->daddr.s6_addr[11], 5);
-			hc_ptr += 6;
+			lowpan_push_hc_data(&hc_ptr,
+					    &hdr->daddr.s6_addr[1], 1);
+			lowpan_push_hc_data(&hc_ptr,
+					    &hdr->daddr.s6_addr[11], 5);
 		} else {
 			pr_debug("using full address\n");
 			iphc1 |= LOWPAN_IPHC_DAM_00;
-			memcpy(hc_ptr, &hdr->daddr.s6_addr[0], 16);
-			hc_ptr += 16;
+			lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16);
 		}
 	} else {
 		/* TODO: context lookup */
@@ -779,8 +775,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 				"iphc1 0x%02x\n", &hdr->daddr, iphc1);
 		} else {
 			pr_debug("dest address unicast %pI6c\n", &hdr->daddr);
-			memcpy(hc_ptr, &hdr->daddr.s6_addr16[0], 16);
-			hc_ptr += 16;
+			lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16);
 		}
 	}
 
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 5/7] 6lowpan: iphc: use ipv6 api to check address scope
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
                   ` (3 preceding siblings ...)
  2014-07-29 21:47 ` [PATCH bluetooth-next 4/7] 6lowpan: iphc: cleanup use of lowpan_push_hc_data Alexander Aring
@ 2014-07-29 21:47 ` Alexander Aring
  2014-07-29 21:47 ` [PATCH bluetooth-next 6/7] 6lowpan: iphc: remove check on null Alexander Aring
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:47 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

This patch removes the own implementation to check of link-layer,
broadcast and any address type and use the IPv6 api for that.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 include/net/6lowpan.h | 13 -------------
 net/6lowpan/iphc.c    | 29 +++++++++++++++++------------
 2 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
index 79b530f..18010bc 100644
--- a/include/net/6lowpan.h
+++ b/include/net/6lowpan.h
@@ -75,20 +75,10 @@
 	 (((a)->s6_addr[14]) == (m)[6]) &&		\
 	 (((a)->s6_addr[15]) == (m)[7]))
 
-/* ipv6 address is unspecified */
-#define is_addr_unspecified(a)		\
-	((((a)->s6_addr32[0]) == 0) &&	\
-	 (((a)->s6_addr32[1]) == 0) &&	\
-	 (((a)->s6_addr32[2]) == 0) &&	\
-	 (((a)->s6_addr32[3]) == 0))
-
 /* compare ipv6 addresses prefixes */
 #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))
-
 /*
  * check whether we can compress the IID to 16 bits,
  * it's possible for unicast adresses with first 49 bits are zero only.
@@ -100,9 +90,6 @@
 	 (((a)->s6_addr[12]) == 0xfe) &&	\
 	 (((a)->s6_addr[13]) == 0))
 
-/* multicast address */
-#define is_addr_mcast(a) (((a)->s6_addr[0]) == 0xFF)
-
 /* check whether the 112-bit gid of the multicast address is mappable to: */
 
 /* 9 bits, for FF02::1 (all nodes) and FF02::2 (all routers) addresses only. */
diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index 636edd0..d4fc2dd 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -611,6 +611,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 	u8 tmp, iphc0, iphc1, *hc_ptr;
 	struct ipv6hdr *hdr;
 	u8 head[100] = {};
+	int addr_type;
 
 	if (type != ETH_P_IPV6)
 		return -EINVAL;
@@ -720,23 +721,27 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 				    sizeof(hdr->hop_limit));
 	}
 
+	addr_type = ipv6_addr_type(&hdr->saddr);
 	/* source address compression */
-	if (is_addr_unspecified(&hdr->saddr)) {
+	if (addr_type == IPV6_ADDR_ANY) {
 		pr_debug("source address is unspecified, setting SAC\n");
 		iphc1 |= LOWPAN_IPHC_SAC;
-	/* TODO: context lookup */
-	} else if (is_addr_link_local(&hdr->saddr)) {
-		iphc1 |= lowpan_compress_addr_64(&hc_ptr,
-				LOWPAN_IPHC_SAM_BIT, &hdr->saddr, _saddr);
-		pr_debug("source address unicast link-local %pI6c "
-			"iphc1 0x%02x\n", &hdr->saddr, iphc1);
 	} else {
-		pr_debug("send the full source address\n");
-		lowpan_push_hc_data(&hc_ptr, &hdr->saddr.s6_addr[0], 16);
+		if (addr_type & IPV6_ADDR_LINKLOCAL) {
+			iphc1 |= lowpan_compress_addr_64(&hc_ptr,
+							 LOWPAN_IPHC_SAM_BIT,
+							 &hdr->saddr, _saddr);
+			pr_debug("source address unicast link-local %pI6c iphc1 0x%02x\n",
+				 &hdr->saddr, iphc1);
+		} else {
+			pr_debug("send the full source address\n");
+			lowpan_push_hc_data(&hc_ptr, hdr->saddr.s6_addr, 16);
+		}
 	}
 
+	addr_type = ipv6_addr_type(&hdr->daddr);
 	/* destination address compression */
-	if (is_addr_mcast(&hdr->daddr)) {
+	if (addr_type & IPV6_ADDR_MULTICAST) {
 		pr_debug("destination address is multicast: ");
 		iphc1 |= LOWPAN_IPHC_M;
 		if (lowpan_is_mcast_addr_compressable8(&hdr->daddr)) {
@@ -767,8 +772,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
 			lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16);
 		}
 	} else {
-		/* TODO: context lookup */
-		if (is_addr_link_local(&hdr->daddr)) {
+		if (addr_type & IPV6_ADDR_LINKLOCAL) {
+			/* TODO: context lookup */
 			iphc1 |= lowpan_compress_addr_64(&hc_ptr,
 				LOWPAN_IPHC_DAM_BIT, &hdr->daddr, _daddr);
 			pr_debug("dest address unicast link-local %pI6c "
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 6/7] 6lowpan: iphc: remove check on null
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
                   ` (4 preceding siblings ...)
  2014-07-29 21:47 ` [PATCH bluetooth-next 5/7] 6lowpan: iphc: use ipv6 api to check address scope Alexander Aring
@ 2014-07-29 21:47 ` Alexander Aring
  2014-07-29 21:47 ` [PATCH bluetooth-next 7/7] 6lowpan: remove unused LOWPAN_FRAG_SIZE define Alexander Aring
  2014-07-30  1:47 ` [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Marcel Holtmann
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:47 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

This memory is placed on stack and can't be null so remove the check on
null.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 net/6lowpan/iphc.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index d4fc2dd..de78deb 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -268,9 +268,6 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
 	bool fail;
 	u8 tmp = 0, val = 0;
 
-	if (!uh)
-		goto err;
-
 	fail = lowpan_fetch_skb(skb, &tmp, sizeof(tmp));
 
 	if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) {
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH bluetooth-next 7/7] 6lowpan: remove unused LOWPAN_FRAG_SIZE define
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
                   ` (5 preceding siblings ...)
  2014-07-29 21:47 ` [PATCH bluetooth-next 6/7] 6lowpan: iphc: remove check on null Alexander Aring
@ 2014-07-29 21:47 ` Alexander Aring
  2014-07-30  1:47 ` [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Marcel Holtmann
  7 siblings, 0 replies; 9+ messages in thread
From: Alexander Aring @ 2014-07-29 21:47 UTC (permalink / raw)
  To: marcel; +Cc: jukka.rissanen, linux-zigbee-devel, linux-bluetooth,
	Alexander Aring

This define is unused since commit
96cb3eb7a1a5f0c3598500a2348f7d2cc76afbd2 ("6lowpan: fix fragmentation on
sending side"). It is a worst case scenario for payload calculation.
Since commit 96cb3eb7a1a5f0c3598500a2348f7d2cc76afbd2 we calculation the
payload to use the optimal size.

This define is also necessary for ieee802154 6lowpan only and the file
include/net/6lowpan.h should contain generic 6lowpan things only.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 include/net/6lowpan.h | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
index 18010bc..3bb3503 100644
--- a/include/net/6lowpan.h
+++ b/include/net/6lowpan.h
@@ -155,17 +155,6 @@
 #define LOWPAN_FRAGN_HEAD_SIZE	0x5
 
 /*
- * According IEEE802.15.4 standard:
- *   - MTU is 127 octets
- *   - maximum MHR size is 37 octets
- *   - MFR size is 2 octets
- *
- * so minimal payload size that we may guarantee is:
- *   MTU - MHR - MFR = 88 octets
- */
-#define LOWPAN_FRAG_SIZE	88
-
-/*
  * Values of fields within the IPHC encoding first byte
  * (C stands for compressed and I for inline)
  */
-- 
2.0.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes
  2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
                   ` (6 preceding siblings ...)
  2014-07-29 21:47 ` [PATCH bluetooth-next 7/7] 6lowpan: remove unused LOWPAN_FRAG_SIZE define Alexander Aring
@ 2014-07-30  1:47 ` Marcel Holtmann
  7 siblings, 0 replies; 9+ messages in thread
From: Marcel Holtmann @ 2014-07-30  1:47 UTC (permalink / raw)
  To: Alexander Aring; +Cc: Jukka Rissanen, linux-zigbee-devel, linux-bluetooth

Hi Alex,

> this patch series contains some trivial changes. Changing current naming of
> the header compression pointer. The current one is named hc06 which stands for
> header compression draft-06. We are most rfc complaint for the things we
> support right now. Other patches use some API functions which was introduced
> in some previous patches and IPv6 API for detect ipv6 address-scopes instead own
> implemented functions.
> 
> - Alex
> 
> Alexander Aring (7):
>  6lowpan: iphc: rename hc06_ptr pointer to hc_ptr
>  6lowpan: iphc: use sizeof in udp uncompression
>  6lowpan: iphc: cleanup use of lowpan_fetch_skb
>  6lowpan: iphc: cleanup use of lowpan_push_hc_data
>  6lowpan: iphc: use ipv6 api to check address scope
>  6lowpan: iphc: remove check on null
>  6lowpan: remove unused LOWPAN_FRAG_SIZE define
> 
> include/net/6lowpan.h |  24 -------
> net/6lowpan/iphc.c    | 177 +++++++++++++++++++++++++-------------------------
> 2 files changed, 90 insertions(+), 111 deletions(-)

all 7 patches have been applied to bluetooth-next tree.

Regards

Marcel


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-07-30  1:47 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-29 21:46 [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Alexander Aring
2014-07-29 21:46 ` [PATCH bluetooth-next 1/7] 6lowpan: iphc: rename hc06_ptr pointer to hc_ptr Alexander Aring
2014-07-29 21:46 ` [PATCH bluetooth-next 2/7] 6lowpan: iphc: use sizeof in udp uncompression Alexander Aring
2014-07-29 21:47 ` [PATCH bluetooth-next 3/7] 6lowpan: iphc: cleanup use of lowpan_fetch_skb Alexander Aring
2014-07-29 21:47 ` [PATCH bluetooth-next 4/7] 6lowpan: iphc: cleanup use of lowpan_push_hc_data Alexander Aring
2014-07-29 21:47 ` [PATCH bluetooth-next 5/7] 6lowpan: iphc: use ipv6 api to check address scope Alexander Aring
2014-07-29 21:47 ` [PATCH bluetooth-next 6/7] 6lowpan: iphc: remove check on null Alexander Aring
2014-07-29 21:47 ` [PATCH bluetooth-next 7/7] 6lowpan: remove unused LOWPAN_FRAG_SIZE define Alexander Aring
2014-07-30  1:47 ` [PATCH bluetooth-next 0/7] 6lowpan: trivial iphc changes Marcel Holtmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).