diff options
author | Luis R. Rodriguez <mcgrof@suse.com> | 2014-04-17 21:22:54 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-20 18:18:55 -0400 |
commit | 599018a71013386119c057a64183e49240c8b4e6 (patch) | |
tree | 2c4931261b8371407f66e8d48aac29f75aeca324 /net/ieee802154 | |
parent | 8465a5fcd1ceba8f2b55121d47b73f4025401490 (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.c | 46 |
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 | ||
464 | err_reg: | 470 | err_reg: |
@@ -471,9 +477,11 @@ err_alloc: | |||
471 | static void __net_exit lowpan_frags_ns_sysctl_unregister(struct net *net) | 477 | static 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 | ||
515 | static int __net_init lowpan_frags_init_net(struct net *net) | 523 | static 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 | ||
527 | static void __net_exit lowpan_frags_exit_net(struct net *net) | 538 | static 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 | ||
533 | static struct pernet_operations lowpan_frags_ops = { | 547 | static struct pernet_operations lowpan_frags_ops = { |