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.
18 #include <net/genetlink.h>
21 #include <linux/udp.h>
22 #include <linux/socket.h>
23 #include <linux/module.h>
24 #include <linux/list.h>
25 #include <net/net_namespace.h>
27 #include <linux/l2tp.h>
29 #include "l2tp_core.h"
32 static struct genl_family l2tp_nl_family
= {
33 .id
= GENL_ID_GENERATE
,
34 .name
= L2TP_GENL_NAME
,
35 .version
= L2TP_GENL_VERSION
,
37 .maxattr
= L2TP_ATTR_MAX
,
40 /* Accessed under genl lock */
41 static const struct l2tp_nl_cmd_ops
*l2tp_nl_cmd_ops
[__L2TP_PWTYPE_MAX
];
43 static struct l2tp_session
*l2tp_nl_session_find(struct genl_info
*info
)
48 struct l2tp_tunnel
*tunnel
;
49 struct l2tp_session
*session
= NULL
;
50 struct net
*net
= genl_info_net(info
);
52 if (info
->attrs
[L2TP_ATTR_IFNAME
]) {
53 ifname
= nla_data(info
->attrs
[L2TP_ATTR_IFNAME
]);
54 session
= l2tp_session_find_by_ifname(net
, ifname
);
55 } else if ((info
->attrs
[L2TP_ATTR_SESSION_ID
]) &&
56 (info
->attrs
[L2TP_ATTR_CONN_ID
])) {
57 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
58 session_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_SESSION_ID
]);
59 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
61 session
= l2tp_session_find(net
, tunnel
, session_id
);
67 static int l2tp_nl_cmd_noop(struct sk_buff
*skb
, struct genl_info
*info
)
73 msg
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
79 hdr
= genlmsg_put(msg
, info
->snd_pid
, info
->snd_seq
,
80 &l2tp_nl_family
, 0, L2TP_CMD_NOOP
);
86 genlmsg_end(msg
, hdr
);
88 return genlmsg_unicast(genl_info_net(info
), msg
, info
->snd_pid
);
97 static int l2tp_nl_cmd_tunnel_create(struct sk_buff
*skb
, struct genl_info
*info
)
104 struct l2tp_tunnel_cfg cfg
= { 0, };
105 struct l2tp_tunnel
*tunnel
;
106 struct net
*net
= genl_info_net(info
);
108 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
112 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
114 if (!info
->attrs
[L2TP_ATTR_PEER_CONN_ID
]) {
118 peer_tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_PEER_CONN_ID
]);
120 if (!info
->attrs
[L2TP_ATTR_PROTO_VERSION
]) {
124 proto_version
= nla_get_u8(info
->attrs
[L2TP_ATTR_PROTO_VERSION
]);
126 if (!info
->attrs
[L2TP_ATTR_ENCAP_TYPE
]) {
130 cfg
.encap
= nla_get_u16(info
->attrs
[L2TP_ATTR_ENCAP_TYPE
]);
133 if (info
->attrs
[L2TP_ATTR_FD
]) {
134 fd
= nla_get_u32(info
->attrs
[L2TP_ATTR_FD
]);
136 if (info
->attrs
[L2TP_ATTR_IP_SADDR
])
137 cfg
.local_ip
.s_addr
= nla_get_be32(info
->attrs
[L2TP_ATTR_IP_SADDR
]);
138 if (info
->attrs
[L2TP_ATTR_IP_DADDR
])
139 cfg
.peer_ip
.s_addr
= nla_get_be32(info
->attrs
[L2TP_ATTR_IP_DADDR
]);
140 if (info
->attrs
[L2TP_ATTR_UDP_SPORT
])
141 cfg
.local_udp_port
= nla_get_u16(info
->attrs
[L2TP_ATTR_UDP_SPORT
]);
142 if (info
->attrs
[L2TP_ATTR_UDP_DPORT
])
143 cfg
.peer_udp_port
= nla_get_u16(info
->attrs
[L2TP_ATTR_UDP_DPORT
]);
144 if (info
->attrs
[L2TP_ATTR_UDP_CSUM
])
145 cfg
.use_udp_checksums
= nla_get_flag(info
->attrs
[L2TP_ATTR_UDP_CSUM
]);
148 if (info
->attrs
[L2TP_ATTR_DEBUG
])
149 cfg
.debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
151 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
152 if (tunnel
!= NULL
) {
159 case L2TP_ENCAPTYPE_UDP
:
160 case L2TP_ENCAPTYPE_IP
:
161 ret
= l2tp_tunnel_create(net
, fd
, proto_version
, tunnel_id
,
162 peer_tunnel_id
, &cfg
, &tunnel
);
170 static int l2tp_nl_cmd_tunnel_delete(struct sk_buff
*skb
, struct genl_info
*info
)
172 struct l2tp_tunnel
*tunnel
;
175 struct net
*net
= genl_info_net(info
);
177 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
181 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
183 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
184 if (tunnel
== NULL
) {
189 (void) l2tp_tunnel_delete(tunnel
);
195 static int l2tp_nl_cmd_tunnel_modify(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 if (info
->attrs
[L2TP_ATTR_DEBUG
])
215 tunnel
->debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
221 static int l2tp_nl_tunnel_send(struct sk_buff
*skb
, u32 pid
, u32 seq
, int flags
,
222 struct l2tp_tunnel
*tunnel
)
226 struct sock
*sk
= NULL
;
227 struct inet_sock
*inet
;
229 hdr
= genlmsg_put(skb
, pid
, seq
, &l2tp_nl_family
, flags
,
230 L2TP_CMD_TUNNEL_GET
);
234 NLA_PUT_U8(skb
, L2TP_ATTR_PROTO_VERSION
, tunnel
->version
);
235 NLA_PUT_U32(skb
, L2TP_ATTR_CONN_ID
, tunnel
->tunnel_id
);
236 NLA_PUT_U32(skb
, L2TP_ATTR_PEER_CONN_ID
, tunnel
->peer_tunnel_id
);
237 NLA_PUT_U32(skb
, L2TP_ATTR_DEBUG
, tunnel
->debug
);
238 NLA_PUT_U16(skb
, L2TP_ATTR_ENCAP_TYPE
, tunnel
->encap
);
240 nest
= nla_nest_start(skb
, L2TP_ATTR_STATS
);
242 goto nla_put_failure
;
244 NLA_PUT_U64(skb
, L2TP_ATTR_TX_PACKETS
, tunnel
->stats
.tx_packets
);
245 NLA_PUT_U64(skb
, L2TP_ATTR_TX_BYTES
, tunnel
->stats
.tx_bytes
);
246 NLA_PUT_U64(skb
, L2TP_ATTR_TX_ERRORS
, tunnel
->stats
.tx_errors
);
247 NLA_PUT_U64(skb
, L2TP_ATTR_RX_PACKETS
, tunnel
->stats
.rx_packets
);
248 NLA_PUT_U64(skb
, L2TP_ATTR_RX_BYTES
, tunnel
->stats
.rx_bytes
);
249 NLA_PUT_U64(skb
, L2TP_ATTR_RX_SEQ_DISCARDS
, tunnel
->stats
.rx_seq_discards
);
250 NLA_PUT_U64(skb
, L2TP_ATTR_RX_OOS_PACKETS
, tunnel
->stats
.rx_oos_packets
);
251 NLA_PUT_U64(skb
, L2TP_ATTR_RX_ERRORS
, tunnel
->stats
.rx_errors
);
252 nla_nest_end(skb
, nest
);
260 switch (tunnel
->encap
) {
261 case L2TP_ENCAPTYPE_UDP
:
262 NLA_PUT_U16(skb
, L2TP_ATTR_UDP_SPORT
, ntohs(inet
->inet_sport
));
263 NLA_PUT_U16(skb
, L2TP_ATTR_UDP_DPORT
, ntohs(inet
->inet_dport
));
264 NLA_PUT_U8(skb
, L2TP_ATTR_UDP_CSUM
, (sk
->sk_no_check
!= UDP_CSUM_NOXMIT
));
266 case L2TP_ENCAPTYPE_IP
:
267 NLA_PUT_BE32(skb
, L2TP_ATTR_IP_SADDR
, inet
->inet_saddr
);
268 NLA_PUT_BE32(skb
, L2TP_ATTR_IP_DADDR
, inet
->inet_daddr
);
273 return genlmsg_end(skb
, hdr
);
276 genlmsg_cancel(skb
, hdr
);
280 static int l2tp_nl_cmd_tunnel_get(struct sk_buff
*skb
, struct genl_info
*info
)
282 struct l2tp_tunnel
*tunnel
;
286 struct net
*net
= genl_info_net(info
);
288 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
293 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
295 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
296 if (tunnel
== NULL
) {
301 msg
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
307 ret
= l2tp_nl_tunnel_send(msg
, info
->snd_pid
, info
->snd_seq
,
312 return genlmsg_unicast(net
, msg
, info
->snd_pid
);
321 static int l2tp_nl_cmd_tunnel_dump(struct sk_buff
*skb
, struct netlink_callback
*cb
)
323 int ti
= cb
->args
[0];
324 struct l2tp_tunnel
*tunnel
;
325 struct net
*net
= sock_net(skb
->sk
);
328 tunnel
= l2tp_tunnel_find_nth(net
, ti
);
332 if (l2tp_nl_tunnel_send(skb
, NETLINK_CB(cb
->skb
).pid
,
333 cb
->nlh
->nlmsg_seq
, NLM_F_MULTI
,
346 static int l2tp_nl_cmd_session_create(struct sk_buff
*skb
, struct genl_info
*info
)
352 struct l2tp_tunnel
*tunnel
;
353 struct l2tp_session
*session
;
354 struct l2tp_session_cfg cfg
= { 0, };
355 struct net
*net
= genl_info_net(info
);
357 if (!info
->attrs
[L2TP_ATTR_CONN_ID
]) {
361 tunnel_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_CONN_ID
]);
362 tunnel
= l2tp_tunnel_find(net
, tunnel_id
);
368 if (!info
->attrs
[L2TP_ATTR_SESSION_ID
]) {
372 session_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_SESSION_ID
]);
373 session
= l2tp_session_find(net
, tunnel
, session_id
);
379 if (!info
->attrs
[L2TP_ATTR_PEER_SESSION_ID
]) {
383 peer_session_id
= nla_get_u32(info
->attrs
[L2TP_ATTR_PEER_SESSION_ID
]);
385 if (!info
->attrs
[L2TP_ATTR_PW_TYPE
]) {
389 cfg
.pw_type
= nla_get_u16(info
->attrs
[L2TP_ATTR_PW_TYPE
]);
390 if (cfg
.pw_type
>= __L2TP_PWTYPE_MAX
) {
395 if (tunnel
->version
> 2) {
396 if (info
->attrs
[L2TP_ATTR_OFFSET
])
397 cfg
.offset
= nla_get_u16(info
->attrs
[L2TP_ATTR_OFFSET
]);
399 if (info
->attrs
[L2TP_ATTR_DATA_SEQ
])
400 cfg
.data_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_DATA_SEQ
]);
402 cfg
.l2specific_type
= L2TP_L2SPECTYPE_DEFAULT
;
403 if (info
->attrs
[L2TP_ATTR_L2SPEC_TYPE
])
404 cfg
.l2specific_type
= nla_get_u8(info
->attrs
[L2TP_ATTR_L2SPEC_TYPE
]);
406 cfg
.l2specific_len
= 4;
407 if (info
->attrs
[L2TP_ATTR_L2SPEC_LEN
])
408 cfg
.l2specific_len
= nla_get_u8(info
->attrs
[L2TP_ATTR_L2SPEC_LEN
]);
410 if (info
->attrs
[L2TP_ATTR_COOKIE
]) {
411 u16 len
= nla_len(info
->attrs
[L2TP_ATTR_COOKIE
]);
416 cfg
.cookie_len
= len
;
417 memcpy(&cfg
.cookie
[0], nla_data(info
->attrs
[L2TP_ATTR_COOKIE
]), len
);
419 if (info
->attrs
[L2TP_ATTR_PEER_COOKIE
]) {
420 u16 len
= nla_len(info
->attrs
[L2TP_ATTR_PEER_COOKIE
]);
425 cfg
.peer_cookie_len
= len
;
426 memcpy(&cfg
.peer_cookie
[0], nla_data(info
->attrs
[L2TP_ATTR_PEER_COOKIE
]), len
);
428 if (info
->attrs
[L2TP_ATTR_IFNAME
])
429 cfg
.ifname
= nla_data(info
->attrs
[L2TP_ATTR_IFNAME
]);
431 if (info
->attrs
[L2TP_ATTR_VLAN_ID
])
432 cfg
.vlan_id
= nla_get_u16(info
->attrs
[L2TP_ATTR_VLAN_ID
]);
435 if (info
->attrs
[L2TP_ATTR_DEBUG
])
436 cfg
.debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
438 if (info
->attrs
[L2TP_ATTR_RECV_SEQ
])
439 cfg
.recv_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_RECV_SEQ
]);
441 if (info
->attrs
[L2TP_ATTR_SEND_SEQ
])
442 cfg
.send_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_SEND_SEQ
]);
444 if (info
->attrs
[L2TP_ATTR_LNS_MODE
])
445 cfg
.lns_mode
= nla_get_u8(info
->attrs
[L2TP_ATTR_LNS_MODE
]);
447 if (info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
])
448 cfg
.reorder_timeout
= nla_get_msecs(info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
]);
450 if (info
->attrs
[L2TP_ATTR_MTU
])
451 cfg
.mtu
= nla_get_u16(info
->attrs
[L2TP_ATTR_MTU
]);
453 if (info
->attrs
[L2TP_ATTR_MRU
])
454 cfg
.mru
= nla_get_u16(info
->attrs
[L2TP_ATTR_MRU
]);
456 if ((l2tp_nl_cmd_ops
[cfg
.pw_type
] == NULL
) ||
457 (l2tp_nl_cmd_ops
[cfg
.pw_type
]->session_create
== NULL
)) {
458 ret
= -EPROTONOSUPPORT
;
462 /* Check that pseudowire-specific params are present */
463 switch (cfg
.pw_type
) {
464 case L2TP_PWTYPE_NONE
:
466 case L2TP_PWTYPE_ETH_VLAN
:
467 if (!info
->attrs
[L2TP_ATTR_VLAN_ID
]) {
472 case L2TP_PWTYPE_ETH
:
474 case L2TP_PWTYPE_PPP
:
475 case L2TP_PWTYPE_PPP_AC
:
479 ret
= -EPROTONOSUPPORT
;
483 ret
= -EPROTONOSUPPORT
;
484 if (l2tp_nl_cmd_ops
[cfg
.pw_type
]->session_create
)
485 ret
= (*l2tp_nl_cmd_ops
[cfg
.pw_type
]->session_create
)(net
, tunnel_id
,
486 session_id
, peer_session_id
, &cfg
);
492 static int l2tp_nl_cmd_session_delete(struct sk_buff
*skb
, struct genl_info
*info
)
495 struct l2tp_session
*session
;
498 session
= l2tp_nl_session_find(info
);
499 if (session
== NULL
) {
504 pw_type
= session
->pwtype
;
505 if (pw_type
< __L2TP_PWTYPE_MAX
)
506 if (l2tp_nl_cmd_ops
[pw_type
] && l2tp_nl_cmd_ops
[pw_type
]->session_delete
)
507 ret
= (*l2tp_nl_cmd_ops
[pw_type
]->session_delete
)(session
);
513 static int l2tp_nl_cmd_session_modify(struct sk_buff
*skb
, struct genl_info
*info
)
516 struct l2tp_session
*session
;
518 session
= l2tp_nl_session_find(info
);
519 if (session
== NULL
) {
524 if (info
->attrs
[L2TP_ATTR_DEBUG
])
525 session
->debug
= nla_get_u32(info
->attrs
[L2TP_ATTR_DEBUG
]);
527 if (info
->attrs
[L2TP_ATTR_DATA_SEQ
])
528 session
->data_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_DATA_SEQ
]);
530 if (info
->attrs
[L2TP_ATTR_RECV_SEQ
])
531 session
->recv_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_RECV_SEQ
]);
533 if (info
->attrs
[L2TP_ATTR_SEND_SEQ
])
534 session
->send_seq
= nla_get_u8(info
->attrs
[L2TP_ATTR_SEND_SEQ
]);
536 if (info
->attrs
[L2TP_ATTR_LNS_MODE
])
537 session
->lns_mode
= nla_get_u8(info
->attrs
[L2TP_ATTR_LNS_MODE
]);
539 if (info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
])
540 session
->reorder_timeout
= nla_get_msecs(info
->attrs
[L2TP_ATTR_RECV_TIMEOUT
]);
542 if (info
->attrs
[L2TP_ATTR_MTU
])
543 session
->mtu
= nla_get_u16(info
->attrs
[L2TP_ATTR_MTU
]);
545 if (info
->attrs
[L2TP_ATTR_MRU
])
546 session
->mru
= nla_get_u16(info
->attrs
[L2TP_ATTR_MRU
]);
552 static int l2tp_nl_session_send(struct sk_buff
*skb
, u32 pid
, u32 seq
, int flags
,
553 struct l2tp_session
*session
)
557 struct l2tp_tunnel
*tunnel
= session
->tunnel
;
558 struct sock
*sk
= NULL
;
562 hdr
= genlmsg_put(skb
, pid
, seq
, &l2tp_nl_family
, flags
, L2TP_CMD_SESSION_GET
);
566 NLA_PUT_U32(skb
, L2TP_ATTR_CONN_ID
, tunnel
->tunnel_id
);
567 NLA_PUT_U32(skb
, L2TP_ATTR_SESSION_ID
, session
->session_id
);
568 NLA_PUT_U32(skb
, L2TP_ATTR_PEER_CONN_ID
, tunnel
->peer_tunnel_id
);
569 NLA_PUT_U32(skb
, L2TP_ATTR_PEER_SESSION_ID
, session
->peer_session_id
);
570 NLA_PUT_U32(skb
, L2TP_ATTR_DEBUG
, session
->debug
);
571 NLA_PUT_U16(skb
, L2TP_ATTR_PW_TYPE
, session
->pwtype
);
572 NLA_PUT_U16(skb
, L2TP_ATTR_MTU
, session
->mtu
);
574 NLA_PUT_U16(skb
, L2TP_ATTR_MRU
, session
->mru
);
576 if (session
->ifname
&& session
->ifname
[0])
577 NLA_PUT_STRING(skb
, L2TP_ATTR_IFNAME
, session
->ifname
);
578 if (session
->cookie_len
)
579 NLA_PUT(skb
, L2TP_ATTR_COOKIE
, session
->cookie_len
, &session
->cookie
[0]);
580 if (session
->peer_cookie_len
)
581 NLA_PUT(skb
, L2TP_ATTR_PEER_COOKIE
, session
->peer_cookie_len
, &session
->peer_cookie
[0]);
582 NLA_PUT_U8(skb
, L2TP_ATTR_RECV_SEQ
, session
->recv_seq
);
583 NLA_PUT_U8(skb
, L2TP_ATTR_SEND_SEQ
, session
->send_seq
);
584 NLA_PUT_U8(skb
, L2TP_ATTR_LNS_MODE
, session
->lns_mode
);
586 if ((sk
) && (sk
->sk_policy
[0] || sk
->sk_policy
[1]))
587 NLA_PUT_U8(skb
, L2TP_ATTR_USING_IPSEC
, 1);
589 if (session
->reorder_timeout
)
590 NLA_PUT_MSECS(skb
, L2TP_ATTR_RECV_TIMEOUT
, session
->reorder_timeout
);
592 nest
= nla_nest_start(skb
, L2TP_ATTR_STATS
);
594 goto nla_put_failure
;
595 NLA_PUT_U64(skb
, L2TP_ATTR_TX_PACKETS
, session
->stats
.tx_packets
);
596 NLA_PUT_U64(skb
, L2TP_ATTR_TX_BYTES
, session
->stats
.tx_bytes
);
597 NLA_PUT_U64(skb
, L2TP_ATTR_TX_ERRORS
, session
->stats
.tx_errors
);
598 NLA_PUT_U64(skb
, L2TP_ATTR_RX_PACKETS
, session
->stats
.rx_packets
);
599 NLA_PUT_U64(skb
, L2TP_ATTR_RX_BYTES
, session
->stats
.rx_bytes
);
600 NLA_PUT_U64(skb
, L2TP_ATTR_RX_SEQ_DISCARDS
, session
->stats
.rx_seq_discards
);
601 NLA_PUT_U64(skb
, L2TP_ATTR_RX_OOS_PACKETS
, session
->stats
.rx_oos_packets
);
602 NLA_PUT_U64(skb
, L2TP_ATTR_RX_ERRORS
, session
->stats
.rx_errors
);
603 nla_nest_end(skb
, nest
);
605 return genlmsg_end(skb
, hdr
);
608 genlmsg_cancel(skb
, hdr
);
612 static int l2tp_nl_cmd_session_get(struct sk_buff
*skb
, struct genl_info
*info
)
614 struct l2tp_session
*session
;
618 session
= l2tp_nl_session_find(info
);
619 if (session
== NULL
) {
624 msg
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
630 ret
= l2tp_nl_session_send(msg
, info
->snd_pid
, info
->snd_seq
,
635 return genlmsg_unicast(genl_info_net(info
), msg
, info
->snd_pid
);
644 static int l2tp_nl_cmd_session_dump(struct sk_buff
*skb
, struct netlink_callback
*cb
)
646 struct net
*net
= sock_net(skb
->sk
);
647 struct l2tp_session
*session
;
648 struct l2tp_tunnel
*tunnel
= NULL
;
649 int ti
= cb
->args
[0];
650 int si
= cb
->args
[1];
653 if (tunnel
== NULL
) {
654 tunnel
= l2tp_tunnel_find_nth(net
, ti
);
659 session
= l2tp_session_find_nth(tunnel
, si
);
660 if (session
== NULL
) {
667 if (l2tp_nl_session_send(skb
, NETLINK_CB(cb
->skb
).pid
,
668 cb
->nlh
->nlmsg_seq
, NLM_F_MULTI
,
682 static struct nla_policy l2tp_nl_policy
[L2TP_ATTR_MAX
+ 1] = {
683 [L2TP_ATTR_NONE
] = { .type
= NLA_UNSPEC
, },
684 [L2TP_ATTR_PW_TYPE
] = { .type
= NLA_U16
, },
685 [L2TP_ATTR_ENCAP_TYPE
] = { .type
= NLA_U16
, },
686 [L2TP_ATTR_OFFSET
] = { .type
= NLA_U16
, },
687 [L2TP_ATTR_DATA_SEQ
] = { .type
= NLA_U8
, },
688 [L2TP_ATTR_L2SPEC_TYPE
] = { .type
= NLA_U8
, },
689 [L2TP_ATTR_L2SPEC_LEN
] = { .type
= NLA_U8
, },
690 [L2TP_ATTR_PROTO_VERSION
] = { .type
= NLA_U8
, },
691 [L2TP_ATTR_CONN_ID
] = { .type
= NLA_U32
, },
692 [L2TP_ATTR_PEER_CONN_ID
] = { .type
= NLA_U32
, },
693 [L2TP_ATTR_SESSION_ID
] = { .type
= NLA_U32
, },
694 [L2TP_ATTR_PEER_SESSION_ID
] = { .type
= NLA_U32
, },
695 [L2TP_ATTR_UDP_CSUM
] = { .type
= NLA_U8
, },
696 [L2TP_ATTR_VLAN_ID
] = { .type
= NLA_U16
, },
697 [L2TP_ATTR_DEBUG
] = { .type
= NLA_U32
, },
698 [L2TP_ATTR_RECV_SEQ
] = { .type
= NLA_U8
, },
699 [L2TP_ATTR_SEND_SEQ
] = { .type
= NLA_U8
, },
700 [L2TP_ATTR_LNS_MODE
] = { .type
= NLA_U8
, },
701 [L2TP_ATTR_USING_IPSEC
] = { .type
= NLA_U8
, },
702 [L2TP_ATTR_RECV_TIMEOUT
] = { .type
= NLA_MSECS
, },
703 [L2TP_ATTR_FD
] = { .type
= NLA_U32
, },
704 [L2TP_ATTR_IP_SADDR
] = { .type
= NLA_U32
, },
705 [L2TP_ATTR_IP_DADDR
] = { .type
= NLA_U32
, },
706 [L2TP_ATTR_UDP_SPORT
] = { .type
= NLA_U16
, },
707 [L2TP_ATTR_UDP_DPORT
] = { .type
= NLA_U16
, },
708 [L2TP_ATTR_MTU
] = { .type
= NLA_U16
, },
709 [L2TP_ATTR_MRU
] = { .type
= NLA_U16
, },
710 [L2TP_ATTR_STATS
] = { .type
= NLA_NESTED
, },
711 [L2TP_ATTR_IFNAME
] = {
712 .type
= NLA_NUL_STRING
,
715 [L2TP_ATTR_COOKIE
] = {
719 [L2TP_ATTR_PEER_COOKIE
] = {
725 static struct genl_ops l2tp_nl_ops
[] = {
727 .cmd
= L2TP_CMD_NOOP
,
728 .doit
= l2tp_nl_cmd_noop
,
729 .policy
= l2tp_nl_policy
,
730 /* can be retrieved by unprivileged users */
733 .cmd
= L2TP_CMD_TUNNEL_CREATE
,
734 .doit
= l2tp_nl_cmd_tunnel_create
,
735 .policy
= l2tp_nl_policy
,
736 .flags
= GENL_ADMIN_PERM
,
739 .cmd
= L2TP_CMD_TUNNEL_DELETE
,
740 .doit
= l2tp_nl_cmd_tunnel_delete
,
741 .policy
= l2tp_nl_policy
,
742 .flags
= GENL_ADMIN_PERM
,
745 .cmd
= L2TP_CMD_TUNNEL_MODIFY
,
746 .doit
= l2tp_nl_cmd_tunnel_modify
,
747 .policy
= l2tp_nl_policy
,
748 .flags
= GENL_ADMIN_PERM
,
751 .cmd
= L2TP_CMD_TUNNEL_GET
,
752 .doit
= l2tp_nl_cmd_tunnel_get
,
753 .dumpit
= l2tp_nl_cmd_tunnel_dump
,
754 .policy
= l2tp_nl_policy
,
755 .flags
= GENL_ADMIN_PERM
,
758 .cmd
= L2TP_CMD_SESSION_CREATE
,
759 .doit
= l2tp_nl_cmd_session_create
,
760 .policy
= l2tp_nl_policy
,
761 .flags
= GENL_ADMIN_PERM
,
764 .cmd
= L2TP_CMD_SESSION_DELETE
,
765 .doit
= l2tp_nl_cmd_session_delete
,
766 .policy
= l2tp_nl_policy
,
767 .flags
= GENL_ADMIN_PERM
,
770 .cmd
= L2TP_CMD_SESSION_MODIFY
,
771 .doit
= l2tp_nl_cmd_session_modify
,
772 .policy
= l2tp_nl_policy
,
773 .flags
= GENL_ADMIN_PERM
,
776 .cmd
= L2TP_CMD_SESSION_GET
,
777 .doit
= l2tp_nl_cmd_session_get
,
778 .dumpit
= l2tp_nl_cmd_session_dump
,
779 .policy
= l2tp_nl_policy
,
780 .flags
= GENL_ADMIN_PERM
,
784 int l2tp_nl_register_ops(enum l2tp_pwtype pw_type
, const struct l2tp_nl_cmd_ops
*ops
)
789 if (pw_type
>= __L2TP_PWTYPE_MAX
)
794 if (l2tp_nl_cmd_ops
[pw_type
])
797 l2tp_nl_cmd_ops
[pw_type
] = ops
;
804 EXPORT_SYMBOL_GPL(l2tp_nl_register_ops
);
806 void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type
)
808 if (pw_type
< __L2TP_PWTYPE_MAX
) {
810 l2tp_nl_cmd_ops
[pw_type
] = NULL
;
814 EXPORT_SYMBOL_GPL(l2tp_nl_unregister_ops
);
816 static int l2tp_nl_init(void)
820 printk(KERN_INFO
"L2TP netlink interface\n");
821 err
= genl_register_family_with_ops(&l2tp_nl_family
, l2tp_nl_ops
,
822 ARRAY_SIZE(l2tp_nl_ops
));
827 static void l2tp_nl_cleanup(void)
829 genl_unregister_family(&l2tp_nl_family
);
832 module_init(l2tp_nl_init
);
833 module_exit(l2tp_nl_cleanup
);
835 MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
836 MODULE_DESCRIPTION("L2TP netlink");
837 MODULE_LICENSE("GPL");
838 MODULE_VERSION("1.0");
839 MODULE_ALIAS("net-pf-" __stringify(PF_NETLINK
) "-proto-" \
840 __stringify(NETLINK_GENERIC
) "-type-" "l2tp");