1) Imports ENCAP_MPLS labels from IPv4/IPv6 routes. Note that this requires libnl 3.6.0 or newer. In previous patches, the fib_path_ext_t had a path ID of -1. After a long investigation, it turned out to be caused by route weight being set to 0. There is a comment explaining more details. 2) Handles MPLS routes. MPLS routes were wrongly added as IPv4 routes before. POP and SWAP are now both supported. All the routes are installed as NON-EOS and EOS routes, as the Linux kernel does not differentiate. EOS POP used in PHP uses the next-hop address family to determine the resulting address family. This patch is sufficient for P setups. PE setups with implicit null should also function okay, as long as a seperate label gets programmed per address family. PE setups with explicit null will also forward packets, but punting is a bit odd and needs MPLS input enabled on the LCP host device. Make sure to enable MPLS in VPP first. 3) Propagate MPLS input state to LCP Pair and Linux. Since the Linux kernel uses the MPLS routes itself, the LCP pair tap needs MPLS enabled to allow host originated packets. This also syncs the Linux `net.mpls.conf.<host_if>.input` sysctl to allow punted packets to have MPLS labels, mostly explicit nulls. For that to work, load the mpls kernel modules. 4) Cross connect MPLS packets from Linux directly to interface-output This is a port of https://gerrit.fd.io/r/c/vpp/+/38702
73 lines
1.5 KiB
CMake
73 lines
1.5 KiB
CMake
# Copyright (c) 2020 Cisco and/or its affiliates.
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at:
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
vpp_find_path(LIBNL3_INCLUDE_DIR NAMES libnl3/netlink/route/link/vlan.h)
|
|
|
|
if (NOT LIBNL3_INCLUDE_DIR)
|
|
message(WARNING "-- libnl3 headers not found - lcpng plugin disabled")
|
|
return()
|
|
endif()
|
|
|
|
vpp_plugin_find_library(lcpng LIBNL3_LIB libnl-3.so)
|
|
vpp_plugin_find_library(lcpng LIBNL3_ROUTE_LIB libnl-route-3.so.200)
|
|
|
|
include_directories(${LIBNL3_INCLUDE_DIR}/libnl3)
|
|
include_directories(${LIBMNL_INCLUDE_DIR})
|
|
|
|
add_vpp_library(lcpng
|
|
SOURCES
|
|
lcpng_interface.c
|
|
lcpng_adj.c
|
|
lcpng_if_sync.c
|
|
lcpng_mpls_sync.c
|
|
lcpng.c
|
|
|
|
LINK_LIBRARIES
|
|
${LIBNL3_LIB}
|
|
${LIBNL3_ROUTE_LIB}
|
|
|
|
INSTALL_HEADERS
|
|
lcpng_interface.h
|
|
lcpng.h
|
|
)
|
|
|
|
add_vpp_plugin(lcpng_if
|
|
SOURCES
|
|
lcpng_if_api.c
|
|
lcpng_if_cli.c
|
|
lcpng_if_node.c
|
|
|
|
API_FILES
|
|
lcpng_if.api
|
|
|
|
LINK_LIBRARIES
|
|
lcpng
|
|
)
|
|
|
|
add_vpp_plugin(lcpng_nl
|
|
SOURCES
|
|
lcpng_netlink.c
|
|
lcpng_nl_sync.c
|
|
|
|
LINK_LIBRARIES
|
|
lcpng
|
|
)
|
|
|
|
add_vpp_plugin(lcpng_unittest
|
|
SOURCES
|
|
test/lcpng_unittest.c
|
|
|
|
LINK_LIBRARIES
|
|
lcpng
|
|
)
|