€•–Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ#/translations/zh_CN/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/zh_TW/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/it_IT/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ja_JP/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ko_KR/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/pt_BR/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/sp_SP/networking/l2tp”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ=/var/lib/git/docbuild/linux/Documentation/networking/l2tp.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒL2TP”h]”hŒL2TP”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒULayer 2 Tunneling Protocol (L2TP) allows L2 frames to be tunneled over an IP network.”h]”hŒULayer 2 Tunneling Protocol (L2TP) allows L2 frames to be tunneled over an IP network.”…”�”}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)�”}”(hX This document covers the kernel's L2TP subsystem. It documents kernel APIs for application developers who want to use the L2TP subsystem and it provides some technical details about the internal implementation which may be useful to kernel developers and maintainers.”h]”hX This document covers the kernel’s L2TP subsystem. It documents kernel APIs for application developers who want to use the L2TP subsystem and it provides some technical details about the internal implementation which may be useful to kernel developers and maintainers.”…”�”}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒOverview”h]”hŒOverview”…”�”}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhûh²hh³hÇh´KubhÞ)�”}”(hŒ¥The kernel's L2TP subsystem implements the datapath for L2TPv2 and L2TPv3. L2TPv2 is carried over UDP. L2TPv3 is carried over UDP or directly over IP (protocol 115).”h]”hŒ§The kernel’s L2TP subsystem implements the datapath for L2TPv2 and L2TPv3. L2TPv2 is carried over UDP. L2TPv3 is carried over UDP or directly over IP (protocol 115).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhûh²hubhÞ)�”}”(hŒæThe L2TP RFCs define two basic kinds of L2TP packets: control packets (the "control plane"), and data packets (the "data plane"). The kernel deals only with data packets. The more complex control packets are handled by user space.”h]”hŒîThe L2TP RFCs define two basic kinds of L2TP packets: control packets (the “control planeâ€�), and data packets (the “data planeâ€�). The kernel deals only with data packets. The more complex control packets are handled by user space.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhûh²hubhÞ)�”}”(hXîAn L2TP tunnel carries one or more L2TP sessions. Each tunnel is associated with a socket. Each session is associated with a virtual netdevice, e.g. ``pppN``, ``l2tpethN``, through which data frames pass to/from L2TP. Fields in the L2TP header identify the tunnel or session and whether it is a control or data packet. When tunnels and sessions are set up using the Linux kernel API, we're just setting up the L2TP data path. All aspects of the control protocol are to be handled by user space.”h]”(hŒ•An L2TP tunnel carries one or more L2TP sessions. Each tunnel is associated with a socket. Each session is associated with a virtual netdevice, e.g. ”…”�”}”(hj(h²hh³Nh´NubhŒliteral”“”)�”}”(hŒ``pppN``”h]”hŒpppN”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj(ubhŒ, ”…”�”}”(hj(h²hh³Nh´Nubj1)�”}”(hŒ ``l2tpethN``”h]”hŒl2tpethN”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj(ubhXE, through which data frames pass to/from L2TP. Fields in the L2TP header identify the tunnel or session and whether it is a control or data packet. When tunnels and sessions are set up using the Linux kernel API, we’re just setting up the L2TP data path. All aspects of the control protocol are to be handled by user space.”…”�”}”(hj(h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhûh²hubhÞ)�”}”(hŒ�This split in responsibilities leads to a natural sequence of operations when establishing tunnels and sessions. The procedure looks like this:”h]”hŒ�This split in responsibilities leads to a natural sequence of operations when establishing tunnels and sessions. The procedure looks like this:”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K$hhûh²hubhŒ block_quote”“”)�”}”(hXò1) Create a tunnel socket. Exchange L2TP control protocol messages with the peer over that socket in order to establish a tunnel. 2) Create a tunnel context in the kernel, using information obtained from the peer using the control protocol messages. 3) Exchange L2TP control protocol messages with the peer over the tunnel socket in order to establish a session. 4) Create a session context in the kernel using information obtained from the peer using the control protocol messages. ”h]”hŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒCreate a tunnel socket. Exchange L2TP control protocol messages with the peer over that socket in order to establish a tunnel. ”h]”hÞ)�”}”(hŒ~Create a tunnel socket. Exchange L2TP control protocol messages with the peer over that socket in order to establish a tunnel.”h]”hŒ~Create a tunnel socket. Exchange L2TP control protocol messages with the peer over that socket in order to establish a tunnel.”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K(hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjrubjv)�”}”(hŒuCreate a tunnel context in the kernel, using information obtained from the peer using the control protocol messages. ”h]”hÞ)�”}”(hŒtCreate a tunnel context in the kernel, using information obtained from the peer using the control protocol messages.”h]”hŒtCreate a tunnel context in the kernel, using information obtained from the peer using the control protocol messages.”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K+hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjrubjv)�”}”(hŒnExchange L2TP control protocol messages with the peer over the tunnel socket in order to establish a session. ”h]”hÞ)�”}”(hŒmExchange L2TP control protocol messages with the peer over the tunnel socket in order to establish a session.”h]”hŒmExchange L2TP control protocol messages with the peer over the tunnel socket in order to establish a session.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K.hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjrubjv)�”}”(hŒuCreate a session context in the kernel using information obtained from the peer using the control protocol messages. ”h]”hÞ)�”}”(hŒtCreate a session context in the kernel using information obtained from the peer using the control protocol messages.”h]”hŒtCreate a session context in the kernel using information obtained from the peer using the control protocol messages.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K1hj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjrubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ)”uh1jphjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´K(hhûh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ L2TP APIs”h]”hŒ L2TP APIs”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjðh²hh³hÇh´K5ubhÞ)�”}”(hŒ@This section documents each userspace API of the L2TP subsystem.”h]”hŒ@This section documents each userspace API of the L2TP subsystem.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K7hjðh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒTunnel Sockets”h]”hŒTunnel Sockets”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K:ubhÞ)�”}”(hŒ?L2TPv2 always uses UDP. L2TPv3 may use UDP or IP encapsulation.”h]”hŒ?L2TPv2 always uses UDP. L2TPv3 may use UDP or IP encapsulation.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjh²hubhÞ)�”}”(hŒFFor example, for a tunnel using IPv4 addresses and UDP encapsulation::”h]”hŒEFor example, for a tunnel using IPv4 addresses and UDP encapsulation:”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KAhjh²hubhŒ literal_block”“”)�”}”(hŒ6int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);”h]”hŒ6int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);”…”�”}”hjLsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´KChjh²hubhÞ)�”}”(hŒ;Or for a tunnel using IPv6 addresses and IP encapsulation::”h]”hŒ:Or for a tunnel using IPv6 addresses and IP encapsulation:”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KEhjh²hubjK)�”}”(hŒ8int sockfd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_L2TP);”h]”hŒ8int sockfd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_L2TP);”…”�”}”hjhsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´KGhjh²hubhÞ)�”}”(hŒ7UDP socket programming doesn't need to be covered here.”h]”hŒ9UDP socket programming doesn’t need to be covered here.”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KIhjh²hubhÞ)�”}”(hXÄIPPROTO_L2TP is an IP protocol type implemented by the kernel's L2TP subsystem. The L2TPIP socket address is defined in struct sockaddr_l2tpip and struct sockaddr_l2tpip6 at `include/uapi/linux/l2tp.h`_. The address includes the L2TP tunnel (connection) id. To use L2TP IP encapsulation, an L2TPv3 application should bind the L2TPIP socket using the locally assigned tunnel id. When the peer's tunnel id and IP address is known, a connect must be done.”h]”(hŒ°IPPROTO_L2TP is an IP protocol type implemented by the kernel’s L2TP subsystem. The L2TPIP socket address is defined in struct sockaddr_l2tpip and struct sockaddr_l2tpip6 at ”…”�”}”(hj„h²hh³Nh´NubhŒ reference”“”)�”}”(hŒ`include/uapi/linux/l2tp.h`_”h]”hŒinclude/uapi/linux/l2tp.h”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œinclude/uapi/linux/l2tp.h”Œrefuri”Œ"../../../include/uapi/linux/l2tp.h”uh1jŒhj„Œresolved”KubhŒü. The address includes the L2TP tunnel (connection) id. To use L2TP IP encapsulation, an L2TPv3 application should bind the L2TPIP socket using the locally assigned tunnel id. When the peer’s tunnel id and IP address is known, a connect must be done.”…”�”}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KKhjh²hubhÞ)�”}”(hXIf the L2TP application needs to handle L2TPv3 tunnel setup requests from peers using L2TPIP, it must open a dedicated L2TPIP socket to listen for those requests and bind the socket using tunnel id 0 since tunnel setup requests are addressed to tunnel id 0.”h]”hXIf the L2TP application needs to handle L2TPv3 tunnel setup requests from peers using L2TPIP, it must open a dedicated L2TPIP socket to listen for those requests and bind the socket using tunnel id 0 since tunnel setup requests are addressed to tunnel id 0.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KThjh²hubhÞ)�”}”(hŒaAn L2TP tunnel and all of its sessions are automatically closed when its tunnel socket is closed.”h]”hŒaAn L2TP tunnel and all of its sessions are automatically closed when its tunnel socket is closed.”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KYhjh²hubeh}”(h]”Œtunnel-sockets”ah ]”h"]”Œtunnel sockets”ah$]”h&]”uh1hÈhjðh²hh³hÇh´K:ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Netlink API”h]”hŒ Netlink API”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÏh²hh³hÇh´K]ubhÞ)�”}”(hŒ™L2TP applications use netlink to manage L2TP tunnel and session instances in the kernel. The L2TP netlink API is defined in `include/uapi/linux/l2tp.h`_.”h]”(hŒ|L2TP applications use netlink to manage L2TP tunnel and session instances in the kernel. The L2TP netlink API is defined in ”…”�”}”(hjàh²hh³Nh´Nubj�)�”}”(hŒ`include/uapi/linux/l2tp.h`_”h]”hŒinclude/uapi/linux/l2tp.h”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œinclude/uapi/linux/l2tp.h”jžjŸuh1jŒhjàj KubhŒ.”…”�”}”(hjàh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K_hjÏh²hubhÞ)�”}”(hŒùL2TP uses `Generic Netlink`_ (GENL). Several commands are defined: Create, Delete, Modify and Get for tunnel and session instances, e.g. ``L2TP_CMD_TUNNEL_CREATE``. The API header lists the netlink attribute types that can be used with each command.”h]”(hŒ L2TP uses ”…”�”}”(hjh²hh³Nh´Nubj�)�”}”(hŒ`Generic Netlink`_”h]”hŒGeneric Netlink”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒGeneric Netlink”jžŒgeneric_netlink.html”uh1jŒhjj KubhŒm (GENL). Several commands are defined: Create, Delete, Modify and Get for tunnel and session instances, e.g. ”…”�”}”(hjh²hh³Nh´Nubj1)�”}”(hŒ``L2TP_CMD_TUNNEL_CREATE``”h]”hŒL2TP_CMD_TUNNEL_CREATE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjubhŒV. The API header lists the netlink attribute types that can be used with each command.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KchjÏh²hubhÞ)�”}”(hX¦Tunnel and session instances are identified by a locally unique 32-bit id. L2TP tunnel ids are given by ``L2TP_ATTR_CONN_ID`` and ``L2TP_ATTR_PEER_CONN_ID`` attributes and L2TP session ids are given by ``L2TP_ATTR_SESSION_ID`` and ``L2TP_ATTR_PEER_SESSION_ID`` attributes. If netlink is used to manage L2TPv2 tunnel and session instances, the L2TPv2 16-bit tunnel/session id is cast to a 32-bit value in these attributes.”h]”(hŒiTunnel and session instances are identified by a locally unique 32-bit id. L2TP tunnel ids are given by ”…”�”}”(hj7h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_CONN_ID``”h]”hŒL2TP_ATTR_CONN_ID”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj7ubhŒ and ”…”�”}”(hj7h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_PEER_CONN_ID``”h]”hŒL2TP_ATTR_PEER_CONN_ID”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj7ubhŒ. attributes and L2TP session ids are given by ”…”�”}”(hj7h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_SESSION_ID``”h]”hŒL2TP_ATTR_SESSION_ID”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj7ubhŒ and ”…”�”}”(hj7h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_PEER_SESSION_ID``”h]”hŒL2TP_ATTR_PEER_SESSION_ID”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj7ubhŒ¡ attributes. If netlink is used to manage L2TPv2 tunnel and session instances, the L2TPv2 16-bit tunnel/session id is cast to a 32-bit value in these attributes.”…”�”}”(hj7h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhjÏh²hubhÞ)�”}”(hXCIn the ``L2TP_CMD_TUNNEL_CREATE`` command, ``L2TP_ATTR_FD`` tells the kernel the tunnel socket fd being used. If not specified, the kernel creates a kernel socket for the tunnel, using IP parameters set in ``L2TP_ATTR_IP[6]_SADDR``, ``L2TP_ATTR_IP[6]_DADDR``, ``L2TP_ATTR_UDP_SPORT``, ``L2TP_ATTR_UDP_DPORT`` attributes. Kernel sockets are used to implement unmanaged L2TPv3 tunnels (iproute2's "ip l2tp" commands). If ``L2TP_ATTR_FD`` is given, it must be a socket fd that is already bound and connected. There is more information about unmanaged tunnels later in this document.”h]”(hŒIn the ”…”�”}”(hj�h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_CMD_TUNNEL_CREATE``”h]”hŒL2TP_CMD_TUNNEL_CREATE”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒ command, ”…”�”}”(hj�h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_FD``”h]”hŒ L2TP_ATTR_FD”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒ“ tells the kernel the tunnel socket fd being used. If not specified, the kernel creates a kernel socket for the tunnel, using IP parameters set in ”…”�”}”(hj�h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_IP[6]_SADDR``”h]”hŒL2TP_ATTR_IP[6]_SADDR”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒ, ”…”�”}”(hj�h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_IP[6]_DADDR``”h]”hŒL2TP_ATTR_IP[6]_DADDR”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒ, ”…”�”}”(hj�h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_UDP_SPORT``”h]”hŒL2TP_ATTR_UDP_SPORT”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒ, ”…”�”}”hj�sbj1)�”}”(hŒ``L2TP_ATTR_UDP_DPORT``”h]”hŒL2TP_ATTR_UDP_DPORT”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒu attributes. Kernel sockets are used to implement unmanaged L2TPv3 tunnels (iproute2’s “ip l2tpâ€� commands). If ”…”�”}”(hj�h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_FD``”h]”hŒ L2TP_ATTR_FD”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj�ubhŒ� is given, it must be a socket fd that is already bound and connected. There is more information about unmanaged tunnels later in this document.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KphjÏh²hubhÞ)�”}”(hŒ'``L2TP_CMD_TUNNEL_CREATE`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_TUNNEL_CREATE``”h]”hŒL2TP_CMD_TUNNEL_CREATE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjubhŒ attributes:-”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KzhjÏh²hubhŒtable”“”)�”}”(hhh]”hŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj<ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj<ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K/uh1j?hj<ubhŒthead”“”)�”}”(hhh]”hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K}hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjfubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K}hj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjfubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K}hj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjfubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjaubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj<ubhŒtbody”“”)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÁubjj)�”}”(hhh]”hÞ)�”}”(hŒY”h]”hŒY”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÁubjj)�”}”(hhh]”hÞ)�”}”(hŒ Sets the tunnel (connection) id.”h]”hŒ Sets the tunnel (connection) id.”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ PEER_CONN_ID”h]”hŒ PEER_CONN_ID”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K€hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K€hj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒ%Sets the peer tunnel (connection) id.”h]”hŒ%Sets the peer tunnel (connection) id.”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K€hj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ PROTO_VERSION”h]”hŒ PROTO_VERSION”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj\ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj\ubjj)�”}”(hhh]”hÞ)�”}”(hŒProtocol version. 2 or 3.”h]”hŒProtocol version. 2 or 3.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj\ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ ENCAP_TYPE”h]”hŒ ENCAP_TYPE”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‚hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj©ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‚hjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj©ubjj)�”}”(hhh]”hÞ)�”}”(hŒEncapsulation type: UDP or IP.”h]”hŒEncapsulation type: UDP or IP.”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‚hjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj©ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒFD”h]”hŒFD”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kƒhjùubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjöubjj)�”}”(hhh]”hÞ)�”}”(hŒN”h]”hŒN”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kƒhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjöubjj)�”}”(hhh]”hÞ)�”}”(hŒTunnel socket file descriptor.”h]”hŒTunnel socket file descriptor.”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kƒhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒUDP_CSUM”h]”hŒUDP_CSUM”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K„hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjDubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K„hj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjDubjj)�”}”(hhh]”hÞ)�”}”(hŒ6Enable IPv4 UDP checksums. Used only if FD is not set.”h]”hŒ6Enable IPv4 UDP checksums. Used only if FD is not set.”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K„hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjDubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒUDP_ZERO_CSUM6_TX”h]”hŒUDP_ZERO_CSUM6_TX”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K†hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj‘ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K†hj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj‘ubjj)�”}”(hhh]”hÞ)�”}”(hŒ?Zero IPv6 UDP checksum on transmit. Used only if FD is not set.”h]”hŒ?Zero IPv6 UDP checksum on transmit. Used only if FD is not set.”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K†hjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒUDP_ZERO_CSUM6_RX”h]”hŒUDP_ZERO_CSUM6_RX”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kˆhjáubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÞubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kˆhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÞubjj)�”}”(hhh]”hÞ)�”}”(hŒ>Zero IPv6 UDP checksum on receive. Used only if FD is not set.”h]”hŒ>Zero IPv6 UDP checksum on receive. Used only if FD is not set.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kˆhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÞubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒIP_SADDR”h]”hŒIP_SADDR”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŠhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj+ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŠhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj+ubjj)�”}”(hhh]”hÞ)�”}”(hŒ0IPv4 source address. Used only if FD is not set.”h]”hŒ0IPv4 source address. Used only if FD is not set.”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŠhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒIP_DADDR”h]”hŒIP_DADDR”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŒhj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjxubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŒhj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjxubjj)�”}”(hhh]”hÞ)�”}”(hŒ5IPv4 destination address. Used only if FD is not set.”h]”hŒ5IPv4 destination address. Used only if FD is not set.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŒhj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjxubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ UDP_SPORT”h]”hŒ UDP_SPORT”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŽhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÅubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŽhjßubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÅubjj)�”}”(hhh]”hÞ)�”}”(hŒ,UDP source port. Used only if FD is not set.”h]”hŒ,UDP source port. Used only if FD is not set.”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŽhjõubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÅubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ UDP_DPORT”h]”hŒ UDP_DPORT”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒ1UDP destination port. Used only if FD is not set.”h]”hŒ1UDP destination port. Used only if FD is not set.”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ IP6_SADDR”h]”hŒ IP6_SADDR”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‘hjbubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj_ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‘hjyubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj_ubjj)�”}”(hhh]”hÞ)�”}”(hŒ0IPv6 source address. Used only if FD is not set.”h]”hŒ0IPv6 source address. Used only if FD is not set.”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‘hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ IP6_DADDR”h]”hŒ IP6_DADDR”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K“hj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¬ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K“hjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¬ubjj)�”}”(hhh]”hÞ)�”}”(hŒ5IPv6 destination address. Used only if FD is not set.”h]”hŒ5IPv6 destination address. Used only if FD is not set.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K“hjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒDEBUG”h]”hŒDEBUG”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K•hjüubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjùubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K•hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjùubjj)�”}”(hhh]”hÞ)�”}”(hŒ Debug flags.”h]”hŒ Debug flags.”…”�”}”(hj, h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K•hj) ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjùubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj<ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒ(``L2TP_CMD_TUNNEL_DESTROY`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_TUNNEL_DESTROY``”h]”hŒL2TP_CMD_TUNNEL_DESTROY”…”�”}”(hj] h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjY ubhŒ attributes:-”…”�”}”(hjY h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K˜hjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjx ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjx ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K)uh1j?hjx ubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K›hjŸ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjœ ubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K›hj¶ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjœ ubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K›hjÍ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjœ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj™ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjx ubj½)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hjö ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjó ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjó ubjj)�”}”(hhh]”hÞ)�”}”(hŒ)Identifies the tunnel id to be destroyed.”h]”hŒ)Identifies the tunnel id to be destroyed.”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjó ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjð ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjx ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hju ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒ'``L2TP_CMD_TUNNEL_MODIFY`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_TUNNEL_MODIFY``”h]”hŒL2TP_CMD_TUNNEL_MODIFY”…”�”}”(hjW h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjS ubhŒ attributes:-”…”�”}”(hjS h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjr ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjr ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K(uh1j?hjr ubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hjœ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K£hj™ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj– ubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K£hj° ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj– ubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hjÊ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K£hjÇ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj– ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj“ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjr ubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hjó h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¥hjð ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjí ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¥hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjí ubjj)�”}”(hhh]”hÞ)�”}”(hŒ(Identifies the tunnel id to be modified.”h]”hŒ(Identifies the tunnel id to be modified.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¥hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjí ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjê ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒDEBUG”h]”hŒDEBUG”…”�”}”(hj@ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¦hj= ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj: ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjW h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¦hjT ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj: ubjj)�”}”(hhh]”hÞ)�”}”(hŒ Debug flags.”h]”hŒ Debug flags.”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¦hjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj: ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjê ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjr ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hjo ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒ$``L2TP_CMD_TUNNEL_GET`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_TUNNEL_GET``”h]”hŒL2TP_CMD_TUNNEL_GET”…”�”}”(hjž h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjš ubhŒ attributes:-”…”�”}”(hjš h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K©hjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj¹ ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj¹ ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K'uh1j?hj¹ ubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¬hjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÝ ubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hjú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¬hj÷ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÝ ubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¬hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÝ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjÚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj¹ ubj½)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hj: h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K®hj7 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj4 ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K®hjN ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj4 ubjj)�”}”(hhh]”hÞ)�”}”(hŒAIdentifies the tunnel id to be queried. Ignored in DUMP requests.”h]”hŒAIdentifies the tunnel id to be queried. Ignored in DUMP requests.”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K®hjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj4 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj1 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj¹ ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hj¶ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒ(``L2TP_CMD_SESSION_CREATE`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_SESSION_CREATE``”h]”hŒL2TP_CMD_SESSION_CREATE”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj” ubhŒ attributes:-”…”�”}”(hj” h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K²hjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj³ ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj³ ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K*uh1j?hj³ ubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hjÝ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KµhjÚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj× ubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hjô h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kµhjñ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj× ubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kµhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj× ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjÔ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj³ ubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K·hj1 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj. ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjK h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K·hjH ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj. ubjj)�”}”(hhh]”hÞ)�”}”(hŒThe parent tunnel id.”h]”hŒThe parent tunnel id.”…”�”}”(hja h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K·hj^ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj. ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ SESSION_ID”h]”hŒ SESSION_ID”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¸hj~ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¸hj• ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ ubjj)�”}”(hhh]”hÞ)�”}”(hŒSets the session id.”h]”hŒSets the session id.”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¸hj« ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒPEER_SESSION_ID”h]”hŒPEER_SESSION_ID”…”�”}”(hjÎ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¹hjË ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÈ ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¹hjâ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÈ ubjj)�”}”(hhh]”hÞ)�”}”(hŒSets the parent session id.”h]”hŒSets the parent session id.”…”�”}”(hjû h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¹hjø ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÈ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒPW_TYPE”h]”hŒPW_TYPE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kºhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kºhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒSets the pseudowire type.”h]”hŒSets the pseudowire type.”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KºhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒDEBUG”h]”hŒDEBUG”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K»hjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjbubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K»hj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjbubjj)�”}”(hhh]”hÞ)�”}”(hŒ Debug flags.”h]”hŒ Debug flags.”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K»hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjbubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒRECV_SEQ”h]”hŒRECV_SEQ”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¼hj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¯ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¼hjÉubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¯ubjj)�”}”(hhh]”hÞ)�”}”(hŒ Enable rx data sequence numbers.”h]”hŒ Enable rx data sequence numbers.”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¼hjßubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¯ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒSEND_SEQ”h]”hŒSEND_SEQ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K½hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjüubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K½hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjüubjj)�”}”(hhh]”hÞ)�”}”(hŒ Enable tx data sequence numbers.”h]”hŒ Enable tx data sequence numbers.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K½hj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjüubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒLNS_MODE”h]”hŒLNS_MODE”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¾hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjIubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¾hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjIubjj)�”}”(hhh]”hÞ)�”}”(hŒ4Enable LNS mode (auto-enable data sequence numbers).”h]”hŒ4Enable LNS mode (auto-enable data sequence numbers).”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¾hjyubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ RECV_TIMEOUT”h]”hŒ RECV_TIMEOUT”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÀhj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj–ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÀhj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj–ubjj)�”}”(hhh]”hÞ)�”}”(hŒ1Timeout to wait when reordering received packets.”h]”hŒ1Timeout to wait when reordering received packets.”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÀhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj–ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ L2SPEC_TYPE”h]”hŒ L2SPEC_TYPE”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÂhjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjãubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÂhjýubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjãubjj)�”}”(hhh]”hÞ)�”}”(hŒ1Sets layer2-specific-sublayer type (L2TPv3 only).”h]”hŒ1Sets layer2-specific-sublayer type (L2TPv3 only).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÂhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjãubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCOOKIE”h]”hŒCOOKIE”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÄhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj0ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÄhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj0ubjj)�”}”(hhh]”hÞ)�”}”(hŒ#Sets optional cookie (L2TPv3 only).”h]”hŒ#Sets optional cookie (L2TPv3 only).”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÄhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ PEER_COOKIE”h]”hŒ PEER_COOKIE”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÅhj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj}ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÅhj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj}ubjj)�”}”(hhh]”hÞ)�”}”(hŒ(Sets optional peer cookie (L2TPv3 only).”h]”hŒ(Sets optional peer cookie (L2TPv3 only).”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÅhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒIFNAME”h]”hŒIFNAME”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÆhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÊubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÆhjäubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÊubjj)�”}”(hhh]”hÞ)�”}”(hŒ"Sets interface name (L2TPv3 only).”h]”hŒ"Sets interface name (L2TPv3 only).”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÆhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÊubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj+ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj³ ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hj° ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hX For Ethernet session types, this will create an l2tpeth virtual interface which can then be configured as required. For PPP session types, a PPPoL2TP socket must also be opened and connected, mapping it onto the new session. This is covered in "PPPoL2TP Sockets" later.”h]”hXFor Ethernet session types, this will create an l2tpeth virtual interface which can then be configured as required. For PPP session types, a PPPoL2TP socket must also be opened and connected, mapping it onto the new session. This is covered in “PPPoL2TP Socketsâ€� later.”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÉhjÏh²hubhÞ)�”}”(hŒ)``L2TP_CMD_SESSION_DESTROY`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_SESSION_DESTROY``”h]”hŒL2TP_CMD_SESSION_DESTROY”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj8ubhŒ attributes:-”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÎhjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjWubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjWubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K.uh1j?hjWubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÑhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÑhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÑhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjxubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjWubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÓhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÒubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÓhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÒubjj)�”}”(hhh]”hÞ)�”}”(hŒ?Identifies the parent tunnel id of the session to be destroyed.”h]”hŒ?Identifies the parent tunnel id of the session to be destroyed.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÓhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjÏubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ SESSION_ID”h]”hŒ SESSION_ID”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÕhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÕhj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒ*Identifies the session id to be destroyed.”h]”hŒ*Identifies the session id to be destroyed.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÕhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjÏubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒIFNAME”h]”hŒIFNAME”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÖhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjlubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÖhj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjlubjj)�”}”(hhh]”hÞ)�”}”(hŒžIdentifies the session by interface name. If set, this overrides any CONN_ID and SESSION_ID attributes. Currently supported for L2TPv3 Ethernet sessions only.”h]”hŒžIdentifies the session by interface name. If set, this overrides any CONN_ID and SESSION_ID attributes. Currently supported for L2TPv3 Ethernet sessions only.”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÖhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjlubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjÏubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjWubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hjTubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒ(``L2TP_CMD_SESSION_MODIFY`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_SESSION_MODIFY``”h]”hŒL2TP_CMD_SESSION_MODIFY”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjÌubhŒ attributes:-”…”�”}”(hjÌh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÜhjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjëubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjëubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K.uh1j?hjëubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kßhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kßhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kßhj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjëubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Káhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjfubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Káhj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjfubjj)�”}”(hhh]”hÞ)�”}”(hŒ>Identifies the parent tunnel id of the session to be modified.”h]”hŒ>Identifies the parent tunnel id of the session to be modified.”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Káhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjfubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ SESSION_ID”h]”hŒ SESSION_ID”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kãhj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj³ubjj)�”}”(hhh]”hÞ)�”}”(hjàh]”hŒY”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KãhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj³ubjj)�”}”(hhh]”hÞ)�”}”(hŒ)Identifies the session id to be modified.”h]”hŒ)Identifies the session id to be modified.”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kãhjãubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj³ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒIFNAME”h]”hŒIFNAME”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kähjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kähjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒžIdentifies the session by interface name. If set, this overrides any CONN_ID and SESSION_ID attributes. Currently supported for L2TPv3 Ethernet sessions only.”h]”hŒžIdentifies the session by interface name. If set, this overrides any CONN_ID and SESSION_ID attributes. Currently supported for L2TPv3 Ethernet sessions only.”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kähj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒDEBUG”h]”hŒDEBUG”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KèhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjMubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kèhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjMubjj)�”}”(hhh]”hÞ)�”}”(hŒ Debug flags.”h]”hŒ Debug flags.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kèhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjMubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒRECV_SEQ”h]”hŒRECV_SEQ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kéhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjšubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kéhj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjšubjj)�”}”(hhh]”hÞ)�”}”(hŒ Enable rx data sequence numbers.”h]”hŒ Enable rx data sequence numbers.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KéhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjšubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒSEND_SEQ”h]”hŒSEND_SEQ”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kêhjêubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjçubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kêhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjçubjj)�”}”(hhh]”hÞ)�”}”(hŒ Enable tx data sequence numbers.”h]”hŒ Enable tx data sequence numbers.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kêhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒLNS_MODE”h]”hŒLNS_MODE”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Këhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj4ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KëhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj4ubjj)�”}”(hhh]”hÞ)�”}”(hŒ4Enable LNS mode (auto-enable data sequence numbers).”h]”hŒ4Enable LNS mode (auto-enable data sequence numbers).”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Këhjdubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj4ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ RECV_TIMEOUT”h]”hŒ RECV_TIMEOUT”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kíhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj�ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kíhj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj�ubjj)�”}”(hhh]”hÞ)�”}”(hŒ1Timeout to wait when reordering received packets.”h]”hŒ1Timeout to wait when reordering received packets.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kíhj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjcubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjëubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hjèubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒ%``L2TP_CMD_SESSION_GET`` attributes:-”h]”(j1)�”}”(hŒ``L2TP_CMD_SESSION_GET``”h]”hŒL2TP_CMD_SESSION_GET”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjáubhŒ attributes:-”…”�”}”(hjáh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KñhjÏh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hjubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K)uh1j?hjubj`)�”}”(hhh]”je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ Attribute”h]”hŒ Attribute”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kôhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj$ubjj)�”}”(hhh]”hÞ)�”}”(hŒRequired”h]”hŒRequired”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kôhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj$ubjj)�”}”(hhh]”hÞ)�”}”(hŒUse”h]”hŒUse”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KôhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒCONN_ID”h]”hŒCONN_ID”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Köhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Köhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ubjj)�”}”(hhh]”hÞ)�”}”(hŒBIdentifies the tunnel id to be queried. Ignored for DUMP requests.”h]”hŒBIdentifies the tunnel id to be queried. Ignored for DUMP requests.”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Köhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjxubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ SESSION_ID”h]”hŒ SESSION_ID”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KøhjËubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÈubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Køhjâubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÈubjj)�”}”(hhh]”hÞ)�”}”(hŒCIdentifies the session id to be queried. Ignored for DUMP requests.”h]”hŒCIdentifies the session id to be queried. Ignored for DUMP requests.”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Køhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjÈubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjxubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒIFNAME”h]”hŒIFNAME”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kúhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hjh]”hŒN”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kúhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒ¹Identifies the session by interface name. If set, this overrides any CONN_ID and SESSION_ID attributes. Ignored for DUMP requests. Currently supported for L2TPv3 Ethernet sessions only.”h]”hŒ¹Identifies the session by interface name. If set, this overrides any CONN_ID and SESSION_ID attributes. Ignored for DUMP requests. Currently supported for L2TPv3 Ethernet sessions only.”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KúhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjxubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hjýubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjÏh²hh³hÇh´NubhÞ)�”}”(hŒrApplication developers should refer to `include/uapi/linux/l2tp.h`_ for netlink command and attribute definitions.”h]”(hŒ'Application developers should refer to ”…”�”}”(hjuh²hh³Nh´Nubj�)�”}”(hŒ`include/uapi/linux/l2tp.h`_”h]”hŒinclude/uapi/linux/l2tp.h”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œinclude/uapi/linux/l2tp.h”jžjŸuh1jŒhjuj KubhŒ/ for netlink command and attribute definitions.”…”�”}”(hjuh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MhjÏh²hubhÞ)�”}”(hŒ$Sample userspace code using libmnl_:”h]”(hŒSample userspace code using ”…”�”}”(hj—h²hh³Nh´Nubj�)�”}”(hŒlibmnl_”h]”hŒlibmnl”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œlibmnl”jžŒ)https://www.netfilter.org/projects/libmnl”uh1jŒhj—j KubhŒ:”…”�”}”(hj—h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MhjÏh²hubjk)�”}”(hXN - Open L2TP netlink socket:: struct nl_sock *nl_sock; int l2tp_nl_family_id; nl_sock = nl_socket_alloc(); genl_connect(nl_sock); genl_id = genl_ctrl_resolve(nl_sock, L2TP_GENL_NAME); - Create a tunnel:: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_FD, tunl_sock_fd); mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u8(nlh, L2TP_ATTR_PROTO_VERSION, protocol_version); mnl_attr_put_u16(nlh, L2TP_ATTR_ENCAP_TYPE, encap); - Create a session:: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_SESSION_ID, peer_sid); mnl_attr_put_u16(nlh, L2TP_ATTR_PW_TYPE, pwtype); /* there are other session options which can be set using netlink * attributes during session creation -- see l2tp.h */ - Delete a session:: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid); - Delete a tunnel and all of its sessions (if any):: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); ”h]”hŒ bullet_list”“”)�”}”(hhh]”(jv)�”}”(hŒËOpen L2TP netlink socket:: struct nl_sock *nl_sock; int l2tp_nl_family_id; nl_sock = nl_socket_alloc(); genl_connect(nl_sock); genl_id = genl_ctrl_resolve(nl_sock, L2TP_GENL_NAME); ”h]”(hÞ)�”}”(hŒOpen L2TP netlink socket::”h]”hŒOpen L2TP netlink socket:”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MhjÃubjK)�”}”(hŒšstruct nl_sock *nl_sock; int l2tp_nl_family_id; nl_sock = nl_socket_alloc(); genl_connect(nl_sock); genl_id = genl_ctrl_resolve(nl_sock, L2TP_GENL_NAME);”h]”hŒšstruct nl_sock *nl_sock; int l2tp_nl_family_id; nl_sock = nl_socket_alloc(); genl_connect(nl_sock); genl_id = genl_ctrl_resolve(nl_sock, L2TP_GENL_NAME);”…”�”}”hjÕsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´MhjÃubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjÀubjv)�”}”(hXÁCreate a tunnel:: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_FD, tunl_sock_fd); mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u8(nlh, L2TP_ATTR_PROTO_VERSION, protocol_version); mnl_attr_put_u16(nlh, L2TP_ATTR_ENCAP_TYPE, encap); ”•%h]”(hÞ)�”}”(hŒCreate a tunnel::”h]”hŒCreate a tunnel:”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MhjéubjK)�”}”(hXqstruct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_FD, tunl_sock_fd); mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u8(nlh, L2TP_ATTR_PROTO_VERSION, protocol_version); mnl_attr_put_u16(nlh, L2TP_ATTR_ENCAP_TYPE, encap);”h]”hXqstruct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_FD, tunl_sock_fd); mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u8(nlh, L2TP_ATTR_PROTO_VERSION, protocol_version); mnl_attr_put_u16(nlh, L2TP_ATTR_ENCAP_TYPE, encap);”…”�”}”hjûsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´Mhjéubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjÀubjv)�”}”(hXACreate a session:: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_SESSION_ID, peer_sid); mnl_attr_put_u16(nlh, L2TP_ATTR_PW_TYPE, pwtype); /* there are other session options which can be set using netlink * attributes during session creation -- see l2tp.h */ ”h]”(hÞ)�”}”(hŒCreate a session::”h]”hŒCreate a session:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M$hjubjK)�”}”(hXästruct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_SESSION_ID, peer_sid); mnl_attr_put_u16(nlh, L2TP_ATTR_PW_TYPE, pwtype); /* there are other session options which can be set using netlink * attributes during session creation -- see l2tp.h */”h]”hXästruct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_CREATE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_CONN_ID, peer_tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid); mnl_attr_put_u32(nlh, L2TP_ATTR_PEER_SESSION_ID, peer_sid); mnl_attr_put_u16(nlh, L2TP_ATTR_PW_TYPE, pwtype); /* there are other session options which can be set using netlink * attributes during session creation -- see l2tp.h */”…”�”}”hj!sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´M&hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjÀubjv)�”}”(hXDelete a session:: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid); ”h]”(hÞ)�”}”(hŒDelete a session::”h]”hŒDelete a session:”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M<hj5ubjK)�”}”(hXÃstruct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid);”h]”hXÃstruct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_SESSION_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); mnl_attr_put_u32(nlh, L2TP_ATTR_SESSION_ID, sid);”…”�”}”hjGsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´M>hj5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjÀubjv)�”}”(hXñDelete a tunnel and all of its sessions (if any):: struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid); ”h]”(hÞ)�”}”(hŒ2Delete a tunnel and all of its sessions (if any)::”h]”hŒ1Delete a tunnel and all of its sessions (if any):”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MNhj[ubjK)�”}”(hX�struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid);”h]”hX�struct nlmsghdr *nlh; struct genlmsghdr *gnlh; nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = genl_id; /* assigned to genl socket */ nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = seq; gnlh = mnl_nlmsg_put_extra_header(nlh, sizeof(*gnlh)); gnlh->cmd = L2TP_CMD_TUNNEL_DELETE; gnlh->version = L2TP_GENL_VERSION; gnlh->reserved = 0; mnl_attr_put_u32(nlh, L2TP_ATTR_CONN_ID, tid);”…”�”}”hjmsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´MPhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjÀubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j¾h³hÇh´Mhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´MhjÏh²hubeh}”(h]”Œ netlink-api”ah ]”h"]”Œ netlink api”ah$]”h&]”uh1hÈhjðh²hh³hÇh´K]ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒPPPoL2TP Session Socket API”h]”hŒPPPoL2TP Session Socket API”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj—h²hh³hÇh´M`ubhÞ)�”}”(hŒZFor PPP session types, a PPPoL2TP socket must be opened and connected to the L2TP session.”h]”hŒZFor PPP session types, a PPPoL2TP socket must be opened and connected to the L2TP session.”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mbhj—h²hubhÞ)�”}”(hX When creating PPPoL2TP sockets, the application provides information to the kernel about the tunnel and session in a socket connect() call. Source and destination tunnel and session ids are provided, as well as the file descriptor of a UDP or L2TPIP socket. See struct pppol2tp_addr in `include/linux/if_pppol2tp.h`_. For historical reasons, there are unfortunately slightly different address structures for L2TPv2/L2TPv3 IPv4/IPv6 tunnels and userspace must use the appropriate structure that matches the tunnel socket type.”h]”(hXWhen creating PPPoL2TP sockets, the application provides information to the kernel about the tunnel and session in a socket connect() call. Source and destination tunnel and session ids are provided, as well as the file descriptor of a UDP or L2TPIP socket. See struct pppol2tp_addr in ”…”�”}”(hj¶h²hh³Nh´Nubj�)�”}”(hŒ`include/linux/if_pppol2tp.h`_”h]”hŒinclude/linux/if_pppol2tp.h”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œinclude/linux/if_pppol2tp.h”jžŒ$../../../include/linux/if_pppol2tp.h”uh1jŒhj¶j KubhŒÑ. For historical reasons, there are unfortunately slightly different address structures for L2TPv2/L2TPv3 IPv4/IPv6 tunnels and userspace must use the appropriate structure that matches the tunnel socket type.”…”�”}”(hj¶h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mehj—h²hubhÞ)�”}”(hŒ”Userspace may control behavior of the tunnel or session using setsockopt and ioctl on the PPPoX socket. The following socket options are supported:-”h]”hŒ”Userspace may control behavior of the tunnel or session using setsockopt and ioctl on the PPPoX socket. The following socket options are supported:-”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mnhj—h²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1j?hjêubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K;uh1j?hjêubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒDEBUG”h]”hŒDEBUG”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mshjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubjj)�”}”(hhh]”hÞ)�”}”(hŒ/bitmask of debug message categories. See below.”h]”hŒ/bitmask of debug message categories. See below.”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mshjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒSENDSEQ”h]”hŒSENDSEQ”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mthj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj;ubjj)�”}”(hhh]”j¿)�”}”(hhh]”(jv)�”}”(hŒ-0 => don't send packets with sequence numbers”h]”hÞ)�”}”(hj]h]”hŒ/0 => don’t send packets with sequence numbers”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mthj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjXubjv)�”}”(hŒ'1 => send packets with sequence numbers”h]”hÞ)�”}”(hjth]”hŒ'1 => send packets with sequence numbers”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Muhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjXubeh}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´MthjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒRECVSEQ”h]”hŒRECVSEQ”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mvhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj›ubjj)�”}”(hhh]”j¿)�”}”(hhh]”(jv)�”}”(hŒ10 => receive packet sequence numbers are optional”h]”hÞ)�”}”(hj½h]”hŒ10 => receive packet sequence numbers are optional”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mvhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj¸ubjv)�”}”(hŒ21 => drop receive packets without sequence numbers”h]”hÞ)�”}”(hjÔh]”hŒ21 => drop receive packets without sequence numbers”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MwhjÒubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj¸ubeh}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´Mvhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj›ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒLNSMODE”h]”hŒLNSMODE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mxhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjûubjj)�”}”(hhh]”j¿)�”}”(hhh]”(jv)�”}”(hŒ0 => act as LAC.”h]”hÞ)�”}”(hjh]”hŒ0 => act as LAC.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mxhjubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjubjv)�”}”(hŒ1 => act as LNS.”h]”hÞ)�”}”(hj4h]”hŒ1 => act as LNS.”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Myhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjubeh}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´Mxhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjûubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ REORDERTO”h]”hŒ REORDERTO”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mzhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj[ubjj)�”}”(hhh]”hÞ)�”}”(hŒ;reorder timeout (in millisecs). If 0, don't try to reorder.”h]”hŒ=reorder timeout (in millisecs). If 0, don’t try to reorder.”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mzhjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjêubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hjçubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hj—h²hh³hÇh´NubhÞ)�”}”(hŒ½In addition to the standard PPP ioctls, a PPPIOCGL2TPSTATS is provided to retrieve tunnel and session statistics from the kernel using the PPPoX socket of the appropriate tunnel or session.”h]”hŒ½In addition to the standard PPP ioctls, a PPPIOCGL2TPSTATS is provided to retrieve tunnel and session statistics from the kernel using the PPPoX socket of the appropriate tunnel or session.”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M}hj—h²hubhÞ)�”}”(hŒSample userspace code:”h]”hŒSample userspace code:”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M�hj—h²hubjk)�”}”(hX¥- Create session PPPoX data socket:: /* Input: the L2TP tunnel UDP socket `tunnel_fd`, which needs to be * bound already (both sockname and peername), otherwise it will not be * ready. */ struct sockaddr_pppol2tp sax; int session_fd; int ret; session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (session_fd < 0) return -errno; sax.sa_family = AF_PPPOX; sax.sa_protocol = PX_PROTO_OL2TP; sax.pppol2tp.fd = tunnel_fd; sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr; sax.pppol2tp.addr.sin_port = addr->sin_port; sax.pppol2tp.addr.sin_family = AF_INET; sax.pppol2tp.s_tunnel = tunnel_id; sax.pppol2tp.s_session = session_id; sax.pppol2tp.d_tunnel = peer_tunnel_id; sax.pppol2tp.d_session = peer_session_id; /* session_fd is the fd of the session's PPPoL2TP socket. * tunnel_fd is the fd of the tunnel UDP / L2TPIP socket. */ ret = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax)); if (ret < 0 ) { close(session_fd); return -errno; } return session_fd; ”h]”j¿)�”}”(hhh]”jv)�”}”(hXiCreate session PPPoX data socket:: /* Input: the L2TP tunnel UDP socket `tunnel_fd`, which needs to be * bound already (both sockname and peername), otherwise it will not be * ready. */ struct sockaddr_pppol2tp sax; int session_fd; int ret; session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (session_fd < 0) return -errno; sax.sa_family = AF_PPPOX; sax.sa_protocol = PX_PROTO_OL2TP; sax.pppol2tp.fd = tunnel_fd; sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr; sax.pppol2tp.addr.sin_port = addr->sin_port; sax.pppol2tp.addr.sin_family = AF_INET; sax.pppol2tp.s_tunnel = tunnel_id; sax.pppol2tp.s_session = session_id; sax.pppol2tp.d_tunnel = peer_tunnel_id; sax.pppol2tp.d_session = peer_session_id; /* session_fd is the fd of the session's PPPoL2TP socket. * tunnel_fd is the fd of the tunnel UDP / L2TPIP socket. */ ret = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax)); if (ret < 0 ) { close(session_fd); return -errno; } return session_fd; ”h]”(hÞ)�”}”(hŒ"Create session PPPoX data socket::”h]”hŒ!Create session PPPoX data socket:”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MƒhjÈubjK)�”}”(hXÐ/* Input: the L2TP tunnel UDP socket `tunnel_fd`, which needs to be * bound already (both sockname and peername), otherwise it will not be * ready. */ struct sockaddr_pppol2tp sax; int session_fd; int ret; session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (session_fd < 0) return -errno; sax.sa_family = AF_PPPOX; sax.sa_protocol = PX_PROTO_OL2TP; sax.pppol2tp.fd = tunnel_fd; sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr; sax.pppol2tp.addr.sin_port = addr->sin_port; sax.pppol2tp.addr.sin_family = AF_INET; sax.pppol2tp.s_tunnel = tunnel_id; sax.pppol2tp.s_session = session_id; sax.pppol2tp.d_tunnel = peer_tunnel_id; sax.pppol2tp.d_session = peer_session_id; /* session_fd is the fd of the session's PPPoL2TP socket. * tunnel_fd is the fd of the tunnel UDP / L2TPIP socket. */ ret = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax)); if (ret < 0 ) { close(session_fd); return -errno; } return session_fd;”h]”hXÐ/* Input: the L2TP tunnel UDP socket `tunnel_fd`, which needs to be * bound already (both sockname and peername), otherwise it will not be * ready. */ struct sockaddr_pppol2tp sax; int session_fd; int ret; session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (session_fd < 0) return -errno; sax.sa_family = AF_PPPOX; sax.sa_protocol = PX_PROTO_OL2TP; sax.pppol2tp.fd = tunnel_fd; sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr; sax.pppol2tp.addr.sin_port = addr->sin_port; sax.pppol2tp.addr.sin_family = AF_INET; sax.pppol2tp.s_tunnel = tunnel_id; sax.pppol2tp.s_session = session_id; sax.pppol2tp.d_tunnel = peer_tunnel_id; sax.pppol2tp.d_session = peer_session_id; /* session_fd is the fd of the session's PPPoL2TP socket. * tunnel_fd is the fd of the tunnel UDP / L2TPIP socket. */ ret = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax)); if (ret < 0 ) { close(session_fd); return -errno; } return session_fd;”…”�”}”hjÚsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´M…hjÈubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjÅubah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´MƒhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´Mƒhj—h²hubhÞ)�”}”(hŒEL2TP control packets will still be available for read on `tunnel_fd`.”h]”(hŒ9L2TP control packets will still be available for read on ”…”�”}”(hjúh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `tunnel_fd`”h]”hŒ tunnel_fd”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjúubhŒ.”…”�”}”(hjúh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¨hj—h²hubjk)�”}”(hXB- Create PPP channel:: /* Input: the session PPPoX data socket `session_fd` which was created * as described above. */ int ppp_chan_fd; int chindx; int ret; ret = ioctl(session_fd, PPPIOCGCHAN, &chindx); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx); if (ret < 0) { close(ppp_chan_fd); return -errno; } return ppp_chan_fd; ”h]”j¿)�”}”(hhh]”jv)�”}”(hXCreate PPP channel:: /* Input: the session PPPoX data socket `session_fd` which was created * as described above. */ int ppp_chan_fd; int chindx; int ret; ret = ioctl(session_fd, PPPIOCGCHAN, &chindx); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx); if (ret < 0) { close(ppp_chan_fd); return -errno; } return ppp_chan_fd; ”h]”(hÞ)�”}”(hŒCreate PPP channel::”h]”hŒCreate PPP channel:”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mªhj#ubjK)�”}”(hX½/* Input: the session PPPoX data socket `session_fd` which was created * as described above. */ int ppp_chan_fd; int chindx; int ret; ret = ioctl(session_fd, PPPIOCGCHAN, &chindx); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx); if (ret < 0) { close(ppp_chan_fd); return -errno; } return ppp_chan_fd;”h]”hX½/* Input: the session PPPoX data socket `session_fd` which was created * as described above. */ int ppp_chan_fd; int chindx; int ret; ret = ioctl(session_fd, PPPIOCGCHAN, &chindx); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx); if (ret < 0) { close(ppp_chan_fd); return -errno; } return ppp_chan_fd;”…”�”}”hj5sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´M¬hj#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhj ubah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´Mªhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´Mªhj—h²hubhÞ)�”}”(hŒ;LCP PPP frames will be available for read on `ppp_chan_fd`.”h]”(hŒ-LCP PPP frames will be available for read on ”…”�”}”(hjUh²hh³Nh´Nubj)�”}”(hŒ `ppp_chan_fd`”h]”hŒ ppp_chan_fd”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjUubhŒ.”…”�”}”(hjUh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÄhj—h²hubjk)�”}”(hX]- Create PPP interface:: /* Input: the PPP channel `ppp_chan_fd` which was created as described * above. */ int ifunit = -1; int ppp_if_fd; int ret; ppp_if_fd = open("/dev/ppp", O_RDWR); if (ppp_if_fd < 0) return -errno; ret = ioctl(ppp_if_fd, PPPIOCNEWUNIT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCCONNECT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } return ppp_if_fd; ”h]”j¿)�”}”(hhh]”jv)�”}”(hX3Create PPP interface:: /* Input: the PPP channel `ppp_chan_fd` which was created as described * above. */ int ifunit = -1; int ppp_if_fd; int ret; ppp_if_fd = open("/dev/ppp", O_RDWR); if (ppp_if_fd < 0) return -errno; ret = ioctl(ppp_if_fd, PPPIOCNEWUNIT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCCONNECT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } return ppp_if_fd; ”h]”(hÞ)�”}”(hŒCreate PPP interface::”h]”hŒCreate PPP interface:”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÆhj|ubjK)�”}”(hXÊ/* Input: the PPP channel `ppp_chan_fd` which was created as described * above. */ int ifunit = -1; int ppp_if_fd; int ret; ppp_if_fd = open("/dev/ppp", O_RDWR); if (ppp_if_fd < 0) return -errno; ret = ioctl(ppp_if_fd, PPPIOCNEWUNIT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCCONNECT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } return ppp_if_fd;”h]”hXÊ/* Input: the PPP channel `ppp_chan_fd` which was created as described * above. */ int ifunit = -1; int ppp_if_fd; int ret; ppp_if_fd = open("/dev/ppp", O_RDWR); if (ppp_if_fd < 0) return -errno; ret = ioctl(ppp_if_fd, PPPIOCNEWUNIT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCCONNECT, &ifunit); if (ret < 0) { close(ppp_if_fd); return -errno; } return ppp_if_fd;”…”�”}”hjŽsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´MÈhj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjyubah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´MÆhjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´MÆhj—h²hubhÞ)�”}”(hŒAIPCP/IPv6CP PPP frames will be available for read on `ppp_if_fd`.”h]”(hŒ5IPCP/IPv6CP PPP frames will be available for read on ”…”�”}”(hj®h²hh³Nh´Nubj)�”}”(hŒ `ppp_if_fd`”h]”hŒ ppp_if_fd”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj®ubhŒ.”…”�”}”(hj®h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mâhj—h²hubhÞ)�”}”(hŒÜThe ppp interface can then be configured as usual with netlink's RTM_NEWLINK, RTM_NEWADDR, RTM_NEWROUTE, or ioctl's SIOCSIFMTU, SIOCSIFADDR, SIOCSIFDSTADDR, SIOCSIFNETMASK, SIOCSIFFLAGS, or with the `ip` command.”h]”(hŒÓThe ppp interface can then be configured as usual with netlink’s RTM_NEWLINK, RTM_NEWADDR, RTM_NEWROUTE, or ioctl’s SIOCSIFMTU, SIOCSIFADDR, SIOCSIFDSTADDR, SIOCSIFNETMASK, SIOCSIFFLAGS, or with the ”…”�”}”(hjÎh²hh³Nh´Nubj)�”}”(hŒ`ip`”h]”hŒip”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÎubhŒ command.”…”�”}”(hjÎh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mähj—h²hubjk)�”}”(hX- Bridging L2TP sessions which have PPP pseudowire types (this is also called L2TP tunnel switching or L2TP multihop) is supported by bridging the PPP channels of the two L2TP sessions to be bridged:: /* Input: the session PPPoX data sockets `session_fd1` and `session_fd2` * which were created as described further above. */ int ppp_chan_fd; int chindx1; int chindx2; int ret; ret = ioctl(session_fd1, PPPIOCGCHAN, &chindx1); if (ret < 0) return -errno; ret = ioctl(session_fd2, PPPIOCGCHAN, &chindx2); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx1); if (ret < 0) { close(ppp_chan_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCBRIDGECHAN, &chindx2); close(ppp_chan_fd); if (ret < 0) return -errno; return 0; ”h]”j¿)�”}”(hhh]”jv)�”}”(hX×Bridging L2TP sessions which have PPP pseudowire types (this is also called L2TP tunnel switching or L2TP multihop) is supported by bridging the PPP channels of the two L2TP sessions to be bridged:: /* Input: the session PPPoX data sockets `session_fd1` and `session_fd2` * which were created as described further above. */ int ppp_chan_fd; int chindx1; int chindx2; int ret; ret = ioctl(session_fd1, PPPIOCGCHAN, &chindx1); if (ret < 0) return -errno; ret = ioctl(session_fd2, PPPIOCGCHAN, &chindx2); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx1); if (ret < 0) { close(ppp_chan_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCBRIDGECHAN, &chindx2); close(ppp_chan_fd); if (ret < 0) return -errno; return 0; ”h]”(hÞ)�”}”(hŒÆBridging L2TP sessions which have PPP pseudowire types (this is also called L2TP tunnel switching or L2TP multihop) is supported by bridging the PPP channels of the two L2TP sessions to be bridged::”h]”hŒÅBridging L2TP sessions which have PPP pseudowire types (this is also called L2TP tunnel switching or L2TP multihop) is supported by bridging the PPP channels of the two L2TP sessions to be bridged:”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MèhjõubjK)�”}”(hX¦/* Input: the session PPPoX data sockets `session_fd1` and `session_fd2` * which were created as described further above. */ int ppp_chan_fd; int chindx1; int chindx2; int ret; ret = ioctl(session_fd1, PPPIOCGCHAN, &chindx1); if (ret < 0) return -errno; ret = ioctl(session_fd2, PPPIOCGCHAN, &chindx2); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx1); if (ret < 0) { close(ppp_chan_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCBRIDGECHAN, &chindx2); close(ppp_chan_fd); if (ret < 0) return -errno; return 0;”h]”hX¦/* Input: the session PPPoX data sockets `session_fd1` and `session_fd2` * which were created as described further above. */ int ppp_chan_fd; int chindx1; int chindx2; int ret; ret = ioctl(session_fd1, PPPIOCGCHAN, &chindx1); if (ret < 0) return -errno; ret = ioctl(session_fd2, PPPIOCGCHAN, &chindx2); if (ret < 0) return -errno; ppp_chan_fd = open("/dev/ppp", O_RDWR); if (ppp_chan_fd < 0) return -errno; ret = ioctl(ppp_chan_fd, PPPIOCATTCHAN, &chindx1); if (ret < 0) { close(ppp_chan_fd); return -errno; } ret = ioctl(ppp_chan_fd, PPPIOCBRIDGECHAN, &chindx2); close(ppp_chan_fd); if (ret < 0) return -errno; return 0;”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´Mìhjõubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhjòubah}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´Mèhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´Mèhj—h²hubhÞ)�”}”(hŒàIt can be noted that when bridging PPP channels, the PPP session is not locally terminated, and no local PPP interface is created. PPP frames arriving on one channel are directly passed to the other channel, and vice versa.”h]”hŒàIt can be noted that when bridging PPP channels, the PPP session is not locally terminated, and no local PPP interface is created. PPP frames arriving on one channel are directly passed to the other channel, and vice versa.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhj—h²hubhÞ)�”}”(hŒiThe PPP channel does not need to be kept open. Only the session PPPoX data sockets need to be kept open.”h]”hŒiThe PPP channel does not need to be kept open. Only the session PPPoX data sockets need to be kept open.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhj—h²hubhÞ)�”}”(hŒŠMore generally, it is also possible in the same way to e.g. bridge a PPPoL2TP PPP channel with other types of PPP channels, such as PPPoE.”h]”hŒŠMore generally, it is also possible in the same way to e.g. bridge a PPPoL2TP PPP channel with other types of PPP channels, such as PPPoE.”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhj—h²hubhÞ)�”}”(hŒ5See more details for the PPP side in ppp_generic.rst.”h]”hŒ5See more details for the PPP side in ppp_generic.rst.”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhj—h²hubeh}”(h]”Œpppol2tp-session-socket-api”ah ]”h"]”Œpppol2tp session socket api”ah$]”h&]”uh1hÈhjðh²hh³hÇh´M`ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒOld L2TPv2-only API”h]”hŒOld L2TPv2-only API”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjgh²hh³hÇh´MubhÞ)�”}”(hX¿When L2TP was first added to the Linux kernel in 2.6.23, it implemented only L2TPv2 and did not include a netlink API. Instead, tunnel and session instances in the kernel were managed directly using only PPPoL2TP sockets. The PPPoL2TP socket is used as described in section "PPPoL2TP Session Socket API" but tunnel and session instances are automatically created on a connect() of the socket instead of being created by a separate netlink request:”h]”hXÃWhen L2TP was first added to the Linux kernel in 2.6.23, it implemented only L2TPv2 and did not include a netlink API. Instead, tunnel and session instances in the kernel were managed directly using only PPPoL2TP sockets. The PPPoL2TP socket is used as described in section “PPPoL2TP Session Socket APIâ€� but tunnel and session instances are automatically created on a connect() of the socket instead of being created by a separate netlink request:”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhjgh²hubjk)�”}”(hXô- Tunnels are managed using a tunnel management socket which is a dedicated PPPoL2TP socket, connected to (invalid) session id 0. The L2TP tunnel instance is created when the PPPoL2TP tunnel management socket is connected and is destroyed when the socket is closed. - Session instances are created in the kernel when a PPPoL2TP socket is connected to a non-zero session id. Session parameters are set using setsockopt. The L2TP session instance is destroyed when the socket is closed. ”h]”j¿)�”}”(hhh]”(jv)�”}”(hXTunnels are managed using a tunnel management socket which is a dedicated PPPoL2TP socket, connected to (invalid) session id 0. The L2TP tunnel instance is created when the PPPoL2TP tunnel management socket is connected and is destroyed when the socket is closed. ”h]”hÞ)�”}”(hXTunnels are managed using a tunnel management socket which is a dedicated PPPoL2TP socket, connected to (invalid) session id 0. The L2TP tunnel instance is created when the PPPoL2TP tunnel management socket is connected and is destroyed when the socket is closed.”h]”hXTunnels are managed using a tunnel management socket which is a dedicated PPPoL2TP socket, connected to (invalid) session id 0. The L2TP tunnel instance is created when the PPPoL2TP tunnel management socket is connected and is destroyed when the socket is closed.”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M%hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjŠubjv)�”}”(hŒÙSession instances are created in the kernel when a PPPoL2TP socket is connected to a non-zero session id. Session parameters are set using setsockopt. The L2TP session instance is destroyed when the socket is closed. ”h]”hÞ)�”}”(hŒØSession instances are created in the kernel when a PPPoL2TP socket is connected to a non-zero session id. Session parameters are set using setsockopt. The L2TP session instance is destroyed when the socket is closed.”h]”hŒØSession instances are created in the kernel when a PPPoL2TP socket is connected to a non-zero session id. Session parameters are set using setsockopt. The L2TP session instance is destroyed when the socket is closed.”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M+hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjŠubeh}”(h]”h ]”h"]”h$]”h&]”j‡jˆuh1j¾h³hÇh´M%hj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´M%hjgh²hubhÞ)�”}”(hŒÂThis API is still supported but its use is discouraged. Instead, new L2TPv2 applications should use netlink to first create the tunnel and session, then create a PPPoL2TP socket for the session.”h]”hŒÂThis API is still supported but its use is discouraged. Instead, new L2TPv2 applications should use netlink to first create the tunnel and session, then create a PPPoL2TP socket for the session.”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M0hjgh²hubeh}”(h]”Œold-l2tpv2-only-api”ah ]”h"]”Œold l2tpv2-only api”ah$]”h&]”uh1hÈhjðh²hh³hÇh´MubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒUnmanaged L2TPv3 tunnels”h]”hŒUnmanaged L2TPv3 tunnels”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjßh²hh³hÇh´M5ubhÞ)�”}”(hXlThe kernel L2TP subsystem also supports static (unmanaged) L2TPv3 tunnels. Unmanaged tunnels have no userspace tunnel socket, and exchange no control messages with the peer to set up the tunnel; the tunnel is configured manually at each end of the tunnel. All configuration is done using netlink. There is no need for an L2TP userspace application in this case -- the tunnel socket is created by the kernel and configured using parameters sent in the ``L2TP_CMD_TUNNEL_CREATE`` netlink request. The ``ip`` utility of ``iproute2`` has commands for managing static L2TPv3 tunnels; do ``ip l2tp help`` for more information.”h]”(hXÃThe kernel L2TP subsystem also supports static (unmanaged) L2TPv3 tunnels. Unmanaged tunnels have no userspace tunnel socket, and exchange no control messages with the peer to set up the tunnel; the tunnel is configured manually at each end of the tunnel. All configuration is done using netlink. There is no need for an L2TP userspace application in this case -- the tunnel socket is created by the kernel and configured using parameters sent in the ”…”�”}”(hjðh²hh³Nh´Nubj1)�”}”(hŒ``L2TP_CMD_TUNNEL_CREATE``”h]”hŒL2TP_CMD_TUNNEL_CREATE”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjðubhŒ netlink request. The ”…”�”}”(hjðh²hh³Nh´Nubj1)�”}”(hŒ``ip``”h]”hŒip”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjðubhŒ utility of ”…”�”}”(hjðh²hh³Nh´Nubj1)�”}”(hŒ ``iproute2``”h]”hŒiproute2”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjðubhŒ5 has commands for managing static L2TPv3 tunnels; do ”…”�”}”(hjðh²hh³Nh´Nubj1)�”}”(hŒ``ip l2tp help``”h]”hŒ ip l2tp help”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjðubhŒ for more information.”…”�”}”(hjðh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M7hjßh²hubeh}”(h]”Œunmanaged-l2tpv3-tunnels”ah ]”h"]”Œunmanaged l2tpv3 tunnels”ah$]”h&]”uh1hÈhjðh²hh³hÇh´M5ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Debugging”h]”hŒ Debugging”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjNh²hh³hÇh´MCubhÞ)�”}”(hŒYThe L2TP subsystem offers a range of debugging interfaces through the debugfs filesystem.”h]”hŒYThe L2TP subsystem offers a range of debugging interfaces through the debugfs filesystem.”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MEhjNh²hubhÞ)�”}”(hŒJTo access these interfaces, the debugfs filesystem must first be mounted::”h]”hŒITo access these interfaces, the debugfs filesystem must first be mounted:”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MHhjNh²hubjK)�”}”(hŒ!# mount -t debugfs debugfs /debug”h]”hŒ!# mount -t debugfs debugfs /debug”…”�”}”hj{sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´MJhjNh²hubhÞ)�”}”(hŒšFiles under the l2tp directory can then be accessed, providing a summary of the current population of tunnel and session contexts existing in the kernel::”h]”hŒ™Files under the l2tp directory can then be accessed, providing a summary of the current population of tunnel and session contexts existing in the kernel:”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MLhjNh²hubjK)�”}”(hŒ# cat /debug/l2tp/tunnels”h]”hŒ# cat /debug/l2tp/tunnels”…”�”}”hj—sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´MPhjNh²hubhÞ)�”}”(hXThe debugfs files should not be used by applications to obtain L2TP state information because the file format is subject to change. It is implemented to provide extra debug information to help diagnose problems. Applications should instead use the netlink API.”h]”hXThe debugfs files should not be used by applications to obtain L2TP state information because the file format is subject to change. It is implemented to provide extra debug information to help diagnose problems. Applications should instead use the netlink API.”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MRhjNh²hubhÞ)�”}”(hŒšIn addition the L2TP subsystem implements tracepoints using the standard kernel event tracing API. The available L2TP events can be reviewed as follows::”h]”hŒ™In addition the L2TP subsystem implements tracepoints using the standard kernel event tracing API. The available L2TP events can be reviewed as follows:”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MWhjNh²hubjK)�”}”(hŒ!# find /debug/tracing/events/l2tp”h]”hŒ!# find /debug/tracing/events/l2tp”…”�”}”hjÁsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jJh³hÇh´M[hjNh²hubhÞ)�”}”(hŒ¾Finally, /proc/net/pppol2tp is also provided for backwards compatibility with the original pppol2tp code. It lists information about L2TPv2 tunnels and sessions only. Its use is discouraged.”h]”hŒ¾Finally, /proc/net/pppol2tp is also provided for backwards compatibility with the original pppol2tp code. It lists information about L2TPv2 tunnels and sessions only. Its use is discouraged.”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M]hjNh²hubeh}”(h]”Œ debugging”ah ]”h"]”Œ debugging”ah$]”h&]”uh1hÈhjðh²hh³hÇh´MCubeh}”(h]”Œ l2tp-apis”ah ]”h"]”Œ l2tp apis”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K5ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒInternal Implementation”h]”hŒInternal Implementation”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjíh²hh³hÇh´MbubhÞ)�”}”(hŒ6This section is for kernel developers and maintainers.”h]”hŒ6This section is for kernel developers and maintainers.”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mdhjíh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSockets”h]”hŒSockets”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h²hh³hÇh´MgubhÞ)�”}”(hXgUDP sockets are implemented by the networking core. When an L2TP tunnel is created using a UDP socket, the socket is set up as an encapsulated UDP socket by setting encap_rcv and encap_destroy callbacks on the UDP socket. l2tp_udp_encap_recv is called when packets are received on the socket. l2tp_udp_encap_destroy is called when userspace closes the socket.”h]”hXgUDP sockets are implemented by the networking core. When an L2TP tunnel is created using a UDP socket, the socket is set up as an encapsulated UDP socket by setting encap_rcv and encap_destroy callbacks on the UDP socket. l2tp_udp_encap_recv is called when packets are received on the socket. l2tp_udp_encap_destroy is called when userspace closes the socket.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mihj h²hubhÞ)�”}”(hŒSL2TPIP sockets are implemented in `net/l2tp/l2tp_ip.c`_ and `net/l2tp/l2tp_ip6.c`_.”h]”(hŒ"L2TPIP sockets are implemented in ”…”�”}”(hj+h²hh³Nh´Nubj�)�”}”(hŒ`net/l2tp/l2tp_ip.c`_”h]”hŒnet/l2tp/l2tp_ip.c”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œnet/l2tp/l2tp_ip.c”jžŒ../../../net/l2tp/l2tp_ip.c”uh1jŒhj+j KubhŒ and ”…”�”}”(hj+h²hh³Nh´Nubj�)�”}”(hŒ`net/l2tp/l2tp_ip6.c`_”h]”hŒnet/l2tp/l2tp_ip6.c”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œnet/l2tp/l2tp_ip6.c”jžŒ../../../net/l2tp/l2tp_ip6.c”uh1jŒhj+j KubhŒ.”…”�”}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mphj h²hubeh}”(h]”Œsockets”ah ]”h"]”Œsockets”ah$]”h&]”uh1hÈhjíh²hh³hÇh´MgubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒTunnels”h]”hŒTunnels”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjkh²hh³hÇh´MtubhÞ)�”}”(hXhThe kernel keeps a struct l2tp_tunnel context per L2TP tunnel. The l2tp_tunnel is always associated with a UDP or L2TP/IP socket and keeps a list of sessions in the tunnel. When a tunnel is first registered with L2TP core, the reference count on the socket is increased. This ensures that the socket cannot be removed while L2TP's data structures reference it.”h]”hXjThe kernel keeps a struct l2tp_tunnel context per L2TP tunnel. The l2tp_tunnel is always associated with a UDP or L2TP/IP socket and keeps a list of sessions in the tunnel. When a tunnel is first registered with L2TP core, the reference count on the socket is increased. This ensures that the socket cannot be removed while L2TP’s data structures reference it.”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mvhjkh²hubhÞ)�”}”(hŒ�Tunnels are identified by a unique tunnel id. The id is 16-bit for L2TPv2 and 32-bit for L2TPv3. Internally, the id is stored as a 32-bit value.”h]”hŒ�Tunnels are identified by a unique tunnel id. The id is 16-bit for L2TPv2 and 32-bit for L2TPv3. Internally, the id is stored as a 32-bit value.”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M}hjkh²hubhÞ)�”}”(hŒqTunnels are kept in a per-net list, indexed by tunnel id. The tunnel id namespace is shared by L2TPv2 and L2TPv3.”h]”hŒqTunnels are kept in a per-net list, indexed by tunnel id. The tunnel id namespace is shared by L2TPv2 and L2TPv3.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M�hjkh²hubhÞ)�”}”(hXËHandling tunnel socket close is perhaps the most tricky part of the L2TP implementation. If userspace closes a tunnel socket, the L2TP tunnel and all of its sessions must be closed and destroyed. Since the tunnel context holds a ref on the tunnel socket, the socket's sk_destruct won't be called until the tunnel sock_put's its socket. For UDP sockets, when userspace closes the tunnel socket, the socket's encap_destroy handler is invoked, which L2TP uses to initiate its tunnel close actions. For L2TPIP sockets, the socket's close handler initiates the same tunnel close actions. All sessions are first closed. Each session drops its tunnel ref. When the tunnel ref reaches zero, the tunnel drops its socket ref.”h]”hXÕHandling tunnel socket close is perhaps the most tricky part of the L2TP implementation. If userspace closes a tunnel socket, the L2TP tunnel and all of its sessions must be closed and destroyed. Since the tunnel context holds a ref on the tunnel socket, the socket’s sk_destruct won’t be called until the tunnel sock_put’s its socket. For UDP sockets, when userspace closes the tunnel socket, the socket’s encap_destroy handler is invoked, which L2TP uses to initiate its tunnel close actions. For L2TPIP sockets, the socket’s close handler initiates the same tunnel close actions. All sessions are first closed. Each session drops its tunnel ref. When the tunnel ref reaches zero, the tunnel drops its socket ref.”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M„hjkh²hubeh}”(h]”Œtunnels”ah ]”h"]”Œtunnels”ah$]”h&]”uh1hÈhjíh²hh³hÇh´MtubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSessions”h]”hŒSessions”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¼h²hh³hÇh´M‘ubhÞ)�”}”(hX�The kernel keeps a struct l2tp_session context for each session. Each session has private data which is used for data specific to the session type. With L2TPv2, the session always carries PPP traffic. With L2TPv3, the session can carry Ethernet frames (Ethernet pseudowire) or other data types such as PPP, ATM, HDLC or Frame Relay. Linux currently implements only Ethernet and PPP session types.”h]”hX�The kernel keeps a struct l2tp_session context for each session. Each session has private data which is used for data specific to the session type. With L2TPv2, the session always carries PPP traffic. With L2TPv3, the session can carry Ethernet frames (Ethernet pseudowire) or other data types such as PPP, ATM, HDLC or Frame Relay. Linux currently implements only Ethernet and PPP session types.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M“hj¼h²hubhÞ)�”}”(hŒhSome L2TP session types also have a socket (PPP pseudowires) while others do not (Ethernet pseudowires).”h]”hŒhSome L2TP session types also have a socket (PPP pseudowires) while others do not (Ethernet pseudowires).”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mšhj¼h²hubhÞ)�”}”(hŒÆLike tunnels, L2TP sessions are identified by a unique session id. Just as with tunnel ids, the session id is 16-bit for L2TPv2 and 32-bit for L2TPv3. Internally, the id is stored as a 32-bit value.”h]”hŒÆLike tunnels, L2TP sessions are identified by a unique session id. Just as with tunnel ids, the session id is 16-bit for L2TPv2 and 32-bit for L2TPv3. Internally, the id is stored as a 32-bit value.”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M�hj¼h²hubhÞ)�”}”(hŒ{Sessions hold a ref on their parent tunnel to ensure that the tunnel stays extant while one or more sessions references it.”h]”hŒ{Sessions hold a ref on their parent tunnel to ensure that the tunnel stays extant while one or more sessions references it.”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¢hj¼h²hubhÞ)�”}”(hX3Sessions are kept in a per-net list. L2TPv2 sessions and L2TPv3 sessions are stored in separate lists. L2TPv2 sessions are keyed by a 32-bit key made up of the 16-bit tunnel ID and 16-bit session ID. L2TPv3 sessions are keyed by the 32-bit session ID, since L2TPv3 session ids are unique across all tunnels.”h]”hX3Sessions are kept in a per-net list. L2TPv2 sessions and L2TPv3 sessions are stored in separate lists. L2TPv2 sessions are keyed by a 32-bit key made up of the 16-bit tunnel ID and 16-bit session ID. L2TPv3 sessions are keyed by the 32-bit session ID, since L2TPv3 session ids are unique across all tunnels.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¥hj¼h²hubhÞ)�”}”(hX•Although the L2TPv3 RFC specifies that L2TPv3 session ids are not scoped by the tunnel, the Linux implementation has historically allowed this. Such session id collisions are supported using a per-net hash table keyed by sk and session ID. When looking up L2TPv3 sessions, the list entry may link to multiple sessions with that session ID, in which case the session matching the given sk (tunnel) is used.”h]”hX•Although the L2TPv3 RFC specifies that L2TPv3 session ids are not scoped by the tunnel, the Linux implementation has historically allowed this. Such session id collisions are supported using a per-net hash table keyed by sk and session ID. When looking up L2TPv3 sessions, the list entry may link to multiple sessions with that session ID, in which case the session matching the given sk (tunnel) is used.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M«hj¼h²hubeh}”(h]”Œsessions”ah ]”h"]”Œsessions”ah$]”h&]”uh1hÈhjíh²hh³hÇh´M‘ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒPPP”h]”hŒPPP”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj)h²hh³hÇh´M´ubhÞ)�”}”(hŒe`net/l2tp/l2tp_ppp.c`_ implements the PPPoL2TP socket family. Each PPP session has a PPPoL2TP socket.”h]”(j�)�”}”(hŒ`net/l2tp/l2tp_ppp.c`_”h]”hŒnet/l2tp/l2tp_ppp.c”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œnet/l2tp/l2tp_ppp.c”jžŒ../../../net/l2tp/l2tp_ppp.c”uh1jŒhj:j KubhŒO implements the PPPoL2TP socket family. Each PPP session has a PPPoL2TP socket.”…”�”}”(hj:h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¶hj)h²hubhÞ)�”}”(hŒ?The PPPoL2TP socket's sk_user_data references the l2tp_session.”h]”hŒAThe PPPoL2TP socket’s sk_user_data references the l2tp_session.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M¹hj)h²hubhÞ)�”}”(hX2Userspace sends and receives PPP packets over L2TP using a PPPoL2TP socket. Only PPP control frames pass over this socket: PPP data packets are handled entirely by the kernel, passing between the L2TP session and its associated ``pppN`` netdev through the PPP channel interface of the kernel PPP subsystem.”h]”(hŒäUserspace sends and receives PPP packets over L2TP using a PPPoL2TP socket. Only PPP control frames pass over this socket: PPP data packets are handled entirely by the kernel, passing between the L2TP session and its associated ”…”�”}”(hjgh²hh³Nh´Nubj1)�”}”(hŒ``pppN``”h]”hŒpppN”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hjgubhŒF netdev through the PPP channel interface of the kernel PPP subsystem.”…”�”}”(hjgh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´M»hj)h²hubhÞ)�”}”(hX­The L2TP PPP implementation handles the closing of a PPPoL2TP socket by closing its corresponding L2TP session. This is complicated because it must consider racing with netlink session create/destroy requests and pppol2tp_connect trying to reconnect with a session that is in the process of being closed. PPP sessions hold a ref on their associated socket in order that the socket remains extants while the session references it.”h]”hX­The L2TP PPP implementation handles the closing of a PPPoL2TP socket by closing its corresponding L2TP session. This is complicated because it must consider racing with netlink session create/destroy requests and pppol2tp_connect trying to reconnect with a session that is in the process of being closed. PPP sessions hold a ref on their associated socket in order that the socket remains extants while the session references it.”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÁhj)h²hubeh}”(h]”Œppp”ah ]”h"]”Œppp”ah$]”h&]”uh1hÈhjíh²hh³hÇh´M´ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒEthernet”h]”hŒEthernet”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj�h²hh³hÇh´MÊubhÞ)�”}”(hŒd`net/l2tp/l2tp_eth.c`_ implements L2TPv3 Ethernet pseudowires. It manages a netdev for each session.”h]”(j�)�”}”(hŒ`net/l2tp/l2tp_eth.c`_”h]”hŒnet/l2tp/l2tp_eth.c”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œnet/l2tp/l2tp_eth.c”jžŒ../../../net/l2tp/l2tp_eth.c”uh1jŒhj®j KubhŒN implements L2TPv3 Ethernet pseudowires. It manages a netdev for each session.”…”�”}”(hj®h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÌhj�h²hubhÞ)�”}”(hŒ¼L2TP Ethernet sessions are created and destroyed by netlink request, or are destroyed when the tunnel is destroyed. Unlike PPP sessions, Ethernet sessions do not have an associated socket.”h]”hŒ¼L2TP Ethernet sessions are created and destroyed by netlink request, or are destroyed when the tunnel is destroyed. Unlike PPP sessions, Ethernet sessions do not have an associated socket.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÏhj�h²hubeh}”(h]”Œethernet”ah ]”h"]”Œethernet”ah$]”h&]”uh1hÈhjíh²hh³hÇh´MÊubeh}”(h]”Œinternal-implementation”ah ]”h"]”Œinternal implementation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MbubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Miscellaneous”h]”hŒ Miscellaneous”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjëh²hh³hÇh´MÔubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒRFCs”h]”hŒRFCs”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjüh²hh³hÇh´M×ubhÞ)�”}”(hŒQThe kernel code implements the datapath features specified in the following RFCs:”h]”hŒQThe kernel code implements the datapath features specified in the following RFCs:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÙhjüh²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j?hj ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K#uh1j?hj ubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒRFC2661”h]”hŒRFC2661”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÝhjE ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjB ubjj)�”}”(hhh]”hÞ)�”}”(hŒL2TPv2”h]”hŒL2TPv2”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÝhj\ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjB ubjj)�”}”(hhh]”hÞ)�”}”(hŒ#https://tools.ietf.org/html/rfc2661”h]”j�)�”}”(hjx h]”hŒ#https://tools.ietf.org/html/rfc2661”…”�”}”(hjz h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jx uh1jŒhjv ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÝhjs ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjB ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj? ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒRFC3931”h]”hŒRFC3931”…”�”}”(hj  h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÞhj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjš ubjj)�”}”(hhh]”hÞ)�”}”(hŒL2TPv3”h]”hŒL2TPv3”…”�”}”(hj· h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÞhj´ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjš ubjj)�”}”(hhh]”hÞ)�”}”(hŒ#https://tools.ietf.org/html/rfc3931”h]”j�)�”}”(hjÐ h]”hŒ#https://tools.ietf.org/html/rfc3931”…”�”}”(hjÒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÐ uh1jŒhjÎ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MÞhjË ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjš ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj? ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒRFC4719”h]”hŒRFC4719”…”�”}”(hjø h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mßhjõ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjò ubjj)�”}”(hhh]”hÞ)�”}”(hŒL2TPv3 Ethernet”h]”hŒL2TPv3 Ethernet”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mßhj !ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjò ubjj)�”}”(hhh]”hÞ)�”}”(hŒ#https://tools.ietf.org/html/rfc4719”h]”j�)�”}”(hj(!h]”hŒ#https://tools.ietf.org/html/rfc4719”…”�”}”(hj*!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j(!uh1jŒhj&!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mßhj#!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjò ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhj? ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hjüh²hh³hÇh´Nubeh}”(h]”Œrfcs”ah ]”h"]”Œrfcs”ah$]”h&]”uh1hÈhjëh²hh³hÇh´M×ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒImplementations”h]”hŒImplementations”…”�”}”(hjh!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhje!h²hh³hÇh´MãubhÞ)�”}”(hŒCA number of open source applications use the L2TP kernel subsystem:”h]”hŒCA number of open source applications use the L2TP kernel subsystem:”…”�”}”(hjv!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Måhje!h²hubj6)�”}”(hhh]”j;)�”}”(hhh]”(j@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1j?hj‡!ubj@)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K.uh1j?hj‡!ubj½)�”}”(hhh]”(je)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒiproute2”h]”hŒiproute2”…”�”}”(hj§!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mèhj¤!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¡!ubjj)�”}”(hhh]”hÞ)�”}”(hŒ&https://github.com/shemminger/iproute2”h]”j�)�”}”(hjÀ!h]”hŒ&https://github.com/shemminger/iproute2”…”�”}”(hjÂ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÀ!uh1jŒhj¾!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mèhj»!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj¡!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjž!ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒgo-l2tp”h]”hŒgo-l2tp”…”�”}”(hjè!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Méhjå!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjâ!ubjj)�”}”(hhh]”hÞ)�”}”(hŒ"https://github.com/katalix/go-l2tp”h]”j�)�”}”(hj"h]”hŒ"https://github.com/katalix/go-l2tp”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j"uh1jŒhjÿ!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Méhjü!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjâ!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjž!ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒ tunneldigger”h]”hŒ tunneldigger”…”�”}”(hj)"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mêhj&"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj#"ubjj)�”}”(hhh]”hÞ)�”}”(hŒ-https://github.com/wlanslovenija/tunneldigger”h]”j�)�”}”(hjB"h]”hŒ-https://github.com/wlanslovenija/tunneldigger”…”�”}”(hjD"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jB"uh1jŒhj@"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mêhj="ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihj#"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjž!ubje)�”}”(hhh]”(jj)�”}”(hhh]”hÞ)�”}”(hŒxl2tpd”h]”hŒxl2tpd”…”�”}”(hjj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mëhjg"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjd"ubjj)�”}”(hhh]”hÞ)�”}”(hŒ#https://github.com/xelerance/xl2tpd”h]”j�)�”}”(hjƒ"h]”hŒ#https://github.com/xelerance/xl2tpd”…”�”}”(hj…"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jƒ"uh1jŒhj�"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mëhj~"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jihjd"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jdhjž!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj‡!ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j:hj„!ubah}”(h]”h ]”h"]”h$]”h&]”uh1j5hje!h²hh³hÇh´Nubeh}”(h]”Œimplementations”ah ]”h"]”Œimplementations”ah$]”h&]”uh1hÈhjëh²hh³hÇh´MãubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Limitations”h]”hŒ Limitations”…”�”}”(hjÃ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÀ"h²hh³hÇh´MïubhÞ)�”}”(hŒ7The current implementation has a number of limitations:”h]”hŒ7The current implementation has a number of limitations:”…”�”}”(hjÑ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´MñhjÀ"h²hubjk)�”}”(hX 1) Interfacing with openvswitch is not yet implemented. It may be useful to map OVS Ethernet and VLAN ports into L2TPv3 tunnels. 2) VLAN pseudowires are implemented using an ``l2tpethN`` interface configured with a VLAN sub-interface. Since L2TPv3 VLAN pseudowires carry one and only one VLAN, it may be better to use a single netdevice rather than an ``l2tpethN`` and ``l2tpethN``:M pair per VLAN session. The netlink attribute ``L2TP_ATTR_VLAN_ID`` was added for this, but it was never implemented. ”h]”jq)�”}”(hhh]”(jv)�”}”(hŒ~Interfacing with openvswitch is not yet implemented. It may be useful to map OVS Ethernet and VLAN ports into L2TPv3 tunnels. ”h]”hÞ)�”}”(hŒ}Interfacing with openvswitch is not yet implemented. It may be useful to map OVS Ethernet and VLAN ports into L2TPv3 tunnels.”h]”hŒ}Interfacing with openvswitch is not yet implemented. It may be useful to map OVS Ethernet and VLAN ports into L2TPv3 tunnels.”…”�”}”(hjê"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Móhjæ"ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjã"ubjv)�”}”(hXqVLAN pseudowires are implemented using an ``l2tpethN`` interface configured with a VLAN sub-interface. Since L2TPv3 VLAN pseudowires carry one and only one VLAN, it may be better to use a single netdevice rather than an ``l2tpethN`` and ``l2tpethN``:M pair per VLAN session. The netlink attribute ``L2TP_ATTR_VLAN_ID`` was added for this, but it was never implemented. ”h]”hÞ)�”}”(hXpVLAN pseudowires are implemented using an ``l2tpethN`` interface configured with a VLAN sub-interface. Since L2TPv3 VLAN pseudowires carry one and only one VLAN, it may be better to use a single netdevice rather than an ``l2tpethN`` and ``l2tpethN``:M pair per VLAN session. The netlink attribute ``L2TP_ATTR_VLAN_ID`` was added for this, but it was never implemented.”h]”(hŒ*VLAN pseudowires are implemented using an ”…”�”}”(hj#h²hh³Nh´Nubj1)�”}”(hŒ ``l2tpethN``”h]”hŒl2tpethN”…”�”}”(hj #h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj#ubhŒ¦ interface configured with a VLAN sub-interface. Since L2TPv3 VLAN pseudowires carry one and only one VLAN, it may be better to use a single netdevice rather than an ”…”�”}”(hj#h²hh³Nh´Nubj1)�”}”(hŒ ``l2tpethN``”h]”hŒl2tpethN”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj#ubhŒ and ”…”�”}”(hj#h²hh³Nh´Nubj1)�”}”(hŒ ``l2tpethN``”h]”hŒl2tpethN”…”�”}”(hj.#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj#ubhŒ0:M pair per VLAN session. The netlink attribute ”…”�”}”(hj#h²hh³Nh´Nubj1)�”}”(hŒ``L2TP_ATTR_VLAN_ID``”h]”hŒL2TP_ATTR_VLAN_ID”…”�”}”(hj@#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j0hj#ubhŒ2 was added for this, but it was never implemented.”…”�”}”(hj#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Möhjþ"ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjã"ubeh}”(h]”h ]”h"]”h$]”h&]”jÝjÞjßhjàjáuh1jphjß"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjh³hÇh´MóhjÀ"h²hubeh}”(h]”Œ limitations”ah ]”h"]”Œ limitations”ah$]”h&]”uh1hÈhjëh²hh³hÇh´MïubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒTesting”h]”hŒTesting”…”�”}”(hju#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjr#h²hh³hÇh´MÿubhÞ)�”}”(hŒ}Unmanaged L2TPv3 Ethernet features are tested by the kernel's built-in selftests. See `tools/testing/selftests/net/l2tp.sh`_.”h]”(hŒXUnmanaged L2TPv3 Ethernet features are tested by the kernel’s built-in selftests. See ”…”�”}”(hjƒ#h²hh³Nh´Nubj�)�”}”(hŒ&`tools/testing/selftests/net/l2tp.sh`_”h]”hŒ#tools/testing/selftests/net/l2tp.sh”…”�”}”(hj‹#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ#tools/testing/selftests/net/l2tp.sh”jžŒ,../../../tools/testing/selftests/net/l2tp.sh”uh1jŒhjƒ#j KubhŒ.”…”�”}”(hjƒ#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhjr#h²hubhÞ)�”}”(hŒ¦Another test suite, l2tp-ktest_, covers all of the L2TP APIs and tunnel/session types. This may be integrated into the kernel's built-in L2TP selftests in the future.”h]”(hŒAnother test suite, ”…”�”}”(hj¦#h²hh³Nh´Nubj�)�”}”(hŒ l2tp-ktest_”h]”hŒ l2tp-ktest”…”�”}”(hj®#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ l2tp-ktest”jžŒ%https://github.com/katalix/l2tp-ktest”u•Ôh1jŒhj¦#j KubhŒ‰, covers all of the L2TP APIs and tunnel/session types. This may be integrated into the kernel’s built-in L2TP selftests in the future.”…”�”}”(hj¦#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Mhjr#h²hubh¶)�”}”(hŒLinks”h]”hŒLinks”…”�”}”hjÉ#sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhjr#h²hh³hÇh´MubhŒtarget”“”)�”}”(hŒ).. _Generic Netlink: generic_netlink.html”h]”h}”(h]”Œgeneric-netlink”ah ]”h"]”Œgeneric netlink”ah$]”h&]”jžjuh1j×#h´M hjr#h²hh³hÇŒ referenced”KubjØ#)�”}”(hŒ5.. _libmnl: https://www.netfilter.org/projects/libmnl”h]”h}”(h]”Œlibmnl”ah ]”h"]”Œlibmnl”ah$]”h&]”jžj¯uh1j×#h´M hjr#h²hh³hÇjå#KubjØ#)�”}”(hŒA.. _include/uapi/linux/l2tp.h: ../../../include/uapi/linux/l2tp.h”h]”h}”(h]”Œinclude-uapi-linux-l2tp-h”ah ]”h"]”Œinclude/uapi/linux/l2tp.h”ah$]”h&]”jžjŸuh1j×#h´M hjr#h²hh³hÇjå#KubjØ#)�”}”(hŒE.. _include/linux/if_pppol2tp.h: ../../../include/linux/if_pppol2tp.h”h]”h}”(h]”Œinclude-linux-if-pppol2tp-h”ah ]”h"]”Œinclude/linux/if_pppol2tp.h”ah$]”h&]”jžjÎuh1j×#h´M hjr#h²hh³hÇjå#KubjØ#)�”}”(hŒ3.. _net/l2tp/l2tp_ip.c: ../../../net/l2tp/l2tp_ip.c”h]”h}”(h]”Œnet-l2tp-l2tp-ip-c”ah ]”h"]”Œnet/l2tp/l2tp_ip.c”ah$]”h&]”jžjCuh1j×#h´M hjr#h²hh³hÇjå#KubjØ#)�”}”(hŒ5.. _net/l2tp/l2tp_ip6.c: ../../../net/l2tp/l2tp_ip6.c”h]”h}”(h]”Œnet-l2tp-l2tp-ip6-c”ah ]”h"]”Œnet/l2tp/l2tp_ip6.c”ah$]”h&]”jžjXuh1j×#h´Mhjr#h²hh³hÇjå#KubjØ#)�”}”(hŒ5.. _net/l2tp/l2tp_ppp.c: ../../../net/l2tp/l2tp_ppp.c”h]”h}”(h]”Œnet-l2tp-l2tp-ppp-c”ah ]”h"]”Œnet/l2tp/l2tp_ppp.c”ah$]”h&]”jžjNuh1j×#h´Mhjr#h²hh³hÇjå#KubjØ#)�”}”(hŒ5.. _net/l2tp/l2tp_eth.c: ../../../net/l2tp/l2tp_eth.c”h]”h}”(h]”Œnet-l2tp-l2tp-eth-c”ah ]”h"]”Œnet/l2tp/l2tp_eth.c”ah$]”h&]”jžjÂuh1j×#h´Mhjr#h²hh³hÇjå#KubjØ#)�”}”(hŒU.. _tools/testing/selftests/net/l2tp.sh: ../../../tools/testing/selftests/net/l2tp.sh”h]”h}”(h]”Œ#tools-testing-selftests-net-l2tp-sh”ah ]”h"]”Œ#tools/testing/selftests/net/l2tp.sh”ah$]”h&]”jžj›#uh1j×#h´Mhjr#h²hh³hÇjå#KubjØ#)�”}”(hŒ5.. _l2tp-ktest: https://github.com/katalix/l2tp-ktest”h]”h}”(h]”Œ l2tp-ktest”ah ]”h"]”Œ l2tp-ktest”ah$]”h&]”jžj¾#uh1j×#h´Mhjr#h²hh³hÇjå#Kubeh}”(h]”Œtesting”ah ]”h"]”Œtesting”ah$]”h&]”uh1hÈhjëh²hh³hÇh´Mÿubeh}”(h]”Œ miscellaneous”ah ]”h"]”Œ miscellaneous”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MÔubeh}”(h]”Œl2tp”ah ]”h"]”Œl2tp”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jiŒfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒ$Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”(Œinclude/uapi/linux/l2tp.h”]”(jŽjèj}eŒgeneric netlink”]”j aŒlibmnl”]”jŸaŒinclude/linux/if_pppol2tp.h”]”j¾aŒnet/l2tp/l2tp_ip.c”]”j3aŒnet/l2tp/l2tp_ip6.c”]”jHaŒnet/l2tp/l2tp_ppp.c”]”j>aŒnet/l2tp/l2tp_eth.c”]”j²aŒ#tools/testing/selftests/net/l2tp.sh”]”j‹#aŒ l2tp-ktest”]”j®#auŒrefids”}”Œnameids”}”(jg$jd$jíjêjêjçjÌjÉj”j‘jdjajÜjÙjKjHjâjßjèjåjhjej¹j¶j&j#jšj—jàjÝj_$j\$jb!j_!j½"jº"jo#jl#jW$jT$jâ#jß#jï#jì#jû#jø#j$j$j$j$j$j$j+$j($j7$j4$jC$j@$jO$jL$uŒ nametypes”}”(jg$‰jí‰jê‰j̉j”‰jd‰j܉jK‰jâ‰jè‰jh‰j¹‰j&‰jš‰jà‰j_$‰jb!‰j½"‰jo#‰jW$‰jâ#ˆjï#ˆjû#ˆj$ˆj$ˆj$ˆj+$ˆj7$ˆjC$ˆjO$ˆuh}”(jd$hÊjêhûjçjðjÉjj‘jÏjaj—jÙjgjHjßjßjNjåjíjej j¶jkj#j¼j—j)jÝj�j\$jëj_!jüjº"je!jl#jÀ"jT$jr#jß#jÙ#jì#jæ#jø#jò#j$jþ#j$j $j$j$j($j"$j4$j.$j@$j:$jL$jF$uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.