reassembly.c (787bea7748a76130566f881c2342a0be4127d182) reassembly.c (093ba72914b696521e4885756a68a3332782c8de)
1/* 6LoWPAN fragment reassembly
2 *
3 *
4 * Authors:
5 * Alexander Aring <aar@pengutronix.de>
6 *
7 * Based on: net/ipv6/reassembly.c
8 *

--- 80 unchanged lines hidden (view full) ---

89 fq = container_of(frag, struct frag_queue, q);
90 net = container_of(fq->q.net, struct net, ieee802154_lowpan.frags);
91
92 spin_lock(&fq->q.lock);
93
94 if (fq->q.flags & INET_FRAG_COMPLETE)
95 goto out;
96
1/* 6LoWPAN fragment reassembly
2 *
3 *
4 * Authors:
5 * Alexander Aring <aar@pengutronix.de>
6 *
7 * Based on: net/ipv6/reassembly.c
8 *

--- 80 unchanged lines hidden (view full) ---

89 fq = container_of(frag, struct frag_queue, q);
90 net = container_of(fq->q.net, struct net, ieee802154_lowpan.frags);
91
92 spin_lock(&fq->q.lock);
93
94 if (fq->q.flags & INET_FRAG_COMPLETE)
95 goto out;
96
97 inet_frag_kill(&fq->q, &lowpan_frags);
97 inet_frag_kill(&fq->q);
98out:
99 spin_unlock(&fq->q.lock);
98out:
99 spin_unlock(&fq->q.lock);
100 inet_frag_put(&fq->q, &lowpan_frags);
100 inet_frag_put(&fq->q);
101}
102
103static inline struct lowpan_frag_queue *
104fq_find(struct net *net, const struct lowpan_802154_cb *cb,
105 const struct ieee802154_addr *src,
106 const struct ieee802154_addr *dst)
107{
108 struct inet_frag_queue *q;

--- 116 unchanged lines hidden (view full) ---

225 * the last and the first frames arrived and all the bits are here.
226 */
227static int lowpan_frag_reasm(struct lowpan_frag_queue *fq, struct sk_buff *prev,
228 struct net_device *ldev)
229{
230 struct sk_buff *fp, *head = fq->q.fragments;
231 int sum_truesize;
232
101}
102
103static inline struct lowpan_frag_queue *
104fq_find(struct net *net, const struct lowpan_802154_cb *cb,
105 const struct ieee802154_addr *src,
106 const struct ieee802154_addr *dst)
107{
108 struct inet_frag_queue *q;

--- 116 unchanged lines hidden (view full) ---

225 * the last and the first frames arrived and all the bits are here.
226 */
227static int lowpan_frag_reasm(struct lowpan_frag_queue *fq, struct sk_buff *prev,
228 struct net_device *ldev)
229{
230 struct sk_buff *fp, *head = fq->q.fragments;
231 int sum_truesize;
232
233 inet_frag_kill(&fq->q, &lowpan_frags);
233 inet_frag_kill(&fq->q);
234
235 /* Make the one we just received the head. */
236 if (prev) {
237 head = prev->next;
238 fp = skb_clone(head, GFP_ATOMIC);
239
240 if (!fp)
241 goto out_oom;

--- 191 unchanged lines hidden (view full) ---

433 fq = fq_find(net, cb, &hdr.source, &hdr.dest);
434 if (fq != NULL) {
435 int ret;
436
437 spin_lock(&fq->q.lock);
438 ret = lowpan_frag_queue(fq, skb, frag_type);
439 spin_unlock(&fq->q.lock);
440
234
235 /* Make the one we just received the head. */
236 if (prev) {
237 head = prev->next;
238 fp = skb_clone(head, GFP_ATOMIC);
239
240 if (!fp)
241 goto out_oom;

--- 191 unchanged lines hidden (view full) ---

433 fq = fq_find(net, cb, &hdr.source, &hdr.dest);
434 if (fq != NULL) {
435 int ret;
436
437 spin_lock(&fq->q.lock);
438 ret = lowpan_frag_queue(fq, skb, frag_type);
439 spin_unlock(&fq->q.lock);
440
441 inet_frag_put(&fq->q, &lowpan_frags);
441 inet_frag_put(&fq->q);
442 return ret;
443 }
444
445err:
446 kfree_skb(skb);
447 return -1;
448}
449

--- 131 unchanged lines hidden (view full) ---

581{
582 struct netns_ieee802154_lowpan *ieee802154_lowpan =
583 net_ieee802154_lowpan(net);
584 int res;
585
586 ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
587 ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH;
588 ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT;
442 return ret;
443 }
444
445err:
446 kfree_skb(skb);
447 return -1;
448}
449

--- 131 unchanged lines hidden (view full) ---

581{
582 struct netns_ieee802154_lowpan *ieee802154_lowpan =
583 net_ieee802154_lowpan(net);
584 int res;
585
586 ieee802154_lowpan->frags.high_thresh = IPV6_FRAG_HIGH_THRESH;
587 ieee802154_lowpan->frags.low_thresh = IPV6_FRAG_LOW_THRESH;
588 ieee802154_lowpan->frags.timeout = IPV6_FRAG_TIMEOUT;
589 ieee802154_lowpan->frags.f = &lowpan_frags;
589
590 res = inet_frags_init_net(&ieee802154_lowpan->frags);
591 if (res < 0)
592 return res;
593 res = lowpan_frags_ns_sysctl_register(net);
594 if (res < 0)
590
591 res = inet_frags_init_net(&ieee802154_lowpan->frags);
592 if (res < 0)
593 return res;
594 res = lowpan_frags_ns_sysctl_register(net);
595 if (res < 0)
595 inet_frags_exit_net(&ieee802154_lowpan->frags, &lowpan_frags);
596 inet_frags_exit_net(&ieee802154_lowpan->frags);
596 return res;
597}
598
599static void __net_exit lowpan_frags_exit_net(struct net *net)
600{
601 struct netns_ieee802154_lowpan *ieee802154_lowpan =
602 net_ieee802154_lowpan(net);
603
604 lowpan_frags_ns_sysctl_unregister(net);
597 return res;
598}
599
600static void __net_exit lowpan_frags_exit_net(struct net *net)
601{
602 struct netns_ieee802154_lowpan *ieee802154_lowpan =
603 net_ieee802154_lowpan(net);
604
605 lowpan_frags_ns_sysctl_unregister(net);
605 inet_frags_exit_net(&ieee802154_lowpan->frags, &lowpan_frags);
606 inet_frags_exit_net(&ieee802154_lowpan->frags);
606}
607
608static struct pernet_operations lowpan_frags_ops = {
609 .init = lowpan_frags_init_net,
610 .exit = lowpan_frags_exit_net,
611};
612
613int __init lowpan_net_frag_init(void)

--- 34 unchanged lines hidden ---
607}
608
609static struct pernet_operations lowpan_frags_ops = {
610 .init = lowpan_frags_init_net,
611 .exit = lowpan_frags_exit_net,
612};
613
614int __init lowpan_net_frag_init(void)

--- 34 unchanged lines hidden ---