iproute package update
Signed-off-by: basebuilder_pel7x64builder0 <basebuilder@powerel.org>master
parent
07f660e083
commit
8f4babb044
|
@ -0,0 +1,105 @@
|
||||||
|
From d9a1dc236a9bcc06f04d609e2654f76c6a9459e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Mon, 14 Dec 2015 21:02:18 +0100
|
||||||
|
Subject: [PATCH] Confirm success for each tc -batch command
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=977844
|
||||||
|
Upstream Status: Rejected.
|
||||||
|
|
||||||
|
The original patch has been extended by the related man page additions
|
||||||
|
which were contained in another local patch.
|
||||||
|
|
||||||
|
commit 8c5024483cbbfdc092945a00be05d917485b9af3
|
||||||
|
Author: Petr Písař <ppisar@redhat.com>
|
||||||
|
Date: Thu Sep 19 11:25:49 2013 +0200
|
||||||
|
|
||||||
|
Confirm success for each tc -batch command
|
||||||
|
|
||||||
|
If `tc -force -batch' is fed by a controlling program from a pipe,
|
||||||
|
it's not possible to recognize when a command has been processes
|
||||||
|
successfully.
|
||||||
|
|
||||||
|
This patch adds an optional `-OK' option to the tc(8) tool, so `tc
|
||||||
|
-force -OK -batch' will print "OK\n" to standard output on each
|
||||||
|
successfully completed tc command.
|
||||||
|
|
||||||
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
||||||
|
|
||||||
|
Signed-off-by: Phil Sutter <psutter@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/tc.8 | 8 +++++++-
|
||||||
|
tc/tc.c | 8 +++++++-
|
||||||
|
2 files changed, 14 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc.8 b/man/man8/tc.8
|
||||||
|
index f96911a..a341a8f 100644
|
||||||
|
--- a/man/man8/tc.8
|
||||||
|
+++ b/man/man8/tc.8
|
||||||
|
@@ -62,7 +62,7 @@ tc \- show / manipulate traffic control settings
|
||||||
|
.P
|
||||||
|
.ti 8
|
||||||
|
.IR OPTIONS " := {"
|
||||||
|
-\fB[ -force ] -b\fR[\fIatch\fR] \fB[ filename ] \fR|
|
||||||
|
+\fB[ -force ] [ -OK ] -b\fR[\fIatch\fR] \fB[ filename ] \fR|
|
||||||
|
\fB[ \fB-n\fR[\fIetns\fR] name \fB] \fR|
|
||||||
|
\fB[ \fB-nm \fR| \fB-nam\fR[\fIes\fR] \fB] \fR|
|
||||||
|
\fB[ \fR{ \fB-cf \fR| \fB-c\fR[\fIonf\fR] \fR} \fB[ filename ] \fB] \fR}
|
||||||
|
@@ -603,6 +603,12 @@ don't terminate tc on errors in batch mode.
|
||||||
|
If there were any errors during execution of the commands, the application return code will be non zero.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
+.BR "\-OK"
|
||||||
|
+in batch mode, print
|
||||||
|
+.B OK
|
||||||
|
+and a new line on standard output after each successfully interpreted command.
|
||||||
|
+
|
||||||
|
+.TP
|
||||||
|
.BR "\-n" , " \-net" , " \-netns " <NETNS>
|
||||||
|
switches
|
||||||
|
.B tc
|
||||||
|
diff --git a/tc/tc.c b/tc/tc.c
|
||||||
|
index 8e64a82..360c9f1 100644
|
||||||
|
--- a/tc/tc.c
|
||||||
|
+++ b/tc/tc.c
|
||||||
|
@@ -42,6 +42,7 @@ int batch_mode;
|
||||||
|
int resolve_hosts;
|
||||||
|
int use_iec;
|
||||||
|
int force;
|
||||||
|
+int ok;
|
||||||
|
bool use_names;
|
||||||
|
|
||||||
|
static char *conf_file;
|
||||||
|
@@ -188,7 +189,7 @@ noexist:
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }\n"
|
||||||
|
- " tc [-force] -batch filename\n"
|
||||||
|
+ " tc [-force] [-OK] -batch filename\n"
|
||||||
|
"where OBJECT := { qdisc | class | filter | action | monitor | exec }\n"
|
||||||
|
" OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [filename] | -n[etns] name |\n"
|
||||||
|
" -nm | -nam[es] | { -cf | -conf } path }\n");
|
||||||
|
@@ -254,6 +255,9 @@ static int batch(const char *name)
|
||||||
|
ret = 1;
|
||||||
|
if (!force)
|
||||||
|
break;
|
||||||
|
+ } else if (ok) {
|
||||||
|
+ printf("OK\n");
|
||||||
|
+ fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line)
|
||||||
|
@@ -293,6 +297,8 @@ int main(int argc, char **argv)
|
||||||
|
return 0;
|
||||||
|
} else if (matches(argv[1], "-force") == 0) {
|
||||||
|
++force;
|
||||||
|
+ } else if (matches(argv[1], "-OK") == 0) {
|
||||||
|
+ ++ok;
|
||||||
|
} else if (matches(argv[1], "-batch") == 0) {
|
||||||
|
argc--; argv++;
|
||||||
|
if (argc <= 1)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
From aed8229c0bec5c56deaf1ea2047ca0263732477f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 11 Aug 2017 11:11:32 +0200
|
||||||
|
Subject: [PATCH] Really fix get_addr() and get_prefix() error messages
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477206
|
||||||
|
Upstream Status: iproute2.git commit 34705c807a389
|
||||||
|
|
||||||
|
commit 34705c807a38909247d1bb29ccdffe42e5c1dab3
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Tue Aug 1 18:36:11 2017 +0200
|
||||||
|
|
||||||
|
Really fix get_addr() and get_prefix() error messages
|
||||||
|
|
||||||
|
Both functions take the desired address family as a parameter. So using
|
||||||
|
that to notify the user what address family was expected is correct,
|
||||||
|
unlike using dst->family which will tell the user only what address
|
||||||
|
family was specified.
|
||||||
|
|
||||||
|
The situation which commit 334af76143368 tried to fix was when 'ip'
|
||||||
|
would accept addresses from multiple families. In that case, the family
|
||||||
|
parameter is set to AF_UNSPEC so that get_addr_1() may accept any valid
|
||||||
|
address.
|
||||||
|
|
||||||
|
This patch introduces a wrapper around family_name() which returns the
|
||||||
|
string "any valid" for AF_UNSPEC instead of the three question marks
|
||||||
|
unsuitable for use in error messages.
|
||||||
|
|
||||||
|
Tests for AF_UNSPEC:
|
||||||
|
|
||||||
|
| # ip a a 256.10.166.1/24 dev d0
|
||||||
|
| Error: any valid prefix is expected rather than "256.10.166.1/24".
|
||||||
|
|
||||||
|
| # ip neighbor add proxy 2001:db8::g dev d0
|
||||||
|
| Error: any valid address is expected rather than "2001:db8::g".
|
||||||
|
|
||||||
|
Tests for explicit address family:
|
||||||
|
|
||||||
|
| # ip -6 addrlabel add prefix 1.1.1.1/24 label 123
|
||||||
|
| Error: inet6 prefix is expected rather than "1.1.1.1/24".
|
||||||
|
|
||||||
|
| # ip -4 addrlabel add prefix dead:beef::1/24 label 123
|
||||||
|
| Error: inet prefix is expected rather than "dead:beef::1/24".
|
||||||
|
|
||||||
|
Reported-by: Jaroslav Aster <jaster@redhat.com>
|
||||||
|
Fixes: 334af76143368 ("fix get_addr() and get_prefix() error messages")
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
lib/utils.c | 11 +++++++++--
|
||||||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/utils.c b/lib/utils.c
|
||||||
|
index 6d5642f..7d6ee53 100644
|
||||||
|
--- a/lib/utils.c
|
||||||
|
+++ b/lib/utils.c
|
||||||
|
@@ -613,12 +613,19 @@ done:
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const char *family_name_verbose(int family)
|
||||||
|
+{
|
||||||
|
+ if (family == AF_UNSPEC)
|
||||||
|
+ return "any valid";
|
||||||
|
+ return family_name(family);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int get_addr(inet_prefix *dst, const char *arg, int family)
|
||||||
|
{
|
||||||
|
if (get_addr_1(dst, arg, family)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error: %s address is expected rather than \"%s\".\n",
|
||||||
|
- family_name(dst->family), arg);
|
||||||
|
+ family_name_verbose(family), arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
@@ -636,7 +643,7 @@ int get_prefix(inet_prefix *dst, char *arg, int family)
|
||||||
|
if (get_prefix_1(dst, arg, family)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error: %s prefix is expected rather than \"%s\".\n",
|
||||||
|
- family_name(dst->family), arg);
|
||||||
|
+ family_name_verbose(family), arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
From 3d016b2ca5862b3f47da5b28aca43bd96d5c3c49 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 11 Aug 2017 11:13:26 +0200
|
||||||
|
Subject: [PATCH] tc-simple: Fix documentation
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
|
||||||
|
Upstream Status: iproute2.git commit e2a055dd23f0e
|
||||||
|
|
||||||
|
commit e2a055dd23f0e7527a987c24687cb6b0b86f0cde
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Thu Aug 3 17:00:51 2017 +0200
|
||||||
|
|
||||||
|
tc-simple: Fix documentation
|
||||||
|
|
||||||
|
- CONTROL has to come last, otherwise 'index' applies to gact and not
|
||||||
|
simple itself.
|
||||||
|
- Man page wasn't updated to reflect syntax changes.
|
||||||
|
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
man/man8/tc-simple.8 | 29 ++++++++++++++++++++++++++---
|
||||||
|
tc/m_simple.c | 4 ++--
|
||||||
|
2 files changed, 28 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-simple.8 b/man/man8/tc-simple.8
|
||||||
|
index 2206dc3..7363ab5 100644
|
||||||
|
--- a/man/man8/tc-simple.8
|
||||||
|
+++ b/man/man8/tc-simple.8
|
||||||
|
@@ -6,15 +6,37 @@ simple - basic example action
|
||||||
|
.in +8
|
||||||
|
.ti -8
|
||||||
|
.BR tc " ... " "action simple"
|
||||||
|
-.I STRING
|
||||||
|
+[
|
||||||
|
+.BI sdata " STRING"
|
||||||
|
+] [
|
||||||
|
+.BI index " INDEX"
|
||||||
|
+] [
|
||||||
|
+.I CONTROL
|
||||||
|
+]
|
||||||
|
+
|
||||||
|
+.ti -8
|
||||||
|
+.IR CONTROL " := {"
|
||||||
|
+.BR reclassify " | " pipe " | " drop " | " continue " | " ok " }"
|
||||||
|
+
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This is a pedagogical example rather than an actually useful action. Upon every access, it prints the given
|
||||||
|
.I STRING
|
||||||
|
which may be of arbitrary length.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
-.I STRING
|
||||||
|
+.BI sdata " STRING"
|
||||||
|
The actual string to print.
|
||||||
|
+.TP
|
||||||
|
+.BI index " INDEX"
|
||||||
|
+Optional action index value.
|
||||||
|
+.TP
|
||||||
|
+.I CONTROL
|
||||||
|
+Indicate how
|
||||||
|
+.B tc
|
||||||
|
+should proceed after executing the action. For a description of the possible
|
||||||
|
+.I CONTROL
|
||||||
|
+values, see
|
||||||
|
+.BR tc-actions (8).
|
||||||
|
.SH EXAMPLES
|
||||||
|
The following example makes the kernel yell "Incoming ICMP!" every time it sees
|
||||||
|
an incoming ICMP on eth0. Steps are:
|
||||||
|
@@ -36,7 +58,7 @@ display stats again and observe increment by 1
|
||||||
|
.EX
|
||||||
|
hadi@noma1:$ tc qdisc add dev eth0 ingress
|
||||||
|
hadi@noma1:$tc filter add dev eth0 parent ffff: protocol ip prio 5 \\
|
||||||
|
- u32 match ip protocol 1 0xff flowid 1:1 action simple "Incoming ICMP"
|
||||||
|
+ u32 match ip protocol 1 0xff flowid 1:1 action simple sdata "Incoming ICMP"
|
||||||
|
|
||||||
|
hadi@noma1:$ sudo tc -s filter ls dev eth0 parent ffff:
|
||||||
|
filter protocol ip pref 5 u32
|
||||||
|
@@ -74,3 +96,4 @@ display stats again and observe increment by 1
|
||||||
|
.EE
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR tc (8)
|
||||||
|
+.BR tc-actions (8)
|
||||||
|
diff --git a/tc/m_simple.c b/tc/m_simple.c
|
||||||
|
index 3a8bd91..ab63384 100644
|
||||||
|
--- a/tc/m_simple.c
|
||||||
|
+++ b/tc/m_simple.c
|
||||||
|
@@ -81,10 +81,10 @@
|
||||||
|
#endif
|
||||||
|
static void explain(void)
|
||||||
|
{
|
||||||
|
- fprintf(stderr, "Usage:... simple [sdata STRING] [CONTROL] [index INDEX]\n");
|
||||||
|
+ fprintf(stderr, "Usage:... simple [sdata STRING] [index INDEX] [CONTROL]\n");
|
||||||
|
fprintf(stderr, "\tSTRING being an arbitrary string\n"
|
||||||
|
- "\tCONTROL := reclassify|pipe|drop|continue|ok\n"
|
||||||
|
"\tINDEX := optional index value used\n");
|
||||||
|
+ "\tCONTROL := reclassify|pipe|drop|continue|ok\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
From d203110b883afafa58b735a3e94c71f255db7608 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 11 Aug 2017 11:13:26 +0200
|
||||||
|
Subject: [PATCH] tc: fix m_simple usage
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
|
||||||
|
Upstream Status: iproute2.git commit 620fc6696d4f4
|
||||||
|
|
||||||
|
commit 620fc6696d4f4e9ad540a45892873b0382907739
|
||||||
|
Author: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
Date: Thu Aug 3 16:10:18 2017 -0700
|
||||||
|
|
||||||
|
tc: fix m_simple usage
|
||||||
|
|
||||||
|
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
---
|
||||||
|
tc/m_simple.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tc/m_simple.c b/tc/m_simple.c
|
||||||
|
index ab63384..65e48ad 100644
|
||||||
|
--- a/tc/m_simple.c
|
||||||
|
+++ b/tc/m_simple.c
|
||||||
|
@@ -83,8 +83,8 @@ static void explain(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage:... simple [sdata STRING] [index INDEX] [CONTROL]\n");
|
||||||
|
fprintf(stderr, "\tSTRING being an arbitrary string\n"
|
||||||
|
- "\tINDEX := optional index value used\n");
|
||||||
|
- "\tCONTROL := reclassify|pipe|drop|continue|ok\n"
|
||||||
|
+ "\tINDEX := optional index value used\n"
|
||||||
|
+ "\tCONTROL := reclassify|pipe|drop|continue|ok\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
From 91cda136ef27402256dbf85434374b43ab52d932 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 11 Aug 2017 11:15:30 +0200
|
||||||
|
Subject: [PATCH] bpf: Make bytecode-file reading a little more robust
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477491
|
||||||
|
Upstream Status: iproute2.git commit 3da3ebfca85b8
|
||||||
|
|
||||||
|
commit 3da3ebfca85b8f1e8252b898453d8cb383c5c398
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Wed Aug 2 14:57:56 2017 +0200
|
||||||
|
|
||||||
|
bpf: Make bytecode-file reading a little more robust
|
||||||
|
|
||||||
|
bpf_parse_string() will now correctly handle:
|
||||||
|
|
||||||
|
- Extraneous whitespace,
|
||||||
|
- OPs on multiple lines and
|
||||||
|
- overlong file names.
|
||||||
|
|
||||||
|
The added feature of allowing to have OPs on multiple lines (like e.g.
|
||||||
|
tcpdump prints them) is rather a side effect of fixing detection of
|
||||||
|
malformed bytecode files having random content on a second line, like
|
||||||
|
e.g.:
|
||||||
|
|
||||||
|
| 4,40 0 0 12,21 0 1 2048,6 0 0 262144,6 0 0 0
|
||||||
|
| foobar
|
||||||
|
|
||||||
|
Cc: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
|
---
|
||||||
|
lib/bpf.c | 32 ++++++++++++++++++++++++--------
|
||||||
|
1 file changed, 24 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/bpf.c b/lib/bpf.c
|
||||||
|
index 04ee1ab..73dac5c 100644
|
||||||
|
--- a/lib/bpf.c
|
||||||
|
+++ b/lib/bpf.c
|
||||||
|
@@ -160,11 +160,11 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
||||||
|
|
||||||
|
if (from_file) {
|
||||||
|
size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
|
||||||
|
- char *tmp_string, *last;
|
||||||
|
+ char *tmp_string, *pos, c, c_prev = ' ';
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
|
||||||
|
- tmp_string = calloc(1, tmp_len);
|
||||||
|
+ tmp_string = pos = calloc(1, tmp_len);
|
||||||
|
if (tmp_string == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@@ -175,17 +175,33 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!fgets(tmp_string, tmp_len, fp)) {
|
||||||
|
+ while ((c = fgetc(fp)) != EOF) {
|
||||||
|
+ switch (c) {
|
||||||
|
+ case '\n':
|
||||||
|
+ if (c_prev != ',')
|
||||||
|
+ *(pos++) = ',';
|
||||||
|
+ break;
|
||||||
|
+ case ' ':
|
||||||
|
+ case '\t':
|
||||||
|
+ if (c_prev != ' ')
|
||||||
|
+ *(pos++) = c;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ *(pos++) = c;
|
||||||
|
+ }
|
||||||
|
+ if (pos - tmp_string == tmp_len)
|
||||||
|
+ break;
|
||||||
|
+ c_prev = c;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!feof(fp)) {
|
||||||
|
free(tmp_string);
|
||||||
|
fclose(fp);
|
||||||
|
- return -EIO;
|
||||||
|
+ return -E2BIG;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
-
|
||||||
|
- last = &tmp_string[strlen(tmp_string) - 1];
|
||||||
|
- if (*last == '\n')
|
||||||
|
- *last = 0;
|
||||||
|
+ *pos = 0;
|
||||||
|
|
||||||
|
*need_release = true;
|
||||||
|
*bpf_string = tmp_string;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
From 2dc48cc4101b9788dcafd38b07a82f8c91b4d3f6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Thu, 31 Aug 2017 14:23:11 +0200
|
||||||
|
Subject: [PATCH] ss: Fix for added diag support check
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1487152
|
||||||
|
Upstream Status: iproute2.git commit 6c6bbc30f4e7f
|
||||||
|
|
||||||
|
commit 6c6bbc30f4e7fedc74381627f7ec86d26050b404
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Mon Aug 28 19:31:22 2017 +0200
|
||||||
|
|
||||||
|
ss: Fix for added diag support check
|
||||||
|
|
||||||
|
Commit 9f66764e308e9 ("libnetlink: Add test for error code returned from
|
||||||
|
netlink reply") changed rtnl_dump_filter_l() to return an error in case
|
||||||
|
NLMSG_DONE would contain one, even if it was ENOENT.
|
||||||
|
|
||||||
|
This in turn breaks ss when it tries to dump DCCP sockets on a system
|
||||||
|
without support for it: The function tcp_show(), which is shared between
|
||||||
|
TCP and DCCP, will start parsing /proc since inet_show_netlink() returns
|
||||||
|
an error - yet it parses /proc/net/tcp which doesn't make sense for DCCP
|
||||||
|
sockets at all.
|
||||||
|
|
||||||
|
On my system, a call to 'ss' without further arguments prints the list
|
||||||
|
of connected TCP sockets twice.
|
||||||
|
|
||||||
|
Fix this by introducing a dedicated function dccp_show() which does not
|
||||||
|
have a fallback to /proc, just like sctp_show(). And since tcp_show()
|
||||||
|
is no longer "multi-purpose", drop it's socktype parameter.
|
||||||
|
|
||||||
|
Fixes: 9f66764e308e9 ("libnetlink: Add test for error code returned from netlink reply")
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
misc/ss.c | 20 ++++++++++++++++----
|
||||||
|
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/misc/ss.c b/misc/ss.c
|
||||||
|
index 12763c9..b84baf3 100644
|
||||||
|
--- a/misc/ss.c
|
||||||
|
+++ b/misc/ss.c
|
||||||
|
@@ -2735,7 +2735,7 @@ static int tcp_show_netlink_file(struct filter *f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int tcp_show(struct filter *f, int socktype)
|
||||||
|
+static int tcp_show(struct filter *f)
|
||||||
|
{
|
||||||
|
FILE *fp = NULL;
|
||||||
|
char *buf = NULL;
|
||||||
|
@@ -2750,7 +2750,7 @@ static int tcp_show(struct filter *f, int socktype)
|
||||||
|
return tcp_show_netlink_file(f);
|
||||||
|
|
||||||
|
if (!getenv("PROC_NET_TCP") && !getenv("PROC_ROOT")
|
||||||
|
- && inet_show_netlink(f, NULL, socktype) == 0)
|
||||||
|
+ && inet_show_netlink(f, NULL, IPPROTO_TCP) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Sigh... We have to parse /proc/net/tcp... */
|
||||||
|
@@ -2818,6 +2818,18 @@ outerr:
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int dccp_show(struct filter *f)
|
||||||
|
+{
|
||||||
|
+ if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (!getenv("PROC_NET_DCCP") && !getenv("PROC_ROOT")
|
||||||
|
+ && inet_show_netlink(f, NULL, IPPROTO_DCCP) == 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int sctp_show(struct filter *f)
|
||||||
|
{
|
||||||
|
if (!filter_af_get(f, AF_INET) && !filter_af_get(f, AF_INET6))
|
||||||
|
@@ -4368,9 +4380,9 @@ int main(int argc, char *argv[])
|
||||||
|
if (current_filter.dbs & (1<<UDP_DB))
|
||||||
|
udp_show(¤t_filter);
|
||||||
|
if (current_filter.dbs & (1<<TCP_DB))
|
||||||
|
- tcp_show(¤t_filter, IPPROTO_TCP);
|
||||||
|
+ tcp_show(¤t_filter);
|
||||||
|
if (current_filter.dbs & (1<<DCCP_DB))
|
||||||
|
- tcp_show(¤t_filter, IPPROTO_DCCP);
|
||||||
|
+ dccp_show(¤t_filter);
|
||||||
|
if (current_filter.dbs & (1<<SCTP_DB))
|
||||||
|
sctp_show(¤t_filter);
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
From 4917021d1ebea2b75cdcf31272452aa5cc3ff7ec Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 1 Sep 2017 13:05:45 +0200
|
||||||
|
Subject: [PATCH] tc-simple.8: Fix reference to non-existing tc-actions.8
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
|
||||||
|
Upstream Status: RHEL-only
|
||||||
|
|
||||||
|
The referenced man page doesn't exist in RHEL iproute package, so better
|
||||||
|
refer to an existing one which also contains the CONTROL value
|
||||||
|
description.
|
||||||
|
---
|
||||||
|
man/man8/tc-simple.8 | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-simple.8 b/man/man8/tc-simple.8
|
||||||
|
index 7363ab5..a0deb0b 100644
|
||||||
|
--- a/man/man8/tc-simple.8
|
||||||
|
+++ b/man/man8/tc-simple.8
|
||||||
|
@@ -36,7 +36,7 @@ Indicate how
|
||||||
|
should proceed after executing the action. For a description of the possible
|
||||||
|
.I CONTROL
|
||||||
|
values, see
|
||||||
|
-.BR tc-actions (8).
|
||||||
|
+.BR tc-pedit (8).
|
||||||
|
.SH EXAMPLES
|
||||||
|
The following example makes the kernel yell "Incoming ICMP!" every time it sees
|
||||||
|
an incoming ICMP on eth0. Steps are:
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
From 584ca9f67952162dfdd02d984aa12640e45a4235 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Wed, 6 Sep 2017 11:53:53 +0200
|
||||||
|
Subject: [PATCH] lib/bpf: Fix bytecode-file parsing
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477491
|
||||||
|
Upstream Status: iproute2.git commit 7c87c7fed18d1
|
||||||
|
|
||||||
|
commit 7c87c7fed18d1162e045c8331cb68fa440bc5728
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Tue Aug 29 17:09:45 2017 +0200
|
||||||
|
|
||||||
|
lib/bpf: Fix bytecode-file parsing
|
||||||
|
|
||||||
|
The signedness of char type is implementation dependent, and there are
|
||||||
|
architectures on which it is unsigned by default. In that case, the
|
||||||
|
check whether fgetc() returned EOF failed because the return value was
|
||||||
|
assigned an (unsigned) char variable prior to comparison with EOF (which
|
||||||
|
is defined to -1). Fix this by using int as type for 'c' variable, which
|
||||||
|
also matches the declaration of fgetc().
|
||||||
|
|
||||||
|
While being at it, fix the parser logic to correctly handle multiple
|
||||||
|
empty lines and consecutive whitespace and tab characters to further
|
||||||
|
improve the parser's robustness. Note that this will still detect double
|
||||||
|
separator characters, so doesn't soften up the parser too much.
|
||||||
|
|
||||||
|
Fixes: 3da3ebfca85b8 ("bpf: Make bytecode-file reading a little more robust")
|
||||||
|
Cc: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
|
---
|
||||||
|
lib/bpf.c | 7 +++++--
|
||||||
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/bpf.c b/lib/bpf.c
|
||||||
|
index 73dac5c..3aabf44 100644
|
||||||
|
--- a/lib/bpf.c
|
||||||
|
+++ b/lib/bpf.c
|
||||||
|
@@ -160,8 +160,9 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
||||||
|
|
||||||
|
if (from_file) {
|
||||||
|
size_t tmp_len, op_len = sizeof("65535 255 255 4294967295,");
|
||||||
|
- char *tmp_string, *pos, c, c_prev = ' ';
|
||||||
|
+ char *tmp_string, *pos, c_prev = ' ';
|
||||||
|
FILE *fp;
|
||||||
|
+ int c;
|
||||||
|
|
||||||
|
tmp_len = sizeof("4096,") + BPF_MAXINSNS * op_len;
|
||||||
|
tmp_string = pos = calloc(1, tmp_len);
|
||||||
|
@@ -180,18 +181,20 @@ static int bpf_parse_string(char *arg, bool from_file, __u16 *bpf_len,
|
||||||
|
case '\n':
|
||||||
|
if (c_prev != ',')
|
||||||
|
*(pos++) = ',';
|
||||||
|
+ c_prev = ',';
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
if (c_prev != ' ')
|
||||||
|
*(pos++) = c;
|
||||||
|
+ c_prev = ' ';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*(pos++) = c;
|
||||||
|
+ c_prev = c;
|
||||||
|
}
|
||||||
|
if (pos - tmp_string == tmp_len)
|
||||||
|
break;
|
||||||
|
- c_prev = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!feof(fp)) {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
From 3905b2d8f676601c022804d197be9165dacff11c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Wed, 6 Sep 2017 15:44:19 +0200
|
||||||
|
Subject: [PATCH] tc-simple.8: Fix one more reference to non-existing
|
||||||
|
tc-actions.8
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1477523
|
||||||
|
Upstream Status: RHEL-only
|
||||||
|
|
||||||
|
Previous fix missed to update the SEE ALSO section as well.
|
||||||
|
---
|
||||||
|
man/man8/tc-simple.8 | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-simple.8 b/man/man8/tc-simple.8
|
||||||
|
index a0deb0b..beab313 100644
|
||||||
|
--- a/man/man8/tc-simple.8
|
||||||
|
+++ b/man/man8/tc-simple.8
|
||||||
|
@@ -96,4 +96,4 @@ display stats again and observe increment by 1
|
||||||
|
.EE
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR tc (8)
|
||||||
|
-.BR tc-actions (8)
|
||||||
|
+.BR tc-pedit (8)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
From 074062808c630f2efb55c7093d510b44a38e74e5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Thu, 14 Sep 2017 15:27:47 +0200
|
||||||
|
Subject: [PATCH] tc: m_xt: Prevent a segfault in libipt
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465599
|
||||||
|
Upstream Status: iproute2.git commit f6fc1055e41a8
|
||||||
|
|
||||||
|
commit f6fc1055e41a8a924313c336b39b9ffe0c86938b
|
||||||
|
Author: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Tue May 23 15:40:57 2017 +0200
|
||||||
|
|
||||||
|
tc: m_xt: Prevent a segfault in libipt
|
||||||
|
|
||||||
|
This happens with NAT targets, such as SNAT, DNAT and MASQUERADE. These
|
||||||
|
are still not usable with this patch, but at least tc doesn't crash
|
||||||
|
anymore when one tries to use them.
|
||||||
|
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
tc/m_xt.c | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tc/m_xt.c b/tc/m_xt.c
|
||||||
|
index e59df8e..ad52d23 100644
|
||||||
|
--- a/tc/m_xt.c
|
||||||
|
+++ b/tc/m_xt.c
|
||||||
|
@@ -146,6 +146,9 @@ static int parse_ipt(struct action_util *a, int *argc_p,
|
||||||
|
char ***argv_p, int tca_id, struct nlmsghdr *n)
|
||||||
|
{
|
||||||
|
struct xtables_target *m = NULL;
|
||||||
|
+#if XTABLES_VERSION_CODE >= 6
|
||||||
|
+ struct ipt_entry fw = {};
|
||||||
|
+#endif
|
||||||
|
struct rtattr *tail;
|
||||||
|
|
||||||
|
int c;
|
||||||
|
@@ -206,7 +209,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
|
||||||
|
default:
|
||||||
|
#if XTABLES_VERSION_CODE >= 6
|
||||||
|
if (m != NULL && m->x6_parse != NULL) {
|
||||||
|
- xtables_option_tpcall(c, argv, 0, m, NULL);
|
||||||
|
+ xtables_option_tpcall(c, argv, 0, m, &fw);
|
||||||
|
#else
|
||||||
|
if (m != NULL && m->parse != NULL) {
|
||||||
|
m->parse(c - m->option_offset, argv, 0,
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
From 2db276543a03633a61ba0815a01c8bb2846830ab Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Thu, 14 Sep 2017 15:30:37 +0200
|
||||||
|
Subject: [PATCH] link_gre6: really support encaplimit option
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1459600
|
||||||
|
Upstream Status: iproute2.git commit a11b7b71a6eba
|
||||||
|
Conflicts: Context change due to missing commit ad4b1425c3182
|
||||||
|
("iplink: Expose IFLA_*_FWMARK attributes for supported link
|
||||||
|
types").
|
||||||
|
|
||||||
|
commit a11b7b71a6eba4ee80e931e4f75321a0cf0116f1
|
||||||
|
Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
|
||||||
|
Date: Wed Jun 14 18:45:42 2017 +0200
|
||||||
|
|
||||||
|
link_gre6: really support encaplimit option
|
||||||
|
|
||||||
|
This option is documented in gre6 help, but was not supported.
|
||||||
|
|
||||||
|
Fixes: af89576d7a8c ("iproute2: GRE over IPv6 tunnel support.")
|
||||||
|
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
|
||||||
|
---
|
||||||
|
ip/link_gre6.c | 12 ++++++++++++
|
||||||
|
1 file changed, 12 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/ip/link_gre6.c b/ip/link_gre6.c
|
||||||
|
index 1b4fb05..76416b2 100644
|
||||||
|
--- a/ip/link_gre6.c
|
||||||
|
+++ b/ip/link_gre6.c
|
||||||
|
@@ -339,6 +339,18 @@ get_failed:
|
||||||
|
encapflags |= TUNNEL_ENCAP_FLAG_REMCSUM;
|
||||||
|
} else if (strcmp(*argv, "noencap-remcsum") == 0) {
|
||||||
|
encapflags &= ~TUNNEL_ENCAP_FLAG_REMCSUM;
|
||||||
|
+ } else if (strcmp(*argv, "encaplimit") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ if (strcmp(*argv, "none") == 0) {
|
||||||
|
+ flags |= IP6_TNL_F_IGN_ENCAP_LIMIT;
|
||||||
|
+ } else {
|
||||||
|
+ __u8 uval;
|
||||||
|
+
|
||||||
|
+ if (get_u8(&uval, *argv, 0) < -1)
|
||||||
|
+ invarg("invalid ELIM", *argv);
|
||||||
|
+ encap_limit = uval;
|
||||||
|
+ flags &= ~IP6_TNL_F_IGN_ENCAP_LIMIT;
|
||||||
|
+ }
|
||||||
|
} else
|
||||||
|
usage();
|
||||||
|
argc--; argv++;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
From beb8e1aa7ed08f86fb87ff58f7c69aaa2b68b862 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Thu, 14 Sep 2017 15:38:46 +0200
|
||||||
|
Subject: [PATCH] tc: fix typo in manpage
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1417162
|
||||||
|
Upstream Status: iproute2.git commit b09515553fded
|
||||||
|
|
||||||
|
commit b09515553fded944713955815a3f1cc855384abd
|
||||||
|
Author: Matteo Croce <mcroce@redhat.com>
|
||||||
|
Date: Fri Jul 7 15:08:33 2017 +0200
|
||||||
|
|
||||||
|
tc: fix typo in manpage
|
||||||
|
|
||||||
|
Fix a typo in the 'tc' manpage and reword some sentences.
|
||||||
|
|
||||||
|
Signed-off-by: Matteo Croce <mcroce@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/tc-csum.8 | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-csum.8 b/man/man8/tc-csum.8
|
||||||
|
index 718301d..409ab71 100644
|
||||||
|
--- a/man/man8/tc-csum.8
|
||||||
|
+++ b/man/man8/tc-csum.8
|
||||||
|
@@ -29,9 +29,9 @@ csum - checksum update action
|
||||||
|
The
|
||||||
|
.B csum
|
||||||
|
action triggers checksum recalculation of specified packet headers. It is
|
||||||
|
-commonly used after packet editing using the
|
||||||
|
+commonly used to fix incorrect checksums after the
|
||||||
|
.B pedit
|
||||||
|
-action to fix for then incorrect checksums.
|
||||||
|
+action has modified the packet content.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.I TARGET
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
From 3b6fd8227cbb03b5b211d2cb53534ad405673668 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matteo Croce <mcroce@redhat.com>
|
||||||
|
Date: Wed, 2 Aug 2017 13:57:17 +0200
|
||||||
|
Subject: [PATCH] ip neigh: allow flush FAILED neighbour entry
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1469945
|
||||||
|
Tested: locally using proper reproducer
|
||||||
|
Upstream Status: merged 37a5f7c5
|
||||||
|
|
||||||
|
commit 37a5f7c571623059ae671992f72feaa444a6ffc8
|
||||||
|
Author: Hangbin Liu <liuhangbin@gmail.com>
|
||||||
|
Date: Fri Jun 16 11:31:52 2017 +0800
|
||||||
|
|
||||||
|
ip neigh: allow flush FAILED neighbour entry
|
||||||
|
|
||||||
|
After upstream commit 5071034e4af7 ('neigh: Really delete an arp/neigh entry
|
||||||
|
on "ip neigh delete" or "arp -d"'), we could delete a single FAILED neighbour
|
||||||
|
entry now. But `ip neigh flush` still skip the FAILED entry.
|
||||||
|
|
||||||
|
Move the filter after first round flush so we can flush FAILED entry on fixed
|
||||||
|
kernel and also do not keep retrying on old kernel.
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||||
|
|
||||||
|
Signed-off-by: Matteo Croce <mcroce@redhat.com>
|
||||||
|
---
|
||||||
|
ip/ipneigh.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/ip/ipneigh.c b/ip/ipneigh.c
|
||||||
|
index 4d8fc85..9c38a60 100644
|
||||||
|
--- a/ip/ipneigh.c
|
||||||
|
+++ b/ip/ipneigh.c
|
||||||
|
@@ -445,7 +445,6 @@ static int do_show_or_flush(int argc, char **argv, int flush)
|
||||||
|
filter.flushb = flushb;
|
||||||
|
filter.flushp = 0;
|
||||||
|
filter.flushe = sizeof(flushb);
|
||||||
|
- filter.state &= ~NUD_FAILED;
|
||||||
|
|
||||||
|
while (round < MAX_ROUNDS) {
|
||||||
|
if (rtnl_dump_request_n(&rth, &req.n) < 0) {
|
||||||
|
@@ -474,6 +473,7 @@ static int do_show_or_flush(int argc, char **argv, int flush)
|
||||||
|
printf("\n*** Round %d, deleting %d entries ***\n", round, filter.flushed);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
+ filter.state &= ~NUD_FAILED;
|
||||||
|
}
|
||||||
|
printf("*** Flush not complete bailing out after %d rounds\n",
|
||||||
|
MAX_ROUNDS);
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
From 74061958f56a4626a3a146c72f16e43012e828f1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Thu, 14 Sep 2017 15:39:23 +0200
|
||||||
|
Subject: [PATCH] netns: avoid directory traversal
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1468529
|
||||||
|
Upstream Status: iproute2.git commit 79928fd0552b5
|
||||||
|
|
||||||
|
commit 79928fd0552b520aa36a22e71144d10a32f7e4fe
|
||||||
|
Author: Matteo Croce <mcroce@redhat.com>
|
||||||
|
Date: Thu Jul 20 00:36:32 2017 +0200
|
||||||
|
|
||||||
|
netns: avoid directory traversal
|
||||||
|
|
||||||
|
ip netns keeps track of created namespaces with bind mounts named
|
||||||
|
/var/run/netns/<namespace>. No input sanitization is done, allowing creation and
|
||||||
|
deletion of files relatives to /var/run/netns or, if the path is non existent or
|
||||||
|
invalid, allows to create "untracked" namespaces (invisible to the tool).
|
||||||
|
|
||||||
|
This commit denies creation or deletion of namespaces with names contaning
|
||||||
|
"/" or matching exactly "." or "..".
|
||||||
|
|
||||||
|
Signed-off-by: Matteo Croce <mcroce@redhat.com>
|
||||||
|
---
|
||||||
|
ip/ipnetns.c | 10 ++++++++++
|
||||||
|
1 file changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/ip/ipnetns.c b/ip/ipnetns.c
|
||||||
|
index 0b0378a..4254994 100644
|
||||||
|
--- a/ip/ipnetns.c
|
||||||
|
+++ b/ip/ipnetns.c
|
||||||
|
@@ -766,6 +766,11 @@ static int netns_monitor(int argc, char **argv)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int invalid_name(const char *name)
|
||||||
|
+{
|
||||||
|
+ return strchr(name, '/') || !strcmp(name, ".") || !strcmp(name, "..");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int do_netns(int argc, char **argv)
|
||||||
|
{
|
||||||
|
netns_nsid_socket_init();
|
||||||
|
@@ -775,6 +780,11 @@ int do_netns(int argc, char **argv)
|
||||||
|
return netns_list(0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (argc > 1 && invalid_name(argv[1])) {
|
||||||
|
+ fprintf(stderr, "Invalid netns name \"%s\"\n", argv[1]);
|
||||||
|
+ exit(-1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if ((matches(*argv, "list") == 0) || (matches(*argv, "show") == 0) ||
|
||||||
|
(matches(*argv, "lst") == 0)) {
|
||||||
|
netns_map_init();
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
From 420957e4c56f65703c6f2f24da0ea35c6b7bbcda Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
Date: Thu, 27 Jul 2017 21:52:30 +0200
|
||||||
|
Subject: [PATCH] utils: return default family when rtm_family is not
|
||||||
|
RTNL_FAMILY_IPMR/IP6MR
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1475762
|
||||||
|
Upstream Status: iproute2.git commit 5ce897a03bfd
|
||||||
|
|
||||||
|
commit 5ce897a03bfda76dc66dc1acfa014fc0e3d3022a
|
||||||
|
Author: Hangbin Liu <liuhangbin@gmail.com>
|
||||||
|
Date: Thu Jul 27 17:44:15 2017 +0800
|
||||||
|
|
||||||
|
utils: return default family when rtm_family is not RTNL_FAMILY_IPMR/IP6MR
|
||||||
|
|
||||||
|
When we get a multicast route, the rtm_type is RTN_MULTICAST, but the
|
||||||
|
rtm_family may be AF_INET. If we only check the type with RTNL_FAMILY_IPMR,
|
||||||
|
we will get malformed address. e.g.
|
||||||
|
|
||||||
|
+ ip -4 route add multicast 172.111.1.1 dev em1 table main
|
||||||
|
|
||||||
|
Before fix:
|
||||||
|
+ ip route list type multicast table main
|
||||||
|
multicast ac6f:101:800:400:400:0:3c00:0 dev em1 scope link
|
||||||
|
|
||||||
|
After fix:
|
||||||
|
+ ip route list type multicast table main
|
||||||
|
multicast 172.111.1.1 dev em1 scope link
|
||||||
|
|
||||||
|
Fixes: 56e3eb4c3400 ("ip: route: fix multicast route dumps")
|
||||||
|
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||||
|
Acked-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
|
||||||
|
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
---
|
||||||
|
lib/utils.c | 8 +++++++-
|
||||||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/utils.c b/lib/utils.c
|
||||||
|
index 7d6ee53..9f55391 100644
|
||||||
|
--- a/lib/utils.c
|
||||||
|
+++ b/lib/utils.c
|
||||||
|
@@ -1219,5 +1219,11 @@ int get_real_family(int rtm_type, int rtm_family)
|
||||||
|
if (rtm_type != RTN_MULTICAST)
|
||||||
|
return rtm_family;
|
||||||
|
|
||||||
|
- return rtm_family == RTNL_FAMILY_IPMR ? AF_INET : AF_INET6;
|
||||||
|
+ if (rtm_family == RTNL_FAMILY_IPMR)
|
||||||
|
+ return AF_INET;
|
||||||
|
+
|
||||||
|
+ if (rtm_family == RTNL_FAMILY_IP6MR)
|
||||||
|
+ return AF_INET6;
|
||||||
|
+
|
||||||
|
+ return rtm_family;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
From 449517f7769dde4905564ce17e126bfd4e1f7147 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 6 Oct 2017 17:27:09 +0200
|
||||||
|
Subject: [PATCH] link_gre6: Fix for changing tclass/flowlabel
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1487486
|
||||||
|
Upstream Status: iproute2.git commit e7fefb3214b5a
|
||||||
|
|
||||||
|
commit e7fefb3214b5a1ed030cab9df513560c503a9851
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Fri Sep 1 16:08:08 2017 +0200
|
||||||
|
|
||||||
|
link_gre6: Fix for changing tclass/flowlabel
|
||||||
|
|
||||||
|
When trying to change tclass or flowlabel of a GREv6 tunnel which has
|
||||||
|
the respective value set already, the code accidentally bitwise OR'ed
|
||||||
|
the old and the new value, leading to unexpected results. Fix this by
|
||||||
|
clearing the relevant bits of flowinfo variable prior to assigning the
|
||||||
|
new value.
|
||||||
|
|
||||||
|
Fixes: af89576d7a8c4 ("iproute2: GRE over IPv6 tunnel support.")
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
ip/link_gre6.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/ip/link_gre6.c b/ip/link_gre6.c
|
||||||
|
index 76416b2..fe3ab64 100644
|
||||||
|
--- a/ip/link_gre6.c
|
||||||
|
+++ b/ip/link_gre6.c
|
||||||
|
@@ -282,6 +282,7 @@ get_failed:
|
||||||
|
else {
|
||||||
|
if (get_u8(&uval, *argv, 16))
|
||||||
|
invarg("invalid TClass", *argv);
|
||||||
|
+ flowinfo &= ~IP6_FLOWINFO_TCLASS;
|
||||||
|
flowinfo |= htonl((__u32)uval << 20) & IP6_FLOWINFO_TCLASS;
|
||||||
|
flags &= ~IP6_TNL_F_USE_ORIG_TCLASS;
|
||||||
|
}
|
||||||
|
@@ -297,6 +298,7 @@ get_failed:
|
||||||
|
invarg("invalid Flowlabel", *argv);
|
||||||
|
if (uval > 0xFFFFF)
|
||||||
|
invarg("invalid Flowlabel", *argv);
|
||||||
|
+ flowinfo &= ~IP6_FLOWINFO_FLOWLABEL;
|
||||||
|
flowinfo |= htonl(uval) & IP6_FLOWINFO_FLOWLABEL;
|
||||||
|
flags &= ~IP6_TNL_F_USE_ORIG_FLOWLABEL;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
From 61ccf0f453306e727e254e6de1641bb934a3b7ec Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hangbin Liu <haliu@redhat.com>
|
||||||
|
Date: Wed, 8 Nov 2017 14:39:07 +0800
|
||||||
|
Subject: [PATCH] netlink: Change rtnl_dump_done to always show error
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
|
||||||
|
Upstream Status: iproute2.git commit 05a14fc12188
|
||||||
|
|
||||||
|
commit 05a14fc1218885ba6236b409fbf6b89976b8636e
|
||||||
|
Author: David Ahern <dsahern@gmail.com>
|
||||||
|
Date: Tue May 16 14:22:46 2017 -0700
|
||||||
|
|
||||||
|
netlink: Change rtnl_dump_done to always show error
|
||||||
|
|
||||||
|
The original code which became rtnl_dump_done only shows netlink errors
|
||||||
|
if the protocol is NETLINK_SOCK_DIAG, but netlink dumps always appends
|
||||||
|
the length which contains any error encountered during the dump. Update
|
||||||
|
rtnl_dump_done to always show the error if there is one.
|
||||||
|
|
||||||
|
As an *example* without this patch, dumping a route object that exceeds
|
||||||
|
the internal buffer size terminates with no message to the user -- the
|
||||||
|
dump just ends because the NLMSG_DONE attribute was received. With this
|
||||||
|
patch the user at least gets a message that the dump was aborted.
|
||||||
|
|
||||||
|
$ ip ro ls
|
||||||
|
default via 10.0.2.2 dev eth0
|
||||||
|
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
|
||||||
|
10.10.0.0/16 dev veth1 proto kernel scope link src 10.10.0.1
|
||||||
|
172.16.1.0/24 dev br0.11 proto kernel scope link src 172.16.1.1
|
||||||
|
Error: Buffer too small for object
|
||||||
|
Dump terminated
|
||||||
|
|
||||||
|
The point of this patch is to notify the user of a failure versus
|
||||||
|
silently exiting on a partial dump. Because the NLMSG_DONE attribute
|
||||||
|
was received, the entire dump needs to be restarted to use a larger
|
||||||
|
buffer for EMSGSIZE errors. That could be done automatically but it
|
||||||
|
has other user impacts (e.g., duplicate output if the dump is
|
||||||
|
restarted) and should be the subject of a different patch.
|
||||||
|
|
||||||
|
Signed-off-by: David Ahern <dsahern@gmail.com>
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <haliu@redhat.com>
|
||||||
|
---
|
||||||
|
lib/libnetlink.c | 28 +++++++++++++++++-----------
|
||||||
|
1 file changed, 17 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
|
||||||
|
index 9303b66..e91bd5a 100644
|
||||||
|
--- a/lib/libnetlink.c
|
||||||
|
+++ b/lib/libnetlink.c
|
||||||
|
@@ -266,21 +266,27 @@ static int rtnl_dump_done(const struct rtnl_handle *rth,
|
||||||
|
{
|
||||||
|
int len = *(int *)NLMSG_DATA(h);
|
||||||
|
|
||||||
|
- if (rth->proto == NETLINK_SOCK_DIAG) {
|
||||||
|
- if (h->nlmsg_len < NLMSG_LENGTH(sizeof(int))) {
|
||||||
|
- fprintf(stderr, "DONE truncated\n");
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ if (h->nlmsg_len < NLMSG_LENGTH(sizeof(int))) {
|
||||||
|
+ fprintf(stderr, "DONE truncated\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (len < 0) {
|
||||||
|
- errno = -len;
|
||||||
|
- if (errno == ENOENT || errno == EOPNOTSUPP)
|
||||||
|
- return -1;
|
||||||
|
+ if (len < 0) {
|
||||||
|
+ errno = -len;
|
||||||
|
+ switch (errno) {
|
||||||
|
+ case ENOENT:
|
||||||
|
+ case EOPNOTSUPP:
|
||||||
|
+ return -1;
|
||||||
|
+ case EMSGSIZE:
|
||||||
|
+ fprintf(stderr,
|
||||||
|
+ "Error: Buffer too small for object.\n");
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
perror("RTNETLINK answers");
|
||||||
|
- return len;
|
||||||
|
}
|
||||||
|
+ return len;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
From 9346e08c2f9059decf889fb89f2859e7ed61f573 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hangbin Liu <haliu@redhat.com>
|
||||||
|
Date: Wed, 8 Nov 2017 14:39:08 +0800
|
||||||
|
Subject: [PATCH] libnetlink: drop unused parameter to rtnl_dump_done
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
|
||||||
|
Upstream Status: iproute2.git commit 0efa625765b4
|
||||||
|
|
||||||
|
commit 0efa625765b4481e1e474526eb0feda747b720e5
|
||||||
|
Author: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
Date: Thu Aug 24 15:02:32 2017 -0700
|
||||||
|
|
||||||
|
libnetlink: drop unused parameter to rtnl_dump_done
|
||||||
|
|
||||||
|
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <haliu@redhat.com>
|
||||||
|
---
|
||||||
|
lib/libnetlink.c | 5 ++---
|
||||||
|
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
|
||||||
|
index e91bd5a..b08518d 100644
|
||||||
|
--- a/lib/libnetlink.c
|
||||||
|
+++ b/lib/libnetlink.c
|
||||||
|
@@ -261,8 +261,7 @@ int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n)
|
||||||
|
return sendmsg(rth->fd, &msg, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int rtnl_dump_done(const struct rtnl_handle *rth,
|
||||||
|
- struct nlmsghdr *h)
|
||||||
|
+static int rtnl_dump_done(struct nlmsghdr *h)
|
||||||
|
{
|
||||||
|
int len = *(int *)NLMSG_DATA(h);
|
||||||
|
|
||||||
|
@@ -368,7 +367,7 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
|
dump_intr = 1;
|
||||||
|
|
||||||
|
if (h->nlmsg_type == NLMSG_DONE) {
|
||||||
|
- err = rtnl_dump_done(rth, h);
|
||||||
|
+ err = rtnl_dump_done(h);
|
||||||
|
if (err < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,255 @@
|
||||||
|
From a9f81b704c4e883a996927e77afdb960a7f47fd9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hangbin Liu <haliu@redhat.com>
|
||||||
|
Date: Wed, 8 Nov 2017 14:39:09 +0800
|
||||||
|
Subject: [PATCH] iproute: Add support for extended ack to rtnl_talk
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
|
||||||
|
Upstream Status: iproute2.git commit b6432e68ac2f
|
||||||
|
Conflicts: Manually added NETLINK_EXT_ACK define to linux headers.
|
||||||
|
|
||||||
|
commit b6432e68ac2f1f6b4ea50aa0d6d47e72c445c71c
|
||||||
|
Author: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
Date: Fri Aug 4 09:52:15 2017 -0700
|
||||||
|
|
||||||
|
iproute: Add support for extended ack to rtnl_talk
|
||||||
|
|
||||||
|
Add support for extended ack error reporting via libmnl.
|
||||||
|
Add a new function rtnl_talk_extack that takes a callback as an input
|
||||||
|
arg. If a netlink response contains extack attributes, the callback is
|
||||||
|
is invoked with the the err string, offset in the message and a pointer
|
||||||
|
to the message returned by the kernel.
|
||||||
|
|
||||||
|
If iproute2 is built without libmnl, it will still work but
|
||||||
|
extended error reports from kernel will not be available.
|
||||||
|
|
||||||
|
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <haliu@redhat.com>
|
||||||
|
|
||||||
|
squash! iproute: Add support for extended ack to rtnl_talk
|
||||||
|
---
|
||||||
|
include/libnetlink.h | 6 +++
|
||||||
|
include/linux/netlink.h | 1 +
|
||||||
|
lib/Makefile | 7 ++++
|
||||||
|
lib/libnetlink.c | 109 ++++++++++++++++++++++++++++++++++++++++++++----
|
||||||
|
4 files changed, 116 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/libnetlink.h b/include/libnetlink.h
|
||||||
|
index bd0267d..654aebc 100644
|
||||||
|
--- a/include/libnetlink.h
|
||||||
|
+++ b/include/libnetlink.h
|
||||||
|
@@ -65,6 +65,9 @@ typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *,
|
||||||
|
struct rtnl_ctrl_data *,
|
||||||
|
struct nlmsghdr *n, void *);
|
||||||
|
|
||||||
|
+typedef int (*nl_ext_ack_fn_t)(const char *errmsg, uint32_t off,
|
||||||
|
+ const struct nlmsghdr *inner_nlh);
|
||||||
|
+
|
||||||
|
struct rtnl_dump_filter_arg {
|
||||||
|
rtnl_filter_t filter;
|
||||||
|
void *arg1;
|
||||||
|
@@ -81,6 +84,9 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth,
|
||||||
|
int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
struct nlmsghdr *answer, size_t len)
|
||||||
|
__attribute__((warn_unused_result));
|
||||||
|
+int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
+ struct nlmsghdr *answer, size_t len, nl_ext_ack_fn_t errfn)
|
||||||
|
+ __attribute__((warn_unused_result));
|
||||||
|
int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
struct nlmsghdr *answer, size_t len)
|
||||||
|
__attribute__((warn_unused_result));
|
||||||
|
diff --git a/include/linux/netlink.h b/include/linux/netlink.h
|
||||||
|
index a982b3c..d1e26a2 100644
|
||||||
|
--- a/include/linux/netlink.h
|
||||||
|
+++ b/include/linux/netlink.h
|
||||||
|
@@ -113,6 +113,7 @@ struct nlmsgerr {
|
||||||
|
#define NETLINK_LISTEN_ALL_NSID 8
|
||||||
|
#define NETLINK_LIST_MEMBERSHIPS 9
|
||||||
|
#define NETLINK_CAP_ACK 10
|
||||||
|
+#define NETLINK_EXT_ACK 11
|
||||||
|
|
||||||
|
struct nl_pktinfo {
|
||||||
|
__u32 group;
|
||||||
|
diff --git a/lib/Makefile b/lib/Makefile
|
||||||
|
index 1d24ca2..f81888c 100644
|
||||||
|
--- a/lib/Makefile
|
||||||
|
+++ b/lib/Makefile
|
||||||
|
@@ -4,6 +4,13 @@ ifeq ($(IP_CONFIG_SETNS),y)
|
||||||
|
CFLAGS += -DHAVE_SETNS
|
||||||
|
endif
|
||||||
|
|
||||||
|
+ifeq ($(HAVE_MNL),y)
|
||||||
|
+ CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags)
|
||||||
|
+ LDLIBS += $(shell $(PKG_CONFIG) libmnl --libs)
|
||||||
|
+else
|
||||||
|
+@warn "libmnl required for error support"
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
CFLAGS += -fPIC
|
||||||
|
|
||||||
|
UTILOBJ = utils.o rt_names.o ll_types.o ll_proto.o ll_addr.o \
|
||||||
|
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
|
||||||
|
index b08518d..a057831 100644
|
||||||
|
--- a/lib/libnetlink.c
|
||||||
|
+++ b/lib/libnetlink.c
|
||||||
|
@@ -36,6 +36,79 @@
|
||||||
|
|
||||||
|
int rcvbuf = 1024 * 1024;
|
||||||
|
|
||||||
|
+#ifdef HAVE_LIBMNL
|
||||||
|
+#include <libmnl/libmnl.h>
|
||||||
|
+
|
||||||
|
+static const enum mnl_attr_data_type extack_policy[NLMSGERR_ATTR_MAX + 1] = {
|
||||||
|
+ [NLMSGERR_ATTR_MSG] = MNL_TYPE_NUL_STRING,
|
||||||
|
+ [NLMSGERR_ATTR_OFFS] = MNL_TYPE_U32,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int err_attr_cb(const struct nlattr *attr, void *data)
|
||||||
|
+{
|
||||||
|
+ const struct nlattr **tb = data;
|
||||||
|
+ uint16_t type;
|
||||||
|
+
|
||||||
|
+ if (mnl_attr_type_valid(attr, NLMSGERR_ATTR_MAX) < 0)
|
||||||
|
+ return MNL_CB_ERROR;
|
||||||
|
+
|
||||||
|
+ type = mnl_attr_get_type(attr);
|
||||||
|
+ if (mnl_attr_validate(attr, extack_policy[type]) < 0)
|
||||||
|
+ return MNL_CB_ERROR;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ tb[type] = attr;
|
||||||
|
+ return MNL_CB_OK;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* dump netlink extended ack error message */
|
||||||
|
+static int nl_dump_ext_err(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn)
|
||||||
|
+{
|
||||||
|
+ struct nlattr *tb[NLMSGERR_ATTR_MAX + 1];
|
||||||
|
+ const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh);
|
||||||
|
+ const struct nlmsghdr *err_nlh = NULL;
|
||||||
|
+ unsigned int hlen = sizeof(*err);
|
||||||
|
+ const char *errmsg = NULL;
|
||||||
|
+ uint32_t off = 0;
|
||||||
|
+
|
||||||
|
+ if (!errfn)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* no TLVs, nothing to do here */
|
||||||
|
+ if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* if NLM_F_CAPPED is set then the inner err msg was capped */
|
||||||
|
+ if (!(nlh->nlmsg_flags & NLM_F_CAPPED))
|
||||||
|
+ hlen += mnl_nlmsg_get_payload_len(&err->msg);
|
||||||
|
+
|
||||||
|
+ mnl_attr_parse(nlh, hlen, err_attr_cb, tb);
|
||||||
|
+
|
||||||
|
+ if (tb[NLMSGERR_ATTR_MSG])
|
||||||
|
+ errmsg = mnl_attr_get_str(tb[NLMSGERR_ATTR_MSG]);
|
||||||
|
+
|
||||||
|
+ if (tb[NLMSGERR_ATTR_OFFS]) {
|
||||||
|
+ off = mnl_attr_get_u32(tb[NLMSGERR_ATTR_OFFS]);
|
||||||
|
+
|
||||||
|
+ if (off > nlh->nlmsg_len) {
|
||||||
|
+ fprintf(stderr,
|
||||||
|
+ "Invalid offset for NLMSGERR_ATTR_OFFS\n");
|
||||||
|
+ off = 0;
|
||||||
|
+ } else if (!(nlh->nlmsg_flags & NLM_F_CAPPED))
|
||||||
|
+ err_nlh = &err->msg;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return errfn(errmsg, off, err_nlh);
|
||||||
|
+}
|
||||||
|
+#else
|
||||||
|
+/* No extended error ack without libmnl */
|
||||||
|
+static int nl_dump_ext_err(const struct nlmsghdr *nlh, nl_ext_ack_fn_t errfn)
|
||||||
|
+{
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
void rtnl_close(struct rtnl_handle *rth)
|
||||||
|
{
|
||||||
|
if (rth->fd >= 0) {
|
||||||
|
@@ -49,6 +122,7 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
|
||||||
|
{
|
||||||
|
socklen_t addr_len;
|
||||||
|
int sndbuf = 32768;
|
||||||
|
+ int one = 1;
|
||||||
|
|
||||||
|
memset(rth, 0, sizeof(*rth));
|
||||||
|
|
||||||
|
@@ -71,6 +145,10 @@ int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Older kernels may no support extended ACK reporting */
|
||||||
|
+ setsockopt(rth->fd, SOL_NETLINK, NETLINK_EXT_ACK,
|
||||||
|
+ &one, sizeof(one));
|
||||||
|
+
|
||||||
|
memset(&rth->local, 0, sizeof(rth->local));
|
||||||
|
rth->local.nl_family = AF_NETLINK;
|
||||||
|
rth->local.nl_groups = subscriptions;
|
||||||
|
@@ -421,9 +499,19 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth,
|
||||||
|
return rtnl_dump_filter_l(rth, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void rtnl_talk_error(struct nlmsghdr *h, struct nlmsgerr *err,
|
||||||
|
+ nl_ext_ack_fn_t errfn)
|
||||||
|
+{
|
||||||
|
+ if (nl_dump_ext_err(h, errfn))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ fprintf(stderr, "RTNETLINK answers: %s\n",
|
||||||
|
+ strerror(-err->error));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
struct nlmsghdr *answer, size_t maxlen,
|
||||||
|
- bool show_rtnl_err)
|
||||||
|
+ bool show_rtnl_err, nl_ext_ack_fn_t errfn)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
unsigned int seq;
|
||||||
|
@@ -510,10 +598,10 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (rtnl->proto != NETLINK_SOCK_DIAG && show_rtnl_err)
|
||||||
|
- fprintf(stderr,
|
||||||
|
- "RTNETLINK answers: %s\n",
|
||||||
|
- strerror(-err->error));
|
||||||
|
+ if (rtnl->proto != NETLINK_SOCK_DIAG &&
|
||||||
|
+ show_rtnl_err)
|
||||||
|
+ rtnl_talk_error(h, err, errfn);
|
||||||
|
+
|
||||||
|
errno = -err->error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -545,13 +633,20 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
struct nlmsghdr *answer, size_t maxlen)
|
||||||
|
{
|
||||||
|
- return __rtnl_talk(rtnl, n, answer, maxlen, true);
|
||||||
|
+ return __rtnl_talk(rtnl, n, answer, maxlen, true, NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
+ struct nlmsghdr *answer, size_t maxlen,
|
||||||
|
+ nl_ext_ack_fn_t errfn)
|
||||||
|
+{
|
||||||
|
+ return __rtnl_talk(rtnl, n, answer, maxlen, true, errfn);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
struct nlmsghdr *answer, size_t maxlen)
|
||||||
|
{
|
||||||
|
- return __rtnl_talk(rtnl, n, answer, maxlen, false);
|
||||||
|
+ return __rtnl_talk(rtnl, n, answer, maxlen, false, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtnl_listen_all_nsid(struct rtnl_handle *rth)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
From 8372b7bb8f7211563d888fdd30e473c161f7d0a0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hangbin Liu <haliu@redhat.com>
|
||||||
|
Date: Wed, 8 Nov 2017 14:39:10 +0800
|
||||||
|
Subject: [PATCH] iplink: check for message truncation in iplink_get()
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
|
||||||
|
Upstream Status: iproute2.git commit 6599162b958e
|
||||||
|
|
||||||
|
commit 6599162b958ea5a43d729df4f30aad515db26ff4
|
||||||
|
Author: Michal Kubecek <mkubecek@suse.cz>
|
||||||
|
Date: Fri Sep 1 18:39:11 2017 +0200
|
||||||
|
|
||||||
|
iplink: check for message truncation in iplink_get()
|
||||||
|
|
||||||
|
If message length exceeds maxlen argument of rtnl_talk(), it is truncated
|
||||||
|
to maxlen but unlike in the case of truncation to the length of local
|
||||||
|
buffer in rtnl_talk(), the caller doesn't get any indication of a problem.
|
||||||
|
|
||||||
|
In particular, iplink_get() passes the truncated message on and parsing it
|
||||||
|
results in various warnings and sometimes even a segfault (observed with
|
||||||
|
"ip link show dev ..." for a NIC with 125 VFs).
|
||||||
|
|
||||||
|
Handle message truncation in iplink_get() the same way as truncation in
|
||||||
|
rtnl_talk() would be handled: return an error.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <haliu@redhat.com>
|
||||||
|
---
|
||||||
|
ip/iplink.c | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/ip/iplink.c b/ip/iplink.c
|
||||||
|
index da3f9a7..2b2421f 100644
|
||||||
|
--- a/ip/iplink.c
|
||||||
|
+++ b/ip/iplink.c
|
||||||
|
@@ -1031,6 +1031,11 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
|
||||||
|
|
||||||
|
if (rtnl_talk(&rth, &req.n, &answer.n, sizeof(answer)) < 0)
|
||||||
|
return -2;
|
||||||
|
+ if (answer.n.nlmsg_len > sizeof(answer.buf)) {
|
||||||
|
+ fprintf(stderr, "Message truncated from %u to %lu\n",
|
||||||
|
+ answer.n.nlmsg_len, sizeof(answer.buf));
|
||||||
|
+ return -2;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (brief)
|
||||||
|
print_linkinfo_brief(NULL, &answer.n, stdout);
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
From c560900fc16eeac064cc7c43a96c5343fe68ae76 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hangbin Liu <haliu@redhat.com>
|
||||||
|
Date: Wed, 8 Nov 2017 14:39:11 +0800
|
||||||
|
Subject: [PATCH] iplink: double the buffer size also in iplink_get()
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
|
||||||
|
Upstream Status: iproute2.git commit 460c03f3f3cc
|
||||||
|
|
||||||
|
commit 460c03f3f3cc436ff4673d75722ba68a6ec9343d
|
||||||
|
Author: Michal Kubecek <mkubecek@suse.cz>
|
||||||
|
Date: Fri Sep 1 18:39:16 2017 +0200
|
||||||
|
|
||||||
|
iplink: double the buffer size also in iplink_get()
|
||||||
|
|
||||||
|
Commit 72b365e8e0fd ("libnetlink: Double the dump buffer size") increased
|
||||||
|
the buffer size for "ip link show" command to 32 KB to handle NICs with
|
||||||
|
large number of VFs. With "dev" filter, a different code path is taken and
|
||||||
|
iplink_get() still uses only 16 KB buffer.
|
||||||
|
|
||||||
|
The size of 32768 is not very future-proof as NICs supporting 120-128 VFs
|
||||||
|
are already in use so that single RTM_NEWLINK message in the dump can
|
||||||
|
exceed 30000 bytes. But it's what rtnl_talk() and rtnl_dump_filter_l() use
|
||||||
|
so let's be consistent. Once this proves insufficient, all three sizes
|
||||||
|
should be increased.
|
||||||
|
|
||||||
|
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <haliu@redhat.com>
|
||||||
|
---
|
||||||
|
ip/iplink.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/ip/iplink.c b/ip/iplink.c
|
||||||
|
index 2b2421f..5afbadf 100644
|
||||||
|
--- a/ip/iplink.c
|
||||||
|
+++ b/ip/iplink.c
|
||||||
|
@@ -1015,7 +1015,7 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
|
||||||
|
};
|
||||||
|
struct {
|
||||||
|
struct nlmsghdr n;
|
||||||
|
- char buf[16384];
|
||||||
|
+ char buf[32768];
|
||||||
|
} answer;
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,252 @@
|
||||||
|
From 49e7c0e7c8c9a982fd3aa69bbed4e306a1dcb331 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hangbin Liu <haliu@redhat.com>
|
||||||
|
Date: Wed, 8 Nov 2017 14:39:12 +0800
|
||||||
|
Subject: [PATCH] lib/libnetlink: re malloc buff if size is not enough
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803
|
||||||
|
Upstream Status: iproute2.git net-next commit 2d34851cd341
|
||||||
|
|
||||||
|
commit 2d34851cd341f0e1b3fc17ca3e6e874229f3a1f8
|
||||||
|
Author: Hangbin Liu <liuhangbin@gmail.com>
|
||||||
|
Date: Thu Oct 26 09:41:46 2017 +0800
|
||||||
|
|
||||||
|
lib/libnetlink: re malloc buff if size is not enough
|
||||||
|
|
||||||
|
With commit 72b365e8e0fd ("libnetlink: Double the dump buffer size")
|
||||||
|
we doubled the buffer size to support more VFs. But the VFs number is
|
||||||
|
increasing all the time. Some customers even use more than 200 VFs now.
|
||||||
|
|
||||||
|
We could not double it everytime when the buffer is not enough. Let's just
|
||||||
|
not hard code the buffer size and malloc the correct number when running.
|
||||||
|
|
||||||
|
Introduce function rtnl_recvmsg() to always return a newly allocated buffer.
|
||||||
|
The caller need to free it after using.
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
|
||||||
|
Signed-off-by: Hangbin Liu <haliu@redhat.com>
|
||||||
|
---
|
||||||
|
lib/libnetlink.c | 114 ++++++++++++++++++++++++++++++++++++++-----------------
|
||||||
|
1 file changed, 80 insertions(+), 34 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
|
||||||
|
index a057831..446c960 100644
|
||||||
|
--- a/lib/libnetlink.c
|
||||||
|
+++ b/lib/libnetlink.c
|
||||||
|
@@ -386,6 +386,64 @@ static void rtnl_dump_error(const struct rtnl_handle *rth,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int __rtnl_recvmsg(int fd, struct msghdr *msg, int flags)
|
||||||
|
+{
|
||||||
|
+ int len;
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ len = recvmsg(fd, msg, flags);
|
||||||
|
+ } while (len < 0 && (errno == EINTR || errno == EAGAIN));
|
||||||
|
+
|
||||||
|
+ if (len < 0) {
|
||||||
|
+ fprintf(stderr, "netlink receive error %s (%d)\n",
|
||||||
|
+ strerror(errno), errno);
|
||||||
|
+ return -errno;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (len == 0) {
|
||||||
|
+ fprintf(stderr, "EOF on netlink\n");
|
||||||
|
+ return -ENODATA;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int rtnl_recvmsg(int fd, struct msghdr *msg, char **answer)
|
||||||
|
+{
|
||||||
|
+ struct iovec *iov = msg->msg_iov;
|
||||||
|
+ char *buf;
|
||||||
|
+ int len;
|
||||||
|
+
|
||||||
|
+ iov->iov_base = NULL;
|
||||||
|
+ iov->iov_len = 0;
|
||||||
|
+
|
||||||
|
+ len = __rtnl_recvmsg(fd, msg, MSG_PEEK | MSG_TRUNC);
|
||||||
|
+ if (len < 0)
|
||||||
|
+ return len;
|
||||||
|
+
|
||||||
|
+ buf = malloc(len);
|
||||||
|
+ if (!buf) {
|
||||||
|
+ fprintf(stderr, "malloc error: not enough buffer\n");
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ iov->iov_base = buf;
|
||||||
|
+ iov->iov_len = len;
|
||||||
|
+
|
||||||
|
+ len = __rtnl_recvmsg(fd, msg, 0);
|
||||||
|
+ if (len < 0) {
|
||||||
|
+ free(buf);
|
||||||
|
+ return len;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (answer)
|
||||||
|
+ *answer = buf;
|
||||||
|
+ else
|
||||||
|
+ free(buf);
|
||||||
|
+
|
||||||
|
+ return len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
|
const struct rtnl_dump_filter_arg *arg)
|
||||||
|
{
|
||||||
|
@@ -397,31 +455,18 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
|
.msg_iov = &iov,
|
||||||
|
.msg_iovlen = 1,
|
||||||
|
};
|
||||||
|
- char buf[32768];
|
||||||
|
+ char *buf;
|
||||||
|
int dump_intr = 0;
|
||||||
|
|
||||||
|
- iov.iov_base = buf;
|
||||||
|
while (1) {
|
||||||
|
int status;
|
||||||
|
const struct rtnl_dump_filter_arg *a;
|
||||||
|
int found_done = 0;
|
||||||
|
int msglen = 0;
|
||||||
|
|
||||||
|
- iov.iov_len = sizeof(buf);
|
||||||
|
- status = recvmsg(rth->fd, &msg, 0);
|
||||||
|
-
|
||||||
|
- if (status < 0) {
|
||||||
|
- if (errno == EINTR || errno == EAGAIN)
|
||||||
|
- continue;
|
||||||
|
- fprintf(stderr, "netlink receive error %s (%d)\n",
|
||||||
|
- strerror(errno), errno);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (status == 0) {
|
||||||
|
- fprintf(stderr, "EOF on netlink\n");
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
+ status = rtnl_recvmsg(rth->fd, &msg, &buf);
|
||||||
|
+ if (status < 0)
|
||||||
|
+ return status;
|
||||||
|
|
||||||
|
if (rth->dump_fp)
|
||||||
|
fwrite(buf, 1, NLMSG_ALIGN(status), rth->dump_fp);
|
||||||
|
@@ -446,8 +491,10 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
|
|
||||||
|
if (h->nlmsg_type == NLMSG_DONE) {
|
||||||
|
err = rtnl_dump_done(h);
|
||||||
|
- if (err < 0)
|
||||||
|
+ if (err < 0) {
|
||||||
|
+ free(buf);
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
found_done = 1;
|
||||||
|
break; /* process next filter */
|
||||||
|
@@ -455,19 +502,23 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
|
||||||
|
|
||||||
|
if (h->nlmsg_type == NLMSG_ERROR) {
|
||||||
|
rtnl_dump_error(rth, h);
|
||||||
|
+ free(buf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rth->dump_fp) {
|
||||||
|
err = a->filter(&nladdr, h, a->arg1);
|
||||||
|
- if (err < 0)
|
||||||
|
+ if (err < 0) {
|
||||||
|
+ free(buf);
|
||||||
|
return err;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
skip_it:
|
||||||
|
h = NLMSG_NEXT(h, msglen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ free(buf);
|
||||||
|
|
||||||
|
if (found_done) {
|
||||||
|
if (dump_intr)
|
||||||
|
@@ -527,7 +578,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
.msg_iov = &iov,
|
||||||
|
.msg_iovlen = 1,
|
||||||
|
};
|
||||||
|
- char buf[32768] = {};
|
||||||
|
+ char *buf;
|
||||||
|
|
||||||
|
n->nlmsg_seq = seq = ++rtnl->seq;
|
||||||
|
|
||||||
|
@@ -540,22 +591,12 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- iov.iov_base = buf;
|
||||||
|
while (1) {
|
||||||
|
- iov.iov_len = sizeof(buf);
|
||||||
|
- status = recvmsg(rtnl->fd, &msg, 0);
|
||||||
|
+ status = rtnl_recvmsg(rtnl->fd, &msg, &buf);
|
||||||
|
+
|
||||||
|
+ if (status < 0)
|
||||||
|
+ return status;
|
||||||
|
|
||||||
|
- if (status < 0) {
|
||||||
|
- if (errno == EINTR || errno == EAGAIN)
|
||||||
|
- continue;
|
||||||
|
- fprintf(stderr, "netlink receive error %s (%d)\n",
|
||||||
|
- strerror(errno), errno);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- if (status == 0) {
|
||||||
|
- fprintf(stderr, "EOF on netlink\n");
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
if (msg.msg_namelen != sizeof(nladdr)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"sender address length == %d\n",
|
||||||
|
@@ -569,6 +610,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
if (l < 0 || len > status) {
|
||||||
|
if (msg.msg_flags & MSG_TRUNC) {
|
||||||
|
fprintf(stderr, "Truncated message\n");
|
||||||
|
+ free(buf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
fprintf(stderr,
|
||||||
|
@@ -595,6 +637,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
if (answer)
|
||||||
|
memcpy(answer, h,
|
||||||
|
MIN(maxlen, h->nlmsg_len));
|
||||||
|
+ free(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -603,12 +646,14 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
rtnl_talk_error(h, err, errfn);
|
||||||
|
|
||||||
|
errno = -err->error;
|
||||||
|
+ free(buf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (answer) {
|
||||||
|
memcpy(answer, h,
|
||||||
|
MIN(maxlen, h->nlmsg_len));
|
||||||
|
+ free(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -617,6 +662,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
|
||||||
|
status -= NLMSG_ALIGN(len);
|
||||||
|
h = (struct nlmsghdr *)((char *)h + NLMSG_ALIGN(len));
|
||||||
|
}
|
||||||
|
+ free(buf);
|
||||||
|
|
||||||
|
if (msg.msg_flags & MSG_TRUNC) {
|
||||||
|
fprintf(stderr, "Message truncated\n");
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,151 @@
|
||||||
|
From 56a3a027d053ab592a3363a92108c93c150301f5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] devlink: Change netlink attribute validation
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit 4f10cede93b758785f5b201774ed3e02eaf1a7bb
|
||||||
|
Author: Arkadi Sharshevsky <arkadis@mellanox.com>
|
||||||
|
Date: Wed May 3 13:25:22 2017 +0200
|
||||||
|
|
||||||
|
devlink: Change netlink attribute validation
|
||||||
|
|
||||||
|
Currently the netlink attribute resolving is done by a sequence of
|
||||||
|
if's. Change the attribute resolving to table lookup.
|
||||||
|
|
||||||
|
Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
|
||||||
|
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
Reviewed-by: Greg Rose <gvrose8192@gmail.com>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
devlink/devlink.c | 103 ++++++++++++++++--------------------------------------
|
||||||
|
1 file changed, 30 insertions(+), 73 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/devlink/devlink.c b/devlink/devlink.c
|
||||||
|
index e90226e..35220d8 100644
|
||||||
|
--- a/devlink/devlink.c
|
||||||
|
+++ b/devlink/devlink.c
|
||||||
|
@@ -232,88 +232,45 @@ static bool dl_no_arg(struct dl *dl)
|
||||||
|
return dl_argc(dl) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
|
||||||
|
+ [DEVLINK_ATTR_BUS_NAME] = MNL_TYPE_NUL_STRING,
|
||||||
|
+ [DEVLINK_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
|
||||||
|
+ [DEVLINK_ATTR_PORT_INDEX] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_PORT_TYPE] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_PORT_DESIRED_TYPE] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_PORT_NETDEV_IFINDEX] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_PORT_NETDEV_NAME] = MNL_TYPE_NUL_STRING,
|
||||||
|
+ [DEVLINK_ATTR_PORT_IBDEV_NAME] = MNL_TYPE_NUL_STRING,
|
||||||
|
+ [DEVLINK_ATTR_SB_INDEX] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_SB_SIZE] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_SB_INGRESS_POOL_COUNT] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_SB_EGRESS_POOL_COUNT] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_SB_INGRESS_TC_COUNT] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_SB_EGRESS_TC_COUNT] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_SB_POOL_INDEX] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_SB_POOL_TYPE] = MNL_TYPE_U8,
|
||||||
|
+ [DEVLINK_ATTR_SB_POOL_SIZE] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE] = MNL_TYPE_U8,
|
||||||
|
+ [DEVLINK_ATTR_SB_THRESHOLD] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_SB_TC_INDEX] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_SB_OCC_CUR] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_SB_OCC_MAX] = MNL_TYPE_U32,
|
||||||
|
+ [DEVLINK_ATTR_ESWITCH_MODE] = MNL_TYPE_U16,
|
||||||
|
+ [DEVLINK_ATTR_ESWITCH_INLINE_MODE] = MNL_TYPE_U8,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int attr_cb(const struct nlattr *attr, void *data)
|
||||||
|
{
|
||||||
|
const struct nlattr **tb = data;
|
||||||
|
int type;
|
||||||
|
|
||||||
|
- type = mnl_attr_get_type(attr);
|
||||||
|
-
|
||||||
|
if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
|
||||||
|
return MNL_CB_ERROR;
|
||||||
|
|
||||||
|
- if (type == DEVLINK_ATTR_BUS_NAME &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_DEV_NAME &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_PORT_INDEX &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_PORT_TYPE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_PORT_DESIRED_TYPE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_PORT_NETDEV_IFINDEX &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_PORT_NETDEV_NAME &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_PORT_IBDEV_NAME &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_NUL_STRING) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_INDEX &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_SIZE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_INGRESS_POOL_COUNT &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_EGRESS_POOL_COUNT &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_INGRESS_TC_COUNT &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_EGRESS_TC_COUNT &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_POOL_INDEX &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_POOL_TYPE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_POOL_SIZE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_THRESHOLD &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_TC_INDEX &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_OCC_CUR &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_SB_OCC_MAX &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_ESWITCH_MODE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
|
||||||
|
- return MNL_CB_ERROR;
|
||||||
|
- if (type == DEVLINK_ATTR_ESWITCH_INLINE_MODE &&
|
||||||
|
- mnl_attr_validate(attr, MNL_TYPE_U8) < 0)
|
||||||
|
+ type = mnl_attr_get_type(attr);
|
||||||
|
+ if (mnl_attr_validate(attr, devlink_policy[type]) < 0)
|
||||||
|
return MNL_CB_ERROR;
|
||||||
|
+
|
||||||
|
tb[type] = attr;
|
||||||
|
return MNL_CB_OK;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,104 @@
|
||||||
|
From 724d67b36f9e6bbbfac88b29fee019c05284a888 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] tc: Reflect HW offload status
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit e57285b81a098ed705d683ce94f9abd1cc53438a
|
||||||
|
Author: Or Gerlitz <ogerlitz@mellanox.com>
|
||||||
|
Date: Thu May 4 16:15:15 2017 +0300
|
||||||
|
|
||||||
|
tc: Reflect HW offload status
|
||||||
|
|
||||||
|
Currently there is no way of querying whether a filter is
|
||||||
|
offloaded to HW or not when using "both" policy (where none
|
||||||
|
of skip_sw or skip_hw flags are set by user-space).
|
||||||
|
|
||||||
|
Add two new flags, "in hw" and "not in hw" such that user
|
||||||
|
space can determine if a filter is actually offloaded to
|
||||||
|
hw or not. The "in hw" UAPI semantics was chosen so it's
|
||||||
|
similar to the "skip hw" flag logic.
|
||||||
|
|
||||||
|
If none of these two flags are set, this signals running
|
||||||
|
over older kernel.
|
||||||
|
|
||||||
|
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
|
||||||
|
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
Reviewed-by: Simon Horman <simon.horman@netronome.com>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
tc/f_bpf.c | 5 +++++
|
||||||
|
tc/f_flower.c | 5 +++++
|
||||||
|
tc/f_matchall.c | 5 +++++
|
||||||
|
tc/f_u32.c | 5 +++++
|
||||||
|
4 files changed, 20 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/tc/f_bpf.c b/tc/f_bpf.c
|
||||||
|
index df8a259..75c44c0 100644
|
||||||
|
--- a/tc/f_bpf.c
|
||||||
|
+++ b/tc/f_bpf.c
|
||||||
|
@@ -210,6 +210,11 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
|
||||||
|
fprintf(f, "skip_hw ");
|
||||||
|
if (flags & TCA_CLS_FLAGS_SKIP_SW)
|
||||||
|
fprintf(f, "skip_sw ");
|
||||||
|
+
|
||||||
|
+ if (flags & TCA_CLS_FLAGS_IN_HW)
|
||||||
|
+ fprintf(f, "in_hw ");
|
||||||
|
+ else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
|
||||||
|
+ fprintf(f, "not_in_hw ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tb[TCA_BPF_OPS] && tb[TCA_BPF_OPS_LEN])
|
||||||
|
diff --git a/tc/f_flower.c b/tc/f_flower.c
|
||||||
|
index 5aac4a0..ebc63ca 100644
|
||||||
|
--- a/tc/f_flower.c
|
||||||
|
+++ b/tc/f_flower.c
|
||||||
|
@@ -1171,6 +1171,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
|
||||||
|
fprintf(f, "\n skip_hw");
|
||||||
|
if (flags & TCA_CLS_FLAGS_SKIP_SW)
|
||||||
|
fprintf(f, "\n skip_sw");
|
||||||
|
+
|
||||||
|
+ if (flags & TCA_CLS_FLAGS_IN_HW)
|
||||||
|
+ fprintf(f, "\n in_hw");
|
||||||
|
+ else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
|
||||||
|
+ fprintf(f, "\n not_in_hw");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tb[TCA_FLOWER_ACT])
|
||||||
|
diff --git a/tc/f_matchall.c b/tc/f_matchall.c
|
||||||
|
index ac48630..5a51e75 100644
|
||||||
|
--- a/tc/f_matchall.c
|
||||||
|
+++ b/tc/f_matchall.c
|
||||||
|
@@ -137,6 +137,11 @@ static int matchall_print_opt(struct filter_util *qu, FILE *f,
|
||||||
|
fprintf(f, "\n skip_hw");
|
||||||
|
if (flags & TCA_CLS_FLAGS_SKIP_SW)
|
||||||
|
fprintf(f, "\n skip_sw");
|
||||||
|
+
|
||||||
|
+ if (flags & TCA_CLS_FLAGS_IN_HW)
|
||||||
|
+ fprintf(f, "\n in_hw");
|
||||||
|
+ else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
|
||||||
|
+ fprintf(f, "\n not_in_hw");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tb[TCA_MATCHALL_ACT])
|
||||||
|
diff --git a/tc/f_u32.c b/tc/f_u32.c
|
||||||
|
index 92c1fcd..ff700e9 100644
|
||||||
|
--- a/tc/f_u32.c
|
||||||
|
+++ b/tc/f_u32.c
|
||||||
|
@@ -1264,6 +1264,11 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
|
||||||
|
fprintf(f, "skip_hw ");
|
||||||
|
if (flags & TCA_CLS_FLAGS_SKIP_SW)
|
||||||
|
fprintf(f, "skip_sw ");
|
||||||
|
+
|
||||||
|
+ if (flags & TCA_CLS_FLAGS_IN_HW)
|
||||||
|
+ fprintf(f, "in_hw ");
|
||||||
|
+ else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
|
||||||
|
+ fprintf(f, "not_in_hw ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tb[TCA_U32_PCNT]) {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
From b2e49d92325d876d29e2d4f1a83bd86adfc4bc73 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] pedit: Fix a typo in warning
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit 290cdc058d8bbcae3cfefafe83d8263e02ac5a6f
|
||||||
|
Author: Amir Vadai <amir@vadai.me>
|
||||||
|
Date: Sun May 14 11:17:43 2017 +0300
|
||||||
|
|
||||||
|
pedit: Fix a typo in warning
|
||||||
|
|
||||||
|
'ex' attribute should be placed after 'action pedit' and not after
|
||||||
|
'munge'.
|
||||||
|
|
||||||
|
Signed-off-by: Amir Vadai <amir@vadai.me>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
tc/m_pedit.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
|
||||||
|
index 6498dd9..7ef2acc 100644
|
||||||
|
--- a/tc/m_pedit.c
|
||||||
|
+++ b/tc/m_pedit.c
|
||||||
|
@@ -146,7 +146,7 @@ int pack_key(struct m_pedit_sel *_sel, struct m_pedit_key *tkey)
|
||||||
|
if (tkey->htype != TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK ||
|
||||||
|
tkey->cmd != TCA_PEDIT_KEY_EX_CMD_SET) {
|
||||||
|
fprintf(stderr,
|
||||||
|
- "Munge parameters not supported. Use 'munge ex'.\n");
|
||||||
|
+ "Munge parameters not supported. Use 'pedit ex munge ...'.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
From 2bf855b076bbe5aa4665f7efd8bcaf882821cab5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] pedit: Do not allow using retain for too big fields
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit cdca191862775c47533908301760edd55763e861
|
||||||
|
Author: Amir Vadai <amir@vadai.me>
|
||||||
|
Date: Sun May 14 11:17:44 2017 +0300
|
||||||
|
|
||||||
|
pedit: Do not allow using retain for too big fields
|
||||||
|
|
||||||
|
Using retain for fields longer than 32 bits is not supported.
|
||||||
|
Do not allow user to do it.
|
||||||
|
|
||||||
|
Signed-off-by: Amir Vadai <amir@vadai.me>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/tc-pedit.8 | 3 ++-
|
||||||
|
tc/m_pedit.c | 6 ++++++
|
||||||
|
2 files changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-pedit.8 b/man/man8/tc-pedit.8
|
||||||
|
index 7f482ea..9c4d57b 100644
|
||||||
|
--- a/man/man8/tc-pedit.8
|
||||||
|
+++ b/man/man8/tc-pedit.8
|
||||||
|
@@ -266,7 +266,8 @@ Keep the addressed data as is.
|
||||||
|
.BI retain " RVAL"
|
||||||
|
This optional extra part of
|
||||||
|
.I CMD_SPEC
|
||||||
|
-allows to exclude bits from being changed.
|
||||||
|
+allows to exclude bits from being changed. Supported only for 32 bits fields
|
||||||
|
+or smaller.
|
||||||
|
.TP
|
||||||
|
.I CONTROL
|
||||||
|
The following keywords allow to control how the tree of qdisc, classes,
|
||||||
|
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
|
||||||
|
index 7ef2acc..9b74c96 100644
|
||||||
|
--- a/tc/m_pedit.c
|
||||||
|
+++ b/tc/m_pedit.c
|
||||||
|
@@ -353,6 +353,12 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
||||||
|
argv++;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (len > 4 && retain != ~0) {
|
||||||
|
+ fprintf(stderr,
|
||||||
|
+ "retain is not supported for fields longer the 32 bits\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (type == TMAC) {
|
||||||
|
res = pack_mac(sel, tkey, (__u8 *)val);
|
||||||
|
goto done;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
From 0bc6d74ce3291b669bc05524b404bc6914dab5ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] pedit: Check for extended capability in protocol parser
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit a13426fe1a2b0fdebacc33820105523934eb355f
|
||||||
|
Author: Amir Vadai <amir@vadai.me>
|
||||||
|
Date: Sun May 14 11:17:45 2017 +0300
|
||||||
|
|
||||||
|
pedit: Check for extended capability in protocol parser
|
||||||
|
|
||||||
|
Do not allow using eth and udp header types if non-extended pedit kABI
|
||||||
|
is being used. Other protocol parsers already have this check.
|
||||||
|
|
||||||
|
Signed-off-by: Amir Vadai <amir@vadai.me>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
tc/p_eth.c | 3 +++
|
||||||
|
tc/p_udp.c | 3 +++
|
||||||
|
2 files changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/tc/p_eth.c b/tc/p_eth.c
|
||||||
|
index ad3e28f..2d2f96c 100644
|
||||||
|
--- a/tc/p_eth.c
|
||||||
|
+++ b/tc/p_eth.c
|
||||||
|
@@ -34,6 +34,9 @@ parse_eth(int *argc_p, char ***argv_p,
|
||||||
|
if (argc < 2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ if (!sel->extended)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
tkey->htype = TCA_PEDIT_KEY_EX_HDR_TYPE_ETH;
|
||||||
|
|
||||||
|
if (strcmp(*argv, "type") == 0) {
|
||||||
|
diff --git a/tc/p_udp.c b/tc/p_udp.c
|
||||||
|
index a56a1b5..3916d95 100644
|
||||||
|
--- a/tc/p_udp.c
|
||||||
|
+++ b/tc/p_udp.c
|
||||||
|
@@ -34,6 +34,9 @@ parse_udp(int *argc_p, char ***argv_p,
|
||||||
|
if (argc < 2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ if (!sel->extended)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
tkey->htype = TCA_PEDIT_KEY_EX_HDR_TYPE_UDP;
|
||||||
|
|
||||||
|
if (strcmp(*argv, "sport") == 0) {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,304 @@
|
||||||
|
From 26ab66d7c43c3ef60ab058d4c3da8989a5c1dd46 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] pedit: Introduce ipv6 support
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit f3e1b2448a95baef587965b08f48d49b6e1ec2cb
|
||||||
|
Author: Amir Vadai <amir@vadai.me>
|
||||||
|
Date: Sun May 14 11:17:46 2017 +0300
|
||||||
|
|
||||||
|
pedit: Introduce ipv6 support
|
||||||
|
|
||||||
|
Add support for modifying IPv6 headers using pedit.
|
||||||
|
|
||||||
|
Signed-off-by: Amir Vadai <amir@vadai.me>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/tc-pedit.8 | 30 ++++++++++++++++++
|
||||||
|
tc/Makefile | 1 +
|
||||||
|
tc/m_pedit.c | 43 +++++++++++++++++++++++--
|
||||||
|
tc/p_ip.c | 17 +---------
|
||||||
|
tc/p_ip6.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 164 insertions(+), 18 deletions(-)
|
||||||
|
create mode 100644 tc/p_ip6.c
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-pedit.8 b/man/man8/tc-pedit.8
|
||||||
|
index 9c4d57b..82d4217 100644
|
||||||
|
--- a/man/man8/tc-pedit.8
|
||||||
|
+++ b/man/man8/tc-pedit.8
|
||||||
|
@@ -33,6 +33,8 @@ pedit - generic packet editor action
|
||||||
|
|
|
||||||
|
.BI ip " EX_IPHDR_FIELD"
|
||||||
|
|
|
||||||
|
+.BI ip6 " IP6HDR_FIELD"
|
||||||
|
+|
|
||||||
|
.BI tcp " TCPHDR_FIELD"
|
||||||
|
|
|
||||||
|
.BI udp " UDPHDR_FIELD"
|
||||||
|
@@ -55,6 +57,12 @@ pedit - generic packet editor action
|
||||||
|
.IR EX_IPHDR_FIELD " := { "
|
||||||
|
.BR ttl " }"
|
||||||
|
|
||||||
|
+
|
||||||
|
+.ti -8
|
||||||
|
+.IR IP6HDR_FIELD " := { "
|
||||||
|
+.BR src " | " dst " | " flow_lbl " | " payload_len " | " nexthdr " |"
|
||||||
|
+.BR hoplimit " }"
|
||||||
|
+
|
||||||
|
.ti -8
|
||||||
|
.IR TCPHDR_FIELD " := { "
|
||||||
|
.BR sport " | " dport " | " flags " }"
|
||||||
|
@@ -211,6 +219,25 @@ are:
|
||||||
|
.B ttl
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
+.BI ip6 " IP6HDR_FIELD"
|
||||||
|
+The supported keywords for
|
||||||
|
+.I IP6HDR_FIELD
|
||||||
|
+are:
|
||||||
|
+.RS
|
||||||
|
+.TP
|
||||||
|
+.B src
|
||||||
|
+.TQ
|
||||||
|
+.B dst
|
||||||
|
+.TQ
|
||||||
|
+.B flow_lbl
|
||||||
|
+.TQ
|
||||||
|
+.B payload_len
|
||||||
|
+.TQ
|
||||||
|
+.B nexthdr
|
||||||
|
+.TQ
|
||||||
|
+.B hoplimit
|
||||||
|
+.RE
|
||||||
|
+.TP
|
||||||
|
.BI tcp " TCPHDR_FIELD"
|
||||||
|
The supported keywords for
|
||||||
|
.I TCPHDR_FIELD
|
||||||
|
@@ -331,6 +358,9 @@ tc filter add dev eth0 parent ffff: u32 \\
|
||||||
|
action pedit ex munge ip dst set 192.168.1.199
|
||||||
|
tc filter add dev eth0 parent ffff: u32 \\
|
||||||
|
match ip sport 22 0xffff \\
|
||||||
|
+ action pedit ex munge ip6 dst set fe80::dacb:8aff:fec7:320e
|
||||||
|
+tc filter add dev eth0 parent ffff: u32 \\
|
||||||
|
+ match ip sport 22 0xffff \\
|
||||||
|
action pedit ex munge eth dst set 11:22:33:44:55:66
|
||||||
|
tc filter add dev eth0 parent ffff: u32 \\
|
||||||
|
match ip dport 23 0xffff \\
|
||||||
|
diff --git a/tc/Makefile b/tc/Makefile
|
||||||
|
index 446a113..9a6bb1d 100644
|
||||||
|
--- a/tc/Makefile
|
||||||
|
+++ b/tc/Makefile
|
||||||
|
@@ -53,6 +53,7 @@ TCMODULES += m_bpf.o
|
||||||
|
TCMODULES += m_tunnel_key.o
|
||||||
|
TCMODULES += m_sample.o
|
||||||
|
TCMODULES += p_ip.o
|
||||||
|
+TCMODULES += p_ip6.o
|
||||||
|
TCMODULES += p_icmp.o
|
||||||
|
TCMODULES += p_eth.o
|
||||||
|
TCMODULES += p_tcp.o
|
||||||
|
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
|
||||||
|
index 9b74c96..dfa6b2c 100644
|
||||||
|
--- a/tc/m_pedit.c
|
||||||
|
+++ b/tc/m_pedit.c
|
||||||
|
@@ -257,6 +257,32 @@ static int pack_mac(struct m_pedit_sel *sel, struct m_pedit_key *tkey,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int pack_ipv6(struct m_pedit_sel *sel, struct m_pedit_key *tkey,
|
||||||
|
+ __u32 *ipv6)
|
||||||
|
+{
|
||||||
|
+ int ret = 0;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ if (tkey->off & 0x3) {
|
||||||
|
+ fprintf(stderr,
|
||||||
|
+ "pack_ipv6: IPv6 offsets must begin in 32bit boundaries\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < 4; i++) {
|
||||||
|
+ tkey->mask = 0;
|
||||||
|
+ tkey->val = ntohl(ipv6[i]);
|
||||||
|
+
|
||||||
|
+ ret = pack_key32(~0, sel, tkey);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ tkey->off += 4;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int parse_val(int *argc_p, char ***argv_p, __u32 *val, int type)
|
||||||
|
{
|
||||||
|
int argc = *argc_p;
|
||||||
|
@@ -281,8 +307,16 @@ int parse_val(int *argc_p, char ***argv_p, __u32 *val, int type)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (type == TIPV6)
|
||||||
|
- return -1; /* not implemented yet */
|
||||||
|
+ if (type == TIPV6) {
|
||||||
|
+ inet_prefix addr;
|
||||||
|
+
|
||||||
|
+ if (get_prefix_1(&addr, *argv, AF_INET6))
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ memcpy(val, addr.data, addr.bytelen);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (type == TMAC) {
|
||||||
|
#define MAC_ALEN 6
|
||||||
|
@@ -364,6 +398,11 @@ int parse_cmd(int *argc_p, char ***argv_p, __u32 len, int type, __u32 retain,
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (type == TIPV6) {
|
||||||
|
+ res = pack_ipv6(sel, tkey, val);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
tkey->val = *v;
|
||||||
|
tkey->mask = *m;
|
||||||
|
|
||||||
|
diff --git a/tc/p_ip.c b/tc/p_ip.c
|
||||||
|
index 22fe650..0272a6e 100644
|
||||||
|
--- a/tc/p_ip.c
|
||||||
|
+++ b/tc/p_ip.c
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
/*
|
||||||
|
- * m_pedit.c packet editor: IPV4/6 header
|
||||||
|
+ * p_ip.c packet editor: IPV4 header
|
||||||
|
*
|
||||||
|
* This program is free software; you can distribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@@ -156,23 +156,8 @@ done:
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int
|
||||||
|
-parse_ip6(int *argc_p, char ***argv_p,
|
||||||
|
- struct m_pedit_sel *sel, struct m_pedit_key *tkey)
|
||||||
|
-{
|
||||||
|
- int res = -1;
|
||||||
|
- return res;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
struct m_pedit_util p_pedit_ip = {
|
||||||
|
NULL,
|
||||||
|
"ip",
|
||||||
|
parse_ip,
|
||||||
|
};
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-struct m_pedit_util p_pedit_ip6 = {
|
||||||
|
- NULL,
|
||||||
|
- "ip6",
|
||||||
|
- parse_ip6,
|
||||||
|
-};
|
||||||
|
diff --git a/tc/p_ip6.c b/tc/p_ip6.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a4824bd
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tc/p_ip6.c
|
||||||
|
@@ -0,0 +1,91 @@
|
||||||
|
+/*
|
||||||
|
+ * p_ip6.c packet editor: IPV6 header
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can distribute it and/or
|
||||||
|
+ * modify it under the terms of the GNU General Public License
|
||||||
|
+ * as published by the Free Software Foundation; either version
|
||||||
|
+ * 2 of the License, or (at your option) any later version.
|
||||||
|
+ *
|
||||||
|
+ * Authors: Amir Vadai <amir@vadai.me>
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <syslog.h>
|
||||||
|
+#include <fcntl.h>
|
||||||
|
+#include <sys/socket.h>
|
||||||
|
+#include <netinet/in.h>
|
||||||
|
+#include <arpa/inet.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include "utils.h"
|
||||||
|
+#include "tc_util.h"
|
||||||
|
+#include "m_pedit.h"
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+parse_ip6(int *argc_p, char ***argv_p,
|
||||||
|
+ struct m_pedit_sel *sel, struct m_pedit_key *tkey)
|
||||||
|
+{
|
||||||
|
+ int res = -1;
|
||||||
|
+ int argc = *argc_p;
|
||||||
|
+ char **argv = *argv_p;
|
||||||
|
+
|
||||||
|
+ if (argc < 2)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (!sel->extended)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ tkey->htype = TCA_PEDIT_KEY_EX_HDR_TYPE_IP6;
|
||||||
|
+
|
||||||
|
+ if (strcmp(*argv, "src") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ tkey->off = 8;
|
||||||
|
+ res = parse_cmd(&argc, &argv, 16, TIPV6, RU32, sel, tkey);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+ if (strcmp(*argv, "dst") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ tkey->off = 24;
|
||||||
|
+ res = parse_cmd(&argc, &argv, 16, TIPV6, RU32, sel, tkey);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+ if (strcmp(*argv, "flow_lbl") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ tkey->off = 0;
|
||||||
|
+ res = parse_cmd(&argc, &argv, 4, TU32, 0x0007ffff, sel, tkey);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+ if (strcmp(*argv, "payload_len") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ tkey->off = 4;
|
||||||
|
+ res = parse_cmd(&argc, &argv, 2, TU32, RU16, sel, tkey);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+ if (strcmp(*argv, "nexthdr") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ tkey->off = 6;
|
||||||
|
+ res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+ if (strcmp(*argv, "hoplimit") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ tkey->off = 7;
|
||||||
|
+ res = parse_cmd(&argc, &argv, 1, TU32, RU8, sel, tkey);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+done:
|
||||||
|
+ *argc_p = argc;
|
||||||
|
+ *argv_p = argv;
|
||||||
|
+ return res;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+struct m_pedit_util p_pedit_ip6 = {
|
||||||
|
+ NULL,
|
||||||
|
+ "ipv6",
|
||||||
|
+ parse_ip6,
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,189 @@
|
||||||
|
From d9857ffec0266aea1c56ee26369972ade68f501a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] devlink: Add option to set and show eswitch encapsulation
|
||||||
|
support
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit d315b706e9d4a550096140aa298d46b2aa7733e9
|
||||||
|
Author: Roi Dayan <roid@mellanox.com>
|
||||||
|
Date: Sun May 21 08:37:27 2017 +0300
|
||||||
|
|
||||||
|
devlink: Add option to set and show eswitch encapsulation support
|
||||||
|
|
||||||
|
This is an e-switch global knob to enable HW support for applying
|
||||||
|
encapsulation/decapsulation to VF traffic as part of SRIOV e-switch offloading.
|
||||||
|
|
||||||
|
The actual encap/decap is carried out (along with the matching and other
|
||||||
|
actions) per offloaded e-switch rules, e.g as done when offloading the TC tunnel
|
||||||
|
key action.
|
||||||
|
|
||||||
|
Possible values are enable/disable.
|
||||||
|
|
||||||
|
Signed-off-by: Roi Dayan <roid@mellanox.com>
|
||||||
|
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
devlink/devlink.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
|
||||||
|
man/man8/devlink-dev.8 | 13 +++++++++++++
|
||||||
|
2 files changed, 60 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/devlink/devlink.c b/devlink/devlink.c
|
||||||
|
index e22ee0a..f9bc16c 100644
|
||||||
|
--- a/devlink/devlink.c
|
||||||
|
+++ b/devlink/devlink.c
|
||||||
|
@@ -176,6 +176,7 @@ static void ifname_map_free(struct ifname_map *ifname_map)
|
||||||
|
#define DL_OPT_ESWITCH_INLINE_MODE BIT(12)
|
||||||
|
#define DL_OPT_DPIPE_TABLE_NAME BIT(13)
|
||||||
|
#define DL_OPT_DPIPE_TABLE_COUNTERS BIT(14)
|
||||||
|
+#define DL_OPT_ESWITCH_ENCAP_MODE BIT(15)
|
||||||
|
|
||||||
|
struct dl_opts {
|
||||||
|
uint32_t present; /* flags of present items */
|
||||||
|
@@ -195,6 +196,7 @@ struct dl_opts {
|
||||||
|
enum devlink_eswitch_inline_mode eswitch_inline_mode;
|
||||||
|
const char *dpipe_table_name;
|
||||||
|
bool dpipe_counters_enable;
|
||||||
|
+ bool eswitch_encap_mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dl {
|
||||||
|
@@ -299,6 +301,7 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
|
||||||
|
[DEVLINK_ATTR_SB_OCC_MAX] = MNL_TYPE_U32,
|
||||||
|
[DEVLINK_ATTR_ESWITCH_MODE] = MNL_TYPE_U16,
|
||||||
|
[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = MNL_TYPE_U8,
|
||||||
|
+ [DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = MNL_TYPE_U8,
|
||||||
|
[DEVLINK_ATTR_DPIPE_TABLES] = MNL_TYPE_NESTED,
|
||||||
|
[DEVLINK_ATTR_DPIPE_TABLE] = MNL_TYPE_NESTED,
|
||||||
|
[DEVLINK_ATTR_DPIPE_TABLE_NAME] = MNL_TYPE_STRING,
|
||||||
|
@@ -754,6 +757,19 @@ static int dpipe_counters_enable_get(const char *typestr,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int eswitch_encap_mode_get(const char *typestr, bool *p_mode)
|
||||||
|
+{
|
||||||
|
+ if (strcmp(typestr, "enable") == 0) {
|
||||||
|
+ *p_mode = true;
|
||||||
|
+ } else if (strcmp(typestr, "disable") == 0) {
|
||||||
|
+ *p_mode = false;
|
||||||
|
+ } else {
|
||||||
|
+ pr_err("Unknown eswitch encap mode \"%s\"\n", typestr);
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int dl_argv_parse(struct dl *dl, uint32_t o_required,
|
||||||
|
uint32_t o_optional)
|
||||||
|
{
|
||||||
|
@@ -908,7 +924,19 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
o_found |= DL_OPT_DPIPE_TABLE_COUNTERS;
|
||||||
|
+ } else if (dl_argv_match(dl, "encap") &&
|
||||||
|
+ (o_all & DL_OPT_ESWITCH_ENCAP_MODE)) {
|
||||||
|
+ const char *typestr;
|
||||||
|
|
||||||
|
+ dl_arg_inc(dl);
|
||||||
|
+ err = dl_argv_str(dl, &typestr);
|
||||||
|
+ if (err)
|
||||||
|
+ return err;
|
||||||
|
+ err = eswitch_encap_mode_get(typestr,
|
||||||
|
+ &opts->eswitch_encap_mode);
|
||||||
|
+ if (err)
|
||||||
|
+ return err;
|
||||||
|
+ o_found |= DL_OPT_ESWITCH_ENCAP_MODE;
|
||||||
|
} else {
|
||||||
|
pr_err("Unknown option \"%s\"\n", dl_argv(dl));
|
||||||
|
return -EINVAL;
|
||||||
|
@@ -986,6 +1014,13 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
|
||||||
|
pr_err("Dpipe table counter state expected\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if ((o_required & DL_OPT_ESWITCH_ENCAP_MODE) &&
|
||||||
|
+ !(o_found & DL_OPT_ESWITCH_ENCAP_MODE)) {
|
||||||
|
+ pr_err("E-Switch encapsulation option expected.\n");
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1041,6 +1076,9 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
|
||||||
|
if (opts->present & DL_OPT_DPIPE_TABLE_COUNTERS)
|
||||||
|
mnl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,
|
||||||
|
opts->dpipe_counters_enable);
|
||||||
|
+ if (opts->present & DL_OPT_ESWITCH_ENCAP_MODE)
|
||||||
|
+ mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE,
|
||||||
|
+ opts->eswitch_encap_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl,
|
||||||
|
@@ -1097,6 +1135,7 @@ static void cmd_dev_help(void)
|
||||||
|
pr_err("Usage: devlink dev show [ DEV ]\n");
|
||||||
|
pr_err(" devlink dev eswitch set DEV [ mode { legacy | switchdev } ]\n");
|
||||||
|
pr_err(" [ inline-mode { none | link | network | transport } ]\n");
|
||||||
|
+ pr_err(" [ encap { disable | enable } ]\n");
|
||||||
|
pr_err(" devlink dev eswitch show DEV\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1421,6 +1460,12 @@ static void pr_out_eswitch(struct dl *dl, struct nlattr **tb)
|
||||||
|
eswitch_inline_mode_name(mnl_attr_get_u8(
|
||||||
|
tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])));
|
||||||
|
|
||||||
|
+ if (tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
|
||||||
|
+ bool encap_mode = !!mnl_attr_get_u8(tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
|
||||||
|
+
|
||||||
|
+ pr_out_str(dl, "encap", encap_mode ? "enable" : "disable");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
pr_out_handle_end(dl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1465,7 +1510,8 @@ static int cmd_dev_eswitch_set(struct dl *dl)
|
||||||
|
|
||||||
|
err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE,
|
||||||
|
DL_OPT_ESWITCH_MODE |
|
||||||
|
- DL_OPT_ESWITCH_INLINE_MODE);
|
||||||
|
+ DL_OPT_ESWITCH_INLINE_MODE |
|
||||||
|
+ DL_OPT_ESWITCH_ENCAP_MODE);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8
|
||||||
|
index 6bfe66f..b074d57 100644
|
||||||
|
--- a/man/man8/devlink-dev.8
|
||||||
|
+++ b/man/man8/devlink-dev.8
|
||||||
|
@@ -34,6 +34,9 @@ devlink-dev \- devlink device configuration
|
||||||
|
.RI "[ "
|
||||||
|
.BR inline-mode " { " none " | " link " | " network " | " transport " } "
|
||||||
|
.RI "]"
|
||||||
|
+.RI "[ "
|
||||||
|
+.BR encap " { " disable " | " enable " } "
|
||||||
|
+.RI "]"
|
||||||
|
|
||||||
|
.ti -8
|
||||||
|
.BR "devlink dev eswitch show"
|
||||||
|
@@ -81,6 +84,16 @@ Some HWs need the VF driver to put part of the packet headers on the TX descript
|
||||||
|
.I transport
|
||||||
|
- L4 mode
|
||||||
|
|
||||||
|
+.TP
|
||||||
|
+.BR encap " { " disable " | " enable " } "
|
||||||
|
+Set eswitch encapsulation support
|
||||||
|
+
|
||||||
|
+.I disable
|
||||||
|
+- Disable encapsulation support
|
||||||
|
+
|
||||||
|
+.I enable
|
||||||
|
+- Enable encapsulation support
|
||||||
|
+
|
||||||
|
.SH "EXAMPLES"
|
||||||
|
.PP
|
||||||
|
devlink dev show
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
From 7cbf364a5f68ba008c5e0702266fe3dc606b1d6f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] tc: flower: add support for tcp flags
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit 0c30d14d0a2fc2fb6b7fef62bea05f2e5c3eb26a
|
||||||
|
Author: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
Date: Tue May 23 23:51:39 2017 +0200
|
||||||
|
|
||||||
|
tc: flower: add support for tcp flags
|
||||||
|
|
||||||
|
Allow user to insert a flower classifier filter rule which includes
|
||||||
|
match for tcp flags.
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/tc-flower.8 | 8 +++++++
|
||||||
|
tc/f_flower.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 70 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
|
||||||
|
index ba29065..7648079 100644
|
||||||
|
--- a/man/man8/tc-flower.8
|
||||||
|
+++ b/man/man8/tc-flower.8
|
||||||
|
@@ -35,6 +35,8 @@ flower \- flow based traffic control filter
|
||||||
|
.IR PREFIX " | { "
|
||||||
|
.BR dst_port " | " src_port " } "
|
||||||
|
.IR port_number " } | "
|
||||||
|
+.B tcp_flags
|
||||||
|
+.IR MASKED_TCP_FLAGS " | "
|
||||||
|
.B type
|
||||||
|
.IR MASKED_TYPE " | "
|
||||||
|
.B code
|
||||||
|
@@ -136,6 +138,12 @@ Match on layer 4 protocol source or destination port number. Only available for
|
||||||
|
.BR ip_proto " values " udp ", " tcp " and " sctp
|
||||||
|
which have to be specified in beforehand.
|
||||||
|
.TP
|
||||||
|
+.BI tcp_flags " MASKED_TCP_FLAGS"
|
||||||
|
+Match on TCP flags represented as 12bit bitfield in in hexadecimal format.
|
||||||
|
+A mask may be optionally provided to limit the bits which are matched. A mask
|
||||||
|
+is provided by following the value with a slash and then the mask. If the mask
|
||||||
|
+is missing then a match on all bits is assumed.
|
||||||
|
+.TP
|
||||||
|
.BI type " MASKED_TYPE"
|
||||||
|
.TQ
|
||||||
|
.BI code " MASKED_CODE"
|
||||||
|
diff --git a/tc/f_flower.c b/tc/f_flower.c
|
||||||
|
index ebc63ca..1b6b46e 100644
|
||||||
|
--- a/tc/f_flower.c
|
||||||
|
+++ b/tc/f_flower.c
|
||||||
|
@@ -57,6 +57,7 @@ static void explain(void)
|
||||||
|
" src_ip PREFIX |\n"
|
||||||
|
" dst_port PORT-NUMBER |\n"
|
||||||
|
" src_port PORT-NUMBER |\n"
|
||||||
|
+ " tcp_flags MASKED-TCP_FLAGS |\n"
|
||||||
|
" type MASKED-ICMP-TYPE |\n"
|
||||||
|
" code MASKED-ICMP-CODE |\n"
|
||||||
|
" arp_tip IPV4-PREFIX |\n"
|
||||||
|
@@ -474,6 +475,41 @@ static int flower_parse_port(char *str, __u8 ip_proto,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define TCP_FLAGS_MAX_MASK 0xfff
|
||||||
|
+
|
||||||
|
+static int flower_parse_tcp_flags(char *str, int flags_type, int mask_type,
|
||||||
|
+ struct nlmsghdr *n)
|
||||||
|
+{
|
||||||
|
+ char *slash;
|
||||||
|
+ int ret, err = -1;
|
||||||
|
+ __u16 flags;
|
||||||
|
+
|
||||||
|
+ slash = strchr(str, '/');
|
||||||
|
+ if (slash)
|
||||||
|
+ *slash = '\0';
|
||||||
|
+
|
||||||
|
+ ret = get_u16(&flags, str, 16);
|
||||||
|
+ if (ret < 0 || flags & ~TCP_FLAGS_MAX_MASK)
|
||||||
|
+ goto err;
|
||||||
|
+
|
||||||
|
+ addattr16(n, MAX_MSG, flags_type, htons(flags));
|
||||||
|
+
|
||||||
|
+ if (slash) {
|
||||||
|
+ ret = get_u16(&flags, slash + 1, 16);
|
||||||
|
+ if (ret < 0 || flags & ~TCP_FLAGS_MAX_MASK)
|
||||||
|
+ goto err;
|
||||||
|
+ } else {
|
||||||
|
+ flags = TCP_FLAGS_MAX_MASK;
|
||||||
|
+ }
|
||||||
|
+ addattr16(n, MAX_MSG, mask_type, htons(flags));
|
||||||
|
+
|
||||||
|
+ err = 0;
|
||||||
|
+err:
|
||||||
|
+ if (slash)
|
||||||
|
+ *slash = '/';
|
||||||
|
+ return err;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int flower_parse_key_id(const char *str, int type, struct nlmsghdr *n)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
@@ -671,6 +707,16 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
|
||||||
|
fprintf(stderr, "Illegal \"src_port\"\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+ } else if (matches(*argv, "tcp_flags") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ ret = flower_parse_tcp_flags(*argv,
|
||||||
|
+ TCA_FLOWER_KEY_TCP_FLAGS,
|
||||||
|
+ TCA_FLOWER_KEY_TCP_FLAGS_MASK,
|
||||||
|
+ n);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ fprintf(stderr, "Illegal \"tcp_flags\"\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
} else if (matches(*argv, "type") == 0) {
|
||||||
|
NEXT_ARG();
|
||||||
|
ret = flower_parse_icmp(*argv, eth_type, ip_proto,
|
||||||
|
@@ -1000,6 +1046,19 @@ static void flower_print_port(FILE *f, char *name, struct rtattr *attr)
|
||||||
|
fprintf(f, "\n %s %d", name, rta_getattr_be16(attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void flower_print_tcp_flags(FILE *f, char *name,
|
||||||
|
+ struct rtattr *flags_attr,
|
||||||
|
+ struct rtattr *mask_attr)
|
||||||
|
+{
|
||||||
|
+ if (!flags_attr)
|
||||||
|
+ return;
|
||||||
|
+ fprintf(f, "\n %s %x", name, rta_getattr_be16(flags_attr));
|
||||||
|
+ if (!mask_attr)
|
||||||
|
+ return;
|
||||||
|
+ fprintf(f, "/%x", rta_getattr_be16(mask_attr));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static void flower_print_key_id(FILE *f, const char *name,
|
||||||
|
struct rtattr *attr)
|
||||||
|
{
|
||||||
|
@@ -1110,6 +1169,9 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
|
||||||
|
if (nl_type >= 0)
|
||||||
|
flower_print_port(f, "src_port", tb[nl_type]);
|
||||||
|
|
||||||
|
+ flower_print_tcp_flags(f, "tcp_flags", tb[TCA_FLOWER_KEY_TCP_FLAGS],
|
||||||
|
+ tb[TCA_FLOWER_KEY_TCP_FLAGS_MASK]);
|
||||||
|
+
|
||||||
|
nl_type = flower_icmp_attr_type(eth_type, ip_proto,
|
||||||
|
FLOWER_ICMP_FIELD_TYPE);
|
||||||
|
nl_mask_type = flower_icmp_attr_mask_type(eth_type, ip_proto,
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
From 41b38afb79a82eec66fea08fc021a35cf1d550fc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] iplink: Update usage in help message
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit 5a3ec4ba64783a640e7716a37faae4be49489e51
|
||||||
|
Author: Eli Cohen <eli@mellanox.com>
|
||||||
|
Date: Sun Jun 4 15:36:48 2017 +0300
|
||||||
|
|
||||||
|
iplink: Update usage in help message
|
||||||
|
|
||||||
|
Add to usage message a description of how to configure Infiniband node
|
||||||
|
and port GUIDs. Also modify the man page to emphasize the GUIDs are
|
||||||
|
configured for Infiniband VFs.
|
||||||
|
|
||||||
|
Fixes: d91fb3f4c7e4 ("Add support for configuring Infiniband GUIDs")
|
||||||
|
Signed-off-by: Eli Cohen <eli@mellanox.com>
|
||||||
|
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
ip/iplink.c | 2 ++
|
||||||
|
man/man8/ip-link.8.in | 4 ++--
|
||||||
|
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ip/iplink.c b/ip/iplink.c
|
||||||
|
index b08d227..193997c 100644
|
||||||
|
--- a/ip/iplink.c
|
||||||
|
+++ b/ip/iplink.c
|
||||||
|
@@ -91,6 +91,8 @@ void iplink_usage(void)
|
||||||
|
" [ query_rss { on | off} ]\n"
|
||||||
|
" [ state { auto | enable | disable} ] ]\n"
|
||||||
|
" [ trust { on | off} ] ]\n"
|
||||||
|
+ " [ node_guid { eui64 } ]\n"
|
||||||
|
+ " [ port_guid { eui64 } ]\n"
|
||||||
|
" [ xdp { off |\n"
|
||||||
|
" object FILE [ section NAME ] [ verbose ] |\n"
|
||||||
|
" pinned FILE } ]\n"
|
||||||
|
diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
|
||||||
|
index a5ddfe7..48417db 100644
|
||||||
|
--- a/man/man8/ip-link.8.in
|
||||||
|
+++ b/man/man8/ip-link.8.in
|
||||||
|
@@ -1564,10 +1564,10 @@ sent by the VF.
|
||||||
|
which may impact security and/or performance. (e.g. VF multicast promiscuous mode)
|
||||||
|
.sp
|
||||||
|
.BI node_guid " eui64"
|
||||||
|
-- configure node GUID for the VF.
|
||||||
|
+- configure node GUID for Infiniband VFs.
|
||||||
|
.sp
|
||||||
|
.BI port_guid " eui64"
|
||||||
|
-- configure port GUID for the VF.
|
||||||
|
+- configure port GUID for Infiniband VFs.
|
||||||
|
.in -8
|
||||||
|
|
||||||
|
.TP
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
From f8e5b20689cdc1f488140d9da4adf6f3ca421d3f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamal Heib <kheib@redhat.com>
|
||||||
|
Date: Thu, 9 Nov 2017 04:44:32 -0500
|
||||||
|
Subject: [PATCH] tc: flower: add support for matching on ip tos and ttl
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539
|
||||||
|
|
||||||
|
commit 6ea2c2b1cff676be2d01029a01cbd84d0675213c
|
||||||
|
Author: Or Gerlitz <ogerlitz@mellanox.com>
|
||||||
|
Date: Wed Jun 7 15:17:54 2017 +0300
|
||||||
|
|
||||||
|
tc: flower: add support for matching on ip tos and ttl
|
||||||
|
|
||||||
|
Allow users to set flower classifier filter rules which
|
||||||
|
include matches for ip tos and ttl.
|
||||||
|
|
||||||
|
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
|
||||||
|
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
|
||||||
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/tc-flower.8 | 17 +++++++++++-
|
||||||
|
tc/f_flower.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 91 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
|
||||||
|
index 7648079..be46f02 100644
|
||||||
|
--- a/man/man8/tc-flower.8
|
||||||
|
+++ b/man/man8/tc-flower.8
|
||||||
|
@@ -30,7 +30,11 @@ flower \- flow based traffic control filter
|
||||||
|
.BR vlan_ethtype " { " ipv4 " | " ipv6 " | "
|
||||||
|
.IR ETH_TYPE " } | "
|
||||||
|
.BR ip_proto " { " tcp " | " udp " | " sctp " | " icmp " | " icmpv6 " | "
|
||||||
|
-.IR IP_PROTO " } | { "
|
||||||
|
+.IR IP_PROTO " } | "
|
||||||
|
+.B ip_tos
|
||||||
|
+.IR MASKED_IP_TOS " | "
|
||||||
|
+.B ip_ttl
|
||||||
|
+.IR MASKED_IP_TTL " | { "
|
||||||
|
.BR dst_ip " | " src_ip " } "
|
||||||
|
.IR PREFIX " | { "
|
||||||
|
.BR dst_port " | " src_port " } "
|
||||||
|
@@ -122,6 +126,17 @@ may be
|
||||||
|
.BR tcp ", " udp ", " sctp ", " icmp ", " icmpv6
|
||||||
|
or an unsigned 8bit value in hexadecimal format.
|
||||||
|
.TP
|
||||||
|
+.BI ip_tos " MASKED_IP_TOS"
|
||||||
|
+Match on ipv4 TOS or ipv6 traffic-class - eight bits in hexadecimal format.
|
||||||
|
+A mask may be optionally provided to limit the bits which are matched. A mask
|
||||||
|
+is provided by following the value with a slash and then the mask. If the mask
|
||||||
|
+is missing then a match on all bits is assumed.
|
||||||
|
+.TP
|
||||||
|
+.BI ip_ttl " MASKED_IP_TTL"
|
||||||
|
+Match on ipv4 TTL or ipv6 hop-limit - eight bits value in decimal or hexadecimal format.
|
||||||
|
+A mask may be optionally provided to limit the bits which are matched. Same
|
||||||
|
+logic is used for the mask as with matching on ip_tos.
|
||||||
|
+.TP
|
||||||
|
.BI dst_ip " PREFIX"
|
||||||
|
.TQ
|
||||||
|
.BI src_ip " PREFIX"
|
||||||
|
diff --git a/tc/f_flower.c b/tc/f_flower.c
|
||||||
|
index 1b6b46e..5be693a 100644
|
||||||
|
--- a/tc/f_flower.c
|
||||||
|
+++ b/tc/f_flower.c
|
||||||
|
@@ -53,6 +53,8 @@ static void explain(void)
|
||||||
|
" dst_mac MASKED-LLADDR |\n"
|
||||||
|
" src_mac MASKED-LLADDR |\n"
|
||||||
|
" ip_proto [tcp | udp | sctp | icmp | icmpv6 | IP-PROTO ] |\n"
|
||||||
|
+ " ip_tos MASKED-IP_TOS |\n"
|
||||||
|
+ " ip_ttl MASKED-IP_TTL |\n"
|
||||||
|
" dst_ip PREFIX |\n"
|
||||||
|
" src_ip PREFIX |\n"
|
||||||
|
" dst_port PORT-NUMBER |\n"
|
||||||
|
@@ -510,6 +512,41 @@ err:
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int flower_parse_ip_tos_ttl(char *str, int key_type, int mask_type,
|
||||||
|
+ struct nlmsghdr *n)
|
||||||
|
+{
|
||||||
|
+ char *slash;
|
||||||
|
+ int ret, err = -1;
|
||||||
|
+ __u8 tos_ttl;
|
||||||
|
+
|
||||||
|
+ slash = strchr(str, '/');
|
||||||
|
+ if (slash)
|
||||||
|
+ *slash = '\0';
|
||||||
|
+
|
||||||
|
+ ret = get_u8(&tos_ttl, str, 10);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ ret = get_u8(&tos_ttl, str, 16);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ goto err;
|
||||||
|
+
|
||||||
|
+ addattr8(n, MAX_MSG, key_type, tos_ttl);
|
||||||
|
+
|
||||||
|
+ if (slash) {
|
||||||
|
+ ret = get_u8(&tos_ttl, slash + 1, 16);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ goto err;
|
||||||
|
+ } else {
|
||||||
|
+ tos_ttl = 0xff;
|
||||||
|
+ }
|
||||||
|
+ addattr8(n, MAX_MSG, mask_type, tos_ttl);
|
||||||
|
+
|
||||||
|
+ err = 0;
|
||||||
|
+err:
|
||||||
|
+ if (slash)
|
||||||
|
+ *slash = '/';
|
||||||
|
+ return err;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int flower_parse_key_id(const char *str, int type, struct nlmsghdr *n)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
@@ -665,6 +702,26 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
|
||||||
|
fprintf(stderr, "Illegal \"ip_proto\"\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+ } else if (matches(*argv, "ip_tos") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ ret = flower_parse_ip_tos_ttl(*argv,
|
||||||
|
+ TCA_FLOWER_KEY_IP_TOS,
|
||||||
|
+ TCA_FLOWER_KEY_IP_TOS_MASK,
|
||||||
|
+ n);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ fprintf(stderr, "Illegal \"ip_tos\"\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ } else if (matches(*argv, "ip_ttl") == 0) {
|
||||||
|
+ NEXT_ARG();
|
||||||
|
+ ret = flower_parse_ip_tos_ttl(*argv,
|
||||||
|
+ TCA_FLOWER_KEY_IP_TTL,
|
||||||
|
+ TCA_FLOWER_KEY_IP_TTL_MASK,
|
||||||
|
+ n);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ fprintf(stderr, "Illegal \"ip_ttl\"\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
} else if (matches(*argv, "dst_ip") == 0) {
|
||||||
|
NEXT_ARG();
|
||||||
|
ret = flower_parse_ip_addr(*argv, vlan_ethtype ?
|
||||||
|
@@ -963,6 +1020,19 @@ static void flower_print_ip_proto(FILE *f, __u8 *p_ip_proto,
|
||||||
|
*p_ip_proto = ip_proto;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void flower_print_ip_attr(FILE *f, char *name,
|
||||||
|
+ struct rtattr *key_attr,
|
||||||
|
+ struct rtattr *mask_attr)
|
||||||
|
+{
|
||||||
|
+ if (!key_attr)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ fprintf(f, "\n %s %x", name, rta_getattr_u8(key_attr));
|
||||||
|
+ if (!mask_attr)
|
||||||
|
+ return;
|
||||||
|
+ fprintf(f, "/%x", rta_getattr_u8(mask_attr));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void flower_print_matching_flags(FILE *f, char *name,
|
||||||
|
enum flower_matching_flags type,
|
||||||
|
struct rtattr *attr,
|
||||||
|
@@ -1150,6 +1220,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
|
||||||
|
flower_print_eth_type(f, ð_type, tb[TCA_FLOWER_KEY_ETH_TYPE]);
|
||||||
|
flower_print_ip_proto(f, &ip_proto, tb[TCA_FLOWER_KEY_IP_PROTO]);
|
||||||
|
|
||||||
|
+ flower_print_ip_attr(f, "ip_tos", tb[TCA_FLOWER_KEY_IP_TOS],
|
||||||
|
+ tb[TCA_FLOWER_KEY_IP_TOS_MASK]);
|
||||||
|
+ flower_print_ip_attr(f, "ip_ttl", tb[TCA_FLOWER_KEY_IP_TTL],
|
||||||
|
+ tb[TCA_FLOWER_KEY_IP_TTL_MASK]);
|
||||||
|
+
|
||||||
|
flower_print_ip_addr(f, "dst_ip", eth_type,
|
||||||
|
tb[TCA_FLOWER_KEY_IPV4_DST],
|
||||||
|
tb[TCA_FLOWER_KEY_IPV4_DST_MASK],
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,64 @@
|
||||||
|
From 74e00895532b878a902f9b0477e1b00d1be9df59 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
Date: Sun, 22 Oct 2017 21:44:25 +0200
|
||||||
|
Subject: [PATCH] uapi: add include linux/vm_sockets_diag.h
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
|
||||||
|
Upstream Status: iproute2.git commit e9b0d82dfac2
|
||||||
|
|
||||||
|
commit e9b0d82dfac25912cf757945d9caf6fe2371f526
|
||||||
|
Author: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
Date: Wed Oct 11 10:49:25 2017 -0700
|
||||||
|
|
||||||
|
uapi: add include linux/vm_sockets_diag.h
|
||||||
|
|
||||||
|
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
|
||||||
|
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
---
|
||||||
|
include/uapi/linux/vm_sockets_diag.h | 33 +++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 33 insertions(+)
|
||||||
|
create mode 100644 include/uapi/linux/vm_sockets_diag.h
|
||||||
|
|
||||||
|
diff --git a/include/uapi/linux/vm_sockets_diag.h b/include/uapi/linux/vm_sockets_diag.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a732a6f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/uapi/linux/vm_sockets_diag.h
|
||||||
|
@@ -0,0 +1,33 @@
|
||||||
|
+/* AF_VSOCK sock_diag(7) interface for querying open sockets */
|
||||||
|
+
|
||||||
|
+#ifndef __VM_SOCKETS_DIAG_H__
|
||||||
|
+#define __VM_SOCKETS_DIAG_H__
|
||||||
|
+
|
||||||
|
+#include <linux/types.h>
|
||||||
|
+
|
||||||
|
+/* Request */
|
||||||
|
+struct vsock_diag_req {
|
||||||
|
+ __u8 sdiag_family; /* must be AF_VSOCK */
|
||||||
|
+ __u8 sdiag_protocol; /* must be 0 */
|
||||||
|
+ __u16 pad; /* must be 0 */
|
||||||
|
+ __u32 vdiag_states; /* query bitmap (e.g. 1 << TCP_LISTEN) */
|
||||||
|
+ __u32 vdiag_ino; /* must be 0 (reserved) */
|
||||||
|
+ __u32 vdiag_show; /* must be 0 (reserved) */
|
||||||
|
+ __u32 vdiag_cookie[2];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* Response */
|
||||||
|
+struct vsock_diag_msg {
|
||||||
|
+ __u8 vdiag_family; /* AF_VSOCK */
|
||||||
|
+ __u8 vdiag_type; /* SOCK_STREAM or SOCK_DGRAM */
|
||||||
|
+ __u8 vdiag_state; /* sk_state (e.g. TCP_LISTEN) */
|
||||||
|
+ __u8 vdiag_shutdown; /* local RCV_SHUTDOWN | SEND_SHUTDOWN */
|
||||||
|
+ __u32 vdiag_src_cid;
|
||||||
|
+ __u32 vdiag_src_port;
|
||||||
|
+ __u32 vdiag_dst_cid;
|
||||||
|
+ __u32 vdiag_dst_port;
|
||||||
|
+ __u32 vdiag_ino;
|
||||||
|
+ __u32 vdiag_cookie[2];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#endif /* __VM_SOCKETS_DIAG_H__ */
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,213 @@
|
||||||
|
From f59533eb3cb188a23456444aeb19ac3634eddd8c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
Date: Sun, 22 Oct 2017 21:44:26 +0200
|
||||||
|
Subject: [PATCH] ss: allow AF_FAMILY constants >32
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
|
||||||
|
Upstream Status: iproute2.git commit b338a3e7e7d9
|
||||||
|
|
||||||
|
commit b338a3e7e7d95c9d46de9748604da06287664033
|
||||||
|
Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Date: Fri Oct 6 11:48:39 2017 -0400
|
||||||
|
|
||||||
|
ss: allow AF_FAMILY constants >32
|
||||||
|
|
||||||
|
Linux has more than 32 address families defined in <bits/socket.h>. Use
|
||||||
|
a 64-bit type so all of them can be represented in the filter->families
|
||||||
|
bitmask.
|
||||||
|
|
||||||
|
It's easy to introduce bugs when using (1 << AF_FAMILY) because the
|
||||||
|
value is 32-bit. This can produce incorrect results from bitmask
|
||||||
|
operations so introduce the FAMILY_MASK() macro to eliminate these bugs.
|
||||||
|
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
|
||||||
|
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
---
|
||||||
|
misc/ss.c | 54 ++++++++++++++++++++++++++++--------------------------
|
||||||
|
1 file changed, 28 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/misc/ss.c b/misc/ss.c
|
||||||
|
index d3fb9a7..0d64527 100644
|
||||||
|
--- a/misc/ss.c
|
||||||
|
+++ b/misc/ss.c
|
||||||
|
@@ -170,55 +170,57 @@ enum {
|
||||||
|
struct filter {
|
||||||
|
int dbs;
|
||||||
|
int states;
|
||||||
|
- int families;
|
||||||
|
+ uint64_t families;
|
||||||
|
struct ssfilter *f;
|
||||||
|
bool kill;
|
||||||
|
};
|
||||||
|
|
||||||
|
+#define FAMILY_MASK(family) ((uint64_t)1 << (family))
|
||||||
|
+
|
||||||
|
static const struct filter default_dbs[MAX_DB] = {
|
||||||
|
[TCP_DB] = {
|
||||||
|
.states = SS_CONN,
|
||||||
|
- .families = (1 << AF_INET) | (1 << AF_INET6),
|
||||||
|
+ .families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
|
||||||
|
},
|
||||||
|
[DCCP_DB] = {
|
||||||
|
.states = SS_CONN,
|
||||||
|
- .families = (1 << AF_INET) | (1 << AF_INET6),
|
||||||
|
+ .families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
|
||||||
|
},
|
||||||
|
[UDP_DB] = {
|
||||||
|
.states = (1 << SS_ESTABLISHED),
|
||||||
|
- .families = (1 << AF_INET) | (1 << AF_INET6),
|
||||||
|
+ .families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
|
||||||
|
},
|
||||||
|
[RAW_DB] = {
|
||||||
|
.states = (1 << SS_ESTABLISHED),
|
||||||
|
- .families = (1 << AF_INET) | (1 << AF_INET6),
|
||||||
|
+ .families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
|
||||||
|
},
|
||||||
|
[UNIX_DG_DB] = {
|
||||||
|
.states = (1 << SS_CLOSE),
|
||||||
|
- .families = (1 << AF_UNIX),
|
||||||
|
+ .families = FAMILY_MASK(AF_UNIX),
|
||||||
|
},
|
||||||
|
[UNIX_ST_DB] = {
|
||||||
|
.states = SS_CONN,
|
||||||
|
- .families = (1 << AF_UNIX),
|
||||||
|
+ .families = FAMILY_MASK(AF_UNIX),
|
||||||
|
},
|
||||||
|
[UNIX_SQ_DB] = {
|
||||||
|
.states = SS_CONN,
|
||||||
|
- .families = (1 << AF_UNIX),
|
||||||
|
+ .families = FAMILY_MASK(AF_UNIX),
|
||||||
|
},
|
||||||
|
[PACKET_DG_DB] = {
|
||||||
|
.states = (1 << SS_CLOSE),
|
||||||
|
- .families = (1 << AF_PACKET),
|
||||||
|
+ .families = FAMILY_MASK(AF_PACKET),
|
||||||
|
},
|
||||||
|
[PACKET_R_DB] = {
|
||||||
|
.states = (1 << SS_CLOSE),
|
||||||
|
- .families = (1 << AF_PACKET),
|
||||||
|
+ .families = FAMILY_MASK(AF_PACKET),
|
||||||
|
},
|
||||||
|
[NETLINK_DB] = {
|
||||||
|
.states = (1 << SS_CLOSE),
|
||||||
|
- .families = (1 << AF_NETLINK),
|
||||||
|
+ .families = FAMILY_MASK(AF_NETLINK),
|
||||||
|
},
|
||||||
|
[SCTP_DB] = {
|
||||||
|
.states = SS_CONN,
|
||||||
|
- .families = (1 << AF_INET) | (1 << AF_INET6),
|
||||||
|
+ .families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -258,14 +260,14 @@ static void filter_db_set(struct filter *f, int db)
|
||||||
|
static void filter_af_set(struct filter *f, int af)
|
||||||
|
{
|
||||||
|
f->states |= default_afs[af].states;
|
||||||
|
- f->families |= 1 << af;
|
||||||
|
+ f->families |= FAMILY_MASK(af);
|
||||||
|
do_default = 0;
|
||||||
|
preferred_family = af;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int filter_af_get(struct filter *f, int af)
|
||||||
|
{
|
||||||
|
- return f->families & (1 << af);
|
||||||
|
+ return !!(f->families & FAMILY_MASK(af));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void filter_default_dbs(struct filter *f)
|
||||||
|
@@ -302,7 +304,7 @@ static void filter_merge_defaults(struct filter *f)
|
||||||
|
f->families |= default_dbs[db].families;
|
||||||
|
}
|
||||||
|
for (af = 0; af < AF_MAX; af++) {
|
||||||
|
- if (!(f->families & (1 << af)))
|
||||||
|
+ if (!(f->families & FAMILY_MASK(af)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(default_afs[af].dbs & f->dbs))
|
||||||
|
@@ -2599,7 +2601,7 @@ static int show_one_inet_sock(const struct sockaddr_nl *addr,
|
||||||
|
struct inet_diag_msg *r = NLMSG_DATA(h);
|
||||||
|
struct sockstat s = {};
|
||||||
|
|
||||||
|
- if (!(diag_arg->f->families & (1 << r->idiag_family)))
|
||||||
|
+ if (!(diag_arg->f->families & FAMILY_MASK(r->idiag_family)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
parse_diag_msg(h, &s);
|
||||||
|
@@ -2785,7 +2787,7 @@ static int tcp_show(struct filter *f)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (f->families & (1<<AF_INET)) {
|
||||||
|
+ if (f->families & FAMILY_MASK(AF_INET)) {
|
||||||
|
if ((fp = net_tcp_open()) == NULL)
|
||||||
|
goto outerr;
|
||||||
|
|
||||||
|
@@ -2795,7 +2797,7 @@ static int tcp_show(struct filter *f)
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ((f->families & (1<<AF_INET6)) &&
|
||||||
|
+ if ((f->families & FAMILY_MASK(AF_INET6)) &&
|
||||||
|
(fp = net_tcp6_open()) != NULL) {
|
||||||
|
setbuffer(fp, buf, bufsize);
|
||||||
|
if (generic_record_read(fp, tcp_show_line, f, AF_INET6))
|
||||||
|
@@ -2894,7 +2896,7 @@ static int udp_show(struct filter *f)
|
||||||
|
&& inet_show_netlink(f, NULL, IPPROTO_UDP) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (f->families&(1<<AF_INET)) {
|
||||||
|
+ if (f->families&FAMILY_MASK(AF_INET)) {
|
||||||
|
if ((fp = net_udp_open()) == NULL)
|
||||||
|
goto outerr;
|
||||||
|
if (generic_record_read(fp, dgram_show_line, f, AF_INET))
|
||||||
|
@@ -2902,7 +2904,7 @@ static int udp_show(struct filter *f)
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ((f->families&(1<<AF_INET6)) &&
|
||||||
|
+ if ((f->families&FAMILY_MASK(AF_INET6)) &&
|
||||||
|
(fp = net_udp6_open()) != NULL) {
|
||||||
|
if (generic_record_read(fp, dgram_show_line, f, AF_INET6))
|
||||||
|
goto outerr;
|
||||||
|
@@ -2934,7 +2936,7 @@ static int raw_show(struct filter *f)
|
||||||
|
inet_show_netlink(f, NULL, IPPROTO_RAW) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (f->families&(1<<AF_INET)) {
|
||||||
|
+ if (f->families&FAMILY_MASK(AF_INET)) {
|
||||||
|
if ((fp = net_raw_open()) == NULL)
|
||||||
|
goto outerr;
|
||||||
|
if (generic_record_read(fp, dgram_show_line, f, AF_INET))
|
||||||
|
@@ -2942,7 +2944,7 @@ static int raw_show(struct filter *f)
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ((f->families&(1<<AF_INET6)) &&
|
||||||
|
+ if ((f->families&FAMILY_MASK(AF_INET6)) &&
|
||||||
|
(fp = net_raw6_open()) != NULL) {
|
||||||
|
if (generic_record_read(fp, dgram_show_line, f, AF_INET6))
|
||||||
|
goto outerr;
|
||||||
|
@@ -3682,13 +3684,13 @@ static int handle_follow_request(struct filter *f)
|
||||||
|
int groups = 0;
|
||||||
|
struct rtnl_handle rth;
|
||||||
|
|
||||||
|
- if (f->families & (1 << AF_INET) && f->dbs & (1 << TCP_DB))
|
||||||
|
+ if (f->families & FAMILY_MASK(AF_INET) && f->dbs & (1 << TCP_DB))
|
||||||
|
groups |= 1 << (SKNLGRP_INET_TCP_DESTROY - 1);
|
||||||
|
- if (f->families & (1 << AF_INET) && f->dbs & (1 << UDP_DB))
|
||||||
|
+ if (f->families & FAMILY_MASK(AF_INET) && f->dbs & (1 << UDP_DB))
|
||||||
|
groups |= 1 << (SKNLGRP_INET_UDP_DESTROY - 1);
|
||||||
|
- if (f->families & (1 << AF_INET6) && f->dbs & (1 << TCP_DB))
|
||||||
|
+ if (f->families & FAMILY_MASK(AF_INET6) && f->dbs & (1 << TCP_DB))
|
||||||
|
groups |= 1 << (SKNLGRP_INET6_TCP_DESTROY - 1);
|
||||||
|
- if (f->families & (1 << AF_INET6) && f->dbs & (1 << UDP_DB))
|
||||||
|
+ if (f->families & FAMILY_MASK(AF_INET6) && f->dbs & (1 << UDP_DB))
|
||||||
|
groups |= 1 << (SKNLGRP_INET6_UDP_DESTROY - 1);
|
||||||
|
|
||||||
|
if (groups == 0)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,398 @@
|
||||||
|
From fe898bd10be2bc527f81421f06afff77e8ba42eb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
Date: Sun, 22 Oct 2017 21:44:27 +0200
|
||||||
|
Subject: [PATCH] ss: add AF_VSOCK support
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759
|
||||||
|
Upstream Status: iproute2.git commit c759116a0b2b
|
||||||
|
|
||||||
|
commit c759116a0b2b6da8df9687b0a40ac69050132c77
|
||||||
|
Author: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Date: Fri Oct 6 11:48:41 2017 -0400
|
||||||
|
|
||||||
|
ss: add AF_VSOCK support
|
||||||
|
|
||||||
|
The AF_VSOCK address family is a host<->guest communications channel
|
||||||
|
supported by VMware, KVM, and Hyper-V. Initial VMware support was
|
||||||
|
released in Linux 3.9 in 2013 and transports for other hypervisors were
|
||||||
|
added later.
|
||||||
|
|
||||||
|
AF_VSOCK addresses are <u32 cid, u32 port> tuples. The 32-bit cid
|
||||||
|
integer is comparable to an IP address. AF_VSOCK ports work like
|
||||||
|
TCP/UDP ports.
|
||||||
|
|
||||||
|
Both SOCK_STREAM and SOCK_DGRAM socket types are available.
|
||||||
|
|
||||||
|
This patch adds AF_VSOCK support to ss(8) so that sockets can be
|
||||||
|
observed.
|
||||||
|
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
|
||||||
|
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
|
||||||
|
---
|
||||||
|
man/man8/ss.8 | 8 ++-
|
||||||
|
misc/ss.c | 184 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||||
|
2 files changed, 188 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/ss.8 b/man/man8/ss.8
|
||||||
|
index 81de69d..4323eee 100644
|
||||||
|
--- a/man/man8/ss.8
|
||||||
|
+++ b/man/man8/ss.8
|
||||||
|
@@ -125,14 +125,18 @@ Display Unix domain sockets (alias for -f unix).
|
||||||
|
.B \-S, \-\-sctp
|
||||||
|
Display SCTP sockets.
|
||||||
|
.TP
|
||||||
|
+.B \-\-vsock
|
||||||
|
+Display vsock sockets (alias for -f vsock).
|
||||||
|
+.TP
|
||||||
|
.B \-f FAMILY, \-\-family=FAMILY
|
||||||
|
Display sockets of type FAMILY.
|
||||||
|
-Currently the following families are supported: unix, inet, inet6, link, netlink.
|
||||||
|
+Currently the following families are supported: unix, inet, inet6, link, netlink, vsock.
|
||||||
|
.TP
|
||||||
|
.B \-A QUERY, \-\-query=QUERY, \-\-socket=QUERY
|
||||||
|
List of socket tables to dump, separated by commas. The following identifiers
|
||||||
|
are understood: all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram,
|
||||||
|
-unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp.
|
||||||
|
+unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp,
|
||||||
|
+vsock_stream, vsock_dgram.
|
||||||
|
.TP
|
||||||
|
.B \-D FILE, \-\-diag=FILE
|
||||||
|
Do not display anything, just dump raw information about TCP sockets to FILE after applying filters. If FILE is - stdout is used.
|
||||||
|
diff --git a/misc/ss.c b/misc/ss.c
|
||||||
|
index 0d64527..e922665 100644
|
||||||
|
--- a/misc/ss.c
|
||||||
|
+++ b/misc/ss.c
|
||||||
|
@@ -44,6 +44,7 @@
|
||||||
|
#include <linux/packet_diag.h>
|
||||||
|
#include <linux/netlink_diag.h>
|
||||||
|
#include <linux/sctp.h>
|
||||||
|
+#include <linux/vm_sockets_diag.h>
|
||||||
|
|
||||||
|
#define MAGIC_SEQ 123456
|
||||||
|
|
||||||
|
@@ -126,6 +127,8 @@ enum {
|
||||||
|
PACKET_R_DB,
|
||||||
|
NETLINK_DB,
|
||||||
|
SCTP_DB,
|
||||||
|
+ VSOCK_ST_DB,
|
||||||
|
+ VSOCK_DG_DB,
|
||||||
|
MAX_DB
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -134,6 +137,7 @@ enum {
|
||||||
|
#define ALL_DB ((1<<MAX_DB)-1)
|
||||||
|
#define INET_L4_DBM ((1<<TCP_DB)|(1<<UDP_DB)|(1<<DCCP_DB)|(1<<SCTP_DB))
|
||||||
|
#define INET_DBM (INET_L4_DBM | (1<<RAW_DB))
|
||||||
|
+#define VSOCK_DBM ((1<<VSOCK_ST_DB)|(1<<VSOCK_DG_DB))
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SS_UNKNOWN,
|
||||||
|
@@ -222,6 +226,14 @@ static const struct filter default_dbs[MAX_DB] = {
|
||||||
|
.states = SS_CONN,
|
||||||
|
.families = FAMILY_MASK(AF_INET) | FAMILY_MASK(AF_INET6),
|
||||||
|
},
|
||||||
|
+ [VSOCK_ST_DB] = {
|
||||||
|
+ .states = SS_CONN,
|
||||||
|
+ .families = FAMILY_MASK(AF_VSOCK),
|
||||||
|
+ },
|
||||||
|
+ [VSOCK_DG_DB] = {
|
||||||
|
+ .states = SS_CONN,
|
||||||
|
+ .families = FAMILY_MASK(AF_VSOCK),
|
||||||
|
+ },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct filter default_afs[AF_MAX] = {
|
||||||
|
@@ -245,6 +257,10 @@ static const struct filter default_afs[AF_MAX] = {
|
||||||
|
.dbs = (1 << NETLINK_DB),
|
||||||
|
.states = (1 << SS_CLOSE),
|
||||||
|
},
|
||||||
|
+ [AF_VSOCK] = {
|
||||||
|
+ .dbs = VSOCK_DBM,
|
||||||
|
+ .states = SS_CONN,
|
||||||
|
+ },
|
||||||
|
};
|
||||||
|
|
||||||
|
static int do_default = 1;
|
||||||
|
@@ -283,6 +299,8 @@ static void filter_default_dbs(struct filter *f)
|
||||||
|
filter_db_set(f, PACKET_DG_DB);
|
||||||
|
filter_db_set(f, NETLINK_DB);
|
||||||
|
filter_db_set(f, SCTP_DB);
|
||||||
|
+ filter_db_set(f, VSOCK_ST_DB);
|
||||||
|
+ filter_db_set(f, VSOCK_DG_DB);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void filter_states_set(struct filter *f, int states)
|
||||||
|
@@ -792,6 +810,18 @@ static const char *proto_name(int protocol)
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const char *vsock_netid_name(int type)
|
||||||
|
+{
|
||||||
|
+ switch (type) {
|
||||||
|
+ case SOCK_STREAM:
|
||||||
|
+ return "v_str";
|
||||||
|
+ case SOCK_DGRAM:
|
||||||
|
+ return "v_dgr";
|
||||||
|
+ default:
|
||||||
|
+ return "???";
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void sock_state_print(struct sockstat *s)
|
||||||
|
{
|
||||||
|
const char *sock_name;
|
||||||
|
@@ -824,6 +854,9 @@ static void sock_state_print(struct sockstat *s)
|
||||||
|
case AF_NETLINK:
|
||||||
|
sock_name = "nl";
|
||||||
|
break;
|
||||||
|
+ case AF_VSOCK:
|
||||||
|
+ sock_name = vsock_netid_name(s->type);
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
sock_name = "unknown";
|
||||||
|
}
|
||||||
|
@@ -1139,6 +1172,8 @@ static int run_ssfilter(struct ssfilter *f, struct sockstat *s)
|
||||||
|
return s->lport == 0 && s->local.data[0] == 0;
|
||||||
|
if (s->local.family == AF_NETLINK)
|
||||||
|
return s->lport < 0;
|
||||||
|
+ if (s->local.family == AF_VSOCK)
|
||||||
|
+ return s->lport > 1023;
|
||||||
|
|
||||||
|
return is_ephemeral(s->lport);
|
||||||
|
}
|
||||||
|
@@ -1515,6 +1550,15 @@ void *parse_devcond(char *name)
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void vsock_set_inet_prefix(inet_prefix *a, __u32 cid)
|
||||||
|
+{
|
||||||
|
+ *a = (inet_prefix){
|
||||||
|
+ .bytelen = sizeof(cid),
|
||||||
|
+ .family = AF_VSOCK,
|
||||||
|
+ };
|
||||||
|
+ memcpy(a->data, &cid, sizeof(cid));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void *parse_hostcond(char *addr, bool is_port)
|
||||||
|
{
|
||||||
|
char *port = NULL;
|
||||||
|
@@ -1589,6 +1633,37 @@ void *parse_hostcond(char *addr, bool is_port)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (fam == AF_VSOCK || strncmp(addr, "vsock:", 6) == 0) {
|
||||||
|
+ __u32 cid = ~(__u32)0;
|
||||||
|
+
|
||||||
|
+ a.addr.family = AF_VSOCK;
|
||||||
|
+ if (strncmp(addr, "vsock:", 6) == 0)
|
||||||
|
+ addr += 6;
|
||||||
|
+
|
||||||
|
+ if (is_port)
|
||||||
|
+ port = addr;
|
||||||
|
+ else {
|
||||||
|
+ port = strchr(addr, ':');
|
||||||
|
+ if (port) {
|
||||||
|
+ *port = '\0';
|
||||||
|
+ port++;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (port && strcmp(port, "*") &&
|
||||||
|
+ get_u32((__u32 *)&a.port, port, 0))
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ if (addr[0] && strcmp(addr, "*")) {
|
||||||
|
+ a.addr.bitlen = 32;
|
||||||
|
+ if (get_u32(&cid, addr, 0))
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ vsock_set_inet_prefix(&a.addr, cid);
|
||||||
|
+ fam = AF_VSOCK;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (fam == AF_INET || !strncmp(addr, "inet:", 5)) {
|
||||||
|
fam = AF_INET;
|
||||||
|
if (!strncmp(addr, "inet:", 5))
|
||||||
|
@@ -3653,6 +3728,88 @@ static int netlink_show(struct filter *f)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static bool vsock_type_skip(struct sockstat *s, struct filter *f)
|
||||||
|
+{
|
||||||
|
+ if (s->type == SOCK_STREAM && !(f->dbs & (1 << VSOCK_ST_DB)))
|
||||||
|
+ return true;
|
||||||
|
+ if (s->type == SOCK_DGRAM && !(f->dbs & (1 << VSOCK_DG_DB)))
|
||||||
|
+ return true;
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void vsock_addr_print(inet_prefix *a, __u32 port)
|
||||||
|
+{
|
||||||
|
+ char cid_str[sizeof("4294967295")];
|
||||||
|
+ char port_str[sizeof("4294967295")];
|
||||||
|
+ __u32 cid;
|
||||||
|
+
|
||||||
|
+ memcpy(&cid, a->data, sizeof(cid));
|
||||||
|
+
|
||||||
|
+ if (cid == ~(__u32)0)
|
||||||
|
+ snprintf(cid_str, sizeof(cid_str), "*");
|
||||||
|
+ else
|
||||||
|
+ snprintf(cid_str, sizeof(cid_str), "%u", cid);
|
||||||
|
+
|
||||||
|
+ if (port == ~(__u32)0)
|
||||||
|
+ snprintf(port_str, sizeof(port_str), "*");
|
||||||
|
+ else
|
||||||
|
+ snprintf(port_str, sizeof(port_str), "%u", port);
|
||||||
|
+
|
||||||
|
+ sock_addr_print(cid_str, ":", port_str, NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void vsock_stats_print(struct sockstat *s, struct filter *f)
|
||||||
|
+{
|
||||||
|
+ sock_state_print(s);
|
||||||
|
+
|
||||||
|
+ vsock_addr_print(&s->local, s->lport);
|
||||||
|
+ vsock_addr_print(&s->remote, s->rport);
|
||||||
|
+
|
||||||
|
+ proc_ctx_print(s);
|
||||||
|
+
|
||||||
|
+ printf("\n");
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int vsock_show_sock(const struct sockaddr_nl *addr,
|
||||||
|
+ struct nlmsghdr *nlh, void *arg)
|
||||||
|
+{
|
||||||
|
+ struct filter *f = (struct filter *)arg;
|
||||||
|
+ struct vsock_diag_msg *r = NLMSG_DATA(nlh);
|
||||||
|
+ struct sockstat stat = {
|
||||||
|
+ .type = r->vdiag_type,
|
||||||
|
+ .lport = r->vdiag_src_port,
|
||||||
|
+ .rport = r->vdiag_dst_port,
|
||||||
|
+ .state = r->vdiag_state,
|
||||||
|
+ .ino = r->vdiag_ino,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ vsock_set_inet_prefix(&stat.local, r->vdiag_src_cid);
|
||||||
|
+ vsock_set_inet_prefix(&stat.remote, r->vdiag_dst_cid);
|
||||||
|
+
|
||||||
|
+ if (vsock_type_skip(&stat, f))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (f->f && run_ssfilter(f->f, &stat) == 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ vsock_stats_print(&stat, f);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int vsock_show(struct filter *f)
|
||||||
|
+{
|
||||||
|
+ DIAG_REQUEST(req, struct vsock_diag_req r);
|
||||||
|
+
|
||||||
|
+ if (!filter_af_get(f, AF_VSOCK))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ req.r.sdiag_family = AF_VSOCK;
|
||||||
|
+ req.r.vdiag_states = f->states;
|
||||||
|
+
|
||||||
|
+ return handle_netlink_request(f, &req.nlh, sizeof(req), vsock_show_sock);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
struct sock_diag_msg {
|
||||||
|
__u8 sdiag_family;
|
||||||
|
};
|
||||||
|
@@ -3673,6 +3830,8 @@ static int generic_show_sock(const struct sockaddr_nl *addr,
|
||||||
|
return packet_show_sock(addr, nlh, arg);
|
||||||
|
case AF_NETLINK:
|
||||||
|
return netlink_show_sock(addr, nlh, arg);
|
||||||
|
+ case AF_VSOCK:
|
||||||
|
+ return vsock_show_sock(addr, nlh, arg);
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -3900,14 +4059,15 @@ static void _usage(FILE *dest)
|
||||||
|
" -d, --dccp display only DCCP sockets\n"
|
||||||
|
" -w, --raw display only RAW sockets\n"
|
||||||
|
" -x, --unix display only Unix domain sockets\n"
|
||||||
|
+" --vsock display only vsock sockets\n"
|
||||||
|
" -f, --family=FAMILY display sockets of type FAMILY\n"
|
||||||
|
-" FAMILY := {inet|inet6|link|unix|netlink|help}\n"
|
||||||
|
+" FAMILY := {inet|inet6|link|unix|netlink|vsock|help}\n"
|
||||||
|
"\n"
|
||||||
|
" -K, --kill forcibly close sockets, display what was closed\n"
|
||||||
|
" -H, --no-header Suppress header line\n"
|
||||||
|
"\n"
|
||||||
|
" -A, --query=QUERY, --socket=QUERY\n"
|
||||||
|
-" QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink}[,QUERY]\n"
|
||||||
|
+" QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram}[,QUERY]\n"
|
||||||
|
"\n"
|
||||||
|
" -D, --diag=FILE Dump raw information about TCP sockets to FILE\n"
|
||||||
|
" -F, --filter=FILE read filter information from FILE\n"
|
||||||
|
@@ -3980,6 +4140,9 @@ static int scan_state(const char *state)
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Values 'v' and 'V' are already used so a non-character is used */
|
||||||
|
+#define OPT_VSOCK 256
|
||||||
|
+
|
||||||
|
static const struct option long_opts[] = {
|
||||||
|
{ "numeric", 0, 0, 'n' },
|
||||||
|
{ "resolve", 0, 0, 'r' },
|
||||||
|
@@ -3996,6 +4159,7 @@ static const struct option long_opts[] = {
|
||||||
|
{ "udp", 0, 0, 'u' },
|
||||||
|
{ "raw", 0, 0, 'w' },
|
||||||
|
{ "unix", 0, 0, 'x' },
|
||||||
|
+ { "vsock", 0, 0, OPT_VSOCK },
|
||||||
|
{ "all", 0, 0, 'a' },
|
||||||
|
{ "listening", 0, 0, 'l' },
|
||||||
|
{ "ipv4", 0, 0, '4' },
|
||||||
|
@@ -4081,6 +4245,9 @@ int main(int argc, char *argv[])
|
||||||
|
case 'x':
|
||||||
|
filter_af_set(¤t_filter, AF_UNIX);
|
||||||
|
break;
|
||||||
|
+ case OPT_VSOCK:
|
||||||
|
+ filter_af_set(¤t_filter, AF_VSOCK);
|
||||||
|
+ break;
|
||||||
|
case 'a':
|
||||||
|
state_filter = SS_ALL;
|
||||||
|
break;
|
||||||
|
@@ -4107,6 +4274,8 @@ int main(int argc, char *argv[])
|
||||||
|
filter_af_set(¤t_filter, AF_UNIX);
|
||||||
|
else if (strcmp(optarg, "netlink") == 0)
|
||||||
|
filter_af_set(¤t_filter, AF_NETLINK);
|
||||||
|
+ else if (strcmp(optarg, "vsock") == 0)
|
||||||
|
+ filter_af_set(¤t_filter, AF_VSOCK);
|
||||||
|
else if (strcmp(optarg, "help") == 0)
|
||||||
|
help();
|
||||||
|
else {
|
||||||
|
@@ -4172,6 +4341,15 @@ int main(int argc, char *argv[])
|
||||||
|
filter_db_set(¤t_filter, PACKET_DG_DB);
|
||||||
|
} else if (strcmp(p, "netlink") == 0) {
|
||||||
|
filter_db_set(¤t_filter, NETLINK_DB);
|
||||||
|
+ } else if (strcmp(p, "vsock") == 0) {
|
||||||
|
+ filter_db_set(¤t_filter, VSOCK_ST_DB);
|
||||||
|
+ filter_db_set(¤t_filter, VSOCK_DG_DB);
|
||||||
|
+ } else if (strcmp(p, "vsock_stream") == 0 ||
|
||||||
|
+ strcmp(p, "v_str") == 0) {
|
||||||
|
+ filter_db_set(¤t_filter, VSOCK_ST_DB);
|
||||||
|
+ } else if (strcmp(p, "vsock_dgram") == 0 ||
|
||||||
|
+ strcmp(p, "v_dgr") == 0) {
|
||||||
|
+ filter_db_set(¤t_filter, VSOCK_DG_DB);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "ss: \"%s\" is illegal socket table id\n", p);
|
||||||
|
usage();
|
||||||
|
@@ -4387,6 +4565,8 @@ int main(int argc, char *argv[])
|
||||||
|
dccp_show(¤t_filter);
|
||||||
|
if (current_filter.dbs & (1<<SCTP_DB))
|
||||||
|
sctp_show(¤t_filter);
|
||||||
|
+ if (current_filter.dbs & VSOCK_DBM)
|
||||||
|
+ vsock_show(¤t_filter);
|
||||||
|
|
||||||
|
if (show_users || show_proc_ctx || show_sock_ctx)
|
||||||
|
user_ent_destroy();
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
From 90a1430fca8d5165e1909de9f009aa9f4d6430ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Wed, 29 Nov 2017 18:36:17 +0100
|
||||||
|
Subject: [PATCH] link_gre6: Detect invalid encaplimit values
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1459600
|
||||||
|
Upstream Status: iproute2.git commit 56708ae7c9535
|
||||||
|
|
||||||
|
commit 56708ae7c9535859223c5b68097b35bf0fae677c
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Tue Nov 28 16:49:58 2017 +0100
|
||||||
|
|
||||||
|
link_gre6: Detect invalid encaplimit values
|
||||||
|
|
||||||
|
Looks like a typo: get_u8() returns 0 on success and -1 on error, so the
|
||||||
|
error checking here was ineffective.
|
||||||
|
|
||||||
|
Fixes: a11b7b71a6eba ("link_gre6: really support encaplimit option")
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
ip/link_gre6.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/ip/link_gre6.c b/ip/link_gre6.c
|
||||||
|
index 932f9ee..a9d18ee 100644
|
||||||
|
--- a/ip/link_gre6.c
|
||||||
|
+++ b/ip/link_gre6.c
|
||||||
|
@@ -351,7 +351,7 @@ get_failed:
|
||||||
|
} else {
|
||||||
|
__u8 uval;
|
||||||
|
|
||||||
|
- if (get_u8(&uval, *argv, 0) < -1)
|
||||||
|
+ if (get_u8(&uval, *argv, 0))
|
||||||
|
invarg("invalid ELIM", *argv);
|
||||||
|
encap_limit = uval;
|
||||||
|
flags &= ~IP6_TNL_F_IGN_ENCAP_LIMIT;
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
From f08752c12351c79145e3a6caf346e3d971370a9c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Wed, 6 Dec 2017 13:21:16 +0100
|
||||||
|
Subject: [PATCH] man: tc-csum.8: Fix inconsistency in example description
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1417162
|
||||||
|
Upstream Status: iproute2.git commit 6bf156415a588
|
||||||
|
|
||||||
|
commit 6bf156415a588fa1c975be9a18a1579f63a936a2
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Wed Nov 29 18:34:09 2017 +0100
|
||||||
|
|
||||||
|
man: tc-csum.8: Fix inconsistency in example description
|
||||||
|
|
||||||
|
Commit 6bbe5e6290db5 ("man: tc-csum.8: Fix example") changed both source
|
||||||
|
and destination IP addresses in example code but missed to update the
|
||||||
|
example's description accordingly.
|
||||||
|
|
||||||
|
Fixes: 6bbe5e6290db5 ("man: tc-csum.8: Fix example")
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
man/man8/tc-csum.8 | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/tc-csum.8 b/man/man8/tc-csum.8
|
||||||
|
index 409ab71..65724b8 100644
|
||||||
|
--- a/man/man8/tc-csum.8
|
||||||
|
+++ b/man/man8/tc-csum.8
|
||||||
|
@@ -53,8 +53,8 @@ SCTP header
|
||||||
|
.B SWEETS
|
||||||
|
These are merely syntactic sugar and ignored internally.
|
||||||
|
.SH EXAMPLES
|
||||||
|
-The following performs stateless NAT for incoming packets from 192.168.1.100 to
|
||||||
|
-new destination 18.52.86.120 (0x12345678 in hex). Assuming these are UDP
|
||||||
|
+The following performs stateless NAT for incoming packets from 192.0.2.100 to
|
||||||
|
+new destination 198.51.100.1. Assuming these are UDP
|
||||||
|
packets, both IP and UDP checksums have to be recalculated:
|
||||||
|
|
||||||
|
.RS
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
From dbc597c9d1e0e65cc9d989d8057f9a083c2f5779 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Fri, 15 Dec 2017 16:13:46 +0100
|
||||||
|
Subject: [PATCH] tc: fix command "tc actions del" hang issue
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1526394
|
||||||
|
Upstream Status: iproute2.git commit 83cf5bc73b858
|
||||||
|
|
||||||
|
commit 83cf5bc73b858608d59c3c6126a9f37e793e15dd
|
||||||
|
Author: Chris Mi <chrism@mellanox.com>
|
||||||
|
Date: Thu Dec 14 18:09:00 2017 +0900
|
||||||
|
|
||||||
|
tc: fix command "tc actions del" hang issue
|
||||||
|
|
||||||
|
If command is RTM_DELACTION, a non-NULL pointer is passed to rtnl_talk().
|
||||||
|
Then flag NLM_F_ACK is not set on n->nlmsg_flags and netlink_ack() will
|
||||||
|
not be called. Command tc will wait for the reply for ever.
|
||||||
|
|
||||||
|
Fixes: 86bf43c7c2fd ("lib/libnetlink: update rtnl_talk to support malloc buff at run time")
|
||||||
|
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
|
||||||
|
Signed-off-by: Chris Mi <chrism@mellanox.com>
|
||||||
|
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
|
---
|
||||||
|
tc/m_action.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tc/m_action.c b/tc/m_action.c
|
||||||
|
index 90b2a11..7cfd9e0 100644
|
||||||
|
--- a/tc/m_action.c
|
||||||
|
+++ b/tc/m_action.c
|
||||||
|
@@ -507,7 +507,7 @@ static int tc_action_gd(int cmd, unsigned int flags, int *argc_p, char ***argv_p
|
||||||
|
|
||||||
|
req.n.nlmsg_seq = rth.dump = ++rth.seq;
|
||||||
|
|
||||||
|
- if (rtnl_talk(&rth, &req.n, &ans) < 0) {
|
||||||
|
+ if (rtnl_talk(&rth, &req.n, cmd == RTM_DELACTION ? NULL : &ans) < 0) {
|
||||||
|
fprintf(stderr, "We have an error talking to the kernel\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
From dcafeb49b2538cc7118cb64f62c685980c106b48 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Phil Sutter <psutter@redhat.com>
|
||||||
|
Date: Tue, 6 Mar 2018 11:35:28 +0100
|
||||||
|
Subject: [PATCH] ip-link: Fix use after free in nl_get_ll_addr_len()
|
||||||
|
|
||||||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1550097
|
||||||
|
Upstream Status: iproute2.git commit 06867c3719587
|
||||||
|
|
||||||
|
commit 06867c371958773e39b4ccac07cfe3e2fff2ea55
|
||||||
|
Author: Phil Sutter <phil@nwl.cc>
|
||||||
|
Date: Thu Mar 1 10:35:12 2018 +0100
|
||||||
|
|
||||||
|
ip-link: Fix use after free in nl_get_ll_addr_len()
|
||||||
|
|
||||||
|
Immediately after freeing the buffer returned from rtnl_talk(), it is
|
||||||
|
accessed again via pointer in struct rtattr array. This leads to some
|
||||||
|
builds not allowing to set an interface's MAC address because the
|
||||||
|
expected length value is garbage.
|
||||||
|
|
||||||
|
Fixes: 86bf43c7c2fdc ("lib/libnetlink: update rtnl_talk to support malloc buff at run time")
|
||||||
|
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
||||||
|
---
|
||||||
|
ip/iplink.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/ip/iplink.c b/ip/iplink.c
|
||||||
|
index 193997c..db5b2c9 100644
|
||||||
|
--- a/ip/iplink.c
|
||||||
|
+++ b/ip/iplink.c
|
||||||
|
@@ -268,8 +268,9 @@ static int nl_get_ll_addr_len(unsigned int dev_index)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ len = RTA_PAYLOAD(tb[IFLA_ADDRESS]);
|
||||||
|
free(answer);
|
||||||
|
- return RTA_PAYLOAD(tb[IFLA_ADDRESS]);
|
||||||
|
+ return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void iplink_parse_vf_vlan_info(int vf, int *argcp, char ***argvp,
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
AVPKT=3000
|
|
@ -0,0 +1,5 @@
|
||||||
|
DEVICE=eth0,10Mbit,1Mbit
|
||||||
|
RATE=128Kbit
|
||||||
|
WEIGHT=10Kbit
|
||||||
|
PRIO=5
|
||||||
|
RULE=192.168.1.0/24
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
# Deprecated values dropped upstream
|
||||||
|
# Kept in RHEL for backwards-compatibility
|
||||||
|
0x00 default
|
||||||
|
0x10 lowdelay
|
||||||
|
0x08 throughput
|
||||||
|
0x04 reliability
|
||||||
|
# This value overlap with ECT, do not use it!
|
||||||
|
0x02 mincost
|
||||||
|
# These values seems do not want to die, Cisco likes them by a strange reason.
|
||||||
|
0x20 priority
|
||||||
|
0x40 immediate
|
||||||
|
0x60 flash
|
||||||
|
0x80 flash-override
|
||||||
|
0xa0 critical
|
||||||
|
0xc0 internet
|
||||||
|
0xe0 network
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue