summaryrefslogtreecommitdiffstats
path: root/net/key
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-08-15 23:23:23 -0400
committerDavid S. Miller <davem@davemloft.net>2017-08-15 23:23:23 -0400
commit463910e2dff580e4e9a678af710b4818b5189691 (patch)
tree21b4e53cdbec7e5a537ddfc1598fbf17deae57e2 /net/key
parent22cb7a3ac380ecaab6837670963813599b123a53 (diff)
parent510c8a899caf095cb13d09d203573deef15db2fe (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/key')
-rw-r--r--net/key/af_key.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c
index 10d7133e4fe9..a00d607e7224 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -228,7 +228,7 @@ static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2,
228#define BROADCAST_ONE 1 228#define BROADCAST_ONE 1
229#define BROADCAST_REGISTERED 2 229#define BROADCAST_REGISTERED 2
230#define BROADCAST_PROMISC_ONLY 4 230#define BROADCAST_PROMISC_ONLY 4
231static int pfkey_broadcast(struct sk_buff *skb, 231static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,
232 int broadcast_flags, struct sock *one_sk, 232 int broadcast_flags, struct sock *one_sk,
233 struct net *net) 233 struct net *net)
234{ 234{
@@ -278,7 +278,7 @@ static int pfkey_broadcast(struct sk_buff *skb,
278 rcu_read_unlock(); 278 rcu_read_unlock();
279 279
280 if (one_sk != NULL) 280 if (one_sk != NULL)
281 err = pfkey_broadcast_one(skb, &skb2, GFP_KERNEL, one_sk); 281 err = pfkey_broadcast_one(skb, &skb2, allocation, one_sk);
282 282
283 kfree_skb(skb2); 283 kfree_skb(skb2);
284 kfree_skb(skb); 284 kfree_skb(skb);
@@ -311,7 +311,7 @@ static int pfkey_do_dump(struct pfkey_sock *pfk)
311 hdr = (struct sadb_msg *) pfk->dump.skb->data; 311 hdr = (struct sadb_msg *) pfk->dump.skb->data;
312 hdr->sadb_msg_seq = 0; 312 hdr->sadb_msg_seq = 0;
313 hdr->sadb_msg_errno = rc; 313 hdr->sadb_msg_errno = rc;
314 pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, 314 pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE,
315 &pfk->sk, sock_net(&pfk->sk)); 315 &pfk->sk, sock_net(&pfk->sk));
316 pfk->dump.skb = NULL; 316 pfk->dump.skb = NULL;
317 } 317 }
@@ -355,7 +355,7 @@ static int pfkey_error(const struct sadb_msg *orig, int err, struct sock *sk)
355 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / 355 hdr->sadb_msg_len = (sizeof(struct sadb_msg) /
356 sizeof(uint64_t)); 356 sizeof(uint64_t));
357 357
358 pfkey_broadcast(skb, BROADCAST_ONE, sk, sock_net(sk)); 358 pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ONE, sk, sock_net(sk));
359 359
360 return 0; 360 return 0;
361} 361}
@@ -1389,7 +1389,7 @@ static int pfkey_getspi(struct sock *sk, struct sk_buff *skb, const struct sadb_
1389 1389
1390 xfrm_state_put(x); 1390 xfrm_state_put(x);
1391 1391
1392 pfkey_broadcast(resp_skb, BROADCAST_ONE, sk, net); 1392 pfkey_broadcast(resp_skb, GFP_KERNEL, BROADCAST_ONE, sk, net);
1393 1393
1394 return 0; 1394 return 0;
1395} 1395}
@@ -1476,7 +1476,7 @@ static int key_notify_sa(struct xfrm_state *x, const struct km_event *c)
1476 hdr->sadb_msg_seq = c->seq; 1476 hdr->sadb_msg_seq = c->seq;
1477 hdr->sadb_msg_pid = c->portid; 1477 hdr->sadb_msg_pid = c->portid;
1478 1478
1479 pfkey_broadcast(skb, BROADCAST_ALL, NULL, xs_net(x)); 1479 pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xs_net(x));
1480 1480
1481 return 0; 1481 return 0;
1482} 1482}
@@ -1589,7 +1589,7 @@ static int pfkey_get(struct sock *sk, struct sk_buff *skb, const struct sadb_msg
1589 out_hdr->sadb_msg_reserved = 0; 1589 out_hdr->sadb_msg_reserved = 0;
1590 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; 1590 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1591 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; 1591 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1592 pfkey_broadcast(out_skb, BROADCAST_ONE, sk, sock_net(sk)); 1592 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk, sock_net(sk));
1593 1593
1594 return 0; 1594 return 0;
1595} 1595}
@@ -1694,8 +1694,8 @@ static int pfkey_register(struct sock *sk, struct sk_buff *skb, const struct sad
1694 return -ENOBUFS; 1694 return -ENOBUFS;
1695 } 1695 }
1696 1696
1697 pfkey_broadcast(supp_skb, BROADCAST_REGISTERED, sk, sock_net(sk)); 1697 pfkey_broadcast(supp_skb, GFP_KERNEL, BROADCAST_REGISTERED, sk,
1698 1698 sock_net(sk));
1699 return 0; 1699 return 0;
1700} 1700}
1701 1701
@@ -1712,7 +1712,8 @@ static int unicast_flush_resp(struct sock *sk, const struct sadb_msg *ihdr)
1712 hdr->sadb_msg_errno = (uint8_t) 0; 1712 hdr->sadb_msg_errno = (uint8_t) 0;
1713 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); 1713 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
1714 1714
1715 return pfkey_broadcast(skb, BROADCAST_ONE, sk, sock_net(sk)); 1715 return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ONE, sk,
1716 sock_net(sk));
1716} 1717}
1717 1718
1718static int key_notify_sa_flush(const struct km_event *c) 1719static int key_notify_sa_flush(const struct km_event *c)
@@ -1733,7 +1734,7 @@ static int key_notify_sa_flush(const struct km_event *c)
1733 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); 1734 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
1734 hdr->sadb_msg_reserved = 0; 1735 hdr->sadb_msg_reserved = 0;
1735 1736
1736 pfkey_broadcast(skb, BROADCAST_ALL, NULL, c->net); 1737 pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, c->net);
1737 1738
1738 return 0; 1739 return 0;
1739} 1740}
@@ -1790,7 +1791,7 @@ static int dump_sa(struct xfrm_state *x, int count, void *ptr)
1790 out_hdr->sadb_msg_pid = pfk->dump.msg_portid; 1791 out_hdr->sadb_msg_pid = pfk->dump.msg_portid;
1791 1792
1792 if (pfk->dump.skb) 1793 if (pfk->dump.skb)
1793 pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, 1794 pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE,
1794 &pfk->sk, sock_net(&pfk->sk)); 1795 &pfk->sk, sock_net(&pfk->sk));
1795 pfk->dump.skb = out_skb; 1796 pfk->dump.skb = out_skb;
1796 1797
@@ -1878,7 +1879,7 @@ static int pfkey_promisc(struct sock *sk, struct sk_buff *skb, const struct sadb
1878 new_hdr->sadb_msg_errno = 0; 1879 new_hdr->sadb_msg_errno = 0;
1879 } 1880 }
1880 1881
1881 pfkey_broadcast(skb, BROADCAST_ALL, NULL, sock_net(sk)); 1882 pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ALL, NULL, sock_net(sk));
1882 return 0; 1883 return 0;
1883} 1884}
1884 1885
@@ -2206,7 +2207,7 @@ static int key_notify_policy(struct xfrm_policy *xp, int dir, const struct km_ev
2206 out_hdr->sadb_msg_errno = 0; 2207 out_hdr->sadb_msg_errno = 0;
2207 out_hdr->sadb_msg_seq = c->seq; 2208 out_hdr->sadb_msg_seq = c->seq;
2208 out_hdr->sadb_msg_pid = c->portid; 2209 out_hdr->sadb_msg_pid = c->portid;
2209 pfkey_broadcast(out_skb, BROADCAST_ALL, NULL, xp_net(xp)); 2210 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xp_net(xp));
2210 return 0; 2211 return 0;
2211 2212
2212} 2213}
@@ -2424,7 +2425,7 @@ static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, const struc
2424 out_hdr->sadb_msg_errno = 0; 2425 out_hdr->sadb_msg_errno = 0;
2425 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; 2426 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
2426 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; 2427 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
2427 pfkey_broadcast(out_skb, BROADCAST_ONE, sk, xp_net(xp)); 2428 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk, xp_net(xp));
2428 err = 0; 2429 err = 0;
2429 2430
2430out: 2431out:
@@ -2678,7 +2679,7 @@ static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr)
2678 out_hdr->sadb_msg_pid = pfk->dump.msg_portid; 2679 out_hdr->sadb_msg_pid = pfk->dump.msg_portid;
2679 2680
2680 if (pfk->dump.skb) 2681 if (pfk->dump.skb)
2681 pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, 2682 pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE,
2682 &pfk->sk, sock_net(&pfk->sk)); 2683 &pfk->sk, sock_net(&pfk->sk));
2683 pfk->dump.skb = out_skb; 2684 pfk->dump.skb = out_skb;
2684 2685
@@ -2735,7 +2736,7 @@ static int key_notify_policy_flush(const struct km_event *c)
2735 hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC; 2736 hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC;
2736 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); 2737 hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
2737 hdr->sadb_msg_reserved = 0; 2738 hdr->sadb_msg_reserved = 0;
2738 pfkey_broadcast(skb_out, BROADCAST_ALL, NULL, c->net); 2739 pfkey_broadcast(skb_out, GFP_ATOMIC, BROADCAST_ALL, NULL, c->net);
2739 return 0; 2740 return 0;
2740 2741
2741} 2742}
@@ -2797,7 +2798,7 @@ static int pfkey_process(struct sock *sk, struct sk_buff *skb, const struct sadb
2797 void *ext_hdrs[SADB_EXT_MAX]; 2798 void *ext_hdrs[SADB_EXT_MAX];
2798 int err; 2799 int err;
2799 2800
2800 pfkey_broadcast(skb_clone(skb, GFP_KERNEL), 2801 pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL,
2801 BROADCAST_PROMISC_ONLY, NULL, sock_net(sk)); 2802 BROADCAST_PROMISC_ONLY, NULL, sock_net(sk));
2802 2803
2803 memset(ext_hdrs, 0, sizeof(ext_hdrs)); 2804 memset(ext_hdrs, 0, sizeof(ext_hdrs));
@@ -3018,7 +3019,8 @@ static int key_notify_sa_expire(struct xfrm_state *x, const struct km_event *c)
3018 out_hdr->sadb_msg_seq = 0; 3019 out_hdr->sadb_msg_seq = 0;
3019 out_hdr->sadb_msg_pid = 0; 3020 out_hdr->sadb_msg_pid = 0;
3020 3021
3021 pfkey_broadcast(out_skb, BROADCAST_REGISTERED, NULL, xs_net(x)); 3022 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL,
3023 xs_net(x));
3022 return 0; 3024 return 0;
3023} 3025}
3024 3026
@@ -3206,7 +3208,8 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
3206 xfrm_ctx->ctx_len); 3208 xfrm_ctx->ctx_len);
3207 } 3209 }
3208 3210
3209 return pfkey_broadcast(skb, BROADCAST_REGISTERED, NULL, xs_net(x)); 3211 return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL,
3212 xs_net(x));
3210} 3213}
3211 3214
3212static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt, 3215static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt,
@@ -3402,7 +3405,8 @@ static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr,
3402 n_port->sadb_x_nat_t_port_port = sport; 3405 n_port->sadb_x_nat_t_port_port = sport;
3403 n_port->sadb_x_nat_t_port_reserved = 0; 3406 n_port->sadb_x_nat_t_port_reserved = 0;
3404 3407
3405 return pfkey_broadcast(skb, BROADCAST_REGISTERED, NULL, xs_net(x)); 3408 return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL,
3409 xs_net(x));
3406} 3410}
3407 3411
3408#ifdef CONFIG_NET_KEY_MIGRATE 3412#ifdef CONFIG_NET_KEY_MIGRATE
@@ -3593,7 +3597,7 @@ static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
3593 } 3597 }
3594 3598
3595 /* broadcast migrate message to sockets */ 3599 /* broadcast migrate message to sockets */
3596 pfkey_broadcast(skb, BROADCAST_ALL, NULL, &init_net); 3600 pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, &init_net);
3597 3601
3598 return 0; 3602 return 0;
3599 3603