Skip to content

Commit

Permalink
6lowpan: handle context based source address
Browse files Browse the repository at this point in the history
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: Alexander Aring <alex.aring@gmail.com>
Reviewed-by: Werner Almesberger <werner@almesberger.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Alexander Aring authored and David S. Miller committed Aug 20, 2013
1 parent ce2463b commit 65d892c
Showing 1 changed file with 46 additions and 3 deletions.
49 changes: 46 additions & 3 deletions net/ieee802154/6lowpan.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,40 @@ lowpan_uncompress_addr(struct sk_buff *skb,
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,
* when M bit is set.
*/
Expand Down Expand Up @@ -970,9 +1004,18 @@ lowpan_process_data(struct sk_buff *skb)
/* Extract SAM to the tmp variable */
tmp = ((iphc1 & LOWPAN_IPHC_SAM) >> LOWPAN_IPHC_SAM_BIT) & 0x03;

/* Source address uncompression */
pr_debug("source address stateless compression\n");
err = lowpan_uncompress_addr(skb, &hdr.saddr, tmp, _saddr);
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 */
pr_debug("source address stateless compression\n");
err = lowpan_uncompress_addr(skb, &hdr.saddr, tmp, _saddr);
}

/* Check on error of previous branch */
if (err)
goto drop;

Expand Down

0 comments on commit 65d892c

Please sign in to comment.