mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
[NETNS][FRAGS]: Make the inet_frag_queue lookup work in namespaces.
Since fragment management code is consolidated, we cannot have the pointer from inet_frag_queue to struct net, since we must know what king of fragment this is. So, I introduce the netns_frags structure. This one is currently empty, but will be eventually filled with per-namespace attributes. Each inet_frag_queue is tagged with this one. The conntrack_reasm is not "netns-izated", so it has one static netns_frags instance to keep working in init namespace. Signed-off-by: Pavel Emelyanov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
8d8354d2fb
commit
ac18e7509e
7 changed files with 38 additions and 21 deletions
|
|
@ -78,6 +78,7 @@ static struct inet_frags_ctl nf_frags_ctl __read_mostly = {
|
|||
};
|
||||
|
||||
static struct inet_frags nf_frags;
|
||||
static struct netns_frags nf_init_frags;
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
struct ctl_table nf_ct_ipv6_sysctl_table[] = {
|
||||
|
|
@ -212,7 +213,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst)
|
|||
arg.dst = dst;
|
||||
hash = ip6qhashfn(id, src, dst);
|
||||
|
||||
q = inet_frag_find(&nf_frags, &arg, hash);
|
||||
q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash);
|
||||
if (q == NULL)
|
||||
goto oom;
|
||||
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ out:
|
|||
}
|
||||
|
||||
static __inline__ struct frag_queue *
|
||||
fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
|
||||
fq_find(struct net *net, __be32 id, struct in6_addr *src, struct in6_addr *dst,
|
||||
struct inet6_dev *idev)
|
||||
{
|
||||
struct inet_frag_queue *q;
|
||||
|
|
@ -246,7 +246,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
|
|||
arg.dst = dst;
|
||||
hash = ip6qhashfn(id, src, dst);
|
||||
|
||||
q = inet_frag_find(&ip6_frags, &arg, hash);
|
||||
q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash);
|
||||
if (q == NULL)
|
||||
goto oom;
|
||||
|
||||
|
|
@ -568,6 +568,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
|
|||
struct frag_hdr *fhdr;
|
||||
struct frag_queue *fq;
|
||||
struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
struct net *net;
|
||||
|
||||
IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMREQDS);
|
||||
|
||||
|
|
@ -598,10 +599,11 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
|
|||
return 1;
|
||||
}
|
||||
|
||||
net = skb->dev->nd_net;
|
||||
if (atomic_read(&ip6_frags.mem) > init_net.ipv6.sysctl.frags.high_thresh)
|
||||
ip6_evictor(ip6_dst_idev(skb->dst));
|
||||
|
||||
if ((fq = fq_find(fhdr->identification, &hdr->saddr, &hdr->daddr,
|
||||
if ((fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr,
|
||||
ip6_dst_idev(skb->dst))) != NULL) {
|
||||
int ret;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue