iproute2: update to 5.11.0

The latest iproute2 version brings various improvements and fixes:
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/log/?qt=range&q=v5.10.0..v5.11.0

In particular, ip and tc now use libbpf as the standard way to load BPF
programs, rather than the old, limited custom loader. This allows more
consistent and featureful BPF program handling e.g. support for global
initialized variables.

Also fix a longstanding problem with iproute2 builds where unneeded DSO
dependencies are added to most utilities, bloating their installation
footprint. From research and testing, explicitly using a "--as-needed"
linker flag avoids the issue. Update accordingly and drop extra package
dependencies from Makefile.

Additional build and packaging updates include:

  - install missing development header to iproute2/bpf_elf.h
  - propagate OpenWrt verbose flag during build
  - update and refresh patches

Compile and run tested: QEMU/malta-mips32be on kernels 5.4 & 5.10.

All iproute2 packages were built and installed to the test image. Some
regression testing using ip-full and tc was successfully performed to
exercise several kmods, tc modules, and simple BPF programs.

Signed-off-by: Tony Ambardar <itugrok@yahoo.com>
This commit is contained in:
Tony Ambardar 2021-02-20 08:56:20 -08:00 committed by Hauke Mehrtens
parent df1e5d6463
commit b048a305a3
11 changed files with 35 additions and 29 deletions

View File

@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=iproute2 PKG_NAME:=iproute2
PKG_VERSION:=5.10.0 PKG_VERSION:=5.11.0
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2 PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
PKG_HASH:=a54a34ae309c0406b2d1fb3a46158613ffb83d33fefd5d4a27f0010237ac53e9 PKG_HASH:=c5e2ea108212b3445051b35953ec267f9f3469e1d5c67ac034ab559849505c54
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
PKG_BUILD_DEPENDS:=iptables PKG_BUILD_DEPENDS:=iptables
PKG_LICENSE:=GPL-2.0 PKG_LICENSE:=GPL-2.0
@ -47,7 +47,7 @@ $(call Package/iproute2/Default)
VARIANT:=full VARIANT:=full
PROVIDES:=ip PROVIDES:=ip
ALTERNATIVES:=300:/sbin/ip:/usr/libexec/ip-full ALTERNATIVES:=300:/sbin/ip:/usr/libexec/ip-full
DEPENDS:=+libnl-tiny +libelf +(PACKAGE_devlink||PACKAGE_rdma):libmnl DEPENDS:=+libnl-tiny +libbpf +(PACKAGE_devlink||PACKAGE_rdma):libmnl
endef endef
define Package/tc define Package/tc
@ -55,56 +55,59 @@ $(call Package/iproute2/Default)
TITLE:=Traffic control utility TITLE:=Traffic control utility
VARIANT:=tc VARIANT:=tc
PROVIDES:=tc PROVIDES:=tc
DEPENDS:=+kmod-sched-core +libxtables +libelf +(PACKAGE_devlink||PACKAGE_rdma):libmnl DEPENDS:=+kmod-sched-core +libxtables +libbpf +(PACKAGE_devlink||PACKAGE_rdma):libmnl
endef endef
define Package/genl define Package/genl
$(call Package/iproute2/Default) $(call Package/iproute2/Default)
TITLE:=General netlink utility frontend TITLE:=General netlink utility frontend
DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl +(PACKAGE_tc||PACKAGE_ip-full):libelf DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl
endef endef
define Package/ip-bridge define Package/ip-bridge
$(call Package/iproute2/Default) $(call Package/iproute2/Default)
TITLE:=Bridge configuration utility from iproute2 TITLE:=Bridge configuration utility from iproute2
DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl +(PACKAGE_tc||PACKAGE_ip-full):libelf DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl
endef endef
define Package/ss define Package/ss
$(call Package/iproute2/Default) $(call Package/iproute2/Default)
TITLE:=Socket statistics utility TITLE:=Socket statistics utility
DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl +(PACKAGE_tc||PACKAGE_ip-full):libelf +kmod-netlink-diag DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl +kmod-netlink-diag
endef endef
define Package/nstat define Package/nstat
$(call Package/iproute2/Default) $(call Package/iproute2/Default)
TITLE:=Network statistics utility TITLE:=Network statistics utility
DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl +(PACKAGE_tc||PACKAGE_ip-full):libelf DEPENDS:=+libnl-tiny +(PACKAGE_devlink||PACKAGE_rdma):libmnl
endef endef
define Package/devlink define Package/devlink
$(call Package/iproute2/Default) $(call Package/iproute2/Default)
TITLE:=Network devlink utility TITLE:=Network devlink utility
DEPENDS:=+libmnl +(PACKAGE_tc||PACKAGE_ip-full):libelf DEPENDS:=+libmnl
endef endef
define Package/rdma define Package/rdma
$(call Package/iproute2/Default) $(call Package/iproute2/Default)
TITLE:=Network rdma utility TITLE:=Network rdma utility
DEPENDS:=+libmnl +(PACKAGE_tc||PACKAGE_ip-full):libelf DEPENDS:=+libmnl
endef endef
ifeq ($(BUILD_VARIANT),tiny) ifeq ($(BUILD_VARIANT),tiny)
IP_CONFIG_TINY:=y IP_CONFIG_TINY:=y
LIBBPF_FORCE:=off
endif endif
ifeq ($(BUILD_VARIANT),full) ifeq ($(BUILD_VARIANT),full)
HAVE_ELF:=y HAVE_ELF:=y
LIBBPF_FORCE:=on
HAVE_CAP:=n HAVE_CAP:=n
endif endif
ifeq ($(BUILD_VARIANT),tc) ifeq ($(BUILD_VARIANT),tc)
HAVE_ELF:=y HAVE_ELF:=y
LIBBPF_FORCE:=on
SHARED_LIBS:=y SHARED_LIBS:=y
endif endif
@ -122,26 +125,29 @@ define Build/Configure
endef endef
TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto
TARGET_LDFLAGS += -Wl,--gc-sections TARGET_LDFLAGS += -Wl,--gc-sections -Wl,--as-needed
TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny
MAKE_FLAGS += \ MAKE_FLAGS += \
KERNEL_INCLUDE="$(LINUX_DIR)/user_headers/include" \ KERNEL_INCLUDE="$(LINUX_DIR)/user_headers/include" \
SHARED_LIBS=$(SHARED_LIBS) \ SHARED_LIBS=$(SHARED_LIBS) \
IP_CONFIG_TINY=$(IP_CONFIG_TINY) \ IP_CONFIG_TINY=$(IP_CONFIG_TINY) \
LIBBPF_FORCE=$(LIBBPF_FORCE) \
HAVE_ELF=$(HAVE_ELF) \ HAVE_ELF=$(HAVE_ELF) \
HAVE_MNL=$(HAVE_MNL) \ HAVE_MNL=$(HAVE_MNL) \
HAVE_CAP=$(HAVE_CAP) \ HAVE_CAP=$(HAVE_CAP) \
IPT_LIB_DIR=/usr/lib/iptables \ IPT_LIB_DIR=/usr/lib/iptables \
XT_LIB_DIR=/usr/lib/iptables \ XT_LIB_DIR=/usr/lib/iptables \
FPIC="$(FPIC)" FPIC="$(FPIC)" \
$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='')
define Build/Compile define Build/Compile
+$(MAKE_VARS) $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) +$(MAKE_VARS) $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS)
endef endef
define Build/InstallDev define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/include $(INSTALL_DIR) $(1)/usr/include/iproute2
$(CP) $(PKG_BUILD_DIR)/include/bpf_elf.h $(1)/usr/include/iproute2
$(CP) $(PKG_BUILD_DIR)/include/{libgenl,libnetlink}.h $(1)/usr/include/ $(CP) $(PKG_BUILD_DIR)/include/{libgenl,libnetlink}.h $(1)/usr/include/
$(INSTALL_DIR) $(1)/usr/lib $(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_BUILD_DIR)/lib/libnetlink.a $(1)/usr/lib/ $(CP) $(PKG_BUILD_DIR)/lib/libnetlink.a $(1)/usr/lib/

View File

@ -1,6 +1,6 @@
--- a/configure --- a/configure
+++ b/configure +++ b/configure
@@ -34,7 +34,8 @@ int main(int argc, char **argv) { @@ -39,7 +39,8 @@ int main(int argc, char **argv) {
} }
EOF EOF

View File

@ -4,8 +4,8 @@
CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS) CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS)
YACCFLAGS = -d -t -v YACCFLAGS = -d -t -v
-SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma man -SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma dcb man
+SUBDIRS=lib ip tc bridge misc genl tipc devlink rdma man +SUBDIRS=lib ip tc bridge misc genl tipc devlink rdma dcb man
LIBNETLINK=../lib/libutil.a ../lib/libnetlink.a LIBNETLINK=../lib/libutil.a ../lib/libnetlink.a
LDLIBS += $(LIBNETLINK) LDLIBS += $(LIBNETLINK)

View File

@ -1,6 +1,6 @@
--- a/tc/q_fifo.c --- a/tc/q_fifo.c
+++ b/tc/q_fifo.c +++ b/tc/q_fifo.c
@@ -99,5 +99,6 @@ struct qdisc_util pfifo_head_drop_qdisc_ @@ -95,5 +95,6 @@ struct qdisc_util pfifo_head_drop_qdisc_
struct qdisc_util pfifo_fast_qdisc_util = { struct qdisc_util pfifo_fast_qdisc_util = {
.id = "pfifo_fast", .id = "pfifo_fast",

View File

@ -1,6 +1,6 @@
--- a/configure --- a/configure
+++ b/configure +++ b/configure
@@ -257,7 +257,7 @@ check_selinux() @@ -367,7 +367,7 @@ check_selinux()
check_mnl() check_mnl()
{ {

View File

@ -1,6 +1,6 @@
--- a/configure --- a/configure
+++ b/configure +++ b/configure
@@ -230,7 +230,7 @@ EOF @@ -235,7 +235,7 @@ EOF
check_elf() check_elf()
{ {

View File

@ -1,6 +1,6 @@
--- a/configure --- a/configure
+++ b/configure +++ b/configure
@@ -315,7 +315,7 @@ EOF @@ -425,7 +425,7 @@ EOF
check_cap() check_cap()
{ {

View File

@ -7,5 +7,5 @@
-CFLAGS += -fPIC -CFLAGS += -fPIC
+CFLAGS += $(FPIC) +CFLAGS += $(FPIC)
UTILOBJ = utils.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \ UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
inet_proto.o namespace.o json_writer.o json_print.o \ inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \

View File

@ -25,7 +25,7 @@
sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \ sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \
--- a/ip/ip.c --- a/ip/ip.c
+++ b/ip/ip.c +++ b/ip/ip.c
@@ -48,10 +48,16 @@ static void usage(void) @@ -64,10 +64,16 @@ static void usage(void)
fprintf(stderr, fprintf(stderr,
"Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n" "Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
" ip [ -force ] -batch filename\n" " ip [ -force ] -batch filename\n"
@ -42,7 +42,7 @@
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n" " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
" -h[uman-readable] | -iec | -j[son] | -p[retty] |\n" " -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
" -f[amily] { inet | inet6 | mpls | bridge | link } |\n" " -f[amily] { inet | inet6 | mpls | bridge | link } |\n"
@@ -74,36 +80,50 @@ static const struct cmd { @@ -90,36 +96,50 @@ static const struct cmd {
int (*func)(int argc, char **argv); int (*func)(int argc, char **argv);
} cmds[] = { } cmds[] = {
{ "address", do_ipaddr }, { "address", do_ipaddr },
@ -103,6 +103,6 @@
+ CFLAGS += -DIPROUTE2_TINY + CFLAGS += -DIPROUTE2_TINY
+endif +endif
+ +
UTILOBJ = utils.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \ UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
inet_proto.o namespace.o json_writer.o json_print.o \ inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
names.o color.o bpf.o exec.o fs.o cg_map.o names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o

View File

@ -1,6 +1,6 @@
--- a/configure --- a/configure
+++ b/configure +++ b/configure
@@ -301,14 +301,8 @@ EOF @@ -411,14 +411,8 @@ EOF
if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then
echo "no" echo "no"
else else

View File

@ -1,6 +1,6 @@
--- a/configure --- a/configure
+++ b/configure +++ b/configure
@@ -244,7 +244,7 @@ check_elf() @@ -354,7 +354,7 @@ check_libbpf()
check_selinux() check_selinux()
# SELinux is a compile time option in the ss utility # SELinux is a compile time option in the ss utility
{ {