diff options
Diffstat (limited to 'net/key')
-rw-r--r-- | net/key/af_key.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c index 1a04c1329362..e1c69d024197 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -3059,6 +3059,24 @@ static u32 get_acqseq(void) | |||
3059 | return res; | 3059 | return res; |
3060 | } | 3060 | } |
3061 | 3061 | ||
3062 | static bool pfkey_is_alive(const struct km_event *c) | ||
3063 | { | ||
3064 | struct netns_pfkey *net_pfkey = net_generic(c->net, pfkey_net_id); | ||
3065 | struct sock *sk; | ||
3066 | bool is_alive = false; | ||
3067 | |||
3068 | rcu_read_lock(); | ||
3069 | sk_for_each_rcu(sk, &net_pfkey->table) { | ||
3070 | if (pfkey_sk(sk)->registered) { | ||
3071 | is_alive = true; | ||
3072 | break; | ||
3073 | } | ||
3074 | } | ||
3075 | rcu_read_unlock(); | ||
3076 | |||
3077 | return is_alive; | ||
3078 | } | ||
3079 | |||
3062 | static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *xp) | 3080 | static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *xp) |
3063 | { | 3081 | { |
3064 | struct sk_buff *skb; | 3082 | struct sk_buff *skb; |
@@ -3784,6 +3802,7 @@ static struct xfrm_mgr pfkeyv2_mgr = | |||
3784 | .new_mapping = pfkey_send_new_mapping, | 3802 | .new_mapping = pfkey_send_new_mapping, |
3785 | .notify_policy = pfkey_send_policy_notify, | 3803 | .notify_policy = pfkey_send_policy_notify, |
3786 | .migrate = pfkey_send_migrate, | 3804 | .migrate = pfkey_send_migrate, |
3805 | .is_alive = pfkey_is_alive, | ||
3787 | }; | 3806 | }; |
3788 | 3807 | ||
3789 | static int __net_init pfkey_net_init(struct net *net) | 3808 | static int __net_init pfkey_net_init(struct net *net) |