Commit 65d892c8 authored by Alexander Aring's avatar Alexander Aring Committed by David S. Miller

6lowpan: handle context based source address

Handle context based address when an unspecified address is given.
For other context based address we print a warning and drop the packet
because we don't support it right now.
Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Reviewed-by: default avatarWerner Almesberger <werner@almesberger.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ce2463b2
...@@ -242,6 +242,40 @@ lowpan_uncompress_addr(struct sk_buff *skb, ...@@ -242,6 +242,40 @@ lowpan_uncompress_addr(struct sk_buff *skb,
return 0; return 0;
} }
/* Uncompress address function for source context
* based address(non-multicast).
*/
static int
lowpan_uncompress_context_based_src_addr(struct sk_buff *skb,
struct in6_addr *ipaddr,
const u8 sam)
{
switch (sam) {
case LOWPAN_IPHC_ADDR_00:
/* unspec address ::
* Do nothing, address is already ::
*/
break;
case LOWPAN_IPHC_ADDR_01:
/* TODO */
case LOWPAN_IPHC_ADDR_02:
/* TODO */
case LOWPAN_IPHC_ADDR_03:
/* TODO */
netdev_warn(skb->dev, "SAM value 0x%x not supported\n", sam);
return -EINVAL;
default:
pr_debug("Invalid sam value: 0x%x\n", sam);
return -EINVAL;
}
lowpan_raw_dump_inline(NULL,
"Reconstructed context based ipv6 src addr is:\n",
ipaddr->s6_addr, 16);
return 0;
}
/* Uncompress function for multicast destination address, /* Uncompress function for multicast destination address,
* when M bit is set. * when M bit is set.
*/ */
...@@ -970,9 +1004,18 @@ lowpan_process_data(struct sk_buff *skb) ...@@ -970,9 +1004,18 @@ lowpan_process_data(struct sk_buff *skb)
/* Extract SAM to the tmp variable */ /* Extract SAM to the tmp variable */
tmp = ((iphc1 & LOWPAN_IPHC_SAM) >> LOWPAN_IPHC_SAM_BIT) & 0x03; tmp = ((iphc1 & LOWPAN_IPHC_SAM) >> LOWPAN_IPHC_SAM_BIT) & 0x03;
if (iphc1 & LOWPAN_IPHC_SAC) {
/* Source address context based uncompression */
pr_debug("SAC bit is set. Handle context based source address.\n");
err = lowpan_uncompress_context_based_src_addr(
skb, &hdr.saddr, tmp);
} else {
/* Source address uncompression */ /* Source address uncompression */
pr_debug("source address stateless compression\n"); pr_debug("source address stateless compression\n");
err = lowpan_uncompress_addr(skb, &hdr.saddr, tmp, _saddr); err = lowpan_uncompress_addr(skb, &hdr.saddr, tmp, _saddr);
}
/* Check on error of previous branch */
if (err) if (err)
goto drop; goto drop;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment