mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
commit
05ba712d7e
40 changed files with 251 additions and 143 deletions
|
|
@ -469,16 +469,16 @@ static inline int xfrm_byidx_should_resize(struct net *net, int total)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void xfrm_spd_getinfo(struct xfrmk_spdinfo *si)
|
||||
void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si)
|
||||
{
|
||||
read_lock_bh(&xfrm_policy_lock);
|
||||
si->incnt = init_net.xfrm.policy_count[XFRM_POLICY_IN];
|
||||
si->outcnt = init_net.xfrm.policy_count[XFRM_POLICY_OUT];
|
||||
si->fwdcnt = init_net.xfrm.policy_count[XFRM_POLICY_FWD];
|
||||
si->inscnt = init_net.xfrm.policy_count[XFRM_POLICY_IN+XFRM_POLICY_MAX];
|
||||
si->outscnt = init_net.xfrm.policy_count[XFRM_POLICY_OUT+XFRM_POLICY_MAX];
|
||||
si->fwdscnt = init_net.xfrm.policy_count[XFRM_POLICY_FWD+XFRM_POLICY_MAX];
|
||||
si->spdhcnt = init_net.xfrm.policy_idx_hmask;
|
||||
si->incnt = net->xfrm.policy_count[XFRM_POLICY_IN];
|
||||
si->outcnt = net->xfrm.policy_count[XFRM_POLICY_OUT];
|
||||
si->fwdcnt = net->xfrm.policy_count[XFRM_POLICY_FWD];
|
||||
si->inscnt = net->xfrm.policy_count[XFRM_POLICY_IN+XFRM_POLICY_MAX];
|
||||
si->outscnt = net->xfrm.policy_count[XFRM_POLICY_OUT+XFRM_POLICY_MAX];
|
||||
si->fwdscnt = net->xfrm.policy_count[XFRM_POLICY_FWD+XFRM_POLICY_MAX];
|
||||
si->spdhcnt = net->xfrm.policy_idx_hmask;
|
||||
si->spdhmcnt = xfrm_policy_hashmax;
|
||||
read_unlock_bh(&xfrm_policy_lock);
|
||||
}
|
||||
|
|
@ -1309,15 +1309,28 @@ static inline int xfrm_get_tos(struct flowi *fl, int family)
|
|||
return tos;
|
||||
}
|
||||
|
||||
static inline struct xfrm_dst *xfrm_alloc_dst(int family)
|
||||
static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
|
||||
{
|
||||
struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family);
|
||||
struct dst_ops *dst_ops;
|
||||
struct xfrm_dst *xdst;
|
||||
|
||||
if (!afinfo)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
xdst = dst_alloc(afinfo->dst_ops) ?: ERR_PTR(-ENOBUFS);
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
dst_ops = &net->xfrm.xfrm4_dst_ops;
|
||||
break;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
case AF_INET6:
|
||||
dst_ops = &net->xfrm.xfrm6_dst_ops;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
xdst = dst_alloc(dst_ops) ?: ERR_PTR(-ENOBUFS);
|
||||
|
||||
xfrm_policy_put_afinfo(afinfo);
|
||||
|
||||
|
|
@ -1366,6 +1379,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
|||
struct flowi *fl,
|
||||
struct dst_entry *dst)
|
||||
{
|
||||
struct net *net = xp_net(policy);
|
||||
unsigned long now = jiffies;
|
||||
struct net_device *dev;
|
||||
struct dst_entry *dst_prev = NULL;
|
||||
|
|
@ -1389,7 +1403,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
|||
dst_hold(dst);
|
||||
|
||||
for (; i < nx; i++) {
|
||||
struct xfrm_dst *xdst = xfrm_alloc_dst(family);
|
||||
struct xfrm_dst *xdst = xfrm_alloc_dst(net, family);
|
||||
struct dst_entry *dst1 = &xdst->u.dst;
|
||||
|
||||
err = PTR_ERR(xdst);
|
||||
|
|
@ -2279,6 +2293,7 @@ EXPORT_SYMBOL(xfrm_bundle_ok);
|
|||
|
||||
int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
|
||||
{
|
||||
struct net *net;
|
||||
int err = 0;
|
||||
if (unlikely(afinfo == NULL))
|
||||
return -EINVAL;
|
||||
|
|
@ -2302,6 +2317,27 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
|
|||
xfrm_policy_afinfo[afinfo->family] = afinfo;
|
||||
}
|
||||
write_unlock_bh(&xfrm_policy_afinfo_lock);
|
||||
|
||||
rtnl_lock();
|
||||
for_each_net(net) {
|
||||
struct dst_ops *xfrm_dst_ops;
|
||||
|
||||
switch (afinfo->family) {
|
||||
case AF_INET:
|
||||
xfrm_dst_ops = &net->xfrm.xfrm4_dst_ops;
|
||||
break;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
case AF_INET6:
|
||||
xfrm_dst_ops = &net->xfrm.xfrm6_dst_ops;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
*xfrm_dst_ops = *afinfo->dst_ops;
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_register_afinfo);
|
||||
|
|
@ -2332,6 +2368,22 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo)
|
|||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_unregister_afinfo);
|
||||
|
||||
static void __net_init xfrm_dst_ops_init(struct net *net)
|
||||
{
|
||||
struct xfrm_policy_afinfo *afinfo;
|
||||
|
||||
read_lock_bh(&xfrm_policy_afinfo_lock);
|
||||
afinfo = xfrm_policy_afinfo[AF_INET];
|
||||
if (afinfo)
|
||||
net->xfrm.xfrm4_dst_ops = *afinfo->dst_ops;
|
||||
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||
afinfo = xfrm_policy_afinfo[AF_INET6];
|
||||
if (afinfo)
|
||||
net->xfrm.xfrm6_dst_ops = *afinfo->dst_ops;
|
||||
#endif
|
||||
read_unlock_bh(&xfrm_policy_afinfo_lock);
|
||||
}
|
||||
|
||||
static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family)
|
||||
{
|
||||
struct xfrm_policy_afinfo *afinfo;
|
||||
|
|
@ -2494,6 +2546,7 @@ static int __net_init xfrm_net_init(struct net *net)
|
|||
rv = xfrm_policy_init(net);
|
||||
if (rv < 0)
|
||||
goto out_policy;
|
||||
xfrm_dst_ops_init(net);
|
||||
rv = xfrm_sysctl_init(net);
|
||||
if (rv < 0)
|
||||
goto out_sysctl;
|
||||
|
|
|
|||
|
|
@ -641,11 +641,11 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL(xfrm_state_flush);
|
||||
|
||||
void xfrm_sad_getinfo(struct xfrmk_sadinfo *si)
|
||||
void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si)
|
||||
{
|
||||
spin_lock_bh(&xfrm_state_lock);
|
||||
si->sadcnt = init_net.xfrm.state_num;
|
||||
si->sadhcnt = init_net.xfrm.state_hmask;
|
||||
si->sadcnt = net->xfrm.state_num;
|
||||
si->sadhcnt = net->xfrm.state_hmask;
|
||||
si->sadhmcnt = xfrm_state_hashmax;
|
||||
spin_unlock_bh(&xfrm_state_lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -781,7 +781,8 @@ static inline size_t xfrm_spdinfo_msgsize(void)
|
|||
+ nla_total_size(sizeof(struct xfrmu_spdhinfo));
|
||||
}
|
||||
|
||||
static int build_spdinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
||||
static int build_spdinfo(struct sk_buff *skb, struct net *net,
|
||||
u32 pid, u32 seq, u32 flags)
|
||||
{
|
||||
struct xfrmk_spdinfo si;
|
||||
struct xfrmu_spdinfo spc;
|
||||
|
|
@ -795,7 +796,7 @@ static int build_spdinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
|||
|
||||
f = nlmsg_data(nlh);
|
||||
*f = flags;
|
||||
xfrm_spd_getinfo(&si);
|
||||
xfrm_spd_getinfo(net, &si);
|
||||
spc.incnt = si.incnt;
|
||||
spc.outcnt = si.outcnt;
|
||||
spc.fwdcnt = si.fwdcnt;
|
||||
|
|
@ -828,7 +829,7 @@ static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (r_skb == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (build_spdinfo(r_skb, spid, seq, *flags) < 0)
|
||||
if (build_spdinfo(r_skb, net, spid, seq, *flags) < 0)
|
||||
BUG();
|
||||
|
||||
return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid);
|
||||
|
|
@ -841,7 +842,8 @@ static inline size_t xfrm_sadinfo_msgsize(void)
|
|||
+ nla_total_size(4); /* XFRMA_SAD_CNT */
|
||||
}
|
||||
|
||||
static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
||||
static int build_sadinfo(struct sk_buff *skb, struct net *net,
|
||||
u32 pid, u32 seq, u32 flags)
|
||||
{
|
||||
struct xfrmk_sadinfo si;
|
||||
struct xfrmu_sadhinfo sh;
|
||||
|
|
@ -854,7 +856,7 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
|||
|
||||
f = nlmsg_data(nlh);
|
||||
*f = flags;
|
||||
xfrm_sad_getinfo(&si);
|
||||
xfrm_sad_getinfo(net, &si);
|
||||
|
||||
sh.sadhmcnt = si.sadhmcnt;
|
||||
sh.sadhcnt = si.sadhcnt;
|
||||
|
|
@ -882,7 +884,7 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (r_skb == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (build_sadinfo(r_skb, spid, seq, *flags) < 0)
|
||||
if (build_sadinfo(r_skb, net, spid, seq, *flags) < 0)
|
||||
BUG();
|
||||
|
||||
return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid);
|
||||
|
|
|
|||
Loading…
Reference in a new issue