L2TPv2 - Layer Two Tunnelling Protocol Version 2¶
pcapkit.protocols.link.l2tpv2.protocol contains
L2TPv2 only, which implements the extractor
for the Layer Two Tunnelling Protocol version 2 (L2TPv2) [*] as specified by
RFC 2661 – a 16-bit tunnel ID and a 16-bit session ID, with the version nibble
reading 2. It is dispatched from
UDP.__proto__ at port
1701. Its structure is:
Octets |
Bits |
Name |
Description |
|---|---|---|---|
0 |
0 |
|
Flags and Version Info |
0 |
0 |
|
Type (control / data) |
0 |
1 |
|
Length |
0 |
2 |
Reserved (must be zero) |
|
0 |
4 |
|
Sequence |
0 |
5 |
Reserved (must be zero) |
|
0 |
6 |
|
Offset |
0 |
7 |
|
Priority |
1 |
8 |
Reserved (must be zero) |
|
1 |
12 |
|
Version ( |
2 |
16 |
|
Length (optional by |
4 |
32 |
|
Tunnel ID |
6 |
48 |
|
Session ID |
8 |
64 |
|
Sequence Number (optional by |
10 |
80 |
|
Next Sequence Number (optional by |
12 |
96 |
|
Offset Size (optional by |
Note
The parsed datagram appears under l2tp, not l2tpv2:
info_name is declared on the
version-agnostic base so that a consumer finds the data at the same key
whichever version was on the wire. The version is reported by
alias instead.
- class pcapkit.protocols.link.l2tpv2.protocol.L2TPv2(file=None, length=None, **kwargs)[source]¶
-
This class implements Layer Two Tunnelling Protocol version 2.
The protocol is dispatched from
UDP.__proto__at port 1701.Only the RFC 2661 framing is read:
read()refuses a datagram whose version nibble is not2, so a v3 datagram arriving on port 1701 (RFC 3931 §4.7.2 shares the port) degrades toRawinstead of being reported as v2.Added in version 1.5.0: Takes over the version-2 parsing that
L2TPcarried, and refuses a version nibble other than2(#548).Changed in version 1.6.0:
typeofmake()takes a member or anintcode, resolved with the enumeration’sget; a name, or a code the one-bit field cannot carry, raisesProtocolError, rather than resolving against an enumeration inferred from the caller’s frame (#2594).Removed in version 1.6.0: The
type_default,type_namespaceandtype_reversedarguments ofmake(); resolve a name withresolve_index()first (#2594).Note
IANA protocol number 115 (
L2TP) is deliberately left unbound. It references RFC 3931, i.e. L2TPv3, whose session and control message headers are a different shape – so the binding waits on anL2TPv3class rather than on this one. Binding this class there does not work (#548): over IP the v3 session header carries no version nibble at all, so this class cannot recognise that the datagram is not its own. Seepcapkit.protocols.link.l2tp.protocolfor the versions not implemented.The class subclasses
Linkand so reportslayer == 'Link'even though it is carried inside UDP: a tunnelling protocol is placed by what it carries. See Protocol Layer Placement.- property version: Literal[2]¶
Version of current protocol.
Always
2: RFC 2661 fixes the version nibble, and a datagram carrying any other value is a different protocol reached through a different class. SeeL2TP.This is enforced rather than merely asserted –
read()refuses a datagram whose nibble is not2, so this hard-coded answer cannot disagree withinfo.versionon the same octets.
- read(length=None, **kwargs)[source]¶
Read Layer Two Tunnelling Protocol.
Structure of L2TP header [RFC 2661]:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |T|L|x|x|S|x|O|P|x|x|x|x| Ver | Length (opt) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Tunnel ID | Session ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ns (opt) | Nr (opt) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Offset Size (opt) | Offset pad... (opt) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Parameters:
- Return type:
- Returns:
Parsed packet data.
- Raises:
ProtocolError – If the version nibble is not
2.
- make(version=2, type=Type.Data, priority=False, reserved=0, total_length=None, length_flag=None, tunnel_id=0, session_id=0, ns=None, nr=None, offset=None, padding=None, payload=b'', trailer=b'', **kwargs)[source]¶
Make (construct) packet data.
- Parameters:
version (
Literal[2]) – L2TP version.priority (
bool) – Priority flag.reserved (
int) – Reserved bits of the flags word, in their on-wire positions (bits 2, 3, 5 and 8-11, i.e. within0x34F0).total_length (
int|None) – Length of the datagram, header included, written as given; the real header-plus-payload length whenNoneand the Length field is present.length_flag (
bool|None) – Whether the Length field and itsLflag are present. WhenNone, they are present iftotal_lengthis given, or for a control message, which RFC 2661 §3.1 requires to setL.tunnel_id (
int) – Tunnel ID.session_id (
int) – Session ID.padding (
bytes|None) – Offset pad, zero-filled or truncated tooffsetoctets; all zeros whenNone.payload (
bytes|ProtocolBase|Schema) – Payload data.trailer (
bytes) – Octets after the datagram, outside the Length field; written as is.**kwargs (
Any) – Arbitrary keyword arguments.
- Return type:
- Returns:
Constructed packet data.
- Raises:
ProtocolError – If
typeis a name, or a member or code its one-bit field cannot carry; iftotal_lengthis given withlength_flagset toFalse; if only one ofnsandnris given; or ifreservedsets a bit outside0x34F0.
- classmethod __index__()[source]¶
Numeral registry index of the protocol.
- Return type:
- Returns:
Numeral registry index of the protocol in IANA service names and port numbers: UDP port 1701, the port of
UDP.l2tpas anint, whichUDP.__proto__dispatches here (The Registry Index).TransType115 names L2TPv3 over IP instead.
Changed in version 1.6.0: Returns UDP port 1701, where it raised
UnsupportedCall(#2627).
Header Schemas¶
Removed in version 1.6.0: pcapkit.protocols.schema.link.l2tp, with no alias: the module moved here
(#2534).
- class pcapkit.protocols.link.l2tp.schema.L2TP(flags=NO_VALUE, length=NO_VALUE, tunnel_id=NO_VALUE, session_id=NO_VALUE, ns=NO_VALUE, nr=NO_VALUE, offset=NO_VALUE, padding=NO_VALUE, payload=NO_VALUE, trailer=NO_VALUE, *, __packet__=None, **kwargs)[source]¶
Bases:
SchemaHeader schema for L2TP packet.
- trailer: bytes = <PayloadField trailer>¶
Octets captured past the Length field, see
IPv4.trailer. Always empty when theLflag is clear, since the payload then takes the rest of the datagram.
Type Stubs¶
Auxiliary Functions¶
- pcapkit.protocols.link.l2tp.schema.l2tp_payload_length(pkt)[source]¶
Length of the
L2TP.payloadfield.
Data Models¶
Removed in version 1.6.0: pcapkit.protocols.data.link.l2tp, with no alias: the module moved here
(#2534).
- class pcapkit.protocols.link.l2tp.data.L2TP(flags, version, length, tunnelid, sessionid, ns, nr, offset)[source]¶
Bases:
ProtocolData model for L2TP packet.
- class pcapkit.protocols.link.l2tp.data.Flags(type, len, seq, offset, prio, reserved)[source]¶
Bases:
DataData model for L2TP flags.
Footnotes