mirror of
				https://github.com/Telecominfraproject/ols-nos.git
				synced 2025-10-30 17:48:09 +00:00 
			
		
		
		
	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:
		
							
								
								
									
										2
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -46,7 +46,7 @@ | |||||||
| [submodule "src/sonic-frr/frr"] | [submodule "src/sonic-frr/frr"] | ||||||
| 	path = src/sonic-frr/frr | 	path = src/sonic-frr/frr | ||||||
| 	url = https://github.com/Azure/sonic-frr.git | 	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"] | [submodule "platform/p4/p4-hlir/p4-hlir-v1.1"] | ||||||
| 	path = 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 | 	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)_PATH = $(DOCKERS_PATH)/$(DOCKER_FPM_FRR_STEM) | ||||||
| $(DOCKER_FPM_FRR)_PYTHON_WHEELS += $(SONIC_BGPCFGD) $(SONIC_FRR_MGMT_FRAMEWORK) | $(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 = $($(DOCKER_SWSS_LAYER_BUSTER)_DBG_DEPENDS) | ||||||
| $(DOCKER_FPM_FRR)_DBG_DEPENDS += $(SWSS_DBG) $(LIBSWSSCOMMON_DBG) \ | $(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) | $(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 | # FRRouting (frr) package | ||||||
|  |  | ||||||
| FRR_VERSION = 7.5.1 | FRR_VERSION = 8.2.2 | ||||||
| FRR_SUBVERSION = 0 | FRR_SUBVERSION = 0 | ||||||
| FRR_BRANCH = frr/7.5 | FRR_BRANCH = frr/8.2 | ||||||
| FRR_TAG = frr-7.5.1-s1 | FRR_TAG = frr-8.2.2 | ||||||
| export FRR_VERSION FRR_SUBVERSION FRR_BRANCH FRR_TAG | export FRR_VERSION FRR_SUBVERSION FRR_BRANCH FRR_TAG | ||||||
|  |  | ||||||
|  |  | ||||||
| FRR = frr_$(FRR_VERSION)-sonic-$(FRR_SUBVERSION)_$(CONFIGURED_ARCH).deb | FRR = frr_$(FRR_VERSION)-sonic-$(FRR_SUBVERSION)_$(CONFIGURED_ARCH).deb | ||||||
| $(FRR)_DEPENDS += $(LIBSNMP_DEV) $(LIBYANG1) $(LIBYANG1_DEV) | $(FRR)_DEPENDS += $(LIBSNMP_DEV) $(LIBYANG2) $(LIBYANG2_DEV) | ||||||
| $(FRR)_RDEPENDS += $(LIBYANG1) | $(FRR)_RDEPENDS += $(LIBYANG2) | ||||||
| $(FRR)_UNINSTALLS = $(LIBYANG1_DEV) $(LIBYANG1) | $(FRR)_UNINSTALLS = $(LIBYANG2_DEV) $(LIBYANG2) | ||||||
| $(FRR)_SRC_PATH = $(SRC_PATH)/sonic-frr | $(FRR)_SRC_PATH = $(SRC_PATH)/sonic-frr | ||||||
| SONIC_MAKE_DEBS += $(FRR) | SONIC_MAKE_DEBS += $(FRR) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ LIBYANG_PY3 = python3-yang_$(LIBYANG_VERSION)_$(CONFIGURED_ARCH).deb | |||||||
| $(LIBYANG_PY3)_DEPENDS += $(LIBYANG) $(LIBYANG_CPP) | $(LIBYANG_PY3)_DEPENDS += $(LIBYANG) $(LIBYANG_CPP) | ||||||
| $(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_PY3))) | $(eval $(call add_derived_package,$(LIBYANG),$(LIBYANG_PY3))) | ||||||
|  |  | ||||||
| $(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1))) | $(eval $(call add_conflict_package,$(LIBYANG),$(LIBYANG1),$(LIBYANG2))) | ||||||
| $(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV))) | $(eval $(call add_conflict_package,$(LIBYANG_DEV),$(LIBYANG1_DEV),$(LIBYANG2_DEV))) | ||||||
|  |  | ||||||
| export LIBYANG LIBYANG_DBG LIBYANG_DEV LIBYANG_CPP LIBYANG_PY3 | 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 \ |         imagemagick \ | ||||||
|         ghostscript \ |         ghostscript \ | ||||||
|         groff \ |         groff \ | ||||||
|         libpcre3-dev \ |         libpcre2-dev \ | ||||||
|         gawk \ |         gawk \ | ||||||
|         chrpath \ |         chrpath \ | ||||||
| # For frr build | # 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) | 	git checkout -b $(FRR_BRANCH) origin/$(FRR_BRANCH) || git checkout $(FRR_BRANCH) | ||||||
| 	stg branch --create $(STG_BRANCH) $(FRR_TAG) | 	stg branch --create $(STG_BRANCH) $(FRR_TAG) | ||||||
| 	stg import -s ../patch/series | 	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) | 	dpkg-buildpackage -rfakeroot -b -us -uc -Ppkg.frr.nortrlib -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) | ||||||
| 	stg undo || true | 	stg undo || true | ||||||
| 	git clean -xfdf | 	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> | From: Pavel Shirshov <pavelsh@microsoft.com> | ||||||
| Date: Mon, 16 Nov 2020 18:00:12 -0800 | 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_network.c | 11 ++++------- | ||||||
|  bgpd/bgp_vty.c     | 44 ++++++++++++++++++++++++++++++++++++++++++++ |  bgpd/bgp_vty.c     | 44 ++++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  bgpd/bgpd.c        |  2 +- |  bgpd/bgpd.c        |  1 + | ||||||
|  bgpd/bgpd.h        |  3 +++ |  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 | 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 | --- a/bgpd/bgp_network.c | ||||||
| +++ b/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 |  #ifdef IPTOS_PREC_INTERNETCONTROL | ||||||
|  	frr_with_privs(&bgpd_privs) { |  	frr_with_privs(&bgpd_privs) { | ||||||
|  		if (sockunion_family(&peer->su) == AF_INET) |  		if (sockunion_family(&peer->su) == AF_INET) | ||||||
| @@ -28,7 +28,7 @@ index cae11ae7b..f1d96664d 100644 | |||||||
|  	} |  	} | ||||||
|  #endif |  #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 |  #ifdef IPTOS_PREC_INTERNETCONTROL | ||||||
|  		if (sa->sa_family == AF_INET) |  		if (sa->sa_family == AF_INET) | ||||||
| @@ -42,10 +42,10 @@ index cae11ae7b..f1d96664d 100644 | |||||||
|   |   | ||||||
|  		sockopt_v6only(sa->sa_family, sock); |  		sockopt_v6only(sa->sa_family, sock); | ||||||
| diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c | 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 | --- a/bgpd/bgp_vty.c | ||||||
| +++ b/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; |  	return CMD_SUCCESS; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -88,7 +88,7 @@ index bb2f89f9e..33662b08e 100644 | |||||||
|   |   | ||||||
|  /* BGP router-id.  */ |  /* 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)) |  		if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) | ||||||
|  			vty_out(vty, " no bgp fast-external-failover\n"); |  			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); | +			vty_out(vty, " bgp session-dscp %02X\n", bgp->tcp_dscp >> 2); | ||||||
| + | + | ||||||
|  		/* BGP router ID. */ |  		/* BGP router ID. */ | ||||||
|  		if (bgp->router_id_static.s_addr != 0) |  		if (bgp->router_id_static.s_addr != INADDR_ANY) | ||||||
|  			vty_out(vty, " bgp router-id %s\n", |  			vty_out(vty, " bgp router-id %pI4\n", | ||||||
| @@ -16057,6 +16097,10 @@ void bgp_vty_init(void) | @@ -17662,6 +17702,10 @@ void bgp_vty_init(void) | ||||||
|  	/* "no router bgp" commands. */ |  	/* "no router bgp" commands. */ | ||||||
|  	install_element(CONFIG_NODE, &no_router_bgp_cmd); |  	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, &bgp_router_id_cmd); | ||||||
|  	install_element(BGP_NODE, &no_bgp_router_id_cmd); |  	install_element(BGP_NODE, &no_bgp_router_id_cmd); | ||||||
| diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c | diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c | ||||||
| index cf9ff038d..0e8579843 100644 | index 7e528b219..005523544 100644 | ||||||
| --- a/bgpd/bgpd.c | --- a/bgpd/bgpd.c | ||||||
| +++ b/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, |  	bgp->evpn_info = XCALLOC(MTYPE_BGP_EVPN_INFO, | ||||||
|  				 sizeof(struct bgp_evpn_info)); |  				 sizeof(struct bgp_evpn_info)); | ||||||
| - |   | ||||||
| +	bgp->tcp_dscp = IPTOS_PREC_INTERNETCONTROL; | +	bgp->tcp_dscp = IPTOS_PREC_INTERNETCONTROL; | ||||||
|  	bgp_evpn_init(bgp); |  	bgp_evpn_init(bgp); | ||||||
|  |  	bgp_evpn_vrf_es_init(bgp); | ||||||
|  	bgp_pbr_init(bgp); |  	bgp_pbr_init(bgp); | ||||||
|   |  | ||||||
| diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h | diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h | ||||||
| index 2aa069002..914f296e5 100644 | index 8b93c450e..e780d8a03 100644 | ||||||
| --- a/bgpd/bgpd.h | --- a/bgpd/bgpd.h | ||||||
| +++ b/bgpd/bgpd.h | +++ b/bgpd/bgpd.h | ||||||
| @@ -678,6 +678,9 @@ struct bgp { | @@ -743,6 +743,9 @@ struct bgp { | ||||||
|  	/* Weighted ECMP related config. */ |  	/* Weighted ECMP related config. */ | ||||||
|  	enum bgp_link_bw_handling lb_handling; |  	enum bgp_link_bw_handling lb_handling; | ||||||
|   |   | ||||||
| +	/* dscp value for tcp sessions */ | +	/* dscp value for tcp sessions */ | ||||||
| +	uint8_t tcp_dscp; | +	uint8_t tcp_dscp; | ||||||
| + | + | ||||||
|  	QOBJ_FIELDS |  	/* Process Queue for handling routes */ | ||||||
|  }; |  	struct work_queue *process_queue; | ||||||
|  DECLARE_QOBJ_TYPE(bgp) |   | ||||||
| --  | --  | ||||||
| 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> | From: Pavel Shirshov <pavelsh@microsoft.com> | ||||||
| Date: Mon, 16 Nov 2020 18:11:47 -0800 | 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 +- |  lib/vty.c | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  |  | ||||||
| diff --git a/lib/vty.c b/lib/vty.c | diff --git a/lib/vty.c b/lib/vty.c | ||||||
| index 077c6f621..3204948b8 100644 | index 8eaf13619..7edeb5538 100644 | ||||||
| --- a/lib/vty.c | --- a/lib/vty.c | ||||||
| +++ b/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", |  		zlog_info("can't set sockopt to vty_sock : %s", | ||||||
|  			  safe_strerror(errno)); |  			  safe_strerror(errno)); | ||||||
|   |   | ||||||
| -	zlog_info("Vty connection from %s", | -	zlog_info("Vty connection from %pSU", &su); | ||||||
| +	zlog_debug("Vty connection from %s", | +	zlog_debug("Vty connection from %pSU", &su); | ||||||
|  		  sockunion2str(&su, buf, SU_ADDRSTRLEN)); |  | ||||||
|   |   | ||||||
|  	vty_create(vty_sock, &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> | From: Pavel Shirshov <pavelsh@microsoft.com> | ||||||
| Date: Mon, 16 Nov 2020 18:29:46 -0800 | 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 +- |  zebra/zebra_fpm_netlink.c | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  |  | ||||||
| diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c | 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 | --- a/zebra/zebra_fpm_netlink.c | ||||||
| +++ b/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, | @@ -287,7 +287,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd, | ||||||
|  	ri->af = rib_dest_af(dest); |  		ri->nlmsg_pid = zvrf->zns->netlink_dplane_out.snl.nl_pid; | ||||||
|   |   | ||||||
|  	ri->nlmsg_type = cmd; |  	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_table = zvrf_id(rib_dest_vrf(dest)); | ||||||
|  	ri->rtm_protocol = RTPROT_UNSPEC; |  	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> | From: Pavel Shirshov <pavelsh@microsoft.com> | ||||||
| Date: Mon, 16 Nov 2020 18:33:46 -0800 | 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 | Subject: [PATCH 4/8] Allow BGP attr NEXT_HOP to be 0.0.0.0 due to | ||||||
| the vendor bug |  alleviate | ||||||
|  |  | ||||||
| --- | --- | ||||||
|  bgpd/bgp_route.c | 3 +-- |  bgpd/bgp_route.c | 3 +-- | ||||||
|  1 file changed, 1 insertion(+), 2 deletions(-) |  1 file changed, 1 insertion(+), 2 deletions(-) | ||||||
|  |  | ||||||
| diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c | 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 | --- a/bgpd/bgp_route.c | ||||||
| +++ b/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 NEXT_HOP is present, validate it. */ | ||||||
|  	if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)) { |  	if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)) { | ||||||
| @@ -22,5 +23,5 @@ index 1c646c03e..df2aa1b4c 100644 | |||||||
|  			return true; |  			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> | From: Pavel Shirshov <pavelsh@microsoft.com> | ||||||
| Date: Mon, 16 Nov 2020 18:35:01 -0800 | 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 ++++++------ |  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(-) |  2 files changed, 12 insertions(+), 12 deletions(-) | ||||||
|  |  | ||||||
| diff --git a/lib/nexthop.c b/lib/nexthop.c | diff --git a/lib/nexthop.c b/lib/nexthop.c | ||||||
| index 0ea72d03e..50552df60 100644 | index e17eeb830..a1ce22e3b 100644 | ||||||
| --- a/lib/nexthop.c | --- a/lib/nexthop.c | ||||||
| +++ b/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; |  	int ret = 0; | ||||||
|   |   | ||||||
| @@ -25,7 +25,7 @@ index 0ea72d03e..50552df60 100644 | |||||||
|  	if (next1->type < next2->type) |  	if (next1->type < next2->type) | ||||||
|  		return -1; |  		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) { |  	switch (next1->type) { | ||||||
|  	case NEXTHOP_TYPE_IPV4: |  	case NEXTHOP_TYPE_IPV4: | ||||||
|  	case NEXTHOP_TYPE_IPV6: |  	case NEXTHOP_TYPE_IPV6: | ||||||
| @@ -39,10 +39,10 @@ index 0ea72d03e..50552df60 100644 | |||||||
|  		if (ret != 0) |  		if (ret != 0) | ||||||
|  			return ret; |  			return ret; | ||||||
| diff --git a/lib/zclient.c b/lib/zclient.c | diff --git a/lib/zclient.c b/lib/zclient.c | ||||||
| index fb48d4a12..39132465f 100644 | index 445837017..c104623b7 100644 | ||||||
| --- a/lib/zclient.c | --- a/lib/zclient.c | ||||||
| +++ b/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; |  	int ret = 0; | ||||||
|   |   | ||||||
| @@ -55,7 +55,7 @@ index fb48d4a12..39132465f 100644 | |||||||
|  	if (next1->type < next2->type) |  	if (next1->type < next2->type) | ||||||
|  		return -1; |  		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) { |  	switch (next1->type) { | ||||||
|  	case NEXTHOP_TYPE_IPV4: |  	case NEXTHOP_TYPE_IPV4: | ||||||
|  	case NEXTHOP_TYPE_IPV6: |  	case NEXTHOP_TYPE_IPV6: | ||||||
| @@ -69,5 +69,5 @@ index fb48d4a12..39132465f 100644 | |||||||
|  					 &next2->gate); |  					 &next2->gate); | ||||||
|  		if (ret != 0) |  		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> | From: Ying Xie <ying.xie@microsoft.com> | ||||||
| Date: Wed, 25 Nov 2020 22:28:43 +0000 | 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 | 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 | via rsyslog and recorded already. There is no need to keep the | ||||||
| frr.log inside the docker. It will grow and take all harddrive | frr.log inside the docker. It will grow and take all harddrive | ||||||
| space eventually. | space eventually. | ||||||
| 
 | 
 | ||||||
| Signed-off-by: Ying Xie <ying.xie@microsoft.com> |  | ||||||
| ---
 | ---
 | ||||||
|  tools/etc/rsyslog.d/45-frr.conf | 19 ------------------- |  tools/etc/rsyslog.d/45-frr.conf | 19 ------------------- | ||||||
|  1 file changed, 19 deletions(-) |  1 file changed, 19 deletions(-) | ||||||
| @@ -44,5 +42,5 @@ index feeeb13f1..fcd23d23a 100644 | |||||||
|      $programname == 'bgpd' or |      $programname == 'bgpd' or | ||||||
|      $programname == 'eigrpd' 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> | From: Kishore Kunal <kishore.kunal@broadcom.com> | ||||||
| Date: Fri, 15 Jan 2021 15:52:13 -0800 | 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.c             |  2 ++ | ||||||
|  lib/nexthop.h             |  7 ++++++- |  lib/nexthop.h             |  6 ++++++ | ||||||
|  zebra/rt_netlink.c        |  2 +- |  zebra/rt_netlink.c        |  2 +- | ||||||
|  zebra/zapi_msg.c          |  2 ++ |  zebra/zapi_msg.c          |  4 ++++ | ||||||
|  zebra/zebra_dplane.c      |  2 +- |  zebra/zebra_dplane.c      |  1 + | ||||||
|  zebra/zebra_fpm_netlink.c | 19 +++++++++++++++++++ |  zebra/zebra_fpm_netlink.c | 20 ++++++++++++++++++++ | ||||||
|  6 files changed, 30 insertions(+), 3 deletions(-) |  6 files changed, 34 insertions(+), 1 deletion(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/lib/nexthop.c b/lib/nexthop.c
 | diff --git a/lib/nexthop.c b/lib/nexthop.c
 | ||||||
| index 0ea72d03e..02e826048 100644
 | index a1ce22e3b..6f3fe2a5f 100644
 | ||||||
| --- a/lib/nexthop.c
 | --- a/lib/nexthop.c
 | ||||||
| +++ b/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_add_labels(copy, nexthop->nh_label_type, | ||||||
|  				   nexthop->nh_label->num_labels, |  				   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
 | diff --git a/lib/nexthop.h b/lib/nexthop.h
 | ||||||
| index cadcea1f4..fd959eb9e 100644
 | index 320b46315..0f98dc3c2 100644
 | ||||||
| --- a/lib/nexthop.h
 | --- a/lib/nexthop.h
 | ||||||
| +++ b/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 */ |  /* Backup index value is limited */ | ||||||
|  #define NEXTHOP_BACKUP_IDX_MAX 255 |  #define NEXTHOP_BACKUP_IDX_MAX 255 | ||||||
|   |   | ||||||
| @@ -40,20 +42,19 @@ index cadcea1f4..fd959eb9e 100644 | |||||||
|  /* Nexthop structure. */ |  /* Nexthop structure. */ | ||||||
|  struct nexthop { |  struct nexthop { | ||||||
|  	struct nexthop *next; |  	struct nexthop *next; | ||||||
| @@ -140,7 +145,7 @@ struct nexthop {
 | @@ -136,6 +141,7 @@ struct nexthop {
 | ||||||
|  	/* Encapsulation information. */ |  | ||||||
|  	enum nh_encap_type nh_encap_type; |  	enum nh_encap_type nh_encap_type; | ||||||
|  	union { |  	union { | ||||||
| -		vni_t vni;
 |  		vni_t vni; | ||||||
| +		struct vxlan_nh_encap encap_data;
 | +		struct vxlan_nh_encap encap_data;
 | ||||||
|  	} nh_encap; |  	} nh_encap; | ||||||
|   |   | ||||||
|  	/* SR-TE color used for matching SR-TE policies */ |  	/* SR-TE color used for matching SR-TE policies */ | ||||||
| diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
 | 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
 | --- a/zebra/rt_netlink.c
 | ||||||
| +++ b/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; |  			return false; | ||||||
|   |   | ||||||
|  		if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */, |  		if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */, | ||||||
| @@ -63,43 +64,44 @@ index 50b1a62d8..d8249f8e0 100644 | |||||||
|  		nl_attr_nest_end(n, nest); |  		nl_attr_nest_end(n, nest); | ||||||
|  		break; |  		break; | ||||||
| diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
 | 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
 | --- a/zebra/zapi_msg.c
 | ||||||
| +++ b/zebra/zapi_msg.c
 | +++ b/zebra/zapi_msg.c
 | ||||||
| @@ -1477,6 +1477,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
 | @@ -1577,6 +1577,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
 | ||||||
|  			zebra_vxlan_evpn_vrf_route_add( |  			vtep_ip.ipa_type = IPADDR_V4; | ||||||
|  				api_nh->vrf_id, &api_nh->rmac, |  			memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4), | ||||||
|  				&vtep_ip, &api->prefix); |  			       sizeof(struct in_addr)); | ||||||
| +			memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN);
 | +			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; | @@ -1610,6 +1612,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
 | ||||||
|  	case NEXTHOP_TYPE_IPV6: |  			vtep_ip.ipa_type = IPADDR_V6; | ||||||
| @@ -1511,6 +1512,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
 |  			memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6), | ||||||
|  			zebra_vxlan_evpn_vrf_route_add( |  			       sizeof(struct in6_addr)); | ||||||
|  				api_nh->vrf_id, &api_nh->rmac, | +			memcpy(&(nexthop->nh_encap.encap_data.rmac),
 | ||||||
|  				&vtep_ip, &api->prefix); | +				   &api_nh->rmac, ETH_ALEN);
 | ||||||
| +			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
 | 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
 | --- a/zebra/zebra_dplane.c
 | ||||||
| +++ b/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,
 | @@ -2421,6 +2421,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
 | ||||||
|  		zl3vni = zl3vni_from_vrf(nexthop->vrf_id); |  | ||||||
|  		if (zl3vni && is_l3vni_oper_up(zl3vni)) { |  		if (zl3vni && is_l3vni_oper_up(zl3vni)) { | ||||||
|  			nexthop->nh_encap_type = NET_VXLAN; |  			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;
 | +			nexthop->nh_encap.encap_data.vni = zl3vni->vni;
 | ||||||
|  		} |  		} | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
| diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
 | 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
 | --- a/zebra/zebra_fpm_netlink.c
 | ||||||
| +++ b/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 { |  struct vxlan_encap_info_t { | ||||||
|  	vni_t vni; |  	vni_t vni; | ||||||
| @@ -112,16 +114,17 @@ index 2c0741363..2731f64fb 100644 | |||||||
|  }; |  }; | ||||||
|   |   | ||||||
|  struct fpm_nh_encap_info_t { |  struct fpm_nh_encap_info_t { | ||||||
| @@ -238,6 +240,8 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri,
 | @@ -234,6 +236,9 @@ 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);
 |  | ||||||
|  		} |  		} | ||||||
|  |   | ||||||
|  |  		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, |  			nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE, | ||||||
|  				      encap); |  				      encap); | ||||||
|  			vxlan = &nhi->encap_info.vxlan_encap; |  			vxlan = &nhi->encap_info.vxlan_encap; | ||||||
| @@ -138,7 +141,7 @@ index 2c0741363..2731f64fb 100644 | |||||||
|  			nl_attr_nest_end(&req->n, nest); |  			nl_attr_nest_end(&req->n, nest); | ||||||
|  			break; |  			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, |  			nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE, | ||||||
|  				      encap); |  				      encap); | ||||||
|  			vxlan = &nhi->encap_info.vxlan_encap; |  			vxlan = &nhi->encap_info.vxlan_encap; | ||||||
| @@ -158,5 +161,5 @@ index 2c0741363..2731f64fb 100644 | |||||||
|  			break; |  			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 | 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 | 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 | 0005-nexthops-compare-vrf-only-if-ip-type.patch | ||||||
| 0007-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch | 0006-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch | ||||||
| 0008-Add-support-of-bgp-l3vni-evpn.patch | 0007-Add-support-of-bgp-l3vni-evpn.patch | ||||||
| 0009-Add-bgp-bestpath-peer-type-multipath-relax.patch | 0008-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch | ||||||
| 0009-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch | Disable-ipv6-src-address-test-in-pceplib.patch | ||||||
| 0010-remove-doc-png-install.patch |  | ||||||
| 0011-Ipv4-Link-local-address-for-Ipv6-linl-local-nexthop.patch |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Hasan Naqvi
					Hasan Naqvi