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 = { |
