af_netlink.c (cc3a572fe6cf586f478546215bc5d3694357d71e) af_netlink.c (59324cf35aba5336b611074028777838a963d03b)
1/*
2 * NETLINK Kernel-user communication protocol.
3 *
4 * Authors: Alan Cox <alan@lxorguk.ukuu.org.uk>
5 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
6 * Patrick McHardy <kaber@trash.net>
7 *
8 * This program is free software; you can redistribute it and/or

--- 69 unchanged lines hidden (view full) ---

78/* state bits */
79#define NETLINK_S_CONGESTED 0x0
80
81/* flags */
82#define NETLINK_F_KERNEL_SOCKET 0x1
83#define NETLINK_F_RECV_PKTINFO 0x2
84#define NETLINK_F_BROADCAST_SEND_ERROR 0x4
85#define NETLINK_F_RECV_NO_ENOBUFS 0x8
1/*
2 * NETLINK Kernel-user communication protocol.
3 *
4 * Authors: Alan Cox <alan@lxorguk.ukuu.org.uk>
5 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
6 * Patrick McHardy <kaber@trash.net>
7 *
8 * This program is free software; you can redistribute it and/or

--- 69 unchanged lines hidden (view full) ---

78/* state bits */
79#define NETLINK_S_CONGESTED 0x0
80
81/* flags */
82#define NETLINK_F_KERNEL_SOCKET 0x1
83#define NETLINK_F_RECV_PKTINFO 0x2
84#define NETLINK_F_BROADCAST_SEND_ERROR 0x4
85#define NETLINK_F_RECV_NO_ENOBUFS 0x8
86#define NETLINK_F_LISTEN_ALL_NSID 0x10
86
87static inline int netlink_is_kernel(struct sock *sk)
88{
89 return nlk_sk(sk)->flags & NETLINK_F_KERNEL_SOCKET;
90}
91
92struct netlink_table *nl_table;
93EXPORT_SYMBOL_GPL(nl_table);

--- 1833 unchanged lines hidden (view full) ---

1927
1928 if (p->exclude_sk == sk)
1929 return;
1930
1931 if (nlk->portid == p->portid || p->group - 1 >= nlk->ngroups ||
1932 !test_bit(p->group - 1, nlk->groups))
1933 return;
1934
87
88static inline int netlink_is_kernel(struct sock *sk)
89{
90 return nlk_sk(sk)->flags & NETLINK_F_KERNEL_SOCKET;
91}
92
93struct netlink_table *nl_table;
94EXPORT_SYMBOL_GPL(nl_table);

--- 1833 unchanged lines hidden (view full) ---

1928
1929 if (p->exclude_sk == sk)
1930 return;
1931
1932 if (nlk->portid == p->portid || p->group - 1 >= nlk->ngroups ||
1933 !test_bit(p->group - 1, nlk->groups))
1934 return;
1935
1935 if (!net_eq(sock_net(sk), p->net))
1936 return;
1936 if (!net_eq(sock_net(sk), p->net)) {
1937 if (!(nlk->flags & NETLINK_F_LISTEN_ALL_NSID))
1938 return;
1937
1939
1940 if (!peernet_has_id(sock_net(sk), p->net))
1941 return;
1942
1943 if (!file_ns_capable(sk->sk_socket->file, p->net->user_ns,
1944 CAP_NET_BROADCAST))
1945 return;
1946 }
1947
1938 if (p->failure) {
1939 netlink_overrun(sk);
1940 return;
1941 }
1942
1943 sock_hold(sk);
1944 if (p->skb2 == NULL) {
1945 if (skb_shared(p->skb)) {

--- 8 unchanged lines hidden (view full) ---

1954 }
1955 }
1956 if (p->skb2 == NULL) {
1957 netlink_overrun(sk);
1958 /* Clone failed. Notify ALL listeners. */
1959 p->failure = 1;
1960 if (nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR)
1961 p->delivery_failure = 1;
1948 if (p->failure) {
1949 netlink_overrun(sk);
1950 return;
1951 }
1952
1953 sock_hold(sk);
1954 if (p->skb2 == NULL) {
1955 if (skb_shared(p->skb)) {

--- 8 unchanged lines hidden (view full) ---

1964 }
1965 }
1966 if (p->skb2 == NULL) {
1967 netlink_overrun(sk);
1968 /* Clone failed. Notify ALL listeners. */
1969 p->failure = 1;
1970 if (nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR)
1971 p->delivery_failure = 1;
1962 } else if (p->tx_filter && p->tx_filter(sk, p->skb2, p->tx_data)) {
1972 goto out;
1973 }
1974 if (p->tx_filter && p->tx_filter(sk, p->skb2, p->tx_data)) {
1963 kfree_skb(p->skb2);
1964 p->skb2 = NULL;
1975 kfree_skb(p->skb2);
1976 p->skb2 = NULL;
1965 } else if (sk_filter(sk, p->skb2)) {
1977 goto out;
1978 }
1979 if (sk_filter(sk, p->skb2)) {
1966 kfree_skb(p->skb2);
1967 p->skb2 = NULL;
1980 kfree_skb(p->skb2);
1981 p->skb2 = NULL;
1968 } else if ((val = netlink_broadcast_deliver(sk, p->skb2)) < 0) {
1982 goto out;
1983 }
1984 NETLINK_CB(p->skb2).nsid = peernet2id(sock_net(sk), p->net);
1985 NETLINK_CB(p->skb2).nsid_is_set = true;
1986 val = netlink_broadcast_deliver(sk, p->skb2);
1987 if (val < 0) {
1969 netlink_overrun(sk);
1970 if (nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR)
1971 p->delivery_failure = 1;
1972 } else {
1973 p->congested |= val;
1974 p->delivered = 1;
1975 p->skb2 = NULL;
1976 }
1988 netlink_overrun(sk);
1989 if (nlk->flags & NETLINK_F_BROADCAST_SEND_ERROR)
1990 p->delivery_failure = 1;
1991 } else {
1992 p->congested |= val;
1993 p->delivered = 1;
1994 p->skb2 = NULL;
1995 }
1996out:
1977 sock_put(sk);
1978}
1979
1980int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 portid,
1981 u32 group, gfp_t allocation,
1982 int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data),
1983 void *filter_data)
1984{

--- 212 unchanged lines hidden (view full) ---

2197 return -EINVAL;
2198 if (copy_from_user(&req, optval, sizeof(req)))
2199 return -EFAULT;
2200 err = netlink_set_ring(sk, &req, false,
2201 optname == NETLINK_TX_RING);
2202 break;
2203 }
2204#endif /* CONFIG_NETLINK_MMAP */
1997 sock_put(sk);
1998}
1999
2000int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 portid,
2001 u32 group, gfp_t allocation,
2002 int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data),
2003 void *filter_data)
2004{

--- 212 unchanged lines hidden (view full) ---

2217 return -EINVAL;
2218 if (copy_from_user(&req, optval, sizeof(req)))
2219 return -EFAULT;
2220 err = netlink_set_ring(sk, &req, false,
2221 optname == NETLINK_TX_RING);
2222 break;
2223 }
2224#endif /* CONFIG_NETLINK_MMAP */
2225 case NETLINK_LISTEN_ALL_NSID:
2226 if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_BROADCAST))
2227 return -EPERM;
2228
2229 if (val)
2230 nlk->flags |= NETLINK_F_LISTEN_ALL_NSID;
2231 else
2232 nlk->flags &= ~NETLINK_F_LISTEN_ALL_NSID;
2233 err = 0;
2234 break;
2205 default:
2206 err = -ENOPROTOOPT;
2207 }
2208 return err;
2209}
2210
2211static int netlink_getsockopt(struct socket *sock, int level, int optname,
2212 char __user *optval, int __user *optlen)

