Patchwork [1/3] 6lowpan: add helper to get 6lowpan namespace

login
register
mail settings
Submitter Luis R. Rodriguez
Date April 18, 2014, 1:22 a.m.
Message ID <1397784176-15809-2-git-send-email-mcgrof@do-not-panic.com>
Download mbox | patch
Permalink /patch/340204/
State Accepted
Delegated to: David Miller
Headers show

Comments

Luis R. Rodriguez - April 18, 2014, 1:22 a.m.
From: "Luis R. Rodriguez" <mcgrof@suse.com>

This will simplify the new reassembly backport
with no code changes being required.

CC: Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: linux-zigbee-devel@lists.sourceforge.net
Cc: David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
---
 include/net/net_namespace.h | 15 +++++++++++++++
 net/ieee802154/reassembly.c | 46 +++++++++++++++++++++++++++++----------------
 2 files changed, 45 insertions(+), 16 deletions(-)
Johannes Berg - April 22, 2014, 9:44 a.m.
On Thu, 2014-04-17 at 18:22 -0700, Luis R. Rodriguez wrote:

> +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
> [...]
> +#else
> +static inline struct netns_ieee802154_lowpan *
> +net_ieee802154_lowpan(struct net *net)
> +{
> +	return NULL;
> +}
> +#endif

Why would that be needed? If nobody compiles 802.15.4 then it seems
nothing should reference it?

johannes

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Aring - April 22, 2014, 9:53 a.m.
Hi,

On Tue, Apr 22, 2014 at 11:44:46AM +0200, Johannes Berg wrote:
> On Thu, 2014-04-17 at 18:22 -0700, Luis R. Rodriguez wrote:
> 
> > +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
> > [...]
> > +#else
> > +static inline struct netns_ieee802154_lowpan *
> > +net_ieee802154_lowpan(struct net *net)
> > +{
> > +	return NULL;
> > +}
> > +#endif
> 
> Why would that be needed? If nobody compiles 802.15.4 then it seems
> nothing should reference it?
> 
Indeed I think this is unnecessary, also.

- Alex
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Luis R. Rodriguez - April 22, 2014, 5:58 p.m.
On Tue, Apr 22, 2014 at 11:53:03AM +0200, Alexander Aring wrote:
> Hi,
> 
> On Tue, Apr 22, 2014 at 11:44:46AM +0200, Johannes Berg wrote:
> > On Thu, 2014-04-17 at 18:22 -0700, Luis R. Rodriguez wrote:
> > 
> > > +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
> > > [...]
> > > +#else
> > > +static inline struct netns_ieee802154_lowpan *
> > > +net_ieee802154_lowpan(struct net *net)
> > > +{
> > > +	return NULL;
> > > +}
> > > +#endif
> > 
> > Why would that be needed? If nobody compiles 802.15.4 then it seems
> > nothing should reference it?
> > 
> Indeed I think this is unnecessary, also.

I wanted to be sure, and I was not. Right now 6lowpan does not depend
on CONFIG_NET_NS, is this intentional? I think its fine without it
but I was not sure.

  Luis
Johannes Berg - April 22, 2014, 6:45 p.m.
On Tue, 2014-04-22 at 19:58 +0200, Luis R. Rodriguez wrote:

> > > > +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
> > > > [...]
> > > > +#else
> > > > +static inline struct netns_ieee802154_lowpan *
> > > > +net_ieee802154_lowpan(struct net *net)
> > > > +{
> > > > +	return NULL;
> > > > +}
> > > > +#endif
> > > 
> > > Why would that be needed? If nobody compiles 802.15.4 then it seems
> > > nothing should reference it?
> > > 
> > Indeed I think this is unnecessary, also.
> 
> I wanted to be sure, and I was not. Right now 6lowpan does not depend
> on CONFIG_NET_NS, is this intentional? I think its fine without it
> but I was not sure.

I fail to see how !CONFIG_LOWPAN is related CONFIG_NET_NS?

johannes

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Aring - April 22, 2014, 6:49 p.m.
On Tue, Apr 22, 2014 at 08:45:15PM +0200, Johannes Berg wrote:
> On Tue, 2014-04-22 at 19:58 +0200, Luis R. Rodriguez wrote:
> 
> > > > > +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
> > > > > [...]
> > > > > +#else
> > > > > +static inline struct netns_ieee802154_lowpan *
> > > > > +net_ieee802154_lowpan(struct net *net)
> > > > > +{
> > > > > +	return NULL;
> > > > > +}
> > > > > +#endif
> > > > 
> > > > Why would that be needed? If nobody compiles 802.15.4 then it seems
> > > > nothing should reference it?
> > > > 
> > > Indeed I think this is unnecessary, also.
> > 
> > I wanted to be sure, and I was not. Right now 6lowpan does not depend
> > on CONFIG_NET_NS, is this intentional? I think its fine without it
> > but I was not sure.
> 
> I fail to see how !CONFIG_LOWPAN is related CONFIG_NET_NS?
> 

