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 --- |