1
2
3
4
5
6
7
8
9
10
11
12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13
14#include <linux/icmp.h>
15#include <linux/module.h>
16#include <linux/skbuff.h>
17#include <linux/random.h>
18#include <linux/socket.h>
19#include <linux/l2tp.h>
20#include <linux/in.h>
21#include <linux/in6.h>
22#include <net/sock.h>
23#include <net/ip.h>
24#include <net/icmp.h>
25#include <net/udp.h>
26#include <net/inet_common.h>
27#include <net/inet_hashtables.h>
28#include <net/inet6_hashtables.h>
29#include <net/tcp_states.h>
30#include <net/protocol.h>
31#include <net/xfrm.h>
32
33#include <net/transp_v6.h>
34#include <net/addrconf.h>
35#include <net/ip6_route.h>
36
37#include "l2tp_core.h"
38
39struct l2tp_ip6_sock {
40
41 struct inet_sock inet;
42
43 u32 conn_id;
44 u32 peer_conn_id;
45
46
47
48 struct ipv6_pinfo inet6;
49};
50
51static DEFINE_RWLOCK(l2tp_ip6_lock);
52static struct hlist_head l2tp_ip6_table;
53static struct hlist_head l2tp_ip6_bind_table;
54
55static inline struct l2tp_ip6_sock *l2tp_ip6_sk(const struct sock *sk)
56{
57 return (struct l2tp_ip6_sock *)sk;
58}
59
60static struct sock *__l2tp_ip6_bind_lookup(const struct net *net,
61 const struct in6_addr *laddr,
62 const struct in6_addr *raddr,
63 int dif, u32 tunnel_id)
64{
65 struct sock *sk;
66
67 sk_for_each_bound(sk, &l2tp_ip6_bind_table) {
68 const struct in6_addr *sk_laddr = inet6_rcv_saddr(sk);
69 const struct in6_addr *sk_raddr = &sk->sk_v6_daddr;
70 const struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk);
71
72 if (!net_eq(sock_net(sk), net))
73 continue;
74
75 if (sk->sk_bound_dev_if && dif && sk->sk_bound_dev_if != dif)
76 continue;
77
78 if (sk_laddr && !ipv6_addr_any(sk_laddr) &&
79 !ipv6_addr_any(laddr) && !ipv6_addr_equal(sk_laddr, laddr))
80 continue;
81
82 if (!ipv6_addr_any(sk_raddr) && raddr &&
83 !ipv6_addr_any(raddr) && !ipv6_addr_equal(sk_raddr, raddr))
84 continue;
85
86 if (l2tp->conn_id != tunnel_id)
87 continue;
88
89 goto found;
90 }
91
92 sk = NULL;
93found:
94 return sk;
95}
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130static int l2tp_ip6_recv(struct sk_buff *skb)
131{
132 struct net *net = dev_net(skb->dev);
133 struct sock *sk;
134 u32 session_id;
135 u32 tunnel_id;
136 unsigned char *ptr, *optr;
137 struct l2tp_session *session;
138 struct l2tp_tunnel *tunnel = NULL;
139 struct ipv6hdr *iph;
140 int length;
141
142 if (!pskb_may_pull(skb, 4))
143 goto discard;
144
145
146 optr = ptr = skb->data;
147 session_id = ntohl(*((__be32 *) ptr));
148 ptr += 4;
149
150
151
152
153
154 if (session_id == 0) {
155 __skb_pull(skb, 4);
156 goto pass_up;
157 }
158
159
160 session = l2tp_session_get(net, NULL, session_id);
161 if (!session)
162 goto discard;
163
164 tunnel = session->tunnel;
165 if (!tunnel)
166 goto discard_sess;
167
168
169 if (tunnel->debug & L2TP_MSG_DATA) {
170 length = min(32u, skb->len);
171 if (!pskb_may_pull(skb, length))
172 goto discard_sess;
173
174
175 optr = ptr = skb->data;
176 ptr += 4;
177 pr_debug("%s: ip recv\n", tunnel->name);
178 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length);
179 }
180
181 if (l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr))
182 goto discard_sess;
183
184 l2tp_recv_common(session, skb, ptr, optr, 0, skb->len);
185 l2tp_session_dec_refcount(session);
186
187 return 0;
188
189pass_up:
190
191 if (!pskb_may_pull(skb, 12))
192 goto discard;
193
194 if ((skb->data[0] & 0xc0) != 0xc0)
195 goto discard;
196
197 tunnel_id = ntohl(*(__be32 *) &skb->data[4]);
198 iph = ipv6_hdr(skb);
199
200 read_lock_bh(&l2tp_ip6_lock);
201 sk = __l2tp_ip6_bind_lookup(net, &iph->daddr, &iph->saddr,
202 inet6_iif(skb), tunnel_id);
203 if (!sk) {
204 read_unlock_bh(&l2tp_ip6_lock);
205 goto discard;
206 }
207 sock_hold(sk);
208 read_unlock_bh(&l2tp_ip6_lock);
209
210 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
211 goto discard_put;
212
213 nf_reset(skb);
214
215 return sk_receive_skb(sk, skb, 1);
216
217discard_sess:
218 l2tp_session_dec_refcount(session);
219 goto discard;
220
221discard_put:
222 sock_put(sk);
223
224discard:
225 kfree_skb(skb);
226 return 0;
227}
228
229static int l2tp_ip6_open(struct sock *sk)
230{
231
232 inet_sk(sk)->inet_num = IPPROTO_L2TP;
233
234 write_lock_bh(&l2tp_ip6_lock);
235 sk_add_node(sk, &l2tp_ip6_table);
236 write_unlock_bh(&l2tp_ip6_lock);
237
238 return 0;
239}
240
241static void l2tp_ip6_close(struct sock *sk, long timeout)
242{
243 write_lock_bh(&l2tp_ip6_lock);
244 hlist_del_init(&sk->sk_bind_node);
245 sk_del_node_init(sk);
246 write_unlock_bh(&l2tp_ip6_lock);
247
248 sk_common_release(sk);
249}
250
251static void l2tp_ip6_destroy_sock(struct sock *sk)
252{
253 struct l2tp_tunnel *tunnel = sk->sk_user_data;
254
255 lock_sock(sk);
256 ip6_flush_pending_frames(sk);
257 release_sock(sk);
258
259 if (tunnel)
260 l2tp_tunnel_delete(tunnel);
261
262 inet6_destroy_sock(sk);
263}
264
265static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
266{
267 struct inet_sock *inet = inet_sk(sk);
268 struct ipv6_pinfo *np = inet6_sk(sk);
269 struct sockaddr_l2tpip6 *addr = (struct sockaddr_l2tpip6 *) uaddr;
270 struct net *net = sock_net(sk);
271 __be32 v4addr = 0;
272 int bound_dev_if;
273 int addr_type;
274 int err;
275
276 if (addr->l2tp_family != AF_INET6)
277 return -EINVAL;
278 if (addr_len < sizeof(*addr))
279 return -EINVAL;
280
281 addr_type = ipv6_addr_type(&addr->l2tp_addr);
282
283
284 if (addr_type == IPV6_ADDR_MAPPED)
285 return -EADDRNOTAVAIL;
286
287
288 if (addr_type & IPV6_ADDR_MULTICAST)
289 return -EADDRNOTAVAIL;
290
291 lock_sock(sk);
292
293 err = -EINVAL;
294 if (!sock_flag(sk, SOCK_ZAPPED))
295 goto out_unlock;
296
297 if (sk->sk_state != TCP_CLOSE)
298 goto out_unlock;
299
300 bound_dev_if = sk->sk_bound_dev_if;
301
302
303 rcu_read_lock();
304 if (addr_type != IPV6_ADDR_ANY) {
305 struct net_device *dev = NULL;
306
307 if (addr_type & IPV6_ADDR_LINKLOCAL) {
308 if (addr->l2tp_scope_id)
309 bound_dev_if = addr->l2tp_scope_id;
310
311
312
313
314 if (!bound_dev_if)
315 goto out_unlock_rcu;
316
317 err = -ENODEV;
318 dev = dev_get_by_index_rcu(sock_net(sk), bound_dev_if);
319 if (!dev)
320 goto out_unlock_rcu;
321 }
322
323
324
325
326 v4addr = LOOPBACK4_IPV6;
327 err = -EADDRNOTAVAIL;
328 if (!ipv6_chk_addr(sock_net(sk), &addr->l2tp_addr, dev, 0))
329 goto out_unlock_rcu;
330 }
331 rcu_read_unlock();
332
333 write_lock_bh(&l2tp_ip6_lock);
334 if (__l2tp_ip6_bind_lookup(net, &addr->l2tp_addr, NULL, bound_dev_if,
335 addr->l2tp_conn_id)) {
336 write_unlock_bh(&l2tp_ip6_lock);
337 err = -EADDRINUSE;
338 goto out_unlock;
339 }
340
341 inet->inet_saddr = v4addr;
342 inet->inet_rcv_saddr = v4addr;
343 sk->sk_bound_dev_if = bound_dev_if;
344 sk->sk_v6_rcv_saddr = addr->l2tp_addr;
345 np->saddr = addr->l2tp_addr;
346
347 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id;
348
349 sk_add_bind_node(sk, &l2tp_ip6_bind_table);
350 sk_del_node_init(sk);
351 write_unlock_bh(&l2tp_ip6_lock);
352
353 sock_reset_flag(sk, SOCK_ZAPPED);
354 release_sock(sk);
355 return 0;
356
357out_unlock_rcu:
358 rcu_read_unlock();
359out_unlock:
360 release_sock(sk);
361
362 return err;
363}
364
365static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr,
366 int addr_len)
367{
368 struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *) uaddr;
369 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
370 struct in6_addr *daddr;
371 int addr_type;
372 int rc;
373
374 if (addr_len < sizeof(*lsa))
375 return -EINVAL;
376
377 if (usin->sin6_family != AF_INET6)
378 return -EINVAL;
379
380 addr_type = ipv6_addr_type(&usin->sin6_addr);
381 if (addr_type & IPV6_ADDR_MULTICAST)
382 return -EINVAL;
383
384 if (addr_type & IPV6_ADDR_MAPPED) {
385 daddr = &usin->sin6_addr;
386 if (ipv4_is_multicast(daddr->s6_addr32[3]))
387 return -EINVAL;
388 }
389
390 lock_sock(sk);
391
392
393 if (sock_flag(sk, SOCK_ZAPPED)) {
394 rc = -EINVAL;
395 goto out_sk;
396 }
397
398 rc = __ip6_datagram_connect(sk, uaddr, addr_len);
399 if (rc < 0)
400 goto out_sk;
401
402 l2tp_ip6_sk(sk)->peer_conn_id = lsa->l2tp_conn_id;
403
404 write_lock_bh(&l2tp_ip6_lock);
405 hlist_del_init(&sk->sk_bind_node);
406 sk_add_bind_node(sk, &l2tp_ip6_bind_table);
407 write_unlock_bh(&l2tp_ip6_lock);
408
409out_sk:
410 release_sock(sk);
411
412 return rc;
413}
414
415static int l2tp_ip6_disconnect(struct sock *sk, int flags)
416{
417 if (sock_flag(sk, SOCK_ZAPPED))
418 return 0;
419
420 return __udp_disconnect(sk, flags);
421}
422
423static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr,
424 int peer)
425{
426 struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)uaddr;
427 struct sock *sk = sock->sk;
428 struct ipv6_pinfo *np = inet6_sk(sk);
429 struct l2tp_ip6_sock *lsk = l2tp_ip6_sk(sk);
430
431 lsa->l2tp_family = AF_INET6;
432 lsa->l2tp_flowinfo = 0;
433 lsa->l2tp_scope_id = 0;
434 lsa->l2tp_unused = 0;
435 if (peer) {
436 if (!lsk->peer_conn_id)
437 return -ENOTCONN;
438 lsa->l2tp_conn_id = lsk->peer_conn_id;
439 lsa->l2tp_addr = sk->sk_v6_daddr;
440 if (np->sndflow)
441 lsa->l2tp_flowinfo = np->flow_label;
442 } else {
443 if (ipv6_addr_any(&sk->sk_v6_rcv_saddr))
444 lsa->l2tp_addr = np->saddr;
445 else
446 lsa->l2tp_addr = sk->sk_v6_rcv_saddr;
447
448 lsa->l2tp_conn_id = lsk->conn_id;
449 }
450 if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL)
451 lsa->l2tp_scope_id = sk->sk_bound_dev_if;
452 return sizeof(*lsa);
453}
454
455static int l2tp_ip6_backlog_recv(struct sock *sk, struct sk_buff *skb)
456{
457 int rc;
458
459
460 rc = sock_queue_rcv_skb(sk, skb);
461 if (rc < 0)
462 goto drop;
463
464 return 0;
465
466drop:
467 IP_INC_STATS(sock_net(sk), IPSTATS_MIB_INDISCARDS);
468 kfree_skb(skb);
469 return -1;
470}
471
472static int l2tp_ip6_push_pending_frames(struct sock *sk)
473{
474 struct sk_buff *skb;
475 __be32 *transhdr = NULL;
476 int err = 0;
477
478 skb = skb_peek(&sk->sk_write_queue);
479 if (skb == NULL)
480 goto out;
481
482 transhdr = (__be32 *)skb_transport_header(skb);
483 *transhdr = 0;
484
485 err = ip6_push_pending_frames(sk);
486
487out:
488 return err;
489}
490
491
492
493
494static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
495{
496 struct ipv6_txoptions opt_space;
497 DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name);
498 struct in6_addr *daddr, *final_p, final;
499 struct ipv6_pinfo *np = inet6_sk(sk);
500 struct ipv6_txoptions *opt_to_free = NULL;
501 struct ipv6_txoptions *opt = NULL;
502 struct ip6_flowlabel *flowlabel = NULL;
503 struct dst_entry *dst = NULL;
504 struct flowi6 fl6;
505 struct sockcm_cookie sockc_unused = {0};
506 struct ipcm6_cookie ipc6;
507 int addr_len = msg->msg_namelen;
508 int transhdrlen = 4;
509 int ulen = len + transhdrlen;
510 int err;
511
512
513
514
515 if (len > INT_MAX)
516 return -EMSGSIZE;
517
518
519 if (msg->msg_flags & MSG_OOB)
520 return -EOPNOTSUPP;
521
522
523
524
525 memset(&fl6, 0, sizeof(fl6));
526
527 fl6.flowi6_mark = sk->sk_mark;
528 fl6.flowi6_uid = sk->sk_uid;
529
530 ipc6.hlimit = -1;
531 ipc6.tclass = -1;
532 ipc6.dontfrag = -1;
533
534 if (lsa) {
535 if (addr_len < SIN6_LEN_RFC2133)
536 return -EINVAL;
537
538 if (lsa->l2tp_family && lsa->l2tp_family != AF_INET6)
539 return -EAFNOSUPPORT;
540
541 daddr = &lsa->l2tp_addr;
542 if (np->sndflow) {
543 fl6.flowlabel = lsa->l2tp_flowinfo & IPV6_FLOWINFO_MASK;
544 if (fl6.flowlabel&IPV6_FLOWLABEL_MASK) {
545 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
546 if (flowlabel == NULL)
547 return -EINVAL;
548 }
549 }
550
551
552
553
554
555 if (sk->sk_state == TCP_ESTABLISHED &&
556 ipv6_addr_equal(daddr, &sk->sk_v6_daddr))
557 daddr = &sk->sk_v6_daddr;
558
559 if (addr_len >= sizeof(struct sockaddr_in6) &&
560 lsa->l2tp_scope_id &&
561 ipv6_addr_type(daddr) & IPV6_ADDR_LINKLOCAL)
562 fl6.flowi6_oif = lsa->l2tp_scope_id;
563 } else {
564 if (sk->sk_state != TCP_ESTABLISHED)
565 return -EDESTADDRREQ;
566
567 daddr = &sk->sk_v6_daddr;
568 fl6.flowlabel = np->flow_label;
569 }
570
571 if (fl6.flowi6_oif == 0)
572 fl6.flowi6_oif = sk->sk_bound_dev_if;
573
574 if (msg->msg_controllen) {
575 opt = &opt_space;
576 memset(opt, 0, sizeof(struct ipv6_txoptions));
577 opt->tot_len = sizeof(struct ipv6_txoptions);
578 ipc6.opt = opt;
579
580 err = ip6_datagram_send_ctl(sock_net(sk), sk, msg, &fl6, &ipc6,
581 &sockc_unused);
582 if (err < 0) {
583 fl6_sock_release(flowlabel);
584 return err;
585 }
586 if ((fl6.flowlabel & IPV6_FLOWLABEL_MASK) && !flowlabel) {
587 flowlabel = fl6_sock_lookup(sk, fl6.flowlabel);
588 if (flowlabel == NULL)
589 return -EINVAL;
590 }
591 if (!(opt->opt_nflen|opt->opt_flen))
592 opt = NULL;
593 }
594
595 if (!opt) {
596 opt = txopt_get(np);
597 opt_to_free = opt;
598 }
599 if (flowlabel)
600 opt = fl6_merge_options(&opt_space, flowlabel, opt);
601 opt = ipv6_fixup_options(&opt_space, opt);
602 ipc6.opt = opt;
603
604 fl6.flowi6_proto = sk->sk_protocol;
605 if (!ipv6_addr_any(daddr))
606 fl6.daddr = *daddr;
607 else
608 fl6.daddr.s6_addr[15] = 0x1;
609 if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr))
610 fl6.saddr = np->saddr;
611
612 final_p = fl6_update_dst(&fl6, opt, &final);
613
614 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr))
615 fl6.flowi6_oif = np->mcast_oif;
616 else if (!fl6.flowi6_oif)
617 fl6.flowi6_oif = np->ucast_oif;
618
619 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
620
621 if (ipc6.tclass < 0)
622 ipc6.tclass = np->tclass;
623
624 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
625
626 dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
627 if (IS_ERR(dst)) {
628 err = PTR_ERR(dst);
629 goto out;
630 }
631
632 if (ipc6.hlimit < 0)
633 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
634
635 if (ipc6.dontfrag < 0)
636 ipc6.dontfrag = np->dontfrag;
637
638 if (msg->msg_flags & MSG_CONFIRM)
639 goto do_confirm;
640
641back_from_confirm:
642 lock_sock(sk);
643 err = ip6_append_data(sk, ip_generic_getfrag, msg,
644 ulen, transhdrlen, &ipc6,
645 &fl6, (struct rt6_info *)dst,
646 msg->msg_flags, &sockc_unused);
647 if (err)
648 ip6_flush_pending_frames(sk);
649 else if (!(msg->msg_flags & MSG_MORE))
650 err = l2tp_ip6_push_pending_frames(sk);
651 release_sock(sk);
652done:
653 dst_release(dst);
654out:
655 fl6_sock_release(flowlabel);
656 txopt_put(opt_to_free);
657
658 return err < 0 ? err : len;
659
660do_confirm:
661 if (msg->msg_flags & MSG_PROBE)
662 dst_confirm_neigh(dst, &fl6.daddr);
663 if (!(msg->msg_flags & MSG_PROBE) || len)
664 goto back_from_confirm;
665 err = 0;
666 goto done;
667}
668
669static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
670 int noblock, int flags, int *addr_len)
671{
672 struct ipv6_pinfo *np = inet6_sk(sk);
673 DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name);
674 size_t copied = 0;
675 int err = -EOPNOTSUPP;
676 struct sk_buff *skb;
677
678 if (flags & MSG_OOB)
679 goto out;
680
681 if (flags & MSG_ERRQUEUE)
682 return ipv6_recv_error(sk, msg, len, addr_len);
683
684 skb = skb_recv_datagram(sk, flags, noblock, &err);
685 if (!skb)
686 goto out;
687
688 copied = skb->len;
689 if (len < copied) {
690 msg->msg_flags |= MSG_TRUNC;
691 copied = len;
692 }
693
694 err = skb_copy_datagram_msg(skb, 0, msg, copied);
695 if (err)
696 goto done;
697
698 sock_recv_timestamp(msg, sk, skb);
699
700
701 if (lsa) {
702 lsa->l2tp_family = AF_INET6;
703 lsa->l2tp_unused = 0;
704 lsa->l2tp_addr = ipv6_hdr(skb)->saddr;
705 lsa->l2tp_flowinfo = 0;
706 lsa->l2tp_scope_id = 0;
707 lsa->l2tp_conn_id = 0;
708 if (ipv6_addr_type(&lsa->l2tp_addr) & IPV6_ADDR_LINKLOCAL)
709 lsa->l2tp_scope_id = inet6_iif(skb);
710 *addr_len = sizeof(*lsa);
711 }
712
713 if (np->rxopt.all)
714 ip6_datagram_recv_ctl(sk, msg, skb);
715
716 if (flags & MSG_TRUNC)
717 copied = skb->len;
718done:
719 skb_free_datagram(sk, skb);
720out:
721 return err ? err : copied;
722}
723
724static struct proto l2tp_ip6_prot = {
725 .name = "L2TP/IPv6",
726 .owner = THIS_MODULE,
727 .init = l2tp_ip6_open,
728 .close = l2tp_ip6_close,
729 .bind = l2tp_ip6_bind,
730 .connect = l2tp_ip6_connect,
731 .disconnect = l2tp_ip6_disconnect,
732 .ioctl = l2tp_ioctl,
733 .destroy = l2tp_ip6_destroy_sock,
734 .setsockopt = ipv6_setsockopt,
735 .getsockopt = ipv6_getsockopt,
736 .sendmsg = l2tp_ip6_sendmsg,
737 .recvmsg = l2tp_ip6_recvmsg,
738 .backlog_rcv = l2tp_ip6_backlog_recv,
739 .hash = inet6_hash,
740 .unhash = inet_unhash,
741 .obj_size = sizeof(struct l2tp_ip6_sock),
742#ifdef CONFIG_COMPAT
743 .compat_setsockopt = compat_ipv6_setsockopt,
744 .compat_getsockopt = compat_ipv6_getsockopt,
745#endif
746};
747
748static const struct proto_ops l2tp_ip6_ops = {
749 .family = PF_INET6,
750 .owner = THIS_MODULE,
751 .release = inet6_release,
752 .bind = inet6_bind,
753 .connect = inet_dgram_connect,
754 .socketpair = sock_no_socketpair,
755 .accept = sock_no_accept,
756 .getname = l2tp_ip6_getname,
757 .poll = datagram_poll,
758 .ioctl = inet6_ioctl,
759 .listen = sock_no_listen,
760 .shutdown = inet_shutdown,
761 .setsockopt = sock_common_setsockopt,
762 .getsockopt = sock_common_getsockopt,
763 .sendmsg = inet_sendmsg,
764 .recvmsg = sock_common_recvmsg,
765 .mmap = sock_no_mmap,
766 .sendpage = sock_no_sendpage,
767#ifdef CONFIG_COMPAT
768 .compat_setsockopt = compat_sock_common_setsockopt,
769 .compat_getsockopt = compat_sock_common_getsockopt,
770#endif
771};
772
773static struct inet_protosw l2tp_ip6_protosw = {
774 .type = SOCK_DGRAM,
775 .protocol = IPPROTO_L2TP,
776 .prot = &l2tp_ip6_prot,
777 .ops = &l2tp_ip6_ops,
778};
779
780static struct inet6_protocol l2tp_ip6_protocol __read_mostly = {
781 .handler = l2tp_ip6_recv,
782};
783
784static int __init l2tp_ip6_init(void)
785{
786 int err;
787
788 pr_info("L2TP IP encapsulation support for IPv6 (L2TPv3)\n");
789
790 err = proto_register(&l2tp_ip6_prot, 1);
791 if (err != 0)
792 goto out;
793
794 err = inet6_add_protocol(&l2tp_ip6_protocol, IPPROTO_L2TP);
795 if (err)
796 goto out1;
797
798 inet6_register_protosw(&l2tp_ip6_protosw);
799 return 0;
800
801out1:
802 proto_unregister(&l2tp_ip6_prot);
803out:
804 return err;
805}
806
807static void __exit l2tp_ip6_exit(void)
808{
809 inet6_unregister_protosw(&l2tp_ip6_protosw);
810 inet6_del_protocol(&l2tp_ip6_protocol, IPPROTO_L2TP);
811 proto_unregister(&l2tp_ip6_prot);
812}
813
814module_init(l2tp_ip6_init);
815module_exit(l2tp_ip6_exit);
816
817MODULE_LICENSE("GPL");
818MODULE_AUTHOR("Chris Elston <celston@katalix.com>");
819MODULE_DESCRIPTION("L2TP IP encapsulation for IPv6");
820MODULE_VERSION("1.0");
821
822
823
824
825MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 2, IPPROTO_L2TP);
826MODULE_ALIAS_NET_PF_PROTO(PF_INET6, IPPROTO_L2TP);
827