netns xfrm: finding policy in netns
Add netns parameter to xfrm_policy_bysel_ctx(), xfrm_policy_byidx(). Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
33ffbbd52c
commit
8d1211a6aa
@@ -1439,11 +1439,11 @@ extern int xfrm_policy_walk(struct xfrm_policy_walk *walk,
|
|||||||
int (*func)(struct xfrm_policy *, int, int, void*), void *);
|
int (*func)(struct xfrm_policy *, int, int, void*), void *);
|
||||||
extern void xfrm_policy_walk_done(struct xfrm_policy_walk *walk);
|
extern void xfrm_policy_walk_done(struct xfrm_policy_walk *walk);
|
||||||
int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
|
int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
|
||||||
struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
|
struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u8 type, int dir,
|
||||||
struct xfrm_selector *sel,
|
struct xfrm_selector *sel,
|
||||||
struct xfrm_sec_ctx *ctx, int delete,
|
struct xfrm_sec_ctx *ctx, int delete,
|
||||||
int *err);
|
int *err);
|
||||||
struct xfrm_policy *xfrm_policy_byid(u8, int dir, u32 id, int delete, int *err);
|
struct xfrm_policy *xfrm_policy_byid(struct net *net, u8, int dir, u32 id, int delete, int *err);
|
||||||
int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info);
|
int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info);
|
||||||
u32 xfrm_get_acqseq(void);
|
u32 xfrm_get_acqseq(void);
|
||||||
extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
|
extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
|
||||||
|
@@ -2324,7 +2324,7 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
xp = xfrm_policy_bysel_ctx(XFRM_POLICY_TYPE_MAIN,
|
xp = xfrm_policy_bysel_ctx(&init_net, XFRM_POLICY_TYPE_MAIN,
|
||||||
pol->sadb_x_policy_dir - 1, &sel, pol_ctx,
|
pol->sadb_x_policy_dir - 1, &sel, pol_ctx,
|
||||||
1, &err);
|
1, &err);
|
||||||
security_xfrm_policy_free(pol_ctx);
|
security_xfrm_policy_free(pol_ctx);
|
||||||
@@ -2571,8 +2571,8 @@ static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
delete = (hdr->sadb_msg_type == SADB_X_SPDDELETE2);
|
delete = (hdr->sadb_msg_type == SADB_X_SPDDELETE2);
|
||||||
xp = xfrm_policy_byid(XFRM_POLICY_TYPE_MAIN, dir, pol->sadb_x_policy_id,
|
xp = xfrm_policy_byid(&init_net, XFRM_POLICY_TYPE_MAIN, dir,
|
||||||
delete, &err);
|
pol->sadb_x_policy_id, delete, &err);
|
||||||
if (xp == NULL)
|
if (xp == NULL)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
@@ -642,7 +642,7 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(xfrm_policy_insert);
|
EXPORT_SYMBOL(xfrm_policy_insert);
|
||||||
|
|
||||||
struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
|
struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u8 type, int dir,
|
||||||
struct xfrm_selector *sel,
|
struct xfrm_selector *sel,
|
||||||
struct xfrm_sec_ctx *ctx, int delete,
|
struct xfrm_sec_ctx *ctx, int delete,
|
||||||
int *err)
|
int *err)
|
||||||
@@ -653,7 +653,7 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
|
|||||||
|
|
||||||
*err = 0;
|
*err = 0;
|
||||||
write_lock_bh(&xfrm_policy_lock);
|
write_lock_bh(&xfrm_policy_lock);
|
||||||
chain = policy_hash_bysel(&init_net, sel, sel->family, dir);
|
chain = policy_hash_bysel(net, sel, sel->family, dir);
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
hlist_for_each_entry(pol, entry, chain, bydst) {
|
hlist_for_each_entry(pol, entry, chain, bydst) {
|
||||||
if (pol->type == type &&
|
if (pol->type == type &&
|
||||||
@@ -670,7 +670,7 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
|
|||||||
hlist_del(&pol->bydst);
|
hlist_del(&pol->bydst);
|
||||||
hlist_del(&pol->byidx);
|
hlist_del(&pol->byidx);
|
||||||
list_del(&pol->walk.all);
|
list_del(&pol->walk.all);
|
||||||
init_net.xfrm.policy_count[dir]--;
|
net->xfrm.policy_count[dir]--;
|
||||||
}
|
}
|
||||||
ret = pol;
|
ret = pol;
|
||||||
break;
|
break;
|
||||||
@@ -686,8 +686,8 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(xfrm_policy_bysel_ctx);
|
EXPORT_SYMBOL(xfrm_policy_bysel_ctx);
|
||||||
|
|
||||||
struct xfrm_policy *xfrm_policy_byid(u8 type, int dir, u32 id, int delete,
|
struct xfrm_policy *xfrm_policy_byid(struct net *net, u8 type, int dir, u32 id,
|
||||||
int *err)
|
int delete, int *err)
|
||||||
{
|
{
|
||||||
struct xfrm_policy *pol, *ret;
|
struct xfrm_policy *pol, *ret;
|
||||||
struct hlist_head *chain;
|
struct hlist_head *chain;
|
||||||
@@ -699,7 +699,7 @@ struct xfrm_policy *xfrm_policy_byid(u8 type, int dir, u32 id, int delete,
|
|||||||
|
|
||||||
*err = 0;
|
*err = 0;
|
||||||
write_lock_bh(&xfrm_policy_lock);
|
write_lock_bh(&xfrm_policy_lock);
|
||||||
chain = init_net.xfrm.policy_byidx + idx_hash(&init_net, id);
|
chain = net->xfrm.policy_byidx + idx_hash(net, id);
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
hlist_for_each_entry(pol, entry, chain, byidx) {
|
hlist_for_each_entry(pol, entry, chain, byidx) {
|
||||||
if (pol->type == type && pol->index == id) {
|
if (pol->type == type && pol->index == id) {
|
||||||
@@ -714,7 +714,7 @@ struct xfrm_policy *xfrm_policy_byid(u8 type, int dir, u32 id, int delete,
|
|||||||
hlist_del(&pol->bydst);
|
hlist_del(&pol->bydst);
|
||||||
hlist_del(&pol->byidx);
|
hlist_del(&pol->byidx);
|
||||||
list_del(&pol->walk.all);
|
list_del(&pol->walk.all);
|
||||||
init_net.xfrm.policy_count[dir]--;
|
net->xfrm.policy_count[dir]--;
|
||||||
}
|
}
|
||||||
ret = pol;
|
ret = pol;
|
||||||
break;
|
break;
|
||||||
|
@@ -1330,7 +1330,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (p->index)
|
if (p->index)
|
||||||
xp = xfrm_policy_byid(type, p->dir, p->index, delete, &err);
|
xp = xfrm_policy_byid(&init_net, type, p->dir, p->index, delete, &err);
|
||||||
else {
|
else {
|
||||||
struct nlattr *rt = attrs[XFRMA_SEC_CTX];
|
struct nlattr *rt = attrs[XFRMA_SEC_CTX];
|
||||||
struct xfrm_sec_ctx *ctx;
|
struct xfrm_sec_ctx *ctx;
|
||||||
@@ -1347,7 +1347,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, ctx,
|
xp = xfrm_policy_bysel_ctx(&init_net, type, p->dir, &p->sel, ctx,
|
||||||
delete, &err);
|
delete, &err);
|
||||||
security_xfrm_policy_free(ctx);
|
security_xfrm_policy_free(ctx);
|
||||||
}
|
}
|
||||||
@@ -1571,7 +1571,7 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (p->index)
|
if (p->index)
|
||||||
xp = xfrm_policy_byid(type, p->dir, p->index, 0, &err);
|
xp = xfrm_policy_byid(&init_net, type, p->dir, p->index, 0, &err);
|
||||||
else {
|
else {
|
||||||
struct nlattr *rt = attrs[XFRMA_SEC_CTX];
|
struct nlattr *rt = attrs[XFRMA_SEC_CTX];
|
||||||
struct xfrm_sec_ctx *ctx;
|
struct xfrm_sec_ctx *ctx;
|
||||||
@@ -1588,7 +1588,7 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, ctx, 0, &err);
|
xp = xfrm_policy_bysel_ctx(&init_net, type, p->dir, &p->sel, ctx, 0, &err);
|
||||||
security_xfrm_policy_free(ctx);
|
security_xfrm_policy_free(ctx);
|
||||||
}
|
}
|
||||||
if (xp == NULL)
|
if (xp == NULL)
|
||||||
|
Reference in New Issue
Block a user