Frr 8.2 upgrade (#10691)
Why I did it Upgrade FRR to version 8.2.2. Build libyang2 required by FRR. How I did it Update FRR version and tag. How to verify it Following tests were performed on sonic-vs: BGP docker status check BGP configuration and session establishment Route redistribution and ping Issued show commands to check the bgp neighbor and routes Checked app-db to ensure bgp routes are installed with correct interface and nexthop. Create VRF and check FRR knows the VRF Check VRF routes are installed in app-db with correct Vrf name and next-hop Establish BGP Evpn session and check if Evpn routes (multicast, mac, prefix) are exchanged and installed correctly in app-db.
This commit is contained in:
parent
2ead3aaefc
commit
a477dbb175
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -46,7 +46,7 @@
|
||||
[submodule "src/sonic-frr/frr"]
|
||||
path = src/sonic-frr/frr
|
||||
url = https://github.com/Azure/sonic-frr.git
|
||||
branch = frr/7.5
|
||||
branch = frr/8.2
|
||||
[submodule "platform/p4/p4-hlir/p4-hlir-v1.1"]
|
||||
path = platform/p4/p4-hlir/p4-hlir-v1.1
|
||||
url = https://github.com/p4lang/p4-hlir.git
|
||||
|
@ -7,10 +7,10 @@ DOCKER_FPM_FRR_DBG = $(DOCKER_FPM_FRR_STEM)-$(DBG_IMAGE_MARK).gz
|
||||
$(DOCKER_FPM_FRR)_PATH = $(DOCKERS_PATH)/$(DOCKER_FPM_FRR_STEM)
|
||||
$(DOCKER_FPM_FRR)_PYTHON_WHEELS += $(SONIC_BGPCFGD) $(SONIC_FRR_MGMT_FRAMEWORK)
|
||||
|
||||
$(DOCKER_FPM_FRR)_DEPENDS += $(FRR) $(FRR_SNMP) $(SWSS) $(LIBYANG1)
|
||||
$(DOCKER_FPM_FRR)_DEPENDS += $(FRR) $(FRR_SNMP) $(SWSS) $(LIBYANG2)
|
||||
$(DOCKER_FPM_FRR)_DBG_DEPENDS = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS)
|
||||
$(DOCKER_FPM_FRR)_DBG_DEPENDS += $(SWSS_DBG) $(LIBSWSSCOMMON_DBG) \
|
||||
$(FRR_DBG) $(FRR_SNMP_DBG) $(LIBYANG1_DBG)
|
||||
$(FRR_DBG) $(FRR_SNMP_DBG) $(LIBYANG2_DBG)
|
||||
|
||||
$(DOCKER_FPM_FRR)_DBG_IMAGE_PACKAGES = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_IMAGE_PACKAGES)
|
||||
|
||||
|
12
rules/frr.mk
12
rules/frr.mk
@ -1,16 +1,16 @@
|
||||
# FRRouting (frr) package
|
||||
|
||||
FRR_VERSION = 7.5.1
|
||||
FRR_VERSION = 8.2.2
|
||||
FRR_SUBVERSION = 0
|
||||
FRR_BRANCH = frr/7.5
|
||||
FRR_TAG = frr-7.5.1-s1
|
||||
FRR_BRANCH = frr/8.2
|
||||
FRR_TAG = frr-8.2.2
|
||||
export FRR_VERSION FRR_SUBVERSION FRR_BRANCH FRR_TAG
|
||||
|
||||
|
||||
FRR = frr_$(FRR_VERSION)-sonic-$(FRR_SUBVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(FRR)_DEPENDS += $(LIBSNMP_DEV) $(LIBYANG1) $(LIBYANG1_DEV)
|
||||
$(FRR)_RDEPENDS += $(LIBYANG1)
|
||||
$(FRR)_UNINSTALLS = $(LIBYANG1_DEV) $(LIBYANG1)
|
||||
$(FRR)_DEPENDS += $(LIBSNMP_DEV) $(LIBYANG2) $(LIBYANG2_DEV)
|
||||
$(FRR)_RDEPENDS += $(LIBYANG2)
|
||||
$(FRR)_UNINSTALLS = $(LIBYANG2_DEV) $(LIBYANG2)
|
||||
$(FRR)_SRC_PATH = $(SRC_PATH)/sonic-frr
|
||||
SONIC_MAKE_DEBS += $(FRR)
|
||||
|
||||
|
@ -29,7 +29,7 @@ LIBYANG_PY3 = python3-yang_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(LIBYANG_PY3)_DEPENDS += $(LIBYANG) $(LIBYANG_CPP)
|
||||
$(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_PY3)))
|
||||
|
||||
$(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1)))
|
||||
$(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV)))
|
||||
$(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1),$(LIBYANG2)))
|
||||
$(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV),$(LIBYANG2_DEV)))
|
||||
|
||||
export LIBYANG LIBYANG_DBG LIBYANG_DEV LIBYANG_CPP LIBYANG_PY3
|
||||
|
10
rules/libyang2.dep
Normal file
10
rules/libyang2.dep
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
SPATH := $($(LIBYANG2)_SRC_PATH)
|
||||
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/libyang2.mk rules/libyang2.dep
|
||||
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
|
||||
DEP_FILES += $(shell git ls-files $(SPATH))
|
||||
|
||||
$(LIBYANG2)_CACHE_MODE := GIT_CONTENT_SHA
|
||||
$(LIBYANG2)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
|
||||
$(LIBYANG2)_DEP_FILES := $(DEP_FILES)
|
||||
|
43
rules/libyang2.mk
Normal file
43
rules/libyang2.mk
Normal file
@ -0,0 +1,43 @@
|
||||
# libyang2
|
||||
|
||||
LIBYANG2_VERSION_BASE = 2.0
|
||||
LIBYANG2_VERSION = $(LIBYANG2_VERSION_BASE).112
|
||||
LIBYANG2_SUBVERSION = 6
|
||||
LIBYANG2_FULLVERSION = $(LIBYANG2_VERSION)-$(LIBYANG2_SUBVERSION)
|
||||
|
||||
export LIBYANG2_VERSION_BASE
|
||||
export LIBYANG2_VERSION
|
||||
export LIBYANG2_SUBVERSION
|
||||
export LIBYANG2_FULLVERSION
|
||||
|
||||
LIBYANG2 = libyang2_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(LIBYANG2)_SRC_PATH = $(SRC_PATH)/libyang2
|
||||
SONIC_MAKE_DEBS += $(LIBYANG2)
|
||||
|
||||
LIBYANG2_DEV = libyang2-dev_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_DEV)))
|
||||
|
||||
LIBYANG2_DBG = libyang2-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_DBG)))
|
||||
|
||||
LIBYANG2_CPP = libyang2-cpp1_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(LIBYANG2_CPP)_DEPENDS += $(LIBYANG2)
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP)))
|
||||
|
||||
LIBYANG2_CPP_DEV = libyang2-cpp-dev_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP_DEV)))
|
||||
|
||||
LIBYANG2_CPP_DBG = libyang2-cpp1-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_CPP_DBG)))
|
||||
|
||||
YANG_TOOLS = yang-tools_$(LIBYANG2_FULLVERSION)_all.deb
|
||||
$(YANG_TOOLS)_DEPENDS += $(LIBYANG2)
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(YANG_TOOLS)))
|
||||
|
||||
LIBYANG2_TOOLS = libyang2-tools_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS)))
|
||||
|
||||
LIBYANG2_TOOLS_DBG = libyang2-tools-dbgsym_$(LIBYANG2_FULLVERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(eval $(call add_derived_package,$(LIBYANG2),$(LIBYANG2_TOOLS_DBG)))
|
||||
|
||||
export LIBYANG2 LIBYANG2_DBG LIBYANG2_DEV LIBYANG2_CPP LIBYANG2_CPP_DEV LIBYANG2_CPP_DBG YANG_TOOLS LIBYANG2_TOOLS LIBYANG2_TOOLS_DBG
|
@ -90,7 +90,7 @@ RUN apt-get update && apt-get install -y \
|
||||
imagemagick \
|
||||
ghostscript \
|
||||
groff \
|
||||
libpcre3-dev \
|
||||
libpcre2-dev \
|
||||
gawk \
|
||||
chrpath \
|
||||
# For frr build
|
||||
|
3
src/libyang2/.gitignore
vendored
Normal file
3
src/libyang2/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*
|
||||
!.gitignore
|
||||
!Makefile
|
40
src/libyang2/Makefile
Normal file
40
src/libyang2/Makefile
Normal file
@ -0,0 +1,40 @@
|
||||
.ONESHELL:
|
||||
SHELL = /bin/bash
|
||||
.SHELLFLAGS += -e
|
||||
|
||||
LIBYANG_URL = https://sonicstorage.blob.core.windows.net/debian/pool/main/liby/libyang
|
||||
|
||||
DSC_FILE = libyang2_$(LIBYANG2_FULLVERSION).dsc
|
||||
ORIG_FILE = libyang2_$(LIBYANG2_VERSION).orig.tar.gz
|
||||
DEBIAN_FILE = libyang2_$(LIBYANG2_FULLVERSION).debian.tar.xz
|
||||
|
||||
DSC_FILE_URL = $(LIBYANG_URL)/$(DSC_FILE)
|
||||
ORIG_FILE_URL = $(LIBYANG_URL)/$(ORIG_FILE)
|
||||
DEBIAN_FILE_URL = $(LIBYANG_URL)/$(DEBIAN_FILE)
|
||||
|
||||
MAIN_TARGET = $(LIBYANG2)
|
||||
DERIVED_TARGETS = $(LIBYANG2_DEV) $(LIBYANG2_DBG) $(LIBYANG2_TOOLS) $(LIBYANG2_TOOLS_DBG)
|
||||
|
||||
$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
|
||||
# Obtaining the libyang
|
||||
rm -fr ./libyang2-$(LIBYANG2_VERSION)
|
||||
|
||||
# download debian libyang
|
||||
wget -NO "$(DSC_FILE)" $(DSC_FILE_URL)
|
||||
wget -NO "$(ORIG_FILE)" $(ORIG_FILE_URL)
|
||||
wget -NO "$(DEBIAN_FILE)" $(DEBIAN_FILE_URL)
|
||||
dpkg-source -x libyang2_$(LIBYANG2_FULLVERSION).dsc
|
||||
|
||||
pushd libyang2-$(LIBYANG2_VERSION)
|
||||
#sed -i 's/set(LIBYANG_MAJOR_SOVERSION 1)/set(LIBYANG_MAJOR_SOVERSION 2)/' CMakeLists.txt
|
||||
#sed -i 's/libyang2/libyang2/' debian/libyang2.install
|
||||
# Enable large file support for 32-bit arch
|
||||
echo 'add_definitions(-D_FILE_OFFSET_BITS=64)' >> CMakeLists.txt
|
||||
|
||||
dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
|
||||
popd
|
||||
|
||||
# Move the newly-built .deb packages to the destination directory
|
||||
mv $* $(DERIVED_TARGETS) $(DEST)/
|
||||
|
||||
$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET)
|
@ -13,7 +13,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
|
||||
git checkout -b $(FRR_BRANCH) origin/$(FRR_BRANCH) || git checkout $(FRR_BRANCH)
|
||||
stg branch --create $(STG_BRANCH) $(FRR_TAG)
|
||||
stg import -s ../patch/series
|
||||
tools/tarsource.sh -V -e '-sonic'
|
||||
gbp dch --ignore-branch --new-version=$(FRR_VERSION)-sonic-$(FRR_SUBVERSION) --dch-opt="--force-bad-version" --commit --git-author
|
||||
dpkg-buildpackage -rfakeroot -b -us -uc -Ppkg.frr.nortrlib -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR)
|
||||
stg undo || true
|
||||
git clean -xfdf
|
||||
|
@ -1,20 +1,20 @@
|
||||
From 71415ae851357025a99b8ead7edf5755a55b6fbb Mon Sep 17 00:00:00 2001
|
||||
From 4ab192df23362e64d1a11441fae82329388f103e Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Shirshov <pavelsh@microsoft.com>
|
||||
Date: Mon, 16 Nov 2020 18:00:12 -0800
|
||||
Subject: [PATCH 1/5] Add support of bgp tcp DSCP value
|
||||
Subject: [PATCH 1/8] Add support of bgp tcp DSCP value
|
||||
|
||||
---
|
||||
bgpd/bgp_network.c | 11 ++++-------
|
||||
bgpd/bgp_vty.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
bgpd/bgpd.c | 2 +-
|
||||
bgpd/bgpd.c | 1 +
|
||||
bgpd/bgpd.h | 3 +++
|
||||
4 files changed, 52 insertions(+), 8 deletions(-)
|
||||
4 files changed, 52 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
|
||||
index cae11ae7b..f1d96664d 100644
|
||||
index 3fb7619ed..70c771683 100644
|
||||
--- a/bgpd/bgp_network.c
|
||||
+++ b/bgpd/bgp_network.c
|
||||
@@ -721,11 +721,9 @@ int bgp_connect(struct peer *peer)
|
||||
@@ -743,11 +743,9 @@ int bgp_connect(struct peer *peer)
|
||||
#ifdef IPTOS_PREC_INTERNETCONTROL
|
||||
frr_with_privs(&bgpd_privs) {
|
||||
if (sockunion_family(&peer->su) == AF_INET)
|
||||
@ -28,7 +28,7 @@ index cae11ae7b..f1d96664d 100644
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -801,10 +799,9 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
|
||||
@@ -824,10 +822,9 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
|
||||
|
||||
#ifdef IPTOS_PREC_INTERNETCONTROL
|
||||
if (sa->sa_family == AF_INET)
|
||||
@ -42,10 +42,10 @@ index cae11ae7b..f1d96664d 100644
|
||||
|
||||
sockopt_v6only(sa->sa_family, sock);
|
||||
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
|
||||
index bb2f89f9e..33662b08e 100644
|
||||
index 4df2abef8..950d1d25c 100644
|
||||
--- a/bgpd/bgp_vty.c
|
||||
+++ b/bgpd/bgp_vty.c
|
||||
@@ -1330,6 +1330,42 @@ DEFUN (no_router_bgp,
|
||||
@@ -1558,6 +1558,42 @@ DEFUN (no_router_bgp,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
@ -88,7 +88,7 @@ index bb2f89f9e..33662b08e 100644
|
||||
|
||||
/* BGP router-id. */
|
||||
|
||||
@@ -15549,6 +15585,10 @@ int bgp_config_write(struct vty *vty)
|
||||
@@ -17053,6 +17089,10 @@ int bgp_config_write(struct vty *vty)
|
||||
if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
|
||||
vty_out(vty, " no bgp fast-external-failover\n");
|
||||
|
||||
@ -97,9 +97,9 @@ index bb2f89f9e..33662b08e 100644
|
||||
+ vty_out(vty, " bgp session-dscp %02X\n", bgp->tcp_dscp >> 2);
|
||||
+
|
||||
/* BGP router ID. */
|
||||
if (bgp->router_id_static.s_addr != 0)
|
||||
vty_out(vty, " bgp router-id %s\n",
|
||||
@@ -16057,6 +16097,10 @@ void bgp_vty_init(void)
|
||||
if (bgp->router_id_static.s_addr != INADDR_ANY)
|
||||
vty_out(vty, " bgp router-id %pI4\n",
|
||||
@@ -17662,6 +17702,10 @@ void bgp_vty_init(void)
|
||||
/* "no router bgp" commands. */
|
||||
install_element(CONFIG_NODE, &no_router_bgp_cmd);
|
||||
|
||||
@ -111,32 +111,31 @@ index bb2f89f9e..33662b08e 100644
|
||||
install_element(BGP_NODE, &bgp_router_id_cmd);
|
||||
install_element(BGP_NODE, &no_bgp_router_id_cmd);
|
||||
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
|
||||
index cf9ff038d..0e8579843 100644
|
||||
index 7e528b219..005523544 100644
|
||||
--- a/bgpd/bgpd.c
|
||||
+++ b/bgpd/bgpd.c
|
||||
@@ -3069,7 +3069,7 @@ static struct bgp *bgp_create(as_t *as, const char *name,
|
||||
|
||||
@@ -3229,6 +3229,7 @@ static struct bgp *bgp_create(as_t *as, const char *name,
|
||||
bgp->evpn_info = XCALLOC(MTYPE_BGP_EVPN_INFO,
|
||||
sizeof(struct bgp_evpn_info));
|
||||
-
|
||||
|
||||
+ bgp->tcp_dscp = IPTOS_PREC_INTERNETCONTROL;
|
||||
bgp_evpn_init(bgp);
|
||||
bgp_evpn_vrf_es_init(bgp);
|
||||
bgp_pbr_init(bgp);
|
||||
|
||||
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
|
||||
index 2aa069002..914f296e5 100644
|
||||
index 8b93c450e..e780d8a03 100644
|
||||
--- a/bgpd/bgpd.h
|
||||
+++ b/bgpd/bgpd.h
|
||||
@@ -678,6 +678,9 @@ struct bgp {
|
||||
@@ -743,6 +743,9 @@ struct bgp {
|
||||
/* Weighted ECMP related config. */
|
||||
enum bgp_link_bw_handling lb_handling;
|
||||
|
||||
+ /* dscp value for tcp sessions */
|
||||
+ uint8_t tcp_dscp;
|
||||
+
|
||||
QOBJ_FIELDS
|
||||
};
|
||||
DECLARE_QOBJ_TYPE(bgp)
|
||||
/* Process Queue for handling routes */
|
||||
struct work_queue *process_queue;
|
||||
|
||||
--
|
||||
2.29.2.windows.2
|
||||
2.12.2
|
||||
|
||||
|
@ -1,25 +1,25 @@
|
||||
From a81d37fc1558c33426a4fb59ff25c6d73a20f210 Mon Sep 17 00:00:00 2001
|
||||
From 15274a197e4d3b7ac0f11ca63a5274f1168739f5 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Shirshov <pavelsh@microsoft.com>
|
||||
Date: Mon, 16 Nov 2020 18:11:47 -0800
|
||||
Subject: [PATCH 2/5] Reduce severity of 'Vty connected from' message
|
||||
Subject: [PATCH 2/8] Reduce severity of 'Vty connected from' message
|
||||
|
||||
---
|
||||
lib/vty.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/vty.c b/lib/vty.c
|
||||
index 077c6f621..3204948b8 100644
|
||||
index 8eaf13619..7edeb5538 100644
|
||||
--- a/lib/vty.c
|
||||
+++ b/lib/vty.c
|
||||
@@ -1859,7 +1859,7 @@ static int vty_accept(struct thread *thread)
|
||||
@@ -1814,7 +1814,7 @@ static int vty_accept(struct thread *thread)
|
||||
zlog_info("can't set sockopt to vty_sock : %s",
|
||||
safe_strerror(errno));
|
||||
|
||||
- zlog_info("Vty connection from %s",
|
||||
+ zlog_debug("Vty connection from %s",
|
||||
sockunion2str(&su, buf, SU_ADDRSTRLEN));
|
||||
- zlog_info("Vty connection from %pSU", &su);
|
||||
+ zlog_debug("Vty connection from %pSU", &su);
|
||||
|
||||
vty_create(vty_sock, &su);
|
||||
|
||||
--
|
||||
2.29.2.windows.2
|
||||
2.12.2
|
||||
|
||||
|
@ -1,25 +1,25 @@
|
||||
From ecc9aa458a34f49744a2b90d3a7ebcce951a8478 Mon Sep 17 00:00:00 2001
|
||||
From 39bb40dc4bad4462e4ae9c98580d75fa2c92e032 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Shirshov <pavelsh@microsoft.com>
|
||||
Date: Mon, 16 Nov 2020 18:29:46 -0800
|
||||
Subject: [PATCH 3/5] Use vrf_id for vrf, not tabled_id
|
||||
Subject: [PATCH 3/8] Use vrf_id for vrf, not tabled_id
|
||||
|
||||
---
|
||||
zebra/zebra_fpm_netlink.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
|
||||
index 2c0741363..0ab92398f 100644
|
||||
index ec22c5dd4..aad0156b3 100644
|
||||
--- a/zebra/zebra_fpm_netlink.c
|
||||
+++ b/zebra/zebra_fpm_netlink.c
|
||||
@@ -286,7 +286,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd,
|
||||
ri->af = rib_dest_af(dest);
|
||||
@@ -287,7 +287,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd,
|
||||
ri->nlmsg_pid = zvrf->zns->netlink_dplane_out.snl.nl_pid;
|
||||
|
||||
ri->nlmsg_type = cmd;
|
||||
- ri->rtm_table = rib_table_info(rib_dest_table(dest))->table_id;
|
||||
- ri->rtm_table = table_info->table_id;
|
||||
+ ri->rtm_table = zvrf_id(rib_dest_vrf(dest));
|
||||
ri->rtm_protocol = RTPROT_UNSPEC;
|
||||
|
||||
/*
|
||||
--
|
||||
2.29.2.windows.2
|
||||
2.12.2
|
||||
|
||||
|
@ -1,17 +1,18 @@
|
||||
From 70739436fc8ab4d5e507a0185fbc58eca298f7eb Mon Sep 17 00:00:00 2001
|
||||
From afff474c79e0c177e090d1b45d68c9f816a52e3e Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Shirshov <pavelsh@microsoft.com>
|
||||
Date: Mon, 16 Nov 2020 18:33:46 -0800
|
||||
Subject: [PATCH 4/5] Allow BGP attr NEXT_HOP to be 0.0.0.0 due to alleviate
|
||||
the vendor bug
|
||||
Subject: [PATCH 4/8] Allow BGP attr NEXT_HOP to be 0.0.0.0 due to
|
||||
alleviate
|
||||
|
||||
---
|
||||
bgpd/bgp_route.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
|
||||
index 1c646c03e..df2aa1b4c 100644
|
||||
index b297ca006..d4b5066c6 100644
|
||||
--- a/bgpd/bgp_route.c
|
||||
+++ b/bgpd/bgp_route.c
|
||||
@@ -3354,8 +3354,7 @@ bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi,
|
||||
@@ -3625,8 +3625,7 @@ bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi,
|
||||
|
||||
/* If NEXT_HOP is present, validate it. */
|
||||
if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)) {
|
||||
@ -22,5 +23,5 @@ index 1c646c03e..df2aa1b4c 100644
|
||||
return true;
|
||||
}
|
||||
--
|
||||
2.29.2.windows.2
|
||||
2.12.2
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
From dd66532a0e73b0c3ae6375e795b3b47f16196d09 Mon Sep 17 00:00:00 2001
|
||||
From 786087468520db44c55e3566f77438b41f52763f Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Shirshov <pavelsh@microsoft.com>
|
||||
Date: Mon, 16 Nov 2020 18:35:01 -0800
|
||||
Subject: [PATCH 5/5] nexthops compare vrf only if ip type
|
||||
Subject: [PATCH 5/8] nexthops compare vrf only if ip type
|
||||
|
||||
---
|
||||
lib/nexthop.c | 12 ++++++------
|
||||
@ -9,10 +9,10 @@ Subject: [PATCH 5/5] nexthops compare vrf only if ip type
|
||||
2 files changed, 12 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/lib/nexthop.c b/lib/nexthop.c
|
||||
index 0ea72d03e..50552df60 100644
|
||||
index e17eeb830..a1ce22e3b 100644
|
||||
--- a/lib/nexthop.c
|
||||
+++ b/lib/nexthop.c
|
||||
@@ -105,12 +105,6 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1,
|
||||
@@ -140,12 +140,6 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1,
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -25,7 +25,7 @@ index 0ea72d03e..50552df60 100644
|
||||
if (next1->type < next2->type)
|
||||
return -1;
|
||||
|
||||
@@ -126,6 +120,12 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1,
|
||||
@@ -161,6 +155,12 @@ static int _nexthop_cmp_no_labels(const struct nexthop *next1,
|
||||
switch (next1->type) {
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
case NEXTHOP_TYPE_IPV6:
|
||||
@ -39,10 +39,10 @@ index 0ea72d03e..50552df60 100644
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
diff --git a/lib/zclient.c b/lib/zclient.c
|
||||
index fb48d4a12..39132465f 100644
|
||||
index 445837017..c104623b7 100644
|
||||
--- a/lib/zclient.c
|
||||
+++ b/lib/zclient.c
|
||||
@@ -822,12 +822,6 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1,
|
||||
@@ -864,12 +864,6 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1,
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -55,7 +55,7 @@ index fb48d4a12..39132465f 100644
|
||||
if (next1->type < next2->type)
|
||||
return -1;
|
||||
|
||||
@@ -843,6 +837,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1,
|
||||
@@ -885,6 +879,12 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1,
|
||||
switch (next1->type) {
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
case NEXTHOP_TYPE_IPV6:
|
||||
@ -69,5 +69,5 @@ index fb48d4a12..39132465f 100644
|
||||
&next2->gate);
|
||||
if (ret != 0)
|
||||
--
|
||||
2.29.2.windows.2
|
||||
2.12.2
|
||||
|
||||
|
@ -1,14 +1,12 @@
|
||||
From 31464e3fd0f677bc15286e99d4a30e2e33480c53 Mon Sep 17 00:00:00 2001
|
||||
From 0417036a3aece862c95111d4646ca7508a028165 Mon Sep 17 00:00:00 2001
|
||||
From: Ying Xie <ying.xie@microsoft.com>
|
||||
Date: Wed, 25 Nov 2020 22:28:43 +0000
|
||||
Subject: [PATCH] [frr] remove frr log outchannel to /var/log/frr.log
|
||||
|
||||
Subject: [PATCH] [PATCH 6/8] [frr] remove frr log outchannel to /var/log/frr.log
|
||||
SONiC runs frr inside a docker and the logs are sent to base image
|
||||
via rsyslog and recorded already. There is no need to keep the
|
||||
frr.log inside the docker. It will grow and take all harddrive
|
||||
space eventually.
|
||||
|
||||
Signed-off-by: Ying Xie <ying.xie@microsoft.com>
|
||||
---
|
||||
tools/etc/rsyslog.d/45-frr.conf | 19 -------------------
|
||||
1 file changed, 19 deletions(-)
|
||||
@ -44,5 +42,5 @@ index feeeb13f1..fcd23d23a 100644
|
||||
$programname == 'bgpd' or
|
||||
$programname == 'eigrpd' or
|
||||
--
|
||||
2.17.1
|
||||
2.12.2
|
||||
|
@ -1,34 +1,36 @@
|
||||
From 2e9ed539d29f13d874c6a5ab3120bf4bb26ab2bb Mon Sep 17 00:00:00 2001
|
||||
From 74ee34e4990dbd168b7b8072894eb0cf8927f9d1 Mon Sep 17 00:00:00 2001
|
||||
From: Kishore Kunal <kishore.kunal@broadcom.com>
|
||||
Date: Fri, 15 Jan 2021 15:52:13 -0800
|
||||
Subject: [PATCH] This is temp patch till Prefix to ARP indirection is add in neighorch
|
||||
Subject: [PATCH 7/8] This is temp patch till Prefix to ARP indirection is
|
||||
add in neighorch
|
||||
|
||||
---
|
||||
lib/nexthop.c | 1 +
|
||||
lib/nexthop.h | 7 ++++++-
|
||||
lib/nexthop.c | 2 ++
|
||||
lib/nexthop.h | 6 ++++++
|
||||
zebra/rt_netlink.c | 2 +-
|
||||
zebra/zapi_msg.c | 2 ++
|
||||
zebra/zebra_dplane.c | 2 +-
|
||||
zebra/zebra_fpm_netlink.c | 19 +++++++++++++++++++
|
||||
6 files changed, 30 insertions(+), 3 deletions(-)
|
||||
zebra/zapi_msg.c | 4 ++++
|
||||
zebra/zebra_dplane.c | 1 +
|
||||
zebra/zebra_fpm_netlink.c | 20 ++++++++++++++++++++
|
||||
6 files changed, 34 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/nexthop.c b/lib/nexthop.c
|
||||
index 0ea72d03e..02e826048 100644
|
||||
index a1ce22e3b..6f3fe2a5f 100644
|
||||
--- a/lib/nexthop.c
|
||||
+++ b/lib/nexthop.c
|
||||
@@ -657,6 +657,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
|
||||
@@ -813,6 +813,8 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
|
||||
memcpy(©->src, &nexthop->src, sizeof(nexthop->src));
|
||||
memcpy(©->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src));
|
||||
copy->rparent = rparent;
|
||||
+ memcpy(©->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN);
|
||||
+
|
||||
if (nexthop->nh_label)
|
||||
nexthop_add_labels(copy, nexthop->nh_label_type,
|
||||
nexthop->nh_label->num_labels,
|
||||
&nexthop->nh_label->label[0]);
|
||||
+ memcpy(©->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN);
|
||||
}
|
||||
|
||||
void nexthop_copy(struct nexthop *copy, const struct nexthop *nexthop,
|
||||
diff --git a/lib/nexthop.h b/lib/nexthop.h
|
||||
index cadcea1f4..fd959eb9e 100644
|
||||
index 320b46315..0f98dc3c2 100644
|
||||
--- a/lib/nexthop.h
|
||||
+++ b/lib/nexthop.h
|
||||
@@ -71,6 +71,11 @@ enum nh_encap_type {
|
||||
@@ -66,6 +66,11 @@ enum nh_encap_type {
|
||||
/* Backup index value is limited */
|
||||
#define NEXTHOP_BACKUP_IDX_MAX 255
|
||||
|
||||
@ -40,20 +42,19 @@ index cadcea1f4..fd959eb9e 100644
|
||||
/* Nexthop structure. */
|
||||
struct nexthop {
|
||||
struct nexthop *next;
|
||||
@@ -140,7 +145,7 @@ struct nexthop {
|
||||
/* Encapsulation information. */
|
||||
@@ -136,6 +141,7 @@ struct nexthop {
|
||||
enum nh_encap_type nh_encap_type;
|
||||
union {
|
||||
- vni_t vni;
|
||||
vni_t vni;
|
||||
+ struct vxlan_nh_encap encap_data;
|
||||
} nh_encap;
|
||||
|
||||
/* SR-TE color used for matching SR-TE policies */
|
||||
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
|
||||
index 50b1a62d8..d8249f8e0 100644
|
||||
index 24c01b7f5..5e0f4cd8f 100644
|
||||
--- a/zebra/rt_netlink.c
|
||||
+++ b/zebra/rt_netlink.c
|
||||
@@ -1590,7 +1590,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen,
|
||||
@@ -1856,7 +1856,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen,
|
||||
return false;
|
||||
|
||||
if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */,
|
||||
@ -63,43 +64,44 @@ index 50b1a62d8..d8249f8e0 100644
|
||||
nl_attr_nest_end(n, nest);
|
||||
break;
|
||||
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
|
||||
index e436e5a28..c10d50797 100644
|
||||
index 5cf7d815d..529cbb44b 100644
|
||||
--- a/zebra/zapi_msg.c
|
||||
+++ b/zebra/zapi_msg.c
|
||||
@@ -1477,6 +1477,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
|
||||
zebra_vxlan_evpn_vrf_route_add(
|
||||
api_nh->vrf_id, &api_nh->rmac,
|
||||
&vtep_ip, &api->prefix);
|
||||
+ memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN);
|
||||
@@ -1577,6 +1577,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
|
||||
vtep_ip.ipa_type = IPADDR_V4;
|
||||
memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4),
|
||||
sizeof(struct in_addr));
|
||||
+ memcpy(&(nexthop->nh_encap.encap_data.rmac),
|
||||
+ &api_nh->rmac, ETH_ALEN);
|
||||
zebra_rib_queue_evpn_route_add(
|
||||
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
|
||||
}
|
||||
break;
|
||||
case NEXTHOP_TYPE_IPV6:
|
||||
@@ -1511,6 +1512,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
|
||||
zebra_vxlan_evpn_vrf_route_add(
|
||||
api_nh->vrf_id, &api_nh->rmac,
|
||||
&vtep_ip, &api->prefix);
|
||||
+ memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN);
|
||||
@@ -1610,6 +1612,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
|
||||
vtep_ip.ipa_type = IPADDR_V6;
|
||||
memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6),
|
||||
sizeof(struct in6_addr));
|
||||
+ memcpy(&(nexthop->nh_encap.encap_data.rmac),
|
||||
+ &api_nh->rmac, ETH_ALEN);
|
||||
zebra_rib_queue_evpn_route_add(
|
||||
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
|
||||
}
|
||||
break;
|
||||
case NEXTHOP_TYPE_BLACKHOLE:
|
||||
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
|
||||
index abd0adb64..e66d7aae5 100644
|
||||
index 656ebcf3b..8d125d77e 100644
|
||||
--- a/zebra/zebra_dplane.c
|
||||
+++ b/zebra/zebra_dplane.c
|
||||
@@ -1891,7 +1891,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
|
||||
zl3vni = zl3vni_from_vrf(nexthop->vrf_id);
|
||||
@@ -2421,6 +2421,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
|
||||
if (zl3vni && is_l3vni_oper_up(zl3vni)) {
|
||||
nexthop->nh_encap_type = NET_VXLAN;
|
||||
- nexthop->nh_encap.vni = zl3vni->vni;
|
||||
nexthop->nh_encap.vni = zl3vni->vni;
|
||||
+ nexthop->nh_encap.encap_data.vni = zl3vni->vni;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
|
||||
index 2c0741363..2731f64fb 100644
|
||||
index aad0156b3..34be9fb39 100644
|
||||
--- a/zebra/zebra_fpm_netlink.c
|
||||
+++ b/zebra/zebra_fpm_netlink.c
|
||||
@@ -129,10 +129,12 @@ static const char *fpm_nh_encap_type_to_str(enum fpm_nh_encap_type_t encap_type)
|
||||
@@ -95,10 +95,12 @@ static const char *fpm_nh_encap_type_to_str(enum fpm_nh_encap_type_t encap_type)
|
||||
|
||||
struct vxlan_encap_info_t {
|
||||
vni_t vni;
|
||||
@ -112,16 +114,17 @@ index 2c0741363..2731f64fb 100644
|
||||
};
|
||||
|
||||
struct fpm_nh_encap_info_t {
|
||||
@@ -238,6 +240,8 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri,
|
||||
|
||||
/* Add VNI to VxLAN encap info */
|
||||
nhi.encap_info.vxlan_encap.vni = zl3vni->vni;
|
||||
+ memcpy(&nhi.encap_info.vxlan_encap.rmac, &(nexthop->nh_encap.encap_data.rmac),
|
||||
+ ETH_ALEN);
|
||||
@@ -234,6 +236,9 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri,
|
||||
}
|
||||
|
||||
nhi.encap_info.vxlan_encap.vni = vni;
|
||||
+ memcpy(&nhi.encap_info.vxlan_encap.rmac,
|
||||
+ &(nexthop->nh_encap.encap_data.rmac),
|
||||
+ ETH_ALEN);
|
||||
}
|
||||
|
||||
@@ -454,9 +458,16 @@ static int netlink_route_info_encode(struct netlink_route_info *ri,
|
||||
/*
|
||||
@@ -456,9 +461,16 @@ static int netlink_route_info_encode(struct netlink_route_info *ri,
|
||||
nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE,
|
||||
encap);
|
||||
vxlan = &nhi->encap_info.vxlan_encap;
|
||||
@ -138,7 +141,7 @@ index 2c0741363..2731f64fb 100644
|
||||
nl_attr_nest_end(&req->n, nest);
|
||||
break;
|
||||
}
|
||||
@@ -490,10 +501,18 @@ static int netlink_route_info_encode(struct netlink_route_info *ri,
|
||||
@@ -494,10 +506,18 @@ static int netlink_route_info_encode(struct netlink_route_info *ri,
|
||||
nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE,
|
||||
encap);
|
||||
vxlan = &nhi->encap_info.vxlan_encap;
|
||||
@ -158,5 +161,5 @@ index 2c0741363..2731f64fb 100644
|
||||
break;
|
||||
}
|
||||
--
|
||||
2.18.0
|
||||
2.12.2
|
||||
|
@ -0,0 +1,29 @@
|
||||
From 92ab2d74fca06f86c00d886ac249f7f2d89e93fe Mon Sep 17 00:00:00 2001
|
||||
From: Akhilesh Samineni <akhilesh.samineni@broadcom.com>
|
||||
Date: Mon, 5 Apr 2021 13:21:40 -0700
|
||||
Subject: [PATCH 8/8] Link local scope was not set while binding socket
|
||||
with local address causing socket errors for bgp ipv6 link local neighbors.
|
||||
|
||||
---
|
||||
bgpd/bgp_network.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
|
||||
index 70c771683..dbc9870a5 100644
|
||||
--- a/bgpd/bgp_network.c
|
||||
+++ b/bgpd/bgp_network.c
|
||||
@@ -662,6 +662,11 @@ static int bgp_update_address(struct interface *ifp, const union sockunion *dst,
|
||||
return 1;
|
||||
|
||||
prefix2sockunion(sel, addr);
|
||||
+
|
||||
+ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6.sin6_addr)) {
|
||||
+ addr->sin6.sin6_scope_id = ifp->ifindex;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.12.2
|
||||
|
@ -1,346 +0,0 @@
|
||||
From a70c630a504e041da1c2441337b2d47e8fdd3d30 Mon Sep 17 00:00:00 2001
|
||||
From: Joanne Mikkelson <jmmikkel@arista.com>
|
||||
Date: Mon, 29 Jun 2020 13:31:49 -0700
|
||||
Subject: [PATCH] Add "bgp bestpath peer-type multipath-relax"
|
||||
|
||||
This new BGP configuration is akin to "bgp bestpath aspath
|
||||
multipath-relax". When applied, paths learned from different peer types
|
||||
will be eligible to be considered for multipath (ECMP). Paths from all
|
||||
of eBGP, iBGP, and confederation peers may be included in multipaths
|
||||
if they are otherwise equal cost.
|
||||
|
||||
This change preserves the existing bestpath behavior of step 10's result
|
||||
being returned, not the result from steps 8 and 9, in the case where
|
||||
both 8+9 and 10 determine a winner.
|
||||
|
||||
When "bgp bestpath peer-type multipath-relax" is enabled, multipaths
|
||||
with both eBGP and iBGP learned routes may exist. It is not desirable
|
||||
for the iBGP next hops to be discarded from the FIB because they are not
|
||||
directly connected. When publishing a nexthop group to zebra, the
|
||||
ZEBRA_FLAG_ALLOW_RECURSION flag is normally not set when the best path
|
||||
is eBGP; when "bgp bestpath aspath multipath-relax" is configured, the
|
||||
flag will now be set if any paths are from iBGP peers. This leaves
|
||||
all-eBGP multipaths still requiring nexthops over connected routes.
|
||||
---
|
||||
bgpd/bgp_route.c | 76 ++++++++++++++++++++++++++++++++++--------------
|
||||
bgpd/bgp_vty.c | 43 +++++++++++++++++++++++++++
|
||||
bgpd/bgp_zebra.c | 15 +++++++++-
|
||||
bgpd/bgpd.h | 1 +
|
||||
doc/user/bgp.rst | 7 +++++
|
||||
5 files changed, 119 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
|
||||
index 1c646c03e..73dbf3c5f 100644
|
||||
--- a/bgpd/bgp_route.c
|
||||
+++ b/bgpd/bgp_route.c
|
||||
@@ -540,6 +540,8 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
int internal_as_route;
|
||||
int confed_as_route;
|
||||
int ret = 0;
|
||||
+ int igp_metric_ret = 0;
|
||||
+ int peer_sort_ret = -1;
|
||||
char new_buf[PATH_ADDPATH_STR_BUFFER];
|
||||
char exist_buf[PATH_ADDPATH_STR_BUFFER];
|
||||
uint32_t new_mm_seq;
|
||||
@@ -940,7 +942,9 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
zlog_debug(
|
||||
"%s: %s wins over %s due to eBGP peer > iBGP peer",
|
||||
pfx_buf, new_buf, exist_buf);
|
||||
- return 1;
|
||||
+ if (!CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
|
||||
+ return 1;
|
||||
+ peer_sort_ret = 1;
|
||||
}
|
||||
|
||||
if (exist_sort == BGP_PEER_EBGP
|
||||
@@ -950,7 +954,9 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
zlog_debug(
|
||||
"%s: %s loses to %s due to iBGP peer < eBGP peer",
|
||||
pfx_buf, new_buf, exist_buf);
|
||||
- return 0;
|
||||
+ if (!CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
|
||||
+ return 0;
|
||||
+ peer_sort_ret = 0;
|
||||
}
|
||||
|
||||
/* 8. IGP metric check. */
|
||||
@@ -962,19 +968,19 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
existm = exist->extra->igpmetric;
|
||||
|
||||
if (newm < existm) {
|
||||
- if (debug)
|
||||
+ if (debug && peer_sort_ret < 0)
|
||||
zlog_debug(
|
||||
"%s: %s wins over %s due to IGP metric %d < %d",
|
||||
pfx_buf, new_buf, exist_buf, newm, existm);
|
||||
- ret = 1;
|
||||
+ igp_metric_ret = 1;
|
||||
}
|
||||
|
||||
if (newm > existm) {
|
||||
- if (debug)
|
||||
+ if (debug && peer_sort_ret < 0)
|
||||
zlog_debug(
|
||||
"%s: %s loses to %s due to IGP metric %d > %d",
|
||||
pfx_buf, new_buf, exist_buf, newm, existm);
|
||||
- ret = 0;
|
||||
+ igp_metric_ret = 0;
|
||||
}
|
||||
|
||||
/* 9. Same IGP metric. Compare the cluster list length as
|
||||
@@ -992,21 +998,21 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
existm = BGP_CLUSTER_LIST_LENGTH(exist->attr);
|
||||
|
||||
if (newm < existm) {
|
||||
- if (debug)
|
||||
+ if (debug && peer_sort_ret < 0)
|
||||
zlog_debug(
|
||||
"%s: %s wins over %s due to CLUSTER_LIST length %d < %d",
|
||||
pfx_buf, new_buf, exist_buf,
|
||||
newm, existm);
|
||||
- ret = 1;
|
||||
+ igp_metric_ret = 1;
|
||||
}
|
||||
|
||||
if (newm > existm) {
|
||||
- if (debug)
|
||||
+ if (debug && peer_sort_ret < 0)
|
||||
zlog_debug(
|
||||
"%s: %s loses to %s due to CLUSTER_LIST length %d > %d",
|
||||
pfx_buf, new_buf, exist_buf,
|
||||
newm, existm);
|
||||
- ret = 0;
|
||||
+ igp_metric_ret = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1020,7 +1026,10 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
zlog_debug(
|
||||
"%s: %s wins over %s due to confed-external peer > confed-internal peer",
|
||||
pfx_buf, new_buf, exist_buf);
|
||||
- return 1;
|
||||
+ if (!CHECK_FLAG(bgp->flags,
|
||||
+ BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
|
||||
+ return 1;
|
||||
+ peer_sort_ret = 1;
|
||||
}
|
||||
|
||||
if (exist_sort == BGP_PEER_CONFED
|
||||
@@ -1030,7 +1039,10 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
zlog_debug(
|
||||
"%s: %s loses to %s due to confed-internal peer < confed-external peer",
|
||||
pfx_buf, new_buf, exist_buf);
|
||||
- return 0;
|
||||
+ if (!CHECK_FLAG(bgp->flags,
|
||||
+ BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
|
||||
+ return 0;
|
||||
+ peer_sort_ret = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1091,20 +1103,40 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
|
||||
* TODO: If unequal cost ibgp multipath is enabled we can
|
||||
* mark the paths as equal here instead of returning
|
||||
*/
|
||||
- if (debug) {
|
||||
- if (ret == 1)
|
||||
- zlog_debug(
|
||||
- "%s: %s wins over %s after IGP metric comparison",
|
||||
- pfx_buf, new_buf, exist_buf);
|
||||
- else
|
||||
- zlog_debug(
|
||||
- "%s: %s loses to %s after IGP metric comparison",
|
||||
- pfx_buf, new_buf, exist_buf);
|
||||
+
|
||||
+ /* Prior to the addition of BGP_FLAG_PEERTYPE_MULTIPATH_RELAX,
|
||||
+ * if either step 7 or 10 (peer type checks) yielded a winner,
|
||||
+ * that result was returned immediately. Returning from step 10
|
||||
+ * ignored the return value computed in steps 8 and 9 (IGP
|
||||
+ * metric checks). In order to preserve that behavior, if
|
||||
+ * peer_sort_ret is set, return that rather than igp_metric_ret.
|
||||
+ */
|
||||
+ ret = peer_sort_ret;
|
||||
+ if (peer_sort_ret < 0) {
|
||||
+ ret = igp_metric_ret;
|
||||
+ if (debug) {
|
||||
+ if (ret == 1)
|
||||
+ zlog_debug(
|
||||
+ "%s: %s wins over %s after IGP metric comparison",
|
||||
+ pfx_buf, new_buf, exist_buf);
|
||||
+ else
|
||||
+ zlog_debug(
|
||||
+ "%s: %s loses to %s after IGP metric comparison",
|
||||
+ pfx_buf, new_buf, exist_buf);
|
||||
+ }
|
||||
+ *reason = bgp_path_selection_igp_metric;
|
||||
}
|
||||
- *reason = bgp_path_selection_igp_metric;
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * At this point, the decision whether to set *paths_eq = 1 has been
|
||||
+ * completed. If we deferred returning because of bestpath peer-type
|
||||
+ * relax configuration, return now.
|
||||
+ */
|
||||
+ if (peer_sort_ret >= 0)
|
||||
+ return peer_sort_ret;
|
||||
+
|
||||
/* 12. If both paths are external, prefer the path that was received
|
||||
first (the oldest one). This step minimizes route-flap, since a
|
||||
newer path won't displace an older one, even if it was the
|
||||
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
|
||||
index bb2f89f9e..4d1ce5a46 100644
|
||||
--- a/bgpd/bgp_vty.c
|
||||
+++ b/bgpd/bgp_vty.c
|
||||
@@ -3009,6 +3009,37 @@ DEFUN (no_bgp_bestpath_aspath_multipath_relax,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
+/* "bgp bestpath peer-type multipath-relax" configuration. */
|
||||
+DEFUN(bgp_bestpath_peer_type_multipath_relax,
|
||||
+ bgp_bestpath_peer_type_multipath_relax_cmd,
|
||||
+ "bgp bestpath peer-type multipath-relax",
|
||||
+ BGP_STR
|
||||
+ "Change the default bestpath selection\n"
|
||||
+ "Peer type\n"
|
||||
+ "Allow load sharing across routes learned from different peer types\n")
|
||||
+{
|
||||
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
|
||||
+ SET_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX);
|
||||
+ bgp_recalculate_all_bestpaths(bgp);
|
||||
+
|
||||
+ return CMD_SUCCESS;
|
||||
+}
|
||||
+
|
||||
+DEFUN(no_bgp_bestpath_peer_type_multipath_relax,
|
||||
+ no_bgp_bestpath_peer_type_multipath_relax_cmd,
|
||||
+ "no bgp bestpath peer-type multipath-relax",
|
||||
+ NO_STR BGP_STR
|
||||
+ "Change the default bestpath selection\n"
|
||||
+ "Peer type\n"
|
||||
+ "Allow load sharing across routes learned from different peer types\n")
|
||||
+{
|
||||
+ VTY_DECLVAR_CONTEXT(bgp, bgp);
|
||||
+ UNSET_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX);
|
||||
+ bgp_recalculate_all_bestpaths(bgp);
|
||||
+
|
||||
+ return CMD_SUCCESS;
|
||||
+}
|
||||
+
|
||||
/* "bgp log-neighbor-changes" configuration. */
|
||||
DEFUN (bgp_log_neighbor_changes,
|
||||
bgp_log_neighbor_changes_cmd,
|
||||
@@ -8999,6 +9030,9 @@ static void bgp_show_bestpath_json(struct bgp *bgp, json_object *json)
|
||||
} else
|
||||
json_object_string_add(bestpath, "multiPathRelax", "false");
|
||||
|
||||
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
|
||||
+ json_object_boolean_true_add(bestpath, "peerTypeRelax");
|
||||
+
|
||||
if (CHECK_FLAG(bgp->flags, BGP_FLAG_COMPARE_ROUTER_ID))
|
||||
json_object_string_add(bestpath, "compareRouterId", "true");
|
||||
if (CHECK_FLAG(bgp->flags, BGP_FLAG_MED_CONFED)
|
||||
@@ -15750,6 +15784,10 @@ int bgp_config_write(struct vty *vty)
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
|
||||
+ if (CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
|
||||
+ vty_out(vty,
|
||||
+ " bgp bestpath peer-type multipath-relax\n");
|
||||
+
|
||||
/* Link bandwidth handling. */
|
||||
if (bgp->lb_handling == BGP_LINK_BW_IGNORE_BW)
|
||||
vty_out(vty, " bgp bestpath bandwidth ignore\n");
|
||||
@@ -16214,6 +16252,11 @@ void bgp_vty_init(void)
|
||||
install_element(BGP_NODE, &bgp_bestpath_aspath_multipath_relax_cmd);
|
||||
install_element(BGP_NODE, &no_bgp_bestpath_aspath_multipath_relax_cmd);
|
||||
|
||||
+ /* "bgp bestpath peer-type multipath-relax" commands */
|
||||
+ install_element(BGP_NODE, &bgp_bestpath_peer_type_multipath_relax_cmd);
|
||||
+ install_element(BGP_NODE,
|
||||
+ &no_bgp_bestpath_peer_type_multipath_relax_cmd);
|
||||
+
|
||||
/* "bgp log-neighbor-changes" commands */
|
||||
install_element(BGP_NODE, &bgp_log_neighbor_changes_cmd);
|
||||
install_element(BGP_NODE, &no_bgp_log_neighbor_changes_cmd);
|
||||
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
|
||||
index b20323852..4f7cfeaa2 100644
|
||||
--- a/bgpd/bgp_zebra.c
|
||||
+++ b/bgpd/bgp_zebra.c
|
||||
@@ -1184,6 +1184,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||
int nh_family;
|
||||
unsigned int valid_nh_count = 0;
|
||||
int has_valid_label = 0;
|
||||
+ bool allow_recursion = false;
|
||||
uint8_t distance;
|
||||
struct peer *peer;
|
||||
struct bgp_path_info *mpinfo;
|
||||
@@ -1259,7 +1260,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||
|| CHECK_FLAG(peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)
|
||||
|| CHECK_FLAG(bgp->flags, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
|
||||
|
||||
- SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
|
||||
+ allow_recursion = true;
|
||||
|
||||
if (info->attr->rmap_table_id) {
|
||||
SET_FLAG(api.message, ZAPI_MESSAGE_TABLEID);
|
||||
@@ -1397,6 +1398,15 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||
if (!nh_updated)
|
||||
continue;
|
||||
|
||||
+ /* Allow recursion if it is a multipath group with both
|
||||
+ * eBGP and iBGP paths.
|
||||
+ */
|
||||
+ if (!allow_recursion
|
||||
+ && CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX)
|
||||
+ && (mpinfo->peer->sort == BGP_PEER_IBGP
|
||||
+ || mpinfo->peer->sort == BGP_PEER_CONFED))
|
||||
+ allow_recursion = true;
|
||||
+
|
||||
if (mpinfo->extra
|
||||
&& bgp_is_valid_label(&mpinfo->extra->label[0])
|
||||
&& !CHECK_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE)) {
|
||||
@@ -1415,6 +1425,9 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
|
||||
valid_nh_count++;
|
||||
}
|
||||
|
||||
+ if (allow_recursion)
|
||||
+ SET_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION);
|
||||
+
|
||||
/*
|
||||
* When we create an aggregate route we must also
|
||||
* install a Null0 route in the RIB, so overwrite
|
||||
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
|
||||
index 2aa069002..e268d5b1e 100644
|
||||
--- a/bgpd/bgpd.h
|
||||
+++ b/bgpd/bgpd.h
|
||||
@@ -456,6 +456,7 @@ struct bgp {
|
||||
#define BGP_FLAG_GR_DISABLE_EOR (1 << 24)
|
||||
#define BGP_FLAG_EBGP_REQUIRES_POLICY (1 << 25)
|
||||
#define BGP_FLAG_SHOW_NEXTHOP_HOSTNAME (1 << 26)
|
||||
+#define BGP_FLAG_PEERTYPE_MULTIPATH_RELAX (1 << 31)
|
||||
|
||||
/* This flag is set if the instance is in administrative shutdown */
|
||||
#define BGP_FLAG_SHUTDOWN (1 << 27)
|
||||
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
|
||||
index b58030212..e248ffceb 100644
|
||||
--- a/doc/user/bgp.rst
|
||||
+++ b/doc/user/bgp.rst
|
||||
@@ -386,6 +386,13 @@ Route Selection
|
||||
other measures were taken to avoid these. The exact behaviour will be
|
||||
sensitive to the iBGP and reflection topology.
|
||||
|
||||
+.. clicmd:: bgp bestpath peer-type multipath-relax
|
||||
+
|
||||
+ This command specifies that BGP decision process should consider paths
|
||||
+ from all peers for multipath computation. If this option is enabled,
|
||||
+ paths learned from any of eBGP, iBGP, or confederation neighbors will
|
||||
+ be multipath if they are otherwise considered equal cost.
|
||||
+
|
||||
.. _bgp-distance:
|
||||
|
||||
Administrative Distance Metrics
|
||||
--
|
||||
2.29.2
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 4b45abcdb107c8c5d58fd63a2616c54c800305b3 Mon Sep 17 00:00:00 2001
|
||||
From: Akhilesh Samineni <akhilesh.samineni@broadcom.com>
|
||||
Date: Mon, 5 Apr 2021 13:21:40 -0700
|
||||
Subject: [PATCH] Link local scope was not set while binding socket with local
|
||||
address causing socket errors for bgp ipv6 link local neighbors.
|
||||
|
||||
---
|
||||
bgpd/bgp_network.c | 5 +++++
|
||||
bgpd/bgp_zebra.c | 3 +++
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
|
||||
index 6a5c2c4b3..d7047a154 100644
|
||||
--- a/bgpd/bgp_network.c
|
||||
+++ b/bgpd/bgp_network.c
|
||||
@@ -556,6 +556,11 @@ static int bgp_update_address(struct interface *ifp, const union sockunion *dst,
|
||||
return 1;
|
||||
|
||||
prefix2sockunion(sel, addr);
|
||||
+
|
||||
+ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6.sin6_addr)) {
|
||||
+ addr->sin6.sin6_scope_id = ifp->ifindex;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
|
||||
index e42d6ee26..8e9fa8903 100644
|
||||
--- a/bgpd/bgp_zebra.c
|
||||
+++ b/bgpd/bgp_zebra.c
|
||||
@@ -814,6 +814,9 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
|
||||
? peer->conf_if
|
||||
: peer->ifname,
|
||||
peer->bgp->vrf_id);
|
||||
+ else if (peer->update_if)
|
||||
+ ifp = if_lookup_by_name(peer->update_if,
|
||||
+ peer->bgp->vrf_id);
|
||||
} else if (peer->update_if)
|
||||
ifp = if_lookup_by_name(peer->update_if,
|
||||
peer->bgp->vrf_id);
|
||||
--
|
||||
2.18.0
|
||||
|
@ -1,21 +0,0 @@
|
||||
Remove the *.png file installation from the frr-doc package. It doesn't look
|
||||
like it's installed there with Bullseye's tools.
|
||||
|
||||
From: Saikrishna Arcot <sarcot@microsoft.com>
|
||||
|
||||
---
|
||||
debian/frr-doc.install | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/debian/frr-doc.install b/debian/frr-doc.install
|
||||
index c48dc5a8d..955c8fc5a 100644
|
||||
--- a/debian/frr-doc.install
|
||||
+++ b/debian/frr-doc.install
|
||||
@@ -3,7 +3,6 @@ usr/share/doc/frr/html
|
||||
|
||||
# info + images referenced by it
|
||||
usr/share/info/
|
||||
-doc/user/_build/texinfo/*.png usr/share/info
|
||||
|
||||
# other
|
||||
README.md usr/share/doc/frr
|
@ -1,55 +0,0 @@
|
||||
diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c
|
||||
index 7b0611bf9..b5582ea35 100644
|
||||
--- a/zebra/zebra_fpm.c
|
||||
+++ b/zebra/zebra_fpm.c
|
||||
@@ -288,6 +288,9 @@ static void zfpm_start_connect_timer(const char *reason);
|
||||
static void zfpm_start_stats_timer(void);
|
||||
static void zfpm_mac_info_del(struct fpm_mac_info_t *fpm_mac);
|
||||
|
||||
+static const char ipv4_ll_buf[16] = "169.254.0.1";
|
||||
+union g_addr ipv4ll_gateway;
|
||||
+
|
||||
/*
|
||||
* zfpm_thread_should_yield
|
||||
*/
|
||||
@@ -1988,6 +1991,9 @@ static int zfpm_init(struct thread_master *master)
|
||||
zfpm_stats_init(&zfpm_g->last_ivl_stats);
|
||||
zfpm_stats_init(&zfpm_g->cumulative_stats);
|
||||
|
||||
+ memset(&ipv4ll_gateway, 0, sizeof(ipv4ll_gateway));
|
||||
+ inet_pton(AF_INET, ipv4_ll_buf, &ipv4ll_gateway.ipv4);
|
||||
+
|
||||
install_node(&zebra_node);
|
||||
install_element(ENABLE_NODE, &show_zebra_fpm_stats_cmd);
|
||||
install_element(ENABLE_NODE, &clear_zebra_fpm_stats_cmd);
|
||||
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
|
||||
index 60ea7f97e..0f8ba5413 100644
|
||||
--- a/zebra/zebra_fpm_netlink.c
|
||||
+++ b/zebra/zebra_fpm_netlink.c
|
||||
@@ -221,7 +221,12 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri,
|
||||
|
||||
if (nexthop->type == NEXTHOP_TYPE_IPV6
|
||||
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) {
|
||||
- nhi.gateway = &nexthop->gate;
|
||||
+ /* Special handling for IPv4 route with IPv6 Link Local next hop
|
||||
+ */
|
||||
+ if (ri->af == AF_INET)
|
||||
+ nhi.gateway = &ipv4ll_gateway;
|
||||
+ else
|
||||
+ nhi.gateway = &nexthop->gate;
|
||||
}
|
||||
|
||||
if (nexthop->type == NEXTHOP_TYPE_IFINDEX) {
|
||||
diff --git a/zebra/zebra_fpm_private.h b/zebra/zebra_fpm_private.h
|
||||
index c169ee8c2..13415c7e1 100644
|
||||
--- a/zebra/zebra_fpm_private.h
|
||||
+++ b/zebra/zebra_fpm_private.h
|
||||
@@ -97,6 +97,8 @@ extern int zfpm_netlink_encode_mac(struct fpm_mac_info_t *mac, char *in_buf,
|
||||
|
||||
extern struct route_entry *zfpm_route_for_update(rib_dest_t *dest);
|
||||
|
||||
+extern union g_addr ipv4ll_gateway;
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@ -0,0 +1,27 @@
|
||||
From dfe0158344ea581370dd2dba8e4db189cf369147 Mon Sep 17 00:00:00 2001
|
||||
From: Syed Hasan Raza Naqvi <syed.naqvi@broadcom.com>
|
||||
Date: Wed, 4 May 2022 05:11:01 +0000
|
||||
Subject: [PATCH] Disable ipv6 src address test in pcep. Docker lo interface
|
||||
doesn't have ipv6 enabled. Socket bind returns cannot assign requested
|
||||
address.
|
||||
|
||||
---
|
||||
pceplib/test/pcep_socket_comm_test.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/pceplib/test/pcep_socket_comm_test.c b/pceplib/test/pcep_socket_comm_test.c
|
||||
index 116531f12..8b71a5090 100644
|
||||
--- a/pceplib/test/pcep_socket_comm_test.c
|
||||
+++ b/pceplib/test/pcep_socket_comm_test.c
|
||||
@@ -92,7 +92,7 @@ void pcep_socket_comm_test_setup()
|
||||
inet_pton(AF_INET, "127.0.0.1", &(test_host_ip));
|
||||
inet_pton(AF_INET, "127.0.0.1", &(test_src_ip));
|
||||
inet_pton(AF_INET6, "::1", &(test_host_ipv6));
|
||||
- inet_pton(AF_INET6, "::1", &(test_src_ipv6));
|
||||
+ inet_pton(AF_INET6, "::", &(test_src_ipv6));
|
||||
}
|
||||
|
||||
void pcep_socket_comm_test_teardown()
|
||||
--
|
||||
2.20.1
|
||||
|
@ -3,9 +3,7 @@
|
||||
0003-Use-vrf_id-for-vrf-not-tabled_id.patch
|
||||
0004-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch
|
||||
0005-nexthops-compare-vrf-only-if-ip-type.patch
|
||||
0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch
|
||||
0008-Add-support-of-bgp-l3vni-evpn.patch
|
||||
0009-Add-bgp-bestpath-peer-type-multipath-relax.patch
|
||||
0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch
|
||||
0010-remove-doc-png-install.patch
|
||||
0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch
|
||||
0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch
|
||||
0007-Add-support-of-bgp-l3vni-evpn.patch
|
||||
0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch
|
||||
Disable-ipv6-src-address-test-in-pceplib.patch
|
||||
|
Loading…
Reference in New Issue
Block a user