mhh, IEEE802154_6LOWPAN depends on IPV6 and I think IPV6 is related to
CONFIG_NET_NS.

- Alex
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Luis R. Rodriguez - April 22, 2014, 7:03 p.m.
On Tue, Apr 22, 2014 at 11:45 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> On Tue, 2014-04-22 at 19:58 +0200, Luis R. Rodriguez wrote:
>
>> > > > +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
>> > > > [...]
>> > > > +#else
>> > > > +static inline struct netns_ieee802154_lowpan *
>> > > > +net_ieee802154_lowpan(struct net *net)
>> > > > +{
>> > > > +       return NULL;
>> > > > +}
>> > > > +#endif
>> > >
>> > > Why would that be needed? If nobody compiles 802.15.4 then it seems
>> > > nothing should reference it?
>> > >
>> > Indeed I think this is unnecessary, also.
>>
>> I wanted to be sure, and I was not. Right now 6lowpan does not depend
>> on CONFIG_NET_NS, is this intentional? I think its fine without it
>> but I was not sure.
>
> I fail to see how !CONFIG_LOWPAN is related CONFIG_NET_NS?

I concerned about the inverse but I just test compiled it and it seems
fine, will send a follow up to nuke this hunk.

  Luis
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Luis R. Rodriguez - April 22, 2014, 7:09 p.m.
On Tue, Apr 22, 2014 at 11:49 AM, Alexander Aring <alex.aring@gmail.com> wrote:
> On Tue, Apr 22, 2014 at 08:45:15PM +0200, Johannes Berg wrote:
>> On Tue, 2014-04-22 at 19:58 +0200, Luis R. Rodriguez wrote:
>>
>> > > > > +#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
>> > > > > [...]
>> > > > > +#else
>> > > > > +static inline struct netns_ieee802154_lowpan *
>> > > > > +net_ieee802154_lowpan(struct net *net)
>> > > > > +{
>> > > > > +     return NULL;
>> > > > > +}
>> > > > > +#endif
>> > > >
>> > > > Why would that be needed? If nobody compiles 802.15.4 then it seems
>> > > > nothing should reference it?
>> > > >
>> > > Indeed I think this is unnecessary, also.
>> >
>> > I wanted to be sure, and I was not. Right now 6lowpan does not depend
>> > on CONFIG_NET_NS, is this intentional? I think its fine without it
>> > but I was not sure.
>>
>> I fail to see how !CONFIG_LOWPAN is related CONFIG_NET_NS?
>>
>
> mhh, IEEE802154_6LOWPAN depends on IPV6 and I think IPV6 is related to
> CONFIG_NET_NS.

Just test compiled IEEE802154_6LOWPAN without NET_NS and then also
disabled IPV6 and it compiles, IEEE802154_6LOWPAN already depends on
IPV6.

  Luis
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 5f9eb26..bc4118e 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -373,6 +373,21 @@  static inline void rt_genid_bump_ipv6(struct net *net)
 }
 #endif
 
