2 * L2TP netlink layer, for management
4 * Copyright (c) 2008,2009,2010 Katalix Systems Ltd
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>
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.
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20 #include <net/genetlink.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>
29 #include <linux/l2tp.h>
31 #include "l2tp_core.h"
34 static struct genl_family l2tp_nl_family
= {
35 .id
= GENL_ID_GENERATE
,
36 .name
= L2TP_GENL_NAME
,
37 .version
= L2TP_GENL_VERSION
,
39 .maxattr
= L2TP_ATTR_MAX
,
43 /* Accessed under genl lock */
44 static const struct l2tp_nl_cmd_ops
*l2tp_nl_cmd_ops
[__L2TP_PWTYPE_MAX
];
46 static struct l2tp_session
*l2tp_nl_session_find(struct genl_info
*info
)
51 struct l2tp_tunnel
*tunnel
;
52 struct l2tp_session
*session
= NULL
;
53 struct net
*net
= genl_info_net(info
);
55 if (info
->attrs
[L2TP_ATTR_IFNAME
]) {
56 ifname
= nla_data(info
->attrs
[L2TP_ATTR_IFNAME
]);
57 session
= l2tp_session_find_by_ifname(net
, ifname
);
58 } else if ((info
->attrs
[L2TP_ATTR_SESSION_ID
]) &&
59 (info
->attrs
[L2TP_ATTR_CONN_ID
])) {
60 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
61 session_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_SESSION_ID
]);
62 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
64 session
= l2tp_session_find(net
, tunnel
, session_id
);
70 static int l2tp_nl_cmd_noop(struct sk_buff
*skb
, struct genl_info
*info
)
76 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
82 hdr
= genlmsg_put(msg
, info
->snd_portid
, info
->snd_seq
,
83 &l2tp_nl_family
, 0, L2TP_CMD_NOOP
);
89 genlmsg_end(msg
, hdr
);
91 return genlmsg_unicast(genl_info_net(info
), msg
, info
->snd_portid
);
100 static int l2tp_nl_cmd_tunnel_create(struct sk_buff
*skb
, struct genl_info
*info
)
107 struct l2tp_tunnel_cfg cfg
= { 0, };
108 struct l2tp_tunnel
*tunnel
;
109 struct net
*net
= genl_info_net(info
);
111 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
115 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
117 if (!info
->attrs
[L2TP_ATTR_PEER_CONN_ID
]) {
121 peer_tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_PEER_CONN_ID
]);
123 if (!info
->attrs
[L2TP_ATTR_PROTO_VERSION
]) {
127 proto_version
= nla_get_u8(info
->attrs
[L2TP_ATTR_PROTO_VERSION
]);
129 if (!info
->attrs
[L2TP_ATTR_ENCAP_TYPE
]) {
133 cfg
.encap
= nla_get_u16(info
->attrs
[L2TP_ATTR_ENCAP_TYPE
]);
136 if (info
->attrs
[L2TP_ATTR_FD
]) {
137 fd
= nla_get_u32(info
->attrs
[L2TP_ATTR_FD
]);
139 #if IS_ENABLED(CONFIG_IPV6)
140 if (info
->attrs
[L2TP_ATTR_IP6_SADDR
] &&
141 info
->attrs
[L2TP_ATTR_IP6_DADDR
]) {
142 cfg
.local_ip6
= nla_data(
143 info
->attrs
[L2TP_ATTR_IP6_SADDR
]);
144 cfg
.peer_ip6
= nla_data(
145 info
->attrs
[L2TP_ATTR_IP6_DADDR
]);
148 if (info
->attrs
[L2TP_ATTR_IP_SADDR
] &&
149 info
->attrs
[L2TP_ATTR_IP_DADDR
]) {
150 cfg
.local_ip
.s_addr
= nla_get_be32(
151 info
->attrs
[L2TP_ATTR_IP_SADDR
]);
152 cfg
.peer_ip
.s_addr
= nla_get_be32(
153 info
->attrs
[L2TP_ATTR_IP_DADDR
]);
158 if (info
->attrs
[L2TP_ATTR_UDP_SPORT
])
159 cfg
.local_udp_port
= nla_get_u16(info
->attrs
[L2TP_ATTR_UDP_SPORT
]);
160 if (info
->attrs
[L2TP_ATTR_UDP_DPORT
])
161 cfg
.peer_udp_port
= nla_get_u16(info
->attrs
[L2TP_ATTR_UDP_DPORT
]);
162 if (info
->attrs
[L2TP_ATTR_UDP_CSUM
])
163 cfg
.use_udp_checksums
= nla_get_flag(info
->attrs
[L2TP_ATTR_UDP_CSUM
]);
165 #if IS_ENABLED(CONFIG_IPV6)
166 if (info
->attrs
[L2TP_ATTR_UDP_ZERO_CSUM6_TX
])
167 cfg
.udp6_zero_tx_checksums
= nla_get_flag(info
->attrs
[L2TP_ATTR_UDP_ZERO_CSUM6_TX
]);
168 if (info
->attrs
[L2TP_ATTR_UDP_ZERO_CSUM6_RX
])
169 cfg
.udp6_zero_rx_checksums
= nla_get_flag(info
->attrs
[L2TP_ATTR_UDP_ZERO_CSUM6_RX
]);
173 if (info
->attrs
[L2TP_ATTR_DEBUG
])
174 cfg
.debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
176 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
177 if (tunnel
!= NULL
) {
184 case L2TP_ENCAPTYPE_UDP
:
185 case L2TP_ENCAPTYPE_IP
:
186 ret
= l2tp_tunnel_create(net
, fd
, proto_version
, tunnel_id
,
187 peer_tunnel_id
, &cfg
, &tunnel
);
195 static int l2tp_nl_cmd_tunnel_delete(struct sk_buff
*skb
, struct genl_info
*info
)
197 struct l2tp_tunnel
*tunnel
;
200 struct net
*net
= genl_info_net(info
);
202 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
206 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
208 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
209 if (tunnel
== NULL
) {
214 (void) l2tp_tunnel_delete(tunnel
);
220 static int l2tp_nl_cmd_tunnel_modify(struct sk_buff
*skb
, struct genl_info
*info
)
222 struct l2tp_tunnel
*tunnel
;
225 struct net
*net
= genl_info_net(info
);
227 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
231 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
233 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
234 if (tunnel
== NULL
) {
239 if (info
->attrs
[L2TP_ATTR_DEBUG
])
240 tunnel
->debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
246 static int l2tp_nl_tunnel_send(struct sk_buff
*skb
, u32 portid
, u32 seq
, int flags
,
247 struct l2tp_tunnel
*tunnel
)
251 struct sock
*sk
= NULL
;
252 struct inet_sock
*inet
;
253 #if IS_ENABLED(CONFIG_IPV6)
254 struct ipv6_pinfo
*np
= NULL
;
257 hdr
= genlmsg_put(skb
, portid
, seq
, &l2tp_nl_family
, flags
,
258 L2TP_CMD_TUNNEL_GET
);
262 if (nla_put_u8(skb
, L2TP_ATTR_PROTO_VERSION
, tunnel
->version
) ||
263 nla_put_u32(skb
, L2TP_ATTR_CONN_ID
, tunnel
->tunnel_id
) ||
264 nla_put_u32(skb
, L2TP_ATTR_PEER_CONN_ID
, tunnel
->peer_tunnel_id
) ||
265 nla_put_u32(skb
, L2TP_ATTR_DEBUG
, tunnel
->debug
) ||
266 nla_put_u16(skb
, L2TP_ATTR_ENCAP_TYPE
, tunnel
->encap
))
267 goto nla_put_failure
;
269 nest
= nla_nest_start(skb
, L2TP_ATTR_STATS
);
271 goto nla_put_failure
;
273 if (nla_put_u64(skb
, L2TP_ATTR_TX_PACKETS
,
274 atomic_long_read(&tunnel
->stats
.tx_packets
)) ||
275 nla_put_u64(skb
, L2TP_ATTR_TX_BYTES
,
276 atomic_long_read(&tunnel
->stats
.tx_bytes
)) ||
277 nla_put_u64(skb
, L2TP_ATTR_TX_ERRORS
,
278 atomic_long_read(&tunnel
->stats
.tx_errors
)) ||
279 nla_put_u64(skb
, L2TP_ATTR_RX_PACKETS
,
280 atomic_long_read(&tunnel
->stats
.rx_packets
)) ||
281 nla_put_u64(skb
, L2TP_ATTR_RX_BYTES
,
282 atomic_long_read(&tunnel
->stats
.rx_bytes
)) ||
283 nla_put_u64(skb
, L2TP_ATTR_RX_SEQ_DISCARDS
,
284 atomic_long_read(&tunnel
->stats
.rx_seq_discards
)) ||
285 nla_put_u64(skb
, L2TP_ATTR_RX_OOS_PACKETS
,
286 atomic_long_read(&tunnel
->stats
.rx_oos_packets
)) ||
287 nla_put_u64(skb
, L2TP_ATTR_RX_ERRORS
,
288 atomic_long_read(&tunnel
->stats
.rx_errors
)))
289 goto nla_put_failure
;
290 nla_nest_end(skb
, nest
);
296 #if IS_ENABLED(CONFIG_IPV6)
297 if (sk
->sk_family
== AF_INET6
)
303 switch (tunnel
->encap
) {
304 case L2TP_ENCAPTYPE_UDP
:
305 if (nla_put_u16(skb
, L2TP_ATTR_UDP_SPORT
, ntohs(inet
->inet_sport
)) ||
306 nla_put_u16(skb
, L2TP_ATTR_UDP_DPORT
, ntohs(inet
->inet_dport
)) ||
307 nla_put_u8(skb
, L2TP_ATTR_UDP_CSUM
, !sk
->sk_no_check_tx
))
308 goto nla_put_failure
;
310 case L2TP_ENCAPTYPE_IP
:
311 #if IS_ENABLED(CONFIG_IPV6)
313 if (nla_put(skb
, L2TP_ATTR_IP6_SADDR
, sizeof(np
->saddr
),
315 nla_put(skb
, L2TP_ATTR_IP6_DADDR
, sizeof(sk
->sk_v6_daddr
),
317 goto nla_put_failure
;
320 if (nla_put_be32(skb
, L2TP_ATTR_IP_SADDR
, inet
->inet_saddr
) ||
321 nla_put_be32(skb
, L2TP_ATTR_IP_DADDR
, inet
->inet_daddr
))
322 goto nla_put_failure
;
327 return genlmsg_end(skb
, hdr
);
330 genlmsg_cancel(skb
, hdr
);
334 static int l2tp_nl_cmd_tunnel_get(struct sk_buff
*skb
, struct genl_info
*info
)
336 struct l2tp_tunnel
*tunnel
;
340 struct net
*net
= genl_info_net(info
);
342 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
347 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
349 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
350 if (tunnel
== NULL
) {
355 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
361 ret
= l2tp_nl_tunnel_send(msg
, info
->snd_portid
, info
->snd_seq
,
366 return genlmsg_unicast(net
, msg
, info
->snd_portid
);
375 static int l2tp_nl_cmd_tunnel_dump(struct sk_buff
*skb
, struct netlink_callback
*cb
)
377 int ti
= cb
->args
[0];
378 struct l2tp_tunnel
*tunnel
;
379 struct net
*net
= sock_net(skb
->sk
);
382 tunnel
= l2tp_tunnel_find_nth(net
, ti
);
386 if (l2tp_nl_tunnel_send(skb
, NETLINK_CB(cb
->skb
).portid
,
387 cb
->nlh
->nlmsg_seq
, NLM_F_MULTI
,
400 static int l2tp_nl_cmd_session_create(struct sk_buff
*skb
, struct genl_info
*info
)
406 struct l2tp_tunnel
*tunnel
;
407 struct l2tp_session
*session
;
408 struct l2tp_session_cfg cfg
= { 0, };
409 struct net
*net
= genl_info_net(info
);
411 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
415 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
416 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
422 if (!info
->attrs
[L2TP_ATTR_SESSION_ID
]) {
426 session_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_SESSION_ID
]);
427 session
= l2tp_session_find(net
, tunnel
, session_id
);
433 if (!info
->attrs
[L2TP_ATTR_PEER_SESSION_ID
]) {
437 peer_session_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_PEER_SESSION_ID
]);
439 if (!info
->attrs
[L2TP_ATTR_PW_TYPE
]) {
443 cfg
.pw_type
= nla_get_u16(info
->attrs
[L2TP_ATTR_PW_TYPE
]);
444 if (cfg
.pw_type
>= __L2TP_PWTYPE_MAX
) {
449 if (tunnel
->version
> 2) {
450 if (info
->attrs
[L2TP_ATTR_OFFSET
])
451 cfg
.offset
= nla_get_u16(info
->attrs
[L2TP_ATTR_OFFSET
]);
453 if (info
->attrs
[L2TP_ATTR_DATA_SEQ
])
454 cfg
.data_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_DATA_SEQ
]);
456 cfg
.l2specific_type
= L2TP_L2SPECTYPE_DEFAULT
;
457 if (info
->attrs
[L2TP_ATTR_L2SPEC_TYPE
])
458 cfg
.l2specific_type
= nla_get_u8(info
->attrs
[L2TP_ATTR_L2SPEC_TYPE
]);
460 cfg
.l2specific_len
= 4;
461 if (info
->attrs
[L2TP_ATTR_L2SPEC_LEN
])
462 cfg
.l2specific_len
= nla_get_u8(info
->attrs
[L2TP_ATTR_L2SPEC_LEN
]);
464 if (info
->attrs
[L2TP_ATTR_COOKIE
]) {
465 u16 len
= nla_len(info
->attrs
[L2TP_ATTR_COOKIE
]);
470 cfg
.cookie_len
= len
;
471 memcpy(&cfg
.cookie
[0], nla_data(info
->attrs
[L2TP_ATTR_COOKIE
]), len
);
473 if (info
->attrs
[L2TP_ATTR_PEER_COOKIE
]) {
474 u16 len
= nla_len(info
->attrs
[L2TP_ATTR_PEER_COOKIE
]);
479 cfg
.peer_cookie_len
= len
;
480 memcpy(&cfg
.peer_cookie
[0], nla_data(info
->attrs
[L2TP_ATTR_PEER_COOKIE
]), len
);
482 if (info
->attrs
[L2TP_ATTR_IFNAME
])
483 cfg
.ifname
= nla_data(info
->attrs
[L2TP_ATTR_IFNAME
]);
485 if (info
->attrs
[L2TP_ATTR_VLAN_ID
])
486 cfg
.vlan_id
= nla_get_u16(info
->attrs
[L2TP_ATTR_VLAN_ID
]);
489 if (info
->attrs
[L2TP_ATTR_DEBUG
])
490 cfg
.debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
492 if (info
->attrs
[L2TP_ATTR_RECV_SEQ
])
493 cfg
.recv_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_RECV_SEQ
]);
495 if (info
->attrs
[L2TP_ATTR_SEND_SEQ
])
496 cfg
.send_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_SEND_SEQ
]);
498 if (info
->attrs
[L2TP_ATTR_LNS_MODE
])
499 cfg
.lns_mode
= nla_get_u8(info
->attrs
[L2TP_ATTR_LNS_MODE
]);
501 if (info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
])
502 cfg
.reorder_timeout
= nla_get_msecs(info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
]);
504 if (info
->attrs
[L2TP_ATTR_MTU
])
505 cfg
.mtu
= nla_get_u16(info
->attrs
[L2TP_ATTR_MTU
]);
507 if (info
->attrs
[L2TP_ATTR_MRU
])
508 cfg
.mru
= nla_get_u16(info
->attrs
[L2TP_ATTR_MRU
]);
510 if ((l2tp_nl_cmd_ops
[cfg
.pw_type
] == NULL
) ||
511 (l2tp_nl_cmd_ops
[cfg
.pw_type
]->session_create
== NULL
)) {
512 ret
= -EPROTONOSUPPORT
;
516 /* Check that pseudowire-specific params are present */
517 switch (cfg
.pw_type
) {
518 case L2TP_PWTYPE_NONE
:
520 case L2TP_PWTYPE_ETH_VLAN
:
521 if (!info
->attrs
[L2TP_ATTR_VLAN_ID
]) {
526 case L2TP_PWTYPE_ETH
:
528 case L2TP_PWTYPE_PPP
:
529 case L2TP_PWTYPE_PPP_AC
:
533 ret
= -EPROTONOSUPPORT
;
537 ret
= -EPROTONOSUPPORT
;
538 if (l2tp_nl_cmd_ops
[cfg
.pw_type
]->session_create
)
539 ret
= (*l2tp_nl_cmd_ops
[cfg
.pw_type
]->session_create
)(net
, tunnel_id
,
540 session_id
, peer_session_id
, &cfg
);
546 static int l2tp_nl_cmd_session_delete(struct sk_buff
*skb
, struct genl_info
*info
)
549 struct l2tp_session
*session
;
552 session
= l2tp_nl_session_find(info
);
553 if (session
== NULL
) {
558 pw_type
= session
->pwtype
;
559 if (pw_type
< __L2TP_PWTYPE_MAX
)
560 if (l2tp_nl_cmd_ops
[pw_type
] && l2tp_nl_cmd_ops
[pw_type
]->session_delete
)
561 ret
= (*l2tp_nl_cmd_ops
[pw_type
]->session_delete
)(session
);
567 static int l2tp_nl_cmd_session_modify(struct sk_buff
*skb
, struct genl_info
*info
)
570 struct l2tp_session
*session
;
572 session
= l2tp_nl_session_find(info
);
573 if (session
== NULL
) {
578 if (info
->attrs
[L2TP_ATTR_DEBUG
])
579 session
->debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
581 if (info
->attrs
[L2TP_ATTR_DATA_SEQ
])
582 session
->data_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_DATA_SEQ
]);
584 if (info
->attrs
[L2TP_ATTR_RECV_SEQ
])
585 session
->recv_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_RECV_SEQ
]);
587 if (info
->attrs
[L2TP_ATTR_SEND_SEQ
]) {
588 session
->send_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_SEND_SEQ
]);
589 l2tp_session_set_header_len(session
, session
->tunnel
->version
);
592 if (info
->attrs
[L2TP_ATTR_LNS_MODE
])
593 session
->lns_mode
= nla_get_u8(info
->attrs
[L2TP_ATTR_LNS_MODE
]);
595 if (info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
])
596 session
->reorder_timeout
= nla_get_msecs(info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
]);
598 if (info
->attrs
[L2TP_ATTR_MTU
])
599 session
->mtu
= nla_get_u16(info
->attrs
[L2TP_ATTR_MTU
]);
601 if (info
->attrs
[L2TP_ATTR_MRU
])
602 session
->mru
= nla_get_u16(info
->attrs
[L2TP_ATTR_MRU
]);
608 static int l2tp_nl_session_send(struct sk_buff
*skb
, u32 portid
, u32 seq
, int flags
,
609 struct l2tp_session
*session
)
613 struct l2tp_tunnel
*tunnel
= session
->tunnel
;
614 struct sock
*sk
= NULL
;
618 hdr
= genlmsg_put(skb
, portid
, seq
, &l2tp_nl_family
, flags
, L2TP_CMD_SESSION_GET
);
622 if (nla_put_u32(skb
, L2TP_ATTR_CONN_ID
, tunnel
->tunnel_id
) ||
623 nla_put_u32(skb
, L2TP_ATTR_SESSION_ID
, session
->session_id
) ||
624 nla_put_u32(skb
, L2TP_ATTR_PEER_CONN_ID
, tunnel
->peer_tunnel_id
) ||
625 nla_put_u32(skb
, L2TP_ATTR_PEER_SESSION_ID
,
626 session
->peer_session_id
) ||
627 nla_put_u32(skb
, L2TP_ATTR_DEBUG
, session
->debug
) ||
628 nla_put_u16(skb
, L2TP_ATTR_PW_TYPE
, session
->pwtype
) ||
629 nla_put_u16(skb
, L2TP_ATTR_MTU
, session
->mtu
) ||
631 nla_put_u16(skb
, L2TP_ATTR_MRU
, session
->mru
)))
632 goto nla_put_failure
;
634 if ((session
->ifname
[0] &&
635 nla_put_string(skb
, L2TP_ATTR_IFNAME
, session
->ifname
)) ||
636 (session
->cookie_len
&&
637 nla_put(skb
, L2TP_ATTR_COOKIE
, session
->cookie_len
,
638 &session
->cookie
[0])) ||
639 (session
->peer_cookie_len
&&
640 nla_put(skb
, L2TP_ATTR_PEER_COOKIE
, session
->peer_cookie_len
,
641 &session
->peer_cookie
[0])) ||
642 nla_put_u8(skb
, L2TP_ATTR_RECV_SEQ
, session
->recv_seq
) ||
643 nla_put_u8(skb
, L2TP_ATTR_SEND_SEQ
, session
->send_seq
) ||
644 nla_put_u8(skb
, L2TP_ATTR_LNS_MODE
, session
->lns_mode
) ||
646 (((sk
) && (sk
->sk_policy
[0] || sk
->sk_policy
[1])) &&
647 nla_put_u8(skb
, L2TP_ATTR_USING_IPSEC
, 1)) ||
649 (session
->reorder_timeout
&&
650 nla_put_msecs(skb
, L2TP_ATTR_RECV_TIMEOUT
, session
->reorder_timeout
)))
651 goto nla_put_failure
;
653 nest
= nla_nest_start(skb
, L2TP_ATTR_STATS
);
655 goto nla_put_failure
;
657 if (nla_put_u64(skb
, L2TP_ATTR_TX_PACKETS
,
658 atomic_long_read(&session
->stats
.tx_packets
)) ||
659 nla_put_u64(skb
, L2TP_ATTR_TX_BYTES
,
660 atomic_long_read(&session
->stats
.tx_bytes
)) ||
661 nla_put_u64(skb
, L2TP_ATTR_TX_ERRORS
,
662 atomic_long_read(&session
->stats
.tx_errors
)) ||
663 nla_put_u64(skb
, L2TP_ATTR_RX_PACKETS
,
664 atomic_long_read(&session
->stats
.rx_packets
)) ||
665 nla_put_u64(skb
, L2TP_ATTR_RX_BYTES
,
666 atomic_long_read(&session
->stats
.rx_bytes
)) ||
667 nla_put_u64(skb
, L2TP_ATTR_RX_SEQ_DISCARDS
,
668 atomic_long_read(&session
->stats
.rx_seq_discards
)) ||
669 nla_put_u64(skb
, L2TP_ATTR_RX_OOS_PACKETS
,
670 atomic_long_read(&session
->stats
.rx_oos_packets
)) ||
671 nla_put_u64(skb
, L2TP_ATTR_RX_ERRORS
,
672 atomic_long_read(&session
->stats
.rx_errors
)))
673 goto nla_put_failure
;
674 nla_nest_end(skb
, nest
);
676 return genlmsg_end(skb
, hdr
);
679 genlmsg_cancel(skb
, hdr
);
683 static int l2tp_nl_cmd_session_get(struct sk_buff
*skb
, struct genl_info
*info
)
685 struct l2tp_session
*session
;
689 session
= l2tp_nl_session_find(info
);
690 if (session
== NULL
) {
695 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
701 ret
= l2tp_nl_session_send(msg
, info
->snd_portid
, info
->snd_seq
,
706 return genlmsg_unicast(genl_info_net(info
), msg
, info
->snd_portid
);
715 static int l2tp_nl_cmd_session_dump(struct sk_buff
*skb
, struct netlink_callback
*cb
)
717 struct net
*net
= sock_net(skb
->sk
);
718 struct l2tp_session
*session
;
719 struct l2tp_tunnel
*tunnel
= NULL
;
720 int ti
= cb
->args
[0];
721 int si
= cb
->args
[1];
724 if (tunnel
== NULL
) {
725 tunnel
= l2tp_tunnel_find_nth(net
, ti
);
730 session
= l2tp_session_find_nth(tunnel
, si
);
731 if (session
== NULL
) {
738 if (l2tp_nl_session_send(skb
, NETLINK_CB(cb
->skb
).portid
,
739 cb
->nlh
->nlmsg_seq
, NLM_F_MULTI
,
753 static struct nla_policy l2tp_nl_policy
[L2TP_ATTR_MAX
+ 1] = {
754 [L2TP_ATTR_NONE
] = { .type
= NLA_UNSPEC
, },
755 [L2TP_ATTR_PW_TYPE
] = { .type
= NLA_U16
, },
756 [L2TP_ATTR_ENCAP_TYPE
] = { .type
= NLA_U16
, },
757 [L2TP_ATTR_OFFSET
] = { .type
= NLA_U16
, },
758 [L2TP_ATTR_DATA_SEQ
] = { .type
= NLA_U8
, },
759 [L2TP_ATTR_L2SPEC_TYPE
] = { .type
= NLA_U8
, },
760 [L2TP_ATTR_L2SPEC_LEN
] = { .type
= NLA_U8
, },
761 [L2TP_ATTR_PROTO_VERSION
] = { .type
= NLA_U8
, },
762 [L2TP_ATTR_CONN_ID
] = { .type
= NLA_U32
, },
763 [L2TP_ATTR_PEER_CONN_ID
] = { .type
= NLA_U32
, },
764 [L2TP_ATTR_SESSION_ID
] = { .type
= NLA_U32
, },
765 [L2TP_ATTR_PEER_SESSION_ID
] = { .type
= NLA_U32
, },
766 [L2TP_ATTR_UDP_CSUM
] = { .type
= NLA_U8
, },
767 [L2TP_ATTR_VLAN_ID
] = { .type
= NLA_U16
, },
768 [L2TP_ATTR_DEBUG
] = { .type
= NLA_U32
, },
769 [L2TP_ATTR_RECV_SEQ
] = { .type
= NLA_U8
, },
770 [L2TP_ATTR_SEND_SEQ
] = { .type
= NLA_U8
, },
771 [L2TP_ATTR_LNS_MODE
] = { .type
= NLA_U8
, },
772 [L2TP_ATTR_USING_IPSEC
] = { .type
= NLA_U8
, },
773 [L2TP_ATTR_RECV_TIMEOUT
] = { .type
= NLA_MSECS
, },
774 [L2TP_ATTR_FD
] = { .type
= NLA_U32
, },
775 [L2TP_ATTR_IP_SADDR
] = { .type
= NLA_U32
, },
776 [L2TP_ATTR_IP_DADDR
] = { .type
= NLA_U32
, },
777 [L2TP_ATTR_UDP_SPORT
] = { .type
= NLA_U16
, },
778 [L2TP_ATTR_UDP_DPORT
] = { .type
= NLA_U16
, },
779 [L2TP_ATTR_MTU
] = { .type
= NLA_U16
, },
780 [L2TP_ATTR_MRU
] = { .type
= NLA_U16
, },
781 [L2TP_ATTR_STATS
] = { .type
= NLA_NESTED
, },
782 [L2TP_ATTR_IP6_SADDR
] = {
784 .len
= sizeof(struct in6_addr
),
786 [L2TP_ATTR_IP6_DADDR
] = {
788 .len
= sizeof(struct in6_addr
),
790 [L2TP_ATTR_IFNAME
] = {
791 .type
= NLA_NUL_STRING
,
794 [L2TP_ATTR_COOKIE
] = {
798 [L2TP_ATTR_PEER_COOKIE
] = {
804 static const struct genl_ops l2tp_nl_ops
[] = {
806 .cmd
= L2TP_CMD_NOOP
,
807 .doit
= l2tp_nl_cmd_noop
,
808 .policy
= l2tp_nl_policy
,
809 /* can be retrieved by unprivileged users */
812 .cmd
= L2TP_CMD_TUNNEL_CREATE
,
813 .doit
= l2tp_nl_cmd_tunnel_create
,
814 .policy
= l2tp_nl_policy
,
815 .flags
= GENL_ADMIN_PERM
,
818 .cmd
= L2TP_CMD_TUNNEL_DELETE
,
819 .doit
= l2tp_nl_cmd_tunnel_delete
,
820 .policy
= l2tp_nl_policy
,
821 .flags
= GENL_ADMIN_PERM
,
824 .cmd
= L2TP_CMD_TUNNEL_MODIFY
,
825 .doit
= l2tp_nl_cmd_tunnel_modify
,
826 .policy
= l2tp_nl_policy
,
827 .flags
= GENL_ADMIN_PERM
,
830 .cmd
= L2TP_CMD_TUNNEL_GET
,
831 .doit
= l2tp_nl_cmd_tunnel_get
,
832 .dumpit
= l2tp_nl_cmd_tunnel_dump
,
833 .policy
= l2tp_nl_policy
,
834 .flags
= GENL_ADMIN_PERM
,
837 .cmd
= L2TP_CMD_SESSION_CREATE
,
838 .doit
= l2tp_nl_cmd_session_create
,
839 .policy
= l2tp_nl_policy
,
840 .flags
= GENL_ADMIN_PERM
,
843 .cmd
= L2TP_CMD_SESSION_DELETE
,
844 .doit
= l2tp_nl_cmd_session_delete
,
845 .policy
= l2tp_nl_policy
,
846 .flags
= GENL_ADMIN_PERM
,
849 .cmd
= L2TP_CMD_SESSION_MODIFY
,
850 .doit
= l2tp_nl_cmd_session_modify
,
851 .policy
= l2tp_nl_policy
,
852 .flags
= GENL_ADMIN_PERM
,
855 .cmd
= L2TP_CMD_SESSION_GET
,
856 .doit
= l2tp_nl_cmd_session_get
,
857 .dumpit
= l2tp_nl_cmd_session_dump
,
858 .policy
= l2tp_nl_policy
,
859 .flags
= GENL_ADMIN_PERM
,
863 int l2tp_nl_register_ops(enum l2tp_pwtype pw_type
, const struct l2tp_nl_cmd_ops
*ops
)
868 if (pw_type
>= __L2TP_PWTYPE_MAX
)
873 if (l2tp_nl_cmd_ops
[pw_type
])
876 l2tp_nl_cmd_ops
[pw_type
] = ops
;
884 EXPORT_SYMBOL_GPL(l2tp_nl_register_ops
);
886 void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type
)
888 if (pw_type
< __L2TP_PWTYPE_MAX
) {
890 l2tp_nl_cmd_ops
[pw_type
] = NULL
;
894 EXPORT_SYMBOL_GPL(l2tp_nl_unregister_ops
);
896 static int l2tp_nl_init(void)
898 pr_info("L2TP netlink interface\n");
899 return genl_register_family_with_ops(&l2tp_nl_family
, l2tp_nl_ops
);
902 static void l2tp_nl_cleanup(void)
904 genl_unregister_family(&l2tp_nl_family
);
907 module_init(l2tp_nl_init
);
908 module_exit(l2tp_nl_cleanup
);
910 MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
911 MODULE_DESCRIPTION("L2TP netlink");
912 MODULE_LICENSE("GPL");
913 MODULE_VERSION("1.0");
914 MODULE_ALIAS_GENL_FAMILY("l2tp");