On Sat, Dec 07, 2013 at 08:02:50PM +0200, Jukka Rissanen wrote:
> Because the IEEE 802154 and Bluetooth share the IP header compression
> and uncompression code, the common code is moved to 6lowpan_iphc.c
> file.
> 
> Signed-off-by: Jukka Rissanen <jukka.rissa...@linux.intel.com>
> ---
> Hi,
> 
> this is just refactoring code so that Bluetooth LE 6LoWPAN
> patches (sent to bluetooth mailing list) can use it.
> No functionality changes by this patch.
> 
> Cheers,
> Jukka
> 
>  net/ieee802154/6lowpan.c      | 753 ++-------------------------------------
>  net/ieee802154/6lowpan.h      |  32 ++
>  net/ieee802154/6lowpan_iphc.c | 807 
> ++++++++++++++++++++++++++++++++++++++++++
>  net/ieee802154/Makefile       |   2 +-
>  4 files changed, 875 insertions(+), 719 deletions(-)
>  create mode 100644 net/ieee802154/6lowpan_iphc.c
...
> @@ -485,181 +149,14 @@ static int lowpan_header_create(struct sk_buff *skb,
>               return 0;
>  
>       hdr = ipv6_hdr(skb);
> -     hc06_ptr = head + 2;
> -
> -     pr_debug("IPv6 header dump:\n\tversion = %d\n\tlength  = %d\n"
> -              "\tnexthdr = 0x%02x\n\thop_lim = %d\n", hdr->version,
> -              ntohs(hdr->payload_len), hdr->nexthdr, hdr->hop_limit);
> -
> -     lowpan_raw_dump_table(__func__, "raw skb network header dump",
> -             skb_network_header(skb), sizeof(struct ipv6hdr));
>  
>       if (!saddr)
>               saddr = dev->dev_addr;
>  
>       lowpan_raw_dump_inline(__func__, "saddr", (unsigned char *)saddr, 8);
> -
> -     /*
> -      * As we copy some bit-length fields, in the IPHC encoding bytes,
> -      * we sometimes use |=
> -      * If the field is 0, and the current bit value in memory is 1,
> -      * this does not work. We therefore reset the IPHC encoding here
> -      */
> -     iphc0 = LOWPAN_DISPATCH_IPHC;
> -     iphc1 = 0;
> -
> -     /* TODO: context lookup */
> -
>       lowpan_raw_dump_inline(__func__, "daddr", (unsigned char *)daddr, 8);
>  
> -     /*
> -      * Traffic class, flow label
> -      * If flow label is 0, compress it. If traffic class is 0, compress it
> -      * We have to process both in the same time as the offset of traffic
> -      * class depends on the presence of version and flow label
> -      */
> -
> -     /* hc06 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);
> -
> -     if (((hdr->flow_lbl[0] & 0x0F) == 0) &&
> -          (hdr->flow_lbl[1] == 0) && (hdr->flow_lbl[2] == 0)) {
> -             /* flow label can be compressed */
> -             iphc0 |= LOWPAN_IPHC_FL_C;
> -             if ((hdr->priority == 0) &&
> -                ((hdr->flow_lbl[0] & 0xF0) == 0)) {
> -                     /* compress (elide) all */
> -                     iphc0 |= LOWPAN_IPHC_TC_C;
> -             } else {
> -                     /* compress only the flow label */
> -                     *hc06_ptr = tmp;
> -                     hc06_ptr += 1;
> -             }
> -     } else {
> -             /* Flow label cannot be compressed */
> -             if ((hdr->priority == 0) &&
> -                ((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;
> -             } else {
> -                     /* compress nothing */
> -                     memcpy(hc06_ptr, &hdr, 4);
> -                     /* replace the top byte with new ECN | DSCP format */
> -                     *hc06_ptr = tmp;
> -                     hc06_ptr += 4;
> -             }
> -     }
> -
> -     /* NOTE: payload length is always compressed */
> -
> -     /* Next Header is compress if UDP */
> -     if (hdr->nexthdr == UIP_PROTO_UDP)
> -             iphc0 |= LOWPAN_IPHC_NH_C;
> -
> -     if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
> -             *hc06_ptr = hdr->nexthdr;
> -             hc06_ptr += 1;
> -     }
> -
> -     /*
> -      * Hop limit
> -      * if 1:   compress, encoding is 01
> -      * if 64:  compress, encoding is 10
> -      * if 255: compress, encoding is 11
> -      * else do not compress
> -      */
> -     switch (hdr->hop_limit) {
> -     case 1:
> -             iphc0 |= LOWPAN_IPHC_TTL_1;
> -             break;
> -     case 64:
> -             iphc0 |= LOWPAN_IPHC_TTL_64;
> -             break;
> -     case 255:
> -             iphc0 |= LOWPAN_IPHC_TTL_255;
> -             break;
> -     default:
> -             *hc06_ptr = hdr->hop_limit;
> -             hc06_ptr += 1;
> -             break;
> -     }
> -
> -     /* source address compression */
> -     if (is_addr_unspecified(&hdr->saddr)) {
> -             pr_debug("source address is unspecified, setting SAC\n");
> -             iphc1 |= LOWPAN_IPHC_SAC;
> -     /* TODO: context lookup */
> -     } else if (is_addr_link_local(&hdr->saddr)) {
> -             pr_debug("source address is link-local\n");
> -             iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
> -                             LOWPAN_IPHC_SAM_BIT, &hdr->saddr, saddr);
> -     } else {
> -             pr_debug("send the full source address\n");
> -             memcpy(hc06_ptr, &hdr->saddr.s6_addr16[0], 16);
> -             hc06_ptr += 16;
> -     }
> -
> -     /* destination address compression */
> -     if (is_addr_mcast(&hdr->daddr)) {
> -             pr_debug("destination address is multicast: ");
> -             iphc1 |= LOWPAN_IPHC_M;
> -             if (lowpan_is_mcast_addr_compressable8(&hdr->daddr)) {
> -                     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;
> -             } 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;
> -             } 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;
> -             } else {
> -                     pr_debug("using full address\n");
> -                     iphc1 |= LOWPAN_IPHC_DAM_00;
> -                     memcpy(hc06_ptr, &hdr->daddr.s6_addr[0], 16);
> -                     hc06_ptr += 16;
> -             }
> -     } else {
> -             /* TODO: context lookup */
> -             if (is_addr_link_local(&hdr->daddr)) {
> -                     pr_debug("dest address is unicast and link-local\n");
> -                     iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
> -                             LOWPAN_IPHC_DAM_BIT, &hdr->daddr, daddr);
> -             } else {
> -                     pr_debug("dest address is unicast: using full one\n");
> -                     memcpy(hc06_ptr, &hdr->daddr.s6_addr16[0], 16);
> -                     hc06_ptr += 16;
> -             }
> -     }
> -
> -     /* UDP header compression */
> -     if (hdr->nexthdr == UIP_PROTO_UDP)
> -             lowpan_compress_udp_header(&hc06_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);
> -     skb_reset_network_header(skb);
> -
> -     lowpan_raw_dump_table(__func__, "raw skb data dump", skb->data,
> -                             skb->len);
> +     lowpan_header_compress(skb, dev, type, daddr, saddr, len);

okay, here we should check the return value for an error. Nevertheless,
the error handling is currently ignored in other functions like lowpan_rcv.
So I will prepare some patches to make a more functionality error handling.

- Alex

------------------------------------------------------------------------------
Sponsored by Intel(R) XDK 
Develop, test and display web and hybrid apps with a single code base.
Download it for free now!
http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to