| This will be sent upstream, then we can remove this. |
| The first hunk however was removed as it doesn't apply to |
| our backport framework which declared net_ieee802154_lowpan(), |
| for now we carry that for older and newer kernels in our own |
| backport/backport-include/net/net_namespace.h file. |
| |
| From 2e509dac53558fda87061b06f081fde5a7cb8051 Mon Sep 17 00:00:00 2001 |
| From: "Luis R. Rodriguez" <mcgrof@suse.com> |
| Date: Mon, 31 Mar 2014 01:53:22 -0700 |
| Subject: [PATCH] 6lowpan: add helper to get 6lowpan namespace |
| |
| This will simplify the new reassembly backport |
| with no code changes. |
| |
| Cc:Alexander Aring <alex.aring@gmail.com> |
| Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com> |
| --- |
| diff --git a/net/ieee802154/reassembly.c b/net/ieee802154/reassembly.c |
| index f4ac957..0bcbef3 100644 |
| -- |
| 1.9.0 |
| |
| --- a/net/ieee802154/reassembly.c |
| +++ b/net/ieee802154/reassembly.c |
| @@ -116,6 +116,8 @@ fq_find(struct net *net, const struct ie |
| 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; |
| @@ -125,7 +127,7 @@ fq_find(struct net *net, const struct ie |
| 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()); |
| @@ -354,16 +356,18 @@ int lowpan_frag_rcv(struct sk_buff *skb, |
| struct lowpan_frag_queue *fq; |
| struct net *net = dev_net(skb->dev); |
| struct ieee802154_frag_info *frag_info = &mac_cb(skb)->frag_info; |
| + struct netns_ieee802154_lowpan *ieee802154_lowpan = |
| + net_ieee802154_lowpan(net); |
| int err; |
| |
| err = lowpan_get_frag_info(skb, frag_type, frag_info); |
| 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, &mac_cb(skb)->sa, &mac_cb(skb)->da); |
| if (fq != NULL) { |
| @@ -430,6 +434,8 @@ static int __net_init lowpan_frags_ns_sy |
| { |
| 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)) { |
| @@ -438,10 +444,10 @@ static int __net_init lowpan_frags_ns_sy |
| 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) |
| @@ -452,7 +458,7 @@ static int __net_init lowpan_frags_ns_sy |
| if (hdr == NULL) |
| goto err_reg; |
| |
| - net->ieee802154_lowpan.sysctl.frags_hdr = hdr; |
| + ieee802154_lowpan->sysctl.frags_hdr = hdr; |
| return 0; |
| |
| err_reg: |
| @@ -465,9 +471,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); |
| } |
| @@ -508,20 +516,26 @@ static inline void lowpan_frags_sysctl_u |
| |
| 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 = { |