aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee802154
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@suse.com>2014-04-17 21:22:54 -0400
committerDavid S. Miller <davem@davemloft.net>2014-04-20 18:18:55 -0400
commit599018a71013386119c057a64183e49240c8b4e6 (patch)
tree2c4931261b8371407f66e8d48aac29f75aeca324 /net/ieee802154
parent8465a5fcd1ceba8f2b55121d47b73f4025401490 (diff)
6lowpan: add helper to get 6lowpan namespace
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> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ieee802154')
-rw-r--r--net/ieee802154/reassembly.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/net/ieee802154/reassembly.c b/net/ieee802154/reassembly.c
index ef2d54372b13..132b65b6d957 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,
120 struct inet_frag_queue *q; 120 struct inet_frag_queue *q;
121 struct lowpan_create_arg arg; 121 struct lowpan_create_arg arg;
122 unsigned int hash; 122 unsigned int hash;
123 struct netns_ieee802154_lowpan *ieee802154_lowpan =
124 net_ieee802154_lowpan(net);
123 125
124 arg.tag = frag_info->d_tag; 126 arg.tag = frag_info->d_tag;
125 arg.d_size = frag_info->d_size; 127 arg.d_size = frag_info->d_size;
@@ -129,7 +131,7 @@ fq_find(struct net *net, const struct lowpan_frag_info *frag_info,
129 read_lock(&lowpan_frags.lock); 131 read_lock(&lowpan_frags.lock);
130 hash = lowpan_hash_frag(frag_info->d_tag, frag_info->d_size, src, dst); 132 hash = lowpan_hash_frag(frag_info->d_tag, frag_info->d_size, src, dst);
131 133
132 q = inet_frag_find(&net->ieee802154_lowpan.frags, 134 q = inet_frag_find(&ieee802154_lowpan->frags,
133 &lowpan_frags, &arg, hash); 135 &lowpan_frags, &arg, hash);
134 if (IS_ERR_OR_NULL(q)) { 136 if (IS_ERR_OR_NULL(q)) {
135 inet_frag_maybe_warn_overflow(q, pr_fmt()); 137 inet_frag_maybe_warn_overflow(q, pr_fmt());
@@ -357,6 +359,8 @@ int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
357 struct net *net = dev_net(skb->dev); 359 struct net *net = dev_net(skb->dev);
358 struct lowpan_frag_info *frag_info = lowpan_cb(skb); 360 struct lowpan_frag_info *frag_info = lowpan_cb(skb);
359 struct ieee802154_addr source, dest; 361 struct ieee802154_addr source, dest;
362 struct netns_ieee802154_lowpan *ieee802154_lowpan =
363 net_ieee802154_lowpan(net);
360 int err; 364 int err;
361 365
362 source = mac_cb(skb)->source; 366 source = mac_cb(skb)->source;
@@ -366,10 +370,10 @@ int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
366 if (err < 0) 370 if (err < 0)
367 goto err; 371 goto err;
368 372
369 if (frag_info->d_size > net->ieee802154_lowpan.max_dsize) 373 if (frag_info->d_size > ieee802154_lowpan->max_dsize)
370 goto err; 374 goto err;
371 375
372 inet_frag_evictor(&net->ieee802154_lowpan.frags, &lowpan_frags, false); 376 inet_frag_evictor(&ieee802154_lowpan->frags, &lowpan_frags, false);
373 377
374 fq = fq_find(net, frag_info, &source, &dest); 378 fq = fq_find(net, frag_info, &source, &dest);
375 if (fq != NULL) { 379 if (fq != NULL) {
@@ -436,6 +440,8 @@ static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
436{ 440{
437 struct ctl_table *table; 441 struct ctl_table *table;
438 struct ctl_table_header *hdr; 442 struct ctl_table_header *hdr;
443 struct netns_ieee802154_lowpan *ieee802154_lowpan =
444 net_ieee802154_lowpan(net);
439 445
440 table = lowpan_frags_ns_ctl_table; 446 table = lowpan_frags_ns_ctl_table;
441 if (!net_eq(net, &init_net)) { 447 if (!net_eq(net, &init_net)) {
@@ -444,10 +450,10 @@ static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
444 if (table == NULL) 450 if (table == NULL)
445 goto err_alloc; 451 goto err_alloc;
446 452
447 table[0].data = &net->ieee802154_lowpan.frags.high_thresh; 453 table[0].data = &ieee802154_lowpan->frags.high_thresh;
448 table[1].data = &net->ieee802154_lowpan.frags.low_thresh; 454 table[1].data = &ieee802154_lowpan->frags.low_thresh;
449 table[2].data = &net->ieee802154_lowpan.frags.timeout; 455 table[2].data = &ieee802154_lowpan->frags.timeout;
450 table[3].data = &net->ieee802154_lowpan.max_dsize; 456 table[3].data = &ieee802154_lowpan->max_dsize;
451 457
452 /* Don't export sysctls to unprivileged users */ 458 /* Don't export sysctls to unprivileged users */
453 if (net->user_ns != &init_user_ns) 459 if (net->user_ns != &init_user_ns)
@@ -458,7 +464,7 @@ static int __net_init lowpan_frags_ns_sysctl_register(struct net *net)
458 if (hdr == NULL) 464 if (hdr == NULL)
459 goto err_reg; 465 goto err_reg;
460 466
461 net->ieee802154_lowpan.sysctl.frags_hdr = hdr; 467 ieee802154_lowpan->sysctl.frags_hdr = hdr;
462 return 0; 468 return 0;
463 469
464err_reg: 470err_reg:
@@ -471,9 +477,11 @@ err_alloc:
471static void __net_exit lowpan_frags_ns_sysctl_unregister(struct net *net) 477static void __net_exit lowpan_frags_ns_sysctl_unregister(struct net *net)
472{ 478{
473 struct ctl_table *table; 479 struct ctl_table *table;
480 struct netns_ieee802154_lowpan *ieee802154_lowpan =
481 net_ieee802154_lowpan(net);
474 482
475 table = net->ieee802154_lowpan.sysctl.frags_hdr->ctl_table_arg; 483 table = ieee802154_lowpan->sysctl.frags_hdr->ctl_table_arg;
476 unregister_net_sysctl_table(net->ieee802154_lowpan.sysctl.frags_hdr); 484 unregister_net_sysctl_table(ieee802154_lowpan->sysctl.frags_hdr);
477 if (!net_eq(net, &init_net)) 485 if (!net_eq(net, &init_net))
478 kfree(table); 486 kfree(table);
479} 487}
@@ -514,20 +522,26 @@ static inline void lowpan_frags_sysctl_unregister(void)
514 522
515static int __net_init lowpan_frags_init_net(struct net *net) 523static int __net_init lowpan_frags_init_net(struct net *net)
516{ 524{
517 net->ieee802154_lowpan.frags.high_thresh = IPV6_FRAG_HIGH_THRESH; 525 struct netns_ieee802154_lowpan *ieee802154_lowpan =
518 net->ieee802154_lowpan.frags.low_thresh = IPV6_FRAG_LOW_THRESH; 526 net_ieee802154_lowpan(net);
519 net->ieee802154_lowpan.frags.timeout = IPV6_FRAG_TIMEOUT;
520 net->ieee802154_lowpan.max_dsize = 0xFFFF;
521 527
522 inet_frags_init_net(&net->ieee802154_lowpan.frags); 528 ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
529 ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH;
530 ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT;
531 ieee802154_lowpan->max_dsize = 0xFFFF;
532
533 inet_frags_init_net(&ieee802154_lowpan->frags);
523 534
524 return lowpan_frags_ns_sysctl_register(net); 535 return lowpan_frags_ns_sysctl_register(net);
525} 536}
526 537
527static void __net_exit lowpan_frags_exit_net(struct net *net) 538static void __net_exit lowpan_frags_exit_net(struct net *net)
528{ 539{
540 struct netns_ieee802154_lowpan *ieee802154_lowpan =
541 net_ieee802154_lowpan(net);
542
529 lowpan_frags_ns_sysctl_unregister(net); 543 lowpan_frags_ns_sysctl_unregister(net);
530 inet_frags_exit_net(&net->ieee802154_lowpan.frags, &lowpan_frags); 544 inet_frags_exit_net(&ieee802154_lowpan->frags, &lowpan_frags);
531} 545}
532 546
533static struct pernet_operations lowpan_frags_ops = { 547static struct pernet_operations lowpan_frags_ops = {