1From fbf1bad8fe8fc8a779668287abfe48af20359350 Mon Sep 17 00:00:00 2001 2From: Edward Liaw <[email protected]> 3Date: Tue, 19 Apr 2022 22:54:43 +0000 4Subject: [PATCH 05/20] psock_tpacket: version check 5 6TX_RING support for TPACKET_V3 was added in this commit: 7 8commit 7f953ab2ba46e8649537942c0a64668ca2ce5cc5 9Author: Sowmini Varadhan <[email protected]> 10Date: Tue Jan 3 06:31:47 2017 -0800 11 12 af_packet: TX_RING support for TPACKET_V3 13 14which first appeared in 4.11. Do not attempt to test TX_RING 15support for TPACKET_V3 on kernels earlier than this. 16 17(cherry picked from commit 1584e465aa445831fc93bcd64d560ab5b89cb55d) 18--- 19 tools/testing/selftests/net/psock_tpacket.c | 29 ++++++++++++++++++++- 20 1 file changed, 28 insertions(+), 1 deletion(-) 21 22diff --git a/tools/testing/selftests/net/psock_tpacket.c b/tools/testing/selftests/net/psock_tpacket.c 23index 4d5f317ab42c..9696c9e484d5 100644 24--- a/tools/testing/selftests/net/psock_tpacket.c 25+++ b/tools/testing/selftests/net/psock_tpacket.c 26@@ -28,6 +28,7 @@ 27 #include <sys/stat.h> 28 #include <sys/socket.h> 29 #include <sys/mman.h> 30+#include <sys/utsname.h> 31 #include <linux/if_packet.h> 32 #include <linux/filter.h> 33 #include <ctype.h> 34@@ -832,9 +833,34 @@ static int test_tpacket(int version, int type) 35 return 0; 36 } 37 38+void get_kernel_version(int *version, int *patchlevel) 39+{ 40+ int ret, sublevel; 41+ struct utsname utsname; 42+ 43+ ret = uname(&utsname); 44+ if (ret) { 45+ perror("uname"); 46+ exit(1); 47+ } 48+ 49+ ret = sscanf(utsname.release, "%d.%d.%d", version, patchlevel, 50+ &sublevel); 51+ if (ret < 0) { 52+ perror("sscanf"); 53+ exit(1); 54+ } else if (ret != 3) { 55+ printf("Malformed kernel version %s\n", &utsname.release); 56+ exit(1); 57+ } 58+} 59+ 60 int main(void) 61 { 62 int ret = 0; 63+ int version, patchlevel; 64+ 65+ get_kernel_version(&version, &patchlevel); 66 67 ret |= test_tpacket(TPACKET_V1, PACKET_RX_RING); 68 ret |= test_tpacket(TPACKET_V1, PACKET_TX_RING); 69@@ -843,7 +869,8 @@ int main(void) 70 ret |= test_tpacket(TPACKET_V2, PACKET_TX_RING); 71 72 ret |= test_tpacket(TPACKET_V3, PACKET_RX_RING); 73- ret |= test_tpacket(TPACKET_V3, PACKET_TX_RING); 74+ if (version > 4 || (version == 4 && patchlevel >= 11)) 75+ ret |= test_tpacket(TPACKET_V3, PACKET_TX_RING); 76 77 if (ret) 78 return 1; 79-- 802.42.0.609.gbb76f46606-goog 81 82