cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

socket.c (23568B)


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