xfrm: add UDP encapsulation port in migrate message
authorAntony Antony <antony@phenome.org>
Tue, 6 Jun 2017 10:12:14 +0000 (12:12 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Wed, 7 Jun 2017 06:35:54 +0000 (08:35 +0200)
Add XFRMA_ENCAP, UDP encapsulation port, to km_migrate announcement
to userland. Only add if XFRMA_ENCAP was in user migrate request.

Signed-off-by: Antony Antony <antony@phenome.org>
Reviewed-by: Richard Guy Briggs <rgb@tricolour.ca>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
include/net/xfrm.h
net/key/af_key.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
net/xfrm/xfrm_user.c

index 1cc7172..34420d9 100644 (file)
@@ -631,7 +631,8 @@ struct xfrm_mgr {
                                           u8 dir, u8 type,
                                           const struct xfrm_migrate *m,
                                           int num_bundles,
-                                          const struct xfrm_kmaddress *k);
+                                          const struct xfrm_kmaddress *k,
+                                          const struct xfrm_encap_tmpl *encap);
        bool                    (*is_alive)(const struct km_event *c);
 };
 
@@ -1685,7 +1686,8 @@ int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
 #ifdef CONFIG_XFRM_MIGRATE
 int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
               const struct xfrm_migrate *m, int num_bundles,
-              const struct xfrm_kmaddress *k);
+              const struct xfrm_kmaddress *k,
+              const struct xfrm_encap_tmpl *encap);
 struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *net);
 struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x,
                                      struct xfrm_migrate *m,
index 3b130cb..d539bb7 100644 (file)
@@ -3508,7 +3508,8 @@ static int set_ipsecrequest(struct sk_buff *skb,
 #ifdef CONFIG_NET_KEY_MIGRATE
 static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
                              const struct xfrm_migrate *m, int num_bundles,
-                             const struct xfrm_kmaddress *k)
+                             const struct xfrm_kmaddress *k,
+                             const struct xfrm_encap_tmpl *encap)
 {
        int i;
        int sasize_sel;
@@ -3618,7 +3619,8 @@ err:
 #else
 static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
                              const struct xfrm_migrate *m, int num_bundles,
-                             const struct xfrm_kmaddress *k)
+                             const struct xfrm_kmaddress *k,
+                             const struct xfrm_encap_tmpl *encap)
 {
        return -ENOPROTOOPT;
 }
index d47f055..e614189 100644 (file)
@@ -3384,7 +3384,7 @@ int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
        }
 
        /* Stage 5 - announce */
-       km_migrate(sel, dir, type, m, num_migrate, k);
+       km_migrate(sel, dir, type, m, num_migrate, k, encap);
 
        xfrm_pol_put(pol);
 
index b76e673..f2421c6 100644 (file)
@@ -1964,7 +1964,8 @@ EXPORT_SYMBOL(km_policy_expired);
 #ifdef CONFIG_XFRM_MIGRATE
 int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
               const struct xfrm_migrate *m, int num_migrate,
-              const struct xfrm_kmaddress *k)
+              const struct xfrm_kmaddress *k,
+              const struct xfrm_encap_tmpl *encap)
 {
        int err = -EINVAL;
        int ret;
@@ -1973,7 +1974,8 @@ int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
        rcu_read_lock();
        list_for_each_entry_rcu(km, &xfrm_km_list, list) {
                if (km->migrate) {
-                       ret = km->migrate(sel, dir, type, m, num_migrate, k);
+                       ret = km->migrate(sel, dir, type, m, num_migrate, k,
+                                         encap);
                        if (!ret)
                                err = ret;
                }
index fb98892..6197c72 100644 (file)
@@ -2314,17 +2314,20 @@ static int copy_to_user_kmaddress(const struct xfrm_kmaddress *k, struct sk_buff
        return nla_put(skb, XFRMA_KMADDRESS, sizeof(uk), &uk);
 }
 
-static inline size_t xfrm_migrate_msgsize(int num_migrate, int with_kma)
+static inline size_t xfrm_migrate_msgsize(int num_migrate, int with_kma,
+                                         int with_encp)
 {
        return NLMSG_ALIGN(sizeof(struct xfrm_userpolicy_id))
              + (with_kma ? nla_total_size(sizeof(struct xfrm_kmaddress)) : 0)
+             + (with_encp ? nla_total_size(sizeof(struct xfrm_encap_tmpl)) : 0)
              + nla_total_size(sizeof(struct xfrm_user_migrate) * num_migrate)
              + userpolicy_type_attrsize();
 }
 
 static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m,
                         int num_migrate, const struct xfrm_kmaddress *k,
-                        const struct xfrm_selector *sel, u8 dir, u8 type)
+                        const struct xfrm_selector *sel,
+                        const struct xfrm_encap_tmpl *encap, u8 dir, u8 type)
 {
        const struct xfrm_migrate *mp;
        struct xfrm_userpolicy_id *pol_id;
@@ -2346,6 +2349,11 @@ static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m,
                if (err)
                        goto out_cancel;
        }
+       if (encap) {
+               err = nla_put(skb, XFRMA_ENCAP, sizeof(*encap), encap);
+               if (err)
+                       goto out_cancel;
+       }
        err = copy_to_user_policy_type(type, skb);
        if (err)
                goto out_cancel;
@@ -2365,17 +2373,19 @@ out_cancel:
 
 static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
                             const struct xfrm_migrate *m, int num_migrate,
-                            const struct xfrm_kmaddress *k)
+                            const struct xfrm_kmaddress *k,
+                            const struct xfrm_encap_tmpl *encap)
 {
        struct net *net = &init_net;
        struct sk_buff *skb;
 
-       skb = nlmsg_new(xfrm_migrate_msgsize(num_migrate, !!k), GFP_ATOMIC);
+       skb = nlmsg_new(xfrm_migrate_msgsize(num_migrate, !!k, !!encap),
+                       GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
 
        /* build migrate */
-       if (build_migrate(skb, m, num_migrate, k, sel, dir, type) < 0)
+       if (build_migrate(skb, m, num_migrate, k, sel, encap, dir, type) < 0)
                BUG();
 
        return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_MIGRATE);
@@ -2383,7 +2393,8 @@ static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
 #else
 static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
                             const struct xfrm_migrate *m, int num_migrate,
-                            const struct xfrm_kmaddress *k)
+                            const struct xfrm_kmaddress *k,
+                            const struct xfrm_encap_tmpl *encap)
 {
        return -ENOPROTOOPT;
 }