aboutsummaryrefslogtreecommitdiffstats
path: root/testing/ipt-netflow-hardened/kernel-4.6.patch
blob: 79fba3c5bf0ae298e5795b17d1cd8f97cfc87ccd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
From c16ffc6cb679b3377a0d4a30a6bbcf5e2f3d0214 Mon Sep 17 00:00:00 2001
From: ABC <abc@telekom.ru>
Date: Sun, 22 May 2016 22:07:14 +0300
Subject: [PATCH] Support ETHTOOL_xLINKSETTINGS API (new in linux 4.6).

Thus, making support for 4.6 kernels.
Reference to linux commit:
  https://github.com/torvalds/linux/commit/3f1ac7a700d

Fixes #56, thanks karel-un.
---
 ipt_NETFLOW.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/ipt_NETFLOW.c b/ipt_NETFLOW.c
index 067fd50..d27eea2 100644
--- a/ipt_NETFLOW.c
+++ b/ipt_NETFLOW.c
@@ -3904,7 +3904,13 @@ static int ethtool_drvinfo(unsigned char *ptr, size_t size, struct net_device *d
 {
 	struct ethtool_drvinfo info = { 0 };
 	const struct ethtool_ops *ops = dev->ethtool_ops;
+#ifndef ETHTOOL_GLINKSETTINGS
 	struct ethtool_cmd ecmd;
+#define _KSETTINGS(x, y) (x)
+#else
+	struct ethtool_link_ksettings ekmd;
+#define _KSETTINGS(x, y) (y)
+#endif
 	int len = size;
 	int n;
 
@@ -3933,11 +3939,11 @@ static int ethtool_drvinfo(unsigned char *ptr, size_t size, struct net_device *d
 	/* only get_settings for running devices to not trigger link negotiation */
 	if (dev->flags & IFF_UP &&
 	    dev->flags & IFF_RUNNING &&
-	    !__ethtool_get_settings(dev, &ecmd)) {
+	    !_KSETTINGS(__ethtool_get_settings(dev, &ecmd), __ethtool_get_link_ksettings(dev, &ekmd))) {
 		char *s, *p;
 
 		/* append basic parameters: speed and port */
-		switch (ethtool_cmd_speed(&ecmd)) {
+		switch (_KSETTINGS(ethtool_cmd_speed(&ecmd), ekmd.base.speed)) {
 		case SPEED_10000: s = "10Gb"; break;
 		case SPEED_2500:  s = "2.5Gb"; break;
 		case SPEED_1000:  s = "1Gb"; break;
@@ -3945,7 +3951,7 @@ static int ethtool_drvinfo(unsigned char *ptr, size_t size, struct net_device *d
 		case SPEED_10:    s = "10Mb"; break;
 		default:          s = "";
 		}
-		switch (ecmd.port) {
+		switch (_KSETTINGS(ecmd.port, ekmd.base.port)) {
 		case PORT_TP:     p = "tp"; break;
 		case PORT_AUI:    p = "aui"; break;
 		case PORT_MII:    p = "mii"; break;
@@ -3964,6 +3970,7 @@ static int ethtool_drvinfo(unsigned char *ptr, size_t size, struct net_device *d
 		ops->complete(dev);
 	return size - len;
 }
+#undef _KSETTINGS
 
 static const unsigned short netdev_type[] =
 {ARPHRD_NETROM, ARPHRD_ETHER, ARPHRD_AX25,