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>
37 static void raw_hash(
struct sock *
sk)
40 sk_add_node(sk, &raw_head);
41 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
45 static void raw_unhash(
struct sock *sk)
48 if (sk_del_node_init(sk))
49 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
53 static void raw_close(
struct sock *sk,
long timeout)
64 if (len <
sizeof(*addr))
83 sk->sk_bound_dev_if = dev->
ifindex;
94 static int raw_connect(
struct sock *sk,
struct sockaddr *uaddr,
100 static int raw_disconnect(
struct sock *sk,
int flags)
120 if (!sk->sk_bound_dev_if)
136 pr_debug(
"size = %Zu, mtu = %u\n", size, mtu);
148 skb_reserve(skb, hlen);
150 skb_reset_mac_header(skb);
151 skb_reset_network_header(skb);
177 static int raw_recvmsg(
struct kiocb *iocb,
struct sock *sk,
struct msghdr *msg,
178 size_t len,
int noblock,
int flags,
int *addr_len)
198 sock_recv_ts_and_drops(msg, sk, skb);
210 static int raw_rcv_skb(
struct sock *sk,
struct sk_buff *skb)
229 if (!sk->sk_bound_dev_if ||
230 sk->sk_bound_dev_if == dev->
ifindex) {
236 raw_rcv_skb(sk, clone);
243 static int raw_getsockopt(
struct sock *sk,
int level,
int optname,
244 char __user *optval,
int __user *optlen)
249 static int raw_setsockopt(
struct sock *sk,
int level,
int optname,
250 char __user *optval,
unsigned int optlen)
256 .name =
"IEEE-802.15.4-RAW",
258 .obj_size =
sizeof(
struct sock),
261 .sendmsg = raw_sendmsg,
262 .recvmsg = raw_recvmsg,
264 .unhash = raw_unhash,
265 .connect = raw_connect,
266 .disconnect = raw_disconnect,
267 .getsockopt = raw_getsockopt,
268 .setsockopt = raw_setsockopt,