+#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
+static inline struct netns_ieee802154_lowpan *
+net_ieee802154_lowpan(struct net *net)
+{
+	return &net->ieee802154_lowpan;
+}
+#else
+static inline struct netns_ieee802154_lowpan *
+net_ieee802154_lowpan(struct net *net)
+{
+	return NULL;
+}
+#endif
+
+
 /* For callers who don't really care about whether it's IPv4 or IPv6 */
 static inline void rt_genid_bump_all(struct net *net)
 {
diff --git a/net/ieee802154/reassembly.c b/net/ieee802154/reassembly.c
index ef2d543..132b65b 100644
--- a/net/ieee802154/reassembly.c
+++ b/net/ieee802154/reassembly.c
@@ -120,6 +120,8 @@  fq_find(struct net *net, const struct lowpan_frag_info *frag_info,
 	struct inet_frag_queue *q;
 	struct lowpan_create_arg arg;
 	unsigned int hash;
+	struct netns_ieee802154_lowpan *ieee802154_lowpan =
+		net_ieee802154_lowpan(net);
 
 	arg.tag = frag_info->d_tag;
 	arg.d_size = frag_info->d_size;
@@ -129,7 +131,7 @@  fq_find(struct net *net, const struct lowpan_frag_info *frag_info,
 	read_lock(&lowpan_frags.lock);
 	hash = lowpan_hash_frag(frag_info->d_tag, frag_info->d_size, src, dst);
 
-	q = inet_frag_find(&net->ieee802154_lowpan.frags,
+	q = inet_frag_find(&ieee802154_lowpan->frags,
 			   &lowpan_frags, &arg, hash);
 	if (IS_ERR_OR_NULL(q)) {
 		inet_frag_maybe_warn_overflow(q, pr_fmt());
@@ -357,6 +359,8 @@  int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
 	struct net *net = dev_net(skb->dev);
 	struct lowpan_frag_info *frag_info = lowpan_cb(skb);
 	struct ieee802154_addr source, dest;
+	struct netns_ieee802154_lowpan *ieee802154_lowpan =
+		net_ieee802154_lowpan(net);
 	int err;
 
 	source = mac_cb(skb)->source;
@@ -366,10 +370,10 @@  int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
 	if (err < 0)
 		goto err;
 
-	if (frag_info->d_size > net->ieee802154_lowpan.max_dsize)
+	if (frag_info->d_size > ieee802154_lowpan->max_dsize)
 		goto err;
 
-	inet_frag_evictor(&net->ieee802154_lowpan.frags, &lowpan_frags, false);
+	inet_frag_evictor(&ieee802154_lowpan->frags, &lowpan_frags, false);
 
 	fq = fq_find(net, frag_info, &source, &dest);
 	if (fq != NULL) {
@@ -436,6 +440,8 @@  static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
 {
 	struct ctl_table *table;
 	struct ctl_table_header *hdr;
+	struct netns_ieee802154_lowpan *ieee802154_lowpan =
+		net_ieee802154_lowpan(net);
 
 	table = lowpan_frags_ns_ctl_table;
 	if (!net_eq(net, &init_net)) {
@@ -444,10 +450,10 @@  static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
 		if (table == NULL)
 			goto err_alloc;
 
-		table[0].data = &net->ieee802154_lowpan.frags.high_thresh;
-		table[1].data = &net->ieee802154_lowpan.frags.low_thresh;
-		table[2].data = &net->ieee802154_lowpan.frags.timeout;
-		table[3].data = &net->ieee802154_lowpan.max_dsize;
+		table[0].data = &ieee802154_lowpan->frags.high_thresh;
+		table[1].data = &ieee802154_lowpan->frags.low_thresh;
+		table[2].data = &ieee802154_lowpan->frags.timeout;
+		table[3].data = &ieee802154_lowpan->max_dsize;
 
 		/* Don't export sysctls to unprivileged users */
 		if (net->user_ns != &init_user_ns)
@@ -458,7 +464,7 @@  static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
 	if (hdr == NULL)
 		goto err_reg;
 
-	net->ieee802154_lowpan.sysctl.frags_hdr = hdr;
+	ieee802154_lowpan->sysctl.frags_hdr = hdr;
 	return 0;
 
 err_reg:
@@ -471,9 +477,11 @@  err_alloc:
 static void __net_exit lowpan_frags_ns_sysctl_unregister(struct net *net)
 {
 	struct ctl_table *table;
+	struct netns_ieee802154_lowpan *ieee802154_lowpan =
+		net_ieee802154_lowpan(net);
 
-	table = net->ieee802154_lowpan.sysctl.frags_hdr->ctl_table_arg;
-	unregister_net_sysctl_table(net->ieee802154_lowpan.sysctl.frags_hdr);
+	table = ieee802154_lowpan->sysctl.frags_hdr->ctl_table_arg;
+	unregister_net_sysctl_table(ieee802154_lowpan->sysctl.frags_hdr);
 	if (!net_eq(net, &init_net))
 		kfree(table);
 }
@@ -514,20 +522,26 @@  static inline void lowpan_frags_sysctl_unregister(void)
 
 static int __net_init lowpan_frags_init_net(struct net *net)
 {
-	net->ieee802154_lowpan.frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
-	net->ieee802154_lowpan.frags.low_thresh = IPV6_FRAG_LOW_THRESH;
-	net->ieee802154_lowpan.frags.timeout = IPV6_FRAG_TIMEOUT;
-	net->ieee802154_lowpan.max_dsize = 0xFFFF;
+	struct netns_ieee802154_lowpan *ieee802154_lowpan =
+		net_ieee802154_lowpan(net);
 
-	inet_frags_init_net(&net->ieee802154_lowpan.frags);
+	ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
+	ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH;
+	ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT;
+	ieee802154_lowpan->max_dsize = 0xFFFF;
+
+	inet_frags_init_net(&ieee802154_lowpan->frags);
 
 	return lowpan_frags_ns_sysctl_register(net);
 }
 
 static void __net_exit lowpan_frags_exit_net(struct net *net)
 {
+	struct netns_ieee802154_lowpan *ieee802154_lowpan =
+		net_ieee802154_lowpan(net);
+
 	lowpan_frags_ns_sysctl_unregister(net);
-	inet_frags_exit_net(&net->ieee802154_lowpan.frags, &lowpan_frags);
+	inet_frags_exit_net(&ieee802154_lowpan->frags, &lowpan_frags);
 }
 
 static struct pernet_operations lowpan_frags_ops = {