24 #include <linux/net.h>
25 #include <linux/module.h>
26 #include <linux/if_arp.h>
27 #include <linux/list.h>
28 #include <linux/slab.h>
34 #include <asm/ioctls.h>
56 static void dgram_hash(
struct sock *
sk)
59 sk_add_node(sk, &dgram_head);
60 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
64 static void dgram_unhash(
struct sock *sk)
67 if (sk_del_node_init(sk))
68 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
72 static int dgram_init(
struct sock *sk)
83 static void dgram_close(
struct sock *sk,
long timeout)
99 if (len <
sizeof(*addr))
128 static int dgram_ioctl(
struct sock *sk,
int cmd,
unsigned long arg)
133 int amount = sk_wmem_alloc_get(sk);
135 return put_user(amount, (
int __user *)arg);
141 unsigned long amount;
153 amount = skb->
len - (3+8+8);
156 return put_user(amount, (
int __user *)arg);
164 static int dgram_connect(
struct sock *sk,
struct sockaddr *uaddr,
171 if (len <
sizeof(*addr))
191 static int dgram_disconnect(
struct sock *sk,
int flags)
205 static int dgram_sendmsg(
struct kiocb *
iocb,
struct sock *sk,
234 pr_debug(
"size = %Zu, mtu = %u\n", size, mtu);
247 skb_reserve(skb, hlen);
249 skb_reset_network_header(skb);
261 skb_reset_mac_header(skb);
287 static int dgram_recvmsg(
struct kiocb *iocb,
struct sock *sk,
288 struct msghdr *msg,
size_t len,
int noblock,
int flags,
310 sock_recv_ts_and_drops(msg, sk, skb);
322 static int dgram_rcv_skb(
struct sock *sk,
struct sk_buff *skb)
332 static inline int ieee802154_match_sock(
u8 *hw_addr,
u16 pan_id,
344 short_addr == ro->
src_addr.short_addr)
355 u16 pan_id, short_addr;
365 if (ieee802154_match_sock(dev->
dev_addr, pan_id, short_addr,
371 dgram_rcv_skb(prev, clone);
379 dgram_rcv_skb(prev, skb);
389 static int dgram_getsockopt(
struct sock *sk,
int level,
int optname,
390 char __user *optval,
int __user *optlen)
402 len =
min_t(
unsigned int, len,
sizeof(
int));
419 static int dgram_setsockopt(
struct sock *sk,
int level,
int optname,
420 char __user *optval,
unsigned int optlen)
426 if (optlen <
sizeof(
int))
429 if (
get_user(val, (
int __user *)optval))
448 .name =
"IEEE-802.15.4-MAC",
452 .close = dgram_close,
454 .sendmsg = dgram_sendmsg,
455 .recvmsg = dgram_recvmsg,
457 .unhash = dgram_unhash,
458 .connect = dgram_connect,
459 .disconnect = dgram_disconnect,
460 .ioctl = dgram_ioctl,
461 .getsockopt = dgram_getsockopt,
462 .setsockopt = dgram_setsockopt,