1
0
mirror of https://github.com/rtbrick/bngblaster.git synced 2024-05-06 15:54:57 +00:00
Christian Giese 3f8fd148cf fix LDP docu
2023-01-13 15:59:25 +00:00

286 lines
8.8 KiB
ReStructuredText

.. _ldp:
LDP
---
Label Distribution Protocol (LDP) is a protocol in which routers capable
of Multiprotocol Label Switching (MPLS) exchange label mapping information.
Two routers with an established session are called LDP peers and the exchange
of information is bi-directional. LDP is used to build and maintain LSP databases
that are used to forward traffic through MPLS networks.
LDP discovery runs on UDP port 646 and the session is built on TCP port 646. During
the discovery phase hello packets are sent on UDP port 646 to the 'all routers on this subnet'
group multicast address (224.0.0.2).
LDP is defined by the IETF (RFC 5036).
Configuration
~~~~~~~~~~~~~
Following an example LDP configuration with one instance
attached to a network interface function.
.. code-block:: json
{
"interfaces": {
"network": [
{
"interface": "eth1",
"address": "10.0.1.2/24",
"gateway": "10.0.1.1",
"ldp-instance-id": 1,
}
]
},
"ldp": [
{
"instance-id": 1,
"lsr-id": "10.10.10.11"
}
]
}
.. include:: ../configuration/ldp.rst
Limitations
~~~~~~~~~~~
The following LDP functionalities are currently
not supported:
+ Targeted LDP
+ LDP TCP authentication
+ LDP sessions between IPv6 addresses
+ Learn IPv6 label mappings
+ Multiple links between LDP instance and DUT (ECMP)
LDP Adjacencies
~~~~~~~~~~~~~~~~
When the BNG Blaster receives an LDP discovery hello message,
an LDP adjacency is set up between the two peers.
``$ sudo bngblaster-cli run.sock ldp-adjacencies``
.. code-block:: json
{
"status": "ok",
"code": 200,
"ldp-adjacencies": [
{
"ldp-instance-id": 1,
"interface": "eth0",
"state": "up"
}
]
}
LDP Sessions
~~~~~~~~~~~~
LDP peers exchange messages over a TCP session which is initiated by
the peer with the larger transport IP address (active peer).
The LDP transport IP address can be explicitly configured for the
LDP instance using the option `ipv4-transport-address`. The `lsr-id`
is used as a transport IP address if not explicitly configured.
.. note::
It is currently not supported to setup multiple links between
a single LDP instance and the device under test (ECMP).
``$ sudo bngblaster-cli run.sock ldp-sessions``
.. code-block:: json
{
"status": "ok",
"code": 200,
"ldp-sessions": [
{
"ldp-instance-id": 1,
"interface": "eth0",
"local-address": "10.2.3.1",
"local-identifier": "10.2.3.1:0",
"peer-address": "10.2.3.2",
"peer-identifier": "10.2.3.2:0",
"state": "operational",
"raw-update-state": "done",
"raw-update-file": "out.ldp",
"stats": {
"pdu-rx": 23,
"pdu-tx": 32,
"messages-rx": 24,
"messages-tx": 34,
"keepalive-rx": 21,
"keepalive-tx": 21
}
}
]
}
LDP Traffic Streams
~~~~~~~~~~~~~~~~~~~
Traffic streams send from network interface functions (downstream)
can be configured to dynamically resolve the outer MPLS
label using the learned label mappings.
The traffic stream configuration option `ldp-ipv4-lookup-address`
specifies the lookup IPv4 address. This means that traffic
will not start until this address is found in the corresponding
label database of the sending network interface function.
.. code-block:: json
{
"streams": [
{
"name": "S1",
"type": "ipv4",
"direction": "downstream",
"priority": 128,
"network-interface": "eth1",
"destination-ipv4-address": "10.0.0.1",
"ldp-ipv4-lookup-address": "13.37.0.1",
"pps": 1
}
]
}
``$ sudo bngblaster-cli run.sock ldp-database instance 1``
.. code-block:: json
{
"status": "ok",
"code": 200,
"ldp-database": [
{
"direction": "ipv4",
"prefix": "10.0.0.0/24",
"label": 3,
"source-identifier": "10.2.3.1:0"
},
{
"direction": "ipv4",
"prefix": "13.37.0.0/32",
"label": 10000,
"source-identifier": "10.2.3.1:0"
},
{
"direction": "ipv4",
"prefix": "13.37.0.1/32",
"label": 10001,
"source-identifier": "10.2.3.1:0"
}
]
}
The `ldp-ipv4-lookup-address` must exactly match the prefix address
as shown in the LDP database.
.. note::
There is currently no longest prefix match supported,
meaning that the actual prefix length is ignored!
RAW Update Files
~~~~~~~~~~~~~~~~
The BNG Blaster can inject LDP PDU from a pre-compiled
RAW update file into the defined sessions. A RAW update file is not
more than a pre-compiled binary stream of LDP PDU.
.. code-block:: none
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | PDU Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LDP Identifier |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. LDP Messages
.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | PDU Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LDP Identifier |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. LDP Messages
.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Those files can be created using the included LDP RAW update generator
script ``ldpupdate`` or manually using libraries like scapy.
The configured ``raw-update-file`` under the LDP instance is loaded
during BNG Blaster startup phase and send it as soon as the session is
established.
The ``ldp-raw-update`` :ref:`command <api>` allows to send further updates during
the session lifetime.
``$ sudo bngblaster-cli run.sock ldp-raw-update file update1.ldp``
This allows loading label mappings after the LDP session has
started and manually trigger a series of changes using incremental
updates files.
All LDP RAW update files are loaded once and can then be used for
multiple sessions. Meaning if two or more sessions reference the
same file identified by file name, this file is loaded once into
memory and used by multiple sessions.
LDP RAW Update Generator
~~~~~~~~~~~~~~~~~~~~~~~~
The LDP RAW update generator is a simple tool to generate LDP RAW update
streams for use with the BNG Blaster.
.. code-block:: none
$ ldpupdate --help
usage: ldpupdate [-h] -l ADDRESS [-i N] -p PREFIX [-P N] [-m LABEL] [-M N]
[-f FILE] [--append] [--pcap FILE]
[--log-level {warning,info,debug}]
The LDP RAW update generator is a simple tool to generate LDP RAW update
streams for use with the BNG Blaster.
optional arguments:
-h, --help show this help message and exit
-l ADDRESS, --lsr-id ADDRESS
LSR identifier
-i N, --message-id-base N
message identifier base
-w, --withdraw withdraw
-a ADDRESS, --address-base ADDRESS
address message base
-A N, --address-num N
address message count
-p PREFIX, --prefix-base PREFIX
label mapping base prefix
-P N, --prefix-num N label mapping prefix count
-m LABEL, --label-base LABEL
label base
-M N, --label-num N label count
-f FILE, --file FILE output file
--append append to file if exist
--pcap FILE write LDP updates to PCAP file
--log-level {warning,info,debug}
logging Level
The python LDP RAW update generator is a python script that uses
scapy to build LDP PDU. Therefore this tool can be easily
modified, extend or used as a blueprint for your own tools to generate
valid LDP update streams.