--- 50 unchanged lines hidden (view full) ---

2263static void netlink_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
2264{
2265 struct nl_pktinfo info;
2266
2267 info.group = NETLINK_CB(skb).dst_group;
2268 put_cmsg(msg, SOL_NETLINK, NETLINK_PKTINFO, sizeof(info), &info);
2269}
2270
2235 default:
2236 err = -ENOPROTOOPT;
2237 }
2238 return err;
2239}
2240
2241static int netlink_getsockopt(struct socket *sock, int level, int optname,
2242 char __user *optval, int __user *optlen)

--- 50 unchanged lines hidden (view full) ---

2293static void netlink_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
2294{
2295 struct nl_pktinfo info;
2296
2297 info.group = NETLINK_CB(skb).dst_group;
2298 put_cmsg(msg, SOL_NETLINK, NETLINK_PKTINFO, sizeof(info), &info);
2299}
2300
2301static void netlink_cmsg_listen_all_nsid(struct sock *sk, struct msghdr *msg,
2302 struct sk_buff *skb)
2303{
2304 if (!NETLINK_CB(skb).nsid_is_set)
2305 return;
2306
2307 put_cmsg(msg, SOL_NETLINK, NETLINK_LISTEN_ALL_NSID, sizeof(int),
2308 &NETLINK_CB(skb).nsid);
2309}
2310
2271static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
2272{
2273 struct sock *sk = sock->sk;
2274 struct netlink_sock *nlk = nlk_sk(sk);
2275 DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name);
2276 u32 dst_portid;
2277 u32 dst_group;
2278 struct sk_buff *skb;

--- 137 unchanged lines hidden (view full) ---

2416 addr->nl_pad = 0;
2417 addr->nl_pid = NETLINK_CB(skb).portid;
2418 addr->nl_groups = netlink_group_mask(NETLINK_CB(skb).dst_group);
2419 msg->msg_namelen = sizeof(*addr);
2420 }
2421
2422 if (nlk->flags & NETLINK_F_RECV_PKTINFO)
2423 netlink_cmsg_recv_pktinfo(msg, skb);
2311static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
2312{
2313 struct sock *sk = sock->sk;
2314 struct netlink_sock *nlk = nlk_sk(sk);
2315 DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name);
2316 u32 dst_portid;
2317 u32 dst_group;
2318 struct sk_buff *skb;

--- 137 unchanged lines hidden (view full) ---

2456 addr->nl_pad = 0;
2457 addr->nl_pid = NETLINK_CB(skb).portid;
2458 addr->nl_groups = netlink_group_mask(NETLINK_CB(skb).dst_group);
2459 msg->msg_namelen = sizeof(*addr);
2460 }
2461
2462 if (nlk->flags & NETLINK_F_RECV_PKTINFO)
2463 netlink_cmsg_recv_pktinfo(msg, skb);
2464 if (nlk->flags & NETLINK_F_LISTEN_ALL_NSID)
2465 netlink_cmsg_listen_all_nsid(sk, msg, skb);
2424
2425 memset(&scm, 0, sizeof(scm));
2426 scm.creds = *NETLINK_CREDS(skb);
2427 if (flags & MSG_TRUNC)
2428 copied = data_skb->len;
2429
2430 skb_free_datagram(sk, skb);
2431

--- 754 unchanged lines hidden ---
2466
2467 memset(&scm, 0, sizeof(scm));
2468 scm.creds = *NETLINK_CREDS(skb);
2469 if (flags & MSG_TRUNC)
2470 copied = data_skb->len;
2471
2472 skb_free_datagram(sk, skb);
2473

--- 754 unchanged lines hidden ---