mirror of
				https://github.com/Telecominfraproject/ols-nos.git
				synced 2025-10-31 01:57:48 +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"] | ||||
| 	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) | ||||
| --  | ||||
| 2.29.2.windows.2 | ||||
|  	/* Process Queue for handling routes */ | ||||
|  	struct work_queue *process_queue; | ||||
|   | ||||
| --  | ||||
| 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,
 | ||||
| @@ -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),
 | ||||
|  		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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Hasan Naqvi
					Hasan Naqvi