1TX_RING support for TPACKET_V3 was added in this commit: 2 3commit 7f953ab2ba46e8649537942c0a64668ca2ce5cc5 4Author: Sowmini Varadhan <sowmini.varadhan@oracle.com> 5Date: Tue Jan 3 06:31:47 2017 -0800 6 7 af_packet: TX_RING support for TPACKET_V3 8 9which first appeared in 4.11. Do not attempt to test TX_RING 10support for TPACKET_V3 on kernels earlier than this. 11 12diff --git a/tools/testing/selftests/net/psock_tpacket.c b/tools/testing/selftests/net/psock_tpacket.c 13index e795a41c4771..c50375f51b2e 100644 14--- a/tools/testing/selftests/net/psock_tpacket.c 15+++ b/tools/testing/selftests/net/psock_tpacket.c 16@@ -42,6 +42,7 @@ 17 #include <sys/stat.h> 18 #include <sys/socket.h> 19 #include <sys/mman.h> 20+#include <sys/utsname.h> 21 #include <linux/if_packet.h> 22 #include <linux/filter.h> 23 #include <ctype.h> 24@@ -844,9 +845,34 @@ static int test_tpacket(int version, int type) 25 return 0; 26 } 27 28+void get_kernel_version(int *version, int *patchlevel) 29+{ 30+ int ret, sublevel; 31+ struct utsname utsname; 32+ 33+ ret = uname(&utsname); 34+ if (ret) { 35+ perror("uname"); 36+ exit(1); 37+ } 38+ 39+ ret = sscanf(utsname.release, "%d.%d.%d", version, patchlevel, 40+ &sublevel); 41+ if (ret < 0) { 42+ perror("sscanf"); 43+ exit(1); 44+ } else if (ret != 3) { 45+ printf("Malformed kernel version %s\n", &utsname.release); 46+ exit(1); 47+ } 48+} 49+ 50 int main(void) 51 { 52 int ret = 0; 53+ int version, patchlevel; 54+ 55+ get_kernel_version(&version, &patchlevel); 56 57 ret |= test_tpacket(TPACKET_V1, PACKET_RX_RING); 58 ret |= test_tpacket(TPACKET_V1, PACKET_TX_RING); 59@@ -855,7 +881,8 @@ int main(void) 60 ret |= test_tpacket(TPACKET_V2, PACKET_TX_RING); 61 62 ret |= test_tpacket(TPACKET_V3, PACKET_RX_RING); 63- ret |= test_tpacket(TPACKET_V3, PACKET_TX_RING); 64+ if (version > 4 || (version == 4 && patchlevel >= 11)) 65+ ret |= test_tpacket(TPACKET_V3, PACKET_TX_RING); 66 67 if (ret) 68 return 1; 69