From 80ef9db524d6c18e0489fe397c1454648beeb357 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 11 Feb 2019 19:38:04 +0000 Subject: [PATCH 1/2] Build radvd from source and patch to ignore out-of-range MTU size --- .gitignore | 3 ++ .../docker-router-advertiser/Dockerfile.j2 | 3 -- rules/docker-router-advertiser.mk | 1 + rules/radvd.mk | 9 ++++++ src/radvd/Makefile | 30 +++++++++++++++++++ ...t-treat-out-of-range-MTU-as-an-error.patch | 28 +++++++++++++++++ src/radvd/patch/series | 2 ++ 7 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 rules/radvd.mk create mode 100644 src/radvd/Makefile create mode 100644 src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch create mode 100644 src/radvd/patch/series diff --git a/.gitignore b/.gitignore index 74998573e491..922790873dbb 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,9 @@ src/mpdecimal/* !src/mpdecimal/Makefile src/python3/* !src/python3/Makefile +src/radvd/* +!src/radvd/Makefile +!src/radvd/patch/ src/redis/* !src/redis/Makefile src/snmpd/* diff --git a/dockers/docker-router-advertiser/Dockerfile.j2 b/dockers/docker-router-advertiser/Dockerfile.j2 index 5007daf122cf..f9cf5f90b85e 100644 --- a/dockers/docker-router-advertiser/Dockerfile.j2 +++ b/dockers/docker-router-advertiser/Dockerfile.j2 @@ -6,9 +6,6 @@ ENV DEBIAN_FRONTEND=noninteractive # Update apt's cache of available packages RUN apt-get update -# Install radvd Debian package -RUN apt-get -y install radvd - {% if docker_router_advertiser_debs.strip() -%} # Copy built Debian packages {%- for deb in docker_router_advertiser_debs.split(' ') %} diff --git a/rules/docker-router-advertiser.mk b/rules/docker-router-advertiser.mk index 129246d8fa2d..33e805cf4c2d 100644 --- a/rules/docker-router-advertiser.mk +++ b/rules/docker-router-advertiser.mk @@ -2,6 +2,7 @@ DOCKER_ROUTER_ADVERTISER = docker-router-advertiser.gz $(DOCKER_ROUTER_ADVERTISER)_PATH = $(DOCKERS_PATH)/docker-router-advertiser +$(DOCKER_ROUTER_ADVERTISER)_DEPENDS += $(RADVD) $(DOCKER_ROUTER_ADVERTISER)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_ROUTER_ADVERTISER) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ROUTER_ADVERTISER) diff --git a/rules/radvd.mk b/rules/radvd.mk new file mode 100644 index 000000000000..682f1d5e7595 --- /dev/null +++ b/rules/radvd.mk @@ -0,0 +1,9 @@ +# radvd package + +RADVD_VERSION = 1.9.1-1.3 + +export RADVD_VERSION + +RADVD = radvd_$(RADVD_VERSION)_amd64.deb +$(RADVD)_SRC_PATH = $(SRC_PATH)/radvd +SONIC_MAKE_DEBS += $(RADVD) diff --git a/src/radvd/Makefile b/src/radvd/Makefile new file mode 100644 index 000000000000..9064a43c25c1 --- /dev/null +++ b/src/radvd/Makefile @@ -0,0 +1,30 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = radvd_$(RADVD_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Remove any stale files + rm -rf ./radvd + + # Clone radvd repo + git clone https://salsa.debian.org/debian/radvd.git + pushd ./radvd + + # Reset HEAD to the commit of the proper tag + # NOTE: Using "git checkout " here detaches our HEAD, + # which stg doesn't like, so we use this method instead + # NOTE: For some reason, tags in the Debian radvd repo are prefixed with "1%" + git reset --hard debian/1\%$(RADVD_VERSION) + + # Apply patches + stg init + stg import -s ../patch/series + + # Build source and Debian packages + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) + popd + + # Move the newly-built .deb packages to the destination directory + mv $* $(DERIVED_TARGETS) $(DEST)/ diff --git a/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch b/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch new file mode 100644 index 000000000000..f80daf12bd83 --- /dev/null +++ b/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch @@ -0,0 +1,28 @@ +From ccdf6cdf14f03b219c877db4af6a856b1cbf0637 Mon Sep 17 00:00:00 2001 +From: Joe LeVeque +Date: Mon, 11 Feb 2019 19:25:21 +0000 +Subject: [PATCH] Don't treat out-of-range MTU as an error + +--- + interface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/interface.c b/interface.c +index d17267e..87fe937 100644 +--- a/interface.c ++++ b/interface.c +@@ -158,9 +158,9 @@ check_iface(struct Interface *iface) + ((iface->AdvLinkMTU < MIN_AdvLinkMTU) || + (iface->if_maxmtu != -1 && (iface->AdvLinkMTU > iface->if_maxmtu)))) + { +- flog(LOG_ERR, "AdvLinkMTU for %s (%u) must be zero or between %u and %u", ++ flog(LOG_WARNING, "AdvLinkMTU for %s (%u) must be zero or between %u and %u", + iface->Name, iface->AdvLinkMTU, MIN_AdvLinkMTU, iface->if_maxmtu); +- res = -1; ++ //res = -1; + } + + if (iface->AdvReachableTime > MAX_AdvReachableTime) +-- +2.17.1 + diff --git a/src/radvd/patch/series b/src/radvd/patch/series new file mode 100644 index 000000000000..2892590bfcdb --- /dev/null +++ b/src/radvd/patch/series @@ -0,0 +1,2 @@ +# This series applies on GIT commit 3ab9ce1f298cec3600fdad0a4000c1b1351562fd +0001-Don-t-treat-out-of-range-MTU-as-an-error.patch From 4b653559c1cd7ae4269c3fbc66de0c218eeadde6 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 12 Feb 2019 19:18:45 +0000 Subject: [PATCH 2/2] Add comments to radvd patch, remove line instead of commenting it out --- ...t-treat-out-of-range-MTU-as-an-error.patch | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch b/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch index f80daf12bd83..bb77d57814b2 100644 --- a/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch +++ b/src/radvd/patch/0001-Don-t-treat-out-of-range-MTU-as-an-error.patch @@ -1,25 +1,30 @@ -From ccdf6cdf14f03b219c877db4af6a856b1cbf0637 Mon Sep 17 00:00:00 2001 +From e5af09b187bcce4e48ea3f1f71b81329e2d91ea4 Mon Sep 17 00:00:00 2001 From: Joe LeVeque -Date: Mon, 11 Feb 2019 19:25:21 +0000 +Date: Tue, 12 Feb 2019 19:13:45 +0000 Subject: [PATCH] Don't treat out-of-range MTU as an error --- - interface.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) + interface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/interface.c b/interface.c -index d17267e..87fe937 100644 +index d17267e..b59c6e8 100644 --- a/interface.c +++ b/interface.c -@@ -158,9 +158,9 @@ check_iface(struct Interface *iface) +@@ -158,9 +158,14 @@ check_iface(struct Interface *iface) ((iface->AdvLinkMTU < MIN_AdvLinkMTU) || (iface->if_maxmtu != -1 && (iface->AdvLinkMTU > iface->if_maxmtu)))) { - flog(LOG_ERR, "AdvLinkMTU for %s (%u) must be zero or between %u and %u", ++ // FIXME: Temporary workaround for SONiC. Currently, when interfaces are added ++ // or removed from VLANs, the kernel sets the MTU size for the VLAN to the ++ // default value of 1500. Here, we prevent radvd from treating a larger value ++ // in its configuration as an error. Instead of logging an error and setting ++ // res to -1, we simply log a warning and continue on. Once the aforementioned ++ // behavior is addressed, this patch should be removed. + flog(LOG_WARNING, "AdvLinkMTU for %s (%u) must be zero or between %u and %u", iface->Name, iface->AdvLinkMTU, MIN_AdvLinkMTU, iface->if_maxmtu); - res = -1; -+ //res = -1; } if (iface->AdvReachableTime > MAX_AdvReachableTime)