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: Antony Antony <antony@phenome.org> Reviewed-by: Richard Guy Briggs <rgb@tricolour.ca> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
4ab47d47af
commit
8bafd73093
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user