From 886f2c43b5e6fb88da46cb22f6df6c7e50d79cc0 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Thu, 9 Feb 2017 11:50:54 +0100 Subject: [PATCH] testsuite: Generate nlmsg blob at runtime Since netlink messages are in host byte order, shipping a pre-generated nlmsg blob won't suffice on systems with different endianness. Therefore generate the blob at runtime, so it's content fits the hosts endianness. Note that the generated message will contain only a single interface featuring two VFs instead of the full list before. Yet this is sufficient, as it triggers the crash with iproute versions prior to commit 8c29ae7cc2494 ("ip link: Fix crash on older kernels when show VF dev"). Signed-off-by: Phil Sutter --- .gitignore | 2 + testsuite/Makefile | 2 + testsuite/tests/ip/link/dev_wo_vf_rate.nl | Bin 14076 -> 0 bytes testsuite/tools/Makefile | 2 + testsuite/tools/generate_nlmsg.c | 116 ++++++++++++++++++++++ 5 files changed, 122 insertions(+) delete mode 100644 testsuite/tests/ip/link/dev_wo_vf_rate.nl create mode 100644 testsuite/tools/Makefile create mode 100644 testsuite/tools/generate_nlmsg.c diff --git a/.gitignore b/.gitignore index 74a5496dd..c3b8d3864 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,8 @@ series # tests testsuite/results testsuite/iproute2/iproute2-this +testsuite/tools/generate_nlmsg +testsuite/tests/ip/link/dev_wo_vf_rate.nl # doc files generated at runtime doc/*.aux diff --git a/testsuite/Makefile b/testsuite/Makefile index 202765005..fa7ddb862 100644 --- a/testsuite/Makefile +++ b/testsuite/Makefile @@ -43,6 +43,8 @@ $(TESTS): clean ifeq (,$(HAVE_UNSHARED_UTIL)) $(error Please install util-linux tools to run tests in separated network namespace) endif + @./tools/generate_nlmsg + @mkdir -p $(RESULTS_DIR) @for d in $(TESTS_DIR); do \ diff --git a/testsuite/tests/ip/link/dev_wo_vf_rate.nl b/testsuite/tests/ip/link/dev_wo_vf_rate.nl deleted file mode 100644 index 40fa87ff1b158fb972e064efb38f76b0e9a56697..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 14076 zc-rmSU1$_X902hD?CxFm?qZCZ#He8X!sIE$Xk+}K9QtI?f)G$dh|yef2d9a8Dbfla zLaUJ090jE>EiDugLEA!o^TDr&K2>}Z5%kg5LVZ!p`k&buv)P$!?k*c{lguCP=I(ZO zW_M@icQbp}3INMtDt>tTN8gxE z=5|w-89&DYFs}{k`1|!d{fw1h!v>bdU?WTGAr5Co&W>fqGOz_2ASmKj9Vf|;gGLgM zQ^W~8vh}!$KF0rYA7RFQSk20&AyQFC*mZ>+C1WjIz-v|TTssj&@lZw3HdQpX0lYB* znv5j2xw~f*wz}g0{D)oTc(1$tDsRIyuZ8&P!z}RYayPGoQQVz?;$gx*KWYH)edQe= z-A>E!A0z#I3o)_(=?ID)I9B5o?$d&7zHPSlyW z&zbhkpmfIO&e$Gj>TvJVXMr2@?|Wc<;puzTF*9Sf=AC;FTw@%^?KRXG>p8%o%K*a@ zjxqM?h+(jWc$CjM3-YuVg-tk+vx#3=L`NUT~@sv+I<&zM-tTYr}7KN8zt^#SievP9DNOj2XEvn1;YPa=4aY2=rh-l!qty&9CtiVvAbHHn6o#w=cn^Jp~7E2otaU7~wR9XthjK$B{X+xi3oz?iR=6qVM}9X` z{G1Oa0D6sZ=WW!@l<&IIdT8{P`5m3Cp_>shXWE+f*0^jA?L$#8M|>M($+RhsG``+M z#GJ6^Xt4^+At9R+lg-&41#`rjNo5Y51NPz5PnNuIA|!Lf+_#UvP}QZ1gf>Sqr{}gd zN1HQcPFyx;M~%%XQgg(*M!KKI&$$PWq1OtxJ=y&<-*xTbjZ;ZoM4L0soYL3PHD{r% zt;j6qq!+;2s!lfN^C--7#JvucIX1VTG>_)kK66UioT|-9PiS+NsyU+yb8Ok1?rP0R zb92%jbEe<_p4}Sw{vCOGP_|}1gIcptLs(-$OC-J7yDz%l=&0Nqn4>od*_)j;_vVoH zX0dpa-LJh_s@@b8-q7Dy#P9nnuyserPUdr``Umo(*#Y5>d#_3U|7E#rt4jZWDeU>> zQro+>@3cK-k9}B)b8TFYp34mmXQKCec?;6GcS8HKRQ + */ + +#include +#include +#include +#include +#include +#include + +int fill_vf_rate_test(void *buf, size_t buflen) +{ + char bcmac[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + struct ifla_vf_mac vf_mac = { + .mac = { 0x0, 0x26, 0x6c, 0xff, 0xb5, 0xc0 }, + }; + struct ifla_vf_link_state vf_link_state = { 0 }; + struct ifla_vf_tx_rate vf_tx_rate = { 0 }; + struct ifla_vf_spoofchk vf_spoofchk = { + .setting = 1, + }; + struct ifla_vf_vlan vf_vlan = { 0 }; + struct rtattr *vfinfo_list, *vfinfo; + struct nlmsghdr *h = buf; + struct ifinfomsg *ifi; + + h->nlmsg_type = RTM_NEWLINK; + h->nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)); + + ifi = NLMSG_DATA(h); + ifi->ifi_type = ARPHRD_ETHER; + ifi->ifi_index = 1; + ifi->ifi_flags = IFF_RUNNING | IFF_BROADCAST | + IFF_MULTICAST | IFF_UP | IFF_LOWER_UP; + +#define ASSERT(x) if (x < 0) return -1 +#define ATTR_L(t, v, l) ASSERT(addattr_l(h, buflen, t, v, l)) +#define ATTR_8(t, v) ASSERT(addattr8(h, buflen, t, v)) +#define ATTR_32(t, v) ASSERT(addattr32(h, buflen, t, v)) +#define ATTR_STRZ(t, v) ASSERT(addattrstrz(h, buflen, t, v)) + +#define NEST(t) addattr_nest(h, buflen, t) +#define NEST_END(t) addattr_nest_end(h, t) + + ATTR_STRZ(IFLA_IFNAME, "eth0"); + ATTR_32(IFLA_TXQLEN, 10000); + ATTR_8(IFLA_OPERSTATE, 6); + ATTR_8(IFLA_LINKMODE, 0); + ATTR_32(IFLA_MTU, 9000); + ATTR_32(IFLA_GROUP, 0); + ATTR_32(IFLA_PROMISCUITY, 0); + ATTR_32(IFLA_NUM_TX_QUEUES, 8); + ATTR_32(IFLA_NUM_RX_QUEUES, 8); + ATTR_8(IFLA_CARRIER, 1); + ATTR_STRZ(IFLA_QDISC, "mq"); + ATTR_L(IFLA_ADDRESS, vf_mac.mac, ETH_ALEN); + ATTR_L(IFLA_BROADCAST, bcmac, sizeof(bcmac)); + ATTR_32(IFLA_NUM_VF, 2); + + vfinfo_list = NEST(IFLA_VFINFO_LIST); + + vfinfo = NEST(IFLA_VF_INFO); + ATTR_L(IFLA_VF_MAC, &vf_mac, sizeof(vf_mac)); + ATTR_L(IFLA_VF_VLAN, &vf_vlan, sizeof(vf_vlan)); + ATTR_L(IFLA_VF_TX_RATE, &vf_tx_rate, sizeof(vf_tx_rate)); + ATTR_L(IFLA_VF_SPOOFCHK, &vf_spoofchk, sizeof(vf_spoofchk)); + ATTR_L(IFLA_VF_LINK_STATE, &vf_link_state, sizeof(vf_link_state)); + NEST_END(vfinfo); + + vf_mac.vf = vf_vlan.vf = vf_tx_rate.vf = 1; + vf_spoofchk.vf = vf_link_state.vf = 1; + + vfinfo = NEST(IFLA_VF_INFO); + ATTR_L(IFLA_VF_MAC, &vf_mac, sizeof(vf_mac)); + ATTR_L(IFLA_VF_VLAN, &vf_vlan, sizeof(vf_vlan)); + ATTR_L(IFLA_VF_TX_RATE, &vf_tx_rate, sizeof(vf_tx_rate)); + ATTR_L(IFLA_VF_SPOOFCHK, &vf_spoofchk, sizeof(vf_spoofchk)); + ATTR_L(IFLA_VF_LINK_STATE, &vf_link_state, sizeof(vf_link_state)); + NEST_END(vfinfo); + + NEST_END(vfinfo_list); + + return h->nlmsg_len; +} + +int main(void) +{ + char buf[16384] = { 0 }; + int msglen; + FILE *fp; + + msglen = fill_vf_rate_test(buf, sizeof(buf)); + if (msglen < 0) { + fprintf(stderr, "fill_vf_rate_test() failed!\n"); + return 1; + } + fp = fopen("tests/ip/link/dev_wo_vf_rate.nl", "w"); + if (!fp) { + perror("fopen()"); + return 1; + } + if (fwrite(buf, msglen, 1, fp) != 1) { + perror("fwrite()"); + return 1; + } + fclose(fp); + return 0; +} -- 2.47.2