53 #include <linux/bitops.h>
54 #include <linux/if_arp.h>
55 #include <linux/module.h>
57 #include <linux/netdevice.h>
66 static const u8 lowpan_ttl_values[] = {0, 1, 64, 255};
80 static const u8 lowpan_unc_llconf[] = {0x0f, 0x28, 0x22, 0x20};
89 static const u8 lowpan_unc_ctxconf[] = {0x00, 0x88, 0x82, 0x80};
98 static const u8 lowpan_unc_mxconf[] = {0x0f, 0x25, 0x23, 0x21};
101 static const u8 lowpan_llprefix[] = {0xfe, 0x80};
123 static unsigned short fragment_tag;
130 return netdev_priv(dev);
133 static inline void lowpan_address_flip(
u8 *
src,
u8 *
dest)
137 (dest)[IEEE802154_ADDR_LEN - i - 1] = (
src)[i];
142 static inline void lowpan_raw_dump_inline(
const char *
caller,
char *
msg,
143 unsigned char *
buf,
int len)
149 16, 1, buf, len,
false);
160 static inline void lowpan_raw_dump_table(
const char *caller,
char *msg,
161 unsigned char *buf,
int len)
165 pr_debug(
"(%s) %s:\n", caller, msg);
167 16, 1, buf, len,
false);
173 const unsigned char *lladdr)
181 memcpy(*hc06_ptr, &ipaddr->s6_addr16[7], 2);
186 memcpy(*hc06_ptr, &ipaddr->s6_addr16[4], 8);
191 return rol8(val, shift);
195 lowpan_uip_ds6_set_addr_iid(
struct in6_addr *ipaddr,
unsigned char *lladdr)
197 memcpy(&ipaddr->s6_addr[8], lladdr, IEEE802154_ADDR_LEN);
199 ipaddr->s6_addr[8] ^= 0x02;
211 u8 const *
prefix,
u8 pref_post_count,
unsigned char *lladdr)
213 u8 prefcount = pref_post_count >> 4;
214 u8 postcount = pref_post_count & 0x0f;
217 prefcount = (prefcount == 15 ? 16 : prefcount);
218 postcount = (postcount == 15 ? 16 : postcount);
221 lowpan_raw_dump_inline(__func__,
"linklocal address",
222 lladdr, IEEE802154_ADDR_LEN);
224 memcpy(ipaddr, prefix, prefcount);
226 if (prefcount + postcount < 16)
227 memset(&ipaddr->s6_addr[prefcount], 0,
228 16 - (prefcount + postcount));
231 memcpy(&ipaddr->s6_addr[16 - postcount], skb->
data, postcount);
233 }
else if (prefcount > 0) {
238 lowpan_uip_ds6_set_addr_iid(ipaddr, lladdr);
241 pr_debug(
"uncompressing %d + %d => ", prefcount, postcount);
242 lowpan_raw_dump_inline(
NULL,
NULL, ipaddr->s6_addr, 16);
248 lowpan_compress_udp_header(
u8 **hc06_ptr,
struct sk_buff *skb)
250 struct udphdr *uh = udp_hdr(skb);
256 pr_debug(
"UDP header: both ports compression to 4 bits\n");
264 pr_debug(
"UDP header: remove 8 bits of dest\n");
271 pr_debug(
"UDP header: remove 8 bits of source\n");
277 pr_debug(
"UDP header: can't compress\n");
289 static inline int lowpan_fetch_skb_u8(
struct sk_buff *skb,
u8 *val)
291 if (
unlikely(!pskb_may_pull(skb, 1)))
300 static inline int lowpan_fetch_skb_u16(
struct sk_buff *skb,
u16 *val)
302 if (
unlikely(!pskb_may_pull(skb, 2)))
305 *val = (skb->
data[0] << 8) | skb->
data[1];
312 lowpan_uncompress_udp_header(
struct sk_buff *skb)
314 struct udphdr *uh = udp_hdr(skb);
320 if (lowpan_fetch_skb_u8(skb, &tmp))
324 pr_debug(
"UDP header uncompression\n");
342 case LOWPAN_NHC_UDP_CS_P_11:
350 pr_debug(
"ERROR: unknown UDP format\n");
355 pr_debug(
"uncompressed UDP ports: src = %d, dst = %d\n",
362 pr_debug(
"ERROR: unsupported NH format\n");
371 static int lowpan_header_create(
struct sk_buff *skb,
373 unsigned short type,
const void *_daddr,
374 const void *_saddr,
unsigned int len)
376 u8 tmp, iphc0, iphc1, *hc06_ptr;
395 pr_debug(
"IPv6 header dump:\n\tversion = %d\n\tlength = %d\n"
396 "\tnexthdr = 0x%02x\n\thop_lim = %d\n", hdr->version,
399 lowpan_raw_dump_table(__func__,
"raw skb network header dump",
400 skb_network_header(skb),
sizeof(
struct ipv6hdr));
405 lowpan_raw_dump_inline(__func__,
"saddr", (
unsigned char *)saddr, 8);
418 lowpan_raw_dump_inline(__func__,
"daddr", (
unsigned char *)daddr, 8);
428 tmp = (hdr->priority << 4) | (hdr->
flow_lbl[0] >> 4);
429 tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
431 if (((hdr->
flow_lbl[0] & 0x0F) == 0) &&
435 if ((hdr->priority == 0) &&
446 if ((hdr->priority == 0) &&
450 *hc06_ptr = (tmp & 0xc0) | (hdr->
flow_lbl[0] & 0x0F);
455 memcpy(hc06_ptr, &hdr, 4);
498 pr_debug(
"source address is unspecified, setting SAC\n");
502 pr_debug(
"source address is link-local\n");
503 iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
506 pr_debug(
"send the full source address\n");
513 pr_debug(
"destination address is multicast: ");
516 pr_debug(
"compressed to 1 octet\n");
519 *hc06_ptr = hdr->
daddr.s6_addr[15];
522 pr_debug(
"compressed to 4 octets\n");
525 *hc06_ptr = hdr->
daddr.s6_addr[1];
529 pr_debug(
"compressed to 6 octets\n");
532 *hc06_ptr = hdr->
daddr.s6_addr[1];
544 pr_debug(
"dest address is unicast and link-local\n");
545 iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
548 pr_debug(
"dest address is unicast: using full one\n");
556 lowpan_compress_udp_header(&hc06_ptr, skb);
566 lowpan_raw_dump_table(__func__,
"raw skb data dump", skb->
data,
593 type, (
void *)&
da, (
void *)&
sa, skb->
len);
597 static int lowpan_skb_deliver(
struct sk_buff *skb,
struct ipv6hdr *hdr)
611 skb_reset_network_header(
new);
612 skb_copy_to_linear_data(
new, hdr,
sizeof(
struct ipv6hdr));
618 list_for_each_entry_rcu(entry, &lowpan_devices,
list)
636 static void lowpan_fragment_timer_expired(
unsigned long entry_addr)
640 pr_debug(
"timer expired for frame with tag %d\n", entry->
tag);
643 dev_kfree_skb(entry->
skb);
657 INIT_LIST_HEAD(&frame->
list);
663 frame->
skb = netdev_alloc_skb_ip_align(skb->
dev, frame->
length +
670 frame->
skb->dev = skb->
dev;
673 skb_reserve(frame->
skb,
sizeof(
struct ipv6hdr));
679 frame->
timer.data = (
unsigned long)frame;
680 frame->
timer.function = lowpan_fragment_timer_expired;
695 lowpan_process_data(
struct sk_buff *skb)
698 u8 tmp, iphc0, iphc1, num_context = 0;
702 lowpan_raw_dump_table(__func__,
"raw skb data dump", skb->
data,
708 if (lowpan_fetch_skb_u8(skb, &iphc0))
722 if (lowpan_fetch_skb_u8(skb, &slen) ||
723 lowpan_fetch_skb_u16(skb, &tag))
727 len = ((iphc0 & 7) << 8) | slen;
733 spin_lock_bh(&flist_lock);
736 if (frame->tag == tag) {
743 frame = lowpan_alloc_new_frame(skb, len, tag);
745 goto unlock_and_drop;
749 goto unlock_and_drop;
751 if (lowpan_fetch_skb_u8(skb, &offset))
752 goto unlock_and_drop;
756 skb_copy_to_linear_data_offset(frame->
skb, offset * 8,
759 goto unlock_and_drop;
765 frame->
timer.expires > jiffies) {
769 spin_unlock_bh(&flist_lock);
775 if (lowpan_fetch_skb_u8(skb, &iphc0))
780 spin_unlock_bh(&flist_lock);
788 if (lowpan_fetch_skb_u8(skb, &iphc1))
791 _saddr = mac_cb(skb)->sa.hwaddr;
792 _daddr = mac_cb(skb)->da.hwaddr;
794 pr_debug(
"iphc0 = %02x, iphc1 = %02x\n", iphc0, iphc1);
798 pr_debug(
"CID flag is set, increase header with one\n");
799 if (lowpan_fetch_skb_u8(skb, &num_context))
812 if (lowpan_fetch_skb_u8(skb, &tmp))
817 hdr.priority = ((tmp >> 2) & 0x0f);
818 hdr.
flow_lbl[0] = ((tmp >> 2) & 0x30) | (tmp << 6) |
826 if (lowpan_fetch_skb_u8(skb, &tmp))
829 hdr.priority = ((tmp >> 2) & 0x0f);
830 hdr.
flow_lbl[0] = ((tmp << 6) & 0xC0) | ((tmp >> 2) & 0x30);
839 if (lowpan_fetch_skb_u8(skb, &tmp))
842 hdr.
flow_lbl[0] = (skb->
data[0] & 0x0F) | ((tmp >> 2) & 0x30);
858 if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
860 if (lowpan_fetch_skb_u8(skb, &(hdr.
nexthdr)))
863 pr_debug(
"NH flag is set, next header carried inline: %02x\n",
869 hdr.
hop_limit = lowpan_ttl_values[iphc0 & 0x03];
871 if (lowpan_fetch_skb_u8(skb, &(hdr.
hop_limit)))
879 pr_debug(
"source address stateless compression\n");
880 err = lowpan_uncompress_addr(skb, &hdr.
saddr, lowpan_llprefix,
881 lowpan_unc_llconf[tmp], skb->
data);
891 pr_debug(
"dest: context-based mcast compression\n");
894 u8 prefix[] = {0xff, 0x02};
896 pr_debug(
"dest: non context-based mcast compression\n");
897 if (0 < tmp && tmp < 3) {
898 if (lowpan_fetch_skb_u8(skb, &prefix[1]))
902 err = lowpan_uncompress_addr(skb, &hdr.
daddr, prefix,
903 lowpan_unc_mxconf[tmp],
NULL);
908 pr_debug(
"dest: stateless compression\n");
909 err = lowpan_uncompress_addr(skb, &hdr.
daddr, lowpan_llprefix,
910 lowpan_unc_llconf[tmp], skb->
data);
916 if (iphc0 & LOWPAN_IPHC_NH_C)
917 if (lowpan_uncompress_udp_header(skb))
923 pr_debug(
"skb headroom size = %d, data length = %d\n",
924 skb_headroom(skb), skb->
len);
926 pr_debug(
"IPv6 header dump:\n\tversion = %d\n\tlength = %d\n\t"
927 "nexthdr = 0x%02x\n\thop_lim = %d\n", hdr.version,
930 lowpan_raw_dump_table(__func__,
"raw header dump", (
u8 *)&hdr,
932 return lowpan_skb_deliver(skb, &hdr);
935 spin_unlock_bh(&flist_lock);
941 static int lowpan_set_address(
struct net_device *dev,
void *
p)
945 if (netif_running(dev))
954 static int lowpan_get_mac_header_length(
struct sk_buff *skb)
966 lowpan_fragment_xmit(
struct sk_buff *skb,
u8 *head,
967 int mlen,
int plen,
int offset)
975 lowpan_raw_dump_inline(__func__,
"6lowpan fragment header", head, hlen);
989 skb_copy_from_linear_data_offset(skb, offset + mlen,
992 lowpan_raw_dump_table(__func__,
" raw fragment dump", frag->
data,
1001 lowpan_skb_fragmentation(
struct sk_buff *skb)
1006 header_length = lowpan_get_mac_header_length(skb);
1008 tag = fragment_tag++;
1012 head[1] = payload_length & 0xff;
1014 head[3] = tag & 0xff;
1016 err = lowpan_fragment_xmit(skb, head, header_length, 0, 0);
1022 while ((payload_length - offset > 0) && (err >= 0)) {
1025 head[4] = offset / 8;
1027 if (payload_length - offset < len)
1028 len = payload_length -
offset;
1030 err = lowpan_fragment_xmit(skb, head, header_length,
1046 pr_debug(
"ERROR: no real wpan device found\n");
1055 pr_debug(
"frame is too big, fragmentation is needed\n");
1056 err = lowpan_skb_fragmentation(skb);
1078 static u16 lowpan_get_short_addr(
const struct net_device *dev)
1084 static struct header_ops lowpan_header_ops = {
1085 .create = lowpan_header_create,
1089 .ndo_start_xmit = lowpan_xmit,
1090 .ndo_set_mac_address = lowpan_set_address,
1094 .get_pan_id = lowpan_get_pan_id,
1095 .get_phy = lowpan_get_phy,
1096 .get_short_addr = lowpan_get_short_addr,
1099 static void lowpan_setup(
struct net_device *dev)
1121 if (nla_len(tb[IFLA_ADDRESS]) != IEEE802154_ADDR_LEN)
1132 if (!netif_running(dev))
1139 switch (skb->
data[0] & 0xe0) {
1146 lowpan_process_data(local_skb);
1161 static int lowpan_newlink(
struct net *src_net,
struct net_device *dev,
1189 INIT_LIST_HEAD(&entry->
list);
1208 if (entry->
ldev == dev) {
1225 .
setup = lowpan_setup,
1226 .newlink = lowpan_newlink,
1227 .dellink = lowpan_dellink,
1228 .validate = lowpan_validate,
1231 static inline int __init lowpan_netlink_init(
void)
1236 static inline void __init lowpan_netlink_fini(
void)
1242 unsigned long event,
1255 lowpan_dellink(entry->
ldev, &del_list);
1266 .notifier_call = lowpan_device_event,
1274 static int __init lowpan_init_module(
void)
1278 err = lowpan_netlink_init();
1287 lowpan_netlink_fini();
1293 static void __exit lowpan_cleanup_module(
void)
1297 lowpan_netlink_fini();
1307 spin_lock_bh(&flist_lock);
1311 dev_kfree_skb(frame->
skb);
1314 spin_unlock_bh(&flist_lock);