Merge tag 'linux-can-next-for-6.5-20230622' of git://git.kernel.org/pub/scm/linux...
[platform/kernel/linux-starfive.git] / net / ieee802154 / socket.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * IEEE802154.4 socket interface
4  *
5  * Copyright 2007, 2008 Siemens AG
6  *
7  * Written by:
8  * Sergey Lapin <slapin@ossfans.org>
9  * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
10  */
11
12 #include <linux/net.h>
13 #include <linux/capability.h>
14 #include <linux/module.h>
15 #include <linux/if_arp.h>
16 #include <linux/if.h>
17 #include <linux/termios.h>      /* For TIOCOUTQ/INQ */
18 #include <linux/list.h>
19 #include <linux/slab.h>
20 #include <linux/socket.h>
21 #include <net/datalink.h>
22 #include <net/psnap.h>
23 #include <net/sock.h>
24 #include <net/tcp_states.h>
25 #include <net/route.h>
26
27 #include <net/af_ieee802154.h>
28 #include <net/ieee802154_netdev.h>
29
30 /* Utility function for families */
31 static struct net_device*
32 ieee802154_get_dev(struct net *net, const struct ieee802154_addr *addr)
33 {
34         struct net_device *dev = NULL;
35         struct net_device *tmp;
36         __le16 pan_id, short_addr;
37         u8 hwaddr[IEEE802154_ADDR_LEN];
38
39         switch (addr->mode) {
40         case IEEE802154_ADDR_LONG:
41                 ieee802154_devaddr_to_raw(hwaddr, addr->extended_addr);
42                 rcu_read_lock();
43                 dev = dev_getbyhwaddr_rcu(net, ARPHRD_IEEE802154, hwaddr);
44                 dev_hold(dev);
45                 rcu_read_unlock();
46                 break;
47         case IEEE802154_ADDR_SHORT:
48                 if (addr->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST) ||
49                     addr->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) ||
50                     addr->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST))
51                         break;
52
53                 rtnl_lock();
54
55                 for_each_netdev(net, tmp) {
56                         if (tmp->type != ARPHRD_IEEE802154)
57                                 continue;
58
59                         pan_id = tmp->ieee802154_ptr->pan_id;
60                         short_addr = tmp->ieee802154_ptr->short_addr;
61                         if (pan_id == addr->pan_id &&
62                             short_addr == addr->short_addr) {
63                                 dev = tmp;
64                                 dev_hold(dev);
65                                 break;
66                         }
67                 }
68
69                 rtnl_unlock();
70                 break;
71         default:
72                 pr_warn("Unsupported ieee802154 address type: %d\n",
73                         addr->mode);
74                 break;
75         }
76
77         return dev;
78 }
79
80 static int ieee802154_sock_release(struct socket *sock)
81 {
82         struct sock *sk = sock->sk;
83
84         if (sk) {
85                 sock->sk = NULL;
86                 sk->sk_prot->close(sk, 0);
87         }
88         return 0;
89 }
90
91 static int ieee802154_sock_sendmsg(struct socket *sock, struct msghdr *msg,
92                                    size_t len)
93 {
94         struct sock *sk = sock->sk;
95
96         return sk->sk_prot->sendmsg(sk, msg, len);
97 }
98
99 static int ieee802154_sock_bind(struct socket *sock, struct sockaddr *uaddr,
100                                 int addr_len)
101 {
102         struct sock *sk = sock->sk;
103
104         if (sk->sk_prot->bind)
105                 return sk->sk_prot->bind(sk, uaddr, addr_len);
106
107         return sock_no_bind(sock, uaddr, addr_len);
108 }
109
110 static int ieee802154_sock_connect(struct socket *sock, struct sockaddr *uaddr,
111                                    int addr_len, int flags)
112 {
113         struct sock *sk = sock->sk;
114
115         if (addr_len < sizeof(uaddr->sa_family))
116                 return -EINVAL;
117
118         if (uaddr->sa_family == AF_UNSPEC)
119                 return sk->sk_prot->disconnect(sk, flags);
120
121         return sk->sk_prot->connect(sk, uaddr, addr_len);
122 }
123
124 static int ieee802154_dev_ioctl(struct sock *sk, struct ifreq __user *arg,
125                                 unsigned int cmd)
126 {
127         struct ifreq ifr;
128         int ret = -ENOIOCTLCMD;
129         struct net_device *dev;
130
131         if (get_user_ifreq(&ifr, NULL, arg))
132                 return -EFAULT;
133
134         ifr.ifr_name[IFNAMSIZ-1] = 0;
135
136         dev_load(sock_net(sk), ifr.ifr_name);
137         dev = dev_get_by_name(sock_net(sk), ifr.ifr_name);
138
139         if (!dev)
140                 return -ENODEV;
141
142         if (dev->type == ARPHRD_IEEE802154 && dev->netdev_ops->ndo_do_ioctl)
143                 ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, cmd);
144
145         if (!ret && put_user_ifreq(&ifr, arg))
146                 ret = -EFAULT;
147         dev_put(dev);
148
149         return ret;
150 }
151
152 static int ieee802154_sock_ioctl(struct socket *sock, unsigned int cmd,
153                                  unsigned long arg)
154 {
155         struct sock *sk = sock->sk;
156
157         switch (cmd) {
158         case SIOCGIFADDR:
159         case SIOCSIFADDR:
160                 return ieee802154_dev_ioctl(sk, (struct ifreq __user *)arg,
161                                 cmd);
162         default:
163                 if (!sk->sk_prot->ioctl)
164                         return -ENOIOCTLCMD;
165                 return sk_ioctl(sk, cmd, (void __user *)arg);
166         }
167 }
168
169 /* RAW Sockets (802.15.4 created in userspace) */
170 static HLIST_HEAD(raw_head);
171 static DEFINE_RWLOCK(raw_lock);
172
173 static int raw_hash(struct sock *sk)
174 {
175         write_lock_bh(&raw_lock);
176         sk_add_node(sk, &raw_head);
177         write_unlock_bh(&raw_lock);
178         sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
179
180         return 0;
181 }
182
183 static void raw_unhash(struct sock *sk)
184 {
185         write_lock_bh(&raw_lock);
186         if (sk_del_node_init(sk))
187                 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
188         write_unlock_bh(&raw_lock);
189 }
190
191 static void raw_close(struct sock *sk, long timeout)
192 {
193         sk_common_release(sk);
194 }
195
196 static int raw_bind(struct sock *sk, struct sockaddr *_uaddr, int len)
197 {
198         struct ieee802154_addr addr;
199         struct sockaddr_ieee802154 *uaddr = (struct sockaddr_ieee802154 *)_uaddr;
200         int err = 0;
201         struct net_device *dev = NULL;
202
203         err = ieee802154_sockaddr_check_size(uaddr, len);
204         if (err < 0)
205                 return err;
206
207         uaddr = (struct sockaddr_ieee802154 *)_uaddr;
208         if (uaddr->family != AF_IEEE802154)
209                 return -EINVAL;
210
211         lock_sock(sk);
212
213         ieee802154_addr_from_sa(&addr, &uaddr->addr);
214         dev = ieee802154_get_dev(sock_net(sk), &addr);
215         if (!dev) {
216                 err = -ENODEV;
217                 goto out;
218         }
219
220         sk->sk_bound_dev_if = dev->ifindex;
221         sk_dst_reset(sk);
222
223         dev_put(dev);
224 out:
225         release_sock(sk);
226
227         return err;
228 }
229
230 static int raw_connect(struct sock *sk, struct sockaddr *uaddr,
231                        int addr_len)
232 {
233         return -ENOTSUPP;
234 }
235
236 static int raw_disconnect(struct sock *sk, int flags)
237 {
238         return 0;
239 }
240
241 static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
242 {
243         struct net_device *dev;
244         unsigned int mtu;
245         struct sk_buff *skb;
246         int hlen, tlen;
247         int err;
248
249         if (msg->msg_flags & MSG_OOB) {
250                 pr_debug("msg->msg_flags = 0x%x\n", msg->msg_flags);
251                 return -EOPNOTSUPP;
252         }
253
254         lock_sock(sk);
255         if (!sk->sk_bound_dev_if)
256                 dev = dev_getfirstbyhwtype(sock_net(sk), ARPHRD_IEEE802154);
257         else
258                 dev = dev_get_by_index(sock_net(sk), sk->sk_bound_dev_if);
259         release_sock(sk);
260
261         if (!dev) {
262                 pr_debug("no dev\n");
263                 err = -ENXIO;
264                 goto out;
265         }
266
267         mtu = IEEE802154_MTU;
268         pr_debug("name = %s, mtu = %u\n", dev->name, mtu);
269
270         if (size > mtu) {
271                 pr_debug("size = %zu, mtu = %u\n", size, mtu);
272                 err = -EMSGSIZE;
273                 goto out_dev;
274         }
275         if (!size) {
276                 err = 0;
277                 goto out_dev;
278         }
279
280         hlen = LL_RESERVED_SPACE(dev);
281         tlen = dev->needed_tailroom;
282         skb = sock_alloc_send_skb(sk, hlen + tlen + size,
283                                   msg->msg_flags & MSG_DONTWAIT, &err);
284         if (!skb)
285                 goto out_dev;
286
287         skb_reserve(skb, hlen);
288
289         skb_reset_mac_header(skb);
290         skb_reset_network_header(skb);
291
292         err = memcpy_from_msg(skb_put(skb, size), msg, size);
293         if (err < 0)
294                 goto out_skb;
295
296         skb->dev = dev;
297         skb->protocol = htons(ETH_P_IEEE802154);
298
299         err = dev_queue_xmit(skb);
300         if (err > 0)
301                 err = net_xmit_errno(err);
302
303         dev_put(dev);
304
305         return err ?: size;
306
307 out_skb:
308         kfree_skb(skb);
309 out_dev:
310         dev_put(dev);
311 out:
312         return err;
313 }
314
315 static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
316                        int flags, int *addr_len)
317 {
318         size_t copied = 0;
319         int err = -EOPNOTSUPP;
320         struct sk_buff *skb;
321
322         skb = skb_recv_datagram(sk, flags, &err);
323         if (!skb)
324                 goto out;
325
326         copied = skb->len;
327         if (len < copied) {
328                 msg->msg_flags |= MSG_TRUNC;
329                 copied = len;
330         }
331
332         err = skb_copy_datagram_msg(skb, 0, msg, copied);
333         if (err)
334                 goto done;
335
336         sock_recv_cmsgs(msg, sk, skb);
337
338         if (flags & MSG_TRUNC)
339                 copied = skb->len;
340 done:
341         skb_free_datagram(sk, skb);
342 out:
343         if (err)
344                 return err;
345         return copied;
346 }
347
348 static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)
349 {
350         skb = skb_share_check(skb, GFP_ATOMIC);
351         if (!skb)
352                 return NET_RX_DROP;
353
354         if (sock_queue_rcv_skb(sk, skb) < 0) {
355                 kfree_skb(skb);
356                 return NET_RX_DROP;
357         }
358
359         return NET_RX_SUCCESS;
360 }
361
362 static void ieee802154_raw_deliver(struct net_device *dev, struct sk_buff *skb)
363 {
364         struct sock *sk;
365
366         read_lock(&raw_lock);
367         sk_for_each(sk, &raw_head) {
368                 bh_lock_sock(sk);
369                 if (!sk->sk_bound_dev_if ||
370                     sk->sk_bound_dev_if == dev->ifindex) {
371                         struct sk_buff *clone;
372
373                         clone = skb_clone(skb, GFP_ATOMIC);
374                         if (clone)
375                                 raw_rcv_skb(sk, clone);
376                 }
377                 bh_unlock_sock(sk);
378         }
379         read_unlock(&raw_lock);
380 }
381
382 static int raw_getsockopt(struct sock *sk, int level, int optname,
383                           char __user *optval, int __user *optlen)
384 {
385         return -EOPNOTSUPP;
386 }
387
388 static int raw_setsockopt(struct sock *sk, int level, int optname,
389                           sockptr_t optval, unsigned int optlen)
390 {
391         return -EOPNOTSUPP;
392 }
393
394 static struct proto ieee802154_raw_prot = {
395         .name           = "IEEE-802.15.4-RAW",
396         .owner          = THIS_MODULE,
397         .obj_size       = sizeof(struct sock),
398         .close          = raw_close,
399         .bind           = raw_bind,
400         .sendmsg        = raw_sendmsg,
401         .recvmsg        = raw_recvmsg,
402         .hash           = raw_hash,
403         .unhash         = raw_unhash,
404         .connect        = raw_connect,
405         .disconnect     = raw_disconnect,
406         .getsockopt     = raw_getsockopt,
407         .setsockopt     = raw_setsockopt,
408 };
409
410 static const struct proto_ops ieee802154_raw_ops = {
411         .family            = PF_IEEE802154,
412         .owner             = THIS_MODULE,
413         .release           = ieee802154_sock_release,
414         .bind              = ieee802154_sock_bind,
415         .connect           = ieee802154_sock_connect,
416         .socketpair        = sock_no_socketpair,
417         .accept            = sock_no_accept,
418         .getname           = sock_no_getname,
419         .poll              = datagram_poll,
420         .ioctl             = ieee802154_sock_ioctl,
421         .gettstamp         = sock_gettstamp,
422         .listen            = sock_no_listen,
423         .shutdown          = sock_no_shutdown,
424         .setsockopt        = sock_common_setsockopt,
425         .getsockopt        = sock_common_getsockopt,
426         .sendmsg           = ieee802154_sock_sendmsg,
427         .recvmsg           = sock_common_recvmsg,
428         .mmap              = sock_no_mmap,
429         .sendpage          = sock_no_sendpage,
430 };
431
432 /* DGRAM Sockets (802.15.4 dataframes) */
433 static HLIST_HEAD(dgram_head);
434 static DEFINE_RWLOCK(dgram_lock);
435
436 struct dgram_sock {
437         struct sock sk;
438
439         struct ieee802154_addr src_addr;
440         struct ieee802154_addr dst_addr;
441
442         unsigned int bound:1;
443         unsigned int connected:1;
444         unsigned int want_ack:1;
445         unsigned int want_lqi:1;
446         unsigned int secen:1;
447         unsigned int secen_override:1;
448         unsigned int seclevel:3;
449         unsigned int seclevel_override:1;
450 };
451
452 static inline struct dgram_sock *dgram_sk(const struct sock *sk)
453 {
454         return container_of(sk, struct dgram_sock, sk);
455 }
456
457 static int dgram_hash(struct sock *sk)
458 {
459         write_lock_bh(&dgram_lock);
460         sk_add_node(sk, &dgram_head);
461         write_unlock_bh(&dgram_lock);
462         sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
463
464         return 0;
465 }
466
467 static void dgram_unhash(struct sock *sk)
468 {
469         write_lock_bh(&dgram_lock);
470         if (sk_del_node_init(sk))
471                 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
472         write_unlock_bh(&dgram_lock);
473 }
474
475 static int dgram_init(struct sock *sk)
476 {
477         struct dgram_sock *ro = dgram_sk(sk);
478
479         ro->want_ack = 1;
480         ro->want_lqi = 0;
481         return 0;
482 }
483
484 static void dgram_close(struct sock *sk, long timeout)
485 {
486         sk_common_release(sk);
487 }
488
489 static int dgram_bind(struct sock *sk, struct sockaddr *uaddr, int len)
490 {
491         struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;
492         struct ieee802154_addr haddr;
493         struct dgram_sock *ro = dgram_sk(sk);
494         int err = -EINVAL;
495         struct net_device *dev;
496
497         lock_sock(sk);
498
499         ro->bound = 0;
500
501         err = ieee802154_sockaddr_check_size(addr, len);
502         if (err < 0)
503                 goto out;
504
505         if (addr->family != AF_IEEE802154) {
506                 err = -EINVAL;
507                 goto out;
508         }
509
510         ieee802154_addr_from_sa(&haddr, &addr->addr);
511         dev = ieee802154_get_dev(sock_net(sk), &haddr);
512         if (!dev) {
513                 err = -ENODEV;
514                 goto out;
515         }
516
517         if (dev->type != ARPHRD_IEEE802154) {
518                 err = -ENODEV;
519                 goto out_put;
520         }
521
522         ro->src_addr = haddr;
523
524         ro->bound = 1;
525         err = 0;
526 out_put:
527         dev_put(dev);
528 out:
529         release_sock(sk);
530
531         return err;
532 }
533
534 static int dgram_ioctl(struct sock *sk, int cmd, int *karg)
535 {
536         switch (cmd) {
537         case SIOCOUTQ:
538         {
539                 *karg = sk_wmem_alloc_get(sk);
540
541                 return 0;
542         }
543
544         case SIOCINQ:
545         {
546                 struct sk_buff *skb;
547
548                 *karg = 0;
549                 spin_lock_bh(&sk->sk_receive_queue.lock);
550                 skb = skb_peek(&sk->sk_receive_queue);
551                 if (skb) {
552                         /* We will only return the amount
553                          * of this packet since that is all
554                          * that will be read.
555                          */
556                         *karg = skb->len - ieee802154_hdr_length(skb);
557                 }
558                 spin_unlock_bh(&sk->sk_receive_queue.lock);
559                 return 0;
560         }
561         }
562
563         return -ENOIOCTLCMD;
564 }
565
566 /* FIXME: autobind */
567 static int dgram_connect(struct sock *sk, struct sockaddr *uaddr,
568                          int len)
569 {
570         struct sockaddr_ieee802154 *addr = (struct sockaddr_ieee802154 *)uaddr;
571         struct dgram_sock *ro = dgram_sk(sk);
572         int err = 0;
573
574         err = ieee802154_sockaddr_check_size(addr, len);
575         if (err < 0)
576                 return err;
577
578         if (addr->family != AF_IEEE802154)
579                 return -EINVAL;
580
581         lock_sock(sk);
582
583         if (!ro->bound) {
584                 err = -ENETUNREACH;
585                 goto out;
586         }
587
588         ieee802154_addr_from_sa(&ro->dst_addr, &addr->addr);
589         ro->connected = 1;
590
591 out:
592         release_sock(sk);
593         return err;
594 }
595
596 static int dgram_disconnect(struct sock *sk, int flags)
597 {
598         struct dgram_sock *ro = dgram_sk(sk);
599
600         lock_sock(sk);
601         ro->connected = 0;
602         release_sock(sk);
603
604         return 0;
605 }
606
607 static int dgram_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
608 {
609         struct net_device *dev;
610         unsigned int mtu;
611         struct sk_buff *skb;
612         struct ieee802154_mac_cb *cb;
613         struct dgram_sock *ro = dgram_sk(sk);
614         struct ieee802154_addr dst_addr;
615         DECLARE_SOCKADDR(struct sockaddr_ieee802154*, daddr, msg->msg_name);
616         int hlen, tlen;
617         int err;
618
619         if (msg->msg_flags & MSG_OOB) {
620                 pr_debug("msg->msg_flags = 0x%x\n", msg->msg_flags);
621                 return -EOPNOTSUPP;
622         }
623
624         if (msg->msg_name) {
625                 if (ro->connected)
626                         return -EISCONN;
627                 if (msg->msg_namelen < IEEE802154_MIN_NAMELEN)
628                         return -EINVAL;
629                 err = ieee802154_sockaddr_check_size(daddr, msg->msg_namelen);
630                 if (err < 0)
631                         return err;
632                 ieee802154_addr_from_sa(&dst_addr, &daddr->addr);
633         } else {
634                 if (!ro->connected)
635                         return -EDESTADDRREQ;
636                 dst_addr = ro->dst_addr;
637         }
638
639         if (!ro->bound)
640                 dev = dev_getfirstbyhwtype(sock_net(sk), ARPHRD_IEEE802154);
641         else
642                 dev = ieee802154_get_dev(sock_net(sk), &ro->src_addr);
643
644         if (!dev) {
645                 pr_debug("no dev\n");
646                 err = -ENXIO;
647                 goto out;
648         }
649         mtu = IEEE802154_MTU;
650         pr_debug("name = %s, mtu = %u\n", dev->name, mtu);
651
652         if (size > mtu) {
653                 pr_debug("size = %zu, mtu = %u\n", size, mtu);
654                 err = -EMSGSIZE;
655                 goto out_dev;
656         }
657
658         hlen = LL_RESERVED_SPACE(dev);
659         tlen = dev->needed_tailroom;
660         skb = sock_alloc_send_skb(sk, hlen + tlen + size,
661                                   msg->msg_flags & MSG_DONTWAIT,
662                                   &err);
663         if (!skb)
664                 goto out_dev;
665
666         skb_reserve(skb, hlen);
667
668         skb_reset_network_header(skb);
669
670         cb = mac_cb_init(skb);
671         cb->type = IEEE802154_FC_TYPE_DATA;
672         cb->ackreq = ro->want_ack;
673         cb->secen = ro->secen;
674         cb->secen_override = ro->secen_override;
675         cb->seclevel = ro->seclevel;
676         cb->seclevel_override = ro->seclevel_override;
677
678         err = wpan_dev_hard_header(skb, dev, &dst_addr,
679                                    ro->bound ? &ro->src_addr : NULL, size);
680         if (err < 0)
681                 goto out_skb;
682
683         err = memcpy_from_msg(skb_put(skb, size), msg, size);
684         if (err < 0)
685                 goto out_skb;
686
687         skb->dev = dev;
688         skb->protocol = htons(ETH_P_IEEE802154);
689
690         err = dev_queue_xmit(skb);
691         if (err > 0)
692                 err = net_xmit_errno(err);
693
694         dev_put(dev);
695
696         return err ?: size;
697
698 out_skb:
699         kfree_skb(skb);
700 out_dev:
701         dev_put(dev);
702 out:
703         return err;
704 }
705
706 static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
707                          int flags, int *addr_len)
708 {
709         size_t copied = 0;
710         int err = -EOPNOTSUPP;
711         struct sk_buff *skb;
712         struct dgram_sock *ro = dgram_sk(sk);
713         DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name);
714
715         skb = skb_recv_datagram(sk, flags, &err);
716         if (!skb)
717                 goto out;
718
719         copied = skb->len;
720         if (len < copied) {
721                 msg->msg_flags |= MSG_TRUNC;
722                 copied = len;
723         }
724
725         /* FIXME: skip headers if necessary ?! */
726         err = skb_copy_datagram_msg(skb, 0, msg, copied);
727         if (err)
728                 goto done;
729
730         sock_recv_cmsgs(msg, sk, skb);
731
732         if (saddr) {
733                 /* Clear the implicit padding in struct sockaddr_ieee802154
734                  * (16 bits between 'family' and 'addr') and in struct
735                  * ieee802154_addr_sa (16 bits at the end of the structure).
736                  */
737                 memset(saddr, 0, sizeof(*saddr));
738
739                 saddr->family = AF_IEEE802154;
740                 ieee802154_addr_to_sa(&saddr->addr, &mac_cb(skb)->source);
741                 *addr_len = sizeof(*saddr);
742         }
743
744         if (ro->want_lqi) {
745                 err = put_cmsg(msg, SOL_IEEE802154, WPAN_WANTLQI,
746                                sizeof(uint8_t), &(mac_cb(skb)->lqi));
747                 if (err)
748                         goto done;
749         }
750
751         if (flags & MSG_TRUNC)
752                 copied = skb->len;
753 done:
754         skb_free_datagram(sk, skb);
755 out:
756         if (err)
757                 return err;
758         return copied;
759 }
760
761 static int dgram_rcv_skb(struct sock *sk, struct sk_buff *skb)
762 {
763         skb = skb_share_check(skb, GFP_ATOMIC);
764         if (!skb)
765                 return NET_RX_DROP;
766
767         if (sock_queue_rcv_skb(sk, skb) < 0) {
768                 kfree_skb(skb);
769                 return NET_RX_DROP;
770         }
771
772         return NET_RX_SUCCESS;
773 }
774
775 static inline bool
776 ieee802154_match_sock(__le64 hw_addr, __le16 pan_id, __le16 short_addr,
777                       struct dgram_sock *ro)
778 {
779         if (!ro->bound)
780                 return true;
781
782         if (ro->src_addr.mode == IEEE802154_ADDR_LONG &&
783             hw_addr == ro->src_addr.extended_addr)
784                 return true;
785
786         if (ro->src_addr.mode == IEEE802154_ADDR_SHORT &&
787             pan_id == ro->src_addr.pan_id &&
788             short_addr == ro->src_addr.short_addr)
789                 return true;
790
791         return false;
792 }
793
794 static int ieee802154_dgram_deliver(struct net_device *dev, struct sk_buff *skb)
795 {
796         struct sock *sk, *prev = NULL;
797         int ret = NET_RX_SUCCESS;
798         __le16 pan_id, short_addr;
799         __le64 hw_addr;
800
801         /* Data frame processing */
802         BUG_ON(dev->type != ARPHRD_IEEE802154);
803
804         pan_id = dev->ieee802154_ptr->pan_id;
805         short_addr = dev->ieee802154_ptr->short_addr;
806         hw_addr = dev->ieee802154_ptr->extended_addr;
807
808         read_lock(&dgram_lock);
809         sk_for_each(sk, &dgram_head) {
810                 if (ieee802154_match_sock(hw_addr, pan_id, short_addr,
811                                           dgram_sk(sk))) {
812                         if (prev) {
813                                 struct sk_buff *clone;
814
815                                 clone = skb_clone(skb, GFP_ATOMIC);
816                                 if (clone)
817                                         dgram_rcv_skb(prev, clone);
818                         }
819
820                         prev = sk;
821                 }
822         }
823
824         if (prev) {
825                 dgram_rcv_skb(prev, skb);
826         } else {
827                 kfree_skb(skb);
828                 ret = NET_RX_DROP;
829         }
830         read_unlock(&dgram_lock);
831
832         return ret;
833 }
834
835 static int dgram_getsockopt(struct sock *sk, int level, int optname,
836                             char __user *optval, int __user *optlen)
837 {
838         struct dgram_sock *ro = dgram_sk(sk);
839
840         int val, len;
841
842         if (level != SOL_IEEE802154)
843                 return -EOPNOTSUPP;
844
845         if (get_user(len, optlen))
846                 return -EFAULT;
847
848         len = min_t(unsigned int, len, sizeof(int));
849
850         switch (optname) {
851         case WPAN_WANTACK:
852                 val = ro->want_ack;
853                 break;
854         case WPAN_WANTLQI:
855                 val = ro->want_lqi;
856                 break;
857         case WPAN_SECURITY:
858                 if (!ro->secen_override)
859                         val = WPAN_SECURITY_DEFAULT;
860                 else if (ro->secen)
861                         val = WPAN_SECURITY_ON;
862                 else
863                         val = WPAN_SECURITY_OFF;
864                 break;
865         case WPAN_SECURITY_LEVEL:
866                 if (!ro->seclevel_override)
867                         val = WPAN_SECURITY_LEVEL_DEFAULT;
868                 else
869                         val = ro->seclevel;
870                 break;
871         default:
872                 return -ENOPROTOOPT;
873         }
874
875         if (put_user(len, optlen))
876                 return -EFAULT;
877         if (copy_to_user(optval, &val, len))
878                 return -EFAULT;
879         return 0;
880 }
881
882 static int dgram_setsockopt(struct sock *sk, int level, int optname,
883                             sockptr_t optval, unsigned int optlen)
884 {
885         struct dgram_sock *ro = dgram_sk(sk);
886         struct net *net = sock_net(sk);
887         int val;
888         int err = 0;
889
890         if (optlen < sizeof(int))
891                 return -EINVAL;
892
893         if (copy_from_sockptr(&val, optval, sizeof(int)))
894                 return -EFAULT;
895
896         lock_sock(sk);
897
898         switch (optname) {
899         case WPAN_WANTACK:
900                 ro->want_ack = !!val;
901                 break;
902         case WPAN_WANTLQI:
903                 ro->want_lqi = !!val;
904                 break;
905         case WPAN_SECURITY:
906                 if (!ns_capable(net->user_ns, CAP_NET_ADMIN) &&
907                     !ns_capable(net->user_ns, CAP_NET_RAW)) {
908                         err = -EPERM;
909                         break;
910                 }
911
912                 switch (val) {
913                 case WPAN_SECURITY_DEFAULT:
914                         ro->secen_override = 0;
915                         break;
916                 case WPAN_SECURITY_ON:
917                         ro->secen_override = 1;
918                         ro->secen = 1;
919                         break;
920                 case WPAN_SECURITY_OFF:
921                         ro->secen_override = 1;
922                         ro->secen = 0;
923                         break;
924                 default:
925                         err = -EINVAL;
926                         break;
927                 }
928                 break;
929         case WPAN_SECURITY_LEVEL:
930                 if (!ns_capable(net->user_ns, CAP_NET_ADMIN) &&
931                     !ns_capable(net->user_ns, CAP_NET_RAW)) {
932                         err = -EPERM;
933                         break;
934                 }
935
936                 if (val < WPAN_SECURITY_LEVEL_DEFAULT ||
937                     val > IEEE802154_SCF_SECLEVEL_ENC_MIC128) {
938                         err = -EINVAL;
939                 } else if (val == WPAN_SECURITY_LEVEL_DEFAULT) {
940                         ro->seclevel_override = 0;
941                 } else {
942                         ro->seclevel_override = 1;
943                         ro->seclevel = val;
944                 }
945                 break;
946         default:
947                 err = -ENOPROTOOPT;
948                 break;
949         }
950
951         release_sock(sk);
952         return err;
953 }
954
955 static struct proto ieee802154_dgram_prot = {
956         .name           = "IEEE-802.15.4-MAC",
957         .owner          = THIS_MODULE,
958         .obj_size       = sizeof(struct dgram_sock),
959         .init           = dgram_init,
960         .close          = dgram_close,
961         .bind           = dgram_bind,
962         .sendmsg        = dgram_sendmsg,
963         .recvmsg        = dgram_recvmsg,
964         .hash           = dgram_hash,
965         .unhash         = dgram_unhash,
966         .connect        = dgram_connect,
967         .disconnect     = dgram_disconnect,
968         .ioctl          = dgram_ioctl,
969         .getsockopt     = dgram_getsockopt,
970         .setsockopt     = dgram_setsockopt,
971 };
972
973 static const struct proto_ops ieee802154_dgram_ops = {
974         .family            = PF_IEEE802154,
975         .owner             = THIS_MODULE,
976         .release           = ieee802154_sock_release,
977         .bind              = ieee802154_sock_bind,
978         .connect           = ieee802154_sock_connect,
979         .socketpair        = sock_no_socketpair,
980         .accept            = sock_no_accept,
981         .getname           = sock_no_getname,
982         .poll              = datagram_poll,
983         .ioctl             = ieee802154_sock_ioctl,
984         .gettstamp         = sock_gettstamp,
985         .listen            = sock_no_listen,
986         .shutdown          = sock_no_shutdown,
987         .setsockopt        = sock_common_setsockopt,
988         .getsockopt        = sock_common_getsockopt,
989         .sendmsg           = ieee802154_sock_sendmsg,
990         .recvmsg           = sock_common_recvmsg,
991         .mmap              = sock_no_mmap,
992         .sendpage          = sock_no_sendpage,
993 };
994
995 static void ieee802154_sock_destruct(struct sock *sk)
996 {
997         skb_queue_purge(&sk->sk_receive_queue);
998 }
999
1000 /* Create a socket. Initialise the socket, blank the addresses
1001  * set the state.
1002  */
1003 static int ieee802154_create(struct net *net, struct socket *sock,
1004                              int protocol, int kern)
1005 {
1006         struct sock *sk;
1007         int rc;
1008         struct proto *proto;
1009         const struct proto_ops *ops;
1010
1011         if (!net_eq(net, &init_net))
1012                 return -EAFNOSUPPORT;
1013
1014         switch (sock->type) {
1015         case SOCK_RAW:
1016                 rc = -EPERM;
1017                 if (!capable(CAP_NET_RAW))
1018                         goto out;
1019                 proto = &ieee802154_raw_prot;
1020                 ops = &ieee802154_raw_ops;
1021                 break;
1022         case SOCK_DGRAM:
1023                 proto = &ieee802154_dgram_prot;
1024                 ops = &ieee802154_dgram_ops;
1025                 break;
1026         default:
1027                 rc = -ESOCKTNOSUPPORT;
1028                 goto out;
1029         }
1030
1031         rc = -ENOMEM;
1032         sk = sk_alloc(net, PF_IEEE802154, GFP_KERNEL, proto, kern);
1033         if (!sk)
1034                 goto out;
1035         rc = 0;
1036
1037         sock->ops = ops;
1038
1039         sock_init_data(sock, sk);
1040         sk->sk_destruct = ieee802154_sock_destruct;
1041         sk->sk_family = PF_IEEE802154;
1042
1043         /* Checksums on by default */
1044         sock_set_flag(sk, SOCK_ZAPPED);
1045
1046         if (sk->sk_prot->hash) {
1047                 rc = sk->sk_prot->hash(sk);
1048                 if (rc) {
1049                         sk_common_release(sk);
1050                         goto out;
1051                 }
1052         }
1053
1054         if (sk->sk_prot->init) {
1055                 rc = sk->sk_prot->init(sk);
1056                 if (rc)
1057                         sk_common_release(sk);
1058         }
1059 out:
1060         return rc;
1061 }
1062
1063 static const struct net_proto_family ieee802154_family_ops = {
1064         .family         = PF_IEEE802154,
1065         .create         = ieee802154_create,
1066         .owner          = THIS_MODULE,
1067 };
1068
1069 static int ieee802154_rcv(struct sk_buff *skb, struct net_device *dev,
1070                           struct packet_type *pt, struct net_device *orig_dev)
1071 {
1072         if (!netif_running(dev))
1073                 goto drop;
1074         pr_debug("got frame, type %d, dev %p\n", dev->type, dev);
1075 #ifdef DEBUG
1076         print_hex_dump_bytes("ieee802154_rcv ",
1077                              DUMP_PREFIX_NONE, skb->data, skb->len);
1078 #endif
1079
1080         if (!net_eq(dev_net(dev), &init_net))
1081                 goto drop;
1082
1083         ieee802154_raw_deliver(dev, skb);
1084
1085         if (dev->type != ARPHRD_IEEE802154)
1086                 goto drop;
1087
1088         if (skb->pkt_type != PACKET_OTHERHOST)
1089                 return ieee802154_dgram_deliver(dev, skb);
1090
1091 drop:
1092         kfree_skb(skb);
1093         return NET_RX_DROP;
1094 }
1095
1096 static struct packet_type ieee802154_packet_type = {
1097         .type = htons(ETH_P_IEEE802154),
1098         .func = ieee802154_rcv,
1099 };
1100
1101 static int __init af_ieee802154_init(void)
1102 {
1103         int rc;
1104
1105         rc = proto_register(&ieee802154_raw_prot, 1);
1106         if (rc)
1107                 goto out;
1108
1109         rc = proto_register(&ieee802154_dgram_prot, 1);
1110         if (rc)
1111                 goto err_dgram;
1112
1113         /* Tell SOCKET that we are alive */
1114         rc = sock_register(&ieee802154_family_ops);
1115         if (rc)
1116                 goto err_sock;
1117         dev_add_pack(&ieee802154_packet_type);
1118
1119         rc = 0;
1120         goto out;
1121
1122 err_sock:
1123         proto_unregister(&ieee802154_dgram_prot);
1124 err_dgram:
1125         proto_unregister(&ieee802154_raw_prot);
1126 out:
1127         return rc;
1128 }
1129
1130 static void __exit af_ieee802154_remove(void)
1131 {
1132         dev_remove_pack(&ieee802154_packet_type);
1133         sock_unregister(PF_IEEE802154);
1134         proto_unregister(&ieee802154_dgram_prot);
1135         proto_unregister(&ieee802154_raw_prot);
1136 }
1137
1138 module_init(af_ieee802154_init);
1139 module_exit(af_ieee802154_remove);
1140
1141 MODULE_LICENSE("GPL");
1142 MODULE_ALIAS_NETPROTO(PF_IEEE802154);