SREXT is a kernel module providing the basic Segment Routing functions in addition to more advanced ones. It can be used as a standalone SRv6 implementation or as a complement to the existing SRv6 kernel implementation (kernel 4.10 and later kernels).
This is the project web page, part of the ROSE project.
SREXT supports “my local SID table” which contains the local SRv6 segments explicitly instantiated in the node and associates each SID with a function. The local SID table is completely independent from the Linux routing table and contains only SRv6 segments. Each entry of the localsid table is an SRv6 segment that is associated with an SRv6 endpoint behavior.
SREXT registers a callback function in the pre-routing hook of the netfilter framework. This callback function is invoked for each received IPv6 packet. If the destination address of the IPv6 packet matches an entry in the local SID table, the associated behavior is applied otherwise the packet will go through the kernel's routing sub-system for normal processing.
SREXT support most endpoint behaviors of the I-D.ietf-spring-srv6-network-programming by associating a different function to different SRv6 segments. The following table summarize the currently implemented SRv6 endpoint behaviors.
+-------------+--------------------------------------------------------------------------------+
| BEHAVIOR | Desription |
|-------------+--------------------------------------------------------------------------------+
| End | The Endpoint function ("End" for short) is the most basic function |
|-------------+--------------------------------------------------------------------------------+
| End.X | Endpoint with cross-connect to an array of layer-3 adjacencies |
|-------------+--------------------------------------------------------------------------------+
| End.DX2 | Endpoint with decapsulation and Layer-2 cross-connect to OIF |
|-------------+--------------------------------------------------------------------------------+
| End.Dx4 | Endpoint with decapsulation and cross-connect to an IPv4 adjacency |
|-------------+--------------------------------------------------------------------------------+
| End.DX6 | Endpoint with decapsulation and cross-connect to an IPv6 adjacency |
|-------------+--------------------------------------------------------------------------------+
| End.AD4 | Endpoint to IPv4 SR-unaware APP via dynamic proxy |
|-------------+--------------------------------------------------------------------------------+
| End.AD6 | Endpoint to IPv6 SR-unaware APP via dynamic proxy |
|-------------+--------------------------------------------------------------------------------+
| End.AM | Endpoint to SR-unaware APP via masquerading |
|-------------+--------------------------------------------------------------------------------+
| End.EAD4 | Extended End.AD4 behavior that allow SR-unaware VNFS to be the last SF in SFC |
|-------------+--------------------------------------------------------------------------------+
| End.EAD6 | Extended End.AD6 behavior that allow SR-unaware VNFS to be the last SF in SFC |
+-------------+--------------------------------------------------------------------------------+
$ git clone https://github.com/netgroup/SRv6-net-prog
$ cd srv6-net-prog/srext/
$ sudo make
$ sudo make install
$ sudo rmmod srext
$ sudo make deinstall
$ sudo make clean
SREXT provides a command-line interface to interact with the local SID table, for adding a new SID, removing an existing SID, showing its content and more. Some examples of the CLI syntax is shown hereafter
$ sudo depmod -a
$ sudo modprobe srext
$ sudo srconf localsid
Usage: srconf localsid { help | flush }
srconf localsid { show | clear-counters } [SID]
srconf localsid del SID
srconf localsid add SID BEHAVIOUR
BEHAVIOUR:= { end |
end.dx2 TARGETIF |
end.dx4 NEXTHOP4 TARGETIF |
{ end.x | end.dx6 } NEXTHOP6 TARGETIF |
{ end.ad4 | end.ead4 } NEXTHOP4 TARGETIF SOURCEIF |
{ end.am | end.ad6 | end.ead6 } NEXTHOP6 TARGETIF SOURCEIF |
end.as4 NEXTHOP4 TARGETIF SOURCEIF src ADDR segs SIDLIST left SEGMENTLEFT }
end.as6 NEXTHOP6 TARGETIF SOURCEIF src ADDR segs SIDLIST left SEGMENTLEFT |
NEXTHOP4:= { ip IPv4-ADDR | mac MAC-ADDR }
NEXTHOP6:= { ip IPv6-ADDR | mac MAC-ADDR }
Let's take an example of adding a SID with End.AM behavior. The End.AM behavioris used mostly is SFC use cases. It supports service chaining through SR-unaware application.
$ sudo srconf localsid add SID end.am ip IPv6-ADDR TARGETIF SOURCEIF
SID: SRv6 segment
IP-ADDR: IPv6 address of the VNF
TARGETIF: Target interface is used to trnsmmit packets to the VNF (after Masquerading)
SOURCEIF: Source interface identifies packets coming back from the VNF (to be de-masqueraded)
$ sudo srconf localsid del SID
If you want to delete all SIDs of the local SId table, you can use the flush
command instead
$ sudo srconf localsid flush
The show command prints SIDs of “my localsid table”, and shows, for each SID, the associated behavior, attributes, and counters for both good and bad traffic
The show
command comes in two variants;
$ sudo srconf localsid show
$ sudo srconf localsid show SID
Here an example output of the show command for all SIDs:
$ sudo srconf localsid show
SRv6 - MY LOCALSID TABLE:
=======================================================
SID : 2::AD6:F1
Behavior: end.ad6
Next hop: 2:f1::f1
OIF : veth1-2-f1
IIF : veth1-2-f1
Good traffic: [33 packets : 3894 bytes]
Bad traffic: [0 packets : 0 bytes]
------------------------------------------------------
SID : 2::AD6:F2
Behavior: end.ad6
Next hop: 00:00:00:02:f3:f3
OIF : veth1-2-f2
IIF : veth1-2-f2
Good traffic: [33 packets : 3894 bytes]
Bad traffic: [0 packets : 0 bytes]
------------------------------------------------------
SID : 2::D6:3
Behavior: end.dx6
Next hop: 2:3::3
OIF : eth2
Good traffic: [33 packets : 3894 bytes]
Bad traffic: [0 packets : 0 bytes]
------------------------------------------------------
SREXT ClI provides, for each SID, counters for both good and bad traffic that match with each SID. The counters are printed in the output of the show command.
SREXT gives the ability to clear the SID conuters using the clear-counters
command
The clear-counters
command comes in two variants;
$ sudo srconf localsid clear-counters
$ sudo srconf localsid clear-counters SID
we provide a VirtualBox testbed using Vagrant. The testbed gives an example of using the srext module to support the chaining of SR-unaware VNFs use-case.
For a complete description of the use-case, please visit the testbed page