mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-28 03:40:04 +00:00
664d6f8686
SRv6 End.DT4 is defined in the SRv6 Network Programming [1]. The SRv6 End.DT4 is used to implement IPv4 L3VPN use-cases in multi-tenants environments. It decapsulates the received packets and it performs IPv4 routing lookup in the routing table of the tenant. The SRv6 End.DT4 Linux implementation leverages a VRF device in order to force the routing lookup into the associated routing table. To make the End.DT4 work properly, it must be guaranteed that the routing table used for routing lookup operations is bound to one and only one VRF during the tunnel creation. Such constraint has to be enforced by enabling the VRF strict_mode sysctl parameter, i.e: $ sysctl -wq net.vrf.strict_mode=1. At JANOG44, LINE corporation presented their multi-tenant DC architecture using SRv6 [2]. In the slides, they reported that the Linux kernel is missing the support of SRv6 End.DT4 behavior. The SRv6 End.DT4 behavior can be instantiated using a command similar to the following: $ ip route add 2001:db8::1 encap seg6local action End.DT4 vrftable 100 dev eth0 We introduce the "vrftable" extension in iproute2 in a following patch. [1] https://tools.ietf.org/html/draft-ietf-spring-srv6-network-programming [2] https://speakerdeck.com/line_developers/line-data-center-networking-with-srv6 Signed-off-by: Andrea Mayer <andrea.mayer@uniroma2.it> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
81 lines
2 KiB
C
81 lines
2 KiB
C
/*
|
|
* SR-IPv6 implementation
|
|
*
|
|
* Author:
|
|
* David Lebrun <david.lebrun@uclouvain.be>
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef _UAPI_LINUX_SEG6_LOCAL_H
|
|
#define _UAPI_LINUX_SEG6_LOCAL_H
|
|
|
|
#include <linux/seg6.h>
|
|
|
|
enum {
|
|
SEG6_LOCAL_UNSPEC,
|
|
SEG6_LOCAL_ACTION,
|
|
SEG6_LOCAL_SRH,
|
|
SEG6_LOCAL_TABLE,
|
|
SEG6_LOCAL_NH4,
|
|
SEG6_LOCAL_NH6,
|
|
SEG6_LOCAL_IIF,
|
|
SEG6_LOCAL_OIF,
|
|
SEG6_LOCAL_BPF,
|
|
SEG6_LOCAL_VRFTABLE,
|
|
__SEG6_LOCAL_MAX,
|
|
};
|
|
#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1)
|
|
|
|
enum {
|
|
SEG6_LOCAL_ACTION_UNSPEC = 0,
|
|
/* node segment */
|
|
SEG6_LOCAL_ACTION_END = 1,
|
|
/* adjacency segment (IPv6 cross-connect) */
|
|
SEG6_LOCAL_ACTION_END_X = 2,
|
|
/* lookup of next seg NH in table */
|
|
SEG6_LOCAL_ACTION_END_T = 3,
|
|
/* decap and L2 cross-connect */
|
|
SEG6_LOCAL_ACTION_END_DX2 = 4,
|
|
/* decap and IPv6 cross-connect */
|
|
SEG6_LOCAL_ACTION_END_DX6 = 5,
|
|
/* decap and IPv4 cross-connect */
|
|
SEG6_LOCAL_ACTION_END_DX4 = 6,
|
|
/* decap and lookup of DA in v6 table */
|
|
SEG6_LOCAL_ACTION_END_DT6 = 7,
|
|
/* decap and lookup of DA in v4 table */
|
|
SEG6_LOCAL_ACTION_END_DT4 = 8,
|
|
/* binding segment with insertion */
|
|
SEG6_LOCAL_ACTION_END_B6 = 9,
|
|
/* binding segment with encapsulation */
|
|
SEG6_LOCAL_ACTION_END_B6_ENCAP = 10,
|
|
/* binding segment with MPLS encap */
|
|
SEG6_LOCAL_ACTION_END_BM = 11,
|
|
/* lookup last seg in table */
|
|
SEG6_LOCAL_ACTION_END_S = 12,
|
|
/* forward to SR-unaware VNF with static proxy */
|
|
SEG6_LOCAL_ACTION_END_AS = 13,
|
|
/* forward to SR-unaware VNF with masquerading */
|
|
SEG6_LOCAL_ACTION_END_AM = 14,
|
|
/* custom BPF action */
|
|
SEG6_LOCAL_ACTION_END_BPF = 15,
|
|
|
|
__SEG6_LOCAL_ACTION_MAX,
|
|
};
|
|
|
|
#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1)
|
|
|
|
enum {
|
|
SEG6_LOCAL_BPF_PROG_UNSPEC,
|
|
SEG6_LOCAL_BPF_PROG,
|
|
SEG6_LOCAL_BPF_PROG_NAME,
|
|
__SEG6_LOCAL_BPF_PROG_MAX,
|
|
};
|
|
|
|
#define SEG6_LOCAL_BPF_PROG_MAX (__SEG6_LOCAL_BPF_PROG_MAX - 1)
|
|
|
|
#endif
|