Commit 8bafd730 authored by Antony Antony's avatar Antony Antony Committed by Steffen Klassert

xfrm: add UDP encapsulation port in migrate message

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: default avatarAntony Antony <antony@phenome.org>
Reviewed-by: default avatarRichard Guy Briggs <rgb@tricolour.ca>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 4ab47d47
...@@ -631,7 +631,8 @@ struct xfrm_mgr { ...@@ -631,7 +631,8 @@ struct xfrm_mgr {
u8 dir, u8 type, u8 dir, u8 type,
const struct xfrm_migrate *m, const struct xfrm_migrate *m,
int num_bundles, 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); 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); ...@@ -1685,7 +1686,8 @@ int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
#ifdef CONFIG_XFRM_MIGRATE #ifdef CONFIG_XFRM_MIGRATE
int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
const struct xfrm_migrate *m, int num_bundles, 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_migrate_state_find(struct xfrm_migrate *m, struct net *net);
struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x, struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x,
struct xfrm_migrate *m, struct xfrm_migrate *m,
......
...@@ -3508,7 +3508,8 @@ static int set_ipsecrequest(struct sk_buff *skb, ...@@ -3508,7 +3508,8 @@ static int set_ipsecrequest(struct sk_buff *skb,
#ifdef CONFIG_NET_KEY_MIGRATE #ifdef CONFIG_NET_KEY_MIGRATE
static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, 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_migrate *m, int num_bundles,
const struct xfrm_kmaddress *k) const struct xfrm_kmaddress *k,
const struct xfrm_encap_tmpl *encap)
{ {
int i; int i;
int sasize_sel; int sasize_sel;
...@@ -3618,7 +3619,8 @@ static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, ...@@ -3618,7 +3619,8 @@ static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
#else #else
static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, 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_migrate *m, int num_bundles,
const struct xfrm_kmaddress *k) const struct xfrm_kmaddress *k,
const struct xfrm_encap_tmpl *encap)
{ {
return -ENOPROTOOPT; return -ENOPROTOOPT;
} }
......
...@@ -3384,7 +3384,7 @@ int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, ...@@ -3384,7 +3384,7 @@ int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
} }
/* Stage 5 - announce */ /* 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); xfrm_pol_put(pol);
......
...@@ -1964,7 +1964,8 @@ EXPORT_SYMBOL(km_policy_expired); ...@@ -1964,7 +1964,8 @@ EXPORT_SYMBOL(km_policy_expired);
#ifdef CONFIG_XFRM_MIGRATE #ifdef CONFIG_XFRM_MIGRATE
int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
const struct xfrm_migrate *m, int num_migrate, 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 err = -EINVAL;
int ret; int ret;
...@@ -1973,7 +1974,8 @@ int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, ...@@ -1973,7 +1974,8 @@ int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(km, &xfrm_km_list, list) { list_for_each_entry_rcu(km, &xfrm_km_list, list) {
if (km->migrate) { 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) if (!ret)
err = ret; err = ret;
} }
......
...@@ -2314,17 +2314,20 @@ static int copy_to_user_kmaddress(const struct xfrm_kmaddress *k, struct sk_buff ...@@ -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); 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)) return NLMSG_ALIGN(sizeof(struct xfrm_userpolicy_id))
+ (with_kma ? nla_total_size(sizeof(struct xfrm_kmaddress)) : 0) + (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) + nla_total_size(sizeof(struct xfrm_user_migrate) * num_migrate)
+ userpolicy_type_attrsize(); + userpolicy_type_attrsize();
} }
static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m, static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m,
int num_migrate, const struct xfrm_kmaddress *k, 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; const struct xfrm_migrate *mp;
struct xfrm_userpolicy_id *pol_id; struct xfrm_userpolicy_id *pol_id;
...@@ -2346,6 +2349,11 @@ static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m, ...@@ -2346,6 +2349,11 @@ static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m,
if (err) if (err)
goto out_cancel; 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); err = copy_to_user_policy_type(type, skb);
if (err) if (err)
goto out_cancel; goto out_cancel;
...@@ -2365,17 +2373,19 @@ static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m, ...@@ -2365,17 +2373,19 @@ static int build_migrate(struct sk_buff *skb, const struct xfrm_migrate *m,
static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, 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_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 net *net = &init_net;
struct sk_buff *skb; 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) if (skb == NULL)
return -ENOMEM; return -ENOMEM;
/* build migrate */ /* 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(); BUG();
return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_MIGRATE); 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, ...@@ -2383,7 +2393,8 @@ static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
#else #else
static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, 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_migrate *m, int num_migrate,
const struct xfrm_kmaddress *k) const struct xfrm_kmaddress *k,
const struct xfrm_encap_tmpl *encap)
{ {
return -ENOPROTOOPT; return -ENOPROTOOPT;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment