GNU Linux-libre 4.9.288-gnu1
[releases.git] / net / l2tp / l2tp_netlink.c
1 /*
2  * L2TP netlink layer, for management
3  *
4  * Copyright (c) 2008,2009,2010 Katalix Systems Ltd
5  *
6  * Partly based on the IrDA nelink implementation
7  * (see net/irda/irnetlink.c) which is:
8  * Copyright (c) 2007 Samuel Ortiz <samuel@sortiz.org>
9  * which is in turn partly based on the wireless netlink code:
10  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License version 2 as
14  * published by the Free Software Foundation.
15  */
16
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19 #include <net/sock.h>
20 #include <net/genetlink.h>
21 #include <net/udp.h>
22 #include <linux/in.h>
23 #include <linux/udp.h>
24 #include <linux/socket.h>
25 #include <linux/module.h>
26 #include <linux/list.h>
27 #include <net/net_namespace.h>
28
29 #include <linux/l2tp.h>
30
31 #include "l2tp_core.h"
32
33
34 static struct genl_family l2tp_nl_family = {
35         .id             = GENL_ID_GENERATE,
36         .name           = L2TP_GENL_NAME,
37         .version        = L2TP_GENL_VERSION,
38         .hdrsize        = 0,
39         .maxattr        = L2TP_ATTR_MAX,
40         .netnsok        = true,
41 };
42
43 static const struct genl_multicast_group l2tp_multicast_group[] = {
44         {
45                 .name = L2TP_GENL_MCGROUP,
46         },
47 };
48
49 static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq,
50                                int flags, struct l2tp_tunnel *tunnel, u8 cmd);
51 static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq,
52                                 int flags, struct l2tp_session *session,
53                                 u8 cmd);
54
55 /* Accessed under genl lock */
56 static const struct l2tp_nl_cmd_ops *l2tp_nl_cmd_ops[__L2TP_PWTYPE_MAX];
57
58 static struct l2tp_session *l2tp_nl_session_get(struct genl_info *info,
59                                                 bool do_ref)
60 {
61         u32 tunnel_id;
62         u32 session_id;
63         char *ifname;
64         struct l2tp_tunnel *tunnel;
65         struct l2tp_session *session = NULL;
66         struct net *net = genl_info_net(info);
67
68         if (info->attrs[L2TP_ATTR_IFNAME]) {
69                 ifname = nla_data(info->attrs[L2TP_ATTR_IFNAME]);
70                 session = l2tp_session_get_by_ifname(net, ifname, do_ref);
71         } else if ((info->attrs[L2TP_ATTR_SESSION_ID]) &&
72                    (info->attrs[L2TP_ATTR_CONN_ID])) {
73                 tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
74                 session_id = nla_get_u32(info->attrs[L2TP_ATTR_SESSION_ID]);
75                 tunnel = l2tp_tunnel_get(net, tunnel_id);
76                 if (tunnel) {
77                         session = l2tp_session_get(net, tunnel, session_id,
78                                                    do_ref);
79                         l2tp_tunnel_dec_refcount(tunnel);
80                 }
81         }
82
83         return session;
84 }
85
86 static int l2tp_nl_cmd_noop(struct sk_buff *skb, struct genl_info *info)
87 {
88         struct sk_buff *msg;
89         void *hdr;
90         int ret = -ENOBUFS;
91
92         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
93         if (!msg) {
94                 ret = -ENOMEM;
95                 goto out;
96         }
97
98         hdr = genlmsg_put(msg, info->snd_portid, info->snd_seq,
99                           &l2tp_nl_family, 0, L2TP_CMD_NOOP);
100         if (!hdr) {
101                 ret = -EMSGSIZE;
102                 goto err_out;
103         }
104
105         genlmsg_end(msg, hdr);
106
107         return genlmsg_unicast(genl_info_net(info), msg, info->snd_portid);
108
109 err_out:
110         nlmsg_free(msg);
111
112 out:
113         return ret;
114 }
115
116 static int l2tp_tunnel_notify(struct genl_family *family,
117                               struct genl_info *info,
118                               struct l2tp_tunnel *tunnel,
119                               u8 cmd)
120 {
121         struct sk_buff *msg;
122         int ret;
123
124         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
125         if (!msg)
126                 return -ENOMEM;
127
128         ret = l2tp_nl_tunnel_send(msg, info->snd_portid, info->snd_seq,
129                                   NLM_F_ACK, tunnel, cmd);
130
131         if (ret >= 0) {
132                 ret = genlmsg_multicast_allns(family, msg, 0, 0, GFP_ATOMIC);
133                 /* We don't care if no one is listening */
134                 if (ret == -ESRCH)
135                         ret = 0;
136                 return ret;
137         }
138
139         nlmsg_free(msg);
140
141         return ret;
142 }
143
144 static int l2tp_session_notify(struct genl_family *family,
145                                struct genl_info *info,
146                                struct l2tp_session *session,
147                                u8 cmd)
148 {
149         struct sk_buff *msg;
150         int ret;
151
152         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
153         if (!msg)
154                 return -ENOMEM;
155
156         ret = l2tp_nl_session_send(msg, info->snd_portid, info->snd_seq,
157                                    NLM_F_ACK, session, cmd);
158
159         if (ret >= 0) {
160                 ret = genlmsg_multicast_allns(family, msg, 0, 0, GFP_ATOMIC);
161                 /* We don't care if no one is listening */
162                 if (ret == -ESRCH)
163                         ret = 0;
164                 return ret;
165         }
166
167         nlmsg_free(msg);
168
169         return ret;
170 }
171
172 static int l2tp_nl_cmd_tunnel_create(struct sk_buff *skb, struct genl_info *info)
173 {
174         u32 tunnel_id;
175         u32 peer_tunnel_id;
176         int proto_version;
177         int fd;
178         int ret = 0;
179         struct l2tp_tunnel_cfg cfg = { 0, };
180         struct l2tp_tunnel *tunnel;
181         struct net *net = genl_info_net(info);
182
183         if (!info->attrs[L2TP_ATTR_CONN_ID]) {
184                 ret = -EINVAL;
185                 goto out;
186         }
187         tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
188
189         if (!info->attrs[L2TP_ATTR_PEER_CONN_ID]) {
190                 ret = -EINVAL;
191                 goto out;
192         }
193         peer_tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_PEER_CONN_ID]);
194
195         if (!info->attrs[L2TP_ATTR_PROTO_VERSION]) {
196                 ret = -EINVAL;
197                 goto out;
198         }
199         proto_version = nla_get_u8(info->attrs[L2TP_ATTR_PROTO_VERSION]);
200
201         if (!info->attrs[L2TP_ATTR_ENCAP_TYPE]) {
202                 ret = -EINVAL;
203                 goto out;
204         }
205         cfg.encap = nla_get_u16(info->attrs[L2TP_ATTR_ENCAP_TYPE]);
206
207         fd = -1;
208         if (info->attrs[L2TP_ATTR_FD]) {
209                 fd = nla_get_u32(info->attrs[L2TP_ATTR_FD]);
210         } else {
211 #if IS_ENABLED(CONFIG_IPV6)
212                 if (info->attrs[L2TP_ATTR_IP6_SADDR] &&
213                     info->attrs[L2TP_ATTR_IP6_DADDR]) {
214                         cfg.local_ip6 = nla_data(
215                                 info->attrs[L2TP_ATTR_IP6_SADDR]);
216                         cfg.peer_ip6 = nla_data(
217                                 info->attrs[L2TP_ATTR_IP6_DADDR]);
218                 } else
219 #endif
220                 if (info->attrs[L2TP_ATTR_IP_SADDR] &&
221                     info->attrs[L2TP_ATTR_IP_DADDR]) {
222                         cfg.local_ip.s_addr = nla_get_in_addr(
223                                 info->attrs[L2TP_ATTR_IP_SADDR]);
224                         cfg.peer_ip.s_addr = nla_get_in_addr(
225                                 info->attrs[L2TP_ATTR_IP_DADDR]);
226                 } else {
227                         ret = -EINVAL;
228                         goto out;
229                 }
230                 if (info->attrs[L2TP_ATTR_UDP_SPORT])
231                         cfg.local_udp_port = nla_get_u16(info->attrs[L2TP_ATTR_UDP_SPORT]);
232                 if (info->attrs[L2TP_ATTR_UDP_DPORT])
233                         cfg.peer_udp_port = nla_get_u16(info->attrs[L2TP_ATTR_UDP_DPORT]);
234                 if (info->attrs[L2TP_ATTR_UDP_CSUM])
235                         cfg.use_udp_checksums = nla_get_flag(info->attrs[L2TP_ATTR_UDP_CSUM]);
236
237 #if IS_ENABLED(CONFIG_IPV6)
238                 if (info->attrs[L2TP_ATTR_UDP_ZERO_CSUM6_TX])
239                         cfg.udp6_zero_tx_checksums = nla_get_flag(info->attrs[L2TP_ATTR_UDP_ZERO_CSUM6_TX]);
240                 if (info->attrs[L2TP_ATTR_UDP_ZERO_CSUM6_RX])
241                         cfg.udp6_zero_rx_checksums = nla_get_flag(info->attrs[L2TP_ATTR_UDP_ZERO_CSUM6_RX]);
242 #endif
243         }
244
245         if (info->attrs[L2TP_ATTR_DEBUG])
246                 cfg.debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
247
248         tunnel = l2tp_tunnel_find(net, tunnel_id);
249         if (tunnel != NULL) {
250                 ret = -EEXIST;
251                 goto out;
252         }
253
254         ret = -EINVAL;
255         switch (cfg.encap) {
256         case L2TP_ENCAPTYPE_UDP:
257         case L2TP_ENCAPTYPE_IP:
258                 ret = l2tp_tunnel_create(net, fd, proto_version, tunnel_id,
259                                          peer_tunnel_id, &cfg, &tunnel);
260                 break;
261         }
262
263         if (ret >= 0)
264                 ret = l2tp_tunnel_notify(&l2tp_nl_family, info,
265                                          tunnel, L2TP_CMD_TUNNEL_CREATE);
266 out:
267         return ret;
268 }
269
270 static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info)
271 {
272         struct l2tp_tunnel *tunnel;
273         u32 tunnel_id;
274         int ret = 0;
275         struct net *net = genl_info_net(info);
276
277         if (!info->attrs[L2TP_ATTR_CONN_ID]) {
278                 ret = -EINVAL;
279                 goto out;
280         }
281         tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
282
283         tunnel = l2tp_tunnel_get(net, tunnel_id);
284         if (!tunnel) {
285                 ret = -ENODEV;
286                 goto out;
287         }
288
289         l2tp_tunnel_notify(&l2tp_nl_family, info,
290                            tunnel, L2TP_CMD_TUNNEL_DELETE);
291
292         l2tp_tunnel_delete(tunnel);
293
294         l2tp_tunnel_dec_refcount(tunnel);
295
296 out:
297         return ret;
298 }
299
300 static int l2tp_nl_cmd_tunnel_modify(struct sk_buff *skb, struct genl_info *info)
301 {
302         struct l2tp_tunnel *tunnel;
303         u32 tunnel_id;
304         int ret = 0;
305         struct net *net = genl_info_net(info);
306
307         if (!info->attrs[L2TP_ATTR_CONN_ID]) {
308                 ret = -EINVAL;
309                 goto out;
310         }
311         tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
312
313         tunnel = l2tp_tunnel_get(net, tunnel_id);
314         if (!tunnel) {
315                 ret = -ENODEV;
316                 goto out;
317         }
318
319         if (info->attrs[L2TP_ATTR_DEBUG])
320                 tunnel->debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
321
322         ret = l2tp_tunnel_notify(&l2tp_nl_family, info,
323                                  tunnel, L2TP_CMD_TUNNEL_MODIFY);
324
325         l2tp_tunnel_dec_refcount(tunnel);
326
327 out:
328         return ret;
329 }
330
331 static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int flags,
332                                struct l2tp_tunnel *tunnel, u8 cmd)
333 {
334         void *hdr;
335         struct nlattr *nest;
336         struct sock *sk = NULL;
337         struct inet_sock *inet;
338 #if IS_ENABLED(CONFIG_IPV6)
339         struct ipv6_pinfo *np = NULL;
340 #endif
341
342         hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags, cmd);
343         if (!hdr)
344                 return -EMSGSIZE;
345
346         if (nla_put_u8(skb, L2TP_ATTR_PROTO_VERSION, tunnel->version) ||
347             nla_put_u32(skb, L2TP_ATTR_CONN_ID, tunnel->tunnel_id) ||
348             nla_put_u32(skb, L2TP_ATTR_PEER_CONN_ID, tunnel->peer_tunnel_id) ||
349             nla_put_u32(skb, L2TP_ATTR_DEBUG, tunnel->debug) ||
350             nla_put_u16(skb, L2TP_ATTR_ENCAP_TYPE, tunnel->encap))
351                 goto nla_put_failure;
352
353         nest = nla_nest_start(skb, L2TP_ATTR_STATS);
354         if (nest == NULL)
355                 goto nla_put_failure;
356
357         if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
358                               atomic_long_read(&tunnel->stats.tx_packets),
359                               L2TP_ATTR_STATS_PAD) ||
360             nla_put_u64_64bit(skb, L2TP_ATTR_TX_BYTES,
361                               atomic_long_read(&tunnel->stats.tx_bytes),
362                               L2TP_ATTR_STATS_PAD) ||
363             nla_put_u64_64bit(skb, L2TP_ATTR_TX_ERRORS,
364                               atomic_long_read(&tunnel->stats.tx_errors),
365                               L2TP_ATTR_STATS_PAD) ||
366             nla_put_u64_64bit(skb, L2TP_ATTR_RX_PACKETS,
367                               atomic_long_read(&tunnel->stats.rx_packets),
368                               L2TP_ATTR_STATS_PAD) ||
369             nla_put_u64_64bit(skb, L2TP_ATTR_RX_BYTES,
370                               atomic_long_read(&tunnel->stats.rx_bytes),
371                               L2TP_ATTR_STATS_PAD) ||
372             nla_put_u64_64bit(skb, L2TP_ATTR_RX_SEQ_DISCARDS,
373                               atomic_long_read(&tunnel->stats.rx_seq_discards),
374                               L2TP_ATTR_STATS_PAD) ||
375             nla_put_u64_64bit(skb, L2TP_ATTR_RX_OOS_PACKETS,
376                               atomic_long_read(&tunnel->stats.rx_oos_packets),
377                               L2TP_ATTR_STATS_PAD) ||
378             nla_put_u64_64bit(skb, L2TP_ATTR_RX_ERRORS,
379                               atomic_long_read(&tunnel->stats.rx_errors),
380                               L2TP_ATTR_STATS_PAD))
381                 goto nla_put_failure;
382         nla_nest_end(skb, nest);
383
384         sk = tunnel->sock;
385         if (!sk)
386                 goto out;
387
388 #if IS_ENABLED(CONFIG_IPV6)
389         if (sk->sk_family == AF_INET6)
390                 np = inet6_sk(sk);
391 #endif
392
393         inet = inet_sk(sk);
394
395         switch (tunnel->encap) {
396         case L2TP_ENCAPTYPE_UDP:
397                 if (nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) ||
398                     nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)) ||
399                     nla_put_u8(skb, L2TP_ATTR_UDP_CSUM, !sk->sk_no_check_tx))
400                         goto nla_put_failure;
401                 /* NOBREAK */
402         case L2TP_ENCAPTYPE_IP:
403 #if IS_ENABLED(CONFIG_IPV6)
404                 if (np) {
405                         if (nla_put_in6_addr(skb, L2TP_ATTR_IP6_SADDR,
406                                              &np->saddr) ||
407                             nla_put_in6_addr(skb, L2TP_ATTR_IP6_DADDR,
408                                              &sk->sk_v6_daddr))
409                                 goto nla_put_failure;
410                 } else
411 #endif
412                 if (nla_put_in_addr(skb, L2TP_ATTR_IP_SADDR,
413                                     inet->inet_saddr) ||
414                     nla_put_in_addr(skb, L2TP_ATTR_IP_DADDR,
415                                     inet->inet_daddr))
416                         goto nla_put_failure;
417                 break;
418         }
419
420 out:
421         genlmsg_end(skb, hdr);
422         return 0;
423
424 nla_put_failure:
425         genlmsg_cancel(skb, hdr);
426         return -1;
427 }
428
429 static int l2tp_nl_cmd_tunnel_get(struct sk_buff *skb, struct genl_info *info)
430 {
431         struct l2tp_tunnel *tunnel;
432         struct sk_buff *msg;
433         u32 tunnel_id;
434         int ret = -ENOBUFS;
435         struct net *net = genl_info_net(info);
436
437         if (!info->attrs[L2TP_ATTR_CONN_ID]) {
438                 ret = -EINVAL;
439                 goto err;
440         }
441
442         tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
443
444         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
445         if (!msg) {
446                 ret = -ENOMEM;
447                 goto err;
448         }
449
450         tunnel = l2tp_tunnel_get(net, tunnel_id);
451         if (!tunnel) {
452                 ret = -ENODEV;
453                 goto err_nlmsg;
454         }
455
456         ret = l2tp_nl_tunnel_send(msg, info->snd_portid, info->snd_seq,
457                                   NLM_F_ACK, tunnel, L2TP_CMD_TUNNEL_GET);
458         if (ret < 0)
459                 goto err_nlmsg_tunnel;
460
461         l2tp_tunnel_dec_refcount(tunnel);
462
463         return genlmsg_unicast(net, msg, info->snd_portid);
464
465 err_nlmsg_tunnel:
466         l2tp_tunnel_dec_refcount(tunnel);
467 err_nlmsg:
468         nlmsg_free(msg);
469 err:
470         return ret;
471 }
472
473 static int l2tp_nl_cmd_tunnel_dump(struct sk_buff *skb, struct netlink_callback *cb)
474 {
475         int ti = cb->args[0];
476         struct l2tp_tunnel *tunnel;
477         struct net *net = sock_net(skb->sk);
478
479         for (;;) {
480                 tunnel = l2tp_tunnel_find_nth(net, ti);
481                 if (tunnel == NULL)
482                         goto out;
483
484                 if (l2tp_nl_tunnel_send(skb, NETLINK_CB(cb->skb).portid,
485                                         cb->nlh->nlmsg_seq, NLM_F_MULTI,
486                                         tunnel, L2TP_CMD_TUNNEL_GET) < 0)
487                         goto out;
488
489                 ti++;
490         }
491
492 out:
493         cb->args[0] = ti;
494
495         return skb->len;
496 }
497
498 static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *info)
499 {
500         u32 tunnel_id = 0;
501         u32 session_id;
502         u32 peer_session_id;
503         int ret = 0;
504         struct l2tp_tunnel *tunnel;
505         struct l2tp_session *session;
506         struct l2tp_session_cfg cfg = { 0, };
507         struct net *net = genl_info_net(info);
508
509         if (!info->attrs[L2TP_ATTR_CONN_ID]) {
510                 ret = -EINVAL;
511                 goto out;
512         }
513
514         tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
515         tunnel = l2tp_tunnel_get(net, tunnel_id);
516         if (!tunnel) {
517                 ret = -ENODEV;
518                 goto out;
519         }
520
521         if (!info->attrs[L2TP_ATTR_SESSION_ID]) {
522                 ret = -EINVAL;
523                 goto out_tunnel;
524         }
525         session_id = nla_get_u32(info->attrs[L2TP_ATTR_SESSION_ID]);
526
527         if (!info->attrs[L2TP_ATTR_PEER_SESSION_ID]) {
528                 ret = -EINVAL;
529                 goto out_tunnel;
530         }
531         peer_session_id = nla_get_u32(info->attrs[L2TP_ATTR_PEER_SESSION_ID]);
532
533         if (!info->attrs[L2TP_ATTR_PW_TYPE]) {
534                 ret = -EINVAL;
535                 goto out_tunnel;
536         }
537         cfg.pw_type = nla_get_u16(info->attrs[L2TP_ATTR_PW_TYPE]);
538         if (cfg.pw_type >= __L2TP_PWTYPE_MAX) {
539                 ret = -EINVAL;
540                 goto out_tunnel;
541         }
542
543         if (tunnel->version > 2) {
544                 if (info->attrs[L2TP_ATTR_DATA_SEQ])
545                         cfg.data_seq = nla_get_u8(info->attrs[L2TP_ATTR_DATA_SEQ]);
546
547                 cfg.l2specific_type = L2TP_L2SPECTYPE_DEFAULT;
548                 if (info->attrs[L2TP_ATTR_L2SPEC_TYPE])
549                         cfg.l2specific_type = nla_get_u8(info->attrs[L2TP_ATTR_L2SPEC_TYPE]);
550
551                 cfg.l2specific_len = 4;
552                 if (info->attrs[L2TP_ATTR_L2SPEC_LEN])
553                         cfg.l2specific_len = nla_get_u8(info->attrs[L2TP_ATTR_L2SPEC_LEN]);
554
555                 if (info->attrs[L2TP_ATTR_COOKIE]) {
556                         u16 len = nla_len(info->attrs[L2TP_ATTR_COOKIE]);
557                         if (len > 8) {
558                                 ret = -EINVAL;
559                                 goto out_tunnel;
560                         }
561                         cfg.cookie_len = len;
562                         memcpy(&cfg.cookie[0], nla_data(info->attrs[L2TP_ATTR_COOKIE]), len);
563                 }
564                 if (info->attrs[L2TP_ATTR_PEER_COOKIE]) {
565                         u16 len = nla_len(info->attrs[L2TP_ATTR_PEER_COOKIE]);
566                         if (len > 8) {
567                                 ret = -EINVAL;
568                                 goto out_tunnel;
569                         }
570                         cfg.peer_cookie_len = len;
571                         memcpy(&cfg.peer_cookie[0], nla_data(info->attrs[L2TP_ATTR_PEER_COOKIE]), len);
572                 }
573                 if (info->attrs[L2TP_ATTR_IFNAME])
574                         cfg.ifname = nla_data(info->attrs[L2TP_ATTR_IFNAME]);
575
576                 if (info->attrs[L2TP_ATTR_VLAN_ID])
577                         cfg.vlan_id = nla_get_u16(info->attrs[L2TP_ATTR_VLAN_ID]);
578         }
579
580         if (info->attrs[L2TP_ATTR_DEBUG])
581                 cfg.debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
582
583         if (info->attrs[L2TP_ATTR_RECV_SEQ])
584                 cfg.recv_seq = nla_get_u8(info->attrs[L2TP_ATTR_RECV_SEQ]);
585
586         if (info->attrs[L2TP_ATTR_SEND_SEQ])
587                 cfg.send_seq = nla_get_u8(info->attrs[L2TP_ATTR_SEND_SEQ]);
588
589         if (info->attrs[L2TP_ATTR_LNS_MODE])
590                 cfg.lns_mode = nla_get_u8(info->attrs[L2TP_ATTR_LNS_MODE]);
591
592         if (info->attrs[L2TP_ATTR_RECV_TIMEOUT])
593                 cfg.reorder_timeout = nla_get_msecs(info->attrs[L2TP_ATTR_RECV_TIMEOUT]);
594
595         if (info->attrs[L2TP_ATTR_MTU])
596                 cfg.mtu = nla_get_u16(info->attrs[L2TP_ATTR_MTU]);
597
598         if (info->attrs[L2TP_ATTR_MRU])
599                 cfg.mru = nla_get_u16(info->attrs[L2TP_ATTR_MRU]);
600
601 #ifdef CONFIG_MODULES
602         if (l2tp_nl_cmd_ops[cfg.pw_type] == NULL) {
603                 genl_unlock();
604                 request_module("net-l2tp-type-%u", cfg.pw_type);
605                 genl_lock();
606         }
607 #endif
608         if ((l2tp_nl_cmd_ops[cfg.pw_type] == NULL) ||
609             (l2tp_nl_cmd_ops[cfg.pw_type]->session_create == NULL)) {
610                 ret = -EPROTONOSUPPORT;
611                 goto out_tunnel;
612         }
613
614         /* Check that pseudowire-specific params are present */
615         switch (cfg.pw_type) {
616         case L2TP_PWTYPE_NONE:
617                 break;
618         case L2TP_PWTYPE_ETH_VLAN:
619                 if (!info->attrs[L2TP_ATTR_VLAN_ID]) {
620                         ret = -EINVAL;
621                         goto out_tunnel;
622                 }
623                 break;
624         case L2TP_PWTYPE_ETH:
625                 break;
626         case L2TP_PWTYPE_PPP:
627         case L2TP_PWTYPE_PPP_AC:
628                 break;
629         case L2TP_PWTYPE_IP:
630         default:
631                 ret = -EPROTONOSUPPORT;
632                 break;
633         }
634
635         ret = l2tp_nl_cmd_ops[cfg.pw_type]->session_create(net, tunnel,
636                                                            session_id,
637                                                            peer_session_id,
638                                                            &cfg);
639
640         if (ret >= 0) {
641                 session = l2tp_session_get(net, tunnel, session_id, false);
642                 if (session) {
643                         ret = l2tp_session_notify(&l2tp_nl_family, info, session,
644                                                   L2TP_CMD_SESSION_CREATE);
645                         l2tp_session_dec_refcount(session);
646                 }
647         }
648
649 out_tunnel:
650         l2tp_tunnel_dec_refcount(tunnel);
651 out:
652         return ret;
653 }
654
655 static int l2tp_nl_cmd_session_delete(struct sk_buff *skb, struct genl_info *info)
656 {
657         int ret = 0;
658         struct l2tp_session *session;
659         u16 pw_type;
660
661         session = l2tp_nl_session_get(info, true);
662         if (session == NULL) {
663                 ret = -ENODEV;
664                 goto out;
665         }
666
667         l2tp_session_notify(&l2tp_nl_family, info,
668                             session, L2TP_CMD_SESSION_DELETE);
669
670         pw_type = session->pwtype;
671         if (pw_type < __L2TP_PWTYPE_MAX)
672                 if (l2tp_nl_cmd_ops[pw_type] && l2tp_nl_cmd_ops[pw_type]->session_delete)
673                         ret = (*l2tp_nl_cmd_ops[pw_type]->session_delete)(session);
674
675         if (session->deref)
676                 session->deref(session);
677         l2tp_session_dec_refcount(session);
678
679 out:
680         return ret;
681 }
682
683 static int l2tp_nl_cmd_session_modify(struct sk_buff *skb, struct genl_info *info)
684 {
685         int ret = 0;
686         struct l2tp_session *session;
687
688         session = l2tp_nl_session_get(info, false);
689         if (session == NULL) {
690                 ret = -ENODEV;
691                 goto out;
692         }
693
694         if (info->attrs[L2TP_ATTR_DEBUG])
695                 session->debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
696
697         if (info->attrs[L2TP_ATTR_DATA_SEQ])
698                 session->data_seq = nla_get_u8(info->attrs[L2TP_ATTR_DATA_SEQ]);
699
700         if (info->attrs[L2TP_ATTR_RECV_SEQ])
701                 session->recv_seq = nla_get_u8(info->attrs[L2TP_ATTR_RECV_SEQ]);
702
703         if (info->attrs[L2TP_ATTR_SEND_SEQ]) {
704                 session->send_seq = nla_get_u8(info->attrs[L2TP_ATTR_SEND_SEQ]);
705                 l2tp_session_set_header_len(session, session->tunnel->version);
706         }
707
708         if (info->attrs[L2TP_ATTR_LNS_MODE])
709                 session->lns_mode = nla_get_u8(info->attrs[L2TP_ATTR_LNS_MODE]);
710
711         if (info->attrs[L2TP_ATTR_RECV_TIMEOUT])
712                 session->reorder_timeout = nla_get_msecs(info->attrs[L2TP_ATTR_RECV_TIMEOUT]);
713
714         if (info->attrs[L2TP_ATTR_MTU])
715                 session->mtu = nla_get_u16(info->attrs[L2TP_ATTR_MTU]);
716
717         if (info->attrs[L2TP_ATTR_MRU])
718                 session->mru = nla_get_u16(info->attrs[L2TP_ATTR_MRU]);
719
720         ret = l2tp_session_notify(&l2tp_nl_family, info,
721                                   session, L2TP_CMD_SESSION_MODIFY);
722
723         l2tp_session_dec_refcount(session);
724
725 out:
726         return ret;
727 }
728
729 static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, int flags,
730                                 struct l2tp_session *session, u8 cmd)
731 {
732         void *hdr;
733         struct nlattr *nest;
734         struct l2tp_tunnel *tunnel = session->tunnel;
735         struct sock *sk = NULL;
736
737         sk = tunnel->sock;
738
739         hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags, cmd);
740         if (!hdr)
741                 return -EMSGSIZE;
742
743         if (nla_put_u32(skb, L2TP_ATTR_CONN_ID, tunnel->tunnel_id) ||
744             nla_put_u32(skb, L2TP_ATTR_SESSION_ID, session->session_id) ||
745             nla_put_u32(skb, L2TP_ATTR_PEER_CONN_ID, tunnel->peer_tunnel_id) ||
746             nla_put_u32(skb, L2TP_ATTR_PEER_SESSION_ID,
747                         session->peer_session_id) ||
748             nla_put_u32(skb, L2TP_ATTR_DEBUG, session->debug) ||
749             nla_put_u16(skb, L2TP_ATTR_PW_TYPE, session->pwtype) ||
750             nla_put_u16(skb, L2TP_ATTR_MTU, session->mtu) ||
751             (session->mru &&
752              nla_put_u16(skb, L2TP_ATTR_MRU, session->mru)))
753                 goto nla_put_failure;
754
755         if ((session->ifname[0] &&
756              nla_put_string(skb, L2TP_ATTR_IFNAME, session->ifname)) ||
757             (session->cookie_len &&
758              nla_put(skb, L2TP_ATTR_COOKIE, session->cookie_len,
759                      &session->cookie[0])) ||
760             (session->peer_cookie_len &&
761              nla_put(skb, L2TP_ATTR_PEER_COOKIE, session->peer_cookie_len,
762                      &session->peer_cookie[0])) ||
763             nla_put_u8(skb, L2TP_ATTR_RECV_SEQ, session->recv_seq) ||
764             nla_put_u8(skb, L2TP_ATTR_SEND_SEQ, session->send_seq) ||
765             nla_put_u8(skb, L2TP_ATTR_LNS_MODE, session->lns_mode) ||
766 #ifdef CONFIG_XFRM
767             (((sk) && (sk->sk_policy[0] || sk->sk_policy[1])) &&
768              nla_put_u8(skb, L2TP_ATTR_USING_IPSEC, 1)) ||
769 #endif
770             (session->reorder_timeout &&
771              nla_put_msecs(skb, L2TP_ATTR_RECV_TIMEOUT,
772                            session->reorder_timeout, L2TP_ATTR_PAD)))
773                 goto nla_put_failure;
774
775         nest = nla_nest_start(skb, L2TP_ATTR_STATS);
776         if (nest == NULL)
777                 goto nla_put_failure;
778
779         if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
780                               atomic_long_read(&session->stats.tx_packets),
781                               L2TP_ATTR_STATS_PAD) ||
782             nla_put_u64_64bit(skb, L2TP_ATTR_TX_BYTES,
783                               atomic_long_read(&session->stats.tx_bytes),
784                               L2TP_ATTR_STATS_PAD) ||
785             nla_put_u64_64bit(skb, L2TP_ATTR_TX_ERRORS,
786                               atomic_long_read(&session->stats.tx_errors),
787                               L2TP_ATTR_STATS_PAD) ||
788             nla_put_u64_64bit(skb, L2TP_ATTR_RX_PACKETS,
789                               atomic_long_read(&session->stats.rx_packets),
790                               L2TP_ATTR_STATS_PAD) ||
791             nla_put_u64_64bit(skb, L2TP_ATTR_RX_BYTES,
792                               atomic_long_read(&session->stats.rx_bytes),
793                               L2TP_ATTR_STATS_PAD) ||
794             nla_put_u64_64bit(skb, L2TP_ATTR_RX_SEQ_DISCARDS,
795                               atomic_long_read(&session->stats.rx_seq_discards),
796                               L2TP_ATTR_STATS_PAD) ||
797             nla_put_u64_64bit(skb, L2TP_ATTR_RX_OOS_PACKETS,
798                               atomic_long_read(&session->stats.rx_oos_packets),
799                               L2TP_ATTR_STATS_PAD) ||
800             nla_put_u64_64bit(skb, L2TP_ATTR_RX_ERRORS,
801                               atomic_long_read(&session->stats.rx_errors),
802                               L2TP_ATTR_STATS_PAD))
803                 goto nla_put_failure;
804         nla_nest_end(skb, nest);
805
806         genlmsg_end(skb, hdr);
807         return 0;
808
809  nla_put_failure:
810         genlmsg_cancel(skb, hdr);
811         return -1;
812 }
813
814 static int l2tp_nl_cmd_session_get(struct sk_buff *skb, struct genl_info *info)
815 {
816         struct l2tp_session *session;
817         struct sk_buff *msg;
818         int ret;
819
820         session = l2tp_nl_session_get(info, false);
821         if (session == NULL) {
822                 ret = -ENODEV;
823                 goto err;
824         }
825
826         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
827         if (!msg) {
828                 ret = -ENOMEM;
829                 goto err_ref;
830         }
831
832         ret = l2tp_nl_session_send(msg, info->snd_portid, info->snd_seq,
833                                    0, session, L2TP_CMD_SESSION_GET);
834         if (ret < 0)
835                 goto err_ref_msg;
836
837         ret = genlmsg_unicast(genl_info_net(info), msg, info->snd_portid);
838
839         l2tp_session_dec_refcount(session);
840
841         return ret;
842
843 err_ref_msg:
844         nlmsg_free(msg);
845 err_ref:
846         l2tp_session_dec_refcount(session);
847 err:
848         return ret;
849 }
850
851 static int l2tp_nl_cmd_session_dump(struct sk_buff *skb, struct netlink_callback *cb)
852 {
853         struct net *net = sock_net(skb->sk);
854         struct l2tp_session *session;
855         struct l2tp_tunnel *tunnel = NULL;
856         int ti = cb->args[0];
857         int si = cb->args[1];
858
859         for (;;) {
860                 if (tunnel == NULL) {
861                         tunnel = l2tp_tunnel_find_nth(net, ti);
862                         if (tunnel == NULL)
863                                 goto out;
864                 }
865
866                 session = l2tp_session_get_nth(tunnel, si, false);
867                 if (session == NULL) {
868                         ti++;
869                         tunnel = NULL;
870                         si = 0;
871                         continue;
872                 }
873
874                 if (l2tp_nl_session_send(skb, NETLINK_CB(cb->skb).portid,
875                                          cb->nlh->nlmsg_seq, NLM_F_MULTI,
876                                          session, L2TP_CMD_SESSION_GET) < 0) {
877                         l2tp_session_dec_refcount(session);
878                         break;
879                 }
880                 l2tp_session_dec_refcount(session);
881
882                 si++;
883         }
884
885 out:
886         cb->args[0] = ti;
887         cb->args[1] = si;
888
889         return skb->len;
890 }
891
892 static const struct nla_policy l2tp_nl_policy[L2TP_ATTR_MAX + 1] = {
893         [L2TP_ATTR_NONE]                = { .type = NLA_UNSPEC, },
894         [L2TP_ATTR_PW_TYPE]             = { .type = NLA_U16, },
895         [L2TP_ATTR_ENCAP_TYPE]          = { .type = NLA_U16, },
896         [L2TP_ATTR_OFFSET]              = { .type = NLA_U16, },
897         [L2TP_ATTR_DATA_SEQ]            = { .type = NLA_U8, },
898         [L2TP_ATTR_L2SPEC_TYPE]         = { .type = NLA_U8, },
899         [L2TP_ATTR_L2SPEC_LEN]          = { .type = NLA_U8, },
900         [L2TP_ATTR_PROTO_VERSION]       = { .type = NLA_U8, },
901         [L2TP_ATTR_CONN_ID]             = { .type = NLA_U32, },
902         [L2TP_ATTR_PEER_CONN_ID]        = { .type = NLA_U32, },
903         [L2TP_ATTR_SESSION_ID]          = { .type = NLA_U32, },
904         [L2TP_ATTR_PEER_SESSION_ID]     = { .type = NLA_U32, },
905         [L2TP_ATTR_UDP_CSUM]            = { .type = NLA_U8, },
906         [L2TP_ATTR_VLAN_ID]             = { .type = NLA_U16, },
907         [L2TP_ATTR_DEBUG]               = { .type = NLA_U32, },
908         [L2TP_ATTR_RECV_SEQ]            = { .type = NLA_U8, },
909         [L2TP_ATTR_SEND_SEQ]            = { .type = NLA_U8, },
910         [L2TP_ATTR_LNS_MODE]            = { .type = NLA_U8, },
911         [L2TP_ATTR_USING_IPSEC]         = { .type = NLA_U8, },
912         [L2TP_ATTR_RECV_TIMEOUT]        = { .type = NLA_MSECS, },
913         [L2TP_ATTR_FD]                  = { .type = NLA_U32, },
914         [L2TP_ATTR_IP_SADDR]            = { .type = NLA_U32, },
915         [L2TP_ATTR_IP_DADDR]            = { .type = NLA_U32, },
916         [L2TP_ATTR_UDP_SPORT]           = { .type = NLA_U16, },
917         [L2TP_ATTR_UDP_DPORT]           = { .type = NLA_U16, },
918         [L2TP_ATTR_MTU]                 = { .type = NLA_U16, },
919         [L2TP_ATTR_MRU]                 = { .type = NLA_U16, },
920         [L2TP_ATTR_STATS]               = { .type = NLA_NESTED, },
921         [L2TP_ATTR_IP6_SADDR] = {
922                 .type = NLA_BINARY,
923                 .len = sizeof(struct in6_addr),
924         },
925         [L2TP_ATTR_IP6_DADDR] = {
926                 .type = NLA_BINARY,
927                 .len = sizeof(struct in6_addr),
928         },
929         [L2TP_ATTR_IFNAME] = {
930                 .type = NLA_NUL_STRING,
931                 .len = IFNAMSIZ - 1,
932         },
933         [L2TP_ATTR_COOKIE] = {
934                 .type = NLA_BINARY,
935                 .len = 8,
936         },
937         [L2TP_ATTR_PEER_COOKIE] = {
938                 .type = NLA_BINARY,
939                 .len = 8,
940         },
941 };
942
943 static const struct genl_ops l2tp_nl_ops[] = {
944         {
945                 .cmd = L2TP_CMD_NOOP,
946                 .doit = l2tp_nl_cmd_noop,
947                 .policy = l2tp_nl_policy,
948                 /* can be retrieved by unprivileged users */
949         },
950         {
951                 .cmd = L2TP_CMD_TUNNEL_CREATE,
952                 .doit = l2tp_nl_cmd_tunnel_create,
953                 .policy = l2tp_nl_policy,
954                 .flags = GENL_ADMIN_PERM,
955         },
956         {
957                 .cmd = L2TP_CMD_TUNNEL_DELETE,
958                 .doit = l2tp_nl_cmd_tunnel_delete,
959                 .policy = l2tp_nl_policy,
960                 .flags = GENL_ADMIN_PERM,
961         },
962         {
963                 .cmd = L2TP_CMD_TUNNEL_MODIFY,
964                 .doit = l2tp_nl_cmd_tunnel_modify,
965                 .policy = l2tp_nl_policy,
966                 .flags = GENL_ADMIN_PERM,
967         },
968         {
969                 .cmd = L2TP_CMD_TUNNEL_GET,
970                 .doit = l2tp_nl_cmd_tunnel_get,
971                 .dumpit = l2tp_nl_cmd_tunnel_dump,
972                 .policy = l2tp_nl_policy,
973                 .flags = GENL_ADMIN_PERM,
974         },
975         {
976                 .cmd = L2TP_CMD_SESSION_CREATE,
977                 .doit = l2tp_nl_cmd_session_create,
978                 .policy = l2tp_nl_policy,
979                 .flags = GENL_ADMIN_PERM,
980         },
981         {
982                 .cmd = L2TP_CMD_SESSION_DELETE,
983                 .doit = l2tp_nl_cmd_session_delete,
984                 .policy = l2tp_nl_policy,
985                 .flags = GENL_ADMIN_PERM,
986         },
987         {
988                 .cmd = L2TP_CMD_SESSION_MODIFY,
989                 .doit = l2tp_nl_cmd_session_modify,
990                 .policy = l2tp_nl_policy,
991                 .flags = GENL_ADMIN_PERM,
992         },
993         {
994                 .cmd = L2TP_CMD_SESSION_GET,
995                 .doit = l2tp_nl_cmd_session_get,
996                 .dumpit = l2tp_nl_cmd_session_dump,
997                 .policy = l2tp_nl_policy,
998                 .flags = GENL_ADMIN_PERM,
999         },
1000 };
1001
1002 int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops)
1003 {
1004         int ret;
1005
1006         ret = -EINVAL;
1007         if (pw_type >= __L2TP_PWTYPE_MAX)
1008                 goto err;
1009
1010         genl_lock();
1011         ret = -EBUSY;
1012         if (l2tp_nl_cmd_ops[pw_type])
1013                 goto out;
1014
1015         l2tp_nl_cmd_ops[pw_type] = ops;
1016         ret = 0;
1017
1018 out:
1019         genl_unlock();
1020 err:
1021         return ret;
1022 }
1023 EXPORT_SYMBOL_GPL(l2tp_nl_register_ops);
1024
1025 void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type)
1026 {
1027         if (pw_type < __L2TP_PWTYPE_MAX) {
1028                 genl_lock();
1029                 l2tp_nl_cmd_ops[pw_type] = NULL;
1030                 genl_unlock();
1031         }
1032 }
1033 EXPORT_SYMBOL_GPL(l2tp_nl_unregister_ops);
1034
1035 static int l2tp_nl_init(void)
1036 {
1037         pr_info("L2TP netlink interface\n");
1038         return genl_register_family_with_ops_groups(&l2tp_nl_family,
1039                                                     l2tp_nl_ops,
1040                                                     l2tp_multicast_group);
1041 }
1042
1043 static void l2tp_nl_cleanup(void)
1044 {
1045         genl_unregister_family(&l2tp_nl_family);
1046 }
1047
1048 module_init(l2tp_nl_init);
1049 module_exit(l2tp_nl_cleanup);
1050
1051 MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
1052 MODULE_DESCRIPTION("L2TP netlink");
1053 MODULE_LICENSE("GPL");
1054 MODULE_VERSION("1.0");
1055 MODULE_ALIAS_GENL_FAMILY("l2tp");