diff options
author | Alexander Aring <alex.aring@gmail.com> | 2014-07-29 17:47:02 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2014-07-30 13:28:39 -0400 |
commit | 556a5bfc03c35c6f0b4e85ef6a19d00f0eb6dd00 (patch) | |
tree | 401e9b530eebe89f9a2a5df0840eeef63b4fd1c8 /net/6lowpan/iphc.c | |
parent | 85c71240a3e6c151038d9ed3fa88fc0fb80043fb (diff) |
6lowpan: iphc: use ipv6 api to check address scope
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>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/6lowpan/iphc.c')
-rw-r--r-- | net/6lowpan/iphc.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c index 636edd0f3724..d4fc2dd8ad75 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, | |||
611 | u8 tmp, iphc0, iphc1, *hc_ptr; | 611 | u8 tmp, iphc0, iphc1, *hc_ptr; |
612 | struct ipv6hdr *hdr; | 612 | struct ipv6hdr *hdr; |
613 | u8 head[100] = {}; | 613 | u8 head[100] = {}; |
614 | int addr_type; | ||
614 | 615 | ||
615 | if (type != ETH_P_IPV6) | 616 | if (type != ETH_P_IPV6) |
616 | return -EINVAL; | 617 | return -EINVAL; |
@@ -720,23 +721,27 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev, | |||
720 | sizeof(hdr->hop_limit)); | 721 | sizeof(hdr->hop_limit)); |
721 | } | 722 | } |
722 | 723 | ||
724 | addr_type = ipv6_addr_type(&hdr->saddr); | ||
723 | /* source address compression */ | 725 | /* source address compression */ |
724 | if (is_addr_unspecified(&hdr->saddr)) { | 726 | if (addr_type == IPV6_ADDR_ANY) { |
725 | pr_debug("source address is unspecified, setting SAC\n"); | 727 | pr_debug("source address is unspecified, setting SAC\n"); |
726 | iphc1 |= LOWPAN_IPHC_SAC; | 728 | iphc1 |= LOWPAN_IPHC_SAC; |
727 | /* TODO: context lookup */ | ||
728 | } else if (is_addr_link_local(&hdr->saddr)) { | ||
729 | iphc1 |= lowpan_compress_addr_64(&hc_ptr, | ||
730 | LOWPAN_IPHC_SAM_BIT, &hdr->saddr, _saddr); | ||
731 | pr_debug("source address unicast link-local %pI6c " | ||
732 | "iphc1 0x%02x\n", &hdr->saddr, iphc1); | ||
733 | } else { | 729 | } else { |
734 | pr_debug("send the full source address\n"); | 730 | if (addr_type & IPV6_ADDR_LINKLOCAL) { |
735 | lowpan_push_hc_data(&hc_ptr, &hdr->saddr.s6_addr[0], 16); | 731 | iphc1 |= lowpan_compress_addr_64(&hc_ptr, |
732 | LOWPAN_IPHC_SAM_BIT, | ||
733 | &hdr->saddr, _saddr); | ||
734 | pr_debug("source address unicast link-local %pI6c iphc1 0x%02x\n", | ||
735 | &hdr->saddr, iphc1); | ||
736 | } else { | ||
737 | pr_debug("send the full source address\n"); | ||
738 | lowpan_push_hc_data(&hc_ptr, hdr->saddr.s6_addr, 16); | ||
739 | } | ||
736 | } | 740 | } |
737 | 741 | ||
742 | addr_type = ipv6_addr_type(&hdr->daddr); | ||
738 | /* destination address compression */ | 743 | /* destination address compression */ |
739 | if (is_addr_mcast(&hdr->daddr)) { | 744 | if (addr_type & IPV6_ADDR_MULTICAST) { |
740 | pr_debug("destination address is multicast: "); | 745 | pr_debug("destination address is multicast: "); |
741 | iphc1 |= LOWPAN_IPHC_M; | 746 | iphc1 |= LOWPAN_IPHC_M; |
742 | if (lowpan_is_mcast_addr_compressable8(&hdr->daddr)) { | 747 | if (lowpan_is_mcast_addr_compressable8(&hdr->daddr)) { |
@@ -767,8 +772,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev, | |||
767 | lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16); | 772 | lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16); |
768 | } | 773 | } |
769 | } else { | 774 | } else { |
770 | /* TODO: context lookup */ | 775 | if (addr_type & IPV6_ADDR_LINKLOCAL) { |
771 | if (is_addr_link_local(&hdr->daddr)) { | 776 | /* TODO: context lookup */ |
772 | iphc1 |= lowpan_compress_addr_64(&hc_ptr, | 777 | iphc1 |= lowpan_compress_addr_64(&hc_ptr, |
773 | LOWPAN_IPHC_DAM_BIT, &hdr->daddr, _daddr); | 778 | LOWPAN_IPHC_DAM_BIT, &hdr->daddr, _daddr); |
774 | pr_debug("dest address unicast link-local %pI6c " | 779 | pr_debug("dest address unicast link-local %pI6c " |