L2TPv2 - Layer Two Tunnelling Protocol version 2¶
pcapkit.protocols.link.l2tpv2 contains
L2TPv2 only, which implements 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 described as below:
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.
IANA protocol number 115 (L2TP) is deliberately left unbound: it
references RFC 3931, i.e. L2TPv3, whose headers have a different shape,
so the binding waits on an L2TPv3 class rather than this one. See
pcapkit.protocols.link.l2tp.
- class pcapkit.protocols.link.l2tpv2.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.1.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).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. SeeL2TPfor the measurement.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. c.f.L2TP.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) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- make(version=2, type=<Type.Data: 0>, type_default=None, type_namespace=None, type_reversed=False, 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.type_namespace (
dict[str,int] |dict[int,str] |Type[IntEnum] |Type[IntEnum] |None) – Namespace of type.type_reversed (
bool) – Reversed namespace of type.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
total_lengthis given withlength_flagset toFalse, if only one ofnsandnris given, or ifreservedsets a bit outside0x34F0.
- classmethod __index__()[source]¶
Numeral registry index of the protocol.
- Raises:
UnsupportedCall – This protocol has no registry entry.
Note
L2TPv2 is reached through UDP port 1701, and a port is not an
__index__value anywhere in this package – every non-raising__index__returns aTransType,EtherTypeorLinkType, bar the PCAP frame and PCAP-NG block instances that return their own index number, andApplication.__index__raises for exactly this reason. So there is no index to return here.L2TPv3will be the first class in this family with one, IANA protocol number 115.- Return type:
Header Schemas¶
- class pcapkit.protocols.schema.link.l2tp.L2TP(*args: _VT, **kwargs: _VT)[source]¶
Bases:
SchemaHeader schema for L2TP packet.
- trailer: bytes = <PayloadField trailer>¶
Octets captured past the Length field, c.f.
IPv4.trailer. Always empty when theLflag is clear, since the payload then takes the rest of the datagram.
Type Stubs¶
Data Models¶
- class pcapkit.protocols.data.link.l2tp.L2TP(*args: VT, **kwargs: VT)[source]¶
Bases:
ProtocolData model for L2TP packet.
- class pcapkit.protocols.data.link.l2tp.Flags(*args: VT, **kwargs: VT)[source]¶
Bases:
DataData model for L2TP flags.
Footnotes