1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/module.h>
22#include <linux/string.h>
23#include <linux/list.h>
24#include <linux/rculist.h>
25#include <linux/uaccess.h>
26
27#include <linux/kernel.h>
28#include <linux/spinlock.h>
29#include <linux/kthread.h>
30#include <linux/sched.h>
31#include <linux/slab.h>
32#include <linux/errno.h>
33#include <linux/jiffies.h>
34
35#include <linux/netdevice.h>
36#include <linux/net.h>
37#include <linux/inetdevice.h>
38#include <linux/skbuff.h>
39#include <linux/init.h>
40#include <linux/in.h>
41#include <linux/ip.h>
42#include <linux/udp.h>
43#include <linux/l2tp.h>
44#include <linux/hash.h>
45#include <linux/sort.h>
46#include <linux/file.h>
47#include <linux/nsproxy.h>
48#include <net/net_namespace.h>
49#include <net/netns/generic.h>
50#include <net/dst.h>
51#include <net/ip.h>
52#include <net/udp.h>
53#include <net/inet_common.h>
54#include <net/xfrm.h>
55#include <net/protocol.h>
56
57#include <asm/byteorder.h>
58#include <linux/atomic.h>
59
60#include "l2tp_core.h"
61
62#define L2TP_DRV_VERSION "V2.0"
63
64
65#define L2TP_HDRFLAG_T 0x8000
66#define L2TP_HDRFLAG_L 0x4000
67#define L2TP_HDRFLAG_S 0x0800
68#define L2TP_HDRFLAG_O 0x0200
69#define L2TP_HDRFLAG_P 0x0100
70
71#define L2TP_HDR_VER_MASK 0x000F
72#define L2TP_HDR_VER_2 0x0002
73#define L2TP_HDR_VER_3 0x0003
74
75
76#define L2TP_SLFLAG_S 0x40000000
77#define L2TP_SL_SEQ_MASK 0x00ffffff
78
79#define L2TP_HDR_SIZE_SEQ 10
80#define L2TP_HDR_SIZE_NOSEQ 6
81
82
83#define L2TP_DEFAULT_DEBUG_FLAGS 0
84
85#define PRINTK(_mask, _type, _lvl, _fmt, args...) \
86 do { \
87 if ((_mask) & (_type)) \
88 printk(_lvl "L2TP: " _fmt, ##args); \
89 } while (0)
90
91
92
93struct l2tp_skb_cb {
94 u32 ns;
95 u16 has_seq;
96 u16 length;
97 unsigned long expires;
98};
99
100#define L2TP_SKB_CB(skb) ((struct l2tp_skb_cb *) &skb->cb[sizeof(struct inet_skb_parm)])
101
102static atomic_t l2tp_tunnel_count;
103static atomic_t l2tp_session_count;
104
105
106static unsigned int l2tp_net_id;
107struct l2tp_net {
108 struct list_head l2tp_tunnel_list;
109 spinlock_t l2tp_tunnel_list_lock;
110 struct hlist_head l2tp_session_hlist[L2TP_HASH_SIZE_2];
111 spinlock_t l2tp_session_hlist_lock;
112};
113
114static void l2tp_session_set_header_len(struct l2tp_session *session, int version);
115static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel);
116static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel);
117
118static inline struct l2tp_net *l2tp_pernet(struct net *net)
119{
120 BUG_ON(!net);
121
122 return net_generic(net, l2tp_net_id);
123}
124
125
126
127
128
129static inline void l2tp_tunnel_inc_refcount_1(struct l2tp_tunnel *tunnel)
130{
131 atomic_inc(&tunnel->ref_count);
132}
133
134static inline void l2tp_tunnel_dec_refcount_1(struct l2tp_tunnel *tunnel)
135{
136 if (atomic_dec_and_test(&tunnel->ref_count))
137 l2tp_tunnel_free(tunnel);
138}
139#ifdef L2TP_REFCNT_DEBUG
140#define l2tp_tunnel_inc_refcount(_t) do { \
141 printk(KERN_DEBUG "l2tp_tunnel_inc_refcount: %s:%d %s: cnt=%d\n", __func__, __LINE__, (_t)->name, atomic_read(&_t->ref_count)); \
142 l2tp_tunnel_inc_refcount_1(_t); \
143 } while (0)
144#define l2tp_tunnel_dec_refcount(_t) do { \
145 printk(KERN_DEBUG "l2tp_tunnel_dec_refcount: %s:%d %s: cnt=%d\n", __func__, __LINE__, (_t)->name, atomic_read(&_t->ref_count)); \
146 l2tp_tunnel_dec_refcount_1(_t); \
147 } while (0)
148#else
149#define l2tp_tunnel_inc_refcount(t) l2tp_tunnel_inc_refcount_1(t)
150#define l2tp_tunnel_dec_refcount(t) l2tp_tunnel_dec_refcount_1(t)
151#endif
152
153
154
155
156
157
158static inline struct hlist_head *
159l2tp_session_id_hash_2(struct l2tp_net *pn, u32 session_id)
160{
161 return &pn->l2tp_session_hlist[hash_32(session_id, L2TP_HASH_BITS_2)];
162
163}
164
165
166
167static struct l2tp_session *l2tp_session_find_2(struct net *net, u32 session_id)
168{
169 struct l2tp_net *pn = l2tp_pernet(net);
170 struct hlist_head *session_list =
171 l2tp_session_id_hash_2(pn, session_id);
172 struct l2tp_session *session;
173 struct hlist_node *walk;
174
175 rcu_read_lock_bh();
176 hlist_for_each_entry_rcu(session, walk, session_list, global_hlist) {
177 if (session->session_id == session_id) {
178 rcu_read_unlock_bh();
179 return session;
180 }
181 }
182 rcu_read_unlock_bh();
183
184 return NULL;
185}
186
187
188
189
190
191
192
193static inline struct hlist_head *
194l2tp_session_id_hash(struct l2tp_tunnel *tunnel, u32 session_id)
195{
196 return &tunnel->session_hlist[hash_32(session_id, L2TP_HASH_BITS)];
197}
198
199
200
201struct l2tp_session *l2tp_session_find(struct net *net, struct l2tp_tunnel *tunnel, u32 session_id)
202{
203 struct hlist_head *session_list;
204 struct l2tp_session *session;
205 struct hlist_node *walk;
206
207
208
209
210
211 if (tunnel == NULL)
212 return l2tp_session_find_2(net, session_id);
213
214 session_list = l2tp_session_id_hash(tunnel, session_id);
215 read_lock_bh(&tunnel->hlist_lock);
216 hlist_for_each_entry(session, walk, session_list, hlist) {
217 if (session->session_id == session_id) {
218 read_unlock_bh(&tunnel->hlist_lock);
219 return session;
220 }
221 }
222 read_unlock_bh(&tunnel->hlist_lock);
223
224 return NULL;
225}
226EXPORT_SYMBOL_GPL(l2tp_session_find);
227
228struct l2tp_session *l2tp_session_find_nth(struct l2tp_tunnel *tunnel, int nth)
229{
230 int hash;
231 struct hlist_node *walk;
232 struct l2tp_session *session;
233 int count = 0;
234
235 read_lock_bh(&tunnel->hlist_lock);
236 for (hash = 0; hash < L2TP_HASH_SIZE; hash++) {
237 hlist_for_each_entry(session, walk, &tunnel->session_hlist[hash], hlist) {
238 if (++count > nth) {
239 read_unlock_bh(&tunnel->hlist_lock);
240 return session;
241 }
242 }
243 }
244
245 read_unlock_bh(&tunnel->hlist_lock);
246
247 return NULL;
248}
249EXPORT_SYMBOL_GPL(l2tp_session_find_nth);
250
251
252
253
254struct l2tp_session *l2tp_session_find_by_ifname(struct net *net, char *ifname)
255{
256 struct l2tp_net *pn = l2tp_pernet(net);
257 int hash;
258 struct hlist_node *walk;
259 struct l2tp_session *session;
260
261 rcu_read_lock_bh();
262 for (hash = 0; hash < L2TP_HASH_SIZE_2; hash++) {
263 hlist_for_each_entry_rcu(session, walk, &pn->l2tp_session_hlist[hash], global_hlist) {
264 if (!strcmp(session->ifname, ifname)) {
265 rcu_read_unlock_bh();
266 return session;
267 }
268 }
269 }
270
271 rcu_read_unlock_bh();
272
273 return NULL;
274}
275EXPORT_SYMBOL_GPL(l2tp_session_find_by_ifname);
276
277
278
279struct l2tp_tunnel *l2tp_tunnel_find(struct net *net, u32 tunnel_id)
280{
281 struct l2tp_tunnel *tunnel;
282 struct l2tp_net *pn = l2tp_pernet(net);
283
284 rcu_read_lock_bh();
285 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) {
286 if (tunnel->tunnel_id == tunnel_id) {
287 rcu_read_unlock_bh();
288 return tunnel;
289 }
290 }
291 rcu_read_unlock_bh();
292
293 return NULL;
294}
295EXPORT_SYMBOL_GPL(l2tp_tunnel_find);
296
297struct l2tp_tunnel *l2tp_tunnel_find_nth(struct net *net, int nth)
298{
299 struct l2tp_net *pn = l2tp_pernet(net);
300 struct l2tp_tunnel *tunnel;
301 int count = 0;
302
303 rcu_read_lock_bh();
304 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) {
305 if (++count > nth) {
306 rcu_read_unlock_bh();
307 return tunnel;
308 }
309 }
310
311 rcu_read_unlock_bh();
312
313 return NULL;
314}
315EXPORT_SYMBOL_GPL(l2tp_tunnel_find_nth);
316
317
318
319
320
321
322
323
324static void l2tp_recv_queue_skb(struct l2tp_session *session, struct sk_buff *skb)
325{
326 struct sk_buff *skbp;
327 struct sk_buff *tmp;
328 u32 ns = L2TP_SKB_CB(skb)->ns;
329
330 spin_lock_bh(&session->reorder_q.lock);
331 skb_queue_walk_safe(&session->reorder_q, skbp, tmp) {
332 if (L2TP_SKB_CB(skbp)->ns > ns) {
333 __skb_queue_before(&session->reorder_q, skbp, skb);
334 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
335 "%s: pkt %hu, inserted before %hu, reorder_q len=%d\n",
336 session->name, ns, L2TP_SKB_CB(skbp)->ns,
337 skb_queue_len(&session->reorder_q));
338 session->stats.rx_oos_packets++;
339 goto out;
340 }
341 }
342
343 __skb_queue_tail(&session->reorder_q, skb);
344
345out:
346 spin_unlock_bh(&session->reorder_q.lock);
347}
348
349
350
351static void l2tp_recv_dequeue_skb(struct l2tp_session *session, struct sk_buff *skb)
352{
353 struct l2tp_tunnel *tunnel = session->tunnel;
354 int length = L2TP_SKB_CB(skb)->length;
355
356
357
358
359 skb_orphan(skb);
360
361 tunnel->stats.rx_packets++;
362 tunnel->stats.rx_bytes += length;
363 session->stats.rx_packets++;
364 session->stats.rx_bytes += length;
365
366 if (L2TP_SKB_CB(skb)->has_seq) {
367
368 session->nr++;
369 if (tunnel->version == L2TP_HDR_VER_2)
370 session->nr &= 0xffff;
371 else
372 session->nr &= 0xffffff;
373
374 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
375 "%s: updated nr to %hu\n", session->name, session->nr);
376 }
377
378
379 if (session->recv_skb != NULL)
380 (*session->recv_skb)(session, skb, L2TP_SKB_CB(skb)->length);
381 else
382 kfree_skb(skb);
383
384 if (session->deref)
385 (*session->deref)(session);
386}
387
388
389
390
391static void l2tp_recv_dequeue(struct l2tp_session *session)
392{
393 struct sk_buff *skb;
394 struct sk_buff *tmp;
395
396
397
398
399
400start:
401 spin_lock_bh(&session->reorder_q.lock);
402 skb_queue_walk_safe(&session->reorder_q, skb, tmp) {
403 if (time_after(jiffies, L2TP_SKB_CB(skb)->expires)) {
404 session->stats.rx_seq_discards++;
405 session->stats.rx_errors++;
406 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
407 "%s: oos pkt %u len %d discarded (too old), "
408 "waiting for %u, reorder_q_len=%d\n",
409 session->name, L2TP_SKB_CB(skb)->ns,
410 L2TP_SKB_CB(skb)->length, session->nr,
411 skb_queue_len(&session->reorder_q));
412 __skb_unlink(skb, &session->reorder_q);
413 kfree_skb(skb);
414 if (session->deref)
415 (*session->deref)(session);
416 continue;
417 }
418
419 if (L2TP_SKB_CB(skb)->has_seq) {
420 if (L2TP_SKB_CB(skb)->ns != session->nr) {
421 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
422 "%s: holding oos pkt %u len %d, "
423 "waiting for %u, reorder_q_len=%d\n",
424 session->name, L2TP_SKB_CB(skb)->ns,
425 L2TP_SKB_CB(skb)->length, session->nr,
426 skb_queue_len(&session->reorder_q));
427 goto out;
428 }
429 }
430 __skb_unlink(skb, &session->reorder_q);
431
432
433
434
435 spin_unlock_bh(&session->reorder_q.lock);
436 l2tp_recv_dequeue_skb(session, skb);
437 goto start;
438 }
439
440out:
441 spin_unlock_bh(&session->reorder_q.lock);
442}
443
444static inline int l2tp_verify_udp_checksum(struct sock *sk,
445 struct sk_buff *skb)
446{
447 struct udphdr *uh = udp_hdr(skb);
448 u16 ulen = ntohs(uh->len);
449 struct inet_sock *inet;
450 __wsum psum;
451
452 if (sk->sk_no_check || skb_csum_unnecessary(skb) || !uh->check)
453 return 0;
454
455 inet = inet_sk(sk);
456 psum = csum_tcpudp_nofold(inet->inet_saddr, inet->inet_daddr, ulen,
457 IPPROTO_UDP, 0);
458
459 if ((skb->ip_summed == CHECKSUM_COMPLETE) &&
460 !csum_fold(csum_add(psum, skb->csum)))
461 return 0;
462
463 skb->csum = psum;
464
465 return __skb_checksum_complete(skb);
466}
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
529 unsigned char *ptr, unsigned char *optr, u16 hdrflags,
530 int length, int (*payload_hook)(struct sk_buff *skb))
531{
532 struct l2tp_tunnel *tunnel = session->tunnel;
533 int offset;
534 u32 ns, nr;
535
536
537
538
539
540 l2tp_session_inc_refcount(session);
541 if (session->ref)
542 (*session->ref)(session);
543
544
545 if (session->peer_cookie_len > 0) {
546 if (memcmp(ptr, &session->peer_cookie[0], session->peer_cookie_len)) {
547 PRINTK(tunnel->debug, L2TP_MSG_DATA, KERN_INFO,
548 "%s: cookie mismatch (%u/%u). Discarding.\n",
549 tunnel->name, tunnel->tunnel_id, session->session_id);
550 session->stats.rx_cookie_discards++;
551 goto discard;
552 }
553 ptr += session->peer_cookie_len;
554 }
555
556
557
558
559
560
561
562
563 ns = nr = 0;
564 L2TP_SKB_CB(skb)->has_seq = 0;
565 if (tunnel->version == L2TP_HDR_VER_2) {
566 if (hdrflags & L2TP_HDRFLAG_S) {
567 ns = ntohs(*(__be16 *) ptr);
568 ptr += 2;
569 nr = ntohs(*(__be16 *) ptr);
570 ptr += 2;
571
572
573 L2TP_SKB_CB(skb)->ns = ns;
574 L2TP_SKB_CB(skb)->has_seq = 1;
575
576 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
577 "%s: recv data ns=%u, nr=%u, session nr=%u\n",
578 session->name, ns, nr, session->nr);
579 }
580 } else if (session->l2specific_type == L2TP_L2SPECTYPE_DEFAULT) {
581 u32 l2h = ntohl(*(__be32 *) ptr);
582
583 if (l2h & 0x40000000) {
584 ns = l2h & 0x00ffffff;
585
586
587 L2TP_SKB_CB(skb)->ns = ns;
588 L2TP_SKB_CB(skb)->has_seq = 1;
589
590 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
591 "%s: recv data ns=%u, session nr=%u\n",
592 session->name, ns, session->nr);
593 }
594 }
595
596
597 ptr += session->l2specific_len;
598
599 if (L2TP_SKB_CB(skb)->has_seq) {
600
601
602
603
604 if ((!session->lns_mode) && (!session->send_seq)) {
605 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_INFO,
606 "%s: requested to enable seq numbers by LNS\n",
607 session->name);
608 session->send_seq = -1;
609 l2tp_session_set_header_len(session, tunnel->version);
610 }
611 } else {
612
613
614
615 if (session->recv_seq) {
616 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_WARNING,
617 "%s: recv data has no seq numbers when required. "
618 "Discarding\n", session->name);
619 session->stats.rx_seq_discards++;
620 goto discard;
621 }
622
623
624
625
626
627
628 if ((!session->lns_mode) && (session->send_seq)) {
629 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_INFO,
630 "%s: requested to disable seq numbers by LNS\n",
631 session->name);
632 session->send_seq = 0;
633 l2tp_session_set_header_len(session, tunnel->version);
634 } else if (session->send_seq) {
635 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_WARNING,
636 "%s: recv data has no seq numbers when required. "
637 "Discarding\n", session->name);
638 session->stats.rx_seq_discards++;
639 goto discard;
640 }
641 }
642
643
644
645
646
647
648 if (tunnel->version == L2TP_HDR_VER_2) {
649
650 if (hdrflags & L2TP_HDRFLAG_O) {
651 offset = ntohs(*(__be16 *)ptr);
652 ptr += 2 + offset;
653 }
654 } else
655 ptr += session->offset;
656
657 offset = ptr - optr;
658 if (!pskb_may_pull(skb, offset))
659 goto discard;
660
661 __skb_pull(skb, offset);
662
663
664
665
666 if (payload_hook)
667 if ((*payload_hook)(skb))
668 goto discard;
669
670
671
672
673
674 L2TP_SKB_CB(skb)->length = length;
675 L2TP_SKB_CB(skb)->expires = jiffies +
676 (session->reorder_timeout ? session->reorder_timeout : HZ);
677
678
679
680
681 if (L2TP_SKB_CB(skb)->has_seq) {
682 if (session->reorder_timeout != 0) {
683
684
685
686 l2tp_recv_queue_skb(session, skb);
687 } else {
688
689
690
691 if (L2TP_SKB_CB(skb)->ns != session->nr) {
692 session->stats.rx_seq_discards++;
693 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
694 "%s: oos pkt %u len %d discarded, "
695 "waiting for %u, reorder_q_len=%d\n",
696 session->name, L2TP_SKB_CB(skb)->ns,
697 L2TP_SKB_CB(skb)->length, session->nr,
698 skb_queue_len(&session->reorder_q));
699 goto discard;
700 }
701 skb_queue_tail(&session->reorder_q, skb);
702 }
703 } else {
704
705
706
707
708 skb_queue_tail(&session->reorder_q, skb);
709 }
710
711
712 l2tp_recv_dequeue(session);
713
714 l2tp_session_dec_refcount(session);
715
716 return;
717
718discard:
719 session->stats.rx_errors++;
720 kfree_skb(skb);
721
722 if (session->deref)
723 (*session->deref)(session);
724
725 l2tp_session_dec_refcount(session);
726}
727EXPORT_SYMBOL(l2tp_recv_common);
728
729
730
731
732
733
734
735static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb,
736 int (*payload_hook)(struct sk_buff *skb))
737{
738 struct l2tp_session *session = NULL;
739 unsigned char *ptr, *optr;
740 u16 hdrflags;
741 u32 tunnel_id, session_id;
742 int offset;
743 u16 version;
744 int length;
745
746 if (tunnel->sock && l2tp_verify_udp_checksum(tunnel->sock, skb))
747 goto discard_bad_csum;
748
749
750 __skb_pull(skb, sizeof(struct udphdr));
751
752
753 if (!pskb_may_pull(skb, L2TP_HDR_SIZE_SEQ)) {
754 PRINTK(tunnel->debug, L2TP_MSG_DATA, KERN_INFO,
755 "%s: recv short packet (len=%d)\n", tunnel->name, skb->len);
756 goto error;
757 }
758
759
760 if (tunnel->debug & L2TP_MSG_DATA) {
761 length = min(32u, skb->len);
762 if (!pskb_may_pull(skb, length))
763 goto error;
764
765 printk(KERN_DEBUG "%s: recv: ", tunnel->name);
766
767 offset = 0;
768 do {
769 printk(" %02X", skb->data[offset]);
770 } while (++offset < length);
771
772 printk("\n");
773 }
774
775
776 optr = ptr = skb->data;
777
778
779 hdrflags = ntohs(*(__be16 *) ptr);
780
781
782 version = hdrflags & L2TP_HDR_VER_MASK;
783 if (version != tunnel->version) {
784 PRINTK(tunnel->debug, L2TP_MSG_DATA, KERN_INFO,
785 "%s: recv protocol version mismatch: got %d expected %d\n",
786 tunnel->name, version, tunnel->version);
787 goto error;
788 }
789
790
791 length = skb->len;
792
793
794 if (hdrflags & L2TP_HDRFLAG_T) {
795 PRINTK(tunnel->debug, L2TP_MSG_DATA, KERN_DEBUG,
796 "%s: recv control packet, len=%d\n", tunnel->name, length);
797 goto error;
798 }
799
800
801 ptr += 2;
802
803 if (tunnel->version == L2TP_HDR_VER_2) {
804
805 if (hdrflags & L2TP_HDRFLAG_L)
806 ptr += 2;
807
808
809 tunnel_id = ntohs(*(__be16 *) ptr);
810 ptr += 2;
811 session_id = ntohs(*(__be16 *) ptr);
812 ptr += 2;
813 } else {
814 ptr += 2;
815 tunnel_id = tunnel->tunnel_id;
816 session_id = ntohl(*(__be32 *) ptr);
817 ptr += 4;
818 }
819
820
821 session = l2tp_session_find(tunnel->l2tp_net, tunnel, session_id);
822 if (!session || !session->recv_skb) {
823
824 PRINTK(tunnel->debug, L2TP_MSG_DATA, KERN_INFO,
825 "%s: no session found (%u/%u). Passing up.\n",
826 tunnel->name, tunnel_id, session_id);
827 goto error;
828 }
829
830 l2tp_recv_common(session, skb, ptr, optr, hdrflags, length, payload_hook);
831
832 return 0;
833
834discard_bad_csum:
835 LIMIT_NETDEBUG("%s: UDP: bad checksum\n", tunnel->name);
836 UDP_INC_STATS_USER(tunnel->l2tp_net, UDP_MIB_INERRORS, 0);
837 tunnel->stats.rx_errors++;
838 kfree_skb(skb);
839
840 return 0;
841
842error:
843
844 __skb_push(skb, sizeof(struct udphdr));
845
846 return 1;
847}
848
849
850
851
852
853
854
855int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
856{
857 struct l2tp_tunnel *tunnel;
858
859 tunnel = l2tp_sock_to_tunnel(sk);
860 if (tunnel == NULL)
861 goto pass_up;
862
863 PRINTK(tunnel->debug, L2TP_MSG_DATA, KERN_DEBUG,
864 "%s: received %d bytes\n", tunnel->name, skb->len);
865
866 if (l2tp_udp_recv_core(tunnel, skb, tunnel->recv_payload_hook))
867 goto pass_up_put;
868
869 sock_put(sk);
870 return 0;
871
872pass_up_put:
873 sock_put(sk);
874pass_up:
875 return 1;
876}
877EXPORT_SYMBOL_GPL(l2tp_udp_encap_recv);
878
879
880
881
882
883
884
885static int l2tp_build_l2tpv2_header(struct l2tp_session *session, void *buf)
886{
887 struct l2tp_tunnel *tunnel = session->tunnel;
888 __be16 *bufp = buf;
889 __be16 *optr = buf;
890 u16 flags = L2TP_HDR_VER_2;
891 u32 tunnel_id = tunnel->peer_tunnel_id;
892 u32 session_id = session->peer_session_id;
893
894 if (session->send_seq)
895 flags |= L2TP_HDRFLAG_S;
896
897
898 *bufp++ = htons(flags);
899 *bufp++ = htons(tunnel_id);
900 *bufp++ = htons(session_id);
901 if (session->send_seq) {
902 *bufp++ = htons(session->ns);
903 *bufp++ = 0;
904 session->ns++;
905 session->ns &= 0xffff;
906 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
907 "%s: updated ns to %u\n", session->name, session->ns);
908 }
909
910 return bufp - optr;
911}
912
913static int l2tp_build_l2tpv3_header(struct l2tp_session *session, void *buf)
914{
915 struct l2tp_tunnel *tunnel = session->tunnel;
916 char *bufp = buf;
917 char *optr = bufp;
918
919
920
921
922 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) {
923 u16 flags = L2TP_HDR_VER_3;
924 *((__be16 *) bufp) = htons(flags);
925 bufp += 2;
926 *((__be16 *) bufp) = 0;
927 bufp += 2;
928 }
929
930 *((__be32 *) bufp) = htonl(session->peer_session_id);
931 bufp += 4;
932 if (session->cookie_len) {
933 memcpy(bufp, &session->cookie[0], session->cookie_len);
934 bufp += session->cookie_len;
935 }
936 if (session->l2specific_len) {
937 if (session->l2specific_type == L2TP_L2SPECTYPE_DEFAULT) {
938 u32 l2h = 0;
939 if (session->send_seq) {
940 l2h = 0x40000000 | session->ns;
941 session->ns++;
942 session->ns &= 0xffffff;
943 PRINTK(session->debug, L2TP_MSG_SEQ, KERN_DEBUG,
944 "%s: updated ns to %u\n", session->name, session->ns);
945 }
946
947 *((__be32 *) bufp) = htonl(l2h);
948 }
949 bufp += session->l2specific_len;
950 }
951 if (session->offset)
952 bufp += session->offset;
953
954 return bufp - optr;
955}
956
957static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb,
958 struct flowi *fl, size_t data_len)
959{
960 struct l2tp_tunnel *tunnel = session->tunnel;
961 unsigned int len = skb->len;
962 int error;
963
964
965 if (session->send_seq)
966 PRINTK(session->debug, L2TP_MSG_DATA, KERN_DEBUG,
967 "%s: send %Zd bytes, ns=%u\n", session->name,
968 data_len, session->ns - 1);
969 else
970 PRINTK(session->debug, L2TP_MSG_DATA, KERN_DEBUG,
971 "%s: send %Zd bytes\n", session->name, data_len);
972
973 if (session->debug & L2TP_MSG_DATA) {
974 int i;
975 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0;
976 unsigned char *datap = skb->data + uhlen;
977
978 printk(KERN_DEBUG "%s: xmit:", session->name);
979 for (i = 0; i < (len - uhlen); i++) {
980 printk(" %02X", *datap++);
981 if (i == 31) {
982 printk(" ...");
983 break;
984 }
985 }
986 printk("\n");
987 }
988
989
990 skb->local_df = 1;
991 error = ip_queue_xmit(skb, fl);
992
993
994 if (error >= 0) {
995 tunnel->stats.tx_packets++;
996 tunnel->stats.tx_bytes += len;
997 session->stats.tx_packets++;
998 session->stats.tx_bytes += len;
999 } else {
1000 tunnel->stats.tx_errors++;
1001 session->stats.tx_errors++;
1002 }
1003
1004 return 0;
1005}
1006
1007
1008
1009static void l2tp_sock_wfree(struct sk_buff *skb)
1010{
1011 sock_put(skb->sk);
1012}
1013
1014
1015
1016
1017static inline void l2tp_skb_set_owner_w(struct sk_buff *skb, struct sock *sk)
1018{
1019 sock_hold(sk);
1020 skb->sk = sk;
1021 skb->destructor = l2tp_sock_wfree;
1022}
1023
1024
1025
1026
1027int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len)
1028{
1029 int data_len = skb->len;
1030 struct l2tp_tunnel *tunnel = session->tunnel;
1031 struct sock *sk = tunnel->sock;
1032 struct flowi *fl;
1033 struct udphdr *uh;
1034 struct inet_sock *inet;
1035 __wsum csum;
1036 int old_headroom;
1037 int new_headroom;
1038 int headroom;
1039 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0;
1040 int udp_len;
1041
1042
1043
1044
1045
1046 headroom = NET_SKB_PAD + sizeof(struct iphdr) +
1047 uhlen + hdr_len;
1048 old_headroom = skb_headroom(skb);
1049 if (skb_cow_head(skb, headroom)) {
1050 dev_kfree_skb(skb);
1051 goto abort;
1052 }
1053
1054 new_headroom = skb_headroom(skb);
1055 skb_orphan(skb);
1056 skb->truesize += new_headroom - old_headroom;
1057
1058
1059 session->build_header(session, __skb_push(skb, hdr_len));
1060
1061
1062 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
1063 IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
1064 IPSKB_REROUTED);
1065 nf_reset(skb);
1066
1067 bh_lock_sock(sk);
1068 if (sock_owned_by_user(sk)) {
1069 dev_kfree_skb(skb);
1070 goto out_unlock;
1071 }
1072
1073
1074 skb_dst_drop(skb);
1075 skb_dst_set(skb, dst_clone(__sk_dst_check(sk, 0)));
1076
1077 inet = inet_sk(sk);
1078 fl = &inet->cork.fl;
1079 switch (tunnel->encap) {
1080 case L2TP_ENCAPTYPE_UDP:
1081
1082 __skb_push(skb, sizeof(*uh));
1083 skb_reset_transport_header(skb);
1084 uh = udp_hdr(skb);
1085 uh->source = inet->inet_sport;
1086 uh->dest = inet->inet_dport;
1087 udp_len = uhlen + hdr_len + data_len;
1088 uh->len = htons(udp_len);
1089 uh->check = 0;
1090
1091
1092 if (sk->sk_no_check == UDP_CSUM_NOXMIT)
1093 skb->ip_summed = CHECKSUM_NONE;
1094 else if ((skb_dst(skb) && skb_dst(skb)->dev) &&
1095 (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) {
1096 skb->ip_summed = CHECKSUM_COMPLETE;
1097 csum = skb_checksum(skb, 0, udp_len, 0);
1098 uh->check = csum_tcpudp_magic(inet->inet_saddr,
1099 inet->inet_daddr,
1100 udp_len, IPPROTO_UDP, csum);
1101 if (uh->check == 0)
1102 uh->check = CSUM_MANGLED_0;
1103 } else {
1104 skb->ip_summed = CHECKSUM_PARTIAL;
1105 skb->csum_start = skb_transport_header(skb) - skb->head;
1106 skb->csum_offset = offsetof(struct udphdr, check);
1107 uh->check = ~csum_tcpudp_magic(inet->inet_saddr,
1108 inet->inet_daddr,
1109 udp_len, IPPROTO_UDP, 0);
1110 }
1111 break;
1112
1113 case L2TP_ENCAPTYPE_IP:
1114 break;
1115 }
1116
1117 l2tp_skb_set_owner_w(skb, sk);
1118
1119 l2tp_xmit_core(session, skb, fl, data_len);
1120out_unlock:
1121 bh_unlock_sock(sk);
1122
1123abort:
1124 return 0;
1125}
1126EXPORT_SYMBOL_GPL(l2tp_xmit_skb);
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136static void l2tp_tunnel_destruct(struct sock *sk)
1137{
1138 struct l2tp_tunnel *tunnel;
1139
1140 tunnel = sk->sk_user_data;
1141 if (tunnel == NULL)
1142 goto end;
1143
1144 PRINTK(tunnel->debug, L2TP_MSG_CONTROL, KERN_INFO,
1145 "%s: closing...\n", tunnel->name);
1146
1147
1148 l2tp_tunnel_closeall(tunnel);
1149
1150 switch (tunnel->encap) {
1151 case L2TP_ENCAPTYPE_UDP:
1152
1153 (udp_sk(sk))->encap_type = 0;
1154 (udp_sk(sk))->encap_rcv = NULL;
1155 break;
1156 case L2TP_ENCAPTYPE_IP:
1157 break;
1158 }
1159
1160
1161 tunnel->sock = NULL;
1162 sk->sk_destruct = tunnel->old_sk_destruct;
1163 sk->sk_user_data = NULL;
1164
1165
1166 if (sk->sk_destruct)
1167 (*sk->sk_destruct)(sk);
1168
1169
1170 l2tp_tunnel_dec_refcount(tunnel);
1171
1172end:
1173 return;
1174}
1175
1176
1177
1178static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel)
1179{
1180 int hash;
1181 struct hlist_node *walk;
1182 struct hlist_node *tmp;
1183 struct l2tp_session *session;
1184
1185 BUG_ON(tunnel == NULL);
1186
1187 PRINTK(tunnel->debug, L2TP_MSG_CONTROL, KERN_INFO,
1188 "%s: closing all sessions...\n", tunnel->name);
1189
1190 write_lock_bh(&tunnel->hlist_lock);
1191 for (hash = 0; hash < L2TP_HASH_SIZE; hash++) {
1192again:
1193 hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) {
1194 session = hlist_entry(walk, struct l2tp_session, hlist);
1195
1196 PRINTK(session->debug, L2TP_MSG_CONTROL, KERN_INFO,
1197 "%s: closing session\n", session->name);
1198
1199 hlist_del_init(&session->hlist);
1200
1201
1202
1203
1204
1205
1206
1207 if (session->ref != NULL)
1208 (*session->ref)(session);
1209
1210 write_unlock_bh(&tunnel->hlist_lock);
1211
1212 if (tunnel->version != L2TP_HDR_VER_2) {
1213 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net);
1214
1215 spin_lock_bh(&pn->l2tp_session_hlist_lock);
1216 hlist_del_init_rcu(&session->global_hlist);
1217 spin_unlock_bh(&pn->l2tp_session_hlist_lock);
1218 synchronize_rcu();
1219 }
1220
1221 if (session->session_close != NULL)
1222 (*session->session_close)(session);
1223
1224 if (session->deref != NULL)
1225 (*session->deref)(session);
1226
1227 write_lock_bh(&tunnel->hlist_lock);
1228
1229
1230
1231
1232
1233
1234 goto again;
1235 }
1236 }
1237 write_unlock_bh(&tunnel->hlist_lock);
1238}
1239
1240
1241
1242
1243static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel)
1244{
1245 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net);
1246
1247 BUG_ON(atomic_read(&tunnel->ref_count) != 0);
1248 BUG_ON(tunnel->sock != NULL);
1249
1250 PRINTK(tunnel->debug, L2TP_MSG_CONTROL, KERN_INFO,
1251 "%s: free...\n", tunnel->name);
1252
1253
1254 spin_lock_bh(&pn->l2tp_tunnel_list_lock);
1255 list_del_rcu(&tunnel->list);
1256 spin_unlock_bh(&pn->l2tp_tunnel_list_lock);
1257 synchronize_rcu();
1258
1259 atomic_dec(&l2tp_tunnel_count);
1260 kfree(tunnel);
1261}
1262
1263
1264
1265
1266
1267static int l2tp_tunnel_sock_create(u32 tunnel_id, u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg, struct socket **sockp)
1268{
1269 int err = -EINVAL;
1270 struct sockaddr_in udp_addr;
1271 struct sockaddr_l2tpip ip_addr;
1272 struct socket *sock = NULL;
1273
1274 switch (cfg->encap) {
1275 case L2TP_ENCAPTYPE_UDP:
1276 err = sock_create(AF_INET, SOCK_DGRAM, 0, sockp);
1277 if (err < 0)
1278 goto out;
1279
1280 sock = *sockp;
1281
1282 memset(&udp_addr, 0, sizeof(udp_addr));
1283 udp_addr.sin_family = AF_INET;
1284 udp_addr.sin_addr = cfg->local_ip;
1285 udp_addr.sin_port = htons(cfg->local_udp_port);
1286 err = kernel_bind(sock, (struct sockaddr *) &udp_addr, sizeof(udp_addr));
1287 if (err < 0)
1288 goto out;
1289
1290 udp_addr.sin_family = AF_INET;
1291 udp_addr.sin_addr = cfg->peer_ip;
1292 udp_addr.sin_port = htons(cfg->peer_udp_port);
1293 err = kernel_connect(sock, (struct sockaddr *) &udp_addr, sizeof(udp_addr), 0);
1294 if (err < 0)
1295 goto out;
1296
1297 if (!cfg->use_udp_checksums)
1298 sock->sk->sk_no_check = UDP_CSUM_NOXMIT;
1299
1300 break;
1301
1302 case L2TP_ENCAPTYPE_IP:
1303 err = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_L2TP, sockp);
1304 if (err < 0)
1305 goto out;
1306
1307 sock = *sockp;
1308
1309 memset(&ip_addr, 0, sizeof(ip_addr));
1310 ip_addr.l2tp_family = AF_INET;
1311 ip_addr.l2tp_addr = cfg->local_ip;
1312 ip_addr.l2tp_conn_id = tunnel_id;
1313 err = kernel_bind(sock, (struct sockaddr *) &ip_addr, sizeof(ip_addr));
1314 if (err < 0)
1315 goto out;
1316
1317 ip_addr.l2tp_family = AF_INET;
1318 ip_addr.l2tp_addr = cfg->peer_ip;
1319 ip_addr.l2tp_conn_id = peer_tunnel_id;
1320 err = kernel_connect(sock, (struct sockaddr *) &ip_addr, sizeof(ip_addr), 0);
1321 if (err < 0)
1322 goto out;
1323
1324 break;
1325
1326 default:
1327 goto out;
1328 }
1329
1330out:
1331 if ((err < 0) && sock) {
1332 sock_release(sock);
1333 *sockp = NULL;
1334 }
1335
1336 return err;
1337}
1338
1339int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg, struct l2tp_tunnel **tunnelp)
1340{
1341 struct l2tp_tunnel *tunnel = NULL;
1342 int err;
1343 struct socket *sock = NULL;
1344 struct sock *sk = NULL;
1345 struct l2tp_net *pn;
1346 enum l2tp_encap_type encap = L2TP_ENCAPTYPE_UDP;
1347
1348
1349
1350
1351
1352 if (fd < 0) {
1353 err = l2tp_tunnel_sock_create(tunnel_id, peer_tunnel_id, cfg, &sock);
1354 if (err < 0)
1355 goto err;
1356 } else {
1357 err = -EBADF;
1358 sock = sockfd_lookup(fd, &err);
1359 if (!sock) {
1360 printk(KERN_ERR "tunl %hu: sockfd_lookup(fd=%d) returned %d\n",
1361 tunnel_id, fd, err);
1362 goto err;
1363 }
1364 }
1365
1366 sk = sock->sk;
1367
1368 if (cfg != NULL)
1369 encap = cfg->encap;
1370
1371
1372 switch (encap) {
1373 case L2TP_ENCAPTYPE_UDP:
1374 err = -EPROTONOSUPPORT;
1375 if (sk->sk_protocol != IPPROTO_UDP) {
1376 printk(KERN_ERR "tunl %hu: fd %d wrong protocol, got %d, expected %d\n",
1377 tunnel_id, fd, sk->sk_protocol, IPPROTO_UDP);
1378 goto err;
1379 }
1380 break;
1381 case L2TP_ENCAPTYPE_IP:
1382 err = -EPROTONOSUPPORT;
1383 if (sk->sk_protocol != IPPROTO_L2TP) {
1384 printk(KERN_ERR "tunl %hu: fd %d wrong protocol, got %d, expected %d\n",
1385 tunnel_id, fd, sk->sk_protocol, IPPROTO_L2TP);
1386 goto err;
1387 }
1388 break;
1389 }
1390
1391
1392 tunnel = (struct l2tp_tunnel *)sk->sk_user_data;
1393 if (tunnel != NULL) {
1394
1395 err = -EBUSY;
1396 goto err;
1397 }
1398
1399 tunnel = kzalloc(sizeof(struct l2tp_tunnel), GFP_KERNEL);
1400 if (tunnel == NULL) {
1401 err = -ENOMEM;
1402 goto err;
1403 }
1404
1405 tunnel->version = version;
1406 tunnel->tunnel_id = tunnel_id;
1407 tunnel->peer_tunnel_id = peer_tunnel_id;
1408 tunnel->debug = L2TP_DEFAULT_DEBUG_FLAGS;
1409
1410 tunnel->magic = L2TP_TUNNEL_MAGIC;
1411 sprintf(&tunnel->name[0], "tunl %u", tunnel_id);
1412 rwlock_init(&tunnel->hlist_lock);
1413
1414
1415 tunnel->l2tp_net = net;
1416 pn = l2tp_pernet(net);
1417
1418 if (cfg != NULL)
1419 tunnel->debug = cfg->debug;
1420
1421
1422 tunnel->encap = encap;
1423 if (encap == L2TP_ENCAPTYPE_UDP) {
1424
1425 udp_sk(sk)->encap_type = UDP_ENCAP_L2TPINUDP;
1426 udp_sk(sk)->encap_rcv = l2tp_udp_encap_recv;
1427 }
1428
1429 sk->sk_user_data = tunnel;
1430
1431
1432
1433
1434 tunnel->old_sk_destruct = sk->sk_destruct;
1435 sk->sk_destruct = &l2tp_tunnel_destruct;
1436 tunnel->sock = sk;
1437 sk->sk_allocation = GFP_ATOMIC;
1438
1439
1440 INIT_LIST_HEAD(&tunnel->list);
1441 atomic_inc(&l2tp_tunnel_count);
1442
1443
1444
1445
1446 l2tp_tunnel_inc_refcount(tunnel);
1447 spin_lock_bh(&pn->l2tp_tunnel_list_lock);
1448 list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list);
1449 spin_unlock_bh(&pn->l2tp_tunnel_list_lock);
1450
1451 err = 0;
1452err:
1453 if (tunnelp)
1454 *tunnelp = tunnel;
1455
1456
1457
1458
1459 if (sock && sock->file)
1460 sockfd_put(sock);
1461
1462 return err;
1463}
1464EXPORT_SYMBOL_GPL(l2tp_tunnel_create);
1465
1466
1467
1468int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel)
1469{
1470 int err = 0;
1471 struct socket *sock = tunnel->sock ? tunnel->sock->sk_socket : NULL;
1472
1473
1474
1475
1476
1477 if (sock != NULL) {
1478 err = inet_shutdown(sock, 2);
1479
1480
1481
1482
1483
1484 if (sock->file == NULL)
1485 err = inet_release(sock);
1486 }
1487
1488 return err;
1489}
1490EXPORT_SYMBOL_GPL(l2tp_tunnel_delete);
1491
1492
1493
1494void l2tp_session_free(struct l2tp_session *session)
1495{
1496 struct l2tp_tunnel *tunnel;
1497
1498 BUG_ON(atomic_read(&session->ref_count) != 0);
1499
1500 tunnel = session->tunnel;
1501 if (tunnel != NULL) {
1502 BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC);
1503
1504
1505 write_lock_bh(&tunnel->hlist_lock);
1506 hlist_del_init(&session->hlist);
1507 write_unlock_bh(&tunnel->hlist_lock);
1508
1509
1510 if (tunnel->version != L2TP_HDR_VER_2) {
1511 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net);
1512
1513 spin_lock_bh(&pn->l2tp_session_hlist_lock);
1514 hlist_del_init_rcu(&session->global_hlist);
1515 spin_unlock_bh(&pn->l2tp_session_hlist_lock);
1516 synchronize_rcu();
1517 }
1518
1519 if (session->session_id != 0)
1520 atomic_dec(&l2tp_session_count);
1521
1522 sock_put(tunnel->sock);
1523
1524
1525
1526
1527 session->tunnel = NULL;
1528 l2tp_tunnel_dec_refcount(tunnel);
1529 }
1530
1531 kfree(session);
1532
1533 return;
1534}
1535EXPORT_SYMBOL_GPL(l2tp_session_free);
1536
1537
1538
1539
1540int l2tp_session_delete(struct l2tp_session *session)
1541{
1542 if (session->session_close != NULL)
1543 (*session->session_close)(session);
1544
1545 l2tp_session_dec_refcount(session);
1546
1547 return 0;
1548}
1549EXPORT_SYMBOL_GPL(l2tp_session_delete);
1550
1551
1552
1553
1554
1555static void l2tp_session_set_header_len(struct l2tp_session *session, int version)
1556{
1557 if (version == L2TP_HDR_VER_2) {
1558 session->hdr_len = 6;
1559 if (session->send_seq)
1560 session->hdr_len += 4;
1561 } else {
1562 session->hdr_len = 4 + session->cookie_len + session->l2specific_len + session->offset;
1563 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP)
1564 session->hdr_len += 4;
1565 }
1566
1567}
1568
1569struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id, u32 peer_session_id, struct l2tp_session_cfg *cfg)
1570{
1571 struct l2tp_session *session;
1572
1573 session = kzalloc(sizeof(struct l2tp_session) + priv_size, GFP_KERNEL);
1574 if (session != NULL) {
1575 session->magic = L2TP_SESSION_MAGIC;
1576 session->tunnel = tunnel;
1577
1578 session->session_id = session_id;
1579 session->peer_session_id = peer_session_id;
1580 session->nr = 1;
1581
1582 sprintf(&session->name[0], "sess %u/%u",
1583 tunnel->tunnel_id, session->session_id);
1584
1585 skb_queue_head_init(&session->reorder_q);
1586
1587 INIT_HLIST_NODE(&session->hlist);
1588 INIT_HLIST_NODE(&session->global_hlist);
1589
1590
1591 session->debug = tunnel->debug;
1592
1593 if (cfg) {
1594 session->pwtype = cfg->pw_type;
1595 session->debug = cfg->debug;
1596 session->mtu = cfg->mtu;
1597 session->mru = cfg->mru;
1598 session->send_seq = cfg->send_seq;
1599 session->recv_seq = cfg->recv_seq;
1600 session->lns_mode = cfg->lns_mode;
1601 session->reorder_timeout = cfg->reorder_timeout;
1602 session->offset = cfg->offset;
1603 session->l2specific_type = cfg->l2specific_type;
1604 session->l2specific_len = cfg->l2specific_len;
1605 session->cookie_len = cfg->cookie_len;
1606 memcpy(&session->cookie[0], &cfg->cookie[0], cfg->cookie_len);
1607 session->peer_cookie_len = cfg->peer_cookie_len;
1608 memcpy(&session->peer_cookie[0], &cfg->peer_cookie[0], cfg->peer_cookie_len);
1609 }
1610
1611 if (tunnel->version == L2TP_HDR_VER_2)
1612 session->build_header = l2tp_build_l2tpv2_header;
1613 else
1614 session->build_header = l2tp_build_l2tpv3_header;
1615
1616 l2tp_session_set_header_len(session, tunnel->version);
1617
1618
1619
1620
1621 l2tp_session_inc_refcount(session);
1622 l2tp_tunnel_inc_refcount(tunnel);
1623
1624
1625 sock_hold(tunnel->sock);
1626
1627
1628 write_lock_bh(&tunnel->hlist_lock);
1629 hlist_add_head(&session->hlist,
1630 l2tp_session_id_hash(tunnel, session_id));
1631 write_unlock_bh(&tunnel->hlist_lock);
1632
1633
1634 if (tunnel->version != L2TP_HDR_VER_2) {
1635 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net);
1636
1637 spin_lock_bh(&pn->l2tp_session_hlist_lock);
1638 hlist_add_head_rcu(&session->global_hlist,
1639 l2tp_session_id_hash_2(pn, session_id));
1640 spin_unlock_bh(&pn->l2tp_session_hlist_lock);
1641 }
1642
1643
1644 if (session->session_id != 0)
1645 atomic_inc(&l2tp_session_count);
1646 }
1647
1648 return session;
1649}
1650EXPORT_SYMBOL_GPL(l2tp_session_create);
1651
1652
1653
1654
1655
1656static __net_init int l2tp_init_net(struct net *net)
1657{
1658 struct l2tp_net *pn = net_generic(net, l2tp_net_id);
1659 int hash;
1660
1661 INIT_LIST_HEAD(&pn->l2tp_tunnel_list);
1662 spin_lock_init(&pn->l2tp_tunnel_list_lock);
1663
1664 for (hash = 0; hash < L2TP_HASH_SIZE_2; hash++)
1665 INIT_HLIST_HEAD(&pn->l2tp_session_hlist[hash]);
1666
1667 spin_lock_init(&pn->l2tp_session_hlist_lock);
1668
1669 return 0;
1670}
1671
1672static struct pernet_operations l2tp_net_ops = {
1673 .init = l2tp_init_net,
1674 .id = &l2tp_net_id,
1675 .size = sizeof(struct l2tp_net),
1676};
1677
1678static int __init l2tp_init(void)
1679{
1680 int rc = 0;
1681
1682 rc = register_pernet_device(&l2tp_net_ops);
1683 if (rc)
1684 goto out;
1685
1686 printk(KERN_INFO "L2TP core driver, %s\n", L2TP_DRV_VERSION);
1687
1688out:
1689 return rc;
1690}
1691
1692static void __exit l2tp_exit(void)
1693{
1694 unregister_pernet_device(&l2tp_net_ops);
1695}
1696
1697module_init(l2tp_init);
1698module_exit(l2tp_exit);
1699
1700MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
1701MODULE_DESCRIPTION("L2TP core");
1702MODULE_LICENSE("GPL");
1703MODULE_VERSION(L2TP_DRV_VERSION);
1704
1705