Skip to content

Commit

Permalink
net: add a net pointer to struct fqdir
Browse files Browse the repository at this point in the history
fqdir will soon be dynamically allocated.

We need to reach the struct net pointer from fqdir,
so add it, and replace the various container_of() constructs
by direct access to the new field.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed May 26, 2019
1 parent 9cce45f commit a39aca6
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 24 deletions.
5 changes: 4 additions & 1 deletion include/net/inet_frag.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ struct fqdir {
int timeout;
int max_dist;
struct inet_frags *f;
struct net *net;

struct rhashtable rhashtable ____cacheline_aligned_in_smp;

Expand Down Expand Up @@ -104,9 +105,11 @@ struct inet_frags {
int inet_frags_init(struct inet_frags *);
void inet_frags_fini(struct inet_frags *);

static inline int fqdir_init(struct fqdir *fqdir, struct inet_frags *f)
static inline int fqdir_init(struct fqdir *fqdir, struct inet_frags *f,
struct net *net)
{
fqdir->f = f;
fqdir->net = net;
atomic_long_set(&fqdir->mem, 0);
return rhashtable_init(&fqdir->rhashtable, &fqdir->f->rhash_params);
}
Expand Down
2 changes: 1 addition & 1 deletion net/ieee802154/6lowpan/reassembly.c
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ static int __net_init lowpan_frags_init_net(struct net *net)
ieee802154_lowpan->fqdir.low_thresh = IPV6_FRAG_LOW_THRESH;
ieee802154_lowpan->fqdir.timeout = IPV6_FRAG_TIMEOUT;

res = fqdir_init(&ieee802154_lowpan->fqdir, &lowpan_frags);
res = fqdir_init(&ieee802154_lowpan->fqdir, &lowpan_frags, net);
if (res < 0)
return res;
res = lowpan_frags_ns_sysctl_register(net);
Expand Down
20 changes: 7 additions & 13 deletions net/ipv4/ip_fragment.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb,
static void ip4_frag_init(struct inet_frag_queue *q, const void *a)
{
struct ipq *qp = container_of(q, struct ipq, q);
struct netns_ipv4 *ipv4 = container_of(q->fqdir, struct netns_ipv4,
fqdir);
struct net *net = container_of(ipv4, struct net, ipv4);
struct net *net = q->fqdir->net;

const struct frag_v4_compare_key *key = a;

Expand Down Expand Up @@ -142,7 +140,7 @@ static void ip_expire(struct timer_list *t)
int err;

qp = container_of(frag, struct ipq, q);
net = container_of(qp->q.fqdir, struct net, ipv4.fqdir);
net = qp->q.fqdir->net;

rcu_read_lock();
spin_lock(&qp->q.lock);
Expand Down Expand Up @@ -236,12 +234,8 @@ static int ip_frag_too_far(struct ipq *qp)

rc = qp->q.fragments_tail && (end - start) > max;

if (rc) {
struct net *net;

net = container_of(qp->q.fqdir, struct net, ipv4.fqdir);
__IP_INC_STATS(net, IPSTATS_MIB_REASMFAILS);
}
if (rc)
__IP_INC_STATS(qp->q.fqdir->net, IPSTATS_MIB_REASMFAILS);

return rc;
}
Expand Down Expand Up @@ -273,7 +267,7 @@ static int ip_frag_reinit(struct ipq *qp)
/* Add new segment to existing queue. */
static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
{
struct net *net = container_of(qp->q.fqdir, struct net, ipv4.fqdir);
struct net *net = qp->q.fqdir->net;
int ihl, end, flags, offset;
struct sk_buff *prev_tail;
struct net_device *dev;
Expand Down Expand Up @@ -399,7 +393,7 @@ static int ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
static int ip_frag_reasm(struct ipq *qp, struct sk_buff *skb,
struct sk_buff *prev_tail, struct net_device *dev)
{
struct net *net = container_of(qp->q.fqdir, struct net, ipv4.fqdir);
struct net *net = qp->q.fqdir->net;
struct iphdr *iph;
void *reasm_data;
int len, err;
Expand Down Expand Up @@ -673,7 +667,7 @@ static int __net_init ipv4_frags_init_net(struct net *net)

net->ipv4.fqdir.max_dist = 64;

res = fqdir_init(&net->ipv4.fqdir, &ip4_frags);
res = fqdir_init(&net->ipv4.fqdir, &ip4_frags, net);
if (res < 0)
return res;
res = ip4_frags_ns_ctl_register(net);
Expand Down
6 changes: 2 additions & 4 deletions net/ipv6/netfilter/nf_conntrack_reasm.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,12 +143,10 @@ static void nf_ct_frag6_expire(struct timer_list *t)
{
struct inet_frag_queue *frag = from_timer(frag, t, timer);
struct frag_queue *fq;
struct net *net;

fq = container_of(frag, struct frag_queue, q);
net = container_of(fq->q.fqdir, struct net, nf_frag.fqdir);

ip6frag_expire_frag_queue(net, fq);
ip6frag_expire_frag_queue(fq->q.fqdir->net, fq);
}

/* Creation primitives. */
Expand Down Expand Up @@ -495,7 +493,7 @@ static int nf_ct_net_init(struct net *net)
net->nf_frag.fqdir.low_thresh = IPV6_FRAG_LOW_THRESH;
net->nf_frag.fqdir.timeout = IPV6_FRAG_TIMEOUT;

res = fqdir_init(&net->nf_frag.fqdir, &nf_frags);
res = fqdir_init(&net->nf_frag.fqdir, &nf_frags, net);
if (res < 0)
return res;
res = nf_ct_frag6_sysctl_register(net);
Expand Down
8 changes: 3 additions & 5 deletions net/ipv6/reassembly.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,10 @@ static void ip6_frag_expire(struct timer_list *t)
{
struct inet_frag_queue *frag = from_timer(frag, t, timer);
struct frag_queue *fq;
struct net *net;

fq = container_of(frag, struct frag_queue, q);
net = container_of(fq->q.fqdir, struct net, ipv6.fqdir);

ip6frag_expire_frag_queue(net, fq);
ip6frag_expire_frag_queue(fq->q.fqdir->net, fq);
}

static struct frag_queue *
Expand Down Expand Up @@ -254,7 +252,7 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *skb,
struct sk_buff *prev_tail, struct net_device *dev)
{
struct net *net = container_of(fq->q.fqdir, struct net, ipv6.fqdir);
struct net *net = fq->q.fqdir->net;
unsigned int nhoff;
void *reasm_data;
int payload_len;
Expand Down Expand Up @@ -516,7 +514,7 @@ static int __net_init ipv6_frags_init_net(struct net *net)
net->ipv6.fqdir.low_thresh = IPV6_FRAG_LOW_THRESH;
net->ipv6.fqdir.timeout = IPV6_FRAG_TIMEOUT;

res = fqdir_init(&net->ipv6.fqdir, &ip6_frags);
res = fqdir_init(&net->ipv6.fqdir, &ip6_frags, net);
if (res < 0)
return res;

Expand Down

0 comments on commit a39aca6

Please sign in to comment.