From 36cfb77e91babb9bd8b4973d61e9520287276295 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Oct 30 2019 13:13:32 +0000 Subject: import iproute-4.11.0-25.el7 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..669af3f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/iproute-4.11.0-0.el7.tar.xz diff --git a/.iproute.metadata b/.iproute.metadata new file mode 100644 index 0000000..5ace8c2 --- /dev/null +++ b/.iproute.metadata @@ -0,0 +1 @@ +44b3b021eb4bf5416469e485753d877df1c3c848 SOURCES/iproute-4.11.0-0.el7.tar.xz diff --git a/SOURCES/0001-Confirm-success-for-each-tc-batch-command.patch b/SOURCES/0001-Confirm-success-for-each-tc-batch-command.patch new file mode 100644 index 0000000..1920f9f --- /dev/null +++ b/SOURCES/0001-Confirm-success-for-each-tc-batch-command.patch @@ -0,0 +1,105 @@ +From d9a1dc236a9bcc06f04d609e2654f76c6a9459e7 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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ř +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ř + +Signed-off-by: Phil Sutter +--- + 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 " + 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 + diff --git a/SOURCES/0002-Really-fix-get_addr-and-get_prefix-error-messages.patch b/SOURCES/0002-Really-fix-get_addr-and-get_prefix-error-messages.patch new file mode 100644 index 0000000..a54aeea --- /dev/null +++ b/SOURCES/0002-Really-fix-get_addr-and-get_prefix-error-messages.patch @@ -0,0 +1,88 @@ +From aed8229c0bec5c56deaf1ea2047ca0263732477f Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 + Fixes: 334af76143368 ("fix get_addr() and get_prefix() error messages") + Signed-off-by: Phil Sutter +--- + 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 + diff --git a/SOURCES/0003-tc-simple-Fix-documentation.patch b/SOURCES/0003-tc-simple-Fix-documentation.patch new file mode 100644 index 0000000..f7edb1e --- /dev/null +++ b/SOURCES/0003-tc-simple-Fix-documentation.patch @@ -0,0 +1,102 @@ +From 3d016b2ca5862b3f47da5b28aca43bd96d5c3c49 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0004-tc-fix-m_simple-usage.patch b/SOURCES/0004-tc-fix-m_simple-usage.patch new file mode 100644 index 0000000..f25c633 --- /dev/null +++ b/SOURCES/0004-tc-fix-m_simple-usage.patch @@ -0,0 +1,37 @@ +From d203110b883afafa58b735a3e94c71f255db7608 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +Date: Thu Aug 3 16:10:18 2017 -0700 + + tc: fix m_simple usage + + Signed-off-by: Stephen Hemminger +--- + 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 + diff --git a/SOURCES/0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch b/SOURCES/0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch new file mode 100644 index 0000000..d135b59 --- /dev/null +++ b/SOURCES/0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch @@ -0,0 +1,96 @@ +From 91cda136ef27402256dbf85434374b43ab52d932 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 + Signed-off-by: Phil Sutter + Acked-by: Daniel Borkmann +--- + 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 + diff --git a/SOURCES/0006-ss-Fix-for-added-diag-support-check.patch b/SOURCES/0006-ss-Fix-for-added-diag-support-check.patch new file mode 100644 index 0000000..3b2f237 --- /dev/null +++ b/SOURCES/0006-ss-Fix-for-added-diag-support-check.patch @@ -0,0 +1,93 @@ +From 2dc48cc4101b9788dcafd38b07a82f8c91b4d3f6 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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< +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 + diff --git a/SOURCES/0008-lib-bpf-Fix-bytecode-file-parsing.patch b/SOURCES/0008-lib-bpf-Fix-bytecode-file-parsing.patch new file mode 100644 index 0000000..f9247d7 --- /dev/null +++ b/SOURCES/0008-lib-bpf-Fix-bytecode-file-parsing.patch @@ -0,0 +1,74 @@ +From 584ca9f67952162dfdd02d984aa12640e45a4235 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 + Signed-off-by: Phil Sutter + Acked-by: Daniel Borkmann +--- + 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 + diff --git a/SOURCES/0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch b/SOURCES/0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch new file mode 100644 index 0000000..4ce8185 --- /dev/null +++ b/SOURCES/0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch @@ -0,0 +1,27 @@ +From 3905b2d8f676601c022804d197be9165dacff11c Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 + diff --git a/SOURCES/0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch b/SOURCES/0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch new file mode 100644 index 0000000..253d00f --- /dev/null +++ b/SOURCES/0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch @@ -0,0 +1,49 @@ +From 074062808c630f2efb55c7093d510b44a38e74e5 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0011-link_gre6-really-support-encaplimit-option.patch b/SOURCES/0011-link_gre6-really-support-encaplimit-option.patch new file mode 100644 index 0000000..5a6eefa --- /dev/null +++ b/SOURCES/0011-link_gre6-really-support-encaplimit-option.patch @@ -0,0 +1,51 @@ +From 2db276543a03633a61ba0815a01c8bb2846830ab Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0012-tc-fix-typo-in-manpage.patch b/SOURCES/0012-tc-fix-typo-in-manpage.patch new file mode 100644 index 0000000..6041fbe --- /dev/null +++ b/SOURCES/0012-tc-fix-typo-in-manpage.patch @@ -0,0 +1,40 @@ +From beb8e1aa7ed08f86fb87ff58f7c69aaa2b68b862 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch b/SOURCES/0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch new file mode 100644 index 0000000..ed4b410 --- /dev/null +++ b/SOURCES/0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch @@ -0,0 +1,52 @@ +From 3b6fd8227cbb03b5b211d2cb53534ad405673668 Mon Sep 17 00:00:00 2001 +From: Matteo Croce +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 +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 + +Signed-off-by: Matteo Croce +--- + 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 + diff --git a/SOURCES/0014-netns-avoid-directory-traversal.patch b/SOURCES/0014-netns-avoid-directory-traversal.patch new file mode 100644 index 0000000..fc03b02 --- /dev/null +++ b/SOURCES/0014-netns-avoid-directory-traversal.patch @@ -0,0 +1,58 @@ +From 74061958f56a4626a3a146c72f16e43012e828f1 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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/. 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 +--- + 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 + diff --git a/SOURCES/0015-utils-return-default-family-when-rtm_family-is-not-R.patch b/SOURCES/0015-utils-return-default-family-when-rtm_family-is-not-R.patch new file mode 100644 index 0000000..5d59c09 --- /dev/null +++ b/SOURCES/0015-utils-return-default-family-when-rtm_family-is-not-R.patch @@ -0,0 +1,58 @@ +From 420957e4c56f65703c6f2f24da0ea35c6b7bbcda Mon Sep 17 00:00:00 2001 +From: Stefano Brivio +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 +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 + Acked-by: Phil Sutter + +Signed-off-by: Stefano Brivio +--- + 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 + diff --git a/SOURCES/0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch b/SOURCES/0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch new file mode 100644 index 0000000..f098bbe --- /dev/null +++ b/SOURCES/0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch @@ -0,0 +1,49 @@ +From 449517f7769dde4905564ce17e126bfd4e1f7147 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch b/SOURCES/0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch new file mode 100644 index 0000000..c8d1956 --- /dev/null +++ b/SOURCES/0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch @@ -0,0 +1,92 @@ +From 61ccf0f453306e727e254e6de1641bb934a3b7ec Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +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 +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 + +Signed-off-by: Hangbin Liu +--- + 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 + diff --git a/SOURCES/0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch b/SOURCES/0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch new file mode 100644 index 0000000..cccda65 --- /dev/null +++ b/SOURCES/0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch @@ -0,0 +1,47 @@ +From 9346e08c2f9059decf889fb89f2859e7ed61f573 Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +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 +Date: Thu Aug 24 15:02:32 2017 -0700 + + libnetlink: drop unused parameter to rtnl_dump_done + + Signed-off-by: Stephen Hemminger + +Signed-off-by: Hangbin Liu +--- + 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 + diff --git a/SOURCES/0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch b/SOURCES/0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch new file mode 100644 index 0000000..84cded6 --- /dev/null +++ b/SOURCES/0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch @@ -0,0 +1,255 @@ +From a9f81b704c4e883a996927e77afdb960a7f47fd9 Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +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 +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 + +Signed-off-by: Hangbin Liu + +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 ++ ++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 + diff --git a/SOURCES/0020-iplink-check-for-message-truncation-in-iplink_get.patch b/SOURCES/0020-iplink-check-for-message-truncation-in-iplink_get.patch new file mode 100644 index 0000000..00b71ef --- /dev/null +++ b/SOURCES/0020-iplink-check-for-message-truncation-in-iplink_get.patch @@ -0,0 +1,51 @@ +From 8372b7bb8f7211563d888fdd30e473c161f7d0a0 Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +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 +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 + +Signed-off-by: Hangbin Liu +--- + 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 + diff --git a/SOURCES/0021-iplink-double-the-buffer-size-also-in-iplink_get.patch b/SOURCES/0021-iplink-double-the-buffer-size-also-in-iplink_get.patch new file mode 100644 index 0000000..c6d653a --- /dev/null +++ b/SOURCES/0021-iplink-double-the-buffer-size-also-in-iplink_get.patch @@ -0,0 +1,48 @@ +From c560900fc16eeac064cc7c43a96c5343fe68ae76 Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +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 +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 + +Signed-off-by: Hangbin Liu +--- + 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 + diff --git a/SOURCES/0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch b/SOURCES/0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch new file mode 100644 index 0000000..8e429aa --- /dev/null +++ b/SOURCES/0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch @@ -0,0 +1,252 @@ +From 49e7c0e7c8c9a982fd3aa69bbed4e306a1dcb331 Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +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 +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 + Signed-off-by: Phil Sutter + +Signed-off-by: Hangbin Liu +--- + 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 + diff --git a/SOURCES/0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch b/SOURCES/0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch new file mode 100644 index 0000000..7080671 --- /dev/null +++ b/SOURCES/0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch @@ -0,0 +1,1604 @@ +From 3d76c7eea3caaddcc0608ad35a9e6fab3df11f8e Mon Sep 17 00:00:00 2001 +From: Hangbin Liu +Date: Wed, 8 Nov 2017 14:39:13 +0800 +Subject: [PATCH] lib/libnetlink: update rtnl_talk to support malloc buff at + run time + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1380803 +Upstream Status: iproute2.git net-next commit 86bf43c7c2fd + +Conflicts: +- iplink_get@ip/iplink.c: no function open_json_object() due to missing + e4a1216aeb2a ("ip: iplink.c: open/close json obj for ip -brief -json link + show dev DEV"). Lack of last parameter for print_linkinfo_brief() due to + missing 63891c70137f ("ip address: Change print_linkinfo_brief to take + filter as an input") +- gre_parse_opt@ip/link_gre.c: context conflicts due to missing new + flag IFLA_GRE_ERSPAN_INDEX. +- gre_parse_opt@ip/link_gre6.c: context conflicts due to missing new + flag IFLA_GRE_FWMARK. +- ip6tunnel_parse_opt@ip/link_ip6tnl.c: context conflicts due to missing new + flag IFLA_IPTUN_FWMARK. +- iptunnel_parse_opt@ip/link_iptnl.c: context conflicts due to missing new + flag IFLA_IPTUN_FWMARK. +- vti_parse_opt@ip/link_vti.c: context conflicts due to missing new flag + IFLA_VTI_FWMARK +- vti6_parse_opt@ip/link_vti6.c: context conflicts due to missing new flag + IFLA_VTI_FWMARK + +commit 86bf43c7c2fdc33d7c021b4a1add1c8facbca51c +Author: Hangbin Liu +Date: Thu Oct 26 09:41:47 2017 +0800 + + lib/libnetlink: update rtnl_talk to support malloc buff at run time + + This is an update for 460c03f3f3cc ("iplink: double the buffer size also in + iplink_get()"). After update, we will not need to double the buffer size + every time when VFs number increased. + + With call like rtnl_talk(&rth, &req.n, NULL, 0), we can simply remove the + length parameter. + + With call like rtnl_talk(&rth, nlh, nlh, sizeof(req), I add a new variable + answer to avoid overwrite data in nlh, because it may has more info after + nlh. also this will avoid nlh buffer not enough issue. + + We need to free answer after using. + + Signed-off-by: Hangbin Liu + Signed-off-by: Phil Sutter + +Signed-off-by: Hangbin Liu +--- + bridge/fdb.c | 2 +- + bridge/link.c | 2 +- + bridge/mdb.c | 2 +- + bridge/vlan.c | 2 +- + genl/ctrl.c | 19 ++++++++++++------- + include/libnetlink.h | 6 +++--- + ip/ipaddress.c | 4 ++-- + ip/ipaddrlabel.c | 4 ++-- + ip/ipfou.c | 4 ++-- + ip/ipila.c | 4 ++-- + ip/ipl2tp.c | 8 ++++---- + ip/iplink.c | 38 +++++++++++++++++++------------------- + ip/iplink_vrf.c | 44 ++++++++++++++++++++------------------------ + ip/ipmacsec.c | 2 +- + ip/ipneigh.c | 2 +- + ip/ipnetns.c | 23 ++++++++++++++--------- + ip/ipntable.c | 2 +- + ip/iproute.c | 26 +++++++++++++++++--------- + ip/iprule.c | 6 +++--- + ip/iptoken.c | 2 +- + ip/link_gre.c | 11 +++++++---- + ip/link_gre6.c | 11 +++++++---- + ip/link_ip6tnl.c | 11 +++++++---- + ip/link_iptnl.c | 11 +++++++---- + ip/link_vti.c | 11 +++++++---- + ip/link_vti6.c | 11 +++++++---- + ip/tcp_metrics.c | 8 +++++--- + ip/xfrm_policy.c | 25 +++++++++++++------------ + ip/xfrm_state.c | 30 ++++++++++++++++-------------- + lib/libgenl.c | 9 +++++++-- + lib/libnetlink.c | 24 +++++++++++------------- + misc/ss.c | 2 +- + tc/m_action.c | 12 ++++++------ + tc/tc_class.c | 2 +- + tc/tc_filter.c | 8 +++++--- + tc/tc_qdisc.c | 2 +- + 36 files changed, 216 insertions(+), 174 deletions(-) + +diff --git a/bridge/fdb.c b/bridge/fdb.c +index a71a78f..4859edb 100644 +--- a/bridge/fdb.c ++++ b/bridge/fdb.c +@@ -529,7 +529,7 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv) + return -1; + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -1; + + return 0; +diff --git a/bridge/link.c b/bridge/link.c +index 93472ad..cc29a2a 100644 +--- a/bridge/link.c ++++ b/bridge/link.c +@@ -426,7 +426,7 @@ static int brlink_modify(int argc, char **argv) + addattr_nest_end(&req.n, nest); + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -1; + + return 0; +diff --git a/bridge/mdb.c b/bridge/mdb.c +index e60ff3e..fbd8184 100644 +--- a/bridge/mdb.c ++++ b/bridge/mdb.c +@@ -298,7 +298,7 @@ static int mdb_modify(int cmd, int flags, int argc, char **argv) + entry.vid = vid; + addattr_l(&req.n, sizeof(req), MDBA_SET_ENTRY, &entry, sizeof(entry)); + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -1; + + return 0; +diff --git a/bridge/vlan.c b/bridge/vlan.c +index ebcdace..5d68359 100644 +--- a/bridge/vlan.c ++++ b/bridge/vlan.c +@@ -133,7 +133,7 @@ static int vlan_modify(int cmd, int argc, char **argv) + + addattr_nest_end(&req.n, afspec); + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -1; + + return 0; +diff --git a/genl/ctrl.c b/genl/ctrl.c +index 6abd525..21e857c 100644 +--- a/genl/ctrl.c ++++ b/genl/ctrl.c +@@ -55,6 +55,7 @@ int genl_ctrl_resolve_family(const char *family) + }; + struct nlmsghdr *nlh = &req.n; + struct genlmsghdr *ghdr = &req.g; ++ struct nlmsghdr *answer = NULL; + + if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) { + fprintf(stderr, "Cannot open generic netlink socket\n"); +@@ -63,19 +64,19 @@ int genl_ctrl_resolve_family(const char *family) + + addattr_l(nlh, 128, CTRL_ATTR_FAMILY_NAME, family, strlen(family) + 1); + +- if (rtnl_talk(&rth, nlh, nlh, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, nlh, &answer) < 0) { + fprintf(stderr, "Error talking to the kernel\n"); + goto errout; + } + + { + struct rtattr *tb[CTRL_ATTR_MAX + 1]; +- int len = nlh->nlmsg_len; ++ int len = answer->nlmsg_len; + struct rtattr *attrs; + +- if (nlh->nlmsg_type != GENL_ID_CTRL) { ++ if (answer->nlmsg_type != GENL_ID_CTRL) { + fprintf(stderr, "Not a controller message, nlmsg_len=%d " +- "nlmsg_type=0x%x\n", nlh->nlmsg_len, nlh->nlmsg_type); ++ "nlmsg_type=0x%x\n", answer->nlmsg_len, answer->nlmsg_type); + goto errout; + } + +@@ -88,10 +89,11 @@ int genl_ctrl_resolve_family(const char *family) + + if (len < 0) { + fprintf(stderr, "wrong controller message len %d\n", len); ++ free(answer); + return -1; + } + +- attrs = (struct rtattr *) ((char *) ghdr + GENL_HDRLEN); ++ attrs = (struct rtattr *) ((char *) answer + NLMSG_LENGTH(GENL_HDRLEN)); + parse_rtattr(tb, CTRL_ATTR_MAX, attrs, len); + + if (tb[CTRL_ATTR_FAMILY_ID] == NULL) { +@@ -103,6 +105,7 @@ int genl_ctrl_resolve_family(const char *family) + } + + errout: ++ free(answer); + rtnl_close(&rth); + return ret; + } +@@ -299,6 +302,7 @@ static int ctrl_list(int cmd, int argc, char **argv) + .g.cmd = CTRL_CMD_GETFAMILY, + }; + struct nlmsghdr *nlh = &req.n; ++ struct nlmsghdr *answer = NULL; + + if (rtnl_open_byproto(&rth, 0, NETLINK_GENERIC) < 0) { + fprintf(stderr, "Cannot open generic netlink socket\n"); +@@ -331,12 +335,12 @@ static int ctrl_list(int cmd, int argc, char **argv) + goto ctrl_done; + } + +- if (rtnl_talk(&rth, nlh, nlh, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, nlh, &answer) < 0) { + fprintf(stderr, "Error talking to the kernel\n"); + goto ctrl_done; + } + +- if (print_ctrl2(NULL, nlh, (void *) stdout) < 0) { ++ if (print_ctrl2(NULL, answer, (void *) stdout) < 0) { + fprintf(stderr, "Dump terminated\n"); + goto ctrl_done; + } +@@ -358,6 +362,7 @@ static int ctrl_list(int cmd, int argc, char **argv) + + ret = 0; + ctrl_done: ++ free(answer); + rtnl_close(&rth); + return ret; + } +diff --git a/include/libnetlink.h b/include/libnetlink.h +index 654aebc..2136d2b 100644 +--- a/include/libnetlink.h ++++ b/include/libnetlink.h +@@ -82,13 +82,13 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth, + #define rtnl_dump_filter(rth, filter, arg) \ + rtnl_dump_filter_nc(rth, filter, arg, 0) + int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, +- struct nlmsghdr *answer, size_t len) ++ struct nlmsghdr **answer) + __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) ++ struct nlmsghdr **answer, 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) ++ struct nlmsghdr **answer) + __attribute__((warn_unused_result)); + int rtnl_send(struct rtnl_handle *rth, const void *buf, int) + __attribute__((warn_unused_result)); +diff --git a/ip/ipaddress.c b/ip/ipaddress.c +index b8d9c7d..7492075 100644 +--- a/ip/ipaddress.c ++++ b/ip/ipaddress.c +@@ -1356,7 +1356,7 @@ static int restore_handler(const struct sockaddr_nl *nl, + + ll_init_map(&rth); + +- ret = rtnl_talk(&rth, n, n, sizeof(*n)); ++ ret = rtnl_talk(&rth, n, NULL); + if ((ret < 0) && (errno == EEXIST)) + ret = 0; + +@@ -2064,7 +2064,7 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv) + return -1; + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/ipaddrlabel.c b/ip/ipaddrlabel.c +index 1d324da..6ea9bff 100644 +--- a/ip/ipaddrlabel.c ++++ b/ip/ipaddrlabel.c +@@ -176,7 +176,7 @@ static int ipaddrlabel_modify(int cmd, int argc, char **argv) + if (req.ifal.ifal_family == AF_UNSPEC) + req.ifal.ifal_family = AF_INET6; + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -203,7 +203,7 @@ static int flush_addrlabel(const struct sockaddr_nl *who, struct nlmsghdr *n, vo + if (rtnl_open(&rth2, 0) < 0) + return -1; + +- if (rtnl_talk(&rth2, n, NULL, 0) < 0) ++ if (rtnl_talk(&rth2, n, NULL) < 0) + return -2; + + rtnl_close(&rth2); +diff --git a/ip/ipfou.c b/ip/ipfou.c +index 00dbe15..23000dc 100644 +--- a/ip/ipfou.c ++++ b/ip/ipfou.c +@@ -116,7 +116,7 @@ static int do_add(int argc, char **argv) + + fou_parse_opt(argc, argv, &req.n, true); + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -128,7 +128,7 @@ static int do_del(int argc, char **argv) + + fou_parse_opt(argc, argv, &req.n, false); + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/ipila.c b/ip/ipila.c +index 843cc16..0403fc4 100644 +--- a/ip/ipila.c ++++ b/ip/ipila.c +@@ -220,7 +220,7 @@ static int do_add(int argc, char **argv) + + ila_parse_opt(argc, argv, &req.n, true); + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -232,7 +232,7 @@ static int do_del(int argc, char **argv) + + ila_parse_opt(argc, argv, &req.n, false); + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c +index 88664c9..742adbe 100644 +--- a/ip/ipl2tp.c ++++ b/ip/ipl2tp.c +@@ -129,7 +129,7 @@ static int create_tunnel(struct l2tp_parm *p) + addattr(&req.n, 1024, L2TP_ATTR_UDP_ZERO_CSUM6_RX); + } + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -142,7 +142,7 @@ static int delete_tunnel(struct l2tp_parm *p) + + addattr32(&req.n, 128, L2TP_ATTR_CONN_ID, p->tunnel_id); + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -185,7 +185,7 @@ static int create_session(struct l2tp_parm *p) + if (p->ifname && p->ifname[0]) + addattrstrz(&req.n, 1024, L2TP_ATTR_IFNAME, p->ifname); + +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -198,7 +198,7 @@ static int delete_session(struct l2tp_parm *p) + + addattr32(&req.n, 1024, L2TP_ATTR_CONN_ID, p->tunnel_id); + addattr32(&req.n, 1024, L2TP_ATTR_SESSION_ID, p->session_id); +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/iplink.c b/ip/iplink.c +index 5afbadf..b08d227 100644 +--- a/ip/iplink.c ++++ b/ip/iplink.c +@@ -247,19 +247,26 @@ static int nl_get_ll_addr_len(unsigned int dev_index) + .ifi_index = dev_index, + } + }; ++ struct nlmsghdr *answer; + struct rtattr *tb[IFLA_MAX+1]; + +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + return -1; + +- len = req.n.nlmsg_len - NLMSG_LENGTH(sizeof(req.i)); +- if (len < 0) ++ len = answer->nlmsg_len - NLMSG_LENGTH(sizeof(struct ifinfomsg)); ++ if (len < 0) { ++ free(answer); + return -1; ++ } + +- parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(&req.i), len, NLA_F_NESTED); +- if (!tb[IFLA_ADDRESS]) ++ parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), ++ len, NLA_F_NESTED); ++ if (!tb[IFLA_ADDRESS]) { ++ free(answer); + return -1; ++ } + ++ free(answer); + return RTA_PAYLOAD(tb[IFLA_ADDRESS]); + } + +@@ -903,7 +910,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) + + req.i.ifi_index = 0; + addattr32(&req.n, sizeof(req), IFLA_GROUP, group); +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + return 0; + } +@@ -998,7 +1005,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) + return -1; + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -1013,10 +1020,7 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask) + .n.nlmsg_type = RTM_GETLINK, + .i.ifi_family = preferred_family, + }; +- struct { +- struct nlmsghdr n; +- char buf[32768]; +- } answer; ++ struct nlmsghdr *answer; + + if (name) { + len = strlen(name) + 1; +@@ -1029,19 +1033,15 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask) + } + addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, 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)); ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + return -2; +- } + + if (brief) +- print_linkinfo_brief(NULL, &answer.n, stdout); ++ print_linkinfo_brief(NULL, answer, stdout); + else +- print_linkinfo(NULL, &answer.n, stdout); ++ print_linkinfo(NULL, answer, stdout); + ++ free(answer); + return 0; + } + +diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c +index 917630e..370bb86 100644 +--- a/ip/iplink_vrf.c ++++ b/ip/iplink_vrf.c +@@ -114,10 +114,7 @@ __u32 ipvrf_get_table(const char *name) + .ifi_family = preferred_family, + }, + }; +- struct { +- struct nlmsghdr n; +- char buf[8192]; +- } answer; ++ struct nlmsghdr *answer; + struct rtattr *tb[IFLA_MAX+1]; + struct rtattr *li[IFLA_INFO_MAX+1]; + struct rtattr *vrf_attr[IFLA_VRF_MAX + 1]; +@@ -127,8 +124,7 @@ __u32 ipvrf_get_table(const char *name) + + addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1); + +- if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, +- &answer.n, sizeof(answer)) < 0) { ++ if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0) { + /* special case "default" vrf to be the main table */ + if (errno == ENODEV && !strcmp(name, "default")) + rtnl_rttable_a2n(&tb_id, "main"); +@@ -136,25 +132,25 @@ __u32 ipvrf_get_table(const char *name) + return tb_id; + } + +- ifi = NLMSG_DATA(&answer.n); +- len = answer.n.nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); ++ ifi = NLMSG_DATA(answer); ++ len = answer->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) { + fprintf(stderr, "BUG: Invalid response to link query.\n"); +- return 0; ++ goto out; + } + + parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); + + if (!tb[IFLA_LINKINFO]) +- return 0; ++ goto out; + + parse_rtattr_nested(li, IFLA_INFO_MAX, tb[IFLA_LINKINFO]); + + if (!li[IFLA_INFO_KIND] || !li[IFLA_INFO_DATA]) +- return 0; ++ goto out; + + if (strcmp(RTA_DATA(li[IFLA_INFO_KIND]), "vrf")) +- return 0; ++ goto out; + + parse_rtattr_nested(vrf_attr, IFLA_VRF_MAX, li[IFLA_INFO_DATA]); + if (vrf_attr[IFLA_VRF_TABLE]) +@@ -163,6 +159,8 @@ __u32 ipvrf_get_table(const char *name) + if (!tb_id) + fprintf(stderr, "BUG: VRF %s is missing table id\n", name); + ++out: ++ free(answer); + return tb_id; + } + +@@ -182,10 +180,7 @@ int name_is_vrf(const char *name) + .ifi_family = preferred_family, + }, + }; +- struct { +- struct nlmsghdr n; +- char buf[8192]; +- } answer; ++ struct nlmsghdr *answer; + struct rtattr *tb[IFLA_MAX+1]; + struct rtattr *li[IFLA_INFO_MAX+1]; + struct ifinfomsg *ifi; +@@ -193,29 +188,30 @@ int name_is_vrf(const char *name) + + addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1); + +- if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, +- &answer.n, sizeof(answer)) < 0) ++ if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0) + return 0; + +- ifi = NLMSG_DATA(&answer.n); +- len = answer.n.nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); ++ ifi = NLMSG_DATA(answer); ++ len = answer->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) { + fprintf(stderr, "BUG: Invalid response to link query.\n"); +- return 0; ++ goto out; + } + + parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); + + if (!tb[IFLA_LINKINFO]) +- return 0; ++ goto out; + + parse_rtattr_nested(li, IFLA_INFO_MAX, tb[IFLA_LINKINFO]); + + if (!li[IFLA_INFO_KIND]) +- return 0; ++ goto out; + + if (strcmp(RTA_DATA(li[IFLA_INFO_KIND]), "vrf")) +- return 0; ++ goto out; + ++out: ++ free(answer); + return ifi->ifi_index; + } +diff --git a/ip/ipmacsec.c b/ip/ipmacsec.c +index aa89a00..9a2d0eb 100644 +--- a/ip/ipmacsec.c ++++ b/ip/ipmacsec.c +@@ -421,7 +421,7 @@ static int do_modify_nl(enum cmd c, enum macsec_nl_commands cmd, int ifindex, + addattr_nest_end(&req.n, attr_sa); + + talk: +- if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/ipneigh.c b/ip/ipneigh.c +index 9c38a60..32f2d55 100644 +--- a/ip/ipneigh.c ++++ b/ip/ipneigh.c +@@ -184,7 +184,7 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv) + return -1; + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + return 0; +diff --git a/ip/ipnetns.c b/ip/ipnetns.c +index 4254994..1c0ade9 100644 +--- a/ip/ipnetns.c ++++ b/ip/ipnetns.c +@@ -95,12 +95,13 @@ static int get_netnsid_from_name(const char *name) + struct nlmsghdr n; + struct rtgenmsg g; + char buf[1024]; +- } answer, req = { ++ } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)), + .n.nlmsg_flags = NLM_F_REQUEST, + .n.nlmsg_type = RTM_GETNSID, + .g.rtgen_family = AF_UNSPEC, + }; ++ struct nlmsghdr *answer; + struct rtattr *tb[NETNSA_MAX + 1]; + struct rtgenmsg *rthdr; + int len, fd; +@@ -110,26 +111,30 @@ static int get_netnsid_from_name(const char *name) + return fd; + + addattr32(&req.n, 1024, NETNSA_FD, fd); +- if (rtnl_talk(&rtnsh, &req.n, &answer.n, sizeof(answer)) < 0) { ++ if (rtnl_talk(&rtnsh, &req.n, &answer) < 0) { + close(fd); + return -2; + } + close(fd); + + /* Validate message and parse attributes */ +- if (answer.n.nlmsg_type == NLMSG_ERROR) +- return -1; ++ if (answer->nlmsg_type == NLMSG_ERROR) ++ goto err_out; + +- rthdr = NLMSG_DATA(&answer.n); +- len = answer.n.nlmsg_len - NLMSG_SPACE(sizeof(*rthdr)); ++ rthdr = NLMSG_DATA(answer); ++ len = answer->nlmsg_len - NLMSG_SPACE(sizeof(*rthdr)); + if (len < 0) +- return -1; ++ goto err_out; + + parse_rtattr(tb, NETNSA_MAX, NETNS_RTA(rthdr), len); + +- if (tb[NETNSA_NSID]) ++ if (tb[NETNSA_NSID]) { ++ free(answer); + return rta_getattr_u32(tb[NETNSA_NSID]); ++ } + ++err_out: ++ free(answer); + return -1; + } + +@@ -690,7 +695,7 @@ static int set_netnsid_from_name(const char *name, int nsid) + + addattr32(&req.n, 1024, NETNSA_FD, fd); + addattr32(&req.n, 1024, NETNSA_NSID, nsid); +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + err = -2; + + close(fd); +diff --git a/ip/ipntable.c b/ip/ipntable.c +index 879626e..6506332 100644 +--- a/ip/ipntable.c ++++ b/ip/ipntable.c +@@ -306,7 +306,7 @@ static int ipntable_modify(int cmd, int flags, int argc, char **argv) + RTA_PAYLOAD(parms_rta)); + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + return 0; +diff --git a/ip/iproute.c b/ip/iproute.c +index 5e23613..35fdce8 100644 +--- a/ip/iproute.c ++++ b/ip/iproute.c +@@ -1271,7 +1271,7 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv) + if (!type_ok && req.r.rtm_family == AF_MPLS) + req.r.rtm_type = RTN_UNICAST; + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + + return 0; +@@ -1649,6 +1649,7 @@ static int iproute_get(int argc, char **argv) + }; + char *idev = NULL; + char *odev = NULL; ++ struct nlmsghdr *answer; + int connected = 0; + int from_ok = 0; + unsigned int mark = 0; +@@ -1753,26 +1754,29 @@ static int iproute_get(int argc, char **argv) + + req.r.rtm_flags |= RTM_F_LOOKUP_TABLE; + +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + return -2; + + if (connected && !from_ok) { +- struct rtmsg *r = NLMSG_DATA(&req.n); +- int len = req.n.nlmsg_len; ++ struct rtmsg *r = NLMSG_DATA(answer); ++ int len = answer->nlmsg_len; + struct rtattr *tb[RTA_MAX+1]; + +- if (print_route(NULL, &req.n, (void *)stdout) < 0) { ++ if (print_route(NULL, answer, (void *)stdout) < 0) { + fprintf(stderr, "An error :-)\n"); ++ free(answer); + return -1; + } + +- if (req.n.nlmsg_type != RTM_NEWROUTE) { ++ if (answer->nlmsg_type != RTM_NEWROUTE) { + fprintf(stderr, "Not a route?\n"); ++ free(answer); + return -1; + } + len -= NLMSG_LENGTH(sizeof(*r)); + if (len < 0) { + fprintf(stderr, "Wrong len %d\n", len); ++ free(answer); + return -1; + } + +@@ -1783,6 +1787,7 @@ static int iproute_get(int argc, char **argv) + r->rtm_src_len = 8*RTA_PAYLOAD(tb[RTA_PREFSRC]); + } else if (!tb[RTA_SRC]) { + fprintf(stderr, "Failed to connect the route\n"); ++ free(answer); + return -1; + } + if (!odev && tb[RTA_OIF]) +@@ -1796,15 +1801,18 @@ static int iproute_get(int argc, char **argv) + req.n.nlmsg_flags = NLM_F_REQUEST; + req.n.nlmsg_type = RTM_GETROUTE; + +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) ++ free(answer); ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + return -2; + } + +- if (print_route(NULL, &req.n, (void *)stdout) < 0) { ++ if (print_route(NULL, answer, (void *)stdout) < 0) { + fprintf(stderr, "An error :-)\n"); ++ free(answer); + return -1; + } + ++ free(answer); + return 0; + } + +@@ -1848,7 +1856,7 @@ restore: + + ll_init_map(&rth); + +- ret = rtnl_talk(&rth, n, n, sizeof(*n)); ++ ret = rtnl_talk(&rth, n, NULL); + if ((ret < 0) && (errno == EEXIST)) + ret = 0; + +diff --git a/ip/iprule.c b/ip/iprule.c +index 8313138..e64b4d7 100644 +--- a/ip/iprule.c ++++ b/ip/iprule.c +@@ -393,7 +393,7 @@ static int flush_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, + if (rtnl_open(&rth2, 0) < 0) + return -1; + +- if (rtnl_talk(&rth2, n, NULL, 0) < 0) ++ if (rtnl_talk(&rth2, n, NULL) < 0) + return -2; + + rtnl_close(&rth2); +@@ -553,7 +553,7 @@ static int restore_handler(const struct sockaddr_nl *nl, + + ll_init_map(&rth); + +- ret = rtnl_talk(&rth, n, n, sizeof(*n)); ++ ret = rtnl_talk(&rth, n, NULL); + if ((ret < 0) && (errno == EEXIST)) + ret = 0; + +@@ -760,7 +760,7 @@ static int iprule_modify(int cmd, int argc, char **argv) + if (!table_ok && cmd == RTM_NEWRULE) + req.r.rtm_table = RT_TABLE_MAIN; + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/iptoken.c b/ip/iptoken.c +index 1869f76..0528bad 100644 +--- a/ip/iptoken.c ++++ b/ip/iptoken.c +@@ -166,7 +166,7 @@ static int iptoken_set(int argc, char **argv, bool delete) + addattr_nest_end(&req.n, afs6); + addattr_nest_end(&req.n, afs); + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return -2; + + return 0; +diff --git a/ip/link_gre.c b/ip/link_gre.c +index 35d437a..ced9936 100644 +--- a/ip/link_gre.c ++++ b/ip/link_gre.c +@@ -64,7 +64,6 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + struct { + struct nlmsghdr n; + struct ifinfomsg i; +- char buf[16384]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)), + .n.nlmsg_flags = NLM_F_REQUEST, +@@ -72,6 +71,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + .i.ifi_family = preferred_family, + .i.ifi_index = ifi->ifi_index, + }; ++ struct nlmsghdr *answer = NULL; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *greinfo[IFLA_GRE_MAX + 1]; +@@ -93,19 +93,20 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + __u8 metadata = 0; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + get_failed: + fprintf(stderr, + "Failed to get existing tunnel info.\n"); ++ free(answer); + return -1; + } + +- len = req.n.nlmsg_len; ++ len = answer->nlmsg_len; + len -= NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) + goto get_failed; + +- parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len); ++ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len); + + if (!tb[IFLA_LINKINFO]) + goto get_failed; +@@ -160,6 +161,8 @@ get_failed: + + if (greinfo[IFLA_GRE_COLLECT_METADATA]) + metadata = 1; ++ ++ free(answer); + } + + while (argc > 0) { +diff --git a/ip/link_gre6.c b/ip/link_gre6.c +index fe3ab64..932f9ee 100644 +--- a/ip/link_gre6.c ++++ b/ip/link_gre6.c +@@ -76,7 +76,6 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + struct { + struct nlmsghdr n; + struct ifinfomsg i; +- char buf[1024]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)), + .n.nlmsg_flags = NLM_F_REQUEST, +@@ -84,6 +83,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + .i.ifi_family = preferred_family, + .i.ifi_index = ifi->ifi_index, + }; ++ struct nlmsghdr *answer = NULL; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *greinfo[IFLA_GRE_MAX + 1]; +@@ -105,19 +105,20 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + int len; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + get_failed: + fprintf(stderr, + "Failed to get existing tunnel info.\n"); ++ free(answer); + return -1; + } + +- len = req.n.nlmsg_len; ++ len = answer->nlmsg_len; + len -= NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) + goto get_failed; + +- parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len); ++ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len); + + if (!tb[IFLA_LINKINFO]) + goto get_failed; +@@ -174,6 +175,8 @@ get_failed: + + if (greinfo[IFLA_GRE_ENCAP_DPORT]) + encapdport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_DPORT]); ++ ++ free(answer); + } + + while (argc > 0) { +diff --git a/ip/link_ip6tnl.c b/ip/link_ip6tnl.c +index 6bb968d..2304364 100644 +--- a/ip/link_ip6tnl.c ++++ b/ip/link_ip6tnl.c +@@ -74,7 +74,6 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv, + struct { + struct nlmsghdr n; + struct ifinfomsg i; +- char buf[2048]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)), + .n.nlmsg_flags = NLM_F_REQUEST, +@@ -82,6 +81,7 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv, + .i.ifi_family = preferred_family, + .i.ifi_index = ifi->ifi_index, + }; ++ struct nlmsghdr *answer = NULL; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *iptuninfo[IFLA_IPTUN_MAX + 1]; +@@ -101,19 +101,20 @@ static int ip6tunnel_parse_opt(struct link_util *lu, int argc, char **argv, + __u8 metadata = 0; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + get_failed: + fprintf(stderr, + "Failed to get existing tunnel info.\n"); ++ free(answer); + return -1; + } + +- len = req.n.nlmsg_len; ++ len = answer->nlmsg_len; + len -= NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) + goto get_failed; + +- parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len); ++ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len); + + if (!tb[IFLA_LINKINFO]) + goto get_failed; +@@ -153,6 +154,8 @@ get_failed: + proto = rta_getattr_u8(iptuninfo[IFLA_IPTUN_PROTO]); + if (iptuninfo[IFLA_IPTUN_COLLECT_METADATA]) + metadata = 1; ++ ++ free(answer); + } + + while (argc > 0) { +diff --git a/ip/link_iptnl.c b/ip/link_iptnl.c +index f180b92..528e287 100644 +--- a/ip/link_iptnl.c ++++ b/ip/link_iptnl.c +@@ -72,7 +72,6 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv, + struct { + struct nlmsghdr n; + struct ifinfomsg i; +- char buf[2048]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)), + .n.nlmsg_flags = NLM_F_REQUEST, +@@ -80,6 +79,7 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv, + .i.ifi_family = preferred_family, + .i.ifi_index = ifi->ifi_index, + }; ++ struct nlmsghdr *answer = NULL; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *iptuninfo[IFLA_IPTUN_MAX + 1]; +@@ -103,19 +103,20 @@ static int iptunnel_parse_opt(struct link_util *lu, int argc, char **argv, + __u8 metadata = 0; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + get_failed: + fprintf(stderr, + "Failed to get existing tunnel info.\n"); ++ free(answer); + return -1; + } + +- len = req.n.nlmsg_len; ++ len = answer->nlmsg_len; + len -= NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) + goto get_failed; + +- parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len); ++ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len); + + if (!tb[IFLA_LINKINFO]) + goto get_failed; +@@ -179,6 +180,8 @@ get_failed: + rta_getattr_u16(iptuninfo[IFLA_IPTUN_6RD_RELAY_PREFIXLEN]); + if (iptuninfo[IFLA_IPTUN_COLLECT_METADATA]) + metadata = 1; ++ ++ free(answer); + } + + while (argc > 0) { +diff --git a/ip/link_vti.c b/ip/link_vti.c +index 95bc23e..d2aacbe 100644 +--- a/ip/link_vti.c ++++ b/ip/link_vti.c +@@ -51,7 +51,6 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv, + struct { + struct nlmsghdr n; + struct ifinfomsg i; +- char buf[1024]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)), + .n.nlmsg_flags = NLM_F_REQUEST, +@@ -59,6 +58,7 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv, + .i.ifi_family = preferred_family, + .i.ifi_index = ifi->ifi_index, + }; ++ struct nlmsghdr *answer = NULL; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *vtiinfo[IFLA_VTI_MAX + 1]; +@@ -70,19 +70,20 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv, + int len; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + get_failed: + fprintf(stderr, + "Failed to get existing tunnel info.\n"); ++ free(answer); + return -1; + } + +- len = req.n.nlmsg_len; ++ len = answer->nlmsg_len; + len -= NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) + goto get_failed; + +- parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len); ++ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len); + + if (!tb[IFLA_LINKINFO]) + goto get_failed; +@@ -109,6 +110,8 @@ get_failed: + + if (vtiinfo[IFLA_VTI_LINK]) + link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]); ++ ++ free(answer); + } + + while (argc > 0) { +diff --git a/ip/link_vti6.c b/ip/link_vti6.c +index 9ca127a..aedfbea 100644 +--- a/ip/link_vti6.c ++++ b/ip/link_vti6.c +@@ -46,7 +46,6 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv, + struct { + struct nlmsghdr n; + struct ifinfomsg i; +- char buf[1024]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(*ifi)), + .n.nlmsg_flags = NLM_F_REQUEST, +@@ -54,6 +53,7 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv, + .i.ifi_family = preferred_family, + .i.ifi_index = ifi->ifi_index, + }; ++ struct nlmsghdr *answer = NULL; + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *vtiinfo[IFLA_VTI_MAX + 1]; +@@ -65,19 +65,20 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv, + int len; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + get_failed: + fprintf(stderr, + "Failed to get existing tunnel info.\n"); ++ free(answer); + return -1; + } + +- len = req.n.nlmsg_len; ++ len = answer->nlmsg_len; + len -= NLMSG_LENGTH(sizeof(*ifi)); + if (len < 0) + goto get_failed; + +- parse_rtattr(tb, IFLA_MAX, IFLA_RTA(&req.i), len); ++ parse_rtattr(tb, IFLA_MAX, IFLA_RTA(NLMSG_DATA(answer)), len); + + if (!tb[IFLA_LINKINFO]) + goto get_failed; +@@ -104,6 +105,8 @@ get_failed: + + if (vtiinfo[IFLA_VTI_LINK]) + link = rta_getattr_u8(vtiinfo[IFLA_VTI_LINK]); ++ ++ free(answer); + } + + while (argc > 0) { +diff --git a/ip/tcp_metrics.c b/ip/tcp_metrics.c +index 8972acd..3f9790e 100644 +--- a/ip/tcp_metrics.c ++++ b/ip/tcp_metrics.c +@@ -306,6 +306,7 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n, + static int tcpm_do_cmd(int cmd, int argc, char **argv) + { + TCPM_REQUEST(req, 1024, TCP_METRICS_CMD_GET, NLM_F_REQUEST); ++ struct nlmsghdr *answer; + int atype = -1, stype = -1; + int ack; + +@@ -457,15 +458,16 @@ static int tcpm_do_cmd(int cmd, int argc, char **argv) + } + + if (ack) { +- if (rtnl_talk(&grth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&grth, &req.n, NULL) < 0) + return -2; + } else if (atype >= 0) { +- if (rtnl_talk(&grth, &req.n, &req.n, sizeof(req)) < 0) ++ if (rtnl_talk(&grth, &req.n, &answer) < 0) + return -2; +- if (process_msg(NULL, &req.n, stdout) < 0) { ++ if (process_msg(NULL, answer, stdout) < 0) { + fprintf(stderr, "Dump terminated\n"); + exit(1); + } ++ free(answer); + } else { + req.n.nlmsg_seq = grth.dump = ++grth.seq; + if (rtnl_send(&grth, &req, req.n.nlmsg_len) < 0) { +diff --git a/ip/xfrm_policy.c b/ip/xfrm_policy.c +index de689c4..98460a0 100644 +--- a/ip/xfrm_policy.c ++++ b/ip/xfrm_policy.c +@@ -386,7 +386,7 @@ static int xfrm_policy_modify(int cmd, unsigned int flags, int argc, char **argv + if (req.xpinfo.sel.family == AF_UNSPEC) + req.xpinfo.sel.family = AF_INET; + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + rtnl_close(&rth); +@@ -548,7 +548,7 @@ int xfrm_policy_print(const struct sockaddr_nl *who, struct nlmsghdr *n, + } + + static int xfrm_policy_get_or_delete(int argc, char **argv, int delete, +- void *res_nlbuf, size_t res_size) ++ struct nlmsghdr **answer) + { + struct rtnl_handle rth; + struct { +@@ -659,7 +659,7 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete, + (void *)&ctx, ctx.sctx.len); + } + +- if (rtnl_talk(&rth, &req.n, res_nlbuf, res_size) < 0) ++ if (rtnl_talk(&rth, &req.n, answer) < 0) + exit(2); + + rtnl_close(&rth); +@@ -669,21 +669,21 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete, + + static int xfrm_policy_delete(int argc, char **argv) + { +- return xfrm_policy_get_or_delete(argc, argv, 1, NULL, 0); ++ return xfrm_policy_get_or_delete(argc, argv, 1, NULL); + } + + static int xfrm_policy_get(int argc, char **argv) + { +- char buf[NLMSG_BUF_SIZE] = {}; +- struct nlmsghdr *n = (struct nlmsghdr *)buf; ++ struct nlmsghdr *n = NULL; + +- xfrm_policy_get_or_delete(argc, argv, 0, n, sizeof(buf)); ++ xfrm_policy_get_or_delete(argc, argv, 0, &n); + + if (xfrm_policy_print(NULL, n, (void *)stdout) < 0) { + fprintf(stderr, "An error :-)\n"); + exit(1); + } + ++ free(n); + return 0; + } + +@@ -1049,7 +1049,7 @@ static int xfrm_spd_setinfo(int argc, char **argv) + if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) + exit(1); + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + rtnl_close(&rth); +@@ -1063,22 +1063,23 @@ static int xfrm_spd_getinfo(int argc, char **argv) + struct { + struct nlmsghdr n; + __u32 flags; +- char ans[128]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(__u32)), + .n.nlmsg_flags = NLM_F_REQUEST, + .n.nlmsg_type = XFRM_MSG_GETSPDINFO, + .flags = 0XFFFFFFFF, + }; ++ struct nlmsghdr *answer; + + if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) + exit(1); + +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + exit(2); + +- print_spdinfo(&req.n, (void *)stdout); ++ print_spdinfo(answer, (void *)stdout); + ++ free(answer); + rtnl_close(&rth); + + return 0; +@@ -1123,7 +1124,7 @@ static int xfrm_policy_flush(int argc, char **argv) + if (show_stats > 1) + fprintf(stderr, "Flush policy\n"); + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + rtnl_close(&rth); +diff --git a/ip/xfrm_state.c b/ip/xfrm_state.c +index ea7d4f3..04ed349 100644 +--- a/ip/xfrm_state.c ++++ b/ip/xfrm_state.c +@@ -677,7 +677,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv) + if (req.xsinfo.family == AF_UNSPEC) + req.xsinfo.family = AF_INET; + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + rtnl_close(&rth); +@@ -708,8 +708,7 @@ static int xfrm_state_allocspi(int argc, char **argv) + char *minp = NULL; + char *maxp = NULL; + struct xfrm_mark mark = {0, 0}; +- char res_buf[NLMSG_BUF_SIZE] = {}; +- struct nlmsghdr *res_n = (struct nlmsghdr *)res_buf; ++ struct nlmsghdr *answer; + + while (argc > 0) { + if (strcmp(*argv, "mode") == 0) { +@@ -809,14 +808,15 @@ static int xfrm_state_allocspi(int argc, char **argv) + req.xspi.info.family = AF_INET; + + +- if (rtnl_talk(&rth, &req.n, res_n, sizeof(res_buf)) < 0) ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + exit(2); + +- if (xfrm_state_print(NULL, res_n, (void *)stdout) < 0) { ++ if (xfrm_state_print(NULL, answer, (void *)stdout) < 0) { + fprintf(stderr, "An error :-)\n"); + exit(1); + } + ++ free(answer); + rtnl_close(&rth); + + return 0; +@@ -997,19 +997,20 @@ static int xfrm_state_get_or_delete(int argc, char **argv, int delete) + req.xsid.family = AF_INET; + + if (delete) { +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + } else { +- char buf[NLMSG_BUF_SIZE] = {}; +- struct nlmsghdr *res_n = (struct nlmsghdr *)buf; ++ struct nlmsghdr *answer; + +- if (rtnl_talk(&rth, &req.n, res_n, sizeof(req)) < 0) ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + exit(2); + +- if (xfrm_state_print(NULL, res_n, (void *)stdout) < 0) { ++ if (xfrm_state_print(NULL, answer, (void *)stdout) < 0) { + fprintf(stderr, "An error :-)\n"); + exit(1); + } ++ ++ free(answer); + } + + rtnl_close(&rth); +@@ -1265,22 +1266,23 @@ static int xfrm_sad_getinfo(int argc, char **argv) + struct { + struct nlmsghdr n; + __u32 flags; +- char ans[64]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(req.flags)), + .n.nlmsg_flags = NLM_F_REQUEST, + .n.nlmsg_type = XFRM_MSG_GETSADINFO, + .flags = 0XFFFFFFFF, + }; ++ struct nlmsghdr *answer; + + if (rtnl_open_byproto(&rth, 0, NETLINK_XFRM) < 0) + exit(1); + +- if (rtnl_talk(&rth, &req.n, &req.n, sizeof(req)) < 0) ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) + exit(2); + +- print_sadinfo(&req.n, (void *)stdout); ++ print_sadinfo(answer, (void *)stdout); + ++ free(answer); + rtnl_close(&rth); + + return 0; +@@ -1327,7 +1329,7 @@ static int xfrm_state_flush(int argc, char **argv) + fprintf(stderr, "Flush state with XFRM-PROTO value \"%s\"\n", + strxf_xfrmproto(req.xsf.proto)); + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + exit(2); + + rtnl_close(&rth); +diff --git a/lib/libgenl.c b/lib/libgenl.c +index 50d2d92..bb5fbb5 100644 +--- a/lib/libgenl.c ++++ b/lib/libgenl.c +@@ -49,16 +49,21 @@ int genl_resolve_family(struct rtnl_handle *grth, const char *family) + { + GENL_REQUEST(req, 1024, GENL_ID_CTRL, 0, 0, CTRL_CMD_GETFAMILY, + NLM_F_REQUEST); ++ struct nlmsghdr *answer; ++ int fnum; + + addattr_l(&req.n, sizeof(req), CTRL_ATTR_FAMILY_NAME, + family, strlen(family) + 1); + +- if (rtnl_talk(grth, &req.n, &req.n, sizeof(req)) < 0) { ++ if (rtnl_talk(grth, &req.n, &answer) < 0) { + fprintf(stderr, "Error talking to the kernel\n"); + return -2; + } + +- return genl_parse_getfamily(&req.n); ++ fnum = genl_parse_getfamily(answer); ++ free(answer); ++ ++ return fnum; + } + + int genl_init_handle(struct rtnl_handle *grth, const char *family, +diff --git a/lib/libnetlink.c b/lib/libnetlink.c +index 446c960..75e20ab 100644 +--- a/lib/libnetlink.c ++++ b/lib/libnetlink.c +@@ -561,7 +561,7 @@ static void rtnl_talk_error(struct nlmsghdr *h, struct nlmsgerr *err, + } + + static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, +- struct nlmsghdr *answer, size_t maxlen, ++ struct nlmsghdr **answer, + bool show_rtnl_err, nl_ext_ack_fn_t errfn) + { + int status; +@@ -635,9 +635,9 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, + fprintf(stderr, "ERROR truncated\n"); + } else if (!err->error) { + if (answer) +- memcpy(answer, h, +- MIN(maxlen, h->nlmsg_len)); +- free(buf); ++ *answer = (struct nlmsghdr *)buf; ++ else ++ free(buf); + return 0; + } + +@@ -651,9 +651,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, + } + + if (answer) { +- memcpy(answer, h, +- MIN(maxlen, h->nlmsg_len)); +- free(buf); ++ *answer = (struct nlmsghdr *)buf; + return 0; + } + +@@ -677,22 +675,22 @@ 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) ++ struct nlmsghdr **answer) + { +- return __rtnl_talk(rtnl, n, answer, maxlen, true, NULL); ++ return __rtnl_talk(rtnl, n, answer, true, NULL); + } + + int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n, +- struct nlmsghdr *answer, size_t maxlen, ++ struct nlmsghdr **answer, + nl_ext_ack_fn_t errfn) + { +- return __rtnl_talk(rtnl, n, answer, maxlen, true, errfn); ++ return __rtnl_talk(rtnl, n, answer, true, errfn); + } + + int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n, +- struct nlmsghdr *answer, size_t maxlen) ++ struct nlmsghdr **answer) + { +- return __rtnl_talk(rtnl, n, answer, maxlen, false, NULL); ++ return __rtnl_talk(rtnl, n, answer, false, NULL); + } + + int rtnl_listen_all_nsid(struct rtnl_handle *rth) +diff --git a/misc/ss.c b/misc/ss.c +index b84baf3..d3fb9a7 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -2588,7 +2588,7 @@ static int kill_inet_sock(struct nlmsghdr *h, void *arg, struct sockstat *s) + raw->sdiag_raw_protocol = s->raw_prot; + } + +- return rtnl_talk(rth, &req.nlh, NULL, 0); ++ return rtnl_talk(rth, &req.nlh, NULL); + } + + static int show_one_inet_sock(const struct sockaddr_nl *addr, +diff --git a/tc/m_action.c b/tc/m_action.c +index 6ebe85e..90b2a11 100644 +--- a/tc/m_action.c ++++ b/tc/m_action.c +@@ -506,18 +506,18 @@ static int tc_action_gd(int cmd, unsigned int flags, int *argc_p, char ***argv_p + tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail; + + req.n.nlmsg_seq = rth.dump = ++rth.seq; +- if (cmd == RTM_GETACTION) +- ans = &req.n; + +- if (rtnl_talk(&rth, &req.n, ans, MAX_MSG) < 0) { ++ if (rtnl_talk(&rth, &req.n, &ans) < 0) { + fprintf(stderr, "We have an error talking to the kernel\n"); + return 1; + } + +- if (ans && print_action(NULL, &req.n, (void *)stdout) < 0) { ++ if (cmd == RTM_GETACTION && print_action(NULL, ans, stdout) < 0) { + fprintf(stderr, "Dump terminated\n"); ++ free(ans); + return 1; + } ++ free(ans); + + *argc_p = argc; + *argv_p = argv; +@@ -550,7 +550,7 @@ static int tc_action_modify(int cmd, unsigned int flags, int *argc_p, char ***ar + } + tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail; + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) { ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) { + fprintf(stderr, "We have an error talking to the kernel\n"); + ret = -1; + } +@@ -617,7 +617,7 @@ static int tc_act_list_or_flush(int argc, char **argv, int event) + req.n.nlmsg_type = RTM_DELACTION; + req.n.nlmsg_flags |= NLM_F_ROOT; + req.n.nlmsg_flags |= NLM_F_REQUEST; +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) { ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) { + fprintf(stderr, "We have an error flushing\n"); + return 1; + } +diff --git a/tc/tc_class.c b/tc/tc_class.c +index 1a1f1fa..0214775 100644 +--- a/tc/tc_class.c ++++ b/tc/tc_class.c +@@ -149,7 +149,7 @@ static int tc_class_modify(int cmd, unsigned int flags, int argc, char **argv) + } + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return 2; + + return 0; +diff --git a/tc/tc_filter.c b/tc/tc_filter.c +index ff8713b..e640492 100644 +--- a/tc/tc_filter.c ++++ b/tc/tc_filter.c +@@ -181,7 +181,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + } + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) { ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) { + fprintf(stderr, "We have an error talking to the kernel\n"); + return 2; + } +@@ -307,6 +307,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + .t.tcm_parent = TC_H_UNSPEC, + .t.tcm_family = AF_UNSPEC, + }; ++ struct nlmsghdr *answer; + struct filter_util *q = NULL; + __u32 prio = 0; + __u32 protocol = 0; +@@ -445,13 +446,14 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + return -1; + } + +- if (rtnl_talk(&rth, &req.n, &req.n, MAX_MSG) < 0) { ++ if (rtnl_talk(&rth, &req.n, &answer) < 0) { + fprintf(stderr, "We have an error talking to the kernel\n"); + return 2; + } + +- print_filter(NULL, &req.n, (void *)stdout); ++ print_filter(NULL, answer, (void *)stdout); + ++ free(answer); + return 0; + } + +diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c +index 3a3701c..8b0c5c7 100644 +--- a/tc/tc_qdisc.c ++++ b/tc/tc_qdisc.c +@@ -190,7 +190,7 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) + req.t.tcm_ifindex = idx; + } + +- if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) ++ if (rtnl_talk(&rth, &req.n, NULL) < 0) + return 2; + + return 0; +-- +1.8.3.1 + diff --git a/SOURCES/0024-Update-linux-headers.patch b/SOURCES/0024-Update-linux-headers.patch new file mode 100644 index 0000000..a7c413c --- /dev/null +++ b/SOURCES/0024-Update-linux-headers.patch @@ -0,0 +1,2048 @@ +From 7f123fac8aa0ff7741777935121e1b394c56e75a Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Fri, 10 Nov 2017 10:19:43 +0100 +Subject: [PATCH] Update linux headers + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539 + +This updates include/linux to the state just before commit 596b1c94aa38e +("iproute: build more easily on Android"). +--- + include/linux/bpf.h | 253 ++++++++++++++++++++++- + include/linux/can/vxcan.h | 12 ++ + include/linux/devlink.h | 92 ++++++++- + include/linux/elf-em.h | 1 - + include/linux/if_arp.h | 2 + + include/linux/if_ether.h | 6 + + include/linux/if_link.h | 37 +++- + include/linux/if_packet.h | 1 + + include/linux/if_tunnel.h | 4 + + include/linux/inet_diag.h | 2 + + include/linux/ipsec.h | 47 +++++ + include/linux/lwtunnel.h | 1 + + include/linux/magic.h | 3 + + include/linux/mpls_iptunnel.h | 2 + + include/linux/neighbour.h | 1 + + include/linux/netlink.h | 67 +++++- + include/linux/netlink_diag.h | 10 + + include/linux/pfkeyv2.h | 383 +++++++++++++++++++++++++++++++++++ + include/linux/pkt_cls.h | 37 +++- + include/linux/pkt_sched.h | 8 + + include/linux/rtnetlink.h | 36 +++- + include/linux/sctp.h | 38 ++++ + include/linux/seg6.h | 54 +++++ + include/linux/seg6_genl.h | 32 +++ + include/linux/seg6_hmac.h | 22 ++ + include/linux/seg6_iptunnel.h | 40 ++++ + include/linux/seg6_local.h | 68 +++++++ + include/linux/tc_act/tc_bpf.h | 1 + + include/linux/tc_act/tc_tunnel_key.h | 1 + + include/linux/tcp.h | 27 ++- + include/linux/xfrm.h | 9 + + 31 files changed, 1272 insertions(+), 25 deletions(-) + create mode 100644 include/linux/can/vxcan.h + create mode 100644 include/linux/ipsec.h + create mode 100644 include/linux/pfkeyv2.h + create mode 100644 include/linux/seg6.h + create mode 100644 include/linux/seg6_genl.h + create mode 100644 include/linux/seg6_hmac.h + create mode 100644 include/linux/seg6_iptunnel.h + create mode 100644 include/linux/seg6_local.h + +diff --git a/include/linux/bpf.h b/include/linux/bpf.h +index 178e20c..0895a52 100644 +--- a/include/linux/bpf.h ++++ b/include/linux/bpf.h +@@ -30,9 +30,14 @@ + #define BPF_FROM_LE BPF_TO_LE + #define BPF_FROM_BE BPF_TO_BE + ++/* jmp encodings */ + #define BPF_JNE 0x50 /* jump != */ ++#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ ++#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ + #define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ + #define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ ++#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ ++#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ + #define BPF_CALL 0x80 /* function call */ + #define BPF_EXIT 0x90 /* function return */ + +@@ -81,6 +86,12 @@ enum bpf_cmd { + BPF_OBJ_GET, + BPF_PROG_ATTACH, + BPF_PROG_DETACH, ++ BPF_PROG_TEST_RUN, ++ BPF_PROG_GET_NEXT_ID, ++ BPF_MAP_GET_NEXT_ID, ++ BPF_PROG_GET_FD_BY_ID, ++ BPF_MAP_GET_FD_BY_ID, ++ BPF_OBJ_GET_INFO_BY_FD, + }; + + enum bpf_map_type { +@@ -96,6 +107,10 @@ enum bpf_map_type { + BPF_MAP_TYPE_LRU_HASH, + BPF_MAP_TYPE_LRU_PERCPU_HASH, + BPF_MAP_TYPE_LPM_TRIE, ++ BPF_MAP_TYPE_ARRAY_OF_MAPS, ++ BPF_MAP_TYPE_HASH_OF_MAPS, ++ BPF_MAP_TYPE_DEVMAP, ++ BPF_MAP_TYPE_SOCKMAP, + }; + + enum bpf_prog_type { +@@ -112,12 +127,17 @@ enum bpf_prog_type { + BPF_PROG_TYPE_LWT_IN, + BPF_PROG_TYPE_LWT_OUT, + BPF_PROG_TYPE_LWT_XMIT, ++ BPF_PROG_TYPE_SOCK_OPS, ++ BPF_PROG_TYPE_SK_SKB, + }; + + enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS, + BPF_CGROUP_INET_EGRESS, + BPF_CGROUP_INET_SOCK_CREATE, ++ BPF_CGROUP_SOCK_OPS, ++ BPF_SK_SKB_STREAM_PARSER, ++ BPF_SK_SKB_STREAM_VERDICT, + __MAX_BPF_ATTACH_TYPE + }; + +@@ -129,6 +149,13 @@ enum bpf_attach_type { + */ + #define BPF_F_ALLOW_OVERRIDE (1U << 0) + ++/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the ++ * verifier will perform strict alignment checking as if the kernel ++ * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, ++ * and NET_IP_ALIGN defined to 2. ++ */ ++#define BPF_F_STRICT_ALIGNMENT (1U << 0) ++ + #define BPF_PSEUDO_MAP_FD 1 + + /* flags for BPF_MAP_UPDATE_ELEM command */ +@@ -136,6 +163,7 @@ enum bpf_attach_type { + #define BPF_NOEXIST 1 /* create new element if it didn't exist */ + #define BPF_EXIST 2 /* update existing element */ + ++/* flags for BPF_MAP_CREATE command */ + #define BPF_F_NO_PREALLOC (1U << 0) + /* Instead of having one common LRU list in the + * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list +@@ -144,6 +172,8 @@ enum bpf_attach_type { + * across different LRU lists. + */ + #define BPF_F_NO_COMMON_LRU (1U << 1) ++/* Specify numa node during map creation */ ++#define BPF_F_NUMA_NODE (1U << 2) + + union bpf_attr { + struct { /* anonymous struct used by BPF_MAP_CREATE command */ +@@ -151,7 +181,13 @@ union bpf_attr { + __u32 key_size; /* size of key in bytes */ + __u32 value_size; /* size of value in bytes */ + __u32 max_entries; /* max number of entries in a map */ +- __u32 map_flags; /* prealloc or not */ ++ __u32 map_flags; /* BPF_MAP_CREATE related ++ * flags defined above. ++ */ ++ __u32 inner_map_fd; /* fd pointing to the inner map */ ++ __u32 numa_node; /* numa node (effective only if ++ * BPF_F_NUMA_NODE is set). ++ */ + }; + + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ +@@ -173,6 +209,7 @@ union bpf_attr { + __u32 log_size; /* size of user buffer */ + __aligned_u64 log_buf; /* user supplied buffer */ + __u32 kern_version; /* checked when prog_type=kprobe */ ++ __u32 prog_flags; + }; + + struct { /* anonymous struct used by BPF_OBJ_* commands */ +@@ -186,6 +223,32 @@ union bpf_attr { + __u32 attach_type; + __u32 attach_flags; + }; ++ ++ struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ ++ __u32 prog_fd; ++ __u32 retval; ++ __u32 data_size_in; ++ __u32 data_size_out; ++ __aligned_u64 data_in; ++ __aligned_u64 data_out; ++ __u32 repeat; ++ __u32 duration; ++ } test; ++ ++ struct { /* anonymous struct used by BPF_*_GET_*_ID */ ++ union { ++ __u32 start_id; ++ __u32 prog_id; ++ __u32 map_id; ++ }; ++ __u32 next_id; ++ }; ++ ++ struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ ++ __u32 bpf_fd; ++ __u32 info_len; ++ __aligned_u64 info; ++ } info; + } __attribute__((aligned(8))); + + /* BPF helper function descriptions: +@@ -290,26 +353,40 @@ union bpf_attr { + * @flags: room for future extensions + * Return: 0 on success or negative error + * +- * u64 bpf_perf_event_read(&map, index) +- * Return: Number events read or error code ++ * u64 bpf_perf_event_read(map, flags) ++ * read perf event counter value ++ * @map: pointer to perf_event_array map ++ * @flags: index of event in the map or bitmask flags ++ * Return: value of perf event counter read or error code + * + * int bpf_redirect(ifindex, flags) + * redirect to another netdev + * @ifindex: ifindex of the net device +- * @flags: bit 0 - if set, redirect to ingress instead of egress +- * other bits - reserved +- * Return: TC_ACT_REDIRECT ++ * @flags: ++ * cls_bpf: ++ * bit 0 - if set, redirect to ingress instead of egress ++ * other bits - reserved ++ * xdp_bpf: ++ * all bits - reserved ++ * Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error ++ * xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error ++ * int bpf_redirect_map(map, key, flags) ++ * redirect to endpoint in map ++ * @map: pointer to dev map ++ * @key: index in map to lookup ++ * @flags: -- ++ * Return: XDP_REDIRECT on success or XDP_ABORT on error + * + * u32 bpf_get_route_realm(skb) + * retrieve a dst's tclassid + * @skb: pointer to skb + * Return: realm if != 0 + * +- * int bpf_perf_event_output(ctx, map, index, data, size) ++ * int bpf_perf_event_output(ctx, map, flags, data, size) + * output perf raw sample + * @ctx: struct pt_regs* + * @map: pointer to perf_event_array map +- * @index: index of event in the map ++ * @flags: index of event in the map or bitmask flags + * @data: data on stack to be output as raw data + * @size: size of data + * Return: 0 on success or negative error +@@ -456,6 +533,55 @@ union bpf_attr { + * Return: + * > 0 length of the string including the trailing NUL on success + * < 0 error ++ * ++ * u64 bpf_get_socket_cookie(skb) ++ * Get the cookie for the socket stored inside sk_buff. ++ * @skb: pointer to skb ++ * Return: 8 Bytes non-decreasing number on success or 0 if the socket ++ * field is missing inside sk_buff ++ * ++ * u32 bpf_get_socket_uid(skb) ++ * Get the owner uid of the socket stored inside sk_buff. ++ * @skb: pointer to skb ++ * Return: uid of the socket owner on success or overflowuid if failed. ++ * ++ * u32 bpf_set_hash(skb, hash) ++ * Set full skb->hash. ++ * @skb: pointer to skb ++ * @hash: hash to set ++ * ++ * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen) ++ * Calls setsockopt. Not all opts are available, only those with ++ * integer optvals plus TCP_CONGESTION. ++ * Supported levels: SOL_SOCKET and IPROTO_TCP ++ * @bpf_socket: pointer to bpf_socket ++ * @level: SOL_SOCKET or IPROTO_TCP ++ * @optname: option name ++ * @optval: pointer to option value ++ * @optlen: length of optval in byes ++ * Return: 0 or negative error ++ * ++ * int bpf_skb_adjust_room(skb, len_diff, mode, flags) ++ * Grow or shrink room in sk_buff. ++ * @skb: pointer to skb ++ * @len_diff: (signed) amount of room to grow/shrink ++ * @mode: operation mode (enum bpf_adj_room_mode) ++ * @flags: reserved for future use ++ * Return: 0 on success or negative error code ++ * ++ * int bpf_sk_redirect_map(map, key, flags) ++ * Redirect skb to a sock in map using key as a lookup key for the ++ * sock in map. ++ * @map: pointer to sockmap ++ * @key: key to lookup sock in map ++ * @flags: reserved for future use ++ * Return: SK_REDIRECT ++ * ++ * int bpf_sock_map_update(skops, map, key, flags) ++ * @skops: pointer to bpf_sock_ops ++ * @map: pointer to sockmap to update ++ * @key: key to insert/update sock in map ++ * @flags: same flags as map update elem + */ + #define __BPF_FUNC_MAPPER(FN) \ + FN(unspec), \ +@@ -503,7 +629,15 @@ union bpf_attr { + FN(get_numa_node_id), \ + FN(skb_change_head), \ + FN(xdp_adjust_head), \ +- FN(probe_read_str), ++ FN(probe_read_str), \ ++ FN(get_socket_cookie), \ ++ FN(get_socket_uid), \ ++ FN(set_hash), \ ++ FN(setsockopt), \ ++ FN(skb_adjust_room), \ ++ FN(redirect_map), \ ++ FN(sk_redirect_map), \ ++ FN(sock_map_update), \ + + /* integer value in 'imm' field of BPF_CALL instruction selects which helper + * function eBPF program intends to call +@@ -553,6 +687,11 @@ enum bpf_func_id { + /* BPF_FUNC_perf_event_output for sk_buff input context. */ + #define BPF_F_CTXLEN_MASK (0xfffffULL << 32) + ++/* Mode for BPF_FUNC_skb_adjust_room helper. */ ++enum bpf_adj_room_mode { ++ BPF_ADJ_ROOM_NET, ++}; ++ + /* user accessible mirror of in-kernel sk_buff. + * new fields can only be added to the end of this structure + */ +@@ -574,6 +713,16 @@ struct __sk_buff { + __u32 tc_classid; + __u32 data; + __u32 data_end; ++ __u32 napi_id; ++ ++ /* accessed by BPF_PROG_TYPE_sk_skb types */ ++ __u32 family; ++ __u32 remote_ip4; /* Stored in network byte order */ ++ __u32 local_ip4; /* Stored in network byte order */ ++ __u32 remote_ip6[4]; /* Stored in network byte order */ ++ __u32 local_ip6[4]; /* Stored in network byte order */ ++ __u32 remote_port; /* Stored in network byte order */ ++ __u32 local_port; /* stored in host byte order */ + }; + + struct bpf_tunnel_key { +@@ -609,20 +758,23 @@ struct bpf_sock { + __u32 family; + __u32 type; + __u32 protocol; ++ __u32 mark; ++ __u32 priority; + }; + + #define XDP_PACKET_HEADROOM 256 + + /* User return codes for XDP prog type. + * A valid XDP program must return one of these defined values. All other +- * return codes are reserved for future use. Unknown return codes will result +- * in packet drop. ++ * return codes are reserved for future use. Unknown return codes will ++ * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). + */ + enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP, + XDP_PASS, + XDP_TX, ++ XDP_REDIRECT, + }; + + /* user accessible metadata for XDP packet hook +@@ -633,4 +785,83 @@ struct xdp_md { + __u32 data_end; + }; + ++enum sk_action { ++ SK_ABORTED = 0, ++ SK_DROP, ++ SK_REDIRECT, ++}; ++ ++#define BPF_TAG_SIZE 8 ++ ++struct bpf_prog_info { ++ __u32 type; ++ __u32 id; ++ __u8 tag[BPF_TAG_SIZE]; ++ __u32 jited_prog_len; ++ __u32 xlated_prog_len; ++ __aligned_u64 jited_prog_insns; ++ __aligned_u64 xlated_prog_insns; ++} __attribute__((aligned(8))); ++ ++struct bpf_map_info { ++ __u32 type; ++ __u32 id; ++ __u32 key_size; ++ __u32 value_size; ++ __u32 max_entries; ++ __u32 map_flags; ++} __attribute__((aligned(8))); ++ ++/* User bpf_sock_ops struct to access socket values and specify request ops ++ * and their replies. ++ * Some of this fields are in network (bigendian) byte order and may need ++ * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). ++ * New fields can only be added at the end of this structure ++ */ ++struct bpf_sock_ops { ++ __u32 op; ++ union { ++ __u32 reply; ++ __u32 replylong[4]; ++ }; ++ __u32 family; ++ __u32 remote_ip4; /* Stored in network byte order */ ++ __u32 local_ip4; /* Stored in network byte order */ ++ __u32 remote_ip6[4]; /* Stored in network byte order */ ++ __u32 local_ip6[4]; /* Stored in network byte order */ ++ __u32 remote_port; /* Stored in network byte order */ ++ __u32 local_port; /* stored in host byte order */ ++}; ++ ++/* List of known BPF sock_ops operators. ++ * New entries can only be added at the end ++ */ ++enum { ++ BPF_SOCK_OPS_VOID, ++ BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or ++ * -1 if default value should be used ++ */ ++ BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized ++ * window (in packets) or -1 if default ++ * value should be used ++ */ ++ BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an ++ * active connection is initialized ++ */ ++ BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an ++ * active connection is ++ * established ++ */ ++ BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a ++ * passive connection is ++ * established ++ */ ++ BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control ++ * needs ECN ++ */ ++}; ++ ++#define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ ++#define TCP_BPF_SNDCWND_CLAMP 1002 /* Set sndcwnd_clamp */ ++ + #endif /* __LINUX_BPF_H__ */ +diff --git a/include/linux/can/vxcan.h b/include/linux/can/vxcan.h +new file mode 100644 +index 0000000..5b29e8a +--- /dev/null ++++ b/include/linux/can/vxcan.h +@@ -0,0 +1,12 @@ ++#ifndef _CAN_VXCAN_H ++#define _CAN_VXCAN_H ++ ++enum { ++ VXCAN_INFO_UNSPEC, ++ VXCAN_INFO_PEER, ++ ++ __VXCAN_INFO_MAX ++#define VXCAN_INFO_MAX (__VXCAN_INFO_MAX - 1) ++}; ++ ++#endif +diff --git a/include/linux/devlink.h b/include/linux/devlink.h +index 2ad3585..a62695e 100644 +--- a/include/linux/devlink.h ++++ b/include/linux/devlink.h +@@ -65,8 +65,12 @@ enum devlink_command { + #define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \ + DEVLINK_CMD_ESWITCH_SET + +- /* add new commands above here */ ++ DEVLINK_CMD_DPIPE_TABLE_GET, ++ DEVLINK_CMD_DPIPE_ENTRIES_GET, ++ DEVLINK_CMD_DPIPE_HEADERS_GET, ++ DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, + ++ /* add new commands above here */ + __DEVLINK_CMD_MAX, + DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 + }; +@@ -115,6 +119,11 @@ enum devlink_eswitch_inline_mode { + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT, + }; + ++enum devlink_eswitch_encap_mode { ++ DEVLINK_ESWITCH_ENCAP_MODE_NONE, ++ DEVLINK_ESWITCH_ENCAP_MODE_BASIC, ++}; ++ + enum devlink_attr { + /* don't change the order or add anything between, this is ABI! */ + DEVLINK_ATTR_UNSPEC, +@@ -148,10 +157,91 @@ enum devlink_attr { + DEVLINK_ATTR_ESWITCH_MODE, /* u16 */ + DEVLINK_ATTR_ESWITCH_INLINE_MODE, /* u8 */ + ++ DEVLINK_ATTR_DPIPE_TABLES, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE_NAME, /* string */ ++ DEVLINK_ATTR_DPIPE_TABLE_SIZE, /* u64 */ ++ DEVLINK_ATTR_DPIPE_TABLE_MATCHES, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE_ACTIONS, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, /* u8 */ ++ ++ DEVLINK_ATTR_DPIPE_ENTRIES, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY_INDEX, /* u64 */ ++ DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY_COUNTER, /* u64 */ ++ ++ DEVLINK_ATTR_DPIPE_MATCH, /* nested */ ++ DEVLINK_ATTR_DPIPE_MATCH_VALUE, /* nested */ ++ DEVLINK_ATTR_DPIPE_MATCH_TYPE, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_ACTION, /* nested */ ++ DEVLINK_ATTR_DPIPE_ACTION_VALUE, /* nested */ ++ DEVLINK_ATTR_DPIPE_ACTION_TYPE, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_VALUE, ++ DEVLINK_ATTR_DPIPE_VALUE_MASK, ++ DEVLINK_ATTR_DPIPE_VALUE_MAPPING, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_HEADERS, /* nested */ ++ DEVLINK_ATTR_DPIPE_HEADER, /* nested */ ++ DEVLINK_ATTR_DPIPE_HEADER_NAME, /* string */ ++ DEVLINK_ATTR_DPIPE_HEADER_ID, /* u32 */ ++ DEVLINK_ATTR_DPIPE_HEADER_FIELDS, /* nested */ ++ DEVLINK_ATTR_DPIPE_HEADER_GLOBAL, /* u8 */ ++ DEVLINK_ATTR_DPIPE_HEADER_INDEX, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_FIELD, /* nested */ ++ DEVLINK_ATTR_DPIPE_FIELD_NAME, /* string */ ++ DEVLINK_ATTR_DPIPE_FIELD_ID, /* u32 */ ++ DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH, /* u32 */ ++ DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE, /* u32 */ ++ ++ DEVLINK_ATTR_PAD, ++ ++ DEVLINK_ATTR_ESWITCH_ENCAP_MODE, /* u8 */ ++ + /* add new attributes above here, update the policy in devlink.c */ + + __DEVLINK_ATTR_MAX, + DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1 + }; + ++/* Mapping between internal resource described by the field and system ++ * structure ++ */ ++enum devlink_dpipe_field_mapping_type { ++ DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE, ++ DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX, ++}; ++ ++/* Match type - specify the type of the match */ ++enum devlink_dpipe_match_type { ++ DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT, ++}; ++ ++/* Action type - specify the action type */ ++enum devlink_dpipe_action_type { ++ DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY, ++}; ++ ++enum devlink_dpipe_field_ethernet_id { ++ DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC, ++}; ++ ++enum devlink_dpipe_field_ipv4_id { ++ DEVLINK_DPIPE_FIELD_IPV4_DST_IP, ++}; ++ ++enum devlink_dpipe_field_ipv6_id { ++ DEVLINK_DPIPE_FIELD_IPV6_DST_IP, ++}; ++ ++enum devlink_dpipe_header_id { ++ DEVLINK_DPIPE_HEADER_ETHERNET, ++ DEVLINK_DPIPE_HEADER_IPV4, ++ DEVLINK_DPIPE_HEADER_IPV6, ++}; ++ + #endif /* _LINUX_DEVLINK_H_ */ +diff --git a/include/linux/elf-em.h b/include/linux/elf-em.h +index cb5d1a5..9cd1de9 100644 +--- a/include/linux/elf-em.h ++++ b/include/linux/elf-em.h +@@ -42,7 +42,6 @@ + #define EM_TILEGX 191 /* Tilera TILE-Gx */ + #define EM_BPF 247 /* Linux BPF - in-kernel virtual machine */ + #define EM_FRV 0x5441 /* Fujitsu FR-V */ +-#define EM_AVR32 0x18ad /* Atmel AVR32 */ + + /* + * This is an interim value that we will use until the committee comes +diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h +index d001bdb..199f253 100644 +--- a/include/linux/if_arp.h ++++ b/include/linux/if_arp.h +@@ -59,6 +59,7 @@ + #define ARPHRD_LAPB 516 /* LAPB */ + #define ARPHRD_DDCMP 517 /* Digital's DDCMP protocol */ + #define ARPHRD_RAWHDLC 518 /* Raw HDLC */ ++#define ARPHRD_RAWIP 519 /* Raw IP */ + + #define ARPHRD_TUNNEL 768 /* IPIP tunnel */ + #define ARPHRD_TUNNEL6 769 /* IP6IP6 tunnel */ +@@ -95,6 +96,7 @@ + #define ARPHRD_IP6GRE 823 /* GRE over IPv6 */ + #define ARPHRD_NETLINK 824 /* Netlink header */ + #define ARPHRD_6LOWPAN 825 /* IPv6 over LoWPAN */ ++#define ARPHRD_VSOCKMON 826 /* Vsock monitor header */ + + #define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ + #define ARPHRD_NONE 0xFFFE /* zero header length */ +diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h +index b7d3beb..7dde037 100644 +--- a/include/linux/if_ether.h ++++ b/include/linux/if_ether.h +@@ -66,6 +66,7 @@ + #define ETH_P_ATALK 0x809B /* Appletalk DDP */ + #define ETH_P_AARP 0x80F3 /* Appletalk AARP */ + #define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ ++#define ETH_P_ERSPAN 0x88BE /* ERSPAN type II */ + #define ETH_P_IPX 0x8137 /* IPX over DIX */ + #define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ + #define ETH_P_PAUSE 0x8808 /* IEEE Pause frames. See 802.3 31B */ +@@ -98,11 +99,13 @@ + #define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */ + #define ETH_P_80221 0x8917 /* IEEE 802.21 Media Independent Handover Protocol */ + #define ETH_P_HSR 0x892F /* IEC 62439-3 HSRv1 */ ++#define ETH_P_NSH 0x894F /* Network Service Header */ + #define ETH_P_LOOPBACK 0x9000 /* Ethernet loopback packet, per IEEE 802.3 */ + #define ETH_P_QINQ1 0x9100 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ + #define ETH_P_QINQ2 0x9200 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ + #define ETH_P_QINQ3 0x9300 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ + #define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_IFE 0xED3E /* ForCES inter-FE LFB type */ + #define ETH_P_AF_IUCV 0xFBFB /* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */ + + #define ETH_P_802_3_MIN 0x0600 /* If the value in the ethernet type is less than this value +@@ -137,6 +140,9 @@ + #define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frame */ + #define ETH_P_CAIF 0x00F7 /* ST-Ericsson CAIF protocol */ + #define ETH_P_XDSA 0x00F8 /* Multiplexed DSA protocol */ ++#define ETH_P_MAP 0x00F9 /* Qualcomm multiplexing and ++ * aggregation protocol ++ */ + + /* + * This is an Ethernet frame header. +diff --git a/include/linux/if_link.h b/include/linux/if_link.h +index b0bdbd6..1f97d05 100644 +--- a/include/linux/if_link.h ++++ b/include/linux/if_link.h +@@ -157,6 +157,7 @@ enum { + IFLA_GSO_MAX_SIZE, + IFLA_PAD, + IFLA_XDP, ++ IFLA_EVENT, + __IFLA_MAX + }; + +@@ -321,6 +322,7 @@ enum { + IFLA_BRPORT_MCAST_FLOOD, + IFLA_BRPORT_MCAST_TO_UCAST, + IFLA_BRPORT_VLAN_TUNNEL, ++ IFLA_BRPORT_BCAST_FLOOD, + __IFLA_BRPORT_MAX + }; + #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) +@@ -536,11 +538,18 @@ enum { + #define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) + + /* GTP section */ ++ ++enum ifla_gtp_role { ++ GTP_ROLE_GGSN = 0, ++ GTP_ROLE_SGSN, ++}; ++ + enum { + IFLA_GTP_UNSPEC, + IFLA_GTP_FD0, + IFLA_GTP_FD1, + IFLA_GTP_PDP_HASHSIZE, ++ IFLA_GTP_ROLE, + __IFLA_GTP_MAX, + }; + #define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) +@@ -878,16 +887,42 @@ enum { + /* XDP section */ + + #define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) +-#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST) ++#define XDP_FLAGS_SKB_MODE (1U << 1) ++#define XDP_FLAGS_DRV_MODE (1U << 2) ++#define XDP_FLAGS_HW_MODE (1U << 3) ++#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ ++ XDP_FLAGS_DRV_MODE | \ ++ XDP_FLAGS_HW_MODE) ++#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ ++ XDP_FLAGS_MODES) ++ ++/* These are stored into IFLA_XDP_ATTACHED on dump. */ ++enum { ++ XDP_ATTACHED_NONE = 0, ++ XDP_ATTACHED_DRV, ++ XDP_ATTACHED_SKB, ++ XDP_ATTACHED_HW, ++}; + + enum { + IFLA_XDP_UNSPEC, + IFLA_XDP_FD, + IFLA_XDP_ATTACHED, + IFLA_XDP_FLAGS, ++ IFLA_XDP_PROG_ID, + __IFLA_XDP_MAX, + }; + + #define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) + ++enum { ++ IFLA_EVENT_NONE, ++ IFLA_EVENT_REBOOT, /* internal reset / reboot */ ++ IFLA_EVENT_FEATURES, /* change in offload features */ ++ IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ ++ IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ ++ IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ ++ IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ ++}; ++ + #endif /* _LINUX_IF_LINK_H */ +diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h +index 9e7edfd..4df96a7 100644 +--- a/include/linux/if_packet.h ++++ b/include/linux/if_packet.h +@@ -66,6 +66,7 @@ struct sockaddr_ll { + #define PACKET_FANOUT_CBPF 6 + #define PACKET_FANOUT_EBPF 7 + #define PACKET_FANOUT_FLAG_ROLLOVER 0x1000 ++#define PACKET_FANOUT_FLAG_UNIQUEID 0x2000 + #define PACKET_FANOUT_FLAG_DEFRAG 0x8000 + + struct tpacket_stats { +diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h +index 4f975f5..21834ca 100644 +--- a/include/linux/if_tunnel.h ++++ b/include/linux/if_tunnel.h +@@ -75,6 +75,7 @@ enum { + IFLA_IPTUN_ENCAP_SPORT, + IFLA_IPTUN_ENCAP_DPORT, + IFLA_IPTUN_COLLECT_METADATA, ++ IFLA_IPTUN_FWMARK, + __IFLA_IPTUN_MAX, + }; + #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) +@@ -132,6 +133,8 @@ enum { + IFLA_GRE_ENCAP_DPORT, + IFLA_GRE_COLLECT_METADATA, + IFLA_GRE_IGNORE_DF, ++ IFLA_GRE_FWMARK, ++ IFLA_GRE_ERSPAN_INDEX, + __IFLA_GRE_MAX, + }; + +@@ -147,6 +150,7 @@ enum { + IFLA_VTI_OKEY, + IFLA_VTI_LOCAL, + IFLA_VTI_REMOTE, ++ IFLA_VTI_FWMARK, + __IFLA_VTI_MAX, + }; + +diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h +index f7bf781..bada4d7 100644 +--- a/include/linux/inet_diag.h ++++ b/include/linux/inet_diag.h +@@ -142,6 +142,8 @@ enum { + INET_DIAG_PAD, + INET_DIAG_MARK, + INET_DIAG_BBRINFO, ++ INET_DIAG_CLASS_ID, ++ INET_DIAG_MD5SIG, + __INET_DIAG_MAX, + }; + +diff --git a/include/linux/ipsec.h b/include/linux/ipsec.h +new file mode 100644 +index 0000000..d17a630 +--- /dev/null ++++ b/include/linux/ipsec.h +@@ -0,0 +1,47 @@ ++#ifndef _LINUX_IPSEC_H ++#define _LINUX_IPSEC_H ++ ++/* The definitions, required to talk to KAME racoon IKE. */ ++ ++#include ++ ++#define IPSEC_PORT_ANY 0 ++#define IPSEC_ULPROTO_ANY 255 ++#define IPSEC_PROTO_ANY 255 ++ ++enum { ++ IPSEC_MODE_ANY = 0, /* We do not support this for SA */ ++ IPSEC_MODE_TRANSPORT = 1, ++ IPSEC_MODE_TUNNEL = 2, ++ IPSEC_MODE_BEET = 3 ++}; ++ ++enum { ++ IPSEC_DIR_ANY = 0, ++ IPSEC_DIR_INBOUND = 1, ++ IPSEC_DIR_OUTBOUND = 2, ++ IPSEC_DIR_FWD = 3, /* It is our own */ ++ IPSEC_DIR_MAX = 4, ++ IPSEC_DIR_INVALID = 5 ++}; ++ ++enum { ++ IPSEC_POLICY_DISCARD = 0, ++ IPSEC_POLICY_NONE = 1, ++ IPSEC_POLICY_IPSEC = 2, ++ IPSEC_POLICY_ENTRUST = 3, ++ IPSEC_POLICY_BYPASS = 4 ++}; ++ ++enum { ++ IPSEC_LEVEL_DEFAULT = 0, ++ IPSEC_LEVEL_USE = 1, ++ IPSEC_LEVEL_REQUIRE = 2, ++ IPSEC_LEVEL_UNIQUE = 3 ++}; ++ ++#define IPSEC_MANUAL_REQID_MAX 0x3fff ++ ++#define IPSEC_REPLAYWSIZE 32 ++ ++#endif /* _LINUX_IPSEC_H */ +diff --git a/include/linux/lwtunnel.h b/include/linux/lwtunnel.h +index faa6eab..3298426 100644 +--- a/include/linux/lwtunnel.h ++++ b/include/linux/lwtunnel.h +@@ -11,6 +11,7 @@ enum lwtunnel_encap_types { + LWTUNNEL_ENCAP_IP6, + LWTUNNEL_ENCAP_SEG6, + LWTUNNEL_ENCAP_BPF, ++ LWTUNNEL_ENCAP_SEG6_LOCAL, + __LWTUNNEL_ENCAP_MAX, + }; + +diff --git a/include/linux/magic.h b/include/linux/magic.h +index e230af2..e439565 100644 +--- a/include/linux/magic.h ++++ b/include/linux/magic.h +@@ -42,6 +42,7 @@ + #define MSDOS_SUPER_MAGIC 0x4d44 /* MD */ + #define NCP_SUPER_MAGIC 0x564c /* Guess, what 0x564c is :-) */ + #define NFS_SUPER_MAGIC 0x6969 ++#define OCFS2_SUPER_MAGIC 0x7461636f + #define OPENPROM_SUPER_MAGIC 0x9fa1 + #define QNX4_SUPER_MAGIC 0x002f /* qnx4 fs detection */ + #define QNX6_SUPER_MAGIC 0x68191122 /* qnx6 fs detection */ +@@ -80,6 +81,8 @@ + #define BTRFS_TEST_MAGIC 0x73727279 + #define NSFS_MAGIC 0x6e736673 + #define BPF_FS_MAGIC 0xcafe4a11 ++#define AAFS_MAGIC 0x5a3c69f0 ++ + /* Since UDF 2.01 is ISO 13346 based... */ + #define UDF_SUPER_MAGIC 0x15013346 + #define BALLOON_KVM_MAGIC 0x13661366 +diff --git a/include/linux/mpls_iptunnel.h b/include/linux/mpls_iptunnel.h +index 4132c3c..1a0e57b 100644 +--- a/include/linux/mpls_iptunnel.h ++++ b/include/linux/mpls_iptunnel.h +@@ -16,11 +16,13 @@ + /* MPLS tunnel attributes + * [RTA_ENCAP] = { + * [MPLS_IPTUNNEL_DST] ++ * [MPLS_IPTUNNEL_TTL] + * } + */ + enum { + MPLS_IPTUNNEL_UNSPEC, + MPLS_IPTUNNEL_DST, ++ MPLS_IPTUNNEL_TTL, + __MPLS_IPTUNNEL_MAX, + }; + #define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1) +diff --git a/include/linux/neighbour.h b/include/linux/neighbour.h +index f3d16db..3199d28 100644 +--- a/include/linux/neighbour.h ++++ b/include/linux/neighbour.h +@@ -41,6 +41,7 @@ enum { + #define NTF_MASTER 0x04 + #define NTF_PROXY 0x08 /* == ATF_PUBL */ + #define NTF_EXT_LEARNED 0x10 ++#define NTF_OFFLOADED 0x20 + #define NTF_ROUTER 0x80 + + /* +diff --git a/include/linux/netlink.h b/include/linux/netlink.h +index d1e26a2..ec0690b 100644 +--- a/include/linux/netlink.h ++++ b/include/linux/netlink.h +@@ -50,12 +50,12 @@ struct nlmsghdr { + + /* Flags values */ + +-#define NLM_F_REQUEST 1 /* It is request message. */ +-#define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */ +-#define NLM_F_ACK 4 /* Reply with ack, with zero or error code */ +-#define NLM_F_ECHO 8 /* Echo this request */ +-#define NLM_F_DUMP_INTR 16 /* Dump was inconsistent due to sequence change */ +-#define NLM_F_DUMP_FILTERED 32 /* Dump was filtered as requested */ ++#define NLM_F_REQUEST 0x01 /* It is request message. */ ++#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ ++#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ ++#define NLM_F_ECHO 0x08 /* Echo this request */ ++#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ ++#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ + + /* Modifiers to GET request */ + #define NLM_F_ROOT 0x100 /* specify tree root */ +@@ -69,6 +69,13 @@ struct nlmsghdr { + #define NLM_F_CREATE 0x400 /* Create, if it does not exist */ + #define NLM_F_APPEND 0x800 /* Add to end of list */ + ++/* Modifiers to DELETE request */ ++#define NLM_F_NONREC 0x100 /* Do not delete recursively */ ++ ++/* Flags for ACK message */ ++#define NLM_F_CAPPED 0x100 /* request was capped */ ++#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ ++ + /* + 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL + 4.4BSD CHANGE NLM_F_REPLACE +@@ -101,6 +108,37 @@ struct nlmsghdr { + struct nlmsgerr { + int error; + struct nlmsghdr msg; ++ /* ++ * followed by the message contents unless NETLINK_CAP_ACK was set ++ * or the ACK indicates success (error == 0) ++ * message length is aligned with NLMSG_ALIGN() ++ */ ++ /* ++ * followed by TLVs defined in enum nlmsgerr_attrs ++ * if NETLINK_EXT_ACK was set ++ */ ++}; ++ ++/** ++ * enum nlmsgerr_attrs - nlmsgerr attributes ++ * @NLMSGERR_ATTR_UNUSED: unused ++ * @NLMSGERR_ATTR_MSG: error message string (string) ++ * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original ++ * message, counting from the beginning of the header (u32) ++ * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to ++ * be used - in the success case - to identify a created ++ * object or operation or similar (binary) ++ * @__NLMSGERR_ATTR_MAX: number of attributes ++ * @NLMSGERR_ATTR_MAX: highest attribute number ++ */ ++enum nlmsgerr_attrs { ++ NLMSGERR_ATTR_UNUSED, ++ NLMSGERR_ATTR_MSG, ++ NLMSGERR_ATTR_OFFS, ++ NLMSGERR_ATTR_COOKIE, ++ ++ __NLMSGERR_ATTR_MAX, ++ NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 + }; + + #define NETLINK_ADD_MEMBERSHIP 1 +@@ -187,5 +225,22 @@ struct nlattr { + #define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) + #define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) + ++/* Generic 32 bitflags attribute content sent to the kernel. ++ * ++ * The value is a bitmap that defines the values being set ++ * The selector is a bitmask that defines which value is legit ++ * ++ * Examples: ++ * value = 0x0, and selector = 0x1 ++ * implies we are selecting bit 1 and we want to set its value to 0. ++ * ++ * value = 0x2, and selector = 0x2 ++ * implies we are selecting bit 2 and we want to set its value to 1. ++ * ++ */ ++struct nla_bitfield32 { ++ __u32 value; ++ __u32 selector; ++}; + + #endif /* __LINUX_NETLINK_H */ +diff --git a/include/linux/netlink_diag.h b/include/linux/netlink_diag.h +index defd25f..c8c8c7d 100644 +--- a/include/linux/netlink_diag.h ++++ b/include/linux/netlink_diag.h +@@ -38,6 +38,7 @@ enum { + NETLINK_DIAG_GROUPS, + NETLINK_DIAG_RX_RING, + NETLINK_DIAG_TX_RING, ++ NETLINK_DIAG_FLAGS, + + __NETLINK_DIAG_MAX, + }; +@@ -50,5 +51,14 @@ enum { + #define NDIAG_SHOW_GROUPS 0x00000002 /* show groups of a netlink socket */ + /* deprecated since 4.6 */ + #define NDIAG_SHOW_RING_CFG 0x00000004 /* show ring configuration */ ++#define NDIAG_SHOW_FLAGS 0x00000008 /* show flags of a netlink socket */ ++ ++/* flags */ ++#define NDIAG_FLAG_CB_RUNNING 0x00000001 ++#define NDIAG_FLAG_PKTINFO 0x00000002 ++#define NDIAG_FLAG_BROADCAST_ERROR 0x00000004 ++#define NDIAG_FLAG_NO_ENOBUFS 0x00000008 ++#define NDIAG_FLAG_LISTEN_ALL_NSID 0x00000010 ++#define NDIAG_FLAG_CAP_ACK 0x00000020 + + #endif +diff --git a/include/linux/pfkeyv2.h b/include/linux/pfkeyv2.h +new file mode 100644 +index 0000000..ada7f01 +--- /dev/null ++++ b/include/linux/pfkeyv2.h +@@ -0,0 +1,383 @@ ++/* PF_KEY user interface, this is defined by rfc2367 so ++ * do not make arbitrary modifications or else this header ++ * file will not be compliant. ++ */ ++ ++#ifndef _LINUX_PFKEY2_H ++#define _LINUX_PFKEY2_H ++ ++#include ++ ++#define PF_KEY_V2 2 ++#define PFKEYV2_REVISION 199806L ++ ++struct sadb_msg { ++ __u8 sadb_msg_version; ++ __u8 sadb_msg_type; ++ __u8 sadb_msg_errno; ++ __u8 sadb_msg_satype; ++ __u16 sadb_msg_len; ++ __u16 sadb_msg_reserved; ++ __u32 sadb_msg_seq; ++ __u32 sadb_msg_pid; ++} __attribute__((packed)); ++/* sizeof(struct sadb_msg) == 16 */ ++ ++struct sadb_ext { ++ __u16 sadb_ext_len; ++ __u16 sadb_ext_type; ++} __attribute__((packed)); ++/* sizeof(struct sadb_ext) == 4 */ ++ ++struct sadb_sa { ++ __u16 sadb_sa_len; ++ __u16 sadb_sa_exttype; ++ __be32 sadb_sa_spi; ++ __u8 sadb_sa_replay; ++ __u8 sadb_sa_state; ++ __u8 sadb_sa_auth; ++ __u8 sadb_sa_encrypt; ++ __u32 sadb_sa_flags; ++} __attribute__((packed)); ++/* sizeof(struct sadb_sa) == 16 */ ++ ++struct sadb_lifetime { ++ __u16 sadb_lifetime_len; ++ __u16 sadb_lifetime_exttype; ++ __u32 sadb_lifetime_allocations; ++ __u64 sadb_lifetime_bytes; ++ __u64 sadb_lifetime_addtime; ++ __u64 sadb_lifetime_usetime; ++} __attribute__((packed)); ++/* sizeof(struct sadb_lifetime) == 32 */ ++ ++struct sadb_address { ++ __u16 sadb_address_len; ++ __u16 sadb_address_exttype; ++ __u8 sadb_address_proto; ++ __u8 sadb_address_prefixlen; ++ __u16 sadb_address_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_address) == 8 */ ++ ++struct sadb_key { ++ __u16 sadb_key_len; ++ __u16 sadb_key_exttype; ++ __u16 sadb_key_bits; ++ __u16 sadb_key_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_key) == 8 */ ++ ++struct sadb_ident { ++ __u16 sadb_ident_len; ++ __u16 sadb_ident_exttype; ++ __u16 sadb_ident_type; ++ __u16 sadb_ident_reserved; ++ __u64 sadb_ident_id; ++} __attribute__((packed)); ++/* sizeof(struct sadb_ident) == 16 */ ++ ++struct sadb_sens { ++ __u16 sadb_sens_len; ++ __u16 sadb_sens_exttype; ++ __u32 sadb_sens_dpd; ++ __u8 sadb_sens_sens_level; ++ __u8 sadb_sens_sens_len; ++ __u8 sadb_sens_integ_level; ++ __u8 sadb_sens_integ_len; ++ __u32 sadb_sens_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_sens) == 16 */ ++ ++/* followed by: ++ __u64 sadb_sens_bitmap[sens_len]; ++ __u64 sadb_integ_bitmap[integ_len]; */ ++ ++struct sadb_prop { ++ __u16 sadb_prop_len; ++ __u16 sadb_prop_exttype; ++ __u8 sadb_prop_replay; ++ __u8 sadb_prop_reserved[3]; ++} __attribute__((packed)); ++/* sizeof(struct sadb_prop) == 8 */ ++ ++/* followed by: ++ struct sadb_comb sadb_combs[(sadb_prop_len + ++ sizeof(__u64) - sizeof(struct sadb_prop)) / ++ sizeof(struct sadb_comb)]; */ ++ ++struct sadb_comb { ++ __u8 sadb_comb_auth; ++ __u8 sadb_comb_encrypt; ++ __u16 sadb_comb_flags; ++ __u16 sadb_comb_auth_minbits; ++ __u16 sadb_comb_auth_maxbits; ++ __u16 sadb_comb_encrypt_minbits; ++ __u16 sadb_comb_encrypt_maxbits; ++ __u32 sadb_comb_reserved; ++ __u32 sadb_comb_soft_allocations; ++ __u32 sadb_comb_hard_allocations; ++ __u64 sadb_comb_soft_bytes; ++ __u64 sadb_comb_hard_bytes; ++ __u64 sadb_comb_soft_addtime; ++ __u64 sadb_comb_hard_addtime; ++ __u64 sadb_comb_soft_usetime; ++ __u64 sadb_comb_hard_usetime; ++} __attribute__((packed)); ++/* sizeof(struct sadb_comb) == 72 */ ++ ++struct sadb_supported { ++ __u16 sadb_supported_len; ++ __u16 sadb_supported_exttype; ++ __u32 sadb_supported_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_supported) == 8 */ ++ ++/* followed by: ++ struct sadb_alg sadb_algs[(sadb_supported_len + ++ sizeof(__u64) - sizeof(struct sadb_supported)) / ++ sizeof(struct sadb_alg)]; */ ++ ++struct sadb_alg { ++ __u8 sadb_alg_id; ++ __u8 sadb_alg_ivlen; ++ __u16 sadb_alg_minbits; ++ __u16 sadb_alg_maxbits; ++ __u16 sadb_alg_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_alg) == 8 */ ++ ++struct sadb_spirange { ++ __u16 sadb_spirange_len; ++ __u16 sadb_spirange_exttype; ++ __u32 sadb_spirange_min; ++ __u32 sadb_spirange_max; ++ __u32 sadb_spirange_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_spirange) == 16 */ ++ ++struct sadb_x_kmprivate { ++ __u16 sadb_x_kmprivate_len; ++ __u16 sadb_x_kmprivate_exttype; ++ __u32 sadb_x_kmprivate_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_kmprivate) == 8 */ ++ ++struct sadb_x_sa2 { ++ __u16 sadb_x_sa2_len; ++ __u16 sadb_x_sa2_exttype; ++ __u8 sadb_x_sa2_mode; ++ __u8 sadb_x_sa2_reserved1; ++ __u16 sadb_x_sa2_reserved2; ++ __u32 sadb_x_sa2_sequence; ++ __u32 sadb_x_sa2_reqid; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_sa2) == 16 */ ++ ++struct sadb_x_policy { ++ __u16 sadb_x_policy_len; ++ __u16 sadb_x_policy_exttype; ++ __u16 sadb_x_policy_type; ++ __u8 sadb_x_policy_dir; ++ __u8 sadb_x_policy_reserved; ++ __u32 sadb_x_policy_id; ++ __u32 sadb_x_policy_priority; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_policy) == 16 */ ++ ++struct sadb_x_ipsecrequest { ++ __u16 sadb_x_ipsecrequest_len; ++ __u16 sadb_x_ipsecrequest_proto; ++ __u8 sadb_x_ipsecrequest_mode; ++ __u8 sadb_x_ipsecrequest_level; ++ __u16 sadb_x_ipsecrequest_reserved1; ++ __u32 sadb_x_ipsecrequest_reqid; ++ __u32 sadb_x_ipsecrequest_reserved2; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_ipsecrequest) == 16 */ ++ ++/* This defines the TYPE of Nat Traversal in use. Currently only one ++ * type of NAT-T is supported, draft-ietf-ipsec-udp-encaps-06 ++ */ ++struct sadb_x_nat_t_type { ++ __u16 sadb_x_nat_t_type_len; ++ __u16 sadb_x_nat_t_type_exttype; ++ __u8 sadb_x_nat_t_type_type; ++ __u8 sadb_x_nat_t_type_reserved[3]; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_nat_t_type) == 8 */ ++ ++/* Pass a NAT Traversal port (Source or Dest port) */ ++struct sadb_x_nat_t_port { ++ __u16 sadb_x_nat_t_port_len; ++ __u16 sadb_x_nat_t_port_exttype; ++ __be16 sadb_x_nat_t_port_port; ++ __u16 sadb_x_nat_t_port_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_nat_t_port) == 8 */ ++ ++/* Generic LSM security context */ ++struct sadb_x_sec_ctx { ++ __u16 sadb_x_sec_len; ++ __u16 sadb_x_sec_exttype; ++ __u8 sadb_x_ctx_alg; /* LSMs: e.g., selinux == 1 */ ++ __u8 sadb_x_ctx_doi; ++ __u16 sadb_x_ctx_len; ++} __attribute__((packed)); ++/* sizeof(struct sadb_sec_ctx) = 8 */ ++ ++/* Used by MIGRATE to pass addresses IKE will use to perform ++ * negotiation with the peer */ ++struct sadb_x_kmaddress { ++ __u16 sadb_x_kmaddress_len; ++ __u16 sadb_x_kmaddress_exttype; ++ __u32 sadb_x_kmaddress_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_kmaddress) == 8 */ ++ ++/* To specify the SA dump filter */ ++struct sadb_x_filter { ++ __u16 sadb_x_filter_len; ++ __u16 sadb_x_filter_exttype; ++ __u32 sadb_x_filter_saddr[4]; ++ __u32 sadb_x_filter_daddr[4]; ++ __u16 sadb_x_filter_family; ++ __u8 sadb_x_filter_splen; ++ __u8 sadb_x_filter_dplen; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_filter) == 40 */ ++ ++/* Message types */ ++#define SADB_RESERVED 0 ++#define SADB_GETSPI 1 ++#define SADB_UPDATE 2 ++#define SADB_ADD 3 ++#define SADB_DELETE 4 ++#define SADB_GET 5 ++#define SADB_ACQUIRE 6 ++#define SADB_REGISTER 7 ++#define SADB_EXPIRE 8 ++#define SADB_FLUSH 9 ++#define SADB_DUMP 10 ++#define SADB_X_PROMISC 11 ++#define SADB_X_PCHANGE 12 ++#define SADB_X_SPDUPDATE 13 ++#define SADB_X_SPDADD 14 ++#define SADB_X_SPDDELETE 15 ++#define SADB_X_SPDGET 16 ++#define SADB_X_SPDACQUIRE 17 ++#define SADB_X_SPDDUMP 18 ++#define SADB_X_SPDFLUSH 19 ++#define SADB_X_SPDSETIDX 20 ++#define SADB_X_SPDEXPIRE 21 ++#define SADB_X_SPDDELETE2 22 ++#define SADB_X_NAT_T_NEW_MAPPING 23 ++#define SADB_X_MIGRATE 24 ++#define SADB_MAX 24 ++ ++/* Security Association flags */ ++#define SADB_SAFLAGS_PFS 1 ++#define SADB_SAFLAGS_NOPMTUDISC 0x20000000 ++#define SADB_SAFLAGS_DECAP_DSCP 0x40000000 ++#define SADB_SAFLAGS_NOECN 0x80000000 ++ ++/* Security Association states */ ++#define SADB_SASTATE_LARVAL 0 ++#define SADB_SASTATE_MATURE 1 ++#define SADB_SASTATE_DYING 2 ++#define SADB_SASTATE_DEAD 3 ++#define SADB_SASTATE_MAX 3 ++ ++/* Security Association types */ ++#define SADB_SATYPE_UNSPEC 0 ++#define SADB_SATYPE_AH 2 ++#define SADB_SATYPE_ESP 3 ++#define SADB_SATYPE_RSVP 5 ++#define SADB_SATYPE_OSPFV2 6 ++#define SADB_SATYPE_RIPV2 7 ++#define SADB_SATYPE_MIP 8 ++#define SADB_X_SATYPE_IPCOMP 9 ++#define SADB_SATYPE_MAX 9 ++ ++/* Authentication algorithms */ ++#define SADB_AALG_NONE 0 ++#define SADB_AALG_MD5HMAC 2 ++#define SADB_AALG_SHA1HMAC 3 ++#define SADB_X_AALG_SHA2_256HMAC 5 ++#define SADB_X_AALG_SHA2_384HMAC 6 ++#define SADB_X_AALG_SHA2_512HMAC 7 ++#define SADB_X_AALG_RIPEMD160HMAC 8 ++#define SADB_X_AALG_AES_XCBC_MAC 9 ++#define SADB_X_AALG_NULL 251 /* kame */ ++#define SADB_AALG_MAX 251 ++ ++/* Encryption algorithms */ ++#define SADB_EALG_NONE 0 ++#define SADB_EALG_DESCBC 2 ++#define SADB_EALG_3DESCBC 3 ++#define SADB_X_EALG_CASTCBC 6 ++#define SADB_X_EALG_BLOWFISHCBC 7 ++#define SADB_EALG_NULL 11 ++#define SADB_X_EALG_AESCBC 12 ++#define SADB_X_EALG_AESCTR 13 ++#define SADB_X_EALG_AES_CCM_ICV8 14 ++#define SADB_X_EALG_AES_CCM_ICV12 15 ++#define SADB_X_EALG_AES_CCM_ICV16 16 ++#define SADB_X_EALG_AES_GCM_ICV8 18 ++#define SADB_X_EALG_AES_GCM_ICV12 19 ++#define SADB_X_EALG_AES_GCM_ICV16 20 ++#define SADB_X_EALG_CAMELLIACBC 22 ++#define SADB_X_EALG_NULL_AES_GMAC 23 ++#define SADB_EALG_MAX 253 /* last EALG */ ++/* private allocations should use 249-255 (RFC2407) */ ++#define SADB_X_EALG_SERPENTCBC 252 /* draft-ietf-ipsec-ciph-aes-cbc-00 */ ++#define SADB_X_EALG_TWOFISHCBC 253 /* draft-ietf-ipsec-ciph-aes-cbc-00 */ ++ ++/* Compression algorithms */ ++#define SADB_X_CALG_NONE 0 ++#define SADB_X_CALG_OUI 1 ++#define SADB_X_CALG_DEFLATE 2 ++#define SADB_X_CALG_LZS 3 ++#define SADB_X_CALG_LZJH 4 ++#define SADB_X_CALG_MAX 4 ++ ++/* Extension Header values */ ++#define SADB_EXT_RESERVED 0 ++#define SADB_EXT_SA 1 ++#define SADB_EXT_LIFETIME_CURRENT 2 ++#define SADB_EXT_LIFETIME_HARD 3 ++#define SADB_EXT_LIFETIME_SOFT 4 ++#define SADB_EXT_ADDRESS_SRC 5 ++#define SADB_EXT_ADDRESS_DST 6 ++#define SADB_EXT_ADDRESS_PROXY 7 ++#define SADB_EXT_KEY_AUTH 8 ++#define SADB_EXT_KEY_ENCRYPT 9 ++#define SADB_EXT_IDENTITY_SRC 10 ++#define SADB_EXT_IDENTITY_DST 11 ++#define SADB_EXT_SENSITIVITY 12 ++#define SADB_EXT_PROPOSAL 13 ++#define SADB_EXT_SUPPORTED_AUTH 14 ++#define SADB_EXT_SUPPORTED_ENCRYPT 15 ++#define SADB_EXT_SPIRANGE 16 ++#define SADB_X_EXT_KMPRIVATE 17 ++#define SADB_X_EXT_POLICY 18 ++#define SADB_X_EXT_SA2 19 ++/* The next four entries are for setting up NAT Traversal */ ++#define SADB_X_EXT_NAT_T_TYPE 20 ++#define SADB_X_EXT_NAT_T_SPORT 21 ++#define SADB_X_EXT_NAT_T_DPORT 22 ++#define SADB_X_EXT_NAT_T_OA 23 ++#define SADB_X_EXT_SEC_CTX 24 ++/* Used with MIGRATE to pass @ to IKE for negotiation */ ++#define SADB_X_EXT_KMADDRESS 25 ++#define SADB_X_EXT_FILTER 26 ++#define SADB_EXT_MAX 26 ++ ++/* Identity Extension values */ ++#define SADB_IDENTTYPE_RESERVED 0 ++#define SADB_IDENTTYPE_PREFIX 1 ++#define SADB_IDENTTYPE_FQDN 2 ++#define SADB_IDENTTYPE_USERFQDN 3 ++#define SADB_IDENTTYPE_MAX 3 ++ ++#endif /* !(_LINUX_PFKEY2_H) */ +diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h +index 7a69f2a..d5e2bf6 100644 +--- a/include/linux/pkt_cls.h ++++ b/include/linux/pkt_cls.h +@@ -37,7 +37,28 @@ enum { + #define TC_ACT_QUEUED 5 + #define TC_ACT_REPEAT 6 + #define TC_ACT_REDIRECT 7 +-#define TC_ACT_JUMP 0x10000000 ++#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" ++ * and don't further process the frame ++ * in hardware. For sw path, this is ++ * equivalent of TC_ACT_STOLEN - drop ++ * the skb and act like everything ++ * is alright. ++ */ ++ ++/* There is a special kind of actions called "extended actions", ++ * which need a value parameter. These have a local opcode located in ++ * the highest nibble, starting from 1. The rest of the bits ++ * are used to carry the value. These two parts together make ++ * a combined opcode. ++ */ ++#define __TC_ACT_EXT_SHIFT 28 ++#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) ++#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) ++#define TC_ACT_EXT_CMP(combined, opcode) \ ++ (((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode) ++ ++#define TC_ACT_JUMP __TC_ACT_EXT(1) ++#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) + + /* Action type identifiers*/ + enum { +@@ -348,6 +369,7 @@ enum { + TCA_BPF_FLAGS, + TCA_BPF_FLAGS_GEN, + TCA_BPF_TAG, ++ TCA_BPF_ID, + __TCA_BPF_MAX, + }; + +@@ -432,6 +454,19 @@ enum { + TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ + ++ TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ ++ TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ ++ TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ ++ TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ ++ ++ TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ ++ TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ ++ ++ TCA_FLOWER_KEY_IP_TOS, /* u8 */ ++ TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ ++ TCA_FLOWER_KEY_IP_TTL, /* u8 */ ++ TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ ++ + __TCA_FLOWER_MAX, + }; + +diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h +index df7451d..099bf55 100644 +--- a/include/linux/pkt_sched.h ++++ b/include/linux/pkt_sched.h +@@ -617,6 +617,14 @@ struct tc_drr_stats { + #define TC_QOPT_BITMASK 15 + #define TC_QOPT_MAX_QUEUE 16 + ++enum { ++ TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ ++ TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ ++ __TC_MQPRIO_HW_OFFLOAD_MAX ++}; ++ ++#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) ++ + struct tc_mqprio_qopt { + __u8 num_tc; + __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; +diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h +index d42fe83..813e9e0 100644 +--- a/include/linux/rtnetlink.h ++++ b/include/linux/rtnetlink.h +@@ -122,6 +122,8 @@ enum { + + RTM_NEWNETCONF = 80, + #define RTM_NEWNETCONF RTM_NEWNETCONF ++ RTM_DELNETCONF, ++#define RTM_DELNETCONF RTM_DELNETCONF + RTM_GETNETCONF = 82, + #define RTM_GETNETCONF RTM_GETNETCONF + +@@ -144,6 +146,9 @@ enum { + RTM_GETSTATS = 94, + #define RTM_GETSTATS RTM_GETSTATS + ++ RTM_NEWCACHEREPORT = 96, ++#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT ++ + __RTM_MAX, + #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) + }; +@@ -276,6 +281,7 @@ enum rt_scope_t { + #define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */ + #define RTM_F_PREFIX 0x800 /* Prefix addresses */ + #define RTM_F_LOOKUP_TABLE 0x1000 /* set rtm_table to FIB lookup result */ ++#define RTM_F_FIB_MATCH 0x2000 /* return full fib lookup match */ + + /* Reserved table identifiers */ + +@@ -319,6 +325,7 @@ enum rtattr_type_t { + RTA_EXPIRES, + RTA_PAD, + RTA_UID, ++ RTA_TTL_PROPAGATE, + __RTA_MAX + }; + +@@ -545,6 +552,8 @@ enum { + TCA_STATS2, + TCA_STAB, + TCA_PAD, ++ TCA_DUMP_INVISIBLE, ++ TCA_CHAIN, + __TCA_MAX + }; + +@@ -658,6 +667,10 @@ enum rtnetlink_groups { + #define RTNLGRP_NSID RTNLGRP_NSID + RTNLGRP_MPLS_NETCONF, + #define RTNLGRP_MPLS_NETCONF RTNLGRP_MPLS_NETCONF ++ RTNLGRP_IPV4_MROUTE_R, ++#define RTNLGRP_IPV4_MROUTE_R RTNLGRP_IPV4_MROUTE_R ++ RTNLGRP_IPV6_MROUTE_R, ++#define RTNLGRP_IPV6_MROUTE_R RTNLGRP_IPV6_MROUTE_R + __RTNLGRP_MAX + }; + #define RTNLGRP_MAX (__RTNLGRP_MAX - 1) +@@ -668,10 +681,29 @@ struct tcamsg { + unsigned char tca__pad1; + unsigned short tca__pad2; + }; ++ ++enum { ++ TCA_ROOT_UNSPEC, ++ TCA_ROOT_TAB, ++#define TCA_ACT_TAB TCA_ROOT_TAB ++#define TCAA_MAX TCA_ROOT_TAB ++ TCA_ROOT_FLAGS, ++ TCA_ROOT_COUNT, ++ TCA_ROOT_TIME_DELTA, /* in msecs */ ++ __TCA_ROOT_MAX, ++#define TCA_ROOT_MAX (__TCA_ROOT_MAX - 1) ++}; ++ + #define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg)))) + #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg)) +-#define TCA_ACT_TAB 1 /* attr type must be >=1 */ +-#define TCAA_MAX 1 ++/* tcamsg flags stored in attribute TCA_ROOT_FLAGS ++ * ++ * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO ++ * actions in a dump. All dump responses will contain the number of actions ++ * being dumped stored in for user app's consumption in TCA_ROOT_COUNT ++ * ++ */ ++#define TCA_FLAG_LARGE_DUMP_ON (1 << 0) + + /* New extended info filters for IFLA_EXT_MASK */ + #define RTEXT_FILTER_VF (1 << 0) +diff --git a/include/linux/sctp.h b/include/linux/sctp.h +index 5e08b3d..fec24c4 100644 +--- a/include/linux/sctp.h ++++ b/include/linux/sctp.h +@@ -115,10 +115,13 @@ typedef __s32 sctp_assoc_t; + #define SCTP_PR_SUPPORTED 113 + #define SCTP_DEFAULT_PRINFO 114 + #define SCTP_PR_ASSOC_STATUS 115 ++#define SCTP_PR_STREAM_STATUS 116 ++#define SCTP_RECONFIG_SUPPORTED 117 + #define SCTP_ENABLE_STREAM_RESET 118 + #define SCTP_RESET_STREAMS 119 + #define SCTP_RESET_ASSOC 120 + #define SCTP_ADD_STREAMS 121 ++#define SCTP_SOCKOPT_PEELOFF_FLAGS 122 + + /* PR-SCTP policies */ + #define SCTP_PR_SCTP_NONE 0x0000 +@@ -502,6 +505,28 @@ struct sctp_stream_reset_event { + __u16 strreset_stream_list[]; + }; + ++#define SCTP_ASSOC_RESET_DENIED 0x0004 ++#define SCTP_ASSOC_RESET_FAILED 0x0008 ++struct sctp_assoc_reset_event { ++ __u16 assocreset_type; ++ __u16 assocreset_flags; ++ __u32 assocreset_length; ++ sctp_assoc_t assocreset_assoc_id; ++ __u32 assocreset_local_tsn; ++ __u32 assocreset_remote_tsn; ++}; ++ ++#define SCTP_ASSOC_CHANGE_DENIED 0x0004 ++#define SCTP_ASSOC_CHANGE_FAILED 0x0008 ++struct sctp_stream_change_event { ++ __u16 strchange_type; ++ __u16 strchange_flags; ++ __u32 strchange_length; ++ sctp_assoc_t strchange_assoc_id; ++ __u16 strchange_instrms; ++ __u16 strchange_outstrms; ++}; ++ + /* + * Described in Section 7.3 + * Ancillary Data and Notification Interest Options +@@ -518,6 +543,8 @@ struct sctp_event_subscribe { + __u8 sctp_authentication_event; + __u8 sctp_sender_dry_event; + __u8 sctp_stream_reset_event; ++ __u8 sctp_assoc_reset_event; ++ __u8 sctp_stream_change_event; + }; + + /* +@@ -543,6 +570,8 @@ union sctp_notification { + struct sctp_authkey_event sn_authkey_event; + struct sctp_sender_dry_event sn_sender_dry_event; + struct sctp_stream_reset_event sn_strreset_event; ++ struct sctp_assoc_reset_event sn_assocreset_event; ++ struct sctp_stream_change_event sn_strchange_event; + }; + + /* Section 5.3.1 +@@ -572,6 +601,10 @@ enum sctp_sn_type { + #define SCTP_SENDER_DRY_EVENT SCTP_SENDER_DRY_EVENT + SCTP_STREAM_RESET_EVENT, + #define SCTP_STREAM_RESET_EVENT SCTP_STREAM_RESET_EVENT ++ SCTP_ASSOC_RESET_EVENT, ++#define SCTP_ASSOC_RESET_EVENT SCTP_ASSOC_RESET_EVENT ++ SCTP_STREAM_CHANGE_EVENT, ++#define SCTP_STREAM_CHANGE_EVENT SCTP_STREAM_CHANGE_EVENT + }; + + /* Notification error codes used to fill up the error fields in some +@@ -940,6 +973,11 @@ typedef struct { + int sd; + } sctp_peeloff_arg_t; + ++typedef struct { ++ sctp_peeloff_arg_t p_arg; ++ unsigned flags; ++} sctp_peeloff_flags_arg_t; ++ + /* + * Peer Address Thresholds socket option + */ +diff --git a/include/linux/seg6.h b/include/linux/seg6.h +new file mode 100644 +index 0000000..0715279 +--- /dev/null ++++ b/include/linux/seg6.h +@@ -0,0 +1,54 @@ ++/* ++ * SR-IPv6 implementation ++ * ++ * Author: ++ * David Lebrun ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_SEG6_H ++#define _LINUX_SEG6_H ++ ++#include ++#include /* For struct in6_addr. */ ++ ++/* ++ * SRH ++ */ ++struct ipv6_sr_hdr { ++ __u8 nexthdr; ++ __u8 hdrlen; ++ __u8 type; ++ __u8 segments_left; ++ __u8 first_segment; ++ __u8 flags; ++ __u16 reserved; ++ ++ struct in6_addr segments[0]; ++}; ++ ++#define SR6_FLAG1_PROTECTED (1 << 6) ++#define SR6_FLAG1_OAM (1 << 5) ++#define SR6_FLAG1_ALERT (1 << 4) ++#define SR6_FLAG1_HMAC (1 << 3) ++ ++#define SR6_TLV_INGRESS 1 ++#define SR6_TLV_EGRESS 2 ++#define SR6_TLV_OPAQUE 3 ++#define SR6_TLV_PADDING 4 ++#define SR6_TLV_HMAC 5 ++ ++#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC) ++ ++struct sr6_tlv { ++ __u8 type; ++ __u8 len; ++ __u8 data[0]; ++}; ++ ++#endif +diff --git a/include/linux/seg6_genl.h b/include/linux/seg6_genl.h +new file mode 100644 +index 0000000..99382f9 +--- /dev/null ++++ b/include/linux/seg6_genl.h +@@ -0,0 +1,32 @@ ++#ifndef _LINUX_SEG6_GENL_H ++#define _LINUX_SEG6_GENL_H ++ ++#define SEG6_GENL_NAME "SEG6" ++#define SEG6_GENL_VERSION 0x1 ++ ++enum { ++ SEG6_ATTR_UNSPEC, ++ SEG6_ATTR_DST, ++ SEG6_ATTR_DSTLEN, ++ SEG6_ATTR_HMACKEYID, ++ SEG6_ATTR_SECRET, ++ SEG6_ATTR_SECRETLEN, ++ SEG6_ATTR_ALGID, ++ SEG6_ATTR_HMACINFO, ++ __SEG6_ATTR_MAX, ++}; ++ ++#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1) ++ ++enum { ++ SEG6_CMD_UNSPEC, ++ SEG6_CMD_SETHMAC, ++ SEG6_CMD_DUMPHMAC, ++ SEG6_CMD_SET_TUNSRC, ++ SEG6_CMD_GET_TUNSRC, ++ __SEG6_CMD_MAX, ++}; ++ ++#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1) ++ ++#endif +diff --git a/include/linux/seg6_hmac.h b/include/linux/seg6_hmac.h +new file mode 100644 +index 0000000..704f93e +--- /dev/null ++++ b/include/linux/seg6_hmac.h +@@ -0,0 +1,22 @@ ++#ifndef _LINUX_SEG6_HMAC_H ++#define _LINUX_SEG6_HMAC_H ++ ++#include ++#include ++ ++#define SEG6_HMAC_SECRET_LEN 64 ++#define SEG6_HMAC_FIELD_LEN 32 ++ ++struct sr6_tlv_hmac { ++ struct sr6_tlv tlvhdr; ++ __u16 reserved; ++ __be32 hmackeyid; ++ __u8 hmac[SEG6_HMAC_FIELD_LEN]; ++}; ++ ++enum { ++ SEG6_HMAC_ALGO_SHA1 = 1, ++ SEG6_HMAC_ALGO_SHA256 = 2, ++}; ++ ++#endif +diff --git a/include/linux/seg6_iptunnel.h b/include/linux/seg6_iptunnel.h +new file mode 100644 +index 0000000..a5dc05a +--- /dev/null ++++ b/include/linux/seg6_iptunnel.h +@@ -0,0 +1,40 @@ ++/* ++ * SR-IPv6 implementation ++ * ++ * Author: ++ * David Lebrun ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_SEG6_IPTUNNEL_H ++#define _LINUX_SEG6_IPTUNNEL_H ++ ++#include /* For struct ipv6_sr_hdr. */ ++ ++enum { ++ SEG6_IPTUNNEL_UNSPEC, ++ SEG6_IPTUNNEL_SRH, ++ __SEG6_IPTUNNEL_MAX, ++}; ++#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1) ++ ++struct seg6_iptunnel_encap { ++ int mode; ++ struct ipv6_sr_hdr srh[0]; ++}; ++ ++#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3)) ++ ++enum { ++ SEG6_IPTUN_MODE_INLINE, ++ SEG6_IPTUN_MODE_ENCAP, ++ SEG6_IPTUN_MODE_L2ENCAP, ++}; ++ ++ ++#endif +diff --git a/include/linux/seg6_local.h b/include/linux/seg6_local.h +new file mode 100644 +index 0000000..76b90d6 +--- /dev/null ++++ b/include/linux/seg6_local.h +@@ -0,0 +1,68 @@ ++/* ++ * SR-IPv6 implementation ++ * ++ * Author: ++ * David Lebrun ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_SEG6_LOCAL_H ++#define _LINUX_SEG6_LOCAL_H ++ ++#include ++ ++enum { ++ SEG6_LOCAL_UNSPEC, ++ SEG6_LOCAL_ACTION, ++ SEG6_LOCAL_SRH, ++ SEG6_LOCAL_TABLE, ++ SEG6_LOCAL_NH4, ++ SEG6_LOCAL_NH6, ++ SEG6_LOCAL_IIF, ++ SEG6_LOCAL_OIF, ++ __SEG6_LOCAL_MAX, ++}; ++#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1) ++ ++enum { ++ SEG6_LOCAL_ACTION_UNSPEC = 0, ++ /* node segment */ ++ SEG6_LOCAL_ACTION_END = 1, ++ /* adjacency segment (IPv6 cross-connect) */ ++ SEG6_LOCAL_ACTION_END_X = 2, ++ /* lookup of next seg NH in table */ ++ SEG6_LOCAL_ACTION_END_T = 3, ++ /* decap and L2 cross-connect */ ++ SEG6_LOCAL_ACTION_END_DX2 = 4, ++ /* decap and IPv6 cross-connect */ ++ SEG6_LOCAL_ACTION_END_DX6 = 5, ++ /* decap and IPv4 cross-connect */ ++ SEG6_LOCAL_ACTION_END_DX4 = 6, ++ /* decap and lookup of DA in v6 table */ ++ SEG6_LOCAL_ACTION_END_DT6 = 7, ++ /* decap and lookup of DA in v4 table */ ++ SEG6_LOCAL_ACTION_END_DT4 = 8, ++ /* binding segment with insertion */ ++ SEG6_LOCAL_ACTION_END_B6 = 9, ++ /* binding segment with encapsulation */ ++ SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, ++ /* binding segment with MPLS encap */ ++ SEG6_LOCAL_ACTION_END_BM = 11, ++ /* lookup last seg in table */ ++ SEG6_LOCAL_ACTION_END_S = 12, ++ /* forward to SR-unaware VNF with static proxy */ ++ SEG6_LOCAL_ACTION_END_AS = 13, ++ /* forward to SR-unaware VNF with masquerading */ ++ SEG6_LOCAL_ACTION_END_AM = 14, ++ ++ __SEG6_LOCAL_ACTION_MAX, ++}; ++ ++#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1) ++ ++#endif +diff --git a/include/linux/tc_act/tc_bpf.h b/include/linux/tc_act/tc_bpf.h +index 975b50d..8dc2ac0 100644 +--- a/include/linux/tc_act/tc_bpf.h ++++ b/include/linux/tc_act/tc_bpf.h +@@ -28,6 +28,7 @@ enum { + TCA_ACT_BPF_NAME, + TCA_ACT_BPF_PAD, + TCA_ACT_BPF_TAG, ++ TCA_ACT_BPF_ID, + __TCA_ACT_BPF_MAX, + }; + #define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1) +diff --git a/include/linux/tc_act/tc_tunnel_key.h b/include/linux/tc_act/tc_tunnel_key.h +index 84ea55e..afcd4be 100644 +--- a/include/linux/tc_act/tc_tunnel_key.h ++++ b/include/linux/tc_act/tc_tunnel_key.h +@@ -34,6 +34,7 @@ enum { + TCA_TUNNEL_KEY_ENC_KEY_ID, /* be64 */ + TCA_TUNNEL_KEY_PAD, + TCA_TUNNEL_KEY_ENC_DST_PORT, /* be16 */ ++ TCA_TUNNEL_KEY_NO_CSUM, /* u8 */ + __TCA_TUNNEL_KEY_MAX, + }; + +diff --git a/include/linux/tcp.h b/include/linux/tcp.h +index d34fb5c..8edad3f 100644 +--- a/include/linux/tcp.h ++++ b/include/linux/tcp.h +@@ -117,6 +117,8 @@ enum { + #define TCP_SAVED_SYN 28 /* Get SYN headers recorded for connection */ + #define TCP_REPAIR_WINDOW 29 /* Get/set window parameters */ + #define TCP_FASTOPEN_CONNECT 30 /* Attempt FastOpen with connect */ ++#define TCP_ULP 31 /* Attach a ULP to a TCP connection */ ++#define TCP_MD5SIG_EXT 32 /* TCP MD5 Signature with extensions */ + + struct tcp_repair_opt { + __u32 opt_code; +@@ -229,17 +231,38 @@ enum { + TCP_NLA_SNDBUF_LIMITED, /* Time (usec) limited by send buffer */ + TCP_NLA_DATA_SEGS_OUT, /* Data pkts sent including retransmission */ + TCP_NLA_TOTAL_RETRANS, /* Data pkts retransmitted */ ++ TCP_NLA_PACING_RATE, /* Pacing rate in bytes per second */ ++ TCP_NLA_DELIVERY_RATE, /* Delivery rate in bytes per second */ ++ TCP_NLA_SND_CWND, /* Sending congestion window */ ++ TCP_NLA_REORDERING, /* Reordering metric */ ++ TCP_NLA_MIN_RTT, /* minimum RTT */ ++ TCP_NLA_RECUR_RETRANS, /* Recurring retransmits for the current pkt */ ++ TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */ ++ + }; + + /* for TCP_MD5SIG socket option */ + #define TCP_MD5SIG_MAXKEYLEN 80 + ++/* tcp_md5sig extension flags for TCP_MD5SIG_EXT */ ++#define TCP_MD5SIG_FLAG_PREFIX 1 /* address prefix length */ ++ + struct tcp_md5sig { + struct __kernel_sockaddr_storage tcpm_addr; /* address associated */ +- __u16 __tcpm_pad1; /* zero */ ++ __u8 tcpm_flags; /* extension flags */ ++ __u8 tcpm_prefixlen; /* address prefix */ + __u16 tcpm_keylen; /* key length */ +- __u32 __tcpm_pad2; /* zero */ ++ __u32 __tcpm_pad; /* zero */ + __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; /* key (binary) */ + }; + ++/* INET_DIAG_MD5SIG */ ++struct tcp_diag_md5sig { ++ __u8 tcpm_family; ++ __u8 tcpm_prefixlen; ++ __u16 tcpm_keylen; ++ __be32 tcpm_addr[4]; ++ __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; ++}; ++ + #endif /* _LINUX_TCP_H */ +diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h +index d2dd1fd..5790293 100644 +--- a/include/linux/xfrm.h ++++ b/include/linux/xfrm.h +@@ -303,6 +303,8 @@ enum xfrm_attr_type_t { + XFRMA_PROTO, /* __u8 */ + XFRMA_ADDRESS_FILTER, /* struct xfrm_address_filter */ + XFRMA_PAD, ++ XFRMA_OFFLOAD_DEV, /* struct xfrm_state_offload */ ++ XFRMA_OUTPUT_MARK, /* __u32 */ + __XFRMA_MAX + + #define XFRMA_MAX (__XFRMA_MAX - 1) +@@ -494,6 +496,13 @@ struct xfrm_address_filter { + __u8 dplen; + }; + ++struct xfrm_user_offload { ++ int ifindex; ++ __u8 flags; ++}; ++#define XFRM_OFFLOAD_IPV6 1 ++#define XFRM_OFFLOAD_INBOUND 2 ++ + /* backwards compatibility for userspace */ + #define XFRMGRP_ACQUIRE 1 + #define XFRMGRP_EXPIRE 2 +-- +1.8.3.1 + diff --git a/SOURCES/0025-devlink-Change-netlink-attribute-validation.patch b/SOURCES/0025-devlink-Change-netlink-attribute-validation.patch new file mode 100644 index 0000000..832c7da --- /dev/null +++ b/SOURCES/0025-devlink-Change-netlink-attribute-validation.patch @@ -0,0 +1,151 @@ +From 56a3a027d053ab592a3363a92108c93c150301f5 Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + Signed-off-by: Jiri Pirko + Reviewed-by: Greg Rose + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0026-devlink-Add-support-for-pipeline-debug-dpipe.patch b/SOURCES/0026-devlink-Add-support-for-pipeline-debug-dpipe.patch new file mode 100644 index 0000000..7bebb6c --- /dev/null +++ b/SOURCES/0026-devlink-Add-support-for-pipeline-debug-dpipe.patch @@ -0,0 +1,1597 @@ +From 120f9c488ba7d291f899f1ec2f77e0ae33efcd88 Mon Sep 17 00:00:00 2001 +From: Kamal Heib +Date: Thu, 9 Nov 2017 04:44:32 -0500 +Subject: [PATCH] devlink: Add support for pipeline debug (dpipe) + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1456539 + +commit 153c1a9b21e5b7b78e066de2b93a4edb8c3dc498 +Author: Arkadi Sharshevsky +Date: Wed May 3 13:25:23 2017 +0200 + + devlink: Add support for pipeline debug (dpipe) + + Add support for pipeline debug (dpipe). The headers are used both the + gain visibillity into the headers supported by the hardware, and to + build the headers/field database which is used by other commands. + + Examples: + + First we can see the headers supported by the hardware: + + $devlink dpipe header show pci/0000:03:00.0 + + pci/0000:03:00.0: + name mlxsw_meta + field: + name erif_port bitwidth 32 mapping_type ifindex + name l3_forward bitwidth 1 + name l3_drop bitwidth 1 + + Note that mapping_type is presented only if relevant. Also the header/ + field id's are reported by the kernel they are not shown by default. + They can be observed by using the -v option. Also the headers scope + (global/local) is specified. + + $devlink -v dpipe header show pci/0000:03:00.0 + + pci/0000:03:00.0: + name mlxsw_meta id 0 global false + field: + name erif_port id 0 bitwidth 32 mapping_type ifindex + name l3_forward id 1 bitwidth 1 + name l3_drop id 2 bitwidth 1 + + Second we can examine the tables supported by the hardware. In order + to dump all the tables no table name should be provided: + $devlink dpipe table show pci/0000:03:00.0 + + In order to examine specific table its name have to be specified: + $devlink dpipe table show pci/0000:03:00.0 name erif + + pci/0000:03:00.0: + name mlxsw_erif size 800 counters_enabled true + match: + type field_exact header mlxsw_meta field erif_port mapping ifindex + action: + type field_modify header mlxsw_meta field l3_forward + type field_modify header mlxsw_meta field l3_drop + + To enable/disable counters on the table: + $devlink dpipe table set pci/0000:03:00.0 name erif counters enable + $devlink dpipe table set pci/0000:03:00.0 name erif counters disable + + In order to see the current entries in the hardware for specific table: + $devlink dpipe table dump pci/0000:03:00.0 name erif + + pci/0000:03:00.0: + index 0 counter 0 + match_value: + type field_exact header mlxsw_meta field erif_port mapping ifindex mapping_value 383 value 0 + action_value: + type field_modify header mlxsw_meta field l3_forward value 1 + + index 1 counter 0 + match_value: + type field_exact header mlxsw_meta field erif_port mapping ifindex mapping_value 381 value 1 + action_value: + type field_modify header mlxsw_meta field l3_forward value 1 + + In the above example the table contains two entries which does match + on erif port and forwards the packet or drop it (currently only the + forward count is implemented). The counter values are provided for + example. In case the counting is not enabled on the table the counters + will not be available. + + Signed-off-by: Arkadi Sharshevsky + Signed-off-by: Jiri Pirko + +Signed-off-by: Kamal Heib +--- + devlink/devlink.c | 1353 +++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 1254 insertions(+), 99 deletions(-) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index 35220d8..e22ee0a 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -34,7 +34,15 @@ + #define ESWITCH_INLINE_MODE_TRANSPORT "transport" + + #define pr_err(args...) fprintf(stderr, ##args) +-#define pr_out(args...) fprintf(stdout, ##args) ++#define pr_out(args...) \ ++ do { \ ++ if (g_indent_newline) { \ ++ fprintf(stdout, "%s", g_indent_str); \ ++ g_indent_newline = false; \ ++ } \ ++ fprintf(stdout, ##args); \ ++ } while (0) ++ + #define pr_out_sp(num, args...) \ + do { \ + int ret = fprintf(stdout, ##args); \ +@@ -42,6 +50,35 @@ + fprintf(stdout, "%*s", num - ret, ""); \ + } while (0) + ++static int g_indent_level; ++static bool g_indent_newline; ++#define INDENT_STR_STEP 2 ++#define INDENT_STR_MAXLEN 32 ++static char g_indent_str[INDENT_STR_MAXLEN + 1] = ""; ++ ++static void __pr_out_indent_inc(void) ++{ ++ if (g_indent_level + INDENT_STR_STEP > INDENT_STR_MAXLEN) ++ return; ++ g_indent_level += INDENT_STR_STEP; ++ memset(g_indent_str, ' ', sizeof(g_indent_str)); ++ g_indent_str[g_indent_level] = '\0'; ++} ++ ++static void __pr_out_indent_dec(void) ++{ ++ if (g_indent_level - INDENT_STR_STEP < 0) ++ return; ++ g_indent_level -= INDENT_STR_STEP; ++ g_indent_str[g_indent_level] = '\0'; ++} ++ ++static void __pr_out_newline(void) ++{ ++ pr_out("\n"); ++ g_indent_newline = true; ++} ++ + static int _mnlg_socket_recv_run(struct mnlg_socket *nlg, + mnl_cb_t data_cb, void *data) + { +@@ -137,6 +174,8 @@ static void ifname_map_free(struct ifname_map *ifname_map) + #define DL_OPT_SB_TC BIT(10) + #define DL_OPT_ESWITCH_MODE BIT(11) + #define DL_OPT_ESWITCH_INLINE_MODE BIT(12) ++#define DL_OPT_DPIPE_TABLE_NAME BIT(13) ++#define DL_OPT_DPIPE_TABLE_COUNTERS BIT(14) + + struct dl_opts { + uint32_t present; /* flags of present items */ +@@ -154,6 +193,8 @@ struct dl_opts { + uint16_t sb_tc_index; + enum devlink_eswitch_mode eswitch_mode; + enum devlink_eswitch_inline_mode eswitch_inline_mode; ++ const char *dpipe_table_name; ++ bool dpipe_counters_enable; + }; + + struct dl { +@@ -166,6 +207,7 @@ struct dl { + json_writer_t *jw; + bool json_output; + bool pretty_output; ++ bool verbose; + struct { + bool present; + char *bus_name; +@@ -257,6 +299,38 @@ 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_DPIPE_TABLES] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_TABLE] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_TABLE_NAME] = MNL_TYPE_STRING, ++ [DEVLINK_ATTR_DPIPE_TABLE_SIZE] = MNL_TYPE_U64, ++ [DEVLINK_ATTR_DPIPE_TABLE_MATCHES] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] = MNL_TYPE_U8, ++ [DEVLINK_ATTR_DPIPE_ENTRIES] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_ENTRY] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_ENTRY_INDEX] = MNL_TYPE_U64, ++ [DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_ENTRY_COUNTER] = MNL_TYPE_U64, ++ [DEVLINK_ATTR_DPIPE_MATCH] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_MATCH_VALUE] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_MATCH_TYPE] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_ACTION] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_ACTION_VALUE] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_ACTION_TYPE] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_HEADERS] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_HEADER] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_HEADER_NAME] = MNL_TYPE_STRING, ++ [DEVLINK_ATTR_DPIPE_HEADER_ID] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_HEADER_FIELDS] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = MNL_TYPE_U8, ++ [DEVLINK_ATTR_DPIPE_HEADER_INDEX] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_FIELD] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_DPIPE_FIELD_NAME] = MNL_TYPE_STRING, ++ [DEVLINK_ATTR_DPIPE_FIELD_ID] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = MNL_TYPE_U32, + }; + + static int attr_cb(const struct nlattr *attr, void *data) +@@ -666,6 +740,20 @@ static int eswitch_inline_mode_get(const char *typestr, + return 0; + } + ++static int dpipe_counters_enable_get(const char *typestr, ++ bool *counters_enable) ++{ ++ if (strcmp(typestr, "enable") == 0) { ++ *counters_enable = 1; ++ } else if (strcmp(typestr, "disable") == 0) { ++ *counters_enable = 0; ++ } else { ++ pr_err("Unknown counter_state \"%s\"\n", typestr); ++ return -EINVAL; ++ } ++ return 0; ++} ++ + static int dl_argv_parse(struct dl *dl, uint32_t o_required, + uint32_t o_optional) + { +@@ -800,6 +888,27 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, + if (err) + return err; + o_found |= DL_OPT_ESWITCH_INLINE_MODE; ++ } else if (dl_argv_match(dl, "name") && ++ (o_all & DL_OPT_DPIPE_TABLE_NAME)) { ++ dl_arg_inc(dl); ++ err = dl_argv_str(dl, &opts->dpipe_table_name); ++ if (err) ++ return err; ++ o_found |= DL_OPT_DPIPE_TABLE_NAME; ++ } else if (dl_argv_match(dl, "counters") && ++ (o_all & DL_OPT_DPIPE_TABLE_COUNTERS)) { ++ const char *typestr; ++ ++ dl_arg_inc(dl); ++ err = dl_argv_str(dl, &typestr); ++ if (err) ++ return err; ++ err = dpipe_counters_enable_get(typestr, ++ &opts->dpipe_counters_enable); ++ if (err) ++ return err; ++ o_found |= DL_OPT_DPIPE_TABLE_COUNTERS; ++ + } else { + pr_err("Unknown option \"%s\"\n", dl_argv(dl)); + return -EINVAL; +@@ -866,6 +975,17 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, + return -EINVAL; + } + ++ if ((o_required & DL_OPT_DPIPE_TABLE_NAME) && ++ !(o_found & DL_OPT_DPIPE_TABLE_NAME)) { ++ pr_err("Dpipe table name expected\n"); ++ return -EINVAL; ++ } ++ ++ if ((o_required & DL_OPT_DPIPE_TABLE_COUNTERS) && ++ !(o_found & DL_OPT_DPIPE_TABLE_COUNTERS)) { ++ pr_err("Dpipe table counter state expected\n"); ++ return -EINVAL; ++ } + return 0; + } + +@@ -915,6 +1035,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl) + if (opts->present & DL_OPT_ESWITCH_INLINE_MODE) + mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_INLINE_MODE, + opts->eswitch_inline_mode); ++ if (opts->present & DL_OPT_DPIPE_TABLE_NAME) ++ mnl_attr_put_strz(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, ++ opts->dpipe_table_name); ++ if (opts->present & DL_OPT_DPIPE_TABLE_COUNTERS) ++ mnl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, ++ opts->dpipe_counters_enable); + } + + static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl, +@@ -1033,7 +1159,19 @@ static void __pr_out_handle_start(struct dl *dl, struct nlattr **tb, + jsonw_start_object(dl->jw); + } + } else { +- pr_out("%s%s", buf, content ? ":" : ""); ++ if (array) { ++ if (should_arr_last_handle_end(dl, bus_name, dev_name)) ++ __pr_out_indent_dec(); ++ if (should_arr_last_handle_start(dl, bus_name, ++ dev_name)) { ++ pr_out("%s%s", buf, content ? ":" : ""); ++ __pr_out_newline(); ++ __pr_out_indent_inc(); ++ arr_last_handle_set(dl, bus_name, dev_name); ++ } ++ } else { ++ pr_out("%s%s", buf, content ? ":" : ""); ++ } + } + } + +@@ -1047,7 +1185,7 @@ static void pr_out_handle_end(struct dl *dl) + if (dl->json_output) + jsonw_end_object(dl->jw); + else +- pr_out("\n"); ++ __pr_out_newline(); + } + + static void pr_out_handle(struct dl *dl, struct nlattr **tb) +@@ -1163,18 +1301,26 @@ static void pr_out_port_handle_end(struct dl *dl) + + static void pr_out_str(struct dl *dl, const char *name, const char *val) + { +- if (dl->json_output) ++ if (dl->json_output) { + jsonw_string_field(dl->jw, name, val); +- else +- pr_out(" %s %s", name, val); ++ } else { ++ if (g_indent_newline) ++ pr_out("%s %s", name, val); ++ else ++ pr_out(" %s %s", name, val); ++ } + } + + static void pr_out_uint(struct dl *dl, const char *name, unsigned int val) + { +- if (dl->json_output) ++ if (dl->json_output) { + jsonw_uint_field(dl->jw, name, val); +- else +- pr_out(" %s %u", name, val); ++ } else { ++ if (g_indent_newline) ++ pr_out("%s %u", name, val); ++ else ++ pr_out(" %s %u", name, val); ++ } + } + + static void pr_out_dev(struct dl *dl, struct nlattr **tb) +@@ -1201,6 +1347,42 @@ static void pr_out_section_end(struct dl *dl) + } + } + ++static void pr_out_array_start(struct dl *dl, const char *name) ++{ ++ if (dl->json_output) { ++ jsonw_name(dl->jw, name); ++ jsonw_start_array(dl->jw); ++ } else { ++ if (!g_indent_newline) ++ __pr_out_newline(); ++ pr_out("%s:", name); ++ __pr_out_newline(); ++ __pr_out_indent_inc(); ++ } ++} ++ ++static void pr_out_array_end(struct dl *dl) ++{ ++ if (dl->json_output) ++ jsonw_end_array(dl->jw); ++ else ++ __pr_out_indent_dec(); ++} ++ ++static void pr_out_entry_start(struct dl *dl) ++{ ++ if (dl->json_output) ++ jsonw_start_object(dl->jw); ++} ++ ++static void pr_out_entry_end(struct dl *dl) ++{ ++ if (dl->json_output) ++ jsonw_end_object(dl->jw); ++ else ++ __pr_out_newline(); ++} ++ + static const char *eswitch_mode_name(uint32_t mode) + { + switch (mode) { +@@ -2423,129 +2605,1102 @@ static int cmd_mon(struct dl *dl) + return -ENOENT; + } + +-static void help(void) ++struct dpipe_field { ++ char *name; ++ unsigned int id; ++ unsigned int bitwidth; ++ enum devlink_dpipe_field_mapping_type mapping_type; ++}; ++ ++struct dpipe_header { ++ struct list_head list; ++ char *name; ++ unsigned int id; ++ struct dpipe_field *fields; ++ unsigned int fields_count; ++}; ++ ++struct dpipe_ctx { ++ struct dl *dl; ++ int err; ++ struct list_head global_headers; ++ struct list_head local_headers; ++ bool print_headers; ++}; ++ ++static struct dpipe_header *dpipe_header_alloc(unsigned int fields_count) + { +- pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n" +- "where OBJECT := { dev | port | sb | monitor }\n" +- " OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] }\n"); ++ struct dpipe_header *header; ++ ++ header = calloc(1, sizeof(struct dpipe_header)); ++ if (!header) ++ return NULL; ++ header->fields = calloc(fields_count, sizeof(struct dpipe_field)); ++ if (!header->fields) ++ goto err_fields_alloc; ++ header->fields_count = fields_count; ++ return header; ++ ++err_fields_alloc: ++ free(header); ++ return NULL; + } + +-static int dl_cmd(struct dl *dl) ++static void dpipe_header_free(struct dpipe_header *header) + { +- if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { +- help(); +- return 0; +- } else if (dl_argv_match(dl, "dev")) { +- dl_arg_inc(dl); +- return cmd_dev(dl); +- } else if (dl_argv_match(dl, "port")) { +- dl_arg_inc(dl); +- return cmd_port(dl); +- } else if (dl_argv_match(dl, "sb")) { +- dl_arg_inc(dl); +- return cmd_sb(dl); +- } else if (dl_argv_match(dl, "monitor")) { +- dl_arg_inc(dl); +- return cmd_mon(dl); ++ free(header->fields); ++ free(header); ++} ++ ++static void dpipe_header_clear(struct dpipe_header *header) ++{ ++ struct dpipe_field *field; ++ int i; ++ ++ for (i = 0; i < header->fields_count; i++) { ++ field = &header->fields[i]; ++ free(field->name); + } +- pr_err("Object \"%s\" not found\n", dl_argv(dl)); +- return -ENOENT; ++ free(header->name); + } + +-static int dl_init(struct dl *dl, int argc, char **argv) ++static void dpipe_header_add(struct dpipe_ctx *ctx, ++ struct dpipe_header *header, bool global) + { +- int err; ++ if (global) ++ list_add(&header->list, &ctx->global_headers); ++ else ++ list_add(&header->list, &ctx->local_headers); ++} + +- dl->argc = argc; +- dl->argv = argv; ++static void dpipe_header_del(struct dpipe_header *header) ++{ ++ list_del(&header->list); ++} + +- dl->nlg = mnlg_socket_open(DEVLINK_GENL_NAME, DEVLINK_GENL_VERSION); +- if (!dl->nlg) { +- pr_err("Failed to connect to devlink Netlink\n"); +- return -errno; ++static struct dpipe_ctx *dpipe_ctx_alloc(struct dl *dl) ++{ ++ struct dpipe_ctx *ctx; ++ ++ ctx = calloc(1, sizeof(struct dpipe_ctx)); ++ if (!ctx) ++ return NULL; ++ ctx->dl = dl; ++ INIT_LIST_HEAD(&ctx->global_headers); ++ INIT_LIST_HEAD(&ctx->local_headers); ++ return ctx; ++} ++ ++static void dpipe_ctx_free(struct dpipe_ctx *ctx) ++{ ++ free(ctx); ++} ++ ++static void dpipe_ctx_clear(struct dpipe_ctx *ctx) ++{ ++ struct dpipe_header *header, *tmp; ++ ++ list_for_each_entry_safe(header, tmp, &ctx->global_headers, ++ list) { ++ dpipe_header_del(header); ++ dpipe_header_clear(header); ++ dpipe_header_free(header); ++ } ++ list_for_each_entry_safe(header, tmp, &ctx->local_headers, ++ list) { ++ dpipe_header_del(header); ++ dpipe_header_clear(header); ++ dpipe_header_free(header); + } ++} + +- err = ifname_map_init(dl); +- if (err) { +- pr_err("Failed to create index map\n"); +- goto err_ifname_map_create; ++static const char *dpipe_header_id2s(struct dpipe_ctx *ctx, ++ uint32_t header_id, bool global) ++{ ++ struct list_head *header_list; ++ struct dpipe_header *header; ++ ++ if (global) ++ header_list = &ctx->global_headers; ++ else ++ header_list = &ctx->local_headers; ++ list_for_each_entry(header, header_list, list) { ++ if (header->id != header_id) ++ continue; ++ return header->name; + } +- if (dl->json_output) { +- dl->jw = jsonw_new(stdout); +- if (!dl->jw) { +- pr_err("Failed to create JSON writer\n"); +- goto err_json_new; +- } +- jsonw_pretty(dl->jw, dl->pretty_output); ++ return NULL; ++} ++ ++static const char *dpipe_field_id2s(struct dpipe_ctx *ctx, ++ uint32_t header_id, ++ uint32_t field_id, bool global) ++{ ++ struct list_head *header_list; ++ struct dpipe_header *header; ++ ++ if (global) ++ header_list = &ctx->global_headers; ++ else ++ header_list = &ctx->local_headers; ++ list_for_each_entry(header, header_list, list) { ++ if (header->id != header_id) ++ continue; ++ return header->fields[field_id].name; + } +- return 0; ++ return NULL; ++} + +-err_json_new: +- ifname_map_fini(dl); +-err_ifname_map_create: +- mnlg_socket_close(dl->nlg); +- return err; ++static const char * ++dpipe_field_mapping_e2s(enum devlink_dpipe_field_mapping_type mapping_type) ++{ ++ switch (mapping_type) { ++ case DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE: ++ return NULL; ++ case DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX: ++ return "ifindex"; ++ default: ++ return ""; ++ } + } + +-static void dl_fini(struct dl *dl) ++static const char * ++dpipe_mapping_get(struct dpipe_ctx *ctx, uint32_t header_id, ++ uint32_t field_id, bool global) + { +- if (dl->json_output) +- jsonw_destroy(&dl->jw); +- ifname_map_fini(dl); +- mnlg_socket_close(dl->nlg); ++ enum devlink_dpipe_field_mapping_type mapping_type; ++ struct list_head *header_list; ++ struct dpipe_header *header; ++ ++ if (global) ++ header_list = &ctx->global_headers; ++ else ++ header_list = &ctx->local_headers; ++ list_for_each_entry(header, header_list, list) { ++ if (header->id != header_id) ++ continue; ++ mapping_type = header->fields[field_id].mapping_type; ++ return dpipe_field_mapping_e2s(mapping_type); ++ } ++ return NULL; + } + +-static struct dl *dl_alloc(void) ++static void pr_out_dpipe_fields(struct dpipe_ctx *ctx, ++ struct dpipe_field *fields, ++ unsigned int field_count) + { +- struct dl *dl; ++ struct dpipe_field *field; ++ int i; + +- dl = calloc(1, sizeof(*dl)); +- if (!dl) +- return NULL; +- return dl; ++ for (i = 0; i < field_count; i++) { ++ field = &fields[i]; ++ pr_out_entry_start(ctx->dl); ++ pr_out_str(ctx->dl, "name", field->name); ++ if (ctx->dl->verbose) ++ pr_out_uint(ctx->dl, "id", field->id); ++ pr_out_uint(ctx->dl, "bitwidth", field->bitwidth); ++ if (field->mapping_type) ++ pr_out_str(ctx->dl, "mapping_type", ++ dpipe_field_mapping_e2s(field->mapping_type)); ++ pr_out_entry_end(ctx->dl); ++ } + } + +-static void dl_free(struct dl *dl) ++static void ++pr_out_dpipe_header(struct dpipe_ctx *ctx, struct nlattr **tb, ++ struct dpipe_header *header, bool global) + { +- free(dl); ++ pr_out_handle_start_arr(ctx->dl, tb); ++ pr_out_str(ctx->dl, "name", header->name); ++ if (ctx->dl->verbose) { ++ pr_out_uint(ctx->dl, "id", header->id); ++ pr_out_str(ctx->dl, "global", ++ global ? "true" : "false"); ++ } ++ pr_out_array_start(ctx->dl, "field"); ++ pr_out_dpipe_fields(ctx, header->fields, ++ header->fields_count); ++ pr_out_array_end(ctx->dl); ++ pr_out_handle_end(ctx->dl); + } + +-int main(int argc, char **argv) ++static void pr_out_dpipe_headers(struct dpipe_ctx *ctx, ++ struct nlattr **tb) + { +- static const struct option long_options[] = { +- { "Version", no_argument, NULL, 'V' }, +- { "no-nice-names", no_argument, NULL, 'n' }, +- { "json", no_argument, NULL, 'j' }, +- { "pretty", no_argument, NULL, 'p' }, +- { NULL, 0, NULL, 0 } +- }; +- struct dl *dl; +- int opt; ++ struct dpipe_header *header; ++ ++ list_for_each_entry(header, &ctx->local_headers, list) ++ pr_out_dpipe_header(ctx, tb, header, false); ++ ++ list_for_each_entry(header, &ctx->global_headers, list) ++ pr_out_dpipe_header(ctx, tb, header, true); ++} ++ ++static int dpipe_header_field_get(struct nlattr *nl, struct dpipe_field *field) ++{ ++ struct nlattr *nla_field[DEVLINK_ATTR_MAX + 1] = {}; ++ const char *name; + int err; +- int ret; + +- dl = dl_alloc(); +- if (!dl) { +- pr_err("Failed to allocate memory for devlink\n"); +- return EXIT_FAILURE; ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_field); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ if (!nla_field[DEVLINK_ATTR_DPIPE_FIELD_ID] || ++ !nla_field[DEVLINK_ATTR_DPIPE_FIELD_NAME] || ++ !nla_field[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] || ++ !nla_field[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE]) ++ return -EINVAL; ++ ++ name = mnl_attr_get_str(nla_field[DEVLINK_ATTR_DPIPE_FIELD_NAME]); ++ field->id = mnl_attr_get_u32(nla_field[DEVLINK_ATTR_DPIPE_FIELD_ID]); ++ field->bitwidth = mnl_attr_get_u32(nla_field[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH]); ++ field->name = strdup(name); ++ if (!field->name) ++ return -ENOMEM; ++ field->mapping_type = mnl_attr_get_u32(nla_field[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE]); ++ return 0; ++} ++ ++static int dpipe_header_fields_get(struct nlattr *nla_fields, ++ struct dpipe_field *fields) ++{ ++ struct nlattr *nla_field; ++ int count = 0; ++ int err; ++ ++ mnl_attr_for_each_nested(nla_field, nla_fields) { ++ err = dpipe_header_field_get(nla_field, &fields[count]); ++ if (err) ++ return err; ++ count++; + } ++ return 0; ++} + +- while ((opt = getopt_long(argc, argv, "Vnjp", +- long_options, NULL)) >= 0) { ++static unsigned int dpipe_header_field_count_get(struct nlattr *nla_fields) ++{ ++ struct nlattr *nla_field; ++ unsigned int count = 0; + +- switch (opt) { +- case 'V': +- printf("devlink utility, iproute2-ss%s\n", SNAPSHOT); +- ret = EXIT_SUCCESS; +- goto dl_free; +- case 'n': +- dl->no_nice_names = true; +- break; +- case 'j': +- dl->json_output = true; +- break; +- case 'p': +- dl->pretty_output = true; ++ mnl_attr_for_each_nested(nla_field, nla_fields) ++ count++; ++ return count; ++} ++ ++static int dpipe_header_get(struct dpipe_ctx *ctx, struct nlattr *nl) ++{ ++ struct nlattr *nla_header[DEVLINK_ATTR_MAX + 1] = {}; ++ struct dpipe_header *header; ++ unsigned int fields_count; ++ const char *header_name; ++ bool global; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_header); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_header[DEVLINK_ATTR_DPIPE_HEADER_NAME] || ++ !nla_header[DEVLINK_ATTR_DPIPE_HEADER_ID] || ++ !nla_header[DEVLINK_ATTR_DPIPE_HEADER_FIELDS]) ++ return -EINVAL; ++ ++ fields_count = dpipe_header_field_count_get(nla_header[DEVLINK_ATTR_DPIPE_HEADER_FIELDS]); ++ header = dpipe_header_alloc(fields_count); ++ if (!header) ++ return -ENOMEM; ++ ++ header_name = mnl_attr_get_str(nla_header[DEVLINK_ATTR_DPIPE_HEADER_NAME]); ++ header->name = strdup(header_name); ++ header->id = mnl_attr_get_u32(nla_header[DEVLINK_ATTR_DPIPE_HEADER_ID]); ++ header->fields_count = fields_count; ++ global = !!mnl_attr_get_u8(nla_header[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL]); ++ ++ err = dpipe_header_fields_get(nla_header[DEVLINK_ATTR_DPIPE_HEADER_FIELDS], ++ header->fields); ++ if (err) ++ goto err_field_get; ++ dpipe_header_add(ctx, header, global); ++ return 0; ++ ++err_field_get: ++ dpipe_header_free(header); ++ return err; ++} ++ ++static int dpipe_headers_get(struct dpipe_ctx *ctx, struct nlattr **tb) ++{ ++ struct nlattr *nla_headers = tb[DEVLINK_ATTR_DPIPE_HEADERS]; ++ struct nlattr *nla_header; ++ int err; ++ ++ mnl_attr_for_each_nested(nla_header, nla_headers) { ++ err = dpipe_header_get(ctx, nla_header); ++ if (err) ++ return err; ++ } ++ return 0; ++} ++ ++static int cmd_dpipe_header_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct dpipe_ctx *ctx = data; ++ struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; ++ struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); ++ int err; ++ ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_DPIPE_HEADERS]) ++ return MNL_CB_ERROR; ++ err = dpipe_headers_get(ctx, tb); ++ if (err) { ++ ctx->err = err; ++ return MNL_CB_ERROR; ++ } ++ ++ if (ctx->print_headers) ++ pr_out_dpipe_headers(ctx, tb); ++ return MNL_CB_OK; ++} ++ ++static int cmd_dpipe_headers_show(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ struct dpipe_ctx *ctx; ++ uint16_t flags = NLM_F_REQUEST | NLM_F_ACK; ++ int err; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_HEADERS_GET, flags); ++ ++ err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0); ++ if (err) ++ return err; ++ ++ ctx = dpipe_ctx_alloc(dl); ++ if (!ctx) ++ return -ENOMEM; ++ ++ ctx->print_headers = true; ++ ++ pr_out_section_start(dl, "header"); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_header_cb, ctx); ++ if (err) ++ pr_err("error get headers %s\n", strerror(ctx->err)); ++ pr_out_section_end(dl); ++ ++ dpipe_ctx_clear(ctx); ++ dpipe_ctx_free(ctx); ++ return err; ++} ++ ++static void cmd_dpipe_header_help(void) ++{ ++ pr_err("Usage: devlink dpipe headers show DEV\n"); ++} ++ ++static int cmd_dpipe_header(struct dl *dl) ++{ ++ if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { ++ cmd_dpipe_header_help(); ++ return 0; ++ } else if (dl_argv_match(dl, "show")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe_headers_show(dl); ++ } ++ pr_err("Command \"%s\" not found\n", dl_argv(dl)); ++ return -ENOENT; ++} ++ ++static const char ++*dpipe_action_type_e2s(enum devlink_dpipe_action_type action_type) ++{ ++ switch (action_type) { ++ case DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY: ++ return "field_modify"; ++ default: ++ return ""; ++ } ++} ++ ++static void pr_out_dpipe_action(struct dpipe_ctx *ctx, ++ uint32_t header_id, uint32_t field_id, ++ uint32_t action_type, bool global) ++{ ++ const char *mapping; ++ ++ pr_out_str(ctx->dl, "type", dpipe_action_type_e2s(action_type)); ++ pr_out_str(ctx->dl, "header", dpipe_header_id2s(ctx, header_id, ++ global)); ++ pr_out_str(ctx->dl, "field", dpipe_field_id2s(ctx, header_id, field_id, ++ global)); ++ mapping = dpipe_mapping_get(ctx, header_id, field_id, global); ++ if (mapping) ++ pr_out_str(ctx->dl, "mapping", mapping); ++} ++ ++static int dpipe_action_show(struct dpipe_ctx *ctx, struct nlattr *nl) ++{ ++ struct nlattr *nla_action[DEVLINK_ATTR_MAX + 1] = {}; ++ uint32_t header_id, field_id, action_type; ++ bool global; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_action); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_action[DEVLINK_ATTR_DPIPE_ACTION_TYPE] || ++ !nla_action[DEVLINK_ATTR_DPIPE_HEADER_INDEX] || ++ !nla_action[DEVLINK_ATTR_DPIPE_HEADER_ID] || ++ !nla_action[DEVLINK_ATTR_DPIPE_FIELD_ID]) { ++ return -EINVAL; ++ } ++ ++ header_id = mnl_attr_get_u32(nla_action[DEVLINK_ATTR_DPIPE_HEADER_ID]); ++ field_id = mnl_attr_get_u32(nla_action[DEVLINK_ATTR_DPIPE_FIELD_ID]); ++ action_type = mnl_attr_get_u32(nla_action[DEVLINK_ATTR_DPIPE_ACTION_TYPE]); ++ global = !!mnl_attr_get_u8(nla_action[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL]); ++ ++ pr_out_dpipe_action(ctx, header_id, field_id, action_type, global); ++ return 0; ++} ++ ++static int dpipe_table_actions_show(struct dpipe_ctx *ctx, ++ struct nlattr *nla_actions) ++{ ++ struct nlattr *nla_action; ++ ++ mnl_attr_for_each_nested(nla_action, nla_actions) { ++ pr_out_entry_start(ctx->dl); ++ if (dpipe_action_show(ctx, nla_action)) ++ goto err_action_show; ++ pr_out_entry_end(ctx->dl); ++ } ++ return 0; ++ ++err_action_show: ++ pr_out_entry_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static const char * ++dpipe_match_type_e2s(enum devlink_dpipe_match_type match_type) ++{ ++ switch (match_type) { ++ case DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT: ++ return "field_exact"; ++ default: ++ return ""; ++ } ++} ++ ++static void pr_out_dpipe_match(struct dpipe_ctx *ctx, ++ uint32_t header_id, uint32_t field_id, ++ uint32_t match_type, bool global) ++{ ++ const char *mapping; ++ ++ pr_out_str(ctx->dl, "type", dpipe_match_type_e2s(match_type)); ++ pr_out_str(ctx->dl, "header", dpipe_header_id2s(ctx, header_id, ++ global)); ++ pr_out_str(ctx->dl, "field", dpipe_field_id2s(ctx, header_id, field_id, ++ global)); ++ mapping = dpipe_mapping_get(ctx, header_id, field_id, global); ++ if (mapping) ++ pr_out_str(ctx->dl, "mapping", mapping); ++ ++} ++ ++static int dpipe_match_show(struct dpipe_ctx *ctx, struct nlattr *nl) ++{ ++ struct nlattr *nla_match[DEVLINK_ATTR_MAX + 1] = {}; ++ uint32_t header_id, field_id, match_type; ++ bool global; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_match); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_match[DEVLINK_ATTR_DPIPE_MATCH_TYPE] || ++ !nla_match[DEVLINK_ATTR_DPIPE_HEADER_INDEX] || ++ !nla_match[DEVLINK_ATTR_DPIPE_HEADER_ID] || ++ !nla_match[DEVLINK_ATTR_DPIPE_FIELD_ID]) { ++ return -EINVAL; ++ } ++ ++ match_type = mnl_attr_get_u32(nla_match[DEVLINK_ATTR_DPIPE_MATCH_TYPE]); ++ header_id = mnl_attr_get_u32(nla_match[DEVLINK_ATTR_DPIPE_HEADER_ID]); ++ field_id = mnl_attr_get_u32(nla_match[DEVLINK_ATTR_DPIPE_FIELD_ID]); ++ global = !!mnl_attr_get_u8(nla_match[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL]); ++ ++ pr_out_dpipe_match(ctx, header_id, field_id, match_type, global); ++ return 0; ++} ++ ++static int dpipe_table_matches_show(struct dpipe_ctx *ctx, ++ struct nlattr *nla_matches) ++{ ++ struct nlattr *nla_match; ++ ++ mnl_attr_for_each_nested(nla_match, nla_matches) { ++ pr_out_entry_start(ctx->dl); ++ if (dpipe_match_show(ctx, nla_match)) ++ goto err_match_show; ++ pr_out_entry_end(ctx->dl); ++ } ++ return 0; ++ ++err_match_show: ++ pr_out_entry_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int dpipe_table_show(struct dpipe_ctx *ctx, struct nlattr *nl) ++{ ++ struct nlattr *nla_table[DEVLINK_ATTR_MAX + 1] = {}; ++ bool counters_enabled; ++ const char *name; ++ uint32_t size; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_table); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_table[DEVLINK_ATTR_DPIPE_TABLE_NAME] || ++ !nla_table[DEVLINK_ATTR_DPIPE_TABLE_SIZE] || ++ !nla_table[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] || ++ !nla_table[DEVLINK_ATTR_DPIPE_TABLE_MATCHES] || ++ !nla_table[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED]) { ++ return -EINVAL; ++ } ++ ++ name = mnl_attr_get_str(nla_table[DEVLINK_ATTR_DPIPE_TABLE_NAME]); ++ size = mnl_attr_get_u32(nla_table[DEVLINK_ATTR_DPIPE_TABLE_SIZE]); ++ counters_enabled = !!mnl_attr_get_u8(nla_table[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED]); ++ ++ pr_out_str(ctx->dl, "name", name); ++ pr_out_uint(ctx->dl, "size", size); ++ pr_out_str(ctx->dl, "counters_enabled", ++ counters_enabled ? "true" : "false"); ++ ++ pr_out_array_start(ctx->dl, "match"); ++ if (dpipe_table_matches_show(ctx, nla_table[DEVLINK_ATTR_DPIPE_TABLE_MATCHES])) ++ goto err_matches_show; ++ pr_out_array_end(ctx->dl); ++ ++ pr_out_array_start(ctx->dl, "action"); ++ if (dpipe_table_actions_show(ctx, nla_table[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS])) ++ goto err_actions_show; ++ pr_out_array_end(ctx->dl); ++ ++ return 0; ++ ++err_actions_show: ++err_matches_show: ++ pr_out_array_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int dpipe_tables_show(struct dpipe_ctx *ctx, struct nlattr **tb) ++{ ++ struct nlattr *nla_tables = tb[DEVLINK_ATTR_DPIPE_TABLES]; ++ struct nlattr *nla_table; ++ ++ mnl_attr_for_each_nested(nla_table, nla_tables) { ++ pr_out_handle_start_arr(ctx->dl, tb); ++ if (dpipe_table_show(ctx, nla_table)) ++ goto err_table_show; ++ pr_out_handle_end(ctx->dl); ++ } ++ return 0; ++ ++err_table_show: ++ pr_out_handle_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int cmd_dpipe_table_show_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct dpipe_ctx *ctx = data; ++ struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; ++ struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); ++ ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_DPIPE_TABLES]) ++ return MNL_CB_ERROR; ++ ++ if (dpipe_tables_show(ctx, tb)) ++ return MNL_CB_ERROR; ++ return MNL_CB_OK; ++} ++ ++static int cmd_dpipe_table_show(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ struct dpipe_ctx *ctx; ++ uint16_t flags = NLM_F_REQUEST; ++ int err; ++ ++ ctx = dpipe_ctx_alloc(dl); ++ if (!ctx) ++ return -ENOMEM; ++ ++ err = dl_argv_parse(dl, DL_OPT_HANDLE, DL_OPT_DPIPE_TABLE_NAME); ++ if (err) ++ goto out; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_HEADERS_GET, flags); ++ dl_opts_put(nlh, dl); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_header_cb, ctx); ++ if (err) { ++ pr_err("error get headers %s\n", strerror(ctx->err)); ++ goto out; ++ } ++ ++ flags = NLM_F_REQUEST | NLM_F_ACK; ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_TABLE_GET, flags); ++ dl_opts_put(nlh, dl); ++ ++ pr_out_section_start(dl, "table"); ++ _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_table_show_cb, ctx); ++ pr_out_section_end(dl); ++out: ++ dpipe_ctx_clear(ctx); ++ dpipe_ctx_free(ctx); ++ return err; ++} ++ ++static int cmd_dpipe_table_set(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ int err; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, ++ NLM_F_REQUEST | NLM_F_ACK); ++ ++ err = dl_argv_parse_put(nlh, dl, ++ DL_OPT_HANDLE | DL_OPT_DPIPE_TABLE_NAME | ++ DL_OPT_DPIPE_TABLE_COUNTERS, 0); ++ if (err) ++ return err; ++ ++ return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL); ++} ++ ++static int dpipe_entry_value_show(struct dpipe_ctx *ctx, ++ struct nlattr **nla_match_value) ++{ ++ uint16_t value_len; ++ bool mask, mapping; ++ ++ mask = !!nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MASK]; ++ mapping = !!nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MAPPING]; ++ ++ value_len = mnl_attr_get_payload_len(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE]); ++ if (value_len == sizeof(uint32_t)) { ++ uint32_t value, value_mask, value_mapping; ++ ++ if (mapping) { ++ value_mapping = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MAPPING]); ++ pr_out_uint(ctx->dl, "mapping_value", value_mapping); ++ } ++ ++ if (mask) { ++ value_mask = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MASK]); ++ pr_out_uint(ctx->dl, "mask_value", value_mask); ++ } ++ ++ value = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE]); ++ pr_out_uint(ctx->dl, "value", value); ++ ++ } else { ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int dpipe_entry_match_value_show(struct dpipe_ctx *ctx, ++ struct nlattr *nl) ++{ ++ struct nlattr *nla_match_value[DEVLINK_ATTR_MAX + 1] = {}; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_match_value); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_match_value[DEVLINK_ATTR_DPIPE_MATCH] || ++ !nla_match_value[DEVLINK_ATTR_DPIPE_VALUE]) { ++ return -EINVAL; ++ } ++ ++ pr_out_entry_start(ctx->dl); ++ if (dpipe_match_show(ctx, nla_match_value[DEVLINK_ATTR_DPIPE_MATCH])) ++ goto err_match_show; ++ if (dpipe_entry_value_show(ctx, nla_match_value)) ++ goto err_value_show; ++ pr_out_entry_end(ctx->dl); ++ ++ return 0; ++ ++err_match_show: ++err_value_show: ++ pr_out_entry_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int dpipe_entry_action_value_show(struct dpipe_ctx *ctx, ++ struct nlattr *nl) ++{ ++ struct nlattr *nla_action_value[DEVLINK_ATTR_MAX + 1] = {}; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_action_value); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_action_value[DEVLINK_ATTR_DPIPE_ACTION] || ++ !nla_action_value[DEVLINK_ATTR_DPIPE_VALUE]) { ++ return -EINVAL; ++ } ++ ++ pr_out_entry_start(ctx->dl); ++ if (dpipe_action_show(ctx, nla_action_value[DEVLINK_ATTR_DPIPE_ACTION])) ++ goto err_action_show; ++ if (dpipe_entry_value_show(ctx, nla_action_value)) ++ goto err_value_show; ++ pr_out_entry_end(ctx->dl); ++ ++ return 0; ++ ++err_action_show: ++err_value_show: ++ pr_out_entry_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int ++dpipe_tables_action_values_show(struct dpipe_ctx *ctx, ++ struct nlattr *nla_action_values) ++{ ++ struct nlattr *nla_action_value; ++ ++ mnl_attr_for_each_nested(nla_action_value, nla_action_values) { ++ if (dpipe_entry_action_value_show(ctx, nla_action_value)) ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static int ++dpipe_tables_match_values_show(struct dpipe_ctx *ctx, ++ struct nlattr *nla_match_values) ++{ ++ struct nlattr *nla_match_value; ++ ++ mnl_attr_for_each_nested(nla_match_value, nla_match_values) { ++ if (dpipe_entry_match_value_show(ctx, nla_match_value)) ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static int dpipe_entry_show(struct dpipe_ctx *ctx, struct nlattr *nl) ++{ ++ struct nlattr *nla_entry[DEVLINK_ATTR_MAX + 1] = {}; ++ uint32_t entry_index; ++ uint64_t counter; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_entry); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_INDEX] || ++ !nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] || ++ !nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES]) { ++ return -EINVAL; ++ } ++ ++ entry_index = mnl_attr_get_u32(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_INDEX]); ++ pr_out_uint(ctx->dl, "index", entry_index); ++ ++ if (nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]) { ++ counter = mnl_attr_get_u64(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]); ++ pr_out_uint(ctx->dl, "counter", counter); ++ } ++ ++ pr_out_array_start(ctx->dl, "match_value"); ++ if (dpipe_tables_match_values_show(ctx, ++ nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES])) ++ goto err_match_values_show; ++ pr_out_array_end(ctx->dl); ++ ++ pr_out_array_start(ctx->dl, "action_value"); ++ if (dpipe_tables_action_values_show(ctx, ++ nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES])) ++ goto err_action_values_show; ++ pr_out_array_end(ctx->dl); ++ return 0; ++ ++err_action_values_show: ++err_match_values_show: ++ pr_out_array_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int dpipe_table_entries_show(struct dpipe_ctx *ctx, struct nlattr **tb) ++{ ++ struct nlattr *nla_entries = tb[DEVLINK_ATTR_DPIPE_ENTRIES]; ++ struct nlattr *nla_entry; ++ ++ mnl_attr_for_each_nested(nla_entry, nla_entries) { ++ pr_out_handle_start_arr(ctx->dl, tb); ++ if (dpipe_entry_show(ctx, nla_entry)) ++ goto err_entry_show; ++ pr_out_handle_end(ctx->dl); ++ } ++ return 0; ++ ++err_entry_show: ++ pr_out_handle_end(ctx->dl); ++ return -EINVAL; ++} ++ ++static int cmd_dpipe_table_entry_dump_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct dpipe_ctx *ctx = data; ++ struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; ++ struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); ++ ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_DPIPE_ENTRIES]) ++ return MNL_CB_ERROR; ++ ++ if (dpipe_table_entries_show(ctx, tb)) ++ return MNL_CB_ERROR; ++ return MNL_CB_OK; ++} ++ ++static int cmd_dpipe_table_dump(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ struct dpipe_ctx *ctx; ++ uint16_t flags = NLM_F_REQUEST; ++ int err; ++ ++ ctx = dpipe_ctx_alloc(dl); ++ if (!ctx) ++ return -ENOMEM; ++ ++ err = dl_argv_parse(dl, DL_OPT_HANDLE | DL_OPT_DPIPE_TABLE_NAME, 0); ++ if (err) ++ goto out; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_HEADERS_GET, flags); ++ dl_opts_put(nlh, dl); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_header_cb, ctx); ++ if (err) { ++ pr_err("error get headers %s\n", strerror(ctx->err)); ++ goto out; ++ } ++ ++ flags = NLM_F_REQUEST | NLM_F_ACK; ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_DPIPE_ENTRIES_GET, flags); ++ dl_opts_put(nlh, dl); ++ ++ pr_out_section_start(dl, "table_entry"); ++ _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dpipe_table_entry_dump_cb, ctx); ++ pr_out_section_end(dl); ++out: ++ dpipe_ctx_clear(ctx); ++ dpipe_ctx_free(ctx); ++ return err; ++} ++ ++static void cmd_dpipe_table_help(void) ++{ ++ pr_err("Usage: devlink dpipe table [ OBJECT-LIST ]\n" ++ "where OBJECT-LIST := { show | set | dump }\n"); ++} ++ ++static int cmd_dpipe_table(struct dl *dl) ++{ ++ if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { ++ cmd_dpipe_table_help(); ++ return 0; ++ } else if (dl_argv_match(dl, "show")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe_table_show(dl); ++ } else if (dl_argv_match(dl, "set")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe_table_set(dl); ++ } else if (dl_argv_match(dl, "dump")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe_table_dump(dl); ++ } ++ pr_err("Command \"%s\" not found\n", dl_argv(dl)); ++ return -ENOENT; ++} ++ ++static void cmd_dpipe_help(void) ++{ ++ pr_err("Usage: devlink dpipe [ OBJECT-LIST ]\n" ++ "where OBJECT-LIST := { header | table }\n"); ++} ++ ++static int cmd_dpipe(struct dl *dl) ++{ ++ if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { ++ cmd_dpipe_help(); ++ return 0; ++ } else if (dl_argv_match(dl, "header")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe_header(dl); ++ } else if (dl_argv_match(dl, "table")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe_table(dl); ++ } ++ pr_err("Command \"%s\" not found\n", dl_argv(dl)); ++ return -ENOENT; ++} ++ ++static void help(void) ++{ ++ pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n" ++ "where OBJECT := { dev | port | sb | monitor | dpipe }\n" ++ " OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] | -v[verbose] }\n"); ++} ++ ++static int dl_cmd(struct dl *dl) ++{ ++ if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { ++ help(); ++ return 0; ++ } else if (dl_argv_match(dl, "dev")) { ++ dl_arg_inc(dl); ++ return cmd_dev(dl); ++ } else if (dl_argv_match(dl, "port")) { ++ dl_arg_inc(dl); ++ return cmd_port(dl); ++ } else if (dl_argv_match(dl, "sb")) { ++ dl_arg_inc(dl); ++ return cmd_sb(dl); ++ } else if (dl_argv_match(dl, "monitor")) { ++ dl_arg_inc(dl); ++ return cmd_mon(dl); ++ } else if (dl_argv_match(dl, "dpipe")) { ++ dl_arg_inc(dl); ++ return cmd_dpipe(dl); ++ } ++ pr_err("Object \"%s\" not found\n", dl_argv(dl)); ++ return -ENOENT; ++} ++ ++static int dl_init(struct dl *dl, int argc, char **argv) ++{ ++ int err; ++ ++ dl->argc = argc; ++ dl->argv = argv; ++ ++ dl->nlg = mnlg_socket_open(DEVLINK_GENL_NAME, DEVLINK_GENL_VERSION); ++ if (!dl->nlg) { ++ pr_err("Failed to connect to devlink Netlink\n"); ++ return -errno; ++ } ++ ++ err = ifname_map_init(dl); ++ if (err) { ++ pr_err("Failed to create index map\n"); ++ goto err_ifname_map_create; ++ } ++ if (dl->json_output) { ++ dl->jw = jsonw_new(stdout); ++ if (!dl->jw) { ++ pr_err("Failed to create JSON writer\n"); ++ goto err_json_new; ++ } ++ jsonw_pretty(dl->jw, dl->pretty_output); ++ } ++ return 0; ++ ++err_json_new: ++ ifname_map_fini(dl); ++err_ifname_map_create: ++ mnlg_socket_close(dl->nlg); ++ return err; ++} ++ ++static void dl_fini(struct dl *dl) ++{ ++ if (dl->json_output) ++ jsonw_destroy(&dl->jw); ++ ifname_map_fini(dl); ++ mnlg_socket_close(dl->nlg); ++} ++ ++static struct dl *dl_alloc(void) ++{ ++ struct dl *dl; ++ ++ dl = calloc(1, sizeof(*dl)); ++ if (!dl) ++ return NULL; ++ return dl; ++} ++ ++static void dl_free(struct dl *dl) ++{ ++ free(dl); ++} ++ ++int main(int argc, char **argv) ++{ ++ static const struct option long_options[] = { ++ { "Version", no_argument, NULL, 'V' }, ++ { "no-nice-names", no_argument, NULL, 'n' }, ++ { "json", no_argument, NULL, 'j' }, ++ { "pretty", no_argument, NULL, 'p' }, ++ { "verbose", no_argument, NULL, 'v' }, ++ { NULL, 0, NULL, 0 } ++ }; ++ struct dl *dl; ++ int opt; ++ int err; ++ int ret; ++ ++ dl = dl_alloc(); ++ if (!dl) { ++ pr_err("Failed to allocate memory for devlink\n"); ++ return EXIT_FAILURE; ++ } ++ ++ while ((opt = getopt_long(argc, argv, "Vnjpv", ++ long_options, NULL)) >= 0) { ++ ++ switch (opt) { ++ case 'V': ++ printf("devlink utility, iproute2-ss%s\n", SNAPSHOT); ++ ret = EXIT_SUCCESS; ++ goto dl_free; ++ case 'n': ++ dl->no_nice_names = true; ++ break; ++ case 'j': ++ dl->json_output = true; ++ break; ++ case 'p': ++ dl->pretty_output = true; ++ break; ++ case 'v': ++ dl->verbose = true; + break; + default: + pr_err("Unknown option.\n"); +-- +1.8.3.1 + diff --git a/SOURCES/0027-tc-Reflect-HW-offload-status.patch b/SOURCES/0027-tc-Reflect-HW-offload-status.patch new file mode 100644 index 0000000..5a21a4d --- /dev/null +++ b/SOURCES/0027-tc-Reflect-HW-offload-status.patch @@ -0,0 +1,104 @@ +From 724d67b36f9e6bbbfac88b29fee019c05284a888 Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + Reviewed-by: Jiri Pirko + Reviewed-by: Simon Horman + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0028-pedit-Fix-a-typo-in-warning.patch b/SOURCES/0028-pedit-Fix-a-typo-in-warning.patch new file mode 100644 index 0000000..e19cd7d --- /dev/null +++ b/SOURCES/0028-pedit-Fix-a-typo-in-warning.patch @@ -0,0 +1,39 @@ +From b2e49d92325d876d29e2d4f1a83bd86adfc4bc73 Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch b/SOURCES/0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch new file mode 100644 index 0000000..8a3d95b --- /dev/null +++ b/SOURCES/0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch @@ -0,0 +1,58 @@ +From 2bf855b076bbe5aa4665f7efd8bcaf882821cab5 Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0030-pedit-Check-for-extended-capability-in-protocol-pars.patch b/SOURCES/0030-pedit-Check-for-extended-capability-in-protocol-pars.patch new file mode 100644 index 0000000..81a89ce --- /dev/null +++ b/SOURCES/0030-pedit-Check-for-extended-capability-in-protocol-pars.patch @@ -0,0 +1,55 @@ +From 0bc6d74ce3291b669bc05524b404bc6914dab5ba Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0031-pedit-Introduce-ipv6-support.patch b/SOURCES/0031-pedit-Introduce-ipv6-support.patch new file mode 100644 index 0000000..aacdc14 --- /dev/null +++ b/SOURCES/0031-pedit-Introduce-ipv6-support.patch @@ -0,0 +1,304 @@ +From 26ab66d7c43c3ef60ab058d4c3da8989a5c1dd46 Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + +Signed-off-by: Kamal Heib +--- + 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 ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#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 + diff --git a/SOURCES/0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch b/SOURCES/0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch new file mode 100644 index 0000000..00d638f --- /dev/null +++ b/SOURCES/0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch @@ -0,0 +1,189 @@ +From d9857ffec0266aea1c56ee26369972ade68f501a Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + Reviewed-by: Jiri Pirko + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0033-tc-flower-add-support-for-tcp-flags.patch b/SOURCES/0033-tc-flower-add-support-for-tcp-flags.patch new file mode 100644 index 0000000..333ce11 --- /dev/null +++ b/SOURCES/0033-tc-flower-add-support-for-tcp-flags.patch @@ -0,0 +1,154 @@ +From 7cbf364a5f68ba008c5e0702266fe3dc606b1d6f Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0034-iplink-Update-usage-in-help-message.patch b/SOURCES/0034-iplink-Update-usage-in-help-message.patch new file mode 100644 index 0000000..63422a8 --- /dev/null +++ b/SOURCES/0034-iplink-Update-usage-in-help-message.patch @@ -0,0 +1,60 @@ +From 41b38afb79a82eec66fea08fc021a35cf1d550fc Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + Signed-off-by: Tariq Toukan + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch b/SOURCES/0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch new file mode 100644 index 0000000..7aef8b0 --- /dev/null +++ b/SOURCES/0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch @@ -0,0 +1,177 @@ +From f8e5b20689cdc1f488140d9da4adf6f3ca421d3f Mon Sep 17 00:00:00 2001 +From: Kamal Heib +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 +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 + Reviewed-by: Jiri Pirko + +Signed-off-by: Kamal Heib +--- + 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 + diff --git a/SOURCES/0036-iproute-build-more-easily-on-Android.patch b/SOURCES/0036-iproute-build-more-easily-on-Android.patch new file mode 100644 index 0000000..29c0186 --- /dev/null +++ b/SOURCES/0036-iproute-build-more-easily-on-Android.patch @@ -0,0 +1,33934 @@ +From 9b0d1f60b01ac442ee3ec15c47c99d3756938034 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Mon, 13 Nov 2017 18:09:56 +0100 +Subject: [PATCH] iproute: build more easily on Android + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1472759 +Upstream Status: iproute2.git commit 596b1c94aa38e + +commit 596b1c94aa38e21b7a8c8562e8b61ccb744255d2 +Author: Lorenzo Colitti +Date: Tue Oct 3 02:03:37 2017 +0900 + + iproute: build more easily on Android + + iproute2 contains a bunch of kernel headers, including uapi ones. + Android's libc uses uapi headers almost directly, and uses a + script to fix kernel types that don't match what userspace + expects. + + For example: https://issuetracker.google.com/36987220 reports + that our struct ip_mreq_source contains "__be32 imr_multiaddr" + rather than "struct in_addr imr_multiaddr". The script addresses + this by replacing the uapi struct definition with a #include + which contains the traditional userspace + definition. + + Unfortunately, when we compile iproute2, this definition + conflicts with the one in iproute2's linux/in.h. + + Historically we've just solved this problem by running "git rm" + on all the iproute2 include/linux headers that break Android's + libc. However, deleting the files in this way makes it harder to + keep up with upstream, because every upstream change to + an include file causes a merge conflict with the delete. + + This patch fixes the problem by moving the iproute2 linux headers + from include/linux to include/uapi/linux. + + Tested: compiles on ubuntu trusty (glibc) + + Signed-off-by: Elliott Hughes + Signed-off-by: Lorenzo Colitti +--- + Makefile | 2 +- + include/linux/atm.h | 241 ------ + include/linux/atmapi.h | 29 - + include/linux/atmarp.h | 41 - + include/linux/atmdev.h | 215 ----- + include/linux/atmioc.h | 41 - + include/linux/atmsap.h | 162 ---- + include/linux/bpf.h | 867 ------------------- + include/linux/bpf_common.h | 55 -- + include/linux/can.h | 201 ----- + include/linux/can/netlink.h | 142 ---- + include/linux/can/vxcan.h | 12 - + include/linux/devlink.h | 247 ------ + include/linux/elf-em.h | 60 -- + include/linux/fib_rules.h | 80 -- + include/linux/filter.h | 89 -- + include/linux/fou.h | 41 - + include/linux/gen_stats.h | 79 -- + include/linux/genetlink.h | 88 -- + include/linux/hdlc/ioctl.h | 84 -- + include/linux/icmpv6.h | 166 ---- + include/linux/if.h | 292 ------- + include/linux/if_addr.h | 67 -- + include/linux/if_addrlabel.h | 32 - + include/linux/if_alg.h | 42 - + include/linux/if_arp.h | 163 ---- + include/linux/if_bonding.h | 130 --- + include/linux/if_bridge.h | 294 ------- + include/linux/if_ether.h | 158 ---- + include/linux/if_link.h | 928 -------------------- + include/linux/if_macsec.h | 171 ---- + include/linux/if_packet.h | 302 ------- + include/linux/if_tun.h | 107 --- + include/linux/if_tunnel.h | 158 ---- + include/linux/if_vlan.h | 64 -- + include/linux/ife.h | 18 - + include/linux/ila.h | 45 - + include/linux/in.h | 300 ------- + include/linux/in6.h | 296 ------- + include/linux/in_route.h | 32 - + include/linux/inet_diag.h | 196 ----- + include/linux/ip.h | 175 ---- + include/linux/ip6_tunnel.h | 53 -- + include/linux/ipsec.h | 47 - + include/linux/kernel.h | 14 - + include/linux/l2tp.h | 199 ----- + include/linux/libc-compat.h | 213 ----- + include/linux/limits.h | 20 - + include/linux/lwtunnel.h | 70 -- + include/linux/magic.h | 91 -- + include/linux/mpls.h | 76 -- + include/linux/mpls_iptunnel.h | 30 - + include/linux/neighbour.h | 171 ---- + include/linux/net_namespace.h | 23 - + include/linux/netconf.h | 28 - + include/linux/netdevice.h | 65 -- + include/linux/netfilter.h | 77 -- + include/linux/netfilter/ipset/ip_set.h | 304 ------- + include/linux/netfilter/x_tables.h | 185 ---- + include/linux/netfilter/xt_set.h | 93 -- + include/linux/netfilter/xt_tcpudp.h | 36 - + include/linux/netfilter_ipv4.h | 79 -- + include/linux/netfilter_ipv4/ip_tables.h | 228 ----- + include/linux/netfilter_ipv6.h | 77 -- + include/linux/netfilter_ipv6/ip6_tables.h | 269 ------ + include/linux/netlink.h | 246 ------ + include/linux/netlink_diag.h | 64 -- + include/linux/packet_diag.h | 80 -- + include/linux/param.h | 6 - + include/linux/pfkeyv2.h | 383 --------- + include/linux/pkt_cls.h | 569 ------------- + include/linux/pkt_sched.h | 874 ------------------- + include/linux/posix_types.h | 37 - + include/linux/rtnetlink.h | 718 ---------------- + include/linux/sctp.h | 1085 ------------------------ + include/linux/seg6.h | 54 -- + include/linux/seg6_genl.h | 32 - + include/linux/seg6_hmac.h | 22 - + include/linux/seg6_iptunnel.h | 40 - + include/linux/seg6_local.h | 68 -- + include/linux/sock_diag.h | 38 - + include/linux/socket.h | 21 - + include/linux/sockios.h | 152 ---- + include/linux/stddef.h | 5 - + include/linux/sysinfo.h | 24 - + include/linux/tc_act/tc_bpf.h | 36 - + include/linux/tc_act/tc_connmark.h | 23 - + include/linux/tc_act/tc_csum.h | 34 - + include/linux/tc_act/tc_defact.h | 20 - + include/linux/tc_act/tc_gact.h | 33 - + include/linux/tc_act/tc_ife.h | 32 - + include/linux/tc_act/tc_ipt.h | 22 - + include/linux/tc_act/tc_mirred.h | 28 - + include/linux/tc_act/tc_nat.h | 28 - + include/linux/tc_act/tc_pedit.h | 66 -- + include/linux/tc_act/tc_sample.h | 26 - + include/linux/tc_act/tc_skbedit.h | 51 -- + include/linux/tc_act/tc_skbmod.h | 39 - + include/linux/tc_act/tc_tunnel_key.h | 43 - + include/linux/tc_act/tc_vlan.h | 38 - + include/linux/tc_ematch/tc_em_cmp.h | 25 - + include/linux/tc_ematch/tc_em_meta.h | 92 -- + include/linux/tc_ematch/tc_em_nbyte.h | 13 - + include/linux/tcp.h | 268 ------ + include/linux/tcp_metrics.h | 60 -- + include/linux/tipc.h | 256 ------ + include/linux/tipc_netlink.h | 294 ------- + include/linux/types.h | 47 - + include/linux/unix_diag.h | 58 -- + include/linux/veth.h | 12 - + include/linux/xfrm.h | 536 ------------ + include/uapi/linux/atm.h | 241 ++++++ + include/uapi/linux/atmapi.h | 29 + + include/uapi/linux/atmarp.h | 41 + + include/uapi/linux/atmdev.h | 215 +++++ + include/uapi/linux/atmioc.h | 41 + + include/uapi/linux/atmsap.h | 162 ++++ + include/uapi/linux/bpf.h | 867 +++++++++++++++++++ + include/uapi/linux/bpf_common.h | 55 ++ + include/uapi/linux/can.h | 201 +++++ + include/uapi/linux/can/netlink.h | 142 ++++ + include/uapi/linux/can/vxcan.h | 12 + + include/uapi/linux/devlink.h | 247 ++++++ + include/uapi/linux/elf-em.h | 60 ++ + include/uapi/linux/fib_rules.h | 80 ++ + include/uapi/linux/filter.h | 89 ++ + include/uapi/linux/fou.h | 41 + + include/uapi/linux/gen_stats.h | 79 ++ + include/uapi/linux/genetlink.h | 88 ++ + include/uapi/linux/hdlc/ioctl.h | 84 ++ + include/uapi/linux/icmpv6.h | 166 ++++ + include/uapi/linux/if.h | 292 +++++++ + include/uapi/linux/if_addr.h | 67 ++ + include/uapi/linux/if_addrlabel.h | 32 + + include/uapi/linux/if_alg.h | 42 + + include/uapi/linux/if_arp.h | 163 ++++ + include/uapi/linux/if_bonding.h | 130 +++ + include/uapi/linux/if_bridge.h | 294 +++++++ + include/uapi/linux/if_ether.h | 158 ++++ + include/uapi/linux/if_link.h | 928 ++++++++++++++++++++ + include/uapi/linux/if_macsec.h | 171 ++++ + include/uapi/linux/if_packet.h | 302 +++++++ + include/uapi/linux/if_tun.h | 107 +++ + include/uapi/linux/if_tunnel.h | 158 ++++ + include/uapi/linux/if_vlan.h | 64 ++ + include/uapi/linux/ife.h | 18 + + include/uapi/linux/ila.h | 45 + + include/uapi/linux/in.h | 300 +++++++ + include/uapi/linux/in6.h | 296 +++++++ + include/uapi/linux/in_route.h | 32 + + include/uapi/linux/inet_diag.h | 196 +++++ + include/uapi/linux/ip.h | 175 ++++ + include/uapi/linux/ip6_tunnel.h | 53 ++ + include/uapi/linux/ipsec.h | 47 + + include/uapi/linux/kernel.h | 14 + + include/uapi/linux/l2tp.h | 199 +++++ + include/uapi/linux/libc-compat.h | 213 +++++ + include/uapi/linux/limits.h | 20 + + include/uapi/linux/lwtunnel.h | 70 ++ + include/uapi/linux/magic.h | 91 ++ + include/uapi/linux/mpls.h | 76 ++ + include/uapi/linux/mpls_iptunnel.h | 30 + + include/uapi/linux/neighbour.h | 171 ++++ + include/uapi/linux/net_namespace.h | 23 + + include/uapi/linux/netconf.h | 28 + + include/uapi/linux/netdevice.h | 65 ++ + include/uapi/linux/netfilter.h | 77 ++ + include/uapi/linux/netfilter/ipset/ip_set.h | 304 +++++++ + include/uapi/linux/netfilter/x_tables.h | 185 ++++ + include/uapi/linux/netfilter/xt_set.h | 93 ++ + include/uapi/linux/netfilter/xt_tcpudp.h | 36 + + include/uapi/linux/netfilter_ipv4.h | 79 ++ + include/uapi/linux/netfilter_ipv4/ip_tables.h | 228 +++++ + include/uapi/linux/netfilter_ipv6.h | 77 ++ + include/uapi/linux/netfilter_ipv6/ip6_tables.h | 269 ++++++ + include/uapi/linux/netlink.h | 246 ++++++ + include/uapi/linux/netlink_diag.h | 64 ++ + include/uapi/linux/packet_diag.h | 80 ++ + include/uapi/linux/param.h | 6 + + include/uapi/linux/pfkeyv2.h | 383 +++++++++ + include/uapi/linux/pkt_cls.h | 569 +++++++++++++ + include/uapi/linux/pkt_sched.h | 874 +++++++++++++++++++ + include/uapi/linux/posix_types.h | 37 + + include/uapi/linux/rtnetlink.h | 718 ++++++++++++++++ + include/uapi/linux/sctp.h | 1085 ++++++++++++++++++++++++ + include/uapi/linux/seg6.h | 54 ++ + include/uapi/linux/seg6_genl.h | 32 + + include/uapi/linux/seg6_hmac.h | 22 + + include/uapi/linux/seg6_iptunnel.h | 40 + + include/uapi/linux/seg6_local.h | 68 ++ + include/uapi/linux/sock_diag.h | 38 + + include/uapi/linux/socket.h | 21 + + include/uapi/linux/sockios.h | 152 ++++ + include/uapi/linux/stddef.h | 5 + + include/uapi/linux/sysinfo.h | 24 + + include/uapi/linux/tc_act/tc_bpf.h | 36 + + include/uapi/linux/tc_act/tc_connmark.h | 23 + + include/uapi/linux/tc_act/tc_csum.h | 34 + + include/uapi/linux/tc_act/tc_defact.h | 20 + + include/uapi/linux/tc_act/tc_gact.h | 33 + + include/uapi/linux/tc_act/tc_ife.h | 32 + + include/uapi/linux/tc_act/tc_ipt.h | 22 + + include/uapi/linux/tc_act/tc_mirred.h | 28 + + include/uapi/linux/tc_act/tc_nat.h | 28 + + include/uapi/linux/tc_act/tc_pedit.h | 66 ++ + include/uapi/linux/tc_act/tc_sample.h | 26 + + include/uapi/linux/tc_act/tc_skbedit.h | 51 ++ + include/uapi/linux/tc_act/tc_skbmod.h | 39 + + include/uapi/linux/tc_act/tc_tunnel_key.h | 43 + + include/uapi/linux/tc_act/tc_vlan.h | 38 + + include/uapi/linux/tc_ematch/tc_em_cmp.h | 25 + + include/uapi/linux/tc_ematch/tc_em_meta.h | 92 ++ + include/uapi/linux/tc_ematch/tc_em_nbyte.h | 13 + + include/uapi/linux/tcp.h | 268 ++++++ + include/uapi/linux/tcp_metrics.h | 60 ++ + include/uapi/linux/tipc.h | 256 ++++++ + include/uapi/linux/tipc_netlink.h | 294 +++++++ + include/uapi/linux/types.h | 47 + + include/uapi/linux/unix_diag.h | 58 ++ + include/uapi/linux/veth.h | 12 + + include/uapi/linux/xfrm.h | 536 ++++++++++++ + 221 files changed, 16057 insertions(+), 16057 deletions(-) + delete mode 100644 include/linux/atm.h + delete mode 100644 include/linux/atmapi.h + delete mode 100644 include/linux/atmarp.h + delete mode 100644 include/linux/atmdev.h + delete mode 100644 include/linux/atmioc.h + delete mode 100644 include/linux/atmsap.h + delete mode 100644 include/linux/bpf.h + delete mode 100644 include/linux/bpf_common.h + delete mode 100644 include/linux/can.h + delete mode 100644 include/linux/can/netlink.h + delete mode 100644 include/linux/can/vxcan.h + delete mode 100644 include/linux/devlink.h + delete mode 100644 include/linux/elf-em.h + delete mode 100644 include/linux/fib_rules.h + delete mode 100644 include/linux/filter.h + delete mode 100644 include/linux/fou.h + delete mode 100644 include/linux/gen_stats.h + delete mode 100644 include/linux/genetlink.h + delete mode 100644 include/linux/hdlc/ioctl.h + delete mode 100644 include/linux/icmpv6.h + delete mode 100644 include/linux/if.h + delete mode 100644 include/linux/if_addr.h + delete mode 100644 include/linux/if_addrlabel.h + delete mode 100644 include/linux/if_alg.h + delete mode 100644 include/linux/if_arp.h + delete mode 100644 include/linux/if_bonding.h + delete mode 100644 include/linux/if_bridge.h + delete mode 100644 include/linux/if_ether.h + delete mode 100644 include/linux/if_link.h + delete mode 100644 include/linux/if_macsec.h + delete mode 100644 include/linux/if_packet.h + delete mode 100644 include/linux/if_tun.h + delete mode 100644 include/linux/if_tunnel.h + delete mode 100644 include/linux/if_vlan.h + delete mode 100644 include/linux/ife.h + delete mode 100644 include/linux/ila.h + delete mode 100644 include/linux/in.h + delete mode 100644 include/linux/in6.h + delete mode 100644 include/linux/in_route.h + delete mode 100644 include/linux/inet_diag.h + delete mode 100644 include/linux/ip.h + delete mode 100644 include/linux/ip6_tunnel.h + delete mode 100644 include/linux/ipsec.h + delete mode 100644 include/linux/kernel.h + delete mode 100644 include/linux/l2tp.h + delete mode 100644 include/linux/libc-compat.h + delete mode 100644 include/linux/limits.h + delete mode 100644 include/linux/lwtunnel.h + delete mode 100644 include/linux/magic.h + delete mode 100644 include/linux/mpls.h + delete mode 100644 include/linux/mpls_iptunnel.h + delete mode 100644 include/linux/neighbour.h + delete mode 100644 include/linux/net_namespace.h + delete mode 100644 include/linux/netconf.h + delete mode 100644 include/linux/netdevice.h + delete mode 100644 include/linux/netfilter.h + delete mode 100644 include/linux/netfilter/ipset/ip_set.h + delete mode 100644 include/linux/netfilter/x_tables.h + delete mode 100644 include/linux/netfilter/xt_set.h + delete mode 100644 include/linux/netfilter/xt_tcpudp.h + delete mode 100644 include/linux/netfilter_ipv4.h + delete mode 100644 include/linux/netfilter_ipv4/ip_tables.h + delete mode 100644 include/linux/netfilter_ipv6.h + delete mode 100644 include/linux/netfilter_ipv6/ip6_tables.h + delete mode 100644 include/linux/netlink.h + delete mode 100644 include/linux/netlink_diag.h + delete mode 100644 include/linux/packet_diag.h + delete mode 100644 include/linux/param.h + delete mode 100644 include/linux/pfkeyv2.h + delete mode 100644 include/linux/pkt_cls.h + delete mode 100644 include/linux/pkt_sched.h + delete mode 100644 include/linux/posix_types.h + delete mode 100644 include/linux/rtnetlink.h + delete mode 100644 include/linux/sctp.h + delete mode 100644 include/linux/seg6.h + delete mode 100644 include/linux/seg6_genl.h + delete mode 100644 include/linux/seg6_hmac.h + delete mode 100644 include/linux/seg6_iptunnel.h + delete mode 100644 include/linux/seg6_local.h + delete mode 100644 include/linux/sock_diag.h + delete mode 100644 include/linux/socket.h + delete mode 100644 include/linux/sockios.h + delete mode 100644 include/linux/stddef.h + delete mode 100644 include/linux/sysinfo.h + delete mode 100644 include/linux/tc_act/tc_bpf.h + delete mode 100644 include/linux/tc_act/tc_connmark.h + delete mode 100644 include/linux/tc_act/tc_csum.h + delete mode 100644 include/linux/tc_act/tc_defact.h + delete mode 100644 include/linux/tc_act/tc_gact.h + delete mode 100644 include/linux/tc_act/tc_ife.h + delete mode 100644 include/linux/tc_act/tc_ipt.h + delete mode 100644 include/linux/tc_act/tc_mirred.h + delete mode 100644 include/linux/tc_act/tc_nat.h + delete mode 100644 include/linux/tc_act/tc_pedit.h + delete mode 100644 include/linux/tc_act/tc_sample.h + delete mode 100644 include/linux/tc_act/tc_skbedit.h + delete mode 100644 include/linux/tc_act/tc_skbmod.h + delete mode 100644 include/linux/tc_act/tc_tunnel_key.h + delete mode 100644 include/linux/tc_act/tc_vlan.h + delete mode 100644 include/linux/tc_ematch/tc_em_cmp.h + delete mode 100644 include/linux/tc_ematch/tc_em_meta.h + delete mode 100644 include/linux/tc_ematch/tc_em_nbyte.h + delete mode 100644 include/linux/tcp.h + delete mode 100644 include/linux/tcp_metrics.h + delete mode 100644 include/linux/tipc.h + delete mode 100644 include/linux/tipc_netlink.h + delete mode 100644 include/linux/types.h + delete mode 100644 include/linux/unix_diag.h + delete mode 100644 include/linux/veth.h + delete mode 100644 include/linux/xfrm.h + create mode 100644 include/uapi/linux/atm.h + create mode 100644 include/uapi/linux/atmapi.h + create mode 100644 include/uapi/linux/atmarp.h + create mode 100644 include/uapi/linux/atmdev.h + create mode 100644 include/uapi/linux/atmioc.h + create mode 100644 include/uapi/linux/atmsap.h + create mode 100644 include/uapi/linux/bpf.h + create mode 100644 include/uapi/linux/bpf_common.h + create mode 100644 include/uapi/linux/can.h + create mode 100644 include/uapi/linux/can/netlink.h + create mode 100644 include/uapi/linux/can/vxcan.h + create mode 100644 include/uapi/linux/devlink.h + create mode 100644 include/uapi/linux/elf-em.h + create mode 100644 include/uapi/linux/fib_rules.h + create mode 100644 include/uapi/linux/filter.h + create mode 100644 include/uapi/linux/fou.h + create mode 100644 include/uapi/linux/gen_stats.h + create mode 100644 include/uapi/linux/genetlink.h + create mode 100644 include/uapi/linux/hdlc/ioctl.h + create mode 100644 include/uapi/linux/icmpv6.h + create mode 100644 include/uapi/linux/if.h + create mode 100644 include/uapi/linux/if_addr.h + create mode 100644 include/uapi/linux/if_addrlabel.h + create mode 100644 include/uapi/linux/if_alg.h + create mode 100644 include/uapi/linux/if_arp.h + create mode 100644 include/uapi/linux/if_bonding.h + create mode 100644 include/uapi/linux/if_bridge.h + create mode 100644 include/uapi/linux/if_ether.h + create mode 100644 include/uapi/linux/if_link.h + create mode 100644 include/uapi/linux/if_macsec.h + create mode 100644 include/uapi/linux/if_packet.h + create mode 100644 include/uapi/linux/if_tun.h + create mode 100644 include/uapi/linux/if_tunnel.h + create mode 100644 include/uapi/linux/if_vlan.h + create mode 100644 include/uapi/linux/ife.h + create mode 100644 include/uapi/linux/ila.h + create mode 100644 include/uapi/linux/in.h + create mode 100644 include/uapi/linux/in6.h + create mode 100644 include/uapi/linux/in_route.h + create mode 100644 include/uapi/linux/inet_diag.h + create mode 100644 include/uapi/linux/ip.h + create mode 100644 include/uapi/linux/ip6_tunnel.h + create mode 100644 include/uapi/linux/ipsec.h + create mode 100644 include/uapi/linux/kernel.h + create mode 100644 include/uapi/linux/l2tp.h + create mode 100644 include/uapi/linux/libc-compat.h + create mode 100644 include/uapi/linux/limits.h + create mode 100644 include/uapi/linux/lwtunnel.h + create mode 100644 include/uapi/linux/magic.h + create mode 100644 include/uapi/linux/mpls.h + create mode 100644 include/uapi/linux/mpls_iptunnel.h + create mode 100644 include/uapi/linux/neighbour.h + create mode 100644 include/uapi/linux/net_namespace.h + create mode 100644 include/uapi/linux/netconf.h + create mode 100644 include/uapi/linux/netdevice.h + create mode 100644 include/uapi/linux/netfilter.h + create mode 100644 include/uapi/linux/netfilter/ipset/ip_set.h + create mode 100644 include/uapi/linux/netfilter/x_tables.h + create mode 100644 include/uapi/linux/netfilter/xt_set.h + create mode 100644 include/uapi/linux/netfilter/xt_tcpudp.h + create mode 100644 include/uapi/linux/netfilter_ipv4.h + create mode 100644 include/uapi/linux/netfilter_ipv4/ip_tables.h + create mode 100644 include/uapi/linux/netfilter_ipv6.h + create mode 100644 include/uapi/linux/netfilter_ipv6/ip6_tables.h + create mode 100644 include/uapi/linux/netlink.h + create mode 100644 include/uapi/linux/netlink_diag.h + create mode 100644 include/uapi/linux/packet_diag.h + create mode 100644 include/uapi/linux/param.h + create mode 100644 include/uapi/linux/pfkeyv2.h + create mode 100644 include/uapi/linux/pkt_cls.h + create mode 100644 include/uapi/linux/pkt_sched.h + create mode 100644 include/uapi/linux/posix_types.h + create mode 100644 include/uapi/linux/rtnetlink.h + create mode 100644 include/uapi/linux/sctp.h + create mode 100644 include/uapi/linux/seg6.h + create mode 100644 include/uapi/linux/seg6_genl.h + create mode 100644 include/uapi/linux/seg6_hmac.h + create mode 100644 include/uapi/linux/seg6_iptunnel.h + create mode 100644 include/uapi/linux/seg6_local.h + create mode 100644 include/uapi/linux/sock_diag.h + create mode 100644 include/uapi/linux/socket.h + create mode 100644 include/uapi/linux/sockios.h + create mode 100644 include/uapi/linux/stddef.h + create mode 100644 include/uapi/linux/sysinfo.h + create mode 100644 include/uapi/linux/tc_act/tc_bpf.h + create mode 100644 include/uapi/linux/tc_act/tc_connmark.h + create mode 100644 include/uapi/linux/tc_act/tc_csum.h + create mode 100644 include/uapi/linux/tc_act/tc_defact.h + create mode 100644 include/uapi/linux/tc_act/tc_gact.h + create mode 100644 include/uapi/linux/tc_act/tc_ife.h + create mode 100644 include/uapi/linux/tc_act/tc_ipt.h + create mode 100644 include/uapi/linux/tc_act/tc_mirred.h + create mode 100644 include/uapi/linux/tc_act/tc_nat.h + create mode 100644 include/uapi/linux/tc_act/tc_pedit.h + create mode 100644 include/uapi/linux/tc_act/tc_sample.h + create mode 100644 include/uapi/linux/tc_act/tc_skbedit.h + create mode 100644 include/uapi/linux/tc_act/tc_skbmod.h + create mode 100644 include/uapi/linux/tc_act/tc_tunnel_key.h + create mode 100644 include/uapi/linux/tc_act/tc_vlan.h + create mode 100644 include/uapi/linux/tc_ematch/tc_em_cmp.h + create mode 100644 include/uapi/linux/tc_ematch/tc_em_meta.h + create mode 100644 include/uapi/linux/tc_ematch/tc_em_nbyte.h + create mode 100644 include/uapi/linux/tcp.h + create mode 100644 include/uapi/linux/tcp_metrics.h + create mode 100644 include/uapi/linux/tipc.h + create mode 100644 include/uapi/linux/tipc_netlink.h + create mode 100644 include/uapi/linux/types.h + create mode 100644 include/uapi/linux/unix_diag.h + create mode 100644 include/uapi/linux/veth.h + create mode 100644 include/uapi/linux/xfrm.h + +diff --git a/Makefile b/Makefile +index 18de7dc..df2fa33 100644 +--- a/Makefile ++++ b/Makefile +@@ -49,7 +49,7 @@ CCOPTS = -O2 + WFLAGS := -Wall -Wstrict-prototypes -Wmissing-prototypes + WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2 + +-CFLAGS := $(WFLAGS) $(CCOPTS) -I../include $(DEFINES) $(CFLAGS) ++CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS) + YACCFLAGS = -d -t -v + + SUBDIRS=lib ip tc bridge misc netem genl tipc devlink man +diff --git a/include/linux/atm.h b/include/linux/atm.h +deleted file mode 100644 +index 08e27be..0000000 +--- a/include/linux/atm.h ++++ /dev/null +@@ -1,241 +0,0 @@ +-/* atm.h - general ATM declarations */ +- +-/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ +- +- +-/* +- * WARNING: User-space programs should not #include directly. +- * Instead, #include +- */ +- +-#ifndef _LINUX_ATM_H +-#define _LINUX_ATM_H +- +-/* +- * BEGIN_xx and END_xx markers are used for automatic generation of +- * documentation. Do not change them. +- */ +- +- +-#include +-#include +-#include +-#include +- +- +-/* general ATM constants */ +-#define ATM_CELL_SIZE 53 /* ATM cell size incl. header */ +-#define ATM_CELL_PAYLOAD 48 /* ATM payload size */ +-#define ATM_AAL0_SDU 52 /* AAL0 SDU size */ +-#define ATM_MAX_AAL34_PDU 65535 /* maximum AAL3/4 PDU payload */ +-#define ATM_AAL5_TRAILER 8 /* AAL5 trailer size */ +-#define ATM_MAX_AAL5_PDU 65535 /* maximum AAL5 PDU payload */ +-#define ATM_MAX_CDV 9999 /* maximum (default) CDV */ +-#define ATM_NOT_RSV_VCI 32 /* first non-reserved VCI value */ +- +-#define ATM_MAX_VPI 255 /* maximum VPI at the UNI */ +-#define ATM_MAX_VPI_NNI 4096 /* maximum VPI at the NNI */ +-#define ATM_MAX_VCI 65535 /* maximum VCI */ +- +- +-/* "protcol" values for the socket system call */ +-#define ATM_NO_AAL 0 /* AAL not specified */ +-#define ATM_AAL0 13 /* "raw" ATM cells */ +-#define ATM_AAL1 1 /* AAL1 (CBR) */ +-#define ATM_AAL2 2 /* AAL2 (VBR) */ +-#define ATM_AAL34 3 /* AAL3/4 (data) */ +-#define ATM_AAL5 5 /* AAL5 (data) */ +- +-/* +- * socket option name coding functions +- * +- * Note that __SO_ENCODE and __SO_LEVEL are somewhat a hack since the +- * << 22 only reserves 9 bits for the level. On some architectures +- * SOL_SOCKET is 0xFFFF, so that's a bit of a problem +- */ +- +-#define __SO_ENCODE(l,n,t) ((((l) & 0x1FF) << 22) | ((n) << 16) | \ +- sizeof(t)) +-#define __SO_LEVEL_MATCH(c,m) (((c) >> 22) == ((m) & 0x1FF)) +-#define __SO_NUMBER(c) (((c) >> 16) & 0x3f) +-#define __SO_SIZE(c) ((c) & 0x3fff) +- +-/* +- * ATM layer +- */ +- +-#define SO_SETCLP __SO_ENCODE(SOL_ATM,0,int) +- /* set CLP bit value - TODO */ +-#define SO_CIRANGE __SO_ENCODE(SOL_ATM,1,struct atm_cirange) +- /* connection identifier range; socket must be +- bound or connected */ +-#define SO_ATMQOS __SO_ENCODE(SOL_ATM,2,struct atm_qos) +- /* Quality of Service setting */ +-#define SO_ATMSAP __SO_ENCODE(SOL_ATM,3,struct atm_sap) +- /* Service Access Point */ +-#define SO_ATMPVC __SO_ENCODE(SOL_ATM,4,struct sockaddr_atmpvc) +- /* "PVC" address (also for SVCs); get only */ +-#define SO_MULTIPOINT __SO_ENCODE(SOL_ATM, 5, int) +- /* make this vc a p2mp */ +- +- +-/* +- * Note @@@: since the socket layers don't really distinguish the control and +- * the data plane but generally seems to be data plane-centric, any layer is +- * about equally wrong for the SAP. If you have a better idea about this, +- * please speak up ... +- */ +- +- +-/* ATM cell header (for AAL0) */ +- +-/* BEGIN_CH */ +-#define ATM_HDR_GFC_MASK 0xf0000000 +-#define ATM_HDR_GFC_SHIFT 28 +-#define ATM_HDR_VPI_MASK 0x0ff00000 +-#define ATM_HDR_VPI_SHIFT 20 +-#define ATM_HDR_VCI_MASK 0x000ffff0 +-#define ATM_HDR_VCI_SHIFT 4 +-#define ATM_HDR_PTI_MASK 0x0000000e +-#define ATM_HDR_PTI_SHIFT 1 +-#define ATM_HDR_CLP 0x00000001 +-/* END_CH */ +- +- +-/* PTI codings */ +- +-/* BEGIN_PTI */ +-#define ATM_PTI_US0 0 /* user data cell, congestion not exp, SDU-type 0 */ +-#define ATM_PTI_US1 1 /* user data cell, congestion not exp, SDU-type 1 */ +-#define ATM_PTI_UCES0 2 /* user data cell, cong. experienced, SDU-type 0 */ +-#define ATM_PTI_UCES1 3 /* user data cell, cong. experienced, SDU-type 1 */ +-#define ATM_PTI_SEGF5 4 /* segment OAM F5 flow related cell */ +-#define ATM_PTI_E2EF5 5 /* end-to-end OAM F5 flow related cell */ +-#define ATM_PTI_RSV_RM 6 /* reserved for traffic control/resource mgmt */ +-#define ATM_PTI_RSV 7 /* reserved */ +-/* END_PTI */ +- +- +-/* +- * The following items should stay in linux/atm.h, which should be linked to +- * netatm/atm.h +- */ +- +-/* Traffic description */ +- +-#define ATM_NONE 0 /* no traffic */ +-#define ATM_UBR 1 +-#define ATM_CBR 2 +-#define ATM_VBR 3 +-#define ATM_ABR 4 +-#define ATM_ANYCLASS 5 /* compatible with everything */ +- +-#define ATM_MAX_PCR -1 /* maximum available PCR */ +- +-struct atm_trafprm { +- unsigned char traffic_class; /* traffic class (ATM_UBR, ...) */ +- int max_pcr; /* maximum PCR in cells per second */ +- int pcr; /* desired PCR in cells per second */ +- int min_pcr; /* minimum PCR in cells per second */ +- int max_cdv; /* maximum CDV in microseconds */ +- int max_sdu; /* maximum SDU in bytes */ +- /* extra params for ABR */ +- unsigned int icr; /* Initial Cell Rate (24-bit) */ +- unsigned int tbe; /* Transient Buffer Exposure (24-bit) */ +- unsigned int frtt : 24; /* Fixed Round Trip Time (24-bit) */ +- unsigned int rif : 4; /* Rate Increment Factor (4-bit) */ +- unsigned int rdf : 4; /* Rate Decrease Factor (4-bit) */ +- unsigned int nrm_pres :1; /* nrm present bit */ +- unsigned int trm_pres :1; /* rm present bit */ +- unsigned int adtf_pres :1; /* adtf present bit */ +- unsigned int cdf_pres :1; /* cdf present bit*/ +- unsigned int nrm :3; /* Max # of Cells for each forward RM cell (3-bit) */ +- unsigned int trm :3; /* Time between forward RM cells (3-bit) */ +- unsigned int adtf :10; /* ACR Decrease Time Factor (10-bit) */ +- unsigned int cdf :3; /* Cutoff Decrease Factor (3-bit) */ +- unsigned int spare :9; /* spare bits */ +-}; +- +-struct atm_qos { +- struct atm_trafprm txtp; /* parameters in TX direction */ +- struct atm_trafprm rxtp __ATM_API_ALIGN; +- /* parameters in RX direction */ +- unsigned char aal __ATM_API_ALIGN; +-}; +- +-/* PVC addressing */ +- +-#define ATM_ITF_ANY -1 /* "magic" PVC address values */ +-#define ATM_VPI_ANY -1 +-#define ATM_VCI_ANY -1 +-#define ATM_VPI_UNSPEC -2 +-#define ATM_VCI_UNSPEC -2 +- +- +-struct sockaddr_atmpvc { +- unsigned short sap_family; /* address family, AF_ATMPVC */ +- struct { /* PVC address */ +- short itf; /* ATM interface */ +- short vpi; /* VPI (only 8 bits at UNI) */ +- int vci; /* VCI (only 16 bits at UNI) */ +- } sap_addr __ATM_API_ALIGN; /* PVC address */ +-}; +- +-/* SVC addressing */ +- +-#define ATM_ESA_LEN 20 /* ATM End System Address length */ +-#define ATM_E164_LEN 12 /* maximum E.164 number length */ +- +-#define ATM_AFI_DCC 0x39 /* DCC ATM Format */ +-#define ATM_AFI_ICD 0x47 /* ICD ATM Format */ +-#define ATM_AFI_E164 0x45 /* E.164 ATM Format */ +-#define ATM_AFI_LOCAL 0x49 /* Local ATM Format */ +- +-#define ATM_AFI_DCC_GROUP 0xBD /* DCC ATM Group Format */ +-#define ATM_AFI_ICD_GROUP 0xC5 /* ICD ATM Group Format */ +-#define ATM_AFI_E164_GROUP 0xC3 /* E.164 ATM Group Format */ +-#define ATM_AFI_LOCAL_GROUP 0xC7 /* Local ATM Group Format */ +- +-#define ATM_LIJ_NONE 0 /* no leaf-initiated join */ +-#define ATM_LIJ 1 /* request joining */ +-#define ATM_LIJ_RPJ 2 /* set to root-prompted join */ +-#define ATM_LIJ_NJ 3 /* set to network join */ +- +- +-struct sockaddr_atmsvc { +- unsigned short sas_family; /* address family, AF_ATMSVC */ +- struct { /* SVC address */ +- unsigned char prv[ATM_ESA_LEN];/* private ATM address */ +- char pub[ATM_E164_LEN+1]; /* public address (E.164) */ +- /* unused addresses must be bzero'ed */ +- char lij_type; /* role in LIJ call; one of ATM_LIJ* */ +- __u32 lij_id; /* LIJ call identifier */ +- } sas_addr __ATM_API_ALIGN; /* SVC address */ +-}; +- +- +-static __inline__ int atmsvc_addr_in_use(struct sockaddr_atmsvc addr) +-{ +- return *addr.sas_addr.prv || *addr.sas_addr.pub; +-} +- +- +-static __inline__ int atmpvc_addr_in_use(struct sockaddr_atmpvc addr) +-{ +- return addr.sap_addr.itf || addr.sap_addr.vpi || addr.sap_addr.vci; +-} +- +- +-/* +- * Some stuff for linux/sockios.h +- */ +- +-struct atmif_sioc { +- int number; +- int length; +- void *arg; +-}; +- +- +-typedef unsigned short atm_backend_t; +-#endif /* _LINUX_ATM_H */ +diff --git a/include/linux/atmapi.h b/include/linux/atmapi.h +deleted file mode 100644 +index 8fe54d9..0000000 +--- a/include/linux/atmapi.h ++++ /dev/null +@@ -1,29 +0,0 @@ +-/* atmapi.h - ATM API user space/kernel compatibility */ +- +-/* Written 1999,2000 by Werner Almesberger, EPFL ICA */ +- +- +-#ifndef _LINUX_ATMAPI_H +-#define _LINUX_ATMAPI_H +- +-#if defined(__sparc__) || defined(__ia64__) +-/* such alignment is not required on 32 bit sparcs, but we can't +- figure that we are on a sparc64 while compiling user-space programs. */ +-#define __ATM_API_ALIGN __attribute__((aligned(8))) +-#else +-#define __ATM_API_ALIGN +-#endif +- +- +-/* +- * Opaque type for kernel pointers. Note that _ is never accessed. We need +- * the struct in order hide the array, so that we can make simple assignments +- * instead of being forced to use memcpy. It also improves error reporting for +- * code that still assumes that we're passing unsigned longs. +- * +- * Convention: NULL pointers are passed as a field of all zeroes. +- */ +- +-typedef struct { unsigned char _[8]; } __ATM_API_ALIGN atm_kptr_t; +- +-#endif +diff --git a/include/linux/atmarp.h b/include/linux/atmarp.h +deleted file mode 100644 +index 231f4bd..0000000 +--- a/include/linux/atmarp.h ++++ /dev/null +@@ -1,41 +0,0 @@ +-/* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */ +- +-/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ +- +- +-#ifndef _LINUX_ATMARP_H +-#define _LINUX_ATMARP_H +- +-#include +-#include +-#include +- +- +-#define ATMARP_RETRY_DELAY 30 /* request next resolution or forget +- NAK after 30 sec - should go into +- atmclip.h */ +-#define ATMARP_MAX_UNRES_PACKETS 5 /* queue that many packets while +- waiting for the resolver */ +- +- +-#define ATMARPD_CTRL _IO('a',ATMIOC_CLIP+1) /* become atmarpd ctrl sock */ +-#define ATMARP_MKIP _IO('a',ATMIOC_CLIP+2) /* attach socket to IP */ +-#define ATMARP_SETENTRY _IO('a',ATMIOC_CLIP+3) /* fill or hide ARP entry */ +-#define ATMARP_ENCAP _IO('a',ATMIOC_CLIP+5) /* change encapsulation */ +- +- +-enum atmarp_ctrl_type { +- act_invalid, /* catch uninitialized structures */ +- act_need, /* need address resolution */ +- act_up, /* interface is coming up */ +- act_down, /* interface is going down */ +- act_change /* interface configuration has changed */ +-}; +- +-struct atmarp_ctrl { +- enum atmarp_ctrl_type type; /* message type */ +- int itf_num;/* interface number (if present) */ +- __be32 ip; /* IP address (act_need only) */ +-}; +- +-#endif +diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h +deleted file mode 100644 +index 8faa8b9..0000000 +--- a/include/linux/atmdev.h ++++ /dev/null +@@ -1,215 +0,0 @@ +-/* atmdev.h - ATM device driver declarations and various related items */ +- +-/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ +- +- +-#ifndef LINUX_ATMDEV_H +-#define LINUX_ATMDEV_H +- +- +-#include +-#include +-#include +- +- +-#define ESI_LEN 6 +- +-#define ATM_OC3_PCR (155520000/270*260/8/53) +- /* OC3 link rate: 155520000 bps +- SONET overhead: /270*260 (9 section, 1 path) +- bits per cell: /8/53 +- max cell rate: 353207.547 cells/sec */ +-#define ATM_25_PCR ((25600000/8-8000)/54) +- /* 25 Mbps ATM cell rate (59111) */ +-#define ATM_OC12_PCR (622080000/1080*1040/8/53) +- /* OC12 link rate: 622080000 bps +- SONET overhead: /1080*1040 +- bits per cell: /8/53 +- max cell rate: 1412830.188 cells/sec */ +-#define ATM_DS3_PCR (8000*12) +- /* DS3: 12 cells in a 125 usec time slot */ +- +- +-#define __AAL_STAT_ITEMS \ +- __HANDLE_ITEM(tx); /* TX okay */ \ +- __HANDLE_ITEM(tx_err); /* TX errors */ \ +- __HANDLE_ITEM(rx); /* RX okay */ \ +- __HANDLE_ITEM(rx_err); /* RX errors */ \ +- __HANDLE_ITEM(rx_drop); /* RX out of memory */ +- +-struct atm_aal_stats { +-#define __HANDLE_ITEM(i) int i +- __AAL_STAT_ITEMS +-#undef __HANDLE_ITEM +-}; +- +- +-struct atm_dev_stats { +- struct atm_aal_stats aal0; +- struct atm_aal_stats aal34; +- struct atm_aal_stats aal5; +-} __ATM_API_ALIGN; +- +- +-#define ATM_GETLINKRATE _IOW('a',ATMIOC_ITF+1,struct atmif_sioc) +- /* get link rate */ +-#define ATM_GETNAMES _IOW('a',ATMIOC_ITF+3,struct atm_iobuf) +- /* get interface names (numbers) */ +-#define ATM_GETTYPE _IOW('a',ATMIOC_ITF+4,struct atmif_sioc) +- /* get interface type name */ +-#define ATM_GETESI _IOW('a',ATMIOC_ITF+5,struct atmif_sioc) +- /* get interface ESI */ +-#define ATM_GETADDR _IOW('a',ATMIOC_ITF+6,struct atmif_sioc) +- /* get itf's local ATM addr. list */ +-#define ATM_RSTADDR _IOW('a',ATMIOC_ITF+7,struct atmif_sioc) +- /* reset itf's ATM address list */ +-#define ATM_ADDADDR _IOW('a',ATMIOC_ITF+8,struct atmif_sioc) +- /* add a local ATM address */ +-#define ATM_DELADDR _IOW('a',ATMIOC_ITF+9,struct atmif_sioc) +- /* remove a local ATM address */ +-#define ATM_GETCIRANGE _IOW('a',ATMIOC_ITF+10,struct atmif_sioc) +- /* get connection identifier range */ +-#define ATM_SETCIRANGE _IOW('a',ATMIOC_ITF+11,struct atmif_sioc) +- /* set connection identifier range */ +-#define ATM_SETESI _IOW('a',ATMIOC_ITF+12,struct atmif_sioc) +- /* set interface ESI */ +-#define ATM_SETESIF _IOW('a',ATMIOC_ITF+13,struct atmif_sioc) +- /* force interface ESI */ +-#define ATM_ADDLECSADDR _IOW('a', ATMIOC_ITF+14, struct atmif_sioc) +- /* register a LECS address */ +-#define ATM_DELLECSADDR _IOW('a', ATMIOC_ITF+15, struct atmif_sioc) +- /* unregister a LECS address */ +-#define ATM_GETLECSADDR _IOW('a', ATMIOC_ITF+16, struct atmif_sioc) +- /* retrieve LECS address(es) */ +- +-#define ATM_GETSTAT _IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc) +- /* get AAL layer statistics */ +-#define ATM_GETSTATZ _IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc) +- /* get AAL layer statistics and zero */ +-#define ATM_GETLOOP _IOW('a',ATMIOC_SARCOM+2,struct atmif_sioc) +- /* get loopback mode */ +-#define ATM_SETLOOP _IOW('a',ATMIOC_SARCOM+3,struct atmif_sioc) +- /* set loopback mode */ +-#define ATM_QUERYLOOP _IOW('a',ATMIOC_SARCOM+4,struct atmif_sioc) +- /* query supported loopback modes */ +-#define ATM_SETSC _IOW('a',ATMIOC_SPECIAL+1,int) +- /* enable or disable single-copy */ +-#define ATM_SETBACKEND _IOW('a',ATMIOC_SPECIAL+2,atm_backend_t) +- /* set backend handler */ +-#define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t) +- /* use backend to make new if */ +-#define ATM_ADDPARTY _IOW('a', ATMIOC_SPECIAL+4,struct atm_iobuf) +- /* add party to p2mp call */ +-#ifdef CONFIG_COMPAT +-/* It actually takes struct sockaddr_atmsvc, not struct atm_iobuf */ +-#define COMPAT_ATM_ADDPARTY _IOW('a', ATMIOC_SPECIAL+4,struct compat_atm_iobuf) +-#endif +-#define ATM_DROPPARTY _IOW('a', ATMIOC_SPECIAL+5,int) +- /* drop party from p2mp call */ +- +-/* +- * These are backend handkers that can be set via the ATM_SETBACKEND call +- * above. In the future we may support dynamic loading of these - for now, +- * they're just being used to share the ATMIOC_BACKEND ioctls +- */ +-#define ATM_BACKEND_RAW 0 +-#define ATM_BACKEND_PPP 1 /* PPPoATM - RFC2364 */ +-#define ATM_BACKEND_BR2684 2 /* Bridged RFC1483/2684 */ +- +-/* for ATM_GETTYPE */ +-#define ATM_ITFTYP_LEN 8 /* maximum length of interface type name */ +- +-/* +- * Loopback modes for ATM_{PHY,SAR}_{GET,SET}LOOP +- */ +- +-/* Point of loopback CPU-->SAR-->PHY-->line--> ... */ +-#define __ATM_LM_NONE 0 /* no loop back ^ ^ ^ ^ */ +-#define __ATM_LM_AAL 1 /* loop back PDUs --' | | | */ +-#define __ATM_LM_ATM 2 /* loop back ATM cells ---' | | */ +-/* RESERVED 4 loop back on PHY side ---' */ +-#define __ATM_LM_PHY 8 /* loop back bits (digital) ----' | */ +-#define __ATM_LM_ANALOG 16 /* loop back the analog signal --------' */ +- +-/* Direction of loopback */ +-#define __ATM_LM_MKLOC(n) ((n)) /* Local (i.e. loop TX to RX) */ +-#define __ATM_LM_MKRMT(n) ((n) << 8) /* Remote (i.e. loop RX to TX) */ +- +-#define __ATM_LM_XTLOC(n) ((n) & 0xff) +-#define __ATM_LM_XTRMT(n) (((n) >> 8) & 0xff) +- +-#define ATM_LM_NONE 0 /* no loopback */ +- +-#define ATM_LM_LOC_AAL __ATM_LM_MKLOC(__ATM_LM_AAL) +-#define ATM_LM_LOC_ATM __ATM_LM_MKLOC(__ATM_LM_ATM) +-#define ATM_LM_LOC_PHY __ATM_LM_MKLOC(__ATM_LM_PHY) +-#define ATM_LM_LOC_ANALOG __ATM_LM_MKLOC(__ATM_LM_ANALOG) +- +-#define ATM_LM_RMT_AAL __ATM_LM_MKRMT(__ATM_LM_AAL) +-#define ATM_LM_RMT_ATM __ATM_LM_MKRMT(__ATM_LM_ATM) +-#define ATM_LM_RMT_PHY __ATM_LM_MKRMT(__ATM_LM_PHY) +-#define ATM_LM_RMT_ANALOG __ATM_LM_MKRMT(__ATM_LM_ANALOG) +- +-/* +- * Note: ATM_LM_LOC_* and ATM_LM_RMT_* can be combined, provided that +- * __ATM_LM_XTLOC(x) <= __ATM_LM_XTRMT(x) +- */ +- +- +-struct atm_iobuf { +- int length; +- void *buffer; +-}; +- +-/* for ATM_GETCIRANGE / ATM_SETCIRANGE */ +- +-#define ATM_CI_MAX -1 /* use maximum range of VPI/VCI */ +- +-struct atm_cirange { +- signed char vpi_bits; /* 1..8, ATM_CI_MAX (-1) for maximum */ +- signed char vci_bits; /* 1..16, ATM_CI_MAX (-1) for maximum */ +-}; +- +-/* for ATM_SETSC; actually taken from the ATM_VF number space */ +- +-#define ATM_SC_RX 1024 /* enable RX single-copy */ +-#define ATM_SC_TX 2048 /* enable TX single-copy */ +- +-#define ATM_BACKLOG_DEFAULT 32 /* if we get more, we're likely to time out +- anyway */ +- +-/* MF: change_qos (Modify) flags */ +- +-#define ATM_MF_IMMED 1 /* Block until change is effective */ +-#define ATM_MF_INC_RSV 2 /* Change reservation on increase */ +-#define ATM_MF_INC_SHP 4 /* Change shaping on increase */ +-#define ATM_MF_DEC_RSV 8 /* Change reservation on decrease */ +-#define ATM_MF_DEC_SHP 16 /* Change shaping on decrease */ +-#define ATM_MF_BWD 32 /* Set the backward direction parameters */ +- +-#define ATM_MF_SET (ATM_MF_INC_RSV | ATM_MF_INC_SHP | ATM_MF_DEC_RSV | \ +- ATM_MF_DEC_SHP | ATM_MF_BWD) +- +-/* +- * ATM_VS_* are used to express VC state in a human-friendly way. +- */ +- +-#define ATM_VS_IDLE 0 /* VC is not used */ +-#define ATM_VS_CONNECTED 1 /* VC is connected */ +-#define ATM_VS_CLOSING 2 /* VC is closing */ +-#define ATM_VS_LISTEN 3 /* VC is listening for incoming setups */ +-#define ATM_VS_INUSE 4 /* VC is in use (registered with atmsigd) */ +-#define ATM_VS_BOUND 5 /* VC is bound */ +- +-#define ATM_VS2TXT_MAP \ +- "IDLE", "CONNECTED", "CLOSING", "LISTEN", "INUSE", "BOUND" +- +-#define ATM_VF2TXT_MAP \ +- "ADDR", "READY", "PARTIAL", "REGIS", \ +- "RELEASED", "HASQOS", "LISTEN", "META", \ +- "256", "512", "1024", "2048", \ +- "SESSION", "HASSAP", "BOUND", "CLOSE" +- +- +- +-#endif /* LINUX_ATMDEV_H */ +diff --git a/include/linux/atmioc.h b/include/linux/atmioc.h +deleted file mode 100644 +index 37f67aa..0000000 +--- a/include/linux/atmioc.h ++++ /dev/null +@@ -1,41 +0,0 @@ +-/* atmioc.h - ranges for ATM-related ioctl numbers */ +- +-/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ +- +- +-/* +- * See http://icawww1.epfl.ch/linux-atm/magic.html for the complete list of +- * "magic" ioctl numbers. +- */ +- +- +-#ifndef _LINUX_ATMIOC_H +-#define _LINUX_ATMIOC_H +- +-#include +- /* everybody including atmioc.h will also need _IO{,R,W,WR} */ +- +-#define ATMIOC_PHYCOM 0x00 /* PHY device common ioctls, globally unique */ +-#define ATMIOC_PHYCOM_END 0x0f +-#define ATMIOC_PHYTYP 0x10 /* PHY dev type ioctls, unique per PHY type */ +-#define ATMIOC_PHYTYP_END 0x2f +-#define ATMIOC_PHYPRV 0x30 /* PHY dev private ioctls, unique per driver */ +-#define ATMIOC_PHYPRV_END 0x4f +-#define ATMIOC_SARCOM 0x50 /* SAR device common ioctls, globally unique */ +-#define ATMIOC_SARCOM_END 0x50 +-#define ATMIOC_SARPRV 0x60 /* SAR dev private ioctls, unique per driver */ +-#define ATMIOC_SARPRV_END 0x7f +-#define ATMIOC_ITF 0x80 /* Interface ioctls, globally unique */ +-#define ATMIOC_ITF_END 0x8f +-#define ATMIOC_BACKEND 0x90 /* ATM generic backend ioctls, u. per backend */ +-#define ATMIOC_BACKEND_END 0xaf +-/* 0xb0-0xbf: Reserved for future use */ +-#define ATMIOC_AREQUIPA 0xc0 /* Application requested IP over ATM, glob. u. */ +-#define ATMIOC_LANE 0xd0 /* LAN Emulation, globally unique */ +-#define ATMIOC_MPOA 0xd8 /* MPOA, globally unique */ +-#define ATMIOC_CLIP 0xe0 /* Classical IP over ATM control, globally u. */ +-#define ATMIOC_CLIP_END 0xef +-#define ATMIOC_SPECIAL 0xf0 /* Special-purpose controls, globally unique */ +-#define ATMIOC_SPECIAL_END 0xff +- +-#endif +diff --git a/include/linux/atmsap.h b/include/linux/atmsap.h +deleted file mode 100644 +index 799b104..0000000 +--- a/include/linux/atmsap.h ++++ /dev/null +@@ -1,162 +0,0 @@ +-/* atmsap.h - ATM Service Access Point addressing definitions */ +- +-/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ +- +- +-#ifndef _LINUX_ATMSAP_H +-#define _LINUX_ATMSAP_H +- +-#include +- +-/* +- * BEGIN_xx and END_xx markers are used for automatic generation of +- * documentation. Do not change them. +- */ +- +- +-/* +- * Layer 2 protocol identifiers +- */ +- +-/* BEGIN_L2 */ +-#define ATM_L2_NONE 0 /* L2 not specified */ +-#define ATM_L2_ISO1745 0x01 /* Basic mode ISO 1745 */ +-#define ATM_L2_Q291 0x02 /* ITU-T Q.291 (Rec. I.441) */ +-#define ATM_L2_X25_LL 0x06 /* ITU-T X.25, link layer */ +-#define ATM_L2_X25_ML 0x07 /* ITU-T X.25, multilink */ +-#define ATM_L2_LAPB 0x08 /* Extended LAPB, half-duplex (Rec. T.71) */ +-#define ATM_L2_HDLC_ARM 0x09 /* HDLC ARM (ISO/IEC 4335) */ +-#define ATM_L2_HDLC_NRM 0x0a /* HDLC NRM (ISO/IEC 4335) */ +-#define ATM_L2_HDLC_ABM 0x0b /* HDLC ABM (ISO/IEC 4335) */ +-#define ATM_L2_ISO8802 0x0c /* LAN LLC (ISO/IEC 8802/2) */ +-#define ATM_L2_X75 0x0d /* ITU-T X.75, SLP */ +-#define ATM_L2_Q922 0x0e /* ITU-T Q.922 */ +-#define ATM_L2_USER 0x10 /* user-specified */ +-#define ATM_L2_ISO7776 0x11 /* ISO 7776 DTE-DTE */ +-/* END_L2 */ +- +- +-/* +- * Layer 3 protocol identifiers +- */ +- +-/* BEGIN_L3 */ +-#define ATM_L3_NONE 0 /* L3 not specified */ +-#define ATM_L3_X25 0x06 /* ITU-T X.25, packet layer */ +-#define ATM_L3_ISO8208 0x07 /* ISO/IEC 8208 */ +-#define ATM_L3_X223 0x08 /* ITU-T X.223 | ISO/IEC 8878 */ +-#define ATM_L3_ISO8473 0x09 /* ITU-T X.233 | ISO/IEC 8473 */ +-#define ATM_L3_T70 0x0a /* ITU-T T.70 minimum network layer */ +-#define ATM_L3_TR9577 0x0b /* ISO/IEC TR 9577 */ +-#define ATM_L3_H310 0x0c /* ITU-T Recommendation H.310 */ +-#define ATM_L3_H321 0x0d /* ITU-T Recommendation H.321 */ +-#define ATM_L3_USER 0x10 /* user-specified */ +-/* END_L3 */ +- +- +-/* +- * High layer identifiers +- */ +- +-/* BEGIN_HL */ +-#define ATM_HL_NONE 0 /* HL not specified */ +-#define ATM_HL_ISO 0x01 /* ISO */ +-#define ATM_HL_USER 0x02 /* user-specific */ +-#define ATM_HL_HLP 0x03 /* high layer profile - UNI 3.0 only */ +-#define ATM_HL_VENDOR 0x04 /* vendor-specific application identifier */ +-/* END_HL */ +- +- +-/* +- * ITU-T coded mode of operation +- */ +- +-/* BEGIN_IMD */ +-#define ATM_IMD_NONE 0 /* mode not specified */ +-#define ATM_IMD_NORMAL 1 /* normal mode of operation */ +-#define ATM_IMD_EXTENDED 2 /* extended mode of operation */ +-/* END_IMD */ +- +-/* +- * H.310 code points +- */ +- +-#define ATM_TT_NONE 0 /* terminal type not specified */ +-#define ATM_TT_RX 1 /* receive only */ +-#define ATM_TT_TX 2 /* send only */ +-#define ATM_TT_RXTX 3 /* receive and send */ +- +-#define ATM_MC_NONE 0 /* no multiplexing */ +-#define ATM_MC_TS 1 /* transport stream (TS) */ +-#define ATM_MC_TS_FEC 2 /* transport stream with forward error corr. */ +-#define ATM_MC_PS 3 /* program stream (PS) */ +-#define ATM_MC_PS_FEC 4 /* program stream with forward error corr. */ +-#define ATM_MC_H221 5 /* ITU-T Rec. H.221 */ +- +-/* +- * SAP structures +- */ +- +-#define ATM_MAX_HLI 8 /* maximum high-layer information length */ +- +- +-struct atm_blli { +- unsigned char l2_proto; /* layer 2 protocol */ +- union { +- struct { +- unsigned char mode; /* mode of operation (ATM_IMD_xxx), 0 if */ +- /* absent */ +- unsigned char window; /* window size (k), 1-127 (0 to omit) */ +- } itu; /* ITU-T encoding */ +- unsigned char user; /* user-specified l2 information */ +- } l2; +- unsigned char l3_proto; /* layer 3 protocol */ +- union { +- struct { +- unsigned char mode; /* mode of operation (ATM_IMD_xxx), 0 if */ +- /* absent */ +- unsigned char def_size; /* default packet size (log2), 4-12 (0 to */ +- /* omit) */ +- unsigned char window;/* packet window size, 1-127 (0 to omit) */ +- } itu; /* ITU-T encoding */ +- unsigned char user; /* user specified l3 information */ +- struct { /* if l3_proto = ATM_L3_H310 */ +- unsigned char term_type; /* terminal type */ +- unsigned char fw_mpx_cap; /* forward multiplexing capability */ +- /* only if term_type != ATM_TT_NONE */ +- unsigned char bw_mpx_cap; /* backward multiplexing capability */ +- /* only if term_type != ATM_TT_NONE */ +- } h310; +- struct { /* if l3_proto = ATM_L3_TR9577 */ +- unsigned char ipi; /* initial protocol id */ +- unsigned char snap[5];/* IEEE 802.1 SNAP identifier */ +- /* (only if ipi == NLPID_IEEE802_1_SNAP) */ +- } tr9577; +- } l3; +-} __ATM_API_ALIGN; +- +- +-struct atm_bhli { +- unsigned char hl_type; /* high layer information type */ +- unsigned char hl_length; /* length (only if hl_type == ATM_HL_USER || */ +- /* hl_type == ATM_HL_ISO) */ +- unsigned char hl_info[ATM_MAX_HLI];/* high layer information */ +-}; +- +- +-#define ATM_MAX_BLLI 3 /* maximum number of BLLI elements */ +- +- +-struct atm_sap { +- struct atm_bhli bhli; /* local SAP, high-layer information */ +- struct atm_blli blli[ATM_MAX_BLLI] __ATM_API_ALIGN; +- /* local SAP, low-layer info */ +-}; +- +- +-static __inline__ int blli_in_use(struct atm_blli blli) +-{ +- return blli.l2_proto || blli.l3_proto; +-} +- +-#endif +diff --git a/include/linux/bpf.h b/include/linux/bpf.h +deleted file mode 100644 +index 0895a52..0000000 +--- a/include/linux/bpf.h ++++ /dev/null +@@ -1,867 +0,0 @@ +-/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of version 2 of the GNU General Public +- * License as published by the Free Software Foundation. +- */ +-#ifndef __LINUX_BPF_H__ +-#define __LINUX_BPF_H__ +- +-#include +-#include +- +-/* Extended instruction set based on top of classic BPF */ +- +-/* instruction classes */ +-#define BPF_ALU64 0x07 /* alu mode in double word width */ +- +-/* ld/ldx fields */ +-#define BPF_DW 0x18 /* double word */ +-#define BPF_XADD 0xc0 /* exclusive add */ +- +-/* alu/jmp fields */ +-#define BPF_MOV 0xb0 /* mov reg to reg */ +-#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */ +- +-/* change endianness of a register */ +-#define BPF_END 0xd0 /* flags for endianness conversion: */ +-#define BPF_TO_LE 0x00 /* convert to little-endian */ +-#define BPF_TO_BE 0x08 /* convert to big-endian */ +-#define BPF_FROM_LE BPF_TO_LE +-#define BPF_FROM_BE BPF_TO_BE +- +-/* jmp encodings */ +-#define BPF_JNE 0x50 /* jump != */ +-#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ +-#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ +-#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ +-#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ +-#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ +-#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ +-#define BPF_CALL 0x80 /* function call */ +-#define BPF_EXIT 0x90 /* function return */ +- +-/* Register numbers */ +-enum { +- BPF_REG_0 = 0, +- BPF_REG_1, +- BPF_REG_2, +- BPF_REG_3, +- BPF_REG_4, +- BPF_REG_5, +- BPF_REG_6, +- BPF_REG_7, +- BPF_REG_8, +- BPF_REG_9, +- BPF_REG_10, +- __MAX_BPF_REG, +-}; +- +-/* BPF has 10 general purpose 64-bit registers and stack frame. */ +-#define MAX_BPF_REG __MAX_BPF_REG +- +-struct bpf_insn { +- __u8 code; /* opcode */ +- __u8 dst_reg:4; /* dest register */ +- __u8 src_reg:4; /* source register */ +- __s16 off; /* signed offset */ +- __s32 imm; /* signed immediate constant */ +-}; +- +-/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ +-struct bpf_lpm_trie_key { +- __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ +- __u8 data[0]; /* Arbitrary size */ +-}; +- +-/* BPF syscall commands, see bpf(2) man-page for details. */ +-enum bpf_cmd { +- BPF_MAP_CREATE, +- BPF_MAP_LOOKUP_ELEM, +- BPF_MAP_UPDATE_ELEM, +- BPF_MAP_DELETE_ELEM, +- BPF_MAP_GET_NEXT_KEY, +- BPF_PROG_LOAD, +- BPF_OBJ_PIN, +- BPF_OBJ_GET, +- BPF_PROG_ATTACH, +- BPF_PROG_DETACH, +- BPF_PROG_TEST_RUN, +- BPF_PROG_GET_NEXT_ID, +- BPF_MAP_GET_NEXT_ID, +- BPF_PROG_GET_FD_BY_ID, +- BPF_MAP_GET_FD_BY_ID, +- BPF_OBJ_GET_INFO_BY_FD, +-}; +- +-enum bpf_map_type { +- BPF_MAP_TYPE_UNSPEC, +- BPF_MAP_TYPE_HASH, +- BPF_MAP_TYPE_ARRAY, +- BPF_MAP_TYPE_PROG_ARRAY, +- BPF_MAP_TYPE_PERF_EVENT_ARRAY, +- BPF_MAP_TYPE_PERCPU_HASH, +- BPF_MAP_TYPE_PERCPU_ARRAY, +- BPF_MAP_TYPE_STACK_TRACE, +- BPF_MAP_TYPE_CGROUP_ARRAY, +- BPF_MAP_TYPE_LRU_HASH, +- BPF_MAP_TYPE_LRU_PERCPU_HASH, +- BPF_MAP_TYPE_LPM_TRIE, +- BPF_MAP_TYPE_ARRAY_OF_MAPS, +- BPF_MAP_TYPE_HASH_OF_MAPS, +- BPF_MAP_TYPE_DEVMAP, +- BPF_MAP_TYPE_SOCKMAP, +-}; +- +-enum bpf_prog_type { +- BPF_PROG_TYPE_UNSPEC, +- BPF_PROG_TYPE_SOCKET_FILTER, +- BPF_PROG_TYPE_KPROBE, +- BPF_PROG_TYPE_SCHED_CLS, +- BPF_PROG_TYPE_SCHED_ACT, +- BPF_PROG_TYPE_TRACEPOINT, +- BPF_PROG_TYPE_XDP, +- BPF_PROG_TYPE_PERF_EVENT, +- BPF_PROG_TYPE_CGROUP_SKB, +- BPF_PROG_TYPE_CGROUP_SOCK, +- BPF_PROG_TYPE_LWT_IN, +- BPF_PROG_TYPE_LWT_OUT, +- BPF_PROG_TYPE_LWT_XMIT, +- BPF_PROG_TYPE_SOCK_OPS, +- BPF_PROG_TYPE_SK_SKB, +-}; +- +-enum bpf_attach_type { +- BPF_CGROUP_INET_INGRESS, +- BPF_CGROUP_INET_EGRESS, +- BPF_CGROUP_INET_SOCK_CREATE, +- BPF_CGROUP_SOCK_OPS, +- BPF_SK_SKB_STREAM_PARSER, +- BPF_SK_SKB_STREAM_VERDICT, +- __MAX_BPF_ATTACH_TYPE +-}; +- +-#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE +- +-/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command +- * to the given target_fd cgroup the descendent cgroup will be able to +- * override effective bpf program that was inherited from this cgroup +- */ +-#define BPF_F_ALLOW_OVERRIDE (1U << 0) +- +-/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the +- * verifier will perform strict alignment checking as if the kernel +- * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, +- * and NET_IP_ALIGN defined to 2. +- */ +-#define BPF_F_STRICT_ALIGNMENT (1U << 0) +- +-#define BPF_PSEUDO_MAP_FD 1 +- +-/* flags for BPF_MAP_UPDATE_ELEM command */ +-#define BPF_ANY 0 /* create new element or update existing */ +-#define BPF_NOEXIST 1 /* create new element if it didn't exist */ +-#define BPF_EXIST 2 /* update existing element */ +- +-/* flags for BPF_MAP_CREATE command */ +-#define BPF_F_NO_PREALLOC (1U << 0) +-/* Instead of having one common LRU list in the +- * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list +- * which can scale and perform better. +- * Note, the LRU nodes (including free nodes) cannot be moved +- * across different LRU lists. +- */ +-#define BPF_F_NO_COMMON_LRU (1U << 1) +-/* Specify numa node during map creation */ +-#define BPF_F_NUMA_NODE (1U << 2) +- +-union bpf_attr { +- struct { /* anonymous struct used by BPF_MAP_CREATE command */ +- __u32 map_type; /* one of enum bpf_map_type */ +- __u32 key_size; /* size of key in bytes */ +- __u32 value_size; /* size of value in bytes */ +- __u32 max_entries; /* max number of entries in a map */ +- __u32 map_flags; /* BPF_MAP_CREATE related +- * flags defined above. +- */ +- __u32 inner_map_fd; /* fd pointing to the inner map */ +- __u32 numa_node; /* numa node (effective only if +- * BPF_F_NUMA_NODE is set). +- */ +- }; +- +- struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ +- __u32 map_fd; +- __aligned_u64 key; +- union { +- __aligned_u64 value; +- __aligned_u64 next_key; +- }; +- __u64 flags; +- }; +- +- struct { /* anonymous struct used by BPF_PROG_LOAD command */ +- __u32 prog_type; /* one of enum bpf_prog_type */ +- __u32 insn_cnt; +- __aligned_u64 insns; +- __aligned_u64 license; +- __u32 log_level; /* verbosity level of verifier */ +- __u32 log_size; /* size of user buffer */ +- __aligned_u64 log_buf; /* user supplied buffer */ +- __u32 kern_version; /* checked when prog_type=kprobe */ +- __u32 prog_flags; +- }; +- +- struct { /* anonymous struct used by BPF_OBJ_* commands */ +- __aligned_u64 pathname; +- __u32 bpf_fd; +- }; +- +- struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ +- __u32 target_fd; /* container object to attach to */ +- __u32 attach_bpf_fd; /* eBPF program to attach */ +- __u32 attach_type; +- __u32 attach_flags; +- }; +- +- struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ +- __u32 prog_fd; +- __u32 retval; +- __u32 data_size_in; +- __u32 data_size_out; +- __aligned_u64 data_in; +- __aligned_u64 data_out; +- __u32 repeat; +- __u32 duration; +- } test; +- +- struct { /* anonymous struct used by BPF_*_GET_*_ID */ +- union { +- __u32 start_id; +- __u32 prog_id; +- __u32 map_id; +- }; +- __u32 next_id; +- }; +- +- struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ +- __u32 bpf_fd; +- __u32 info_len; +- __aligned_u64 info; +- } info; +-} __attribute__((aligned(8))); +- +-/* BPF helper function descriptions: +- * +- * void *bpf_map_lookup_elem(&map, &key) +- * Return: Map value or NULL +- * +- * int bpf_map_update_elem(&map, &key, &value, flags) +- * Return: 0 on success or negative error +- * +- * int bpf_map_delete_elem(&map, &key) +- * Return: 0 on success or negative error +- * +- * int bpf_probe_read(void *dst, int size, void *src) +- * Return: 0 on success or negative error +- * +- * u64 bpf_ktime_get_ns(void) +- * Return: current ktime +- * +- * int bpf_trace_printk(const char *fmt, int fmt_size, ...) +- * Return: length of buffer written or negative error +- * +- * u32 bpf_prandom_u32(void) +- * Return: random value +- * +- * u32 bpf_raw_smp_processor_id(void) +- * Return: SMP processor ID +- * +- * int bpf_skb_store_bytes(skb, offset, from, len, flags) +- * store bytes into packet +- * @skb: pointer to skb +- * @offset: offset within packet from skb->mac_header +- * @from: pointer where to copy bytes from +- * @len: number of bytes to store into packet +- * @flags: bit 0 - if true, recompute skb->csum +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * int bpf_l3_csum_replace(skb, offset, from, to, flags) +- * recompute IP checksum +- * @skb: pointer to skb +- * @offset: offset within packet where IP checksum is located +- * @from: old value of header field +- * @to: new value of header field +- * @flags: bits 0-3 - size of header field +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * int bpf_l4_csum_replace(skb, offset, from, to, flags) +- * recompute TCP/UDP checksum +- * @skb: pointer to skb +- * @offset: offset within packet where TCP/UDP checksum is located +- * @from: old value of header field +- * @to: new value of header field +- * @flags: bits 0-3 - size of header field +- * bit 4 - is pseudo header +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * int bpf_tail_call(ctx, prog_array_map, index) +- * jump into another BPF program +- * @ctx: context pointer passed to next program +- * @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY +- * @index: index inside array that selects specific program to run +- * Return: 0 on success or negative error +- * +- * int bpf_clone_redirect(skb, ifindex, flags) +- * redirect to another netdev +- * @skb: pointer to skb +- * @ifindex: ifindex of the net device +- * @flags: bit 0 - if set, redirect to ingress instead of egress +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * u64 bpf_get_current_pid_tgid(void) +- * Return: current->tgid << 32 | current->pid +- * +- * u64 bpf_get_current_uid_gid(void) +- * Return: current_gid << 32 | current_uid +- * +- * int bpf_get_current_comm(char *buf, int size_of_buf) +- * stores current->comm into buf +- * Return: 0 on success or negative error +- * +- * u32 bpf_get_cgroup_classid(skb) +- * retrieve a proc's classid +- * @skb: pointer to skb +- * Return: classid if != 0 +- * +- * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci) +- * Return: 0 on success or negative error +- * +- * int bpf_skb_vlan_pop(skb) +- * Return: 0 on success or negative error +- * +- * int bpf_skb_get_tunnel_key(skb, key, size, flags) +- * int bpf_skb_set_tunnel_key(skb, key, size, flags) +- * retrieve or populate tunnel metadata +- * @skb: pointer to skb +- * @key: pointer to 'struct bpf_tunnel_key' +- * @size: size of 'struct bpf_tunnel_key' +- * @flags: room for future extensions +- * Return: 0 on success or negative error +- * +- * u64 bpf_perf_event_read(map, flags) +- * read perf event counter value +- * @map: pointer to perf_event_array map +- * @flags: index of event in the map or bitmask flags +- * Return: value of perf event counter read or error code +- * +- * int bpf_redirect(ifindex, flags) +- * redirect to another netdev +- * @ifindex: ifindex of the net device +- * @flags: +- * cls_bpf: +- * bit 0 - if set, redirect to ingress instead of egress +- * other bits - reserved +- * xdp_bpf: +- * all bits - reserved +- * Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error +- * xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error +- * int bpf_redirect_map(map, key, flags) +- * redirect to endpoint in map +- * @map: pointer to dev map +- * @key: index in map to lookup +- * @flags: -- +- * Return: XDP_REDIRECT on success or XDP_ABORT on error +- * +- * u32 bpf_get_route_realm(skb) +- * retrieve a dst's tclassid +- * @skb: pointer to skb +- * Return: realm if != 0 +- * +- * int bpf_perf_event_output(ctx, map, flags, data, size) +- * output perf raw sample +- * @ctx: struct pt_regs* +- * @map: pointer to perf_event_array map +- * @flags: index of event in the map or bitmask flags +- * @data: data on stack to be output as raw data +- * @size: size of data +- * Return: 0 on success or negative error +- * +- * int bpf_get_stackid(ctx, map, flags) +- * walk user or kernel stack and return id +- * @ctx: struct pt_regs* +- * @map: pointer to stack_trace map +- * @flags: bits 0-7 - numer of stack frames to skip +- * bit 8 - collect user stack instead of kernel +- * bit 9 - compare stacks by hash only +- * bit 10 - if two different stacks hash into the same stackid +- * discard old +- * other bits - reserved +- * Return: >= 0 stackid on success or negative error +- * +- * s64 bpf_csum_diff(from, from_size, to, to_size, seed) +- * calculate csum diff +- * @from: raw from buffer +- * @from_size: length of from buffer +- * @to: raw to buffer +- * @to_size: length of to buffer +- * @seed: optional seed +- * Return: csum result or negative error code +- * +- * int bpf_skb_get_tunnel_opt(skb, opt, size) +- * retrieve tunnel options metadata +- * @skb: pointer to skb +- * @opt: pointer to raw tunnel option data +- * @size: size of @opt +- * Return: option size +- * +- * int bpf_skb_set_tunnel_opt(skb, opt, size) +- * populate tunnel options metadata +- * @skb: pointer to skb +- * @opt: pointer to raw tunnel option data +- * @size: size of @opt +- * Return: 0 on success or negative error +- * +- * int bpf_skb_change_proto(skb, proto, flags) +- * Change protocol of the skb. Currently supported is v4 -> v6, +- * v6 -> v4 transitions. The helper will also resize the skb. eBPF +- * program is expected to fill the new headers via skb_store_bytes +- * and lX_csum_replace. +- * @skb: pointer to skb +- * @proto: new skb->protocol type +- * @flags: reserved +- * Return: 0 on success or negative error +- * +- * int bpf_skb_change_type(skb, type) +- * Change packet type of skb. +- * @skb: pointer to skb +- * @type: new skb->pkt_type type +- * Return: 0 on success or negative error +- * +- * int bpf_skb_under_cgroup(skb, map, index) +- * Check cgroup2 membership of skb +- * @skb: pointer to skb +- * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type +- * @index: index of the cgroup in the bpf_map +- * Return: +- * == 0 skb failed the cgroup2 descendant test +- * == 1 skb succeeded the cgroup2 descendant test +- * < 0 error +- * +- * u32 bpf_get_hash_recalc(skb) +- * Retrieve and possibly recalculate skb->hash. +- * @skb: pointer to skb +- * Return: hash +- * +- * u64 bpf_get_current_task(void) +- * Returns current task_struct +- * Return: current +- * +- * int bpf_probe_write_user(void *dst, void *src, int len) +- * safely attempt to write to a location +- * @dst: destination address in userspace +- * @src: source address on stack +- * @len: number of bytes to copy +- * Return: 0 on success or negative error +- * +- * int bpf_current_task_under_cgroup(map, index) +- * Check cgroup2 membership of current task +- * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type +- * @index: index of the cgroup in the bpf_map +- * Return: +- * == 0 current failed the cgroup2 descendant test +- * == 1 current succeeded the cgroup2 descendant test +- * < 0 error +- * +- * int bpf_skb_change_tail(skb, len, flags) +- * The helper will resize the skb to the given new size, to be used f.e. +- * with control messages. +- * @skb: pointer to skb +- * @len: new skb length +- * @flags: reserved +- * Return: 0 on success or negative error +- * +- * int bpf_skb_pull_data(skb, len) +- * The helper will pull in non-linear data in case the skb is non-linear +- * and not all of len are part of the linear section. Only needed for +- * read/write with direct packet access. +- * @skb: pointer to skb +- * @len: len to make read/writeable +- * Return: 0 on success or negative error +- * +- * s64 bpf_csum_update(skb, csum) +- * Adds csum into skb->csum in case of CHECKSUM_COMPLETE. +- * @skb: pointer to skb +- * @csum: csum to add +- * Return: csum on success or negative error +- * +- * void bpf_set_hash_invalid(skb) +- * Invalidate current skb->hash. +- * @skb: pointer to skb +- * +- * int bpf_get_numa_node_id() +- * Return: Id of current NUMA node. +- * +- * int bpf_skb_change_head() +- * Grows headroom of skb and adjusts MAC header offset accordingly. +- * Will extends/reallocae as required automatically. +- * May change skb data pointer and will thus invalidate any check +- * performed for direct packet access. +- * @skb: pointer to skb +- * @len: length of header to be pushed in front +- * @flags: Flags (unused for now) +- * Return: 0 on success or negative error +- * +- * int bpf_xdp_adjust_head(xdp_md, delta) +- * Adjust the xdp_md.data by delta +- * @xdp_md: pointer to xdp_md +- * @delta: An positive/negative integer to be added to xdp_md.data +- * Return: 0 on success or negative on error +- * +- * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr) +- * Copy a NUL terminated string from unsafe address. In case the string +- * length is smaller than size, the target is not padded with further NUL +- * bytes. In case the string length is larger than size, just count-1 +- * bytes are copied and the last byte is set to NUL. +- * @dst: destination address +- * @size: maximum number of bytes to copy, including the trailing NUL +- * @unsafe_ptr: unsafe address +- * Return: +- * > 0 length of the string including the trailing NUL on success +- * < 0 error +- * +- * u64 bpf_get_socket_cookie(skb) +- * Get the cookie for the socket stored inside sk_buff. +- * @skb: pointer to skb +- * Return: 8 Bytes non-decreasing number on success or 0 if the socket +- * field is missing inside sk_buff +- * +- * u32 bpf_get_socket_uid(skb) +- * Get the owner uid of the socket stored inside sk_buff. +- * @skb: pointer to skb +- * Return: uid of the socket owner on success or overflowuid if failed. +- * +- * u32 bpf_set_hash(skb, hash) +- * Set full skb->hash. +- * @skb: pointer to skb +- * @hash: hash to set +- * +- * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen) +- * Calls setsockopt. Not all opts are available, only those with +- * integer optvals plus TCP_CONGESTION. +- * Supported levels: SOL_SOCKET and IPROTO_TCP +- * @bpf_socket: pointer to bpf_socket +- * @level: SOL_SOCKET or IPROTO_TCP +- * @optname: option name +- * @optval: pointer to option value +- * @optlen: length of optval in byes +- * Return: 0 or negative error +- * +- * int bpf_skb_adjust_room(skb, len_diff, mode, flags) +- * Grow or shrink room in sk_buff. +- * @skb: pointer to skb +- * @len_diff: (signed) amount of room to grow/shrink +- * @mode: operation mode (enum bpf_adj_room_mode) +- * @flags: reserved for future use +- * Return: 0 on success or negative error code +- * +- * int bpf_sk_redirect_map(map, key, flags) +- * Redirect skb to a sock in map using key as a lookup key for the +- * sock in map. +- * @map: pointer to sockmap +- * @key: key to lookup sock in map +- * @flags: reserved for future use +- * Return: SK_REDIRECT +- * +- * int bpf_sock_map_update(skops, map, key, flags) +- * @skops: pointer to bpf_sock_ops +- * @map: pointer to sockmap to update +- * @key: key to insert/update sock in map +- * @flags: same flags as map update elem +- */ +-#define __BPF_FUNC_MAPPER(FN) \ +- FN(unspec), \ +- FN(map_lookup_elem), \ +- FN(map_update_elem), \ +- FN(map_delete_elem), \ +- FN(probe_read), \ +- FN(ktime_get_ns), \ +- FN(trace_printk), \ +- FN(get_prandom_u32), \ +- FN(get_smp_processor_id), \ +- FN(skb_store_bytes), \ +- FN(l3_csum_replace), \ +- FN(l4_csum_replace), \ +- FN(tail_call), \ +- FN(clone_redirect), \ +- FN(get_current_pid_tgid), \ +- FN(get_current_uid_gid), \ +- FN(get_current_comm), \ +- FN(get_cgroup_classid), \ +- FN(skb_vlan_push), \ +- FN(skb_vlan_pop), \ +- FN(skb_get_tunnel_key), \ +- FN(skb_set_tunnel_key), \ +- FN(perf_event_read), \ +- FN(redirect), \ +- FN(get_route_realm), \ +- FN(perf_event_output), \ +- FN(skb_load_bytes), \ +- FN(get_stackid), \ +- FN(csum_diff), \ +- FN(skb_get_tunnel_opt), \ +- FN(skb_set_tunnel_opt), \ +- FN(skb_change_proto), \ +- FN(skb_change_type), \ +- FN(skb_under_cgroup), \ +- FN(get_hash_recalc), \ +- FN(get_current_task), \ +- FN(probe_write_user), \ +- FN(current_task_under_cgroup), \ +- FN(skb_change_tail), \ +- FN(skb_pull_data), \ +- FN(csum_update), \ +- FN(set_hash_invalid), \ +- FN(get_numa_node_id), \ +- FN(skb_change_head), \ +- FN(xdp_adjust_head), \ +- FN(probe_read_str), \ +- FN(get_socket_cookie), \ +- FN(get_socket_uid), \ +- FN(set_hash), \ +- FN(setsockopt), \ +- FN(skb_adjust_room), \ +- FN(redirect_map), \ +- FN(sk_redirect_map), \ +- FN(sock_map_update), \ +- +-/* integer value in 'imm' field of BPF_CALL instruction selects which helper +- * function eBPF program intends to call +- */ +-#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x +-enum bpf_func_id { +- __BPF_FUNC_MAPPER(__BPF_ENUM_FN) +- __BPF_FUNC_MAX_ID, +-}; +-#undef __BPF_ENUM_FN +- +-/* All flags used by eBPF helper functions, placed here. */ +- +-/* BPF_FUNC_skb_store_bytes flags. */ +-#define BPF_F_RECOMPUTE_CSUM (1ULL << 0) +-#define BPF_F_INVALIDATE_HASH (1ULL << 1) +- +-/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. +- * First 4 bits are for passing the header field size. +- */ +-#define BPF_F_HDR_FIELD_MASK 0xfULL +- +-/* BPF_FUNC_l4_csum_replace flags. */ +-#define BPF_F_PSEUDO_HDR (1ULL << 4) +-#define BPF_F_MARK_MANGLED_0 (1ULL << 5) +-#define BPF_F_MARK_ENFORCE (1ULL << 6) +- +-/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ +-#define BPF_F_INGRESS (1ULL << 0) +- +-/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ +-#define BPF_F_TUNINFO_IPV6 (1ULL << 0) +- +-/* BPF_FUNC_get_stackid flags. */ +-#define BPF_F_SKIP_FIELD_MASK 0xffULL +-#define BPF_F_USER_STACK (1ULL << 8) +-#define BPF_F_FAST_STACK_CMP (1ULL << 9) +-#define BPF_F_REUSE_STACKID (1ULL << 10) +- +-/* BPF_FUNC_skb_set_tunnel_key flags. */ +-#define BPF_F_ZERO_CSUM_TX (1ULL << 1) +-#define BPF_F_DONT_FRAGMENT (1ULL << 2) +- +-/* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */ +-#define BPF_F_INDEX_MASK 0xffffffffULL +-#define BPF_F_CURRENT_CPU BPF_F_INDEX_MASK +-/* BPF_FUNC_perf_event_output for sk_buff input context. */ +-#define BPF_F_CTXLEN_MASK (0xfffffULL << 32) +- +-/* Mode for BPF_FUNC_skb_adjust_room helper. */ +-enum bpf_adj_room_mode { +- BPF_ADJ_ROOM_NET, +-}; +- +-/* user accessible mirror of in-kernel sk_buff. +- * new fields can only be added to the end of this structure +- */ +-struct __sk_buff { +- __u32 len; +- __u32 pkt_type; +- __u32 mark; +- __u32 queue_mapping; +- __u32 protocol; +- __u32 vlan_present; +- __u32 vlan_tci; +- __u32 vlan_proto; +- __u32 priority; +- __u32 ingress_ifindex; +- __u32 ifindex; +- __u32 tc_index; +- __u32 cb[5]; +- __u32 hash; +- __u32 tc_classid; +- __u32 data; +- __u32 data_end; +- __u32 napi_id; +- +- /* accessed by BPF_PROG_TYPE_sk_skb types */ +- __u32 family; +- __u32 remote_ip4; /* Stored in network byte order */ +- __u32 local_ip4; /* Stored in network byte order */ +- __u32 remote_ip6[4]; /* Stored in network byte order */ +- __u32 local_ip6[4]; /* Stored in network byte order */ +- __u32 remote_port; /* Stored in network byte order */ +- __u32 local_port; /* stored in host byte order */ +-}; +- +-struct bpf_tunnel_key { +- __u32 tunnel_id; +- union { +- __u32 remote_ipv4; +- __u32 remote_ipv6[4]; +- }; +- __u8 tunnel_tos; +- __u8 tunnel_ttl; +- __u16 tunnel_ext; +- __u32 tunnel_label; +-}; +- +-/* Generic BPF return codes which all BPF program types may support. +- * The values are binary compatible with their TC_ACT_* counter-part to +- * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT +- * programs. +- * +- * XDP is handled seprately, see XDP_*. +- */ +-enum bpf_ret_code { +- BPF_OK = 0, +- /* 1 reserved */ +- BPF_DROP = 2, +- /* 3-6 reserved */ +- BPF_REDIRECT = 7, +- /* >127 are reserved for prog type specific return codes */ +-}; +- +-struct bpf_sock { +- __u32 bound_dev_if; +- __u32 family; +- __u32 type; +- __u32 protocol; +- __u32 mark; +- __u32 priority; +-}; +- +-#define XDP_PACKET_HEADROOM 256 +- +-/* User return codes for XDP prog type. +- * A valid XDP program must return one of these defined values. All other +- * return codes are reserved for future use. Unknown return codes will +- * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). +- */ +-enum xdp_action { +- XDP_ABORTED = 0, +- XDP_DROP, +- XDP_PASS, +- XDP_TX, +- XDP_REDIRECT, +-}; +- +-/* user accessible metadata for XDP packet hook +- * new fields must be added to the end of this structure +- */ +-struct xdp_md { +- __u32 data; +- __u32 data_end; +-}; +- +-enum sk_action { +- SK_ABORTED = 0, +- SK_DROP, +- SK_REDIRECT, +-}; +- +-#define BPF_TAG_SIZE 8 +- +-struct bpf_prog_info { +- __u32 type; +- __u32 id; +- __u8 tag[BPF_TAG_SIZE]; +- __u32 jited_prog_len; +- __u32 xlated_prog_len; +- __aligned_u64 jited_prog_insns; +- __aligned_u64 xlated_prog_insns; +-} __attribute__((aligned(8))); +- +-struct bpf_map_info { +- __u32 type; +- __u32 id; +- __u32 key_size; +- __u32 value_size; +- __u32 max_entries; +- __u32 map_flags; +-} __attribute__((aligned(8))); +- +-/* User bpf_sock_ops struct to access socket values and specify request ops +- * and their replies. +- * Some of this fields are in network (bigendian) byte order and may need +- * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). +- * New fields can only be added at the end of this structure +- */ +-struct bpf_sock_ops { +- __u32 op; +- union { +- __u32 reply; +- __u32 replylong[4]; +- }; +- __u32 family; +- __u32 remote_ip4; /* Stored in network byte order */ +- __u32 local_ip4; /* Stored in network byte order */ +- __u32 remote_ip6[4]; /* Stored in network byte order */ +- __u32 local_ip6[4]; /* Stored in network byte order */ +- __u32 remote_port; /* Stored in network byte order */ +- __u32 local_port; /* stored in host byte order */ +-}; +- +-/* List of known BPF sock_ops operators. +- * New entries can only be added at the end +- */ +-enum { +- BPF_SOCK_OPS_VOID, +- BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or +- * -1 if default value should be used +- */ +- BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized +- * window (in packets) or -1 if default +- * value should be used +- */ +- BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an +- * active connection is initialized +- */ +- BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an +- * active connection is +- * established +- */ +- BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a +- * passive connection is +- * established +- */ +- BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control +- * needs ECN +- */ +-}; +- +-#define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ +-#define TCP_BPF_SNDCWND_CLAMP 1002 /* Set sndcwnd_clamp */ +- +-#endif /* __LINUX_BPF_H__ */ +diff --git a/include/linux/bpf_common.h b/include/linux/bpf_common.h +deleted file mode 100644 +index afe7433..0000000 +--- a/include/linux/bpf_common.h ++++ /dev/null +@@ -1,55 +0,0 @@ +-#ifndef __LINUX_BPF_COMMON_H__ +-#define __LINUX_BPF_COMMON_H__ +- +-/* Instruction classes */ +-#define BPF_CLASS(code) ((code) & 0x07) +-#define BPF_LD 0x00 +-#define BPF_LDX 0x01 +-#define BPF_ST 0x02 +-#define BPF_STX 0x03 +-#define BPF_ALU 0x04 +-#define BPF_JMP 0x05 +-#define BPF_RET 0x06 +-#define BPF_MISC 0x07 +- +-/* ld/ldx fields */ +-#define BPF_SIZE(code) ((code) & 0x18) +-#define BPF_W 0x00 +-#define BPF_H 0x08 +-#define BPF_B 0x10 +-#define BPF_MODE(code) ((code) & 0xe0) +-#define BPF_IMM 0x00 +-#define BPF_ABS 0x20 +-#define BPF_IND 0x40 +-#define BPF_MEM 0x60 +-#define BPF_LEN 0x80 +-#define BPF_MSH 0xa0 +- +-/* alu/jmp fields */ +-#define BPF_OP(code) ((code) & 0xf0) +-#define BPF_ADD 0x00 +-#define BPF_SUB 0x10 +-#define BPF_MUL 0x20 +-#define BPF_DIV 0x30 +-#define BPF_OR 0x40 +-#define BPF_AND 0x50 +-#define BPF_LSH 0x60 +-#define BPF_RSH 0x70 +-#define BPF_NEG 0x80 +-#define BPF_MOD 0x90 +-#define BPF_XOR 0xa0 +- +-#define BPF_JA 0x00 +-#define BPF_JEQ 0x10 +-#define BPF_JGT 0x20 +-#define BPF_JGE 0x30 +-#define BPF_JSET 0x40 +-#define BPF_SRC(code) ((code) & 0x08) +-#define BPF_K 0x00 +-#define BPF_X 0x08 +- +-#ifndef BPF_MAXINSNS +-#define BPF_MAXINSNS 4096 +-#endif +- +-#endif /* __LINUX_BPF_COMMON_H__ */ +diff --git a/include/linux/can.h b/include/linux/can.h +deleted file mode 100644 +index f7a810d..0000000 +--- a/include/linux/can.h ++++ /dev/null +@@ -1,201 +0,0 @@ +-/* +- * linux/can.h +- * +- * Definitions for CAN network layer (socket addr / CAN frame / CAN filter) +- * +- * Authors: Oliver Hartkopp +- * Urs Thuermann +- * Copyright (c) 2002-2007 Volkswagen Group Electronic Research +- * All rights reserved. +- * +- * Redistribution and use in source and binary forms, with or without +- * modification, are permitted provided that the following conditions +- * are met: +- * 1. Redistributions of source code must retain the above copyright +- * notice, this list of conditions and the following disclaimer. +- * 2. Redistributions in binary form must reproduce the above copyright +- * notice, this list of conditions and the following disclaimer in the +- * documentation and/or other materials provided with the distribution. +- * 3. Neither the name of Volkswagen nor the names of its contributors +- * may be used to endorse or promote products derived from this software +- * without specific prior written permission. +- * +- * Alternatively, provided that this notice is retained in full, this +- * software may be distributed under the terms of the GNU General +- * Public License ("GPL") version 2, in which case the provisions of the +- * GPL apply INSTEAD OF those given above. +- * +- * The provided data structures and external interfaces from this code +- * are not restricted to be used by modules with a GPL compatible license. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +- * DAMAGE. +- */ +- +-#ifndef _CAN_H +-#define _CAN_H +- +-#include +-#include +- +-/* controller area network (CAN) kernel definitions */ +- +-/* special address description flags for the CAN_ID */ +-#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */ +-#define CAN_RTR_FLAG 0x40000000U /* remote transmission request */ +-#define CAN_ERR_FLAG 0x20000000U /* error message frame */ +- +-/* valid bits in CAN ID for frame formats */ +-#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */ +-#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */ +-#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */ +- +-/* +- * Controller Area Network Identifier structure +- * +- * bit 0-28 : CAN identifier (11/29 bit) +- * bit 29 : error message frame flag (0 = data frame, 1 = error message) +- * bit 30 : remote transmission request flag (1 = rtr frame) +- * bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit) +- */ +-typedef __u32 canid_t; +- +-#define CAN_SFF_ID_BITS 11 +-#define CAN_EFF_ID_BITS 29 +- +-/* +- * Controller Area Network Error Message Frame Mask structure +- * +- * bit 0-28 : error class mask (see include/linux/can/error.h) +- * bit 29-31 : set to zero +- */ +-typedef __u32 can_err_mask_t; +- +-/* CAN payload length and DLC definitions according to ISO 11898-1 */ +-#define CAN_MAX_DLC 8 +-#define CAN_MAX_DLEN 8 +- +-/* CAN FD payload length and DLC definitions according to ISO 11898-7 */ +-#define CANFD_MAX_DLC 15 +-#define CANFD_MAX_DLEN 64 +- +-/** +- * struct can_frame - basic CAN frame structure +- * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition +- * @can_dlc: frame payload length in byte (0 .. 8) aka data length code +- * N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1 +- * mapping of the 'data length code' to the real payload length +- * @__pad: padding +- * @__res0: reserved / padding +- * @__res1: reserved / padding +- * @data: CAN frame payload (up to 8 byte) +- */ +-struct can_frame { +- canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ +- __u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ +- __u8 __pad; /* padding */ +- __u8 __res0; /* reserved / padding */ +- __u8 __res1; /* reserved / padding */ +- __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8))); +-}; +- +-/* +- * defined bits for canfd_frame.flags +- * +- * The use of struct canfd_frame implies the Extended Data Length (EDL) bit to +- * be set in the CAN frame bitstream on the wire. The EDL bit switch turns +- * the CAN controllers bitstream processor into the CAN FD mode which creates +- * two new options within the CAN FD frame specification: +- * +- * Bit Rate Switch - to indicate a second bitrate is/was used for the payload +- * Error State Indicator - represents the error state of the transmitting node +- * +- * As the CANFD_ESI bit is internally generated by the transmitting CAN +- * controller only the CANFD_BRS bit is relevant for real CAN controllers when +- * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make +- * sense for virtual CAN interfaces to test applications with echoed frames. +- */ +-#define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */ +-#define CANFD_ESI 0x02 /* error state indicator of the transmitting node */ +- +-/** +- * struct canfd_frame - CAN flexible data rate frame structure +- * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition +- * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN) +- * @flags: additional flags for CAN FD +- * @__res0: reserved / padding +- * @__res1: reserved / padding +- * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte) +- */ +-struct canfd_frame { +- canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ +- __u8 len; /* frame payload length in byte */ +- __u8 flags; /* additional flags for CAN FD */ +- __u8 __res0; /* reserved / padding */ +- __u8 __res1; /* reserved / padding */ +- __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); +-}; +- +-#define CAN_MTU (sizeof(struct can_frame)) +-#define CANFD_MTU (sizeof(struct canfd_frame)) +- +-/* particular protocols of the protocol family PF_CAN */ +-#define CAN_RAW 1 /* RAW sockets */ +-#define CAN_BCM 2 /* Broadcast Manager */ +-#define CAN_TP16 3 /* VAG Transport Protocol v1.6 */ +-#define CAN_TP20 4 /* VAG Transport Protocol v2.0 */ +-#define CAN_MCNET 5 /* Bosch MCNet */ +-#define CAN_ISOTP 6 /* ISO 15765-2 Transport Protocol */ +-#define CAN_NPROTO 7 +- +-#define SOL_CAN_BASE 100 +- +-/** +- * struct sockaddr_can - the sockaddr structure for CAN sockets +- * @can_family: address family number AF_CAN. +- * @can_ifindex: CAN network interface index. +- * @can_addr: protocol specific address information +- */ +-struct sockaddr_can { +- __kernel_sa_family_t can_family; +- int can_ifindex; +- union { +- /* transport protocol class address information (e.g. ISOTP) */ +- struct { canid_t rx_id, tx_id; } tp; +- +- /* reserved for future CAN protocols address information */ +- } can_addr; +-}; +- +-/** +- * struct can_filter - CAN ID based filter in can_register(). +- * @can_id: relevant bits of CAN ID which are not masked out. +- * @can_mask: CAN mask (see description) +- * +- * Description: +- * A filter matches, when +- * +- * & mask == can_id & mask +- * +- * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can +- * filter for error message frames (CAN_ERR_FLAG bit set in mask). +- */ +-struct can_filter { +- canid_t can_id; +- canid_t can_mask; +-}; +- +-#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */ +-#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */ +- +-#endif /* !_UAPI_CAN_H */ +diff --git a/include/linux/can/netlink.h b/include/linux/can/netlink.h +deleted file mode 100644 +index b9214bd..0000000 +--- a/include/linux/can/netlink.h ++++ /dev/null +@@ -1,142 +0,0 @@ +-/* +- * linux/can/netlink.h +- * +- * Definitions for the CAN netlink interface +- * +- * Copyright (c) 2009 Wolfgang Grandegger +- * +- * This program is free software; you can redistribute it and/or modify +- * it under the terms of the version 2 of the GNU General Public License +- * as published by the Free Software Foundation +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- */ +- +-#ifndef _CAN_NETLINK_H +-#define _CAN_NETLINK_H +- +-#include +- +-/* +- * CAN bit-timing parameters +- * +- * For further information, please read chapter "8 BIT TIMING +- * REQUIREMENTS" of the "Bosch CAN Specification version 2.0" +- * at http://www.semiconductors.bosch.de/pdf/can2spec.pdf. +- */ +-struct can_bittiming { +- __u32 bitrate; /* Bit-rate in bits/second */ +- __u32 sample_point; /* Sample point in one-tenth of a percent */ +- __u32 tq; /* Time quanta (TQ) in nanoseconds */ +- __u32 prop_seg; /* Propagation segment in TQs */ +- __u32 phase_seg1; /* Phase buffer segment 1 in TQs */ +- __u32 phase_seg2; /* Phase buffer segment 2 in TQs */ +- __u32 sjw; /* Synchronisation jump width in TQs */ +- __u32 brp; /* Bit-rate prescaler */ +-}; +- +-/* +- * CAN harware-dependent bit-timing constant +- * +- * Used for calculating and checking bit-timing parameters +- */ +-struct can_bittiming_const { +- char name[16]; /* Name of the CAN controller hardware */ +- __u32 tseg1_min; /* Time segement 1 = prop_seg + phase_seg1 */ +- __u32 tseg1_max; +- __u32 tseg2_min; /* Time segement 2 = phase_seg2 */ +- __u32 tseg2_max; +- __u32 sjw_max; /* Synchronisation jump width */ +- __u32 brp_min; /* Bit-rate prescaler */ +- __u32 brp_max; +- __u32 brp_inc; +-}; +- +-/* +- * CAN clock parameters +- */ +-struct can_clock { +- __u32 freq; /* CAN system clock frequency in Hz */ +-}; +- +-/* +- * CAN operational and error states +- */ +-enum can_state { +- CAN_STATE_ERROR_ACTIVE = 0, /* RX/TX error count < 96 */ +- CAN_STATE_ERROR_WARNING, /* RX/TX error count < 128 */ +- CAN_STATE_ERROR_PASSIVE, /* RX/TX error count < 256 */ +- CAN_STATE_BUS_OFF, /* RX/TX error count >= 256 */ +- CAN_STATE_STOPPED, /* Device is stopped */ +- CAN_STATE_SLEEPING, /* Device is sleeping */ +- CAN_STATE_MAX +-}; +- +-/* +- * CAN bus error counters +- */ +-struct can_berr_counter { +- __u16 txerr; +- __u16 rxerr; +-}; +- +-/* +- * CAN controller mode +- */ +-struct can_ctrlmode { +- __u32 mask; +- __u32 flags; +-}; +- +-#define CAN_CTRLMODE_LOOPBACK 0x01 /* Loopback mode */ +-#define CAN_CTRLMODE_LISTENONLY 0x02 /* Listen-only mode */ +-#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */ +-#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */ +-#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ +-#define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */ +-#define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */ +-#define CAN_CTRLMODE_FD_NON_ISO 0x80 /* CAN FD in non-ISO mode */ +- +-/* +- * CAN device statistics +- */ +-struct can_device_stats { +- __u32 bus_error; /* Bus errors */ +- __u32 error_warning; /* Changes to error warning state */ +- __u32 error_passive; /* Changes to error passive state */ +- __u32 bus_off; /* Changes to bus off state */ +- __u32 arbitration_lost; /* Arbitration lost errors */ +- __u32 restarts; /* CAN controller re-starts */ +-}; +- +-/* +- * CAN netlink interface +- */ +-enum { +- IFLA_CAN_UNSPEC, +- IFLA_CAN_BITTIMING, +- IFLA_CAN_BITTIMING_CONST, +- IFLA_CAN_CLOCK, +- IFLA_CAN_STATE, +- IFLA_CAN_CTRLMODE, +- IFLA_CAN_RESTART_MS, +- IFLA_CAN_RESTART, +- IFLA_CAN_BERR_COUNTER, +- IFLA_CAN_DATA_BITTIMING, +- IFLA_CAN_DATA_BITTIMING_CONST, +- IFLA_CAN_TERMINATION, +- IFLA_CAN_TERMINATION_CONST, +- IFLA_CAN_BITRATE_CONST, +- IFLA_CAN_DATA_BITRATE_CONST, +- __IFLA_CAN_MAX +-}; +- +-#define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1) +- +-/* u16 termination range: 1..65535 Ohms */ +-#define CAN_TERMINATION_DISABLED 0 +- +-#endif /* !_UAPI_CAN_NETLINK_H */ +diff --git a/include/linux/can/vxcan.h b/include/linux/can/vxcan.h +deleted file mode 100644 +index 5b29e8a..0000000 +--- a/include/linux/can/vxcan.h ++++ /dev/null +@@ -1,12 +0,0 @@ +-#ifndef _CAN_VXCAN_H +-#define _CAN_VXCAN_H +- +-enum { +- VXCAN_INFO_UNSPEC, +- VXCAN_INFO_PEER, +- +- __VXCAN_INFO_MAX +-#define VXCAN_INFO_MAX (__VXCAN_INFO_MAX - 1) +-}; +- +-#endif +diff --git a/include/linux/devlink.h b/include/linux/devlink.h +deleted file mode 100644 +index a62695e..0000000 +--- a/include/linux/devlink.h ++++ /dev/null +@@ -1,247 +0,0 @@ +-/* +- * include/uapi/linux/devlink.h - Network physical device Netlink interface +- * Copyright (c) 2016 Mellanox Technologies. All rights reserved. +- * Copyright (c) 2016 Jiri Pirko +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_DEVLINK_H_ +-#define _LINUX_DEVLINK_H_ +- +-#define DEVLINK_GENL_NAME "devlink" +-#define DEVLINK_GENL_VERSION 0x1 +-#define DEVLINK_GENL_MCGRP_CONFIG_NAME "config" +- +-enum devlink_command { +- /* don't change the order or add anything between, this is ABI! */ +- DEVLINK_CMD_UNSPEC, +- +- DEVLINK_CMD_GET, /* can dump */ +- DEVLINK_CMD_SET, +- DEVLINK_CMD_NEW, +- DEVLINK_CMD_DEL, +- +- DEVLINK_CMD_PORT_GET, /* can dump */ +- DEVLINK_CMD_PORT_SET, +- DEVLINK_CMD_PORT_NEW, +- DEVLINK_CMD_PORT_DEL, +- +- DEVLINK_CMD_PORT_SPLIT, +- DEVLINK_CMD_PORT_UNSPLIT, +- +- DEVLINK_CMD_SB_GET, /* can dump */ +- DEVLINK_CMD_SB_SET, +- DEVLINK_CMD_SB_NEW, +- DEVLINK_CMD_SB_DEL, +- +- DEVLINK_CMD_SB_POOL_GET, /* can dump */ +- DEVLINK_CMD_SB_POOL_SET, +- DEVLINK_CMD_SB_POOL_NEW, +- DEVLINK_CMD_SB_POOL_DEL, +- +- DEVLINK_CMD_SB_PORT_POOL_GET, /* can dump */ +- DEVLINK_CMD_SB_PORT_POOL_SET, +- DEVLINK_CMD_SB_PORT_POOL_NEW, +- DEVLINK_CMD_SB_PORT_POOL_DEL, +- +- DEVLINK_CMD_SB_TC_POOL_BIND_GET, /* can dump */ +- DEVLINK_CMD_SB_TC_POOL_BIND_SET, +- DEVLINK_CMD_SB_TC_POOL_BIND_NEW, +- DEVLINK_CMD_SB_TC_POOL_BIND_DEL, +- +- /* Shared buffer occupancy monitoring commands */ +- DEVLINK_CMD_SB_OCC_SNAPSHOT, +- DEVLINK_CMD_SB_OCC_MAX_CLEAR, +- +- DEVLINK_CMD_ESWITCH_GET, +-#define DEVLINK_CMD_ESWITCH_MODE_GET /* obsolete, never use this! */ \ +- DEVLINK_CMD_ESWITCH_GET +- +- DEVLINK_CMD_ESWITCH_SET, +-#define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \ +- DEVLINK_CMD_ESWITCH_SET +- +- DEVLINK_CMD_DPIPE_TABLE_GET, +- DEVLINK_CMD_DPIPE_ENTRIES_GET, +- DEVLINK_CMD_DPIPE_HEADERS_GET, +- DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, +- +- /* add new commands above here */ +- __DEVLINK_CMD_MAX, +- DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 +-}; +- +-enum devlink_port_type { +- DEVLINK_PORT_TYPE_NOTSET, +- DEVLINK_PORT_TYPE_AUTO, +- DEVLINK_PORT_TYPE_ETH, +- DEVLINK_PORT_TYPE_IB, +-}; +- +-enum devlink_sb_pool_type { +- DEVLINK_SB_POOL_TYPE_INGRESS, +- DEVLINK_SB_POOL_TYPE_EGRESS, +-}; +- +-/* static threshold - limiting the maximum number of bytes. +- * dynamic threshold - limiting the maximum number of bytes +- * based on the currently available free space in the shared buffer pool. +- * In this mode, the maximum quota is calculated based +- * on the following formula: +- * max_quota = alpha / (1 + alpha) * Free_Buffer +- * While Free_Buffer is the amount of none-occupied buffer associated to +- * the relevant pool. +- * The value range which can be passed is 0-20 and serves +- * for computation of alpha by following formula: +- * alpha = 2 ^ (passed_value - 10) +- */ +- +-enum devlink_sb_threshold_type { +- DEVLINK_SB_THRESHOLD_TYPE_STATIC, +- DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC, +-}; +- +-#define DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX 20 +- +-enum devlink_eswitch_mode { +- DEVLINK_ESWITCH_MODE_LEGACY, +- DEVLINK_ESWITCH_MODE_SWITCHDEV, +-}; +- +-enum devlink_eswitch_inline_mode { +- DEVLINK_ESWITCH_INLINE_MODE_NONE, +- DEVLINK_ESWITCH_INLINE_MODE_LINK, +- DEVLINK_ESWITCH_INLINE_MODE_NETWORK, +- DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT, +-}; +- +-enum devlink_eswitch_encap_mode { +- DEVLINK_ESWITCH_ENCAP_MODE_NONE, +- DEVLINK_ESWITCH_ENCAP_MODE_BASIC, +-}; +- +-enum devlink_attr { +- /* don't change the order or add anything between, this is ABI! */ +- DEVLINK_ATTR_UNSPEC, +- +- /* bus name + dev name together are a handle for devlink entity */ +- DEVLINK_ATTR_BUS_NAME, /* string */ +- DEVLINK_ATTR_DEV_NAME, /* string */ +- +- DEVLINK_ATTR_PORT_INDEX, /* u32 */ +- DEVLINK_ATTR_PORT_TYPE, /* u16 */ +- DEVLINK_ATTR_PORT_DESIRED_TYPE, /* u16 */ +- DEVLINK_ATTR_PORT_NETDEV_IFINDEX, /* u32 */ +- DEVLINK_ATTR_PORT_NETDEV_NAME, /* string */ +- DEVLINK_ATTR_PORT_IBDEV_NAME, /* string */ +- DEVLINK_ATTR_PORT_SPLIT_COUNT, /* u32 */ +- DEVLINK_ATTR_PORT_SPLIT_GROUP, /* u32 */ +- DEVLINK_ATTR_SB_INDEX, /* u32 */ +- DEVLINK_ATTR_SB_SIZE, /* u32 */ +- DEVLINK_ATTR_SB_INGRESS_POOL_COUNT, /* u16 */ +- DEVLINK_ATTR_SB_EGRESS_POOL_COUNT, /* u16 */ +- DEVLINK_ATTR_SB_INGRESS_TC_COUNT, /* u16 */ +- DEVLINK_ATTR_SB_EGRESS_TC_COUNT, /* u16 */ +- DEVLINK_ATTR_SB_POOL_INDEX, /* u16 */ +- DEVLINK_ATTR_SB_POOL_TYPE, /* u8 */ +- DEVLINK_ATTR_SB_POOL_SIZE, /* u32 */ +- DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE, /* u8 */ +- DEVLINK_ATTR_SB_THRESHOLD, /* u32 */ +- DEVLINK_ATTR_SB_TC_INDEX, /* u16 */ +- DEVLINK_ATTR_SB_OCC_CUR, /* u32 */ +- DEVLINK_ATTR_SB_OCC_MAX, /* u32 */ +- DEVLINK_ATTR_ESWITCH_MODE, /* u16 */ +- DEVLINK_ATTR_ESWITCH_INLINE_MODE, /* u8 */ +- +- DEVLINK_ATTR_DPIPE_TABLES, /* nested */ +- DEVLINK_ATTR_DPIPE_TABLE, /* nested */ +- DEVLINK_ATTR_DPIPE_TABLE_NAME, /* string */ +- DEVLINK_ATTR_DPIPE_TABLE_SIZE, /* u64 */ +- DEVLINK_ATTR_DPIPE_TABLE_MATCHES, /* nested */ +- DEVLINK_ATTR_DPIPE_TABLE_ACTIONS, /* nested */ +- DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, /* u8 */ +- +- DEVLINK_ATTR_DPIPE_ENTRIES, /* nested */ +- DEVLINK_ATTR_DPIPE_ENTRY, /* nested */ +- DEVLINK_ATTR_DPIPE_ENTRY_INDEX, /* u64 */ +- DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES, /* nested */ +- DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES, /* nested */ +- DEVLINK_ATTR_DPIPE_ENTRY_COUNTER, /* u64 */ +- +- DEVLINK_ATTR_DPIPE_MATCH, /* nested */ +- DEVLINK_ATTR_DPIPE_MATCH_VALUE, /* nested */ +- DEVLINK_ATTR_DPIPE_MATCH_TYPE, /* u32 */ +- +- DEVLINK_ATTR_DPIPE_ACTION, /* nested */ +- DEVLINK_ATTR_DPIPE_ACTION_VALUE, /* nested */ +- DEVLINK_ATTR_DPIPE_ACTION_TYPE, /* u32 */ +- +- DEVLINK_ATTR_DPIPE_VALUE, +- DEVLINK_ATTR_DPIPE_VALUE_MASK, +- DEVLINK_ATTR_DPIPE_VALUE_MAPPING, /* u32 */ +- +- DEVLINK_ATTR_DPIPE_HEADERS, /* nested */ +- DEVLINK_ATTR_DPIPE_HEADER, /* nested */ +- DEVLINK_ATTR_DPIPE_HEADER_NAME, /* string */ +- DEVLINK_ATTR_DPIPE_HEADER_ID, /* u32 */ +- DEVLINK_ATTR_DPIPE_HEADER_FIELDS, /* nested */ +- DEVLINK_ATTR_DPIPE_HEADER_GLOBAL, /* u8 */ +- DEVLINK_ATTR_DPIPE_HEADER_INDEX, /* u32 */ +- +- DEVLINK_ATTR_DPIPE_FIELD, /* nested */ +- DEVLINK_ATTR_DPIPE_FIELD_NAME, /* string */ +- DEVLINK_ATTR_DPIPE_FIELD_ID, /* u32 */ +- DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH, /* u32 */ +- DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE, /* u32 */ +- +- DEVLINK_ATTR_PAD, +- +- DEVLINK_ATTR_ESWITCH_ENCAP_MODE, /* u8 */ +- +- /* add new attributes above here, update the policy in devlink.c */ +- +- __DEVLINK_ATTR_MAX, +- DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1 +-}; +- +-/* Mapping between internal resource described by the field and system +- * structure +- */ +-enum devlink_dpipe_field_mapping_type { +- DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE, +- DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX, +-}; +- +-/* Match type - specify the type of the match */ +-enum devlink_dpipe_match_type { +- DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT, +-}; +- +-/* Action type - specify the action type */ +-enum devlink_dpipe_action_type { +- DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY, +-}; +- +-enum devlink_dpipe_field_ethernet_id { +- DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC, +-}; +- +-enum devlink_dpipe_field_ipv4_id { +- DEVLINK_DPIPE_FIELD_IPV4_DST_IP, +-}; +- +-enum devlink_dpipe_field_ipv6_id { +- DEVLINK_DPIPE_FIELD_IPV6_DST_IP, +-}; +- +-enum devlink_dpipe_header_id { +- DEVLINK_DPIPE_HEADER_ETHERNET, +- DEVLINK_DPIPE_HEADER_IPV4, +- DEVLINK_DPIPE_HEADER_IPV6, +-}; +- +-#endif /* _LINUX_DEVLINK_H_ */ +diff --git a/include/linux/elf-em.h b/include/linux/elf-em.h +deleted file mode 100644 +index 9cd1de9..0000000 +--- a/include/linux/elf-em.h ++++ /dev/null +@@ -1,60 +0,0 @@ +-#ifndef _LINUX_ELF_EM_H +-#define _LINUX_ELF_EM_H +- +-/* These constants define the various ELF target machines */ +-#define EM_NONE 0 +-#define EM_M32 1 +-#define EM_SPARC 2 +-#define EM_386 3 +-#define EM_68K 4 +-#define EM_88K 5 +-#define EM_486 6 /* Perhaps disused */ +-#define EM_860 7 +-#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ +- /* Next two are historical and binaries and +- modules of these types will be rejected by +- Linux. */ +-#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ +-#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */ +- +-#define EM_PARISC 15 /* HPPA */ +-#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +-#define EM_PPC 20 /* PowerPC */ +-#define EM_PPC64 21 /* PowerPC64 */ +-#define EM_SPU 23 /* Cell BE SPU */ +-#define EM_ARM 40 /* ARM 32 bit */ +-#define EM_SH 42 /* SuperH */ +-#define EM_SPARCV9 43 /* SPARC v9 64-bit */ +-#define EM_H8_300 46 /* Renesas H8/300 */ +-#define EM_IA_64 50 /* HP/Intel IA-64 */ +-#define EM_X86_64 62 /* AMD x86-64 */ +-#define EM_S390 22 /* IBM S/390 */ +-#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ +-#define EM_M32R 88 /* Renesas M32R */ +-#define EM_MN10300 89 /* Panasonic/MEI MN10300, AM33 */ +-#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +-#define EM_BLACKFIN 106 /* ADI Blackfin Processor */ +-#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */ +-#define EM_TI_C6000 140 /* TI C6X DSPs */ +-#define EM_AARCH64 183 /* ARM 64 bit */ +-#define EM_TILEPRO 188 /* Tilera TILEPro */ +-#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ +-#define EM_TILEGX 191 /* Tilera TILE-Gx */ +-#define EM_BPF 247 /* Linux BPF - in-kernel virtual machine */ +-#define EM_FRV 0x5441 /* Fujitsu FR-V */ +- +-/* +- * This is an interim value that we will use until the committee comes +- * up with a final number. +- */ +-#define EM_ALPHA 0x9026 +- +-/* Bogus old m32r magic number, used by old tools. */ +-#define EM_CYGNUS_M32R 0x9041 +-/* This is the old interim value for S/390 architecture */ +-#define EM_S390_OLD 0xA390 +-/* Also Panasonic/MEI MN10300, AM33 */ +-#define EM_CYGNUS_MN10300 0xbeef +- +- +-#endif /* _LINUX_ELF_EM_H */ +diff --git a/include/linux/fib_rules.h b/include/linux/fib_rules.h +deleted file mode 100644 +index bbf02a6..0000000 +--- a/include/linux/fib_rules.h ++++ /dev/null +@@ -1,80 +0,0 @@ +-#ifndef __LINUX_FIB_RULES_H +-#define __LINUX_FIB_RULES_H +- +-#include +-#include +- +-/* rule is permanent, and cannot be deleted */ +-#define FIB_RULE_PERMANENT 0x00000001 +-#define FIB_RULE_INVERT 0x00000002 +-#define FIB_RULE_UNRESOLVED 0x00000004 +-#define FIB_RULE_IIF_DETACHED 0x00000008 +-#define FIB_RULE_DEV_DETACHED FIB_RULE_IIF_DETACHED +-#define FIB_RULE_OIF_DETACHED 0x00000010 +- +-/* try to find source address in routing lookups */ +-#define FIB_RULE_FIND_SADDR 0x00010000 +- +-struct fib_rule_hdr { +- __u8 family; +- __u8 dst_len; +- __u8 src_len; +- __u8 tos; +- +- __u8 table; +- __u8 res1; /* reserved */ +- __u8 res2; /* reserved */ +- __u8 action; +- +- __u32 flags; +-}; +- +-struct fib_rule_uid_range { +- __u32 start; +- __u32 end; +-}; +- +-enum { +- FRA_UNSPEC, +- FRA_DST, /* destination address */ +- FRA_SRC, /* source address */ +- FRA_IIFNAME, /* interface name */ +-#define FRA_IFNAME FRA_IIFNAME +- FRA_GOTO, /* target to jump to (FR_ACT_GOTO) */ +- FRA_UNUSED2, +- FRA_PRIORITY, /* priority/preference */ +- FRA_UNUSED3, +- FRA_UNUSED4, +- FRA_UNUSED5, +- FRA_FWMARK, /* mark */ +- FRA_FLOW, /* flow/class id */ +- FRA_TUN_ID, +- FRA_SUPPRESS_IFGROUP, +- FRA_SUPPRESS_PREFIXLEN, +- FRA_TABLE, /* Extended table id */ +- FRA_FWMASK, /* mask for netfilter mark */ +- FRA_OIFNAME, +- FRA_PAD, +- FRA_L3MDEV, /* iif or oif is l3mdev goto its table */ +- FRA_UID_RANGE, /* UID range */ +- __FRA_MAX +-}; +- +-#define FRA_MAX (__FRA_MAX - 1) +- +-enum { +- FR_ACT_UNSPEC, +- FR_ACT_TO_TBL, /* Pass to fixed table */ +- FR_ACT_GOTO, /* Jump to another rule */ +- FR_ACT_NOP, /* No operation */ +- FR_ACT_RES3, +- FR_ACT_RES4, +- FR_ACT_BLACKHOLE, /* Drop without notification */ +- FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */ +- FR_ACT_PROHIBIT, /* Drop with EACCES */ +- __FR_ACT_MAX, +-}; +- +-#define FR_ACT_MAX (__FR_ACT_MAX - 1) +- +-#endif +diff --git a/include/linux/filter.h b/include/linux/filter.h +deleted file mode 100644 +index e4f2f74..0000000 +--- a/include/linux/filter.h ++++ /dev/null +@@ -1,89 +0,0 @@ +-/* +- * Linux Socket Filter Data Structures +- */ +- +-#ifndef __LINUX_FILTER_H__ +-#define __LINUX_FILTER_H__ +- +- +-#include +-#include +- +-/* +- * Current version of the filter code architecture. +- */ +-#define BPF_MAJOR_VERSION 1 +-#define BPF_MINOR_VERSION 1 +- +-/* +- * Try and keep these values and structures similar to BSD, especially +- * the BPF code definitions which need to match so you can share filters +- */ +- +-struct sock_filter { /* Filter block */ +- __u16 code; /* Actual filter code */ +- __u8 jt; /* Jump true */ +- __u8 jf; /* Jump false */ +- __u32 k; /* Generic multiuse field */ +-}; +- +-struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ +- unsigned short len; /* Number of filter blocks */ +- struct sock_filter *filter; +-}; +- +-/* ret - BPF_K and BPF_X also apply */ +-#define BPF_RVAL(code) ((code) & 0x18) +-#define BPF_A 0x10 +- +-/* misc */ +-#define BPF_MISCOP(code) ((code) & 0xf8) +-#define BPF_TAX 0x00 +-#define BPF_TXA 0x80 +- +-/* +- * Macros for filter block array initializers. +- */ +-#ifndef BPF_STMT +-#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } +-#endif +-#ifndef BPF_JUMP +-#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } +-#endif +- +-/* +- * Number of scratch memory words for: BPF_ST and BPF_STX +- */ +-#define BPF_MEMWORDS 16 +- +-/* RATIONALE. Negative offsets are invalid in BPF. +- We use them to reference ancillary data. +- Unlike introduction new instructions, it does not break +- existing compilers/optimizers. +- */ +-#define SKF_AD_OFF (-0x1000) +-#define SKF_AD_PROTOCOL 0 +-#define SKF_AD_PKTTYPE 4 +-#define SKF_AD_IFINDEX 8 +-#define SKF_AD_NLATTR 12 +-#define SKF_AD_NLATTR_NEST 16 +-#define SKF_AD_MARK 20 +-#define SKF_AD_QUEUE 24 +-#define SKF_AD_HATYPE 28 +-#define SKF_AD_RXHASH 32 +-#define SKF_AD_CPU 36 +-#define SKF_AD_ALU_XOR_X 40 +-#define SKF_AD_VLAN_TAG 44 +-#define SKF_AD_VLAN_TAG_PRESENT 48 +-#define SKF_AD_PAY_OFFSET 52 +-#define SKF_AD_RANDOM 56 +-#define SKF_AD_VLAN_TPID 60 +-#define SKF_AD_MAX 64 +- +-#define SKF_NET_OFF (-0x100000) +-#define SKF_LL_OFF (-0x200000) +- +-#define BPF_NET_OFF SKF_NET_OFF +-#define BPF_LL_OFF SKF_LL_OFF +- +-#endif /* __LINUX_FILTER_H__ */ +diff --git a/include/linux/fou.h b/include/linux/fou.h +deleted file mode 100644 +index 744c323..0000000 +--- a/include/linux/fou.h ++++ /dev/null +@@ -1,41 +0,0 @@ +-/* fou.h - FOU Interface */ +- +-#ifndef _LINUX_FOU_H +-#define _LINUX_FOU_H +- +-/* NETLINK_GENERIC related info +- */ +-#define FOU_GENL_NAME "fou" +-#define FOU_GENL_VERSION 0x1 +- +-enum { +- FOU_ATTR_UNSPEC, +- FOU_ATTR_PORT, /* u16 */ +- FOU_ATTR_AF, /* u8 */ +- FOU_ATTR_IPPROTO, /* u8 */ +- FOU_ATTR_TYPE, /* u8 */ +- FOU_ATTR_REMCSUM_NOPARTIAL, /* flag */ +- +- __FOU_ATTR_MAX, +-}; +- +-#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1) +- +-enum { +- FOU_CMD_UNSPEC, +- FOU_CMD_ADD, +- FOU_CMD_DEL, +- FOU_CMD_GET, +- +- __FOU_CMD_MAX, +-}; +- +-enum { +- FOU_ENCAP_UNSPEC, +- FOU_ENCAP_DIRECT, +- FOU_ENCAP_GUE, +-}; +- +-#define FOU_CMD_MAX (__FOU_CMD_MAX - 1) +- +-#endif /* _LINUX_FOU_H */ +diff --git a/include/linux/gen_stats.h b/include/linux/gen_stats.h +deleted file mode 100644 +index 52deccc..0000000 +--- a/include/linux/gen_stats.h ++++ /dev/null +@@ -1,79 +0,0 @@ +-#ifndef __LINUX_GEN_STATS_H +-#define __LINUX_GEN_STATS_H +- +-#include +- +-enum { +- TCA_STATS_UNSPEC, +- TCA_STATS_BASIC, +- TCA_STATS_RATE_EST, +- TCA_STATS_QUEUE, +- TCA_STATS_APP, +- TCA_STATS_RATE_EST64, +- TCA_STATS_PAD, +- __TCA_STATS_MAX, +-}; +-#define TCA_STATS_MAX (__TCA_STATS_MAX - 1) +- +-/** +- * struct gnet_stats_basic - byte/packet throughput statistics +- * @bytes: number of seen bytes +- * @packets: number of seen packets +- */ +-struct gnet_stats_basic { +- __u64 bytes; +- __u32 packets; +-}; +-struct gnet_stats_basic_packed { +- __u64 bytes; +- __u32 packets; +-} __attribute__ ((packed)); +- +-/** +- * struct gnet_stats_rate_est - rate estimator +- * @bps: current byte rate +- * @pps: current packet rate +- */ +-struct gnet_stats_rate_est { +- __u32 bps; +- __u32 pps; +-}; +- +-/** +- * struct gnet_stats_rate_est64 - rate estimator +- * @bps: current byte rate +- * @pps: current packet rate +- */ +-struct gnet_stats_rate_est64 { +- __u64 bps; +- __u64 pps; +-}; +- +-/** +- * struct gnet_stats_queue - queuing statistics +- * @qlen: queue length +- * @backlog: backlog size of queue +- * @drops: number of dropped packets +- * @requeues: number of requeues +- * @overlimits: number of enqueues over the limit +- */ +-struct gnet_stats_queue { +- __u32 qlen; +- __u32 backlog; +- __u32 drops; +- __u32 requeues; +- __u32 overlimits; +-}; +- +-/** +- * struct gnet_estimator - rate estimator configuration +- * @interval: sampling period +- * @ewma_log: the log of measurement window weight +- */ +-struct gnet_estimator { +- signed char interval; +- unsigned char ewma_log; +-}; +- +- +-#endif /* __LINUX_GEN_STATS_H */ +diff --git a/include/linux/genetlink.h b/include/linux/genetlink.h +deleted file mode 100644 +index 08239d8..0000000 +--- a/include/linux/genetlink.h ++++ /dev/null +@@ -1,88 +0,0 @@ +-#ifndef __LINUX_GENERIC_NETLINK_H +-#define __LINUX_GENERIC_NETLINK_H +- +-#include +-#include +- +-#define GENL_NAMSIZ 16 /* length of family name */ +- +-#define GENL_MIN_ID NLMSG_MIN_TYPE +-#define GENL_MAX_ID 1023 +- +-struct genlmsghdr { +- __u8 cmd; +- __u8 version; +- __u16 reserved; +-}; +- +-#define GENL_HDRLEN NLMSG_ALIGN(sizeof(struct genlmsghdr)) +- +-#define GENL_ADMIN_PERM 0x01 +-#define GENL_CMD_CAP_DO 0x02 +-#define GENL_CMD_CAP_DUMP 0x04 +-#define GENL_CMD_CAP_HASPOL 0x08 +-#define GENL_UNS_ADMIN_PERM 0x10 +- +-/* +- * List of reserved static generic netlink identifiers: +- */ +-#define GENL_ID_CTRL NLMSG_MIN_TYPE +-#define GENL_ID_VFS_DQUOT (NLMSG_MIN_TYPE + 1) +-#define GENL_ID_PMCRAID (NLMSG_MIN_TYPE + 2) +-/* must be last reserved + 1 */ +-#define GENL_START_ALLOC (NLMSG_MIN_TYPE + 3) +- +-/************************************************************************** +- * Controller +- **************************************************************************/ +- +-enum { +- CTRL_CMD_UNSPEC, +- CTRL_CMD_NEWFAMILY, +- CTRL_CMD_DELFAMILY, +- CTRL_CMD_GETFAMILY, +- CTRL_CMD_NEWOPS, +- CTRL_CMD_DELOPS, +- CTRL_CMD_GETOPS, +- CTRL_CMD_NEWMCAST_GRP, +- CTRL_CMD_DELMCAST_GRP, +- CTRL_CMD_GETMCAST_GRP, /* unused */ +- __CTRL_CMD_MAX, +-}; +- +-#define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1) +- +-enum { +- CTRL_ATTR_UNSPEC, +- CTRL_ATTR_FAMILY_ID, +- CTRL_ATTR_FAMILY_NAME, +- CTRL_ATTR_VERSION, +- CTRL_ATTR_HDRSIZE, +- CTRL_ATTR_MAXATTR, +- CTRL_ATTR_OPS, +- CTRL_ATTR_MCAST_GROUPS, +- __CTRL_ATTR_MAX, +-}; +- +-#define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1) +- +-enum { +- CTRL_ATTR_OP_UNSPEC, +- CTRL_ATTR_OP_ID, +- CTRL_ATTR_OP_FLAGS, +- __CTRL_ATTR_OP_MAX, +-}; +- +-#define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1) +- +-enum { +- CTRL_ATTR_MCAST_GRP_UNSPEC, +- CTRL_ATTR_MCAST_GRP_NAME, +- CTRL_ATTR_MCAST_GRP_ID, +- __CTRL_ATTR_MCAST_GRP_MAX, +-}; +- +-#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1) +- +- +-#endif /* __LINUX_GENERIC_NETLINK_H */ +diff --git a/include/linux/hdlc/ioctl.h b/include/linux/hdlc/ioctl.h +deleted file mode 100644 +index 04bc027..0000000 +--- a/include/linux/hdlc/ioctl.h ++++ /dev/null +@@ -1,84 +0,0 @@ +-#ifndef __HDLC_IOCTL_H__ +-#define __HDLC_IOCTL_H__ +- +- +-#define GENERIC_HDLC_VERSION 4 /* For synchronization with sethdlc utility */ +- +-#define CLOCK_DEFAULT 0 /* Default setting */ +-#define CLOCK_EXT 1 /* External TX and RX clock - DTE */ +-#define CLOCK_INT 2 /* Internal TX and RX clock - DCE */ +-#define CLOCK_TXINT 3 /* Internal TX and external RX clock */ +-#define CLOCK_TXFROMRX 4 /* TX clock derived from external RX clock */ +- +- +-#define ENCODING_DEFAULT 0 /* Default setting */ +-#define ENCODING_NRZ 1 +-#define ENCODING_NRZI 2 +-#define ENCODING_FM_MARK 3 +-#define ENCODING_FM_SPACE 4 +-#define ENCODING_MANCHESTER 5 +- +- +-#define PARITY_DEFAULT 0 /* Default setting */ +-#define PARITY_NONE 1 /* No parity */ +-#define PARITY_CRC16_PR0 2 /* CRC16, initial value 0x0000 */ +-#define PARITY_CRC16_PR1 3 /* CRC16, initial value 0xFFFF */ +-#define PARITY_CRC16_PR0_CCITT 4 /* CRC16, initial 0x0000, ITU-T version */ +-#define PARITY_CRC16_PR1_CCITT 5 /* CRC16, initial 0xFFFF, ITU-T version */ +-#define PARITY_CRC32_PR0_CCITT 6 /* CRC32, initial value 0x00000000 */ +-#define PARITY_CRC32_PR1_CCITT 7 /* CRC32, initial value 0xFFFFFFFF */ +- +-#define LMI_DEFAULT 0 /* Default setting */ +-#define LMI_NONE 1 /* No LMI, all PVCs are static */ +-#define LMI_ANSI 2 /* ANSI Annex D */ +-#define LMI_CCITT 3 /* ITU-T Annex A */ +-#define LMI_CISCO 4 /* The "original" LMI, aka Gang of Four */ +- +-#ifndef __ASSEMBLY__ +- +-typedef struct { +- unsigned int clock_rate; /* bits per second */ +- unsigned int clock_type; /* internal, external, TX-internal etc. */ +- unsigned short loopback; +-} sync_serial_settings; /* V.35, V.24, X.21 */ +- +-typedef struct { +- unsigned int clock_rate; /* bits per second */ +- unsigned int clock_type; /* internal, external, TX-internal etc. */ +- unsigned short loopback; +- unsigned int slot_map; +-} te1_settings; /* T1, E1 */ +- +-typedef struct { +- unsigned short encoding; +- unsigned short parity; +-} raw_hdlc_proto; +- +-typedef struct { +- unsigned int t391; +- unsigned int t392; +- unsigned int n391; +- unsigned int n392; +- unsigned int n393; +- unsigned short lmi; +- unsigned short dce; /* 1 for DCE (network side) operation */ +-} fr_proto; +- +-typedef struct { +- unsigned int dlci; +-} fr_proto_pvc; /* for creating/deleting FR PVCs */ +- +-typedef struct { +- unsigned int dlci; +- char master[IFNAMSIZ]; /* Name of master FRAD device */ +-}fr_proto_pvc_info; /* for returning PVC information only */ +- +-typedef struct { +- unsigned int interval; +- unsigned int timeout; +-} cisco_proto; +- +-/* PPP doesn't need any info now - supply length = 0 to ioctl */ +- +-#endif /* __ASSEMBLY__ */ +-#endif /* __HDLC_IOCTL_H__ */ +diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h +deleted file mode 100644 +index a2e839e..0000000 +--- a/include/linux/icmpv6.h ++++ /dev/null +@@ -1,166 +0,0 @@ +-#ifndef _LINUX_ICMPV6_H +-#define _LINUX_ICMPV6_H +- +-#include +-#include +- +-struct icmp6hdr { +- +- __u8 icmp6_type; +- __u8 icmp6_code; +- __sum16 icmp6_cksum; +- +- +- union { +- __be32 un_data32[1]; +- __be16 un_data16[2]; +- __u8 un_data8[4]; +- +- struct icmpv6_echo { +- __be16 identifier; +- __be16 sequence; +- } u_echo; +- +- struct icmpv6_nd_advt { +-#if defined(__LITTLE_ENDIAN_BITFIELD) +- __u32 reserved:5, +- override:1, +- solicited:1, +- router:1, +- reserved2:24; +-#elif defined(__BIG_ENDIAN_BITFIELD) +- __u32 router:1, +- solicited:1, +- override:1, +- reserved:29; +-#else +-#error "Please fix " +-#endif +- } u_nd_advt; +- +- struct icmpv6_nd_ra { +- __u8 hop_limit; +-#if defined(__LITTLE_ENDIAN_BITFIELD) +- __u8 reserved:3, +- router_pref:2, +- home_agent:1, +- other:1, +- managed:1; +- +-#elif defined(__BIG_ENDIAN_BITFIELD) +- __u8 managed:1, +- other:1, +- home_agent:1, +- router_pref:2, +- reserved:3; +-#else +-#error "Please fix " +-#endif +- __be16 rt_lifetime; +- } u_nd_ra; +- +- } icmp6_dataun; +- +-#define icmp6_identifier icmp6_dataun.u_echo.identifier +-#define icmp6_sequence icmp6_dataun.u_echo.sequence +-#define icmp6_pointer icmp6_dataun.un_data32[0] +-#define icmp6_mtu icmp6_dataun.un_data32[0] +-#define icmp6_unused icmp6_dataun.un_data32[0] +-#define icmp6_maxdelay icmp6_dataun.un_data16[0] +-#define icmp6_router icmp6_dataun.u_nd_advt.router +-#define icmp6_solicited icmp6_dataun.u_nd_advt.solicited +-#define icmp6_override icmp6_dataun.u_nd_advt.override +-#define icmp6_ndiscreserved icmp6_dataun.u_nd_advt.reserved +-#define icmp6_hop_limit icmp6_dataun.u_nd_ra.hop_limit +-#define icmp6_addrconf_managed icmp6_dataun.u_nd_ra.managed +-#define icmp6_addrconf_other icmp6_dataun.u_nd_ra.other +-#define icmp6_rt_lifetime icmp6_dataun.u_nd_ra.rt_lifetime +-#define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref +-}; +- +- +-#define ICMPV6_ROUTER_PREF_LOW 0x3 +-#define ICMPV6_ROUTER_PREF_MEDIUM 0x0 +-#define ICMPV6_ROUTER_PREF_HIGH 0x1 +-#define ICMPV6_ROUTER_PREF_INVALID 0x2 +- +-#define ICMPV6_DEST_UNREACH 1 +-#define ICMPV6_PKT_TOOBIG 2 +-#define ICMPV6_TIME_EXCEED 3 +-#define ICMPV6_PARAMPROB 4 +- +-#define ICMPV6_INFOMSG_MASK 0x80 +- +-#define ICMPV6_ECHO_REQUEST 128 +-#define ICMPV6_ECHO_REPLY 129 +-#define ICMPV6_MGM_QUERY 130 +-#define ICMPV6_MGM_REPORT 131 +-#define ICMPV6_MGM_REDUCTION 132 +- +-#define ICMPV6_NI_QUERY 139 +-#define ICMPV6_NI_REPLY 140 +- +-#define ICMPV6_MLD2_REPORT 143 +- +-#define ICMPV6_DHAAD_REQUEST 144 +-#define ICMPV6_DHAAD_REPLY 145 +-#define ICMPV6_MOBILE_PREFIX_SOL 146 +-#define ICMPV6_MOBILE_PREFIX_ADV 147 +- +-/* +- * Codes for Destination Unreachable +- */ +-#define ICMPV6_NOROUTE 0 +-#define ICMPV6_ADM_PROHIBITED 1 +-#define ICMPV6_NOT_NEIGHBOUR 2 +-#define ICMPV6_ADDR_UNREACH 3 +-#define ICMPV6_PORT_UNREACH 4 +-#define ICMPV6_POLICY_FAIL 5 +-#define ICMPV6_REJECT_ROUTE 6 +- +-/* +- * Codes for Time Exceeded +- */ +-#define ICMPV6_EXC_HOPLIMIT 0 +-#define ICMPV6_EXC_FRAGTIME 1 +- +-/* +- * Codes for Parameter Problem +- */ +-#define ICMPV6_HDR_FIELD 0 +-#define ICMPV6_UNK_NEXTHDR 1 +-#define ICMPV6_UNK_OPTION 2 +- +-/* +- * constants for (set|get)sockopt +- */ +- +-#define ICMPV6_FILTER 1 +- +-/* +- * ICMPV6 filter +- */ +- +-#define ICMPV6_FILTER_BLOCK 1 +-#define ICMPV6_FILTER_PASS 2 +-#define ICMPV6_FILTER_BLOCKOTHERS 3 +-#define ICMPV6_FILTER_PASSONLY 4 +- +-struct icmp6_filter { +- __u32 data[8]; +-}; +- +-/* +- * Definitions for MLDv2 +- */ +-#define MLD2_MODE_IS_INCLUDE 1 +-#define MLD2_MODE_IS_EXCLUDE 2 +-#define MLD2_CHANGE_TO_INCLUDE 3 +-#define MLD2_CHANGE_TO_EXCLUDE 4 +-#define MLD2_ALLOW_NEW_SOURCES 5 +-#define MLD2_BLOCK_OLD_SOURCES 6 +- +-#define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } } +- +- +-#endif /* _LINUX_ICMPV6_H */ +diff --git a/include/linux/if.h b/include/linux/if.h +deleted file mode 100644 +index b4ba020..0000000 +--- a/include/linux/if.h ++++ /dev/null +@@ -1,292 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Global definitions for the INET interface module. +- * +- * Version: @(#)if.h 1.0.2 04/18/93 +- * +- * Authors: Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988 +- * Ross Biro +- * Fred N. van Kempen, +- * +- * This program is free software; you can redistribute 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. +- */ +-#ifndef _LINUX_IF_H +-#define _LINUX_IF_H +- +-#include /* for compatibility with glibc */ +-#include /* for "__kernel_caddr_t" et al */ +-#include /* for "struct sockaddr" et al */ +- /* for "__user" et al */ +- +-#include /* for struct sockaddr. */ +- +-#if __UAPI_DEF_IF_IFNAMSIZ +-#define IFNAMSIZ 16 +-#endif /* __UAPI_DEF_IF_IFNAMSIZ */ +-#define IFALIASZ 256 +-#include +- +-/* For glibc compatibility. An empty enum does not compile. */ +-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \ +- __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 +-/** +- * enum net_device_flags - &struct net_device flags +- * +- * These are the &struct net_device flags, they can be set by drivers, the +- * kernel and some can be triggered by userspace. Userspace can query and +- * set these flags using userspace utilities but there is also a sysfs +- * entry available for all dev flags which can be queried and set. These flags +- * are shared for all types of net_devices. The sysfs entries are available +- * via /sys/class/net//flags. Flags which can be toggled through sysfs +- * are annotated below, note that only a few flags can be toggled and some +- * other flags are always preserved from the original net_device flags +- * even if you try to set them via sysfs. Flags which are always preserved +- * are kept under the flag grouping @IFF_VOLATILE. Flags which are __volatile__ +- * are annotated below as such. +- * +- * You should have a pretty good reason to be extending these flags. +- * +- * @IFF_UP: interface is up. Can be toggled through sysfs. +- * @IFF_BROADCAST: broadcast address valid. Volatile. +- * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs. +- * @IFF_LOOPBACK: is a loopback net. Volatile. +- * @IFF_POINTOPOINT: interface is has p-p link. Volatile. +- * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs. +- * Volatile. +- * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile. +- * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile. +- * @IFF_PROMISC: receive all packets. Can be toggled through sysfs. +- * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through +- * sysfs. +- * @IFF_MASTER: master of a load balancer. Volatile. +- * @IFF_SLAVE: slave of a load balancer. Volatile. +- * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs. +- * @IFF_PORTSEL: can set media type. Can be toggled through sysfs. +- * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs. +- * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled +- * through sysfs. +- * @IFF_LOWER_UP: driver signals L1 up. Volatile. +- * @IFF_DORMANT: driver signals dormant. Volatile. +- * @IFF_ECHO: echo sent packets. Volatile. +- */ +-enum net_device_flags { +-/* for compatibility with glibc net/if.h */ +-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS +- IFF_UP = 1<<0, /* sysfs */ +- IFF_BROADCAST = 1<<1, /* __volatile__ */ +- IFF_DEBUG = 1<<2, /* sysfs */ +- IFF_LOOPBACK = 1<<3, /* __volatile__ */ +- IFF_POINTOPOINT = 1<<4, /* __volatile__ */ +- IFF_NOTRAILERS = 1<<5, /* sysfs */ +- IFF_RUNNING = 1<<6, /* __volatile__ */ +- IFF_NOARP = 1<<7, /* sysfs */ +- IFF_PROMISC = 1<<8, /* sysfs */ +- IFF_ALLMULTI = 1<<9, /* sysfs */ +- IFF_MASTER = 1<<10, /* __volatile__ */ +- IFF_SLAVE = 1<<11, /* __volatile__ */ +- IFF_MULTICAST = 1<<12, /* sysfs */ +- IFF_PORTSEL = 1<<13, /* sysfs */ +- IFF_AUTOMEDIA = 1<<14, /* sysfs */ +- IFF_DYNAMIC = 1<<15, /* sysfs */ +-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ +-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +- IFF_LOWER_UP = 1<<16, /* __volatile__ */ +- IFF_DORMANT = 1<<17, /* __volatile__ */ +- IFF_ECHO = 1<<18, /* __volatile__ */ +-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ +-}; +-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ +- +-/* for compatibility with glibc net/if.h */ +-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS +-#define IFF_UP IFF_UP +-#define IFF_BROADCAST IFF_BROADCAST +-#define IFF_DEBUG IFF_DEBUG +-#define IFF_LOOPBACK IFF_LOOPBACK +-#define IFF_POINTOPOINT IFF_POINTOPOINT +-#define IFF_NOTRAILERS IFF_NOTRAILERS +-#define IFF_RUNNING IFF_RUNNING +-#define IFF_NOARP IFF_NOARP +-#define IFF_PROMISC IFF_PROMISC +-#define IFF_ALLMULTI IFF_ALLMULTI +-#define IFF_MASTER IFF_MASTER +-#define IFF_SLAVE IFF_SLAVE +-#define IFF_MULTICAST IFF_MULTICAST +-#define IFF_PORTSEL IFF_PORTSEL +-#define IFF_AUTOMEDIA IFF_AUTOMEDIA +-#define IFF_DYNAMIC IFF_DYNAMIC +-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ +- +-#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +-#define IFF_LOWER_UP IFF_LOWER_UP +-#define IFF_DORMANT IFF_DORMANT +-#define IFF_ECHO IFF_ECHO +-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ +- +-#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ +- IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) +- +-#define IF_GET_IFACE 0x0001 /* for querying only */ +-#define IF_GET_PROTO 0x0002 +- +-/* For definitions see hdlc.h */ +-#define IF_IFACE_V35 0x1000 /* V.35 serial interface */ +-#define IF_IFACE_V24 0x1001 /* V.24 serial interface */ +-#define IF_IFACE_X21 0x1002 /* X.21 serial interface */ +-#define IF_IFACE_T1 0x1003 /* T1 telco serial interface */ +-#define IF_IFACE_E1 0x1004 /* E1 telco serial interface */ +-#define IF_IFACE_SYNC_SERIAL 0x1005 /* can't be set by software */ +-#define IF_IFACE_X21D 0x1006 /* X.21 Dual Clocking (FarSite) */ +- +-/* For definitions see hdlc.h */ +-#define IF_PROTO_HDLC 0x2000 /* raw HDLC protocol */ +-#define IF_PROTO_PPP 0x2001 /* PPP protocol */ +-#define IF_PROTO_CISCO 0x2002 /* Cisco HDLC protocol */ +-#define IF_PROTO_FR 0x2003 /* Frame Relay protocol */ +-#define IF_PROTO_FR_ADD_PVC 0x2004 /* Create FR PVC */ +-#define IF_PROTO_FR_DEL_PVC 0x2005 /* Delete FR PVC */ +-#define IF_PROTO_X25 0x2006 /* X.25 */ +-#define IF_PROTO_HDLC_ETH 0x2007 /* raw HDLC, Ethernet emulation */ +-#define IF_PROTO_FR_ADD_ETH_PVC 0x2008 /* Create FR Ethernet-bridged PVC */ +-#define IF_PROTO_FR_DEL_ETH_PVC 0x2009 /* Delete FR Ethernet-bridged PVC */ +-#define IF_PROTO_FR_PVC 0x200A /* for reading PVC status */ +-#define IF_PROTO_FR_ETH_PVC 0x200B +-#define IF_PROTO_RAW 0x200C /* RAW Socket */ +- +-/* RFC 2863 operational status */ +-enum { +- IF_OPER_UNKNOWN, +- IF_OPER_NOTPRESENT, +- IF_OPER_DOWN, +- IF_OPER_LOWERLAYERDOWN, +- IF_OPER_TESTING, +- IF_OPER_DORMANT, +- IF_OPER_UP, +-}; +- +-/* link modes */ +-enum { +- IF_LINK_MODE_DEFAULT, +- IF_LINK_MODE_DORMANT, /* limit upward transition to dormant */ +-}; +- +-/* +- * Device mapping structure. I'd just gone off and designed a +- * beautiful scheme using only loadable modules with arguments +- * for driver options and along come the PCMCIA people 8) +- * +- * Ah well. The get() side of this is good for WDSETUP, and it'll +- * be handy for debugging things. The set side is fine for now and +- * being very small might be worth keeping for clean configuration. +- */ +- +-/* for compatibility with glibc net/if.h */ +-#if __UAPI_DEF_IF_IFMAP +-struct ifmap { +- unsigned long mem_start; +- unsigned long mem_end; +- unsigned short base_addr; +- unsigned char irq; +- unsigned char dma; +- unsigned char port; +- /* 3 bytes spare */ +-}; +-#endif /* __UAPI_DEF_IF_IFMAP */ +- +-struct if_settings { +- unsigned int type; /* Type of physical device or protocol */ +- unsigned int size; /* Size of the data allocated by the caller */ +- union { +- /* {atm/eth/dsl}_settings anyone ? */ +- raw_hdlc_proto *raw_hdlc; +- cisco_proto *cisco; +- fr_proto *fr; +- fr_proto_pvc *fr_pvc; +- fr_proto_pvc_info *fr_pvc_info; +- +- /* interface settings */ +- sync_serial_settings *sync; +- te1_settings *te1; +- } ifs_ifsu; +-}; +- +-/* +- * Interface request structure used for socket +- * ioctl's. All interface ioctl's must have parameter +- * definitions which begin with ifr_name. The +- * remainder may be interface specific. +- */ +- +-/* for compatibility with glibc net/if.h */ +-#if __UAPI_DEF_IF_IFREQ +-struct ifreq { +-#define IFHWADDRLEN 6 +- union +- { +- char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ +- } ifr_ifrn; +- +- union { +- struct sockaddr ifru_addr; +- struct sockaddr ifru_dstaddr; +- struct sockaddr ifru_broadaddr; +- struct sockaddr ifru_netmask; +- struct sockaddr ifru_hwaddr; +- short ifru_flags; +- int ifru_ivalue; +- int ifru_mtu; +- struct ifmap ifru_map; +- char ifru_slave[IFNAMSIZ]; /* Just fits the size */ +- char ifru_newname[IFNAMSIZ]; +- void * ifru_data; +- struct if_settings ifru_settings; +- } ifr_ifru; +-}; +-#endif /* __UAPI_DEF_IF_IFREQ */ +- +-#define ifr_name ifr_ifrn.ifrn_name /* interface name */ +-#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ +-#define ifr_addr ifr_ifru.ifru_addr /* address */ +-#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ +-#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +-#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ +-#define ifr_flags ifr_ifru.ifru_flags /* flags */ +-#define ifr_metric ifr_ifru.ifru_ivalue /* metric */ +-#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +-#define ifr_map ifr_ifru.ifru_map /* device map */ +-#define ifr_slave ifr_ifru.ifru_slave /* slave device */ +-#define ifr_data ifr_ifru.ifru_data /* for use by interface */ +-#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ +-#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ +-#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */ +-#define ifr_newname ifr_ifru.ifru_newname /* New name */ +-#define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/ +- +-/* +- * Structure used in SIOCGIFCONF request. +- * Used to retrieve interface configuration +- * for machine (useful for programs which +- * must know all networks accessible). +- */ +- +-/* for compatibility with glibc net/if.h */ +-#if __UAPI_DEF_IF_IFCONF +-struct ifconf { +- int ifc_len; /* size of buffer */ +- union { +- char *ifcu_buf; +- struct ifreq *ifcu_req; +- } ifc_ifcu; +-}; +-#endif /* __UAPI_DEF_IF_IFCONF */ +- +-#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ +-#define ifc_req ifc_ifcu.ifcu_req /* array of structures */ +- +-#endif /* _LINUX_IF_H */ +diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h +deleted file mode 100644 +index 26f0ecf..0000000 +--- a/include/linux/if_addr.h ++++ /dev/null +@@ -1,67 +0,0 @@ +-#ifndef __LINUX_IF_ADDR_H +-#define __LINUX_IF_ADDR_H +- +-#include +-#include +- +-struct ifaddrmsg { +- __u8 ifa_family; +- __u8 ifa_prefixlen; /* The prefix length */ +- __u8 ifa_flags; /* Flags */ +- __u8 ifa_scope; /* Address scope */ +- __u32 ifa_index; /* Link index */ +-}; +- +-/* +- * Important comment: +- * IFA_ADDRESS is prefix address, rather than local interface address. +- * It makes no difference for normally configured broadcast interfaces, +- * but for point-to-point IFA_ADDRESS is DESTINATION address, +- * local address is supplied in IFA_LOCAL attribute. +- * +- * IFA_FLAGS is a u32 attribute that extends the u8 field ifa_flags. +- * If present, the value from struct ifaddrmsg will be ignored. +- */ +-enum { +- IFA_UNSPEC, +- IFA_ADDRESS, +- IFA_LOCAL, +- IFA_LABEL, +- IFA_BROADCAST, +- IFA_ANYCAST, +- IFA_CACHEINFO, +- IFA_MULTICAST, +- IFA_FLAGS, +- __IFA_MAX, +-}; +- +-#define IFA_MAX (__IFA_MAX - 1) +- +-/* ifa_flags */ +-#define IFA_F_SECONDARY 0x01 +-#define IFA_F_TEMPORARY IFA_F_SECONDARY +- +-#define IFA_F_NODAD 0x02 +-#define IFA_F_OPTIMISTIC 0x04 +-#define IFA_F_DADFAILED 0x08 +-#define IFA_F_HOMEADDRESS 0x10 +-#define IFA_F_DEPRECATED 0x20 +-#define IFA_F_TENTATIVE 0x40 +-#define IFA_F_PERMANENT 0x80 +-#define IFA_F_MANAGETEMPADDR 0x100 +-#define IFA_F_NOPREFIXROUTE 0x200 +-#define IFA_F_MCAUTOJOIN 0x400 +-#define IFA_F_STABLE_PRIVACY 0x800 +- +-struct ifa_cacheinfo { +- __u32 ifa_prefered; +- __u32 ifa_valid; +- __u32 cstamp; /* created timestamp, hundredths of seconds */ +- __u32 tstamp; /* updated timestamp, hundredths of seconds */ +-}; +- +-/* backwards compatibility for userspace */ +-#define IFA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) +-#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) +- +-#endif +diff --git a/include/linux/if_addrlabel.h b/include/linux/if_addrlabel.h +deleted file mode 100644 +index 54580c2..0000000 +--- a/include/linux/if_addrlabel.h ++++ /dev/null +@@ -1,32 +0,0 @@ +-/* +- * if_addrlabel.h - netlink interface for address labels +- * +- * Copyright (C)2007 USAGI/WIDE Project, All Rights Reserved. +- * +- * Authors: +- * YOSHIFUJI Hideaki @ USAGI/WIDE +- */ +- +-#ifndef __LINUX_IF_ADDRLABEL_H +-#define __LINUX_IF_ADDRLABEL_H +- +-#include +- +-struct ifaddrlblmsg { +- __u8 ifal_family; /* Address family */ +- __u8 __ifal_reserved; /* Reserved */ +- __u8 ifal_prefixlen; /* Prefix length */ +- __u8 ifal_flags; /* Flags */ +- __u32 ifal_index; /* Link index */ +- __u32 ifal_seq; /* sequence number */ +-}; +- +-enum { +- IFAL_ADDRESS = 1, +- IFAL_LABEL = 2, +- __IFAL_MAX +-}; +- +-#define IFAL_MAX (__IFAL_MAX - 1) +- +-#endif +diff --git a/include/linux/if_alg.h b/include/linux/if_alg.h +deleted file mode 100644 +index f2acd2f..0000000 +--- a/include/linux/if_alg.h ++++ /dev/null +@@ -1,42 +0,0 @@ +-/* +- * if_alg: User-space algorithm interface +- * +- * Copyright (c) 2010 Herbert Xu +- * +- * This program is free software; you can redistribute 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. +- * +- */ +- +-#ifndef _LINUX_IF_ALG_H +-#define _LINUX_IF_ALG_H +- +-#include +- +-struct sockaddr_alg { +- __u16 salg_family; +- __u8 salg_type[14]; +- __u32 salg_feat; +- __u32 salg_mask; +- __u8 salg_name[64]; +-}; +- +-struct af_alg_iv { +- __u32 ivlen; +- __u8 iv[0]; +-}; +- +-/* Socket options */ +-#define ALG_SET_KEY 1 +-#define ALG_SET_IV 2 +-#define ALG_SET_OP 3 +-#define ALG_SET_AEAD_ASSOCLEN 4 +-#define ALG_SET_AEAD_AUTHSIZE 5 +- +-/* Operations */ +-#define ALG_OP_DECRYPT 0 +-#define ALG_OP_ENCRYPT 1 +- +-#endif /* _LINUX_IF_ALG_H */ +diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h +deleted file mode 100644 +index 199f253..0000000 +--- a/include/linux/if_arp.h ++++ /dev/null +@@ -1,163 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Global definitions for the ARP (RFC 826) protocol. +- * +- * Version: @(#)if_arp.h 1.0.1 04/16/93 +- * +- * Authors: Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988 +- * Portions taken from the KA9Q/NOS (v2.00m PA0GRI) source. +- * Ross Biro +- * Fred N. van Kempen, +- * Florian La Roche, +- * Jonathan Layes +- * Arnaldo Carvalho de Melo ARPHRD_HWX25 +- * +- * This program is free software; you can redistribute 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. +- */ +-#ifndef _LINUX_IF_ARP_H +-#define _LINUX_IF_ARP_H +- +-#include +- +-/* ARP protocol HARDWARE identifiers. */ +-#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */ +-#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ +-#define ARPHRD_EETHER 2 /* Experimental Ethernet */ +-#define ARPHRD_AX25 3 /* AX.25 Level 2 */ +-#define ARPHRD_PRONET 4 /* PROnet token ring */ +-#define ARPHRD_CHAOS 5 /* Chaosnet */ +-#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */ +-#define ARPHRD_ARCNET 7 /* ARCnet */ +-#define ARPHRD_APPLETLK 8 /* APPLEtalk */ +-#define ARPHRD_DLCI 15 /* Frame Relay DLCI */ +-#define ARPHRD_ATM 19 /* ATM */ +-#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id) */ +-#define ARPHRD_IEEE1394 24 /* IEEE 1394 IPv4 - RFC 2734 */ +-#define ARPHRD_EUI64 27 /* EUI-64 */ +-#define ARPHRD_INFINIBAND 32 /* InfiniBand */ +- +-/* Dummy types for non ARP hardware */ +-#define ARPHRD_SLIP 256 +-#define ARPHRD_CSLIP 257 +-#define ARPHRD_SLIP6 258 +-#define ARPHRD_CSLIP6 259 +-#define ARPHRD_RSRVD 260 /* Notional KISS type */ +-#define ARPHRD_ADAPT 264 +-#define ARPHRD_ROSE 270 +-#define ARPHRD_X25 271 /* CCITT X.25 */ +-#define ARPHRD_HWX25 272 /* Boards with X.25 in firmware */ +-#define ARPHRD_CAN 280 /* Controller Area Network */ +-#define ARPHRD_PPP 512 +-#define ARPHRD_CISCO 513 /* Cisco HDLC */ +-#define ARPHRD_HDLC ARPHRD_CISCO +-#define ARPHRD_LAPB 516 /* LAPB */ +-#define ARPHRD_DDCMP 517 /* Digital's DDCMP protocol */ +-#define ARPHRD_RAWHDLC 518 /* Raw HDLC */ +-#define ARPHRD_RAWIP 519 /* Raw IP */ +- +-#define ARPHRD_TUNNEL 768 /* IPIP tunnel */ +-#define ARPHRD_TUNNEL6 769 /* IP6IP6 tunnel */ +-#define ARPHRD_FRAD 770 /* Frame Relay Access Device */ +-#define ARPHRD_SKIP 771 /* SKIP vif */ +-#define ARPHRD_LOOPBACK 772 /* Loopback device */ +-#define ARPHRD_LOCALTLK 773 /* Localtalk device */ +-#define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface */ +-#define ARPHRD_BIF 775 /* AP1000 BIF */ +-#define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4 */ +-#define ARPHRD_IPDDP 777 /* IP over DDP tunneller */ +-#define ARPHRD_IPGRE 778 /* GRE over IP */ +-#define ARPHRD_PIMREG 779 /* PIMSM register interface */ +-#define ARPHRD_HIPPI 780 /* High Performance Parallel Interface */ +-#define ARPHRD_ASH 781 /* Nexus 64Mbps Ash */ +-#define ARPHRD_ECONET 782 /* Acorn Econet */ +-#define ARPHRD_IRDA 783 /* Linux-IrDA */ +-/* ARP works differently on different FC media .. so */ +-#define ARPHRD_FCPP 784 /* Point to point fibrechannel */ +-#define ARPHRD_FCAL 785 /* Fibrechannel arbitrated loop */ +-#define ARPHRD_FCPL 786 /* Fibrechannel public loop */ +-#define ARPHRD_FCFABRIC 787 /* Fibrechannel fabric */ +- /* 787->799 reserved for fibrechannel media types */ +-#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */ +-#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */ +-#define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */ +-#define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */ +-#define ARPHRD_IEEE802154 804 +-#define ARPHRD_IEEE802154_MONITOR 805 /* IEEE 802.15.4 network monitor */ +- +-#define ARPHRD_PHONET 820 /* PhoNet media type */ +-#define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ +-#define ARPHRD_CAIF 822 /* CAIF media type */ +-#define ARPHRD_IP6GRE 823 /* GRE over IPv6 */ +-#define ARPHRD_NETLINK 824 /* Netlink header */ +-#define ARPHRD_6LOWPAN 825 /* IPv6 over LoWPAN */ +-#define ARPHRD_VSOCKMON 826 /* Vsock monitor header */ +- +-#define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ +-#define ARPHRD_NONE 0xFFFE /* zero header length */ +- +-/* ARP protocol opcodes. */ +-#define ARPOP_REQUEST 1 /* ARP request */ +-#define ARPOP_REPLY 2 /* ARP reply */ +-#define ARPOP_RREQUEST 3 /* RARP request */ +-#define ARPOP_RREPLY 4 /* RARP reply */ +-#define ARPOP_InREQUEST 8 /* InARP request */ +-#define ARPOP_InREPLY 9 /* InARP reply */ +-#define ARPOP_NAK 10 /* (ATM)ARP NAK */ +- +- +-/* ARP ioctl request. */ +-struct arpreq { +- struct sockaddr arp_pa; /* protocol address */ +- struct sockaddr arp_ha; /* hardware address */ +- int arp_flags; /* flags */ +- struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ +- char arp_dev[16]; +-}; +- +-struct arpreq_old { +- struct sockaddr arp_pa; /* protocol address */ +- struct sockaddr arp_ha; /* hardware address */ +- int arp_flags; /* flags */ +- struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ +-}; +- +-/* ARP Flag values. */ +-#define ATF_COM 0x02 /* completed entry (ha valid) */ +-#define ATF_PERM 0x04 /* permanent entry */ +-#define ATF_PUBL 0x08 /* publish entry */ +-#define ATF_USETRAILERS 0x10 /* has requested trailers */ +-#define ATF_NETMASK 0x20 /* want to use a netmask (only +- for proxy entries) */ +-#define ATF_DONTPUB 0x40 /* don't answer this addresses */ +- +-/* +- * This structure defines an ethernet arp header. +- */ +- +-struct arphdr { +- __be16 ar_hrd; /* format of hardware address */ +- __be16 ar_pro; /* format of protocol address */ +- unsigned char ar_hln; /* length of hardware address */ +- unsigned char ar_pln; /* length of protocol address */ +- __be16 ar_op; /* ARP opcode (command) */ +- +-#if 0 +- /* +- * Ethernet looks like this : This bit is variable sized however... +- */ +- unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ +- unsigned char ar_sip[4]; /* sender IP address */ +- unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ +- unsigned char ar_tip[4]; /* target IP address */ +-#endif +- +-}; +- +- +-#endif /* _LINUX_IF_ARP_H */ +diff --git a/include/linux/if_bonding.h b/include/linux/if_bonding.h +deleted file mode 100644 +index 9635a62..0000000 +--- a/include/linux/if_bonding.h ++++ /dev/null +@@ -1,130 +0,0 @@ +-/* +- * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'. +- * +- * +- * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes +- * NCM: Network and Communications Management, Inc. +- * +- * BUT, I'm the one who modified it for ethernet, so: +- * (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov +- * +- * This software may be used and distributed according to the terms +- * of the GNU Public License, incorporated herein by reference. +- * +- * 2003/03/18 - Amir Noam +- * - Added support for getting slave's speed and duplex via ethtool. +- * Needed for 802.3ad and other future modes. +- * +- * 2003/03/18 - Tsippy Mendelson and +- * Shmulik Hen +- * - Enable support of modes that need to use the unique mac address of +- * each slave. +- * +- * 2003/03/18 - Tsippy Mendelson and +- * Amir Noam +- * - Moved driver's private data types to bonding.h +- * +- * 2003/03/18 - Amir Noam , +- * Tsippy Mendelson and +- * Shmulik Hen +- * - Added support for IEEE 802.3ad Dynamic link aggregation mode. +- * +- * 2003/05/01 - Amir Noam +- * - Added ABI version control to restore compatibility between +- * new/old ifenslave and new/old bonding. +- * +- * 2003/12/01 - Shmulik Hen +- * - Code cleanup and style changes +- * +- * 2005/05/05 - Jason Gabler +- * - added definitions for various XOR hashing policies +- */ +- +-#ifndef _LINUX_IF_BONDING_H +-#define _LINUX_IF_BONDING_H +- +-#include +-#include +-#include +- +-/* userland - kernel ABI version (2003/05/08) */ +-#define BOND_ABI_VERSION 2 +- +-/* +- * We can remove these ioctl definitions in 2.5. People should use the +- * SIOC*** versions of them instead +- */ +-#define BOND_ENSLAVE_OLD (SIOCDEVPRIVATE) +-#define BOND_RELEASE_OLD (SIOCDEVPRIVATE + 1) +-#define BOND_SETHWADDR_OLD (SIOCDEVPRIVATE + 2) +-#define BOND_SLAVE_INFO_QUERY_OLD (SIOCDEVPRIVATE + 11) +-#define BOND_INFO_QUERY_OLD (SIOCDEVPRIVATE + 12) +-#define BOND_CHANGE_ACTIVE_OLD (SIOCDEVPRIVATE + 13) +- +-#define BOND_CHECK_MII_STATUS (SIOCGMIIPHY) +- +-#define BOND_MODE_ROUNDROBIN 0 +-#define BOND_MODE_ACTIVEBACKUP 1 +-#define BOND_MODE_XOR 2 +-#define BOND_MODE_BROADCAST 3 +-#define BOND_MODE_8023AD 4 +-#define BOND_MODE_TLB 5 +-#define BOND_MODE_ALB 6 /* TLB + RLB (receive load balancing) */ +- +-/* each slave's link has 4 states */ +-#define BOND_LINK_UP 0 /* link is up and running */ +-#define BOND_LINK_FAIL 1 /* link has just gone down */ +-#define BOND_LINK_DOWN 2 /* link has been down for too long time */ +-#define BOND_LINK_BACK 3 /* link is going back */ +- +-/* each slave has several states */ +-#define BOND_STATE_ACTIVE 0 /* link is active */ +-#define BOND_STATE_BACKUP 1 /* link is backup */ +- +-#define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ +- +-#define BOND_DEFAULT_TX_QUEUES 16 /* Default number of tx queues per device */ +- +-#define BOND_DEFAULT_RESEND_IGMP 1 /* Default number of IGMP membership reports */ +- +-/* hashing types */ +-#define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ +-#define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ +-#define BOND_XMIT_POLICY_LAYER23 2 /* layer 2+3 (IP ^ MAC) */ +-#define BOND_XMIT_POLICY_ENCAP23 3 /* encapsulated layer 2+3 */ +-#define BOND_XMIT_POLICY_ENCAP34 4 /* encapsulated layer 3+4 */ +- +-typedef struct ifbond { +- __s32 bond_mode; +- __s32 num_slaves; +- __s32 miimon; +-} ifbond; +- +-typedef struct ifslave { +- __s32 slave_id; /* Used as an IN param to the BOND_SLAVE_INFO_QUERY ioctl */ +- char slave_name[IFNAMSIZ]; +- __s8 link; +- __s8 state; +- __u32 link_failure_count; +-} ifslave; +- +-struct ad_info { +- __u16 aggregator_id; +- __u16 ports; +- __u16 actor_key; +- __u16 partner_key; +- __u8 partner_system[ETH_ALEN]; +-}; +- +-#endif /* _LINUX_IF_BONDING_H */ +- +-/* +- * Local variables: +- * version-control: t +- * kept-new-versions: 5 +- * c-indent-level: 8 +- * c-basic-offset: 8 +- * tab-width: 8 +- * End: +- */ +- +diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h +deleted file mode 100644 +index 156f443..0000000 +--- a/include/linux/if_bridge.h ++++ /dev/null +@@ -1,294 +0,0 @@ +-/* +- * Linux ethernet bridge +- * +- * Authors: +- * Lennert Buytenhek +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_IF_BRIDGE_H +-#define _LINUX_IF_BRIDGE_H +- +-#include +-#include +-#include +- +-#define SYSFS_BRIDGE_ATTR "bridge" +-#define SYSFS_BRIDGE_FDB "brforward" +-#define SYSFS_BRIDGE_PORT_SUBDIR "brif" +-#define SYSFS_BRIDGE_PORT_ATTR "brport" +-#define SYSFS_BRIDGE_PORT_LINK "bridge" +- +-#define BRCTL_VERSION 1 +- +-#define BRCTL_GET_VERSION 0 +-#define BRCTL_GET_BRIDGES 1 +-#define BRCTL_ADD_BRIDGE 2 +-#define BRCTL_DEL_BRIDGE 3 +-#define BRCTL_ADD_IF 4 +-#define BRCTL_DEL_IF 5 +-#define BRCTL_GET_BRIDGE_INFO 6 +-#define BRCTL_GET_PORT_LIST 7 +-#define BRCTL_SET_BRIDGE_FORWARD_DELAY 8 +-#define BRCTL_SET_BRIDGE_HELLO_TIME 9 +-#define BRCTL_SET_BRIDGE_MAX_AGE 10 +-#define BRCTL_SET_AGEING_TIME 11 +-#define BRCTL_SET_GC_INTERVAL 12 +-#define BRCTL_GET_PORT_INFO 13 +-#define BRCTL_SET_BRIDGE_STP_STATE 14 +-#define BRCTL_SET_BRIDGE_PRIORITY 15 +-#define BRCTL_SET_PORT_PRIORITY 16 +-#define BRCTL_SET_PATH_COST 17 +-#define BRCTL_GET_FDB_ENTRIES 18 +- +-#define BR_STATE_DISABLED 0 +-#define BR_STATE_LISTENING 1 +-#define BR_STATE_LEARNING 2 +-#define BR_STATE_FORWARDING 3 +-#define BR_STATE_BLOCKING 4 +- +-struct __bridge_info { +- __u64 designated_root; +- __u64 bridge_id; +- __u32 root_path_cost; +- __u32 max_age; +- __u32 hello_time; +- __u32 forward_delay; +- __u32 bridge_max_age; +- __u32 bridge_hello_time; +- __u32 bridge_forward_delay; +- __u8 topology_change; +- __u8 topology_change_detected; +- __u8 root_port; +- __u8 stp_enabled; +- __u32 ageing_time; +- __u32 gc_interval; +- __u32 hello_timer_value; +- __u32 tcn_timer_value; +- __u32 topology_change_timer_value; +- __u32 gc_timer_value; +-}; +- +-struct __port_info { +- __u64 designated_root; +- __u64 designated_bridge; +- __u16 port_id; +- __u16 designated_port; +- __u32 path_cost; +- __u32 designated_cost; +- __u8 state; +- __u8 top_change_ack; +- __u8 config_pending; +- __u8 unused0; +- __u32 message_age_timer_value; +- __u32 forward_delay_timer_value; +- __u32 hold_timer_value; +-}; +- +-struct __fdb_entry { +- __u8 mac_addr[ETH_ALEN]; +- __u8 port_no; +- __u8 is_local; +- __u32 ageing_timer_value; +- __u8 port_hi; +- __u8 pad0; +- __u16 unused; +-}; +- +-/* Bridge Flags */ +-#define BRIDGE_FLAGS_MASTER 1 /* Bridge command to/from master */ +-#define BRIDGE_FLAGS_SELF 2 /* Bridge command to/from lowerdev */ +- +-#define BRIDGE_MODE_VEB 0 /* Default loopback mode */ +-#define BRIDGE_MODE_VEPA 1 /* 802.1Qbg defined VEPA mode */ +-#define BRIDGE_MODE_UNDEF 0xFFFF /* mode undefined */ +- +-/* Bridge management nested attributes +- * [IFLA_AF_SPEC] = { +- * [IFLA_BRIDGE_FLAGS] +- * [IFLA_BRIDGE_MODE] +- * [IFLA_BRIDGE_VLAN_INFO] +- * } +- */ +-enum { +- IFLA_BRIDGE_FLAGS, +- IFLA_BRIDGE_MODE, +- IFLA_BRIDGE_VLAN_INFO, +- IFLA_BRIDGE_VLAN_TUNNEL_INFO, +- __IFLA_BRIDGE_MAX, +-}; +-#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1) +- +-#define BRIDGE_VLAN_INFO_MASTER (1<<0) /* Operate on Bridge device as well */ +-#define BRIDGE_VLAN_INFO_PVID (1<<1) /* VLAN is PVID, ingress untagged */ +-#define BRIDGE_VLAN_INFO_UNTAGGED (1<<2) /* VLAN egresses untagged */ +-#define BRIDGE_VLAN_INFO_RANGE_BEGIN (1<<3) /* VLAN is start of vlan range */ +-#define BRIDGE_VLAN_INFO_RANGE_END (1<<4) /* VLAN is end of vlan range */ +-#define BRIDGE_VLAN_INFO_BRENTRY (1<<5) /* Global bridge VLAN entry */ +- +-struct bridge_vlan_info { +- __u16 flags; +- __u16 vid; +-}; +- +-enum { +- IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC, +- IFLA_BRIDGE_VLAN_TUNNEL_ID, +- IFLA_BRIDGE_VLAN_TUNNEL_VID, +- IFLA_BRIDGE_VLAN_TUNNEL_FLAGS, +- __IFLA_BRIDGE_VLAN_TUNNEL_MAX, +-}; +- +-#define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1) +- +-struct bridge_vlan_xstats { +- __u64 rx_bytes; +- __u64 rx_packets; +- __u64 tx_bytes; +- __u64 tx_packets; +- __u16 vid; +- __u16 flags; +- __u32 pad2; +-}; +- +-/* Bridge multicast database attributes +- * [MDBA_MDB] = { +- * [MDBA_MDB_ENTRY] = { +- * [MDBA_MDB_ENTRY_INFO] { +- * struct br_mdb_entry +- * [MDBA_MDB_EATTR attributes] +- * } +- * } +- * } +- * [MDBA_ROUTER] = { +- * [MDBA_ROUTER_PORT] = { +- * u32 ifindex +- * [MDBA_ROUTER_PATTR attributes] +- * } +- * } +- */ +-enum { +- MDBA_UNSPEC, +- MDBA_MDB, +- MDBA_ROUTER, +- __MDBA_MAX, +-}; +-#define MDBA_MAX (__MDBA_MAX - 1) +- +-enum { +- MDBA_MDB_UNSPEC, +- MDBA_MDB_ENTRY, +- __MDBA_MDB_MAX, +-}; +-#define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1) +- +-enum { +- MDBA_MDB_ENTRY_UNSPEC, +- MDBA_MDB_ENTRY_INFO, +- __MDBA_MDB_ENTRY_MAX, +-}; +-#define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) +- +-/* per mdb entry additional attributes */ +-enum { +- MDBA_MDB_EATTR_UNSPEC, +- MDBA_MDB_EATTR_TIMER, +- __MDBA_MDB_EATTR_MAX +-}; +-#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1) +- +-/* multicast router types */ +-enum { +- MDB_RTR_TYPE_DISABLED, +- MDB_RTR_TYPE_TEMP_QUERY, +- MDB_RTR_TYPE_PERM, +- MDB_RTR_TYPE_TEMP +-}; +- +-enum { +- MDBA_ROUTER_UNSPEC, +- MDBA_ROUTER_PORT, +- __MDBA_ROUTER_MAX, +-}; +-#define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1) +- +-/* router port attributes */ +-enum { +- MDBA_ROUTER_PATTR_UNSPEC, +- MDBA_ROUTER_PATTR_TIMER, +- MDBA_ROUTER_PATTR_TYPE, +- __MDBA_ROUTER_PATTR_MAX +-}; +-#define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1) +- +-struct br_port_msg { +- __u8 family; +- __u32 ifindex; +-}; +- +-struct br_mdb_entry { +- __u32 ifindex; +-#define MDB_TEMPORARY 0 +-#define MDB_PERMANENT 1 +- __u8 state; +-#define MDB_FLAGS_OFFLOAD (1 << 0) +- __u8 flags; +- __u16 vid; +- struct { +- union { +- __be32 ip4; +- struct in6_addr ip6; +- } u; +- __be16 proto; +- } addr; +-}; +- +-enum { +- MDBA_SET_ENTRY_UNSPEC, +- MDBA_SET_ENTRY, +- __MDBA_SET_ENTRY_MAX, +-}; +-#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1) +- +-/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */ +-enum { +- BRIDGE_XSTATS_UNSPEC, +- BRIDGE_XSTATS_VLAN, +- BRIDGE_XSTATS_MCAST, +- BRIDGE_XSTATS_PAD, +- __BRIDGE_XSTATS_MAX +-}; +-#define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1) +- +-enum { +- BR_MCAST_DIR_RX, +- BR_MCAST_DIR_TX, +- BR_MCAST_DIR_SIZE +-}; +- +-/* IGMP/MLD statistics */ +-struct br_mcast_stats { +- __u64 igmp_v1queries[BR_MCAST_DIR_SIZE]; +- __u64 igmp_v2queries[BR_MCAST_DIR_SIZE]; +- __u64 igmp_v3queries[BR_MCAST_DIR_SIZE]; +- __u64 igmp_leaves[BR_MCAST_DIR_SIZE]; +- __u64 igmp_v1reports[BR_MCAST_DIR_SIZE]; +- __u64 igmp_v2reports[BR_MCAST_DIR_SIZE]; +- __u64 igmp_v3reports[BR_MCAST_DIR_SIZE]; +- __u64 igmp_parse_errors; +- +- __u64 mld_v1queries[BR_MCAST_DIR_SIZE]; +- __u64 mld_v2queries[BR_MCAST_DIR_SIZE]; +- __u64 mld_leaves[BR_MCAST_DIR_SIZE]; +- __u64 mld_v1reports[BR_MCAST_DIR_SIZE]; +- __u64 mld_v2reports[BR_MCAST_DIR_SIZE]; +- __u64 mld_parse_errors; +- +- __u64 mcast_bytes[BR_MCAST_DIR_SIZE]; +- __u64 mcast_packets[BR_MCAST_DIR_SIZE]; +-}; +-#endif /* _LINUX_IF_BRIDGE_H */ +diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h +deleted file mode 100644 +index 7dde037..0000000 +--- a/include/linux/if_ether.h ++++ /dev/null +@@ -1,158 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Global definitions for the Ethernet IEEE 802.3 interface. +- * +- * Version: @(#)if_ether.h 1.0.1a 02/08/94 +- * +- * Author: Fred N. van Kempen, +- * Donald Becker, +- * Alan Cox, +- * Steve Whitehouse, +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_IF_ETHER_H +-#define _LINUX_IF_ETHER_H +- +-#include +- +-/* +- * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble +- * and FCS/CRC (frame check sequence). +- */ +- +-#define ETH_ALEN 6 /* Octets in one ethernet addr */ +-#define ETH_HLEN 14 /* Total octets in header. */ +-#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ +-#define ETH_DATA_LEN 1500 /* Max. octets in payload */ +-#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */ +-#define ETH_FCS_LEN 4 /* Octets in the FCS */ +- +-#define ETH_MIN_MTU 68 /* Min IPv4 MTU per RFC791 */ +-#define ETH_MAX_MTU 0xFFFFU /* 65535, same as IP_MAX_MTU */ +- +-/* +- * These are the defined Ethernet Protocol ID's. +- */ +- +-#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */ +-#define ETH_P_PUP 0x0200 /* Xerox PUP packet */ +-#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ +-#define ETH_P_TSN 0x22F0 /* TSN (IEEE 1722) packet */ +-#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +-#define ETH_P_X25 0x0805 /* CCITT X.25 */ +-#define ETH_P_ARP 0x0806 /* Address Resolution packet */ +-#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */ +-#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */ +-#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */ +-#define ETH_P_BATMAN 0x4305 /* B.A.T.M.A.N.-Advanced packet [ NOT AN OFFICIALLY REGISTERED ID ] */ +-#define ETH_P_DEC 0x6000 /* DEC Assigned proto */ +-#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */ +-#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */ +-#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */ +-#define ETH_P_LAT 0x6004 /* DEC LAT */ +-#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */ +-#define ETH_P_CUST 0x6006 /* DEC Customer use */ +-#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */ +-#define ETH_P_TEB 0x6558 /* Trans Ether Bridging */ +-#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */ +-#define ETH_P_ATALK 0x809B /* Appletalk DDP */ +-#define ETH_P_AARP 0x80F3 /* Appletalk AARP */ +-#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ +-#define ETH_P_ERSPAN 0x88BE /* ERSPAN type II */ +-#define ETH_P_IPX 0x8137 /* IPX over DIX */ +-#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ +-#define ETH_P_PAUSE 0x8808 /* IEEE Pause frames. See 802.3 31B */ +-#define ETH_P_SLOW 0x8809 /* Slow Protocol. See 802.3ad 43B */ +-#define ETH_P_WCCP 0x883E /* Web-cache coordination protocol +- * defined in draft-wilson-wrec-wccp-v2-00.txt */ +-#define ETH_P_MPLS_UC 0x8847 /* MPLS Unicast traffic */ +-#define ETH_P_MPLS_MC 0x8848 /* MPLS Multicast traffic */ +-#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */ +-#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ +-#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ +-#define ETH_P_LINK_CTL 0x886c /* HPNA, wlan link local tunnel */ +-#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport +- * over Ethernet +- */ +-#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +-#define ETH_P_AOE 0x88A2 /* ATA over Ethernet */ +-#define ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */ +-#define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */ +-#define ETH_P_TIPC 0x88CA /* TIPC */ +-#define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */ +-#define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */ +-#define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */ +-#define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */ +-#define ETH_P_NCSI 0x88F8 /* NCSI protocol */ +-#define ETH_P_PRP 0x88FB /* IEC 62439-3 PRP/HSRv0 */ +-#define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */ +-#define ETH_P_IBOE 0x8915 /* Infiniband over Ethernet */ +-#define ETH_P_TDLS 0x890D /* TDLS */ +-#define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */ +-#define ETH_P_80221 0x8917 /* IEEE 802.21 Media Independent Handover Protocol */ +-#define ETH_P_HSR 0x892F /* IEC 62439-3 HSRv1 */ +-#define ETH_P_NSH 0x894F /* Network Service Header */ +-#define ETH_P_LOOPBACK 0x9000 /* Ethernet loopback packet, per IEEE 802.3 */ +-#define ETH_P_QINQ1 0x9100 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ +-#define ETH_P_QINQ2 0x9200 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ +-#define ETH_P_QINQ3 0x9300 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ +-#define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ +-#define ETH_P_IFE 0xED3E /* ForCES inter-FE LFB type */ +-#define ETH_P_AF_IUCV 0xFBFB /* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */ +- +-#define ETH_P_802_3_MIN 0x0600 /* If the value in the ethernet type is less than this value +- * then the frame is Ethernet II. Else it is 802.3 */ +- +-/* +- * Non DIX types. Won't clash for 1500 types. +- */ +- +-#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */ +-#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */ +-#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */ +-#define ETH_P_802_2 0x0004 /* 802.2 frames */ +-#define ETH_P_SNAP 0x0005 /* Internal only */ +-#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */ +-#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ +-#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ +-#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ +-#define ETH_P_CAN 0x000C /* CAN: Controller Area Network */ +-#define ETH_P_CANFD 0x000D /* CANFD: CAN flexible data rate*/ +-#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ +-#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ +-#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ +-#define ETH_P_CONTROL 0x0016 /* Card specific control frames */ +-#define ETH_P_IRDA 0x0017 /* Linux-IrDA */ +-#define ETH_P_ECONET 0x0018 /* Acorn Econet */ +-#define ETH_P_HDLC 0x0019 /* HDLC frames */ +-#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */ +-#define ETH_P_DSA 0x001B /* Distributed Switch Arch. */ +-#define ETH_P_TRAILER 0x001C /* Trailer switch tagging */ +-#define ETH_P_PHONET 0x00F5 /* Nokia Phonet frames */ +-#define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frame */ +-#define ETH_P_CAIF 0x00F7 /* ST-Ericsson CAIF protocol */ +-#define ETH_P_XDSA 0x00F8 /* Multiplexed DSA protocol */ +-#define ETH_P_MAP 0x00F9 /* Qualcomm multiplexing and +- * aggregation protocol +- */ +- +-/* +- * This is an Ethernet frame header. +- */ +- +-struct ethhdr { +- unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ +- unsigned char h_source[ETH_ALEN]; /* source ether addr */ +- __be16 h_proto; /* packet type ID field */ +-} __attribute__((packed)); +- +- +-#endif /* _LINUX_IF_ETHER_H */ +diff --git a/include/linux/if_link.h b/include/linux/if_link.h +deleted file mode 100644 +index 1f97d05..0000000 +--- a/include/linux/if_link.h ++++ /dev/null +@@ -1,928 +0,0 @@ +-#ifndef _LINUX_IF_LINK_H +-#define _LINUX_IF_LINK_H +- +-#include +-#include +- +-/* This struct should be in sync with struct rtnl_link_stats64 */ +-struct rtnl_link_stats { +- __u32 rx_packets; /* total packets received */ +- __u32 tx_packets; /* total packets transmitted */ +- __u32 rx_bytes; /* total bytes received */ +- __u32 tx_bytes; /* total bytes transmitted */ +- __u32 rx_errors; /* bad packets received */ +- __u32 tx_errors; /* packet transmit problems */ +- __u32 rx_dropped; /* no space in linux buffers */ +- __u32 tx_dropped; /* no space available in linux */ +- __u32 multicast; /* multicast packets received */ +- __u32 collisions; +- +- /* detailed rx_errors: */ +- __u32 rx_length_errors; +- __u32 rx_over_errors; /* receiver ring buff overflow */ +- __u32 rx_crc_errors; /* recved pkt with crc error */ +- __u32 rx_frame_errors; /* recv'd frame alignment error */ +- __u32 rx_fifo_errors; /* recv'r fifo overrun */ +- __u32 rx_missed_errors; /* receiver missed packet */ +- +- /* detailed tx_errors */ +- __u32 tx_aborted_errors; +- __u32 tx_carrier_errors; +- __u32 tx_fifo_errors; +- __u32 tx_heartbeat_errors; +- __u32 tx_window_errors; +- +- /* for cslip etc */ +- __u32 rx_compressed; +- __u32 tx_compressed; +- +- __u32 rx_nohandler; /* dropped, no handler found */ +-}; +- +-/* The main device statistics structure */ +-struct rtnl_link_stats64 { +- __u64 rx_packets; /* total packets received */ +- __u64 tx_packets; /* total packets transmitted */ +- __u64 rx_bytes; /* total bytes received */ +- __u64 tx_bytes; /* total bytes transmitted */ +- __u64 rx_errors; /* bad packets received */ +- __u64 tx_errors; /* packet transmit problems */ +- __u64 rx_dropped; /* no space in linux buffers */ +- __u64 tx_dropped; /* no space available in linux */ +- __u64 multicast; /* multicast packets received */ +- __u64 collisions; +- +- /* detailed rx_errors: */ +- __u64 rx_length_errors; +- __u64 rx_over_errors; /* receiver ring buff overflow */ +- __u64 rx_crc_errors; /* recved pkt with crc error */ +- __u64 rx_frame_errors; /* recv'd frame alignment error */ +- __u64 rx_fifo_errors; /* recv'r fifo overrun */ +- __u64 rx_missed_errors; /* receiver missed packet */ +- +- /* detailed tx_errors */ +- __u64 tx_aborted_errors; +- __u64 tx_carrier_errors; +- __u64 tx_fifo_errors; +- __u64 tx_heartbeat_errors; +- __u64 tx_window_errors; +- +- /* for cslip etc */ +- __u64 rx_compressed; +- __u64 tx_compressed; +- +- __u64 rx_nohandler; /* dropped, no handler found */ +-}; +- +-/* The struct should be in sync with struct ifmap */ +-struct rtnl_link_ifmap { +- __u64 mem_start; +- __u64 mem_end; +- __u64 base_addr; +- __u16 irq; +- __u8 dma; +- __u8 port; +-}; +- +-/* +- * IFLA_AF_SPEC +- * Contains nested attributes for address family specific attributes. +- * Each address family may create a attribute with the address family +- * number as type and create its own attribute structure in it. +- * +- * Example: +- * [IFLA_AF_SPEC] = { +- * [AF_INET] = { +- * [IFLA_INET_CONF] = ..., +- * }, +- * [AF_INET6] = { +- * [IFLA_INET6_FLAGS] = ..., +- * [IFLA_INET6_CONF] = ..., +- * } +- * } +- */ +- +-enum { +- IFLA_UNSPEC, +- IFLA_ADDRESS, +- IFLA_BROADCAST, +- IFLA_IFNAME, +- IFLA_MTU, +- IFLA_LINK, +- IFLA_QDISC, +- IFLA_STATS, +- IFLA_COST, +-#define IFLA_COST IFLA_COST +- IFLA_PRIORITY, +-#define IFLA_PRIORITY IFLA_PRIORITY +- IFLA_MASTER, +-#define IFLA_MASTER IFLA_MASTER +- IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ +-#define IFLA_WIRELESS IFLA_WIRELESS +- IFLA_PROTINFO, /* Protocol specific information for a link */ +-#define IFLA_PROTINFO IFLA_PROTINFO +- IFLA_TXQLEN, +-#define IFLA_TXQLEN IFLA_TXQLEN +- IFLA_MAP, +-#define IFLA_MAP IFLA_MAP +- IFLA_WEIGHT, +-#define IFLA_WEIGHT IFLA_WEIGHT +- IFLA_OPERSTATE, +- IFLA_LINKMODE, +- IFLA_LINKINFO, +-#define IFLA_LINKINFO IFLA_LINKINFO +- IFLA_NET_NS_PID, +- IFLA_IFALIAS, +- IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ +- IFLA_VFINFO_LIST, +- IFLA_STATS64, +- IFLA_VF_PORTS, +- IFLA_PORT_SELF, +- IFLA_AF_SPEC, +- IFLA_GROUP, /* Group the device belongs to */ +- IFLA_NET_NS_FD, +- IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ +- IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ +-#define IFLA_PROMISCUITY IFLA_PROMISCUITY +- IFLA_NUM_TX_QUEUES, +- IFLA_NUM_RX_QUEUES, +- IFLA_CARRIER, +- IFLA_PHYS_PORT_ID, +- IFLA_CARRIER_CHANGES, +- IFLA_PHYS_SWITCH_ID, +- IFLA_LINK_NETNSID, +- IFLA_PHYS_PORT_NAME, +- IFLA_PROTO_DOWN, +- IFLA_GSO_MAX_SEGS, +- IFLA_GSO_MAX_SIZE, +- IFLA_PAD, +- IFLA_XDP, +- IFLA_EVENT, +- __IFLA_MAX +-}; +- +- +-#define IFLA_MAX (__IFLA_MAX - 1) +- +-/* backwards compatibility for userspace */ +-#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) +-#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) +- +-enum { +- IFLA_INET_UNSPEC, +- IFLA_INET_CONF, +- __IFLA_INET_MAX, +-}; +- +-#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) +- +-/* ifi_flags. +- +- IFF_* flags. +- +- The only change is: +- IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are +- more not changeable by user. They describe link media +- characteristics and set by device driver. +- +- Comments: +- - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid +- - If neither of these three flags are set; +- the interface is NBMA. +- +- - IFF_MULTICAST does not mean anything special: +- multicasts can be used on all not-NBMA links. +- IFF_MULTICAST means that this media uses special encapsulation +- for multicast frames. Apparently, all IFF_POINTOPOINT and +- IFF_BROADCAST devices are able to use multicasts too. +- */ +- +-/* IFLA_LINK. +- For usual devices it is equal ifi_index. +- If it is a "virtual interface" (f.e. tunnel), ifi_link +- can point to real physical interface (f.e. for bandwidth calculations), +- or maybe 0, what means, that real media is unknown (usual +- for IPIP tunnels, when route to endpoint is allowed to change) +- */ +- +-/* Subtype attributes for IFLA_PROTINFO */ +-enum { +- IFLA_INET6_UNSPEC, +- IFLA_INET6_FLAGS, /* link flags */ +- IFLA_INET6_CONF, /* sysctl parameters */ +- IFLA_INET6_STATS, /* statistics */ +- IFLA_INET6_MCAST, /* MC things. What of them? */ +- IFLA_INET6_CACHEINFO, /* time values and max reasm size */ +- IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ +- IFLA_INET6_TOKEN, /* device token */ +- IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ +- __IFLA_INET6_MAX +-}; +- +-#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) +- +-enum in6_addr_gen_mode { +- IN6_ADDR_GEN_MODE_EUI64, +- IN6_ADDR_GEN_MODE_NONE, +- IN6_ADDR_GEN_MODE_STABLE_PRIVACY, +- IN6_ADDR_GEN_MODE_RANDOM, +-}; +- +-/* Bridge section */ +- +-enum { +- IFLA_BR_UNSPEC, +- IFLA_BR_FORWARD_DELAY, +- IFLA_BR_HELLO_TIME, +- IFLA_BR_MAX_AGE, +- IFLA_BR_AGEING_TIME, +- IFLA_BR_STP_STATE, +- IFLA_BR_PRIORITY, +- IFLA_BR_VLAN_FILTERING, +- IFLA_BR_VLAN_PROTOCOL, +- IFLA_BR_GROUP_FWD_MASK, +- IFLA_BR_ROOT_ID, +- IFLA_BR_BRIDGE_ID, +- IFLA_BR_ROOT_PORT, +- IFLA_BR_ROOT_PATH_COST, +- IFLA_BR_TOPOLOGY_CHANGE, +- IFLA_BR_TOPOLOGY_CHANGE_DETECTED, +- IFLA_BR_HELLO_TIMER, +- IFLA_BR_TCN_TIMER, +- IFLA_BR_TOPOLOGY_CHANGE_TIMER, +- IFLA_BR_GC_TIMER, +- IFLA_BR_GROUP_ADDR, +- IFLA_BR_FDB_FLUSH, +- IFLA_BR_MCAST_ROUTER, +- IFLA_BR_MCAST_SNOOPING, +- IFLA_BR_MCAST_QUERY_USE_IFADDR, +- IFLA_BR_MCAST_QUERIER, +- IFLA_BR_MCAST_HASH_ELASTICITY, +- IFLA_BR_MCAST_HASH_MAX, +- IFLA_BR_MCAST_LAST_MEMBER_CNT, +- IFLA_BR_MCAST_STARTUP_QUERY_CNT, +- IFLA_BR_MCAST_LAST_MEMBER_INTVL, +- IFLA_BR_MCAST_MEMBERSHIP_INTVL, +- IFLA_BR_MCAST_QUERIER_INTVL, +- IFLA_BR_MCAST_QUERY_INTVL, +- IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, +- IFLA_BR_MCAST_STARTUP_QUERY_INTVL, +- IFLA_BR_NF_CALL_IPTABLES, +- IFLA_BR_NF_CALL_IP6TABLES, +- IFLA_BR_NF_CALL_ARPTABLES, +- IFLA_BR_VLAN_DEFAULT_PVID, +- IFLA_BR_PAD, +- IFLA_BR_VLAN_STATS_ENABLED, +- IFLA_BR_MCAST_STATS_ENABLED, +- IFLA_BR_MCAST_IGMP_VERSION, +- IFLA_BR_MCAST_MLD_VERSION, +- __IFLA_BR_MAX, +-}; +- +-#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) +- +-struct ifla_bridge_id { +- __u8 prio[2]; +- __u8 addr[6]; /* ETH_ALEN */ +-}; +- +-enum { +- BRIDGE_MODE_UNSPEC, +- BRIDGE_MODE_HAIRPIN, +-}; +- +-enum { +- IFLA_BRPORT_UNSPEC, +- IFLA_BRPORT_STATE, /* Spanning tree state */ +- IFLA_BRPORT_PRIORITY, /* " priority */ +- IFLA_BRPORT_COST, /* " cost */ +- IFLA_BRPORT_MODE, /* mode (hairpin) */ +- IFLA_BRPORT_GUARD, /* bpdu guard */ +- IFLA_BRPORT_PROTECT, /* root port protection */ +- IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ +- IFLA_BRPORT_LEARNING, /* mac learning */ +- IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ +- IFLA_BRPORT_PROXYARP, /* proxy ARP */ +- IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ +- IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ +- IFLA_BRPORT_ROOT_ID, /* designated root */ +- IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ +- IFLA_BRPORT_DESIGNATED_PORT, +- IFLA_BRPORT_DESIGNATED_COST, +- IFLA_BRPORT_ID, +- IFLA_BRPORT_NO, +- IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, +- IFLA_BRPORT_CONFIG_PENDING, +- IFLA_BRPORT_MESSAGE_AGE_TIMER, +- IFLA_BRPORT_FORWARD_DELAY_TIMER, +- IFLA_BRPORT_HOLD_TIMER, +- IFLA_BRPORT_FLUSH, +- IFLA_BRPORT_MULTICAST_ROUTER, +- IFLA_BRPORT_PAD, +- IFLA_BRPORT_MCAST_FLOOD, +- IFLA_BRPORT_MCAST_TO_UCAST, +- IFLA_BRPORT_VLAN_TUNNEL, +- IFLA_BRPORT_BCAST_FLOOD, +- __IFLA_BRPORT_MAX +-}; +-#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) +- +-struct ifla_cacheinfo { +- __u32 max_reasm_len; +- __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ +- __u32 reachable_time; +- __u32 retrans_time; +-}; +- +-enum { +- IFLA_INFO_UNSPEC, +- IFLA_INFO_KIND, +- IFLA_INFO_DATA, +- IFLA_INFO_XSTATS, +- IFLA_INFO_SLAVE_KIND, +- IFLA_INFO_SLAVE_DATA, +- __IFLA_INFO_MAX, +-}; +- +-#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) +- +-/* VLAN section */ +- +-enum { +- IFLA_VLAN_UNSPEC, +- IFLA_VLAN_ID, +- IFLA_VLAN_FLAGS, +- IFLA_VLAN_EGRESS_QOS, +- IFLA_VLAN_INGRESS_QOS, +- IFLA_VLAN_PROTOCOL, +- __IFLA_VLAN_MAX, +-}; +- +-#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) +- +-struct ifla_vlan_flags { +- __u32 flags; +- __u32 mask; +-}; +- +-enum { +- IFLA_VLAN_QOS_UNSPEC, +- IFLA_VLAN_QOS_MAPPING, +- __IFLA_VLAN_QOS_MAX +-}; +- +-#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) +- +-struct ifla_vlan_qos_mapping { +- __u32 from; +- __u32 to; +-}; +- +-/* MACVLAN section */ +-enum { +- IFLA_MACVLAN_UNSPEC, +- IFLA_MACVLAN_MODE, +- IFLA_MACVLAN_FLAGS, +- IFLA_MACVLAN_MACADDR_MODE, +- IFLA_MACVLAN_MACADDR, +- IFLA_MACVLAN_MACADDR_DATA, +- IFLA_MACVLAN_MACADDR_COUNT, +- __IFLA_MACVLAN_MAX, +-}; +- +-#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) +- +-enum macvlan_mode { +- MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ +- MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ +- MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ +- MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ +- MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ +-}; +- +-enum macvlan_macaddr_mode { +- MACVLAN_MACADDR_ADD, +- MACVLAN_MACADDR_DEL, +- MACVLAN_MACADDR_FLUSH, +- MACVLAN_MACADDR_SET, +-}; +- +-#define MACVLAN_FLAG_NOPROMISC 1 +- +-/* VRF section */ +-enum { +- IFLA_VRF_UNSPEC, +- IFLA_VRF_TABLE, +- __IFLA_VRF_MAX +-}; +- +-#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) +- +-enum { +- IFLA_VRF_PORT_UNSPEC, +- IFLA_VRF_PORT_TABLE, +- __IFLA_VRF_PORT_MAX +-}; +- +-#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) +- +-/* MACSEC section */ +-enum { +- IFLA_MACSEC_UNSPEC, +- IFLA_MACSEC_SCI, +- IFLA_MACSEC_PORT, +- IFLA_MACSEC_ICV_LEN, +- IFLA_MACSEC_CIPHER_SUITE, +- IFLA_MACSEC_WINDOW, +- IFLA_MACSEC_ENCODING_SA, +- IFLA_MACSEC_ENCRYPT, +- IFLA_MACSEC_PROTECT, +- IFLA_MACSEC_INC_SCI, +- IFLA_MACSEC_ES, +- IFLA_MACSEC_SCB, +- IFLA_MACSEC_REPLAY_PROTECT, +- IFLA_MACSEC_VALIDATION, +- IFLA_MACSEC_PAD, +- __IFLA_MACSEC_MAX, +-}; +- +-#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) +- +-enum macsec_validation_type { +- MACSEC_VALIDATE_DISABLED = 0, +- MACSEC_VALIDATE_CHECK = 1, +- MACSEC_VALIDATE_STRICT = 2, +- __MACSEC_VALIDATE_END, +- MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, +-}; +- +-/* IPVLAN section */ +-enum { +- IFLA_IPVLAN_UNSPEC, +- IFLA_IPVLAN_MODE, +- __IFLA_IPVLAN_MAX +-}; +- +-#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) +- +-enum ipvlan_mode { +- IPVLAN_MODE_L2 = 0, +- IPVLAN_MODE_L3, +- IPVLAN_MODE_L3S, +- IPVLAN_MODE_MAX +-}; +- +-/* VXLAN section */ +-enum { +- IFLA_VXLAN_UNSPEC, +- IFLA_VXLAN_ID, +- IFLA_VXLAN_GROUP, /* group or remote address */ +- IFLA_VXLAN_LINK, +- IFLA_VXLAN_LOCAL, +- IFLA_VXLAN_TTL, +- IFLA_VXLAN_TOS, +- IFLA_VXLAN_LEARNING, +- IFLA_VXLAN_AGEING, +- IFLA_VXLAN_LIMIT, +- IFLA_VXLAN_PORT_RANGE, /* source port */ +- IFLA_VXLAN_PROXY, +- IFLA_VXLAN_RSC, +- IFLA_VXLAN_L2MISS, +- IFLA_VXLAN_L3MISS, +- IFLA_VXLAN_PORT, /* destination port */ +- IFLA_VXLAN_GROUP6, +- IFLA_VXLAN_LOCAL6, +- IFLA_VXLAN_UDP_CSUM, +- IFLA_VXLAN_UDP_ZERO_CSUM6_TX, +- IFLA_VXLAN_UDP_ZERO_CSUM6_RX, +- IFLA_VXLAN_REMCSUM_TX, +- IFLA_VXLAN_REMCSUM_RX, +- IFLA_VXLAN_GBP, +- IFLA_VXLAN_REMCSUM_NOPARTIAL, +- IFLA_VXLAN_COLLECT_METADATA, +- IFLA_VXLAN_LABEL, +- IFLA_VXLAN_GPE, +- __IFLA_VXLAN_MAX +-}; +-#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) +- +-struct ifla_vxlan_port_range { +- __be16 low; +- __be16 high; +-}; +- +-/* GENEVE section */ +-enum { +- IFLA_GENEVE_UNSPEC, +- IFLA_GENEVE_ID, +- IFLA_GENEVE_REMOTE, +- IFLA_GENEVE_TTL, +- IFLA_GENEVE_TOS, +- IFLA_GENEVE_PORT, /* destination port */ +- IFLA_GENEVE_COLLECT_METADATA, +- IFLA_GENEVE_REMOTE6, +- IFLA_GENEVE_UDP_CSUM, +- IFLA_GENEVE_UDP_ZERO_CSUM6_TX, +- IFLA_GENEVE_UDP_ZERO_CSUM6_RX, +- IFLA_GENEVE_LABEL, +- __IFLA_GENEVE_MAX +-}; +-#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) +- +-/* PPP section */ +-enum { +- IFLA_PPP_UNSPEC, +- IFLA_PPP_DEV_FD, +- __IFLA_PPP_MAX +-}; +-#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) +- +-/* GTP section */ +- +-enum ifla_gtp_role { +- GTP_ROLE_GGSN = 0, +- GTP_ROLE_SGSN, +-}; +- +-enum { +- IFLA_GTP_UNSPEC, +- IFLA_GTP_FD0, +- IFLA_GTP_FD1, +- IFLA_GTP_PDP_HASHSIZE, +- IFLA_GTP_ROLE, +- __IFLA_GTP_MAX, +-}; +-#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) +- +-/* Bonding section */ +- +-enum { +- IFLA_BOND_UNSPEC, +- IFLA_BOND_MODE, +- IFLA_BOND_ACTIVE_SLAVE, +- IFLA_BOND_MIIMON, +- IFLA_BOND_UPDELAY, +- IFLA_BOND_DOWNDELAY, +- IFLA_BOND_USE_CARRIER, +- IFLA_BOND_ARP_INTERVAL, +- IFLA_BOND_ARP_IP_TARGET, +- IFLA_BOND_ARP_VALIDATE, +- IFLA_BOND_ARP_ALL_TARGETS, +- IFLA_BOND_PRIMARY, +- IFLA_BOND_PRIMARY_RESELECT, +- IFLA_BOND_FAIL_OVER_MAC, +- IFLA_BOND_XMIT_HASH_POLICY, +- IFLA_BOND_RESEND_IGMP, +- IFLA_BOND_NUM_PEER_NOTIF, +- IFLA_BOND_ALL_SLAVES_ACTIVE, +- IFLA_BOND_MIN_LINKS, +- IFLA_BOND_LP_INTERVAL, +- IFLA_BOND_PACKETS_PER_SLAVE, +- IFLA_BOND_AD_LACP_RATE, +- IFLA_BOND_AD_SELECT, +- IFLA_BOND_AD_INFO, +- IFLA_BOND_AD_ACTOR_SYS_PRIO, +- IFLA_BOND_AD_USER_PORT_KEY, +- IFLA_BOND_AD_ACTOR_SYSTEM, +- IFLA_BOND_TLB_DYNAMIC_LB, +- __IFLA_BOND_MAX, +-}; +- +-#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) +- +-enum { +- IFLA_BOND_AD_INFO_UNSPEC, +- IFLA_BOND_AD_INFO_AGGREGATOR, +- IFLA_BOND_AD_INFO_NUM_PORTS, +- IFLA_BOND_AD_INFO_ACTOR_KEY, +- IFLA_BOND_AD_INFO_PARTNER_KEY, +- IFLA_BOND_AD_INFO_PARTNER_MAC, +- __IFLA_BOND_AD_INFO_MAX, +-}; +- +-#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) +- +-enum { +- IFLA_BOND_SLAVE_UNSPEC, +- IFLA_BOND_SLAVE_STATE, +- IFLA_BOND_SLAVE_MII_STATUS, +- IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, +- IFLA_BOND_SLAVE_PERM_HWADDR, +- IFLA_BOND_SLAVE_QUEUE_ID, +- IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, +- IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, +- IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, +- __IFLA_BOND_SLAVE_MAX, +-}; +- +-#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) +- +-/* SR-IOV virtual function management section */ +- +-enum { +- IFLA_VF_INFO_UNSPEC, +- IFLA_VF_INFO, +- __IFLA_VF_INFO_MAX, +-}; +- +-#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) +- +-enum { +- IFLA_VF_UNSPEC, +- IFLA_VF_MAC, /* Hardware queue specific attributes */ +- IFLA_VF_VLAN, /* VLAN ID and QoS */ +- IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ +- IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ +- IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ +- IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ +- IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query +- * on/off switch +- */ +- IFLA_VF_STATS, /* network device statistics */ +- IFLA_VF_TRUST, /* Trust VF */ +- IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ +- IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ +- IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ +- __IFLA_VF_MAX, +-}; +- +-#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) +- +-struct ifla_vf_mac { +- __u32 vf; +- __u8 mac[32]; /* MAX_ADDR_LEN */ +-}; +- +-struct ifla_vf_vlan { +- __u32 vf; +- __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ +- __u32 qos; +-}; +- +-enum { +- IFLA_VF_VLAN_INFO_UNSPEC, +- IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ +- __IFLA_VF_VLAN_INFO_MAX, +-}; +- +-#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) +-#define MAX_VLAN_LIST_LEN 1 +- +-struct ifla_vf_vlan_info { +- __u32 vf; +- __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ +- __u32 qos; +- __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ +-}; +- +-struct ifla_vf_tx_rate { +- __u32 vf; +- __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +-}; +- +-struct ifla_vf_rate { +- __u32 vf; +- __u32 min_tx_rate; /* Min Bandwidth in Mbps */ +- __u32 max_tx_rate; /* Max Bandwidth in Mbps */ +-}; +- +-struct ifla_vf_spoofchk { +- __u32 vf; +- __u32 setting; +-}; +- +-struct ifla_vf_guid { +- __u32 vf; +- __u64 guid; +-}; +- +-enum { +- IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ +- IFLA_VF_LINK_STATE_ENABLE, /* link always up */ +- IFLA_VF_LINK_STATE_DISABLE, /* link always down */ +- __IFLA_VF_LINK_STATE_MAX, +-}; +- +-struct ifla_vf_link_state { +- __u32 vf; +- __u32 link_state; +-}; +- +-struct ifla_vf_rss_query_en { +- __u32 vf; +- __u32 setting; +-}; +- +-enum { +- IFLA_VF_STATS_RX_PACKETS, +- IFLA_VF_STATS_TX_PACKETS, +- IFLA_VF_STATS_RX_BYTES, +- IFLA_VF_STATS_TX_BYTES, +- IFLA_VF_STATS_BROADCAST, +- IFLA_VF_STATS_MULTICAST, +- IFLA_VF_STATS_PAD, +- __IFLA_VF_STATS_MAX, +-}; +- +-#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) +- +-struct ifla_vf_trust { +- __u32 vf; +- __u32 setting; +-}; +- +-/* VF ports management section +- * +- * Nested layout of set/get msg is: +- * +- * [IFLA_NUM_VF] +- * [IFLA_VF_PORTS] +- * [IFLA_VF_PORT] +- * [IFLA_PORT_*], ... +- * [IFLA_VF_PORT] +- * [IFLA_PORT_*], ... +- * ... +- * [IFLA_PORT_SELF] +- * [IFLA_PORT_*], ... +- */ +- +-enum { +- IFLA_VF_PORT_UNSPEC, +- IFLA_VF_PORT, /* nest */ +- __IFLA_VF_PORT_MAX, +-}; +- +-#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) +- +-enum { +- IFLA_PORT_UNSPEC, +- IFLA_PORT_VF, /* __u32 */ +- IFLA_PORT_PROFILE, /* string */ +- IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ +- IFLA_PORT_INSTANCE_UUID, /* binary UUID */ +- IFLA_PORT_HOST_UUID, /* binary UUID */ +- IFLA_PORT_REQUEST, /* __u8 */ +- IFLA_PORT_RESPONSE, /* __u16, output only */ +- __IFLA_PORT_MAX, +-}; +- +-#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) +- +-#define PORT_PROFILE_MAX 40 +-#define PORT_UUID_MAX 16 +-#define PORT_SELF_VF -1 +- +-enum { +- PORT_REQUEST_PREASSOCIATE = 0, +- PORT_REQUEST_PREASSOCIATE_RR, +- PORT_REQUEST_ASSOCIATE, +- PORT_REQUEST_DISASSOCIATE, +-}; +- +-enum { +- PORT_VDP_RESPONSE_SUCCESS = 0, +- PORT_VDP_RESPONSE_INVALID_FORMAT, +- PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, +- PORT_VDP_RESPONSE_UNUSED_VTID, +- PORT_VDP_RESPONSE_VTID_VIOLATION, +- PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, +- PORT_VDP_RESPONSE_OUT_OF_SYNC, +- /* 0x08-0xFF reserved for future VDP use */ +- PORT_PROFILE_RESPONSE_SUCCESS = 0x100, +- PORT_PROFILE_RESPONSE_INPROGRESS, +- PORT_PROFILE_RESPONSE_INVALID, +- PORT_PROFILE_RESPONSE_BADSTATE, +- PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, +- PORT_PROFILE_RESPONSE_ERROR, +-}; +- +-struct ifla_port_vsi { +- __u8 vsi_mgr_id; +- __u8 vsi_type_id[3]; +- __u8 vsi_type_version; +- __u8 pad[3]; +-}; +- +- +-/* IPoIB section */ +- +-enum { +- IFLA_IPOIB_UNSPEC, +- IFLA_IPOIB_PKEY, +- IFLA_IPOIB_MODE, +- IFLA_IPOIB_UMCAST, +- __IFLA_IPOIB_MAX +-}; +- +-enum { +- IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ +- IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ +-}; +- +-#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) +- +- +-/* HSR section */ +- +-enum { +- IFLA_HSR_UNSPEC, +- IFLA_HSR_SLAVE1, +- IFLA_HSR_SLAVE2, +- IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ +- IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ +- IFLA_HSR_SEQ_NR, +- IFLA_HSR_VERSION, /* HSR version */ +- __IFLA_HSR_MAX, +-}; +- +-#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) +- +-/* STATS section */ +- +-struct if_stats_msg { +- __u8 family; +- __u8 pad1; +- __u16 pad2; +- __u32 ifindex; +- __u32 filter_mask; +-}; +- +-/* A stats attribute can be netdev specific or a global stat. +- * For netdev stats, lets use the prefix IFLA_STATS_LINK_* +- */ +-enum { +- IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ +- IFLA_STATS_LINK_64, +- IFLA_STATS_LINK_XSTATS, +- IFLA_STATS_LINK_XSTATS_SLAVE, +- IFLA_STATS_LINK_OFFLOAD_XSTATS, +- IFLA_STATS_AF_SPEC, +- __IFLA_STATS_MAX, +-}; +- +-#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) +- +-#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) +- +-/* These are embedded into IFLA_STATS_LINK_XSTATS: +- * [IFLA_STATS_LINK_XSTATS] +- * -> [LINK_XSTATS_TYPE_xxx] +- * -> [rtnl link type specific attributes] +- */ +-enum { +- LINK_XSTATS_TYPE_UNSPEC, +- LINK_XSTATS_TYPE_BRIDGE, +- __LINK_XSTATS_TYPE_MAX +-}; +-#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) +- +-/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ +-enum { +- IFLA_OFFLOAD_XSTATS_UNSPEC, +- IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ +- __IFLA_OFFLOAD_XSTATS_MAX +-}; +-#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) +- +-/* XDP section */ +- +-#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) +-#define XDP_FLAGS_SKB_MODE (1U << 1) +-#define XDP_FLAGS_DRV_MODE (1U << 2) +-#define XDP_FLAGS_HW_MODE (1U << 3) +-#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ +- XDP_FLAGS_DRV_MODE | \ +- XDP_FLAGS_HW_MODE) +-#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ +- XDP_FLAGS_MODES) +- +-/* These are stored into IFLA_XDP_ATTACHED on dump. */ +-enum { +- XDP_ATTACHED_NONE = 0, +- XDP_ATTACHED_DRV, +- XDP_ATTACHED_SKB, +- XDP_ATTACHED_HW, +-}; +- +-enum { +- IFLA_XDP_UNSPEC, +- IFLA_XDP_FD, +- IFLA_XDP_ATTACHED, +- IFLA_XDP_FLAGS, +- IFLA_XDP_PROG_ID, +- __IFLA_XDP_MAX, +-}; +- +-#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) +- +-enum { +- IFLA_EVENT_NONE, +- IFLA_EVENT_REBOOT, /* internal reset / reboot */ +- IFLA_EVENT_FEATURES, /* change in offload features */ +- IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ +- IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ +- IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ +- IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ +-}; +- +-#endif /* _LINUX_IF_LINK_H */ +diff --git a/include/linux/if_macsec.h b/include/linux/if_macsec.h +deleted file mode 100644 +index 22939a3..0000000 +--- a/include/linux/if_macsec.h ++++ /dev/null +@@ -1,171 +0,0 @@ +-/* +- * include/uapi/linux/if_macsec.h - MACsec device +- * +- * Copyright (c) 2015 Sabrina Dubroca +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _MACSEC_H +-#define _MACSEC_H +- +-#include +- +-#define MACSEC_GENL_NAME "macsec" +-#define MACSEC_GENL_VERSION 1 +- +-#define MACSEC_MAX_KEY_LEN 128 +- +-#define MACSEC_KEYID_LEN 16 +- +-#define MACSEC_DEFAULT_CIPHER_ID 0x0080020001000001ULL +-#define MACSEC_DEFAULT_CIPHER_ALT 0x0080C20001000001ULL +- +-#define MACSEC_MIN_ICV_LEN 8 +-#define MACSEC_MAX_ICV_LEN 32 +-/* upper limit for ICV length as recommended by IEEE802.1AE-2006 */ +-#define MACSEC_STD_ICV_LEN 16 +- +-enum macsec_attrs { +- MACSEC_ATTR_UNSPEC, +- MACSEC_ATTR_IFINDEX, /* u32, ifindex of the MACsec netdevice */ +- MACSEC_ATTR_RXSC_CONFIG, /* config, nested macsec_rxsc_attrs */ +- MACSEC_ATTR_SA_CONFIG, /* config, nested macsec_sa_attrs */ +- MACSEC_ATTR_SECY, /* dump, nested macsec_secy_attrs */ +- MACSEC_ATTR_TXSA_LIST, /* dump, nested, macsec_sa_attrs for each TXSA */ +- MACSEC_ATTR_RXSC_LIST, /* dump, nested, macsec_rxsc_attrs for each RXSC */ +- MACSEC_ATTR_TXSC_STATS, /* dump, nested, macsec_txsc_stats_attr */ +- MACSEC_ATTR_SECY_STATS, /* dump, nested, macsec_secy_stats_attr */ +- __MACSEC_ATTR_END, +- NUM_MACSEC_ATTR = __MACSEC_ATTR_END, +- MACSEC_ATTR_MAX = __MACSEC_ATTR_END - 1, +-}; +- +-enum macsec_secy_attrs { +- MACSEC_SECY_ATTR_UNSPEC, +- MACSEC_SECY_ATTR_SCI, +- MACSEC_SECY_ATTR_ENCODING_SA, +- MACSEC_SECY_ATTR_WINDOW, +- MACSEC_SECY_ATTR_CIPHER_SUITE, +- MACSEC_SECY_ATTR_ICV_LEN, +- MACSEC_SECY_ATTR_PROTECT, +- MACSEC_SECY_ATTR_REPLAY, +- MACSEC_SECY_ATTR_OPER, +- MACSEC_SECY_ATTR_VALIDATE, +- MACSEC_SECY_ATTR_ENCRYPT, +- MACSEC_SECY_ATTR_INC_SCI, +- MACSEC_SECY_ATTR_ES, +- MACSEC_SECY_ATTR_SCB, +- MACSEC_SECY_ATTR_PAD, +- __MACSEC_SECY_ATTR_END, +- NUM_MACSEC_SECY_ATTR = __MACSEC_SECY_ATTR_END, +- MACSEC_SECY_ATTR_MAX = __MACSEC_SECY_ATTR_END - 1, +-}; +- +-enum macsec_rxsc_attrs { +- MACSEC_RXSC_ATTR_UNSPEC, +- MACSEC_RXSC_ATTR_SCI, /* config/dump, u64 */ +- MACSEC_RXSC_ATTR_ACTIVE, /* config/dump, u8 0..1 */ +- MACSEC_RXSC_ATTR_SA_LIST, /* dump, nested */ +- MACSEC_RXSC_ATTR_STATS, /* dump, nested, macsec_rxsc_stats_attr */ +- MACSEC_RXSC_ATTR_PAD, +- __MACSEC_RXSC_ATTR_END, +- NUM_MACSEC_RXSC_ATTR = __MACSEC_RXSC_ATTR_END, +- MACSEC_RXSC_ATTR_MAX = __MACSEC_RXSC_ATTR_END - 1, +-}; +- +-enum macsec_sa_attrs { +- MACSEC_SA_ATTR_UNSPEC, +- MACSEC_SA_ATTR_AN, /* config/dump, u8 0..3 */ +- MACSEC_SA_ATTR_ACTIVE, /* config/dump, u8 0..1 */ +- MACSEC_SA_ATTR_PN, /* config/dump, u32 */ +- MACSEC_SA_ATTR_KEY, /* config, data */ +- MACSEC_SA_ATTR_KEYID, /* config/dump, 128-bit */ +- MACSEC_SA_ATTR_STATS, /* dump, nested, macsec_sa_stats_attr */ +- MACSEC_SA_ATTR_PAD, +- __MACSEC_SA_ATTR_END, +- NUM_MACSEC_SA_ATTR = __MACSEC_SA_ATTR_END, +- MACSEC_SA_ATTR_MAX = __MACSEC_SA_ATTR_END - 1, +-}; +- +-enum macsec_nl_commands { +- MACSEC_CMD_GET_TXSC, +- MACSEC_CMD_ADD_RXSC, +- MACSEC_CMD_DEL_RXSC, +- MACSEC_CMD_UPD_RXSC, +- MACSEC_CMD_ADD_TXSA, +- MACSEC_CMD_DEL_TXSA, +- MACSEC_CMD_UPD_TXSA, +- MACSEC_CMD_ADD_RXSA, +- MACSEC_CMD_DEL_RXSA, +- MACSEC_CMD_UPD_RXSA, +-}; +- +-/* u64 per-RXSC stats */ +-enum macsec_rxsc_stats_attr { +- MACSEC_RXSC_STATS_ATTR_UNSPEC, +- MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED, +- MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA, +- MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA, +- MACSEC_RXSC_STATS_ATTR_PAD, +- __MACSEC_RXSC_STATS_ATTR_END, +- NUM_MACSEC_RXSC_STATS_ATTR = __MACSEC_RXSC_STATS_ATTR_END, +- MACSEC_RXSC_STATS_ATTR_MAX = __MACSEC_RXSC_STATS_ATTR_END - 1, +-}; +- +-/* u32 per-{RX,TX}SA stats */ +-enum macsec_sa_stats_attr { +- MACSEC_SA_STATS_ATTR_UNSPEC, +- MACSEC_SA_STATS_ATTR_IN_PKTS_OK, +- MACSEC_SA_STATS_ATTR_IN_PKTS_INVALID, +- MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_VALID, +- MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_USING_SA, +- MACSEC_SA_STATS_ATTR_IN_PKTS_UNUSED_SA, +- MACSEC_SA_STATS_ATTR_OUT_PKTS_PROTECTED, +- MACSEC_SA_STATS_ATTR_OUT_PKTS_ENCRYPTED, +- __MACSEC_SA_STATS_ATTR_END, +- NUM_MACSEC_SA_STATS_ATTR = __MACSEC_SA_STATS_ATTR_END, +- MACSEC_SA_STATS_ATTR_MAX = __MACSEC_SA_STATS_ATTR_END - 1, +-}; +- +-/* u64 per-TXSC stats */ +-enum macsec_txsc_stats_attr { +- MACSEC_TXSC_STATS_ATTR_UNSPEC, +- MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED, +- MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED, +- MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED, +- MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED, +- MACSEC_TXSC_STATS_ATTR_PAD, +- __MACSEC_TXSC_STATS_ATTR_END, +- NUM_MACSEC_TXSC_STATS_ATTR = __MACSEC_TXSC_STATS_ATTR_END, +- MACSEC_TXSC_STATS_ATTR_MAX = __MACSEC_TXSC_STATS_ATTR_END - 1, +-}; +- +-/* u64 per-SecY stats */ +-enum macsec_secy_stats_attr { +- MACSEC_SECY_STATS_ATTR_UNSPEC, +- MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED, +- MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED, +- MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG, +- MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG, +- MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG, +- MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI, +- MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI, +- MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN, +- MACSEC_SECY_STATS_ATTR_PAD, +- __MACSEC_SECY_STATS_ATTR_END, +- NUM_MACSEC_SECY_STATS_ATTR = __MACSEC_SECY_STATS_ATTR_END, +- MACSEC_SECY_STATS_ATTR_MAX = __MACSEC_SECY_STATS_ATTR_END - 1, +-}; +- +-#endif /* _MACSEC_H */ +diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h +deleted file mode 100644 +index 4df96a7..0000000 +--- a/include/linux/if_packet.h ++++ /dev/null +@@ -1,302 +0,0 @@ +-#ifndef __LINUX_IF_PACKET_H +-#define __LINUX_IF_PACKET_H +- +-#include +- +-struct sockaddr_pkt { +- unsigned short spkt_family; +- unsigned char spkt_device[14]; +- __be16 spkt_protocol; +-}; +- +-struct sockaddr_ll { +- unsigned short sll_family; +- __be16 sll_protocol; +- int sll_ifindex; +- unsigned short sll_hatype; +- unsigned char sll_pkttype; +- unsigned char sll_halen; +- unsigned char sll_addr[8]; +-}; +- +-/* Packet types */ +- +-#define PACKET_HOST 0 /* To us */ +-#define PACKET_BROADCAST 1 /* To all */ +-#define PACKET_MULTICAST 2 /* To group */ +-#define PACKET_OTHERHOST 3 /* To someone else */ +-#define PACKET_OUTGOING 4 /* Outgoing of any type */ +-#define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */ +-#define PACKET_USER 6 /* To user space */ +-#define PACKET_KERNEL 7 /* To kernel space */ +-/* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ +-#define PACKET_FASTROUTE 6 /* Fastrouted frame */ +- +-/* Packet socket options */ +- +-#define PACKET_ADD_MEMBERSHIP 1 +-#define PACKET_DROP_MEMBERSHIP 2 +-#define PACKET_RECV_OUTPUT 3 +-/* Value 4 is still used by obsolete turbo-packet. */ +-#define PACKET_RX_RING 5 +-#define PACKET_STATISTICS 6 +-#define PACKET_COPY_THRESH 7 +-#define PACKET_AUXDATA 8 +-#define PACKET_ORIGDEV 9 +-#define PACKET_VERSION 10 +-#define PACKET_HDRLEN 11 +-#define PACKET_RESERVE 12 +-#define PACKET_TX_RING 13 +-#define PACKET_LOSS 14 +-#define PACKET_VNET_HDR 15 +-#define PACKET_TX_TIMESTAMP 16 +-#define PACKET_TIMESTAMP 17 +-#define PACKET_FANOUT 18 +-#define PACKET_TX_HAS_OFF 19 +-#define PACKET_QDISC_BYPASS 20 +-#define PACKET_ROLLOVER_STATS 21 +-#define PACKET_FANOUT_DATA 22 +- +-#define PACKET_FANOUT_HASH 0 +-#define PACKET_FANOUT_LB 1 +-#define PACKET_FANOUT_CPU 2 +-#define PACKET_FANOUT_ROLLOVER 3 +-#define PACKET_FANOUT_RND 4 +-#define PACKET_FANOUT_QM 5 +-#define PACKET_FANOUT_CBPF 6 +-#define PACKET_FANOUT_EBPF 7 +-#define PACKET_FANOUT_FLAG_ROLLOVER 0x1000 +-#define PACKET_FANOUT_FLAG_UNIQUEID 0x2000 +-#define PACKET_FANOUT_FLAG_DEFRAG 0x8000 +- +-struct tpacket_stats { +- unsigned int tp_packets; +- unsigned int tp_drops; +-}; +- +-struct tpacket_stats_v3 { +- unsigned int tp_packets; +- unsigned int tp_drops; +- unsigned int tp_freeze_q_cnt; +-}; +- +-struct tpacket_rollover_stats { +- __aligned_u64 tp_all; +- __aligned_u64 tp_huge; +- __aligned_u64 tp_failed; +-}; +- +-union tpacket_stats_u { +- struct tpacket_stats stats1; +- struct tpacket_stats_v3 stats3; +-}; +- +-struct tpacket_auxdata { +- __u32 tp_status; +- __u32 tp_len; +- __u32 tp_snaplen; +- __u16 tp_mac; +- __u16 tp_net; +- __u16 tp_vlan_tci; +- __u16 tp_vlan_tpid; +-}; +- +-/* Rx ring - header status */ +-#define TP_STATUS_KERNEL 0 +-#define TP_STATUS_USER (1 << 0) +-#define TP_STATUS_COPY (1 << 1) +-#define TP_STATUS_LOSING (1 << 2) +-#define TP_STATUS_CSUMNOTREADY (1 << 3) +-#define TP_STATUS_VLAN_VALID (1 << 4) /* auxdata has valid tp_vlan_tci */ +-#define TP_STATUS_BLK_TMO (1 << 5) +-#define TP_STATUS_VLAN_TPID_VALID (1 << 6) /* auxdata has valid tp_vlan_tpid */ +-#define TP_STATUS_CSUM_VALID (1 << 7) +- +-/* Tx ring - header status */ +-#define TP_STATUS_AVAILABLE 0 +-#define TP_STATUS_SEND_REQUEST (1 << 0) +-#define TP_STATUS_SENDING (1 << 1) +-#define TP_STATUS_WRONG_FORMAT (1 << 2) +- +-/* Rx and Tx ring - header status */ +-#define TP_STATUS_TS_SOFTWARE (1 << 29) +-#define TP_STATUS_TS_SYS_HARDWARE (1 << 30) /* deprecated, never set */ +-#define TP_STATUS_TS_RAW_HARDWARE (1 << 31) +- +-/* Rx ring - feature request bits */ +-#define TP_FT_REQ_FILL_RXHASH 0x1 +- +-struct tpacket_hdr { +- unsigned long tp_status; +- unsigned int tp_len; +- unsigned int tp_snaplen; +- unsigned short tp_mac; +- unsigned short tp_net; +- unsigned int tp_sec; +- unsigned int tp_usec; +-}; +- +-#define TPACKET_ALIGNMENT 16 +-#define TPACKET_ALIGN(x) (((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1)) +-#define TPACKET_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll)) +- +-struct tpacket2_hdr { +- __u32 tp_status; +- __u32 tp_len; +- __u32 tp_snaplen; +- __u16 tp_mac; +- __u16 tp_net; +- __u32 tp_sec; +- __u32 tp_nsec; +- __u16 tp_vlan_tci; +- __u16 tp_vlan_tpid; +- __u8 tp_padding[4]; +-}; +- +-struct tpacket_hdr_variant1 { +- __u32 tp_rxhash; +- __u32 tp_vlan_tci; +- __u16 tp_vlan_tpid; +- __u16 tp_padding; +-}; +- +-struct tpacket3_hdr { +- __u32 tp_next_offset; +- __u32 tp_sec; +- __u32 tp_nsec; +- __u32 tp_snaplen; +- __u32 tp_len; +- __u32 tp_status; +- __u16 tp_mac; +- __u16 tp_net; +- /* pkt_hdr variants */ +- union { +- struct tpacket_hdr_variant1 hv1; +- }; +- __u8 tp_padding[8]; +-}; +- +-struct tpacket_bd_ts { +- unsigned int ts_sec; +- union { +- unsigned int ts_usec; +- unsigned int ts_nsec; +- }; +-}; +- +-struct tpacket_hdr_v1 { +- __u32 block_status; +- __u32 num_pkts; +- __u32 offset_to_first_pkt; +- +- /* Number of valid bytes (including padding) +- * blk_len <= tp_block_size +- */ +- __u32 blk_len; +- +- /* +- * Quite a few uses of sequence number: +- * 1. Make sure cache flush etc worked. +- * Well, one can argue - why not use the increasing ts below? +- * But look at 2. below first. +- * 2. When you pass around blocks to other user space decoders, +- * you can see which blk[s] is[are] outstanding etc. +- * 3. Validate kernel code. +- */ +- __aligned_u64 seq_num; +- +- /* +- * ts_last_pkt: +- * +- * Case 1. Block has 'N'(N >=1) packets and TMO'd(timed out) +- * ts_last_pkt == 'time-stamp of last packet' and NOT the +- * time when the timer fired and the block was closed. +- * By providing the ts of the last packet we can absolutely +- * guarantee that time-stamp wise, the first packet in the +- * next block will never precede the last packet of the +- * previous block. +- * Case 2. Block has zero packets and TMO'd +- * ts_last_pkt = time when the timer fired and the block +- * was closed. +- * Case 3. Block has 'N' packets and NO TMO. +- * ts_last_pkt = time-stamp of the last pkt in the block. +- * +- * ts_first_pkt: +- * Is always the time-stamp when the block was opened. +- * Case a) ZERO packets +- * No packets to deal with but atleast you know the +- * time-interval of this block. +- * Case b) Non-zero packets +- * Use the ts of the first packet in the block. +- * +- */ +- struct tpacket_bd_ts ts_first_pkt, ts_last_pkt; +-}; +- +-union tpacket_bd_header_u { +- struct tpacket_hdr_v1 bh1; +-}; +- +-struct tpacket_block_desc { +- __u32 version; +- __u32 offset_to_priv; +- union tpacket_bd_header_u hdr; +-}; +- +-#define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) +-#define TPACKET3_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll)) +- +-enum tpacket_versions { +- TPACKET_V1, +- TPACKET_V2, +- TPACKET_V3 +-}; +- +-/* +- Frame structure: +- +- - Start. Frame must be aligned to TPACKET_ALIGNMENT=16 +- - struct tpacket_hdr +- - pad to TPACKET_ALIGNMENT=16 +- - struct sockaddr_ll +- - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16 +- - Start+tp_mac: [ Optional MAC header ] +- - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16. +- - Pad to align to TPACKET_ALIGNMENT=16 +- */ +- +-struct tpacket_req { +- unsigned int tp_block_size; /* Minimal size of contiguous block */ +- unsigned int tp_block_nr; /* Number of blocks */ +- unsigned int tp_frame_size; /* Size of frame */ +- unsigned int tp_frame_nr; /* Total number of frames */ +-}; +- +-struct tpacket_req3 { +- unsigned int tp_block_size; /* Minimal size of contiguous block */ +- unsigned int tp_block_nr; /* Number of blocks */ +- unsigned int tp_frame_size; /* Size of frame */ +- unsigned int tp_frame_nr; /* Total number of frames */ +- unsigned int tp_retire_blk_tov; /* timeout in msecs */ +- unsigned int tp_sizeof_priv; /* offset to private data area */ +- unsigned int tp_feature_req_word; +-}; +- +-union tpacket_req_u { +- struct tpacket_req req; +- struct tpacket_req3 req3; +-}; +- +-struct packet_mreq { +- int mr_ifindex; +- unsigned short mr_type; +- unsigned short mr_alen; +- unsigned char mr_address[8]; +-}; +- +-#define PACKET_MR_MULTICAST 0 +-#define PACKET_MR_PROMISC 1 +-#define PACKET_MR_ALLMULTI 2 +-#define PACKET_MR_UNICAST 3 +- +-#endif +diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h +deleted file mode 100644 +index d5ecb42..0000000 +--- a/include/linux/if_tun.h ++++ /dev/null +@@ -1,107 +0,0 @@ +-/* +- * Universal TUN/TAP device driver. +- * Copyright (C) 1999-2000 Maxim Krasnyansky +- * +- * This program is free software; you can redistribute 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. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- */ +- +-#ifndef __IF_TUN_H +-#define __IF_TUN_H +- +-#include +-#include +-#include +- +-/* Read queue size */ +-#define TUN_READQ_SIZE 500 +-/* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */ +-#define TUN_TUN_DEV IFF_TUN +-#define TUN_TAP_DEV IFF_TAP +-#define TUN_TYPE_MASK 0x000f +- +-/* Ioctl defines */ +-#define TUNSETNOCSUM _IOW('T', 200, int) +-#define TUNSETDEBUG _IOW('T', 201, int) +-#define TUNSETIFF _IOW('T', 202, int) +-#define TUNSETPERSIST _IOW('T', 203, int) +-#define TUNSETOWNER _IOW('T', 204, int) +-#define TUNSETLINK _IOW('T', 205, int) +-#define TUNSETGROUP _IOW('T', 206, int) +-#define TUNGETFEATURES _IOR('T', 207, unsigned int) +-#define TUNSETOFFLOAD _IOW('T', 208, unsigned int) +-#define TUNSETTXFILTER _IOW('T', 209, unsigned int) +-#define TUNGETIFF _IOR('T', 210, unsigned int) +-#define TUNGETSNDBUF _IOR('T', 211, int) +-#define TUNSETSNDBUF _IOW('T', 212, int) +-#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog) +-#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog) +-#define TUNGETVNETHDRSZ _IOR('T', 215, int) +-#define TUNSETVNETHDRSZ _IOW('T', 216, int) +-#define TUNSETQUEUE _IOW('T', 217, int) +-#define TUNSETIFINDEX _IOW('T', 218, unsigned int) +-#define TUNGETFILTER _IOR('T', 219, struct sock_fprog) +-#define TUNSETVNETLE _IOW('T', 220, int) +-#define TUNGETVNETLE _IOR('T', 221, int) +-/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on +- * little-endian hosts. Not all kernel configurations support them, but all +- * configurations that support SET also support GET. +- */ +-#define TUNSETVNETBE _IOW('T', 222, int) +-#define TUNGETVNETBE _IOR('T', 223, int) +- +-/* TUNSETIFF ifr flags */ +-#define IFF_TUN 0x0001 +-#define IFF_TAP 0x0002 +-#define IFF_NO_PI 0x1000 +-/* This flag has no real effect */ +-#define IFF_ONE_QUEUE 0x2000 +-#define IFF_VNET_HDR 0x4000 +-#define IFF_TUN_EXCL 0x8000 +-#define IFF_MULTI_QUEUE 0x0100 +-#define IFF_ATTACH_QUEUE 0x0200 +-#define IFF_DETACH_QUEUE 0x0400 +-/* read-only flag */ +-#define IFF_PERSIST 0x0800 +-#define IFF_NOFILTER 0x1000 +- +-/* Socket options */ +-#define TUN_TX_TIMESTAMP 1 +- +-/* Features for GSO (TUNSETOFFLOAD). */ +-#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */ +-#define TUN_F_TSO4 0x02 /* I can handle TSO for IPv4 packets */ +-#define TUN_F_TSO6 0x04 /* I can handle TSO for IPv6 packets */ +-#define TUN_F_TSO_ECN 0x08 /* I can handle TSO with ECN bits. */ +-#define TUN_F_UFO 0x10 /* I can handle UFO packets */ +- +-/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */ +-#define TUN_PKT_STRIP 0x0001 +-struct tun_pi { +- __u16 flags; +- __be16 proto; +-}; +- +-/* +- * Filter spec (used for SETXXFILTER ioctls) +- * This stuff is applicable only to the TAP (Ethernet) devices. +- * If the count is zero the filter is disabled and the driver accepts +- * all packets (promisc mode). +- * If the filter is enabled in order to accept broadcast packets +- * broadcast addr must be explicitly included in the addr list. +- */ +-#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */ +-struct tun_filter { +- __u16 flags; /* TUN_FLT_ flags see above */ +- __u16 count; /* Number of addresses */ +- __u8 addr[0][ETH_ALEN]; +-}; +- +-#endif /* __IF_TUN_H */ +diff --git a/include/linux/if_tunnel.h b/include/linux/if_tunnel.h +deleted file mode 100644 +index 21834ca..0000000 +--- a/include/linux/if_tunnel.h ++++ /dev/null +@@ -1,158 +0,0 @@ +-#ifndef _IF_TUNNEL_H_ +-#define _IF_TUNNEL_H_ +- +-#include +-#include +-#include +-#include +-#include +- +- +-#define SIOCGETTUNNEL (SIOCDEVPRIVATE + 0) +-#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1) +-#define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2) +-#define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3) +-#define SIOCGETPRL (SIOCDEVPRIVATE + 4) +-#define SIOCADDPRL (SIOCDEVPRIVATE + 5) +-#define SIOCDELPRL (SIOCDEVPRIVATE + 6) +-#define SIOCCHGPRL (SIOCDEVPRIVATE + 7) +-#define SIOCGET6RD (SIOCDEVPRIVATE + 8) +-#define SIOCADD6RD (SIOCDEVPRIVATE + 9) +-#define SIOCDEL6RD (SIOCDEVPRIVATE + 10) +-#define SIOCCHG6RD (SIOCDEVPRIVATE + 11) +- +-#define GRE_CSUM __cpu_to_be16(0x8000) +-#define GRE_ROUTING __cpu_to_be16(0x4000) +-#define GRE_KEY __cpu_to_be16(0x2000) +-#define GRE_SEQ __cpu_to_be16(0x1000) +-#define GRE_STRICT __cpu_to_be16(0x0800) +-#define GRE_REC __cpu_to_be16(0x0700) +-#define GRE_ACK __cpu_to_be16(0x0080) +-#define GRE_FLAGS __cpu_to_be16(0x0078) +-#define GRE_VERSION __cpu_to_be16(0x0007) +- +-#define GRE_IS_CSUM(f) ((f) & GRE_CSUM) +-#define GRE_IS_ROUTING(f) ((f) & GRE_ROUTING) +-#define GRE_IS_KEY(f) ((f) & GRE_KEY) +-#define GRE_IS_SEQ(f) ((f) & GRE_SEQ) +-#define GRE_IS_STRICT(f) ((f) & GRE_STRICT) +-#define GRE_IS_REC(f) ((f) & GRE_REC) +-#define GRE_IS_ACK(f) ((f) & GRE_ACK) +- +-#define GRE_VERSION_0 __cpu_to_be16(0x0000) +-#define GRE_VERSION_1 __cpu_to_be16(0x0001) +-#define GRE_PROTO_PPP __cpu_to_be16(0x880b) +-#define GRE_PPTP_KEY_MASK __cpu_to_be32(0xffff) +- +-struct ip_tunnel_parm { +- char name[IFNAMSIZ]; +- int link; +- __be16 i_flags; +- __be16 o_flags; +- __be32 i_key; +- __be32 o_key; +- struct iphdr iph; +-}; +- +-enum { +- IFLA_IPTUN_UNSPEC, +- IFLA_IPTUN_LINK, +- IFLA_IPTUN_LOCAL, +- IFLA_IPTUN_REMOTE, +- IFLA_IPTUN_TTL, +- IFLA_IPTUN_TOS, +- IFLA_IPTUN_ENCAP_LIMIT, +- IFLA_IPTUN_FLOWINFO, +- IFLA_IPTUN_FLAGS, +- IFLA_IPTUN_PROTO, +- IFLA_IPTUN_PMTUDISC, +- IFLA_IPTUN_6RD_PREFIX, +- IFLA_IPTUN_6RD_RELAY_PREFIX, +- IFLA_IPTUN_6RD_PREFIXLEN, +- IFLA_IPTUN_6RD_RELAY_PREFIXLEN, +- IFLA_IPTUN_ENCAP_TYPE, +- IFLA_IPTUN_ENCAP_FLAGS, +- IFLA_IPTUN_ENCAP_SPORT, +- IFLA_IPTUN_ENCAP_DPORT, +- IFLA_IPTUN_COLLECT_METADATA, +- IFLA_IPTUN_FWMARK, +- __IFLA_IPTUN_MAX, +-}; +-#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) +- +-enum tunnel_encap_types { +- TUNNEL_ENCAP_NONE, +- TUNNEL_ENCAP_FOU, +- TUNNEL_ENCAP_GUE, +-}; +- +-#define TUNNEL_ENCAP_FLAG_CSUM (1<<0) +-#define TUNNEL_ENCAP_FLAG_CSUM6 (1<<1) +-#define TUNNEL_ENCAP_FLAG_REMCSUM (1<<2) +- +-/* SIT-mode i_flags */ +-#define SIT_ISATAP 0x0001 +- +-struct ip_tunnel_prl { +- __be32 addr; +- __u16 flags; +- __u16 __reserved; +- __u32 datalen; +- __u32 __reserved2; +- /* data follows */ +-}; +- +-/* PRL flags */ +-#define PRL_DEFAULT 0x0001 +- +-struct ip_tunnel_6rd { +- struct in6_addr prefix; +- __be32 relay_prefix; +- __u16 prefixlen; +- __u16 relay_prefixlen; +-}; +- +-enum { +- IFLA_GRE_UNSPEC, +- IFLA_GRE_LINK, +- IFLA_GRE_IFLAGS, +- IFLA_GRE_OFLAGS, +- IFLA_GRE_IKEY, +- IFLA_GRE_OKEY, +- IFLA_GRE_LOCAL, +- IFLA_GRE_REMOTE, +- IFLA_GRE_TTL, +- IFLA_GRE_TOS, +- IFLA_GRE_PMTUDISC, +- IFLA_GRE_ENCAP_LIMIT, +- IFLA_GRE_FLOWINFO, +- IFLA_GRE_FLAGS, +- IFLA_GRE_ENCAP_TYPE, +- IFLA_GRE_ENCAP_FLAGS, +- IFLA_GRE_ENCAP_SPORT, +- IFLA_GRE_ENCAP_DPORT, +- IFLA_GRE_COLLECT_METADATA, +- IFLA_GRE_IGNORE_DF, +- IFLA_GRE_FWMARK, +- IFLA_GRE_ERSPAN_INDEX, +- __IFLA_GRE_MAX, +-}; +- +-#define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1) +- +-/* VTI-mode i_flags */ +-#define VTI_ISVTI ((__be16)0x0001) +- +-enum { +- IFLA_VTI_UNSPEC, +- IFLA_VTI_LINK, +- IFLA_VTI_IKEY, +- IFLA_VTI_OKEY, +- IFLA_VTI_LOCAL, +- IFLA_VTI_REMOTE, +- IFLA_VTI_FWMARK, +- __IFLA_VTI_MAX, +-}; +- +-#define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1) +-#endif /* _IF_TUNNEL_H_ */ +diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h +deleted file mode 100644 +index 24ae007..0000000 +--- a/include/linux/if_vlan.h ++++ /dev/null +@@ -1,64 +0,0 @@ +-/* +- * VLAN An implementation of 802.1Q VLAN tagging. +- * +- * Authors: Ben Greear +- * +- * This program is free software; you can redistribute 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. +- * +- */ +- +-#ifndef _LINUX_IF_VLAN_H_ +-#define _LINUX_IF_VLAN_H_ +- +- +-/* VLAN IOCTLs are found in sockios.h */ +- +-/* Passed in vlan_ioctl_args structure to determine behaviour. */ +-enum vlan_ioctl_cmds { +- ADD_VLAN_CMD, +- DEL_VLAN_CMD, +- SET_VLAN_INGRESS_PRIORITY_CMD, +- SET_VLAN_EGRESS_PRIORITY_CMD, +- GET_VLAN_INGRESS_PRIORITY_CMD, +- GET_VLAN_EGRESS_PRIORITY_CMD, +- SET_VLAN_NAME_TYPE_CMD, +- SET_VLAN_FLAG_CMD, +- GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know it's a VLAN device, btw */ +- GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */ +-}; +- +-enum vlan_flags { +- VLAN_FLAG_REORDER_HDR = 0x1, +- VLAN_FLAG_GVRP = 0x2, +- VLAN_FLAG_LOOSE_BINDING = 0x4, +- VLAN_FLAG_MVRP = 0x8, +-}; +- +-enum vlan_name_types { +- VLAN_NAME_TYPE_PLUS_VID, /* Name will look like: vlan0005 */ +- VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like: eth1.0005 */ +- VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like: vlan5 */ +- VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like: eth0.5 */ +- VLAN_NAME_TYPE_HIGHEST +-}; +- +-struct vlan_ioctl_args { +- int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */ +- char device1[24]; +- +- union { +- char device2[24]; +- int VID; +- unsigned int skb_priority; +- unsigned int name_type; +- unsigned int bind_type; +- unsigned int flag; /* Matches vlan_dev_priv flags */ +- } u; +- +- short vlan_qos; +-}; +- +-#endif /* _LINUX_IF_VLAN_H_ */ +diff --git a/include/linux/ife.h b/include/linux/ife.h +deleted file mode 100644 +index 2954da3..0000000 +--- a/include/linux/ife.h ++++ /dev/null +@@ -1,18 +0,0 @@ +-#ifndef __UAPI_IFE_H +-#define __UAPI_IFE_H +- +-#define IFE_METAHDRLEN 2 +- +-enum { +- IFE_META_SKBMARK = 1, +- IFE_META_HASHID, +- IFE_META_PRIO, +- IFE_META_QMAP, +- IFE_META_TCINDEX, +- __IFE_META_MAX +-}; +- +-/*Can be overridden at runtime by module option*/ +-#define IFE_META_MAX (__IFE_META_MAX - 1) +- +-#endif +diff --git a/include/linux/ila.h b/include/linux/ila.h +deleted file mode 100644 +index 7e328d7..0000000 +--- a/include/linux/ila.h ++++ /dev/null +@@ -1,45 +0,0 @@ +-/* ila.h - ILA Interface */ +- +-#ifndef _LINUX_ILA_H +-#define _LINUX_ILA_H +- +-/* NETLINK_GENERIC related info */ +-#define ILA_GENL_NAME "ila" +-#define ILA_GENL_VERSION 0x1 +- +-enum { +- ILA_ATTR_UNSPEC, +- ILA_ATTR_LOCATOR, /* u64 */ +- ILA_ATTR_IDENTIFIER, /* u64 */ +- ILA_ATTR_LOCATOR_MATCH, /* u64 */ +- ILA_ATTR_IFINDEX, /* s32 */ +- ILA_ATTR_DIR, /* u32 */ +- ILA_ATTR_PAD, +- ILA_ATTR_CSUM_MODE, /* u8 */ +- +- __ILA_ATTR_MAX, +-}; +- +-#define ILA_ATTR_MAX (__ILA_ATTR_MAX - 1) +- +-enum { +- ILA_CMD_UNSPEC, +- ILA_CMD_ADD, +- ILA_CMD_DEL, +- ILA_CMD_GET, +- +- __ILA_CMD_MAX, +-}; +- +-#define ILA_CMD_MAX (__ILA_CMD_MAX - 1) +- +-#define ILA_DIR_IN (1 << 0) +-#define ILA_DIR_OUT (1 << 1) +- +-enum { +- ILA_CSUM_ADJUST_TRANSPORT, +- ILA_CSUM_NEUTRAL_MAP, +- ILA_CSUM_NO_ACTION, +-}; +- +-#endif /* _LINUX_ILA_H */ +diff --git a/include/linux/in.h b/include/linux/in.h +deleted file mode 100644 +index 9439efa..0000000 +--- a/include/linux/in.h ++++ /dev/null +@@ -1,300 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Definitions of the Internet Protocol. +- * +- * Version: @(#)in.h 1.0.1 04/21/93 +- * +- * Authors: Original taken from the GNU Project file. +- * Fred N. van Kempen, +- * +- * This program is free software; you can redistribute 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. +- */ +-#ifndef _LINUX_IN_H +-#define _LINUX_IN_H +- +-#include +-#include +-#include +- +-#if __UAPI_DEF_IN_IPPROTO +-/* Standard well-defined IP protocols. */ +-enum { +- IPPROTO_IP = 0, /* Dummy protocol for TCP */ +-#define IPPROTO_IP IPPROTO_IP +- IPPROTO_ICMP = 1, /* Internet Control Message Protocol */ +-#define IPPROTO_ICMP IPPROTO_ICMP +- IPPROTO_IGMP = 2, /* Internet Group Management Protocol */ +-#define IPPROTO_IGMP IPPROTO_IGMP +- IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */ +-#define IPPROTO_IPIP IPPROTO_IPIP +- IPPROTO_TCP = 6, /* Transmission Control Protocol */ +-#define IPPROTO_TCP IPPROTO_TCP +- IPPROTO_EGP = 8, /* Exterior Gateway Protocol */ +-#define IPPROTO_EGP IPPROTO_EGP +- IPPROTO_PUP = 12, /* PUP protocol */ +-#define IPPROTO_PUP IPPROTO_PUP +- IPPROTO_UDP = 17, /* User Datagram Protocol */ +-#define IPPROTO_UDP IPPROTO_UDP +- IPPROTO_IDP = 22, /* XNS IDP protocol */ +-#define IPPROTO_IDP IPPROTO_IDP +- IPPROTO_TP = 29, /* SO Transport Protocol Class 4 */ +-#define IPPROTO_TP IPPROTO_TP +- IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol */ +-#define IPPROTO_DCCP IPPROTO_DCCP +- IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */ +-#define IPPROTO_IPV6 IPPROTO_IPV6 +- IPPROTO_RSVP = 46, /* RSVP Protocol */ +-#define IPPROTO_RSVP IPPROTO_RSVP +- IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ +-#define IPPROTO_GRE IPPROTO_GRE +- IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ +-#define IPPROTO_ESP IPPROTO_ESP +- IPPROTO_AH = 51, /* Authentication Header protocol */ +-#define IPPROTO_AH IPPROTO_AH +- IPPROTO_MTP = 92, /* Multicast Transport Protocol */ +-#define IPPROTO_MTP IPPROTO_MTP +- IPPROTO_BEETPH = 94, /* IP option pseudo header for BEET */ +-#define IPPROTO_BEETPH IPPROTO_BEETPH +- IPPROTO_ENCAP = 98, /* Encapsulation Header */ +-#define IPPROTO_ENCAP IPPROTO_ENCAP +- IPPROTO_PIM = 103, /* Protocol Independent Multicast */ +-#define IPPROTO_PIM IPPROTO_PIM +- IPPROTO_COMP = 108, /* Compression Header Protocol */ +-#define IPPROTO_COMP IPPROTO_COMP +- IPPROTO_SCTP = 132, /* Stream Control Transport Protocol */ +-#define IPPROTO_SCTP IPPROTO_SCTP +- IPPROTO_UDPLITE = 136, /* UDP-Lite (RFC 3828) */ +-#define IPPROTO_UDPLITE IPPROTO_UDPLITE +- IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ +-#define IPPROTO_MPLS IPPROTO_MPLS +- IPPROTO_RAW = 255, /* Raw IP packets */ +-#define IPPROTO_RAW IPPROTO_RAW +- IPPROTO_MAX +-}; +-#endif +- +-#if __UAPI_DEF_IN_ADDR +-/* Internet address. */ +-struct in_addr { +- __be32 s_addr; +-}; +-#endif +- +-#define IP_TOS 1 +-#define IP_TTL 2 +-#define IP_HDRINCL 3 +-#define IP_OPTIONS 4 +-#define IP_ROUTER_ALERT 5 +-#define IP_RECVOPTS 6 +-#define IP_RETOPTS 7 +-#define IP_PKTINFO 8 +-#define IP_PKTOPTIONS 9 +-#define IP_MTU_DISCOVER 10 +-#define IP_RECVERR 11 +-#define IP_RECVTTL 12 +-#define IP_RECVTOS 13 +-#define IP_MTU 14 +-#define IP_FREEBIND 15 +-#define IP_IPSEC_POLICY 16 +-#define IP_XFRM_POLICY 17 +-#define IP_PASSSEC 18 +-#define IP_TRANSPARENT 19 +- +-/* BSD compatibility */ +-#define IP_RECVRETOPTS IP_RETOPTS +- +-/* TProxy original addresses */ +-#define IP_ORIGDSTADDR 20 +-#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR +- +-#define IP_MINTTL 21 +-#define IP_NODEFRAG 22 +-#define IP_CHECKSUM 23 +-#define IP_BIND_ADDRESS_NO_PORT 24 +-#define IP_RECVFRAGSIZE 25 +- +-/* IP_MTU_DISCOVER values */ +-#define IP_PMTUDISC_DONT 0 /* Never send DF frames */ +-#define IP_PMTUDISC_WANT 1 /* Use per route hints */ +-#define IP_PMTUDISC_DO 2 /* Always DF */ +-#define IP_PMTUDISC_PROBE 3 /* Ignore dst pmtu */ +-/* Always use interface mtu (ignores dst pmtu) but don't set DF flag. +- * Also incoming ICMP frag_needed notifications will be ignored on +- * this socket to prevent accepting spoofed ones. +- */ +-#define IP_PMTUDISC_INTERFACE 4 +-/* weaker version of IP_PMTUDISC_INTERFACE, which allos packets to get +- * fragmented if they exeed the interface mtu +- */ +-#define IP_PMTUDISC_OMIT 5 +- +-#define IP_MULTICAST_IF 32 +-#define IP_MULTICAST_TTL 33 +-#define IP_MULTICAST_LOOP 34 +-#define IP_ADD_MEMBERSHIP 35 +-#define IP_DROP_MEMBERSHIP 36 +-#define IP_UNBLOCK_SOURCE 37 +-#define IP_BLOCK_SOURCE 38 +-#define IP_ADD_SOURCE_MEMBERSHIP 39 +-#define IP_DROP_SOURCE_MEMBERSHIP 40 +-#define IP_MSFILTER 41 +-#define MCAST_JOIN_GROUP 42 +-#define MCAST_BLOCK_SOURCE 43 +-#define MCAST_UNBLOCK_SOURCE 44 +-#define MCAST_LEAVE_GROUP 45 +-#define MCAST_JOIN_SOURCE_GROUP 46 +-#define MCAST_LEAVE_SOURCE_GROUP 47 +-#define MCAST_MSFILTER 48 +-#define IP_MULTICAST_ALL 49 +-#define IP_UNICAST_IF 50 +- +-#define MCAST_EXCLUDE 0 +-#define MCAST_INCLUDE 1 +- +-/* These need to appear somewhere around here */ +-#define IP_DEFAULT_MULTICAST_TTL 1 +-#define IP_DEFAULT_MULTICAST_LOOP 1 +- +-/* Request struct for multicast socket ops */ +- +-#if __UAPI_DEF_IP_MREQ +-struct ip_mreq { +- struct in_addr imr_multiaddr; /* IP multicast address of group */ +- struct in_addr imr_interface; /* local IP address of interface */ +-}; +- +-struct ip_mreqn { +- struct in_addr imr_multiaddr; /* IP multicast address of group */ +- struct in_addr imr_address; /* local IP address of interface */ +- int imr_ifindex; /* Interface index */ +-}; +- +-struct ip_mreq_source { +- __be32 imr_multiaddr; +- __be32 imr_interface; +- __be32 imr_sourceaddr; +-}; +- +-struct ip_msfilter { +- __be32 imsf_multiaddr; +- __be32 imsf_interface; +- __u32 imsf_fmode; +- __u32 imsf_numsrc; +- __be32 imsf_slist[1]; +-}; +- +-#define IP_MSFILTER_SIZE(numsrc) \ +- (sizeof(struct ip_msfilter) - sizeof(__u32) \ +- + (numsrc) * sizeof(__u32)) +- +-struct group_req { +- __u32 gr_interface; /* interface index */ +- struct __kernel_sockaddr_storage gr_group; /* group address */ +-}; +- +-struct group_source_req { +- __u32 gsr_interface; /* interface index */ +- struct __kernel_sockaddr_storage gsr_group; /* group address */ +- struct __kernel_sockaddr_storage gsr_source; /* source address */ +-}; +- +-struct group_filter { +- __u32 gf_interface; /* interface index */ +- struct __kernel_sockaddr_storage gf_group; /* multicast address */ +- __u32 gf_fmode; /* filter mode */ +- __u32 gf_numsrc; /* number of sources */ +- struct __kernel_sockaddr_storage gf_slist[1]; /* interface index */ +-}; +- +-#define GROUP_FILTER_SIZE(numsrc) \ +- (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \ +- + (numsrc) * sizeof(struct __kernel_sockaddr_storage)) +-#endif +- +-#if __UAPI_DEF_IN_PKTINFO +-struct in_pktinfo { +- int ipi_ifindex; +- struct in_addr ipi_spec_dst; +- struct in_addr ipi_addr; +-}; +-#endif +- +-/* Structure describing an Internet (IP) socket address. */ +-#if __UAPI_DEF_SOCKADDR_IN +-#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ +-struct sockaddr_in { +- __kernel_sa_family_t sin_family; /* Address family */ +- __be16 sin_port; /* Port number */ +- struct in_addr sin_addr; /* Internet address */ +- +- /* Pad to size of `struct sockaddr'. */ +- unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - +- sizeof(unsigned short int) - sizeof(struct in_addr)]; +-}; +-#define sin_zero __pad /* for BSD UNIX comp. -FvK */ +-#endif +- +-#if __UAPI_DEF_IN_CLASS +-/* +- * Definitions of the bits in an Internet address integer. +- * On subnets, host and network parts are found according +- * to the subnet mask, not these masks. +- */ +-#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) +-#define IN_CLASSA_NET 0xff000000 +-#define IN_CLASSA_NSHIFT 24 +-#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) +-#define IN_CLASSA_MAX 128 +- +-#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) +-#define IN_CLASSB_NET 0xffff0000 +-#define IN_CLASSB_NSHIFT 16 +-#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) +-#define IN_CLASSB_MAX 65536 +- +-#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) +-#define IN_CLASSC_NET 0xffffff00 +-#define IN_CLASSC_NSHIFT 8 +-#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) +- +-#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) +-#define IN_MULTICAST(a) IN_CLASSD(a) +-#define IN_MULTICAST_NET 0xF0000000 +- +-#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000) +-#define IN_BADCLASS(a) IN_EXPERIMENTAL((a)) +- +-/* Address to accept any incoming messages. */ +-#define INADDR_ANY ((unsigned long int) 0x00000000) +- +-/* Address to send to all hosts. */ +-#define INADDR_BROADCAST ((unsigned long int) 0xffffffff) +- +-/* Address indicating an error return. */ +-#define INADDR_NONE ((unsigned long int) 0xffffffff) +- +-/* Network number for local host loopback. */ +-#define IN_LOOPBACKNET 127 +- +-/* Address to loopback in software to local host. */ +-#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ +-#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000) +- +-/* Defines for Multicast INADDR */ +-#define INADDR_UNSPEC_GROUP 0xe0000000U /* 224.0.0.0 */ +-#define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */ +-#define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */ +-#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU /* 224.0.0.255 */ +-#endif +- +-/* contains the htonl type stuff.. */ +-#include +- +- +-#endif /* _LINUX_IN_H */ +diff --git a/include/linux/in6.h b/include/linux/in6.h +deleted file mode 100644 +index 6f3bdee..0000000 +--- a/include/linux/in6.h ++++ /dev/null +@@ -1,296 +0,0 @@ +-/* +- * Types and definitions for AF_INET6 +- * Linux INET6 implementation +- * +- * Authors: +- * Pedro Roque +- * +- * Sources: +- * IPv6 Program Interfaces for BSD Systems +- * +- * +- * Advanced Sockets API for IPv6 +- * +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_IN6_H +-#define _LINUX_IN6_H +- +-#include +-#include +- +-/* +- * IPv6 address structure +- */ +- +-#if __UAPI_DEF_IN6_ADDR +-struct in6_addr { +- union { +- __u8 u6_addr8[16]; +-#if __UAPI_DEF_IN6_ADDR_ALT +- __be16 u6_addr16[8]; +- __be32 u6_addr32[4]; +-#endif +- } in6_u; +-#define s6_addr in6_u.u6_addr8 +-#if __UAPI_DEF_IN6_ADDR_ALT +-#define s6_addr16 in6_u.u6_addr16 +-#define s6_addr32 in6_u.u6_addr32 +-#endif +-}; +-#endif /* __UAPI_DEF_IN6_ADDR */ +- +-#if __UAPI_DEF_SOCKADDR_IN6 +-struct sockaddr_in6 { +- unsigned short int sin6_family; /* AF_INET6 */ +- __be16 sin6_port; /* Transport layer port # */ +- __be32 sin6_flowinfo; /* IPv6 flow information */ +- struct in6_addr sin6_addr; /* IPv6 address */ +- __u32 sin6_scope_id; /* scope id (new in RFC2553) */ +-}; +-#endif /* __UAPI_DEF_SOCKADDR_IN6 */ +- +-#if __UAPI_DEF_IPV6_MREQ +-struct ipv6_mreq { +- /* IPv6 multicast address of group */ +- struct in6_addr ipv6mr_multiaddr; +- +- /* local IPv6 address of interface */ +- int ipv6mr_ifindex; +-}; +-#endif /* __UAPI_DEF_IVP6_MREQ */ +- +-#define ipv6mr_acaddr ipv6mr_multiaddr +- +-struct in6_flowlabel_req { +- struct in6_addr flr_dst; +- __be32 flr_label; +- __u8 flr_action; +- __u8 flr_share; +- __u16 flr_flags; +- __u16 flr_expires; +- __u16 flr_linger; +- __u32 __flr_pad; +- /* Options in format of IPV6_PKTOPTIONS */ +-}; +- +-#define IPV6_FL_A_GET 0 +-#define IPV6_FL_A_PUT 1 +-#define IPV6_FL_A_RENEW 2 +- +-#define IPV6_FL_F_CREATE 1 +-#define IPV6_FL_F_EXCL 2 +-#define IPV6_FL_F_REFLECT 4 +-#define IPV6_FL_F_REMOTE 8 +- +-#define IPV6_FL_S_NONE 0 +-#define IPV6_FL_S_EXCL 1 +-#define IPV6_FL_S_PROCESS 2 +-#define IPV6_FL_S_USER 3 +-#define IPV6_FL_S_ANY 255 +- +- +-/* +- * Bitmask constant declarations to help applications select out the +- * flow label and priority fields. +- * +- * Note that this are in host byte order while the flowinfo field of +- * sockaddr_in6 is in network byte order. +- */ +- +-#define IPV6_FLOWINFO_FLOWLABEL 0x000fffff +-#define IPV6_FLOWINFO_PRIORITY 0x0ff00000 +- +-/* These definitions are obsolete */ +-#define IPV6_PRIORITY_UNCHARACTERIZED 0x0000 +-#define IPV6_PRIORITY_FILLER 0x0100 +-#define IPV6_PRIORITY_UNATTENDED 0x0200 +-#define IPV6_PRIORITY_RESERVED1 0x0300 +-#define IPV6_PRIORITY_BULK 0x0400 +-#define IPV6_PRIORITY_RESERVED2 0x0500 +-#define IPV6_PRIORITY_INTERACTIVE 0x0600 +-#define IPV6_PRIORITY_CONTROL 0x0700 +-#define IPV6_PRIORITY_8 0x0800 +-#define IPV6_PRIORITY_9 0x0900 +-#define IPV6_PRIORITY_10 0x0a00 +-#define IPV6_PRIORITY_11 0x0b00 +-#define IPV6_PRIORITY_12 0x0c00 +-#define IPV6_PRIORITY_13 0x0d00 +-#define IPV6_PRIORITY_14 0x0e00 +-#define IPV6_PRIORITY_15 0x0f00 +- +-/* +- * IPV6 extension headers +- */ +-#if __UAPI_DEF_IPPROTO_V6 +-#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ +-#define IPPROTO_ROUTING 43 /* IPv6 routing header */ +-#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +-#define IPPROTO_ICMPV6 58 /* ICMPv6 */ +-#define IPPROTO_NONE 59 /* IPv6 no next header */ +-#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ +-#define IPPROTO_MH 135 /* IPv6 mobility header */ +-#endif /* __UAPI_DEF_IPPROTO_V6 */ +- +-/* +- * IPv6 TLV options. +- */ +-#define IPV6_TLV_PAD1 0 +-#define IPV6_TLV_PADN 1 +-#define IPV6_TLV_ROUTERALERT 5 +-#define IPV6_TLV_CALIPSO 7 /* RFC 5570 */ +-#define IPV6_TLV_JUMBO 194 +-#define IPV6_TLV_HAO 201 /* home address option */ +- +-/* +- * IPV6 socket options +- */ +-#if __UAPI_DEF_IPV6_OPTIONS +-#define IPV6_ADDRFORM 1 +-#define IPV6_2292PKTINFO 2 +-#define IPV6_2292HOPOPTS 3 +-#define IPV6_2292DSTOPTS 4 +-#define IPV6_2292RTHDR 5 +-#define IPV6_2292PKTOPTIONS 6 +-#define IPV6_CHECKSUM 7 +-#define IPV6_2292HOPLIMIT 8 +-#define IPV6_NEXTHOP 9 +-#define IPV6_AUTHHDR 10 /* obsolete */ +-#define IPV6_FLOWINFO 11 +- +-#define IPV6_UNICAST_HOPS 16 +-#define IPV6_MULTICAST_IF 17 +-#define IPV6_MULTICAST_HOPS 18 +-#define IPV6_MULTICAST_LOOP 19 +-#define IPV6_ADD_MEMBERSHIP 20 +-#define IPV6_DROP_MEMBERSHIP 21 +-#define IPV6_ROUTER_ALERT 22 +-#define IPV6_MTU_DISCOVER 23 +-#define IPV6_MTU 24 +-#define IPV6_RECVERR 25 +-#define IPV6_V6ONLY 26 +-#define IPV6_JOIN_ANYCAST 27 +-#define IPV6_LEAVE_ANYCAST 28 +- +-/* IPV6_MTU_DISCOVER values */ +-#define IPV6_PMTUDISC_DONT 0 +-#define IPV6_PMTUDISC_WANT 1 +-#define IPV6_PMTUDISC_DO 2 +-#define IPV6_PMTUDISC_PROBE 3 +-/* same as IPV6_PMTUDISC_PROBE, provided for symetry with IPv4 +- * also see comments on IP_PMTUDISC_INTERFACE +- */ +-#define IPV6_PMTUDISC_INTERFACE 4 +-/* weaker version of IPV6_PMTUDISC_INTERFACE, which allows packets to +- * get fragmented if they exceed the interface mtu +- */ +-#define IPV6_PMTUDISC_OMIT 5 +- +-/* Flowlabel */ +-#define IPV6_FLOWLABEL_MGR 32 +-#define IPV6_FLOWINFO_SEND 33 +- +-#define IPV6_IPSEC_POLICY 34 +-#define IPV6_XFRM_POLICY 35 +-#define IPV6_HDRINCL 36 +-#endif +- +-/* +- * Multicast: +- * Following socket options are shared between IPv4 and IPv6. +- * +- * MCAST_JOIN_GROUP 42 +- * MCAST_BLOCK_SOURCE 43 +- * MCAST_UNBLOCK_SOURCE 44 +- * MCAST_LEAVE_GROUP 45 +- * MCAST_JOIN_SOURCE_GROUP 46 +- * MCAST_LEAVE_SOURCE_GROUP 47 +- * MCAST_MSFILTER 48 +- */ +- +-/* +- * Advanced API (RFC3542) (1) +- * +- * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c. +- */ +- +-#define IPV6_RECVPKTINFO 49 +-#define IPV6_PKTINFO 50 +-#define IPV6_RECVHOPLIMIT 51 +-#define IPV6_HOPLIMIT 52 +-#define IPV6_RECVHOPOPTS 53 +-#define IPV6_HOPOPTS 54 +-#define IPV6_RTHDRDSTOPTS 55 +-#define IPV6_RECVRTHDR 56 +-#define IPV6_RTHDR 57 +-#define IPV6_RECVDSTOPTS 58 +-#define IPV6_DSTOPTS 59 +-#define IPV6_RECVPATHMTU 60 +-#define IPV6_PATHMTU 61 +-#define IPV6_DONTFRAG 62 +-#if 0 /* not yet */ +-#define IPV6_USE_MIN_MTU 63 +-#endif +- +-/* +- * Netfilter (1) +- * +- * Following socket options are used in ip6_tables; +- * see include/linux/netfilter_ipv6/ip6_tables.h. +- * +- * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO 64 +- * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES 65 +- */ +- +-/* +- * Advanced API (RFC3542) (2) +- */ +-#define IPV6_RECVTCLASS 66 +-#define IPV6_TCLASS 67 +- +-/* +- * Netfilter (2) +- * +- * Following socket options are used in ip6_tables; +- * see include/linux/netfilter_ipv6/ip6_tables.h. +- * +- * IP6T_SO_GET_REVISION_MATCH 68 +- * IP6T_SO_GET_REVISION_TARGET 69 +- * IP6T_SO_ORIGINAL_DST 80 +- */ +- +-#define IPV6_AUTOFLOWLABEL 70 +-/* RFC5014: Source address selection */ +-#define IPV6_ADDR_PREFERENCES 72 +- +-#define IPV6_PREFER_SRC_TMP 0x0001 +-#define IPV6_PREFER_SRC_PUBLIC 0x0002 +-#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100 +-#define IPV6_PREFER_SRC_COA 0x0004 +-#define IPV6_PREFER_SRC_HOME 0x0400 +-#define IPV6_PREFER_SRC_CGA 0x0008 +-#define IPV6_PREFER_SRC_NONCGA 0x0800 +- +-/* RFC5082: Generalized Ttl Security Mechanism */ +-#define IPV6_MINHOPCOUNT 73 +- +-#define IPV6_ORIGDSTADDR 74 +-#define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR +-#define IPV6_TRANSPARENT 75 +-#define IPV6_UNICAST_IF 76 +-#define IPV6_RECVFRAGSIZE 77 +- +-/* +- * Multicast Routing: +- * see include/uapi/linux/mroute6.h. +- * +- * MRT6_BASE 200 +- * ... +- * MRT6_MAX +- */ +-#endif /* _LINUX_IN6_H */ +diff --git a/include/linux/in_route.h b/include/linux/in_route.h +deleted file mode 100644 +index b261b8c..0000000 +--- a/include/linux/in_route.h ++++ /dev/null +@@ -1,32 +0,0 @@ +-#ifndef _LINUX_IN_ROUTE_H +-#define _LINUX_IN_ROUTE_H +- +-/* IPv4 routing cache flags */ +- +-#define RTCF_DEAD RTNH_F_DEAD +-#define RTCF_ONLINK RTNH_F_ONLINK +- +-/* Obsolete flag. About to be deleted */ +-#define RTCF_NOPMTUDISC RTM_F_NOPMTUDISC +- +-#define RTCF_NOTIFY 0x00010000 +-#define RTCF_DIRECTDST 0x00020000 /* unused */ +-#define RTCF_REDIRECTED 0x00040000 +-#define RTCF_TPROXY 0x00080000 /* unused */ +- +-#define RTCF_FAST 0x00200000 /* unused */ +-#define RTCF_MASQ 0x00400000 /* unused */ +-#define RTCF_SNAT 0x00800000 /* unused */ +-#define RTCF_DOREDIRECT 0x01000000 +-#define RTCF_DIRECTSRC 0x04000000 +-#define RTCF_DNAT 0x08000000 +-#define RTCF_BROADCAST 0x10000000 +-#define RTCF_MULTICAST 0x20000000 +-#define RTCF_REJECT 0x40000000 /* unused */ +-#define RTCF_LOCAL 0x80000000 +- +-#define RTCF_NAT (RTCF_DNAT|RTCF_SNAT) +- +-#define RT_TOS(tos) ((tos)&IPTOS_TOS_MASK) +- +-#endif /* _LINUX_IN_ROUTE_H */ +diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h +deleted file mode 100644 +index bada4d7..0000000 +--- a/include/linux/inet_diag.h ++++ /dev/null +@@ -1,196 +0,0 @@ +-#ifndef _INET_DIAG_H_ +-#define _INET_DIAG_H_ +- +-#include +- +-/* Just some random number */ +-#define TCPDIAG_GETSOCK 18 +-#define DCCPDIAG_GETSOCK 19 +- +-#define INET_DIAG_GETSOCK_MAX 24 +- +-/* Socket identity */ +-struct inet_diag_sockid { +- __be16 idiag_sport; +- __be16 idiag_dport; +- __be32 idiag_src[4]; +- __be32 idiag_dst[4]; +- __u32 idiag_if; +- __u32 idiag_cookie[2]; +-#define INET_DIAG_NOCOOKIE (~0U) +-}; +- +-/* Request structure */ +- +-struct inet_diag_req { +- __u8 idiag_family; /* Family of addresses. */ +- __u8 idiag_src_len; +- __u8 idiag_dst_len; +- __u8 idiag_ext; /* Query extended information */ +- +- struct inet_diag_sockid id; +- +- __u32 idiag_states; /* States to dump */ +- __u32 idiag_dbs; /* Tables to dump (NI) */ +-}; +- +-struct inet_diag_req_v2 { +- __u8 sdiag_family; +- __u8 sdiag_protocol; +- __u8 idiag_ext; +- __u8 pad; +- __u32 idiag_states; +- struct inet_diag_sockid id; +-}; +- +-/* +- * SOCK_RAW sockets require the underlied protocol to be +- * additionally specified so we can use @pad member for +- * this, but we can't rename it because userspace programs +- * still may depend on this name. Instead lets use another +- * structure definition as an alias for struct +- * @inet_diag_req_v2. +- */ +-struct inet_diag_req_raw { +- __u8 sdiag_family; +- __u8 sdiag_protocol; +- __u8 idiag_ext; +- __u8 sdiag_raw_protocol; +- __u32 idiag_states; +- struct inet_diag_sockid id; +-}; +- +-enum { +- INET_DIAG_REQ_NONE, +- INET_DIAG_REQ_BYTECODE, +-}; +- +-#define INET_DIAG_REQ_MAX INET_DIAG_REQ_BYTECODE +- +-/* Bytecode is sequence of 4 byte commands followed by variable arguments. +- * All the commands identified by "code" are conditional jumps forward: +- * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be +- * length of the command and its arguments. +- */ +- +-struct inet_diag_bc_op { +- unsigned char code; +- unsigned char yes; +- unsigned short no; +-}; +- +-enum { +- INET_DIAG_BC_NOP, +- INET_DIAG_BC_JMP, +- INET_DIAG_BC_S_GE, +- INET_DIAG_BC_S_LE, +- INET_DIAG_BC_D_GE, +- INET_DIAG_BC_D_LE, +- INET_DIAG_BC_AUTO, +- INET_DIAG_BC_S_COND, +- INET_DIAG_BC_D_COND, +- INET_DIAG_BC_DEV_COND, /* u32 ifindex */ +- INET_DIAG_BC_MARK_COND, +-}; +- +-struct inet_diag_hostcond { +- __u8 family; +- __u8 prefix_len; +- int port; +- __be32 addr[0]; +-}; +- +-struct inet_diag_markcond { +- __u32 mark; +- __u32 mask; +-}; +- +-/* Base info structure. It contains socket identity (addrs/ports/cookie) +- * and, alas, the information shown by netstat. */ +-struct inet_diag_msg { +- __u8 idiag_family; +- __u8 idiag_state; +- __u8 idiag_timer; +- __u8 idiag_retrans; +- +- struct inet_diag_sockid id; +- +- __u32 idiag_expires; +- __u32 idiag_rqueue; +- __u32 idiag_wqueue; +- __u32 idiag_uid; +- __u32 idiag_inode; +-}; +- +-/* Extensions */ +- +-enum { +- INET_DIAG_NONE, +- INET_DIAG_MEMINFO, +- INET_DIAG_INFO, +- INET_DIAG_VEGASINFO, +- INET_DIAG_CONG, +- INET_DIAG_TOS, +- INET_DIAG_TCLASS, +- INET_DIAG_SKMEMINFO, +- INET_DIAG_SHUTDOWN, +- INET_DIAG_DCTCPINFO, +- INET_DIAG_PROTOCOL, /* response attribute only */ +- INET_DIAG_SKV6ONLY, +- INET_DIAG_LOCALS, +- INET_DIAG_PEERS, +- INET_DIAG_PAD, +- INET_DIAG_MARK, +- INET_DIAG_BBRINFO, +- INET_DIAG_CLASS_ID, +- INET_DIAG_MD5SIG, +- __INET_DIAG_MAX, +-}; +- +-#define INET_DIAG_MAX (__INET_DIAG_MAX - 1) +- +-/* INET_DIAG_MEM */ +- +-struct inet_diag_meminfo { +- __u32 idiag_rmem; +- __u32 idiag_wmem; +- __u32 idiag_fmem; +- __u32 idiag_tmem; +-}; +- +-/* INET_DIAG_VEGASINFO */ +- +-struct tcpvegas_info { +- __u32 tcpv_enabled; +- __u32 tcpv_rttcnt; +- __u32 tcpv_rtt; +- __u32 tcpv_minrtt; +-}; +- +-/* INET_DIAG_DCTCPINFO */ +- +-struct tcp_dctcp_info { +- __u16 dctcp_enabled; +- __u16 dctcp_ce_state; +- __u32 dctcp_alpha; +- __u32 dctcp_ab_ecn; +- __u32 dctcp_ab_tot; +-}; +- +-/* INET_DIAG_BBRINFO */ +- +-struct tcp_bbr_info { +- /* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */ +- __u32 bbr_bw_lo; /* lower 32 bits of bw */ +- __u32 bbr_bw_hi; /* upper 32 bits of bw */ +- __u32 bbr_min_rtt; /* min-filtered RTT in uSec */ +- __u32 bbr_pacing_gain; /* pacing gain shifted left 8 bits */ +- __u32 bbr_cwnd_gain; /* cwnd gain shifted left 8 bits */ +-}; +- +-union tcp_cc_info { +- struct tcpvegas_info vegas; +- struct tcp_dctcp_info dctcp; +- struct tcp_bbr_info bbr; +-}; +-#endif /* _INET_DIAG_H_ */ +diff --git a/include/linux/ip.h b/include/linux/ip.h +deleted file mode 100644 +index 1907284..0000000 +--- a/include/linux/ip.h ++++ /dev/null +@@ -1,175 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Definitions for the IP protocol. +- * +- * Version: @(#)ip.h 1.0.2 04/28/93 +- * +- * Authors: Fred N. van Kempen, +- * +- * This program is free software; you can redistribute 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. +- */ +-#ifndef _LINUX_IP_H +-#define _LINUX_IP_H +-#include +-#include +- +-#define IPTOS_TOS_MASK 0x1E +-#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) +-#define IPTOS_LOWDELAY 0x10 +-#define IPTOS_THROUGHPUT 0x08 +-#define IPTOS_RELIABILITY 0x04 +-#define IPTOS_MINCOST 0x02 +- +-#define IPTOS_PREC_MASK 0xE0 +-#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) +-#define IPTOS_PREC_NETCONTROL 0xe0 +-#define IPTOS_PREC_INTERNETCONTROL 0xc0 +-#define IPTOS_PREC_CRITIC_ECP 0xa0 +-#define IPTOS_PREC_FLASHOVERRIDE 0x80 +-#define IPTOS_PREC_FLASH 0x60 +-#define IPTOS_PREC_IMMEDIATE 0x40 +-#define IPTOS_PREC_PRIORITY 0x20 +-#define IPTOS_PREC_ROUTINE 0x00 +- +- +-/* IP options */ +-#define IPOPT_COPY 0x80 +-#define IPOPT_CLASS_MASK 0x60 +-#define IPOPT_NUMBER_MASK 0x1f +- +-#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) +-#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) +-#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) +- +-#define IPOPT_CONTROL 0x00 +-#define IPOPT_RESERVED1 0x20 +-#define IPOPT_MEASUREMENT 0x40 +-#define IPOPT_RESERVED2 0x60 +- +-#define IPOPT_END (0 |IPOPT_CONTROL) +-#define IPOPT_NOOP (1 |IPOPT_CONTROL) +-#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) +-#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) +-#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) +-#define IPOPT_CIPSO (6 |IPOPT_CONTROL|IPOPT_COPY) +-#define IPOPT_RR (7 |IPOPT_CONTROL) +-#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) +-#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) +-#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) +- +-#define IPVERSION 4 +-#define MAXTTL 255 +-#define IPDEFTTL 64 +- +-#define IPOPT_OPTVAL 0 +-#define IPOPT_OLEN 1 +-#define IPOPT_OFFSET 2 +-#define IPOPT_MINOFF 4 +-#define MAX_IPOPTLEN 40 +-#define IPOPT_NOP IPOPT_NOOP +-#define IPOPT_EOL IPOPT_END +-#define IPOPT_TS IPOPT_TIMESTAMP +- +-#define IPOPT_TS_TSONLY 0 /* timestamps only */ +-#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +-#define IPOPT_TS_PRESPEC 3 /* specified modules only */ +- +-#define IPV4_BEET_PHMAXLEN 8 +- +-struct iphdr { +-#if defined(__LITTLE_ENDIAN_BITFIELD) +- __u8 ihl:4, +- version:4; +-#elif defined (__BIG_ENDIAN_BITFIELD) +- __u8 version:4, +- ihl:4; +-#else +-#error "Please fix " +-#endif +- __u8 tos; +- __be16 tot_len; +- __be16 id; +- __be16 frag_off; +- __u8 ttl; +- __u8 protocol; +- __sum16 check; +- __be32 saddr; +- __be32 daddr; +- /*The options start here. */ +-}; +- +- +-struct ip_auth_hdr { +- __u8 nexthdr; +- __u8 hdrlen; /* This one is measured in 32 bit units! */ +- __be16 reserved; +- __be32 spi; +- __be32 seq_no; /* Sequence number */ +- __u8 auth_data[0]; /* Variable len but >=4. Mind the 64 bit alignment! */ +-}; +- +-struct ip_esp_hdr { +- __be32 spi; +- __be32 seq_no; /* Sequence number */ +- __u8 enc_data[0]; /* Variable len but >=8. Mind the 64 bit alignment! */ +-}; +- +-struct ip_comp_hdr { +- __u8 nexthdr; +- __u8 flags; +- __be16 cpi; +-}; +- +-struct ip_beet_phdr { +- __u8 nexthdr; +- __u8 hdrlen; +- __u8 padlen; +- __u8 reserved; +-}; +- +-/* index values for the variables in ipv4_devconf */ +-enum +-{ +- IPV4_DEVCONF_FORWARDING=1, +- IPV4_DEVCONF_MC_FORWARDING, +- IPV4_DEVCONF_PROXY_ARP, +- IPV4_DEVCONF_ACCEPT_REDIRECTS, +- IPV4_DEVCONF_SECURE_REDIRECTS, +- IPV4_DEVCONF_SEND_REDIRECTS, +- IPV4_DEVCONF_SHARED_MEDIA, +- IPV4_DEVCONF_RP_FILTER, +- IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, +- IPV4_DEVCONF_BOOTP_RELAY, +- IPV4_DEVCONF_LOG_MARTIANS, +- IPV4_DEVCONF_TAG, +- IPV4_DEVCONF_ARPFILTER, +- IPV4_DEVCONF_MEDIUM_ID, +- IPV4_DEVCONF_NOXFRM, +- IPV4_DEVCONF_NOPOLICY, +- IPV4_DEVCONF_FORCE_IGMP_VERSION, +- IPV4_DEVCONF_ARP_ANNOUNCE, +- IPV4_DEVCONF_ARP_IGNORE, +- IPV4_DEVCONF_PROMOTE_SECONDARIES, +- IPV4_DEVCONF_ARP_ACCEPT, +- IPV4_DEVCONF_ARP_NOTIFY, +- IPV4_DEVCONF_ACCEPT_LOCAL, +- IPV4_DEVCONF_SRC_VMARK, +- IPV4_DEVCONF_PROXY_ARP_PVLAN, +- IPV4_DEVCONF_ROUTE_LOCALNET, +- IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL, +- IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL, +- IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, +- IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST, +- IPV4_DEVCONF_DROP_GRATUITOUS_ARP, +- __IPV4_DEVCONF_MAX +-}; +- +-#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1) +- +-#endif /* _LINUX_IP_H */ +diff --git a/include/linux/ip6_tunnel.h b/include/linux/ip6_tunnel.h +deleted file mode 100644 +index 425926c..0000000 +--- a/include/linux/ip6_tunnel.h ++++ /dev/null +@@ -1,53 +0,0 @@ +-#ifndef _IP6_TUNNEL_H +-#define _IP6_TUNNEL_H +- +-#include +-#include /* For IFNAMSIZ. */ +-#include /* For struct in6_addr. */ +- +-#define IPV6_TLV_TNL_ENCAP_LIMIT 4 +-#define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4 +- +-/* don't add encapsulation limit if one isn't present in inner packet */ +-#define IP6_TNL_F_IGN_ENCAP_LIMIT 0x1 +-/* copy the traffic class field from the inner packet */ +-#define IP6_TNL_F_USE_ORIG_TCLASS 0x2 +-/* copy the flowlabel from the inner packet */ +-#define IP6_TNL_F_USE_ORIG_FLOWLABEL 0x4 +-/* being used for Mobile IPv6 */ +-#define IP6_TNL_F_MIP6_DEV 0x8 +-/* copy DSCP from the outer packet */ +-#define IP6_TNL_F_RCV_DSCP_COPY 0x10 +-/* copy fwmark from inner packet */ +-#define IP6_TNL_F_USE_ORIG_FWMARK 0x20 +- +-struct ip6_tnl_parm { +- char name[IFNAMSIZ]; /* name of tunnel device */ +- int link; /* ifindex of underlying L2 interface */ +- __u8 proto; /* tunnel protocol */ +- __u8 encap_limit; /* encapsulation limit for tunnel */ +- __u8 hop_limit; /* hop limit for tunnel */ +- __be32 flowinfo; /* traffic class and flowlabel for tunnel */ +- __u32 flags; /* tunnel flags */ +- struct in6_addr laddr; /* local tunnel end-point address */ +- struct in6_addr raddr; /* remote tunnel end-point address */ +-}; +- +-struct ip6_tnl_parm2 { +- char name[IFNAMSIZ]; /* name of tunnel device */ +- int link; /* ifindex of underlying L2 interface */ +- __u8 proto; /* tunnel protocol */ +- __u8 encap_limit; /* encapsulation limit for tunnel */ +- __u8 hop_limit; /* hop limit for tunnel */ +- __be32 flowinfo; /* traffic class and flowlabel for tunnel */ +- __u32 flags; /* tunnel flags */ +- struct in6_addr laddr; /* local tunnel end-point address */ +- struct in6_addr raddr; /* remote tunnel end-point address */ +- +- __be16 i_flags; +- __be16 o_flags; +- __be32 i_key; +- __be32 o_key; +-}; +- +-#endif +diff --git a/include/linux/ipsec.h b/include/linux/ipsec.h +deleted file mode 100644 +index d17a630..0000000 +--- a/include/linux/ipsec.h ++++ /dev/null +@@ -1,47 +0,0 @@ +-#ifndef _LINUX_IPSEC_H +-#define _LINUX_IPSEC_H +- +-/* The definitions, required to talk to KAME racoon IKE. */ +- +-#include +- +-#define IPSEC_PORT_ANY 0 +-#define IPSEC_ULPROTO_ANY 255 +-#define IPSEC_PROTO_ANY 255 +- +-enum { +- IPSEC_MODE_ANY = 0, /* We do not support this for SA */ +- IPSEC_MODE_TRANSPORT = 1, +- IPSEC_MODE_TUNNEL = 2, +- IPSEC_MODE_BEET = 3 +-}; +- +-enum { +- IPSEC_DIR_ANY = 0, +- IPSEC_DIR_INBOUND = 1, +- IPSEC_DIR_OUTBOUND = 2, +- IPSEC_DIR_FWD = 3, /* It is our own */ +- IPSEC_DIR_MAX = 4, +- IPSEC_DIR_INVALID = 5 +-}; +- +-enum { +- IPSEC_POLICY_DISCARD = 0, +- IPSEC_POLICY_NONE = 1, +- IPSEC_POLICY_IPSEC = 2, +- IPSEC_POLICY_ENTRUST = 3, +- IPSEC_POLICY_BYPASS = 4 +-}; +- +-enum { +- IPSEC_LEVEL_DEFAULT = 0, +- IPSEC_LEVEL_USE = 1, +- IPSEC_LEVEL_REQUIRE = 2, +- IPSEC_LEVEL_UNIQUE = 3 +-}; +- +-#define IPSEC_MANUAL_REQID_MAX 0x3fff +- +-#define IPSEC_REPLAYWSIZE 32 +- +-#endif /* _LINUX_IPSEC_H */ +diff --git a/include/linux/kernel.h b/include/linux/kernel.h +deleted file mode 100644 +index 527549f..0000000 +--- a/include/linux/kernel.h ++++ /dev/null +@@ -1,14 +0,0 @@ +-#ifndef _LINUX_KERNEL_H +-#define _LINUX_KERNEL_H +- +-#include +- +-/* +- * 'kernel.h' contains some often-used function prototypes etc +- */ +-#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) +-#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) +- +-#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +- +-#endif /* _LINUX_KERNEL_H */ +diff --git a/include/linux/l2tp.h b/include/linux/l2tp.h +deleted file mode 100644 +index 8a80007..0000000 +--- a/include/linux/l2tp.h ++++ /dev/null +@@ -1,199 +0,0 @@ +-/* +- * L2TP-over-IP socket for L2TPv3. +- * +- * Author: James Chapman +- */ +- +-#ifndef _LINUX_L2TP_H_ +-#define _LINUX_L2TP_H_ +- +-#include +-#include +-#include +-#include +- +-#define IPPROTO_L2TP 115 +- +-/** +- * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets +- * @l2tp_family: address family number AF_L2TPIP. +- * @l2tp_addr: protocol specific address information +- * @l2tp_conn_id: connection id of tunnel +- */ +-#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ +-struct sockaddr_l2tpip { +- /* The first fields must match struct sockaddr_in */ +- __kernel_sa_family_t l2tp_family; /* AF_INET */ +- __be16 l2tp_unused; /* INET port number (unused) */ +- struct in_addr l2tp_addr; /* Internet address */ +- +- __u32 l2tp_conn_id; /* Connection ID of tunnel */ +- +- /* Pad to size of `struct sockaddr'. */ +- unsigned char __pad[__SOCK_SIZE__ - +- sizeof(__kernel_sa_family_t) - +- sizeof(__be16) - sizeof(struct in_addr) - +- sizeof(__u32)]; +-}; +- +-/** +- * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets +- * @l2tp_family: address family number AF_L2TPIP. +- * @l2tp_addr: protocol specific address information +- * @l2tp_conn_id: connection id of tunnel +- */ +-struct sockaddr_l2tpip6 { +- /* The first fields must match struct sockaddr_in6 */ +- __kernel_sa_family_t l2tp_family; /* AF_INET6 */ +- __be16 l2tp_unused; /* INET port number (unused) */ +- __be32 l2tp_flowinfo; /* IPv6 flow information */ +- struct in6_addr l2tp_addr; /* IPv6 address */ +- __u32 l2tp_scope_id; /* scope id (new in RFC2553) */ +- __u32 l2tp_conn_id; /* Connection ID of tunnel */ +-}; +- +-/***************************************************************************** +- * NETLINK_GENERIC netlink family. +- *****************************************************************************/ +- +-/* +- * Commands. +- * Valid TLVs of each command are:- +- * TUNNEL_CREATE - CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid +- * TUNNEL_DELETE - CONN_ID +- * TUNNEL_MODIFY - CONN_ID, udpcsum +- * TUNNEL_GETSTATS - CONN_ID, (stats) +- * TUNNEL_GET - CONN_ID, (...) +- * SESSION_CREATE - SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec +- * SESSION_DELETE - SESSION_ID +- * SESSION_MODIFY - SESSION_ID, data_seq +- * SESSION_GET - SESSION_ID, (...) +- * SESSION_GETSTATS - SESSION_ID, (stats) +- * +- */ +-enum { +- L2TP_CMD_NOOP, +- L2TP_CMD_TUNNEL_CREATE, +- L2TP_CMD_TUNNEL_DELETE, +- L2TP_CMD_TUNNEL_MODIFY, +- L2TP_CMD_TUNNEL_GET, +- L2TP_CMD_SESSION_CREATE, +- L2TP_CMD_SESSION_DELETE, +- L2TP_CMD_SESSION_MODIFY, +- L2TP_CMD_SESSION_GET, +- __L2TP_CMD_MAX, +-}; +- +-#define L2TP_CMD_MAX (__L2TP_CMD_MAX - 1) +- +-/* +- * ATTR types defined for L2TP +- */ +-enum { +- L2TP_ATTR_NONE, /* no data */ +- L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ +- L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ +- L2TP_ATTR_OFFSET, /* u16 */ +- L2TP_ATTR_DATA_SEQ, /* u16 */ +- L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ +- L2TP_ATTR_L2SPEC_LEN, /* u8, enum l2tp_l2spec_type */ +- L2TP_ATTR_PROTO_VERSION, /* u8 */ +- L2TP_ATTR_IFNAME, /* string */ +- L2TP_ATTR_CONN_ID, /* u32 */ +- L2TP_ATTR_PEER_CONN_ID, /* u32 */ +- L2TP_ATTR_SESSION_ID, /* u32 */ +- L2TP_ATTR_PEER_SESSION_ID, /* u32 */ +- L2TP_ATTR_UDP_CSUM, /* u8 */ +- L2TP_ATTR_VLAN_ID, /* u16 */ +- L2TP_ATTR_COOKIE, /* 0, 4 or 8 bytes */ +- L2TP_ATTR_PEER_COOKIE, /* 0, 4 or 8 bytes */ +- L2TP_ATTR_DEBUG, /* u32, enum l2tp_debug_flags */ +- L2TP_ATTR_RECV_SEQ, /* u8 */ +- L2TP_ATTR_SEND_SEQ, /* u8 */ +- L2TP_ATTR_LNS_MODE, /* u8 */ +- L2TP_ATTR_USING_IPSEC, /* u8 */ +- L2TP_ATTR_RECV_TIMEOUT, /* msec */ +- L2TP_ATTR_FD, /* int */ +- L2TP_ATTR_IP_SADDR, /* u32 */ +- L2TP_ATTR_IP_DADDR, /* u32 */ +- L2TP_ATTR_UDP_SPORT, /* u16 */ +- L2TP_ATTR_UDP_DPORT, /* u16 */ +- L2TP_ATTR_MTU, /* u16 */ +- L2TP_ATTR_MRU, /* u16 */ +- L2TP_ATTR_STATS, /* nested */ +- L2TP_ATTR_IP6_SADDR, /* struct in6_addr */ +- L2TP_ATTR_IP6_DADDR, /* struct in6_addr */ +- L2TP_ATTR_UDP_ZERO_CSUM6_TX, /* flag */ +- L2TP_ATTR_UDP_ZERO_CSUM6_RX, /* flag */ +- L2TP_ATTR_PAD, +- __L2TP_ATTR_MAX, +-}; +- +-#define L2TP_ATTR_MAX (__L2TP_ATTR_MAX - 1) +- +-/* Nested in L2TP_ATTR_STATS */ +-enum { +- L2TP_ATTR_STATS_NONE, /* no data */ +- L2TP_ATTR_TX_PACKETS, /* u64 */ +- L2TP_ATTR_TX_BYTES, /* u64 */ +- L2TP_ATTR_TX_ERRORS, /* u64 */ +- L2TP_ATTR_RX_PACKETS, /* u64 */ +- L2TP_ATTR_RX_BYTES, /* u64 */ +- L2TP_ATTR_RX_SEQ_DISCARDS, /* u64 */ +- L2TP_ATTR_RX_OOS_PACKETS, /* u64 */ +- L2TP_ATTR_RX_ERRORS, /* u64 */ +- L2TP_ATTR_STATS_PAD, +- __L2TP_ATTR_STATS_MAX, +-}; +- +-#define L2TP_ATTR_STATS_MAX (__L2TP_ATTR_STATS_MAX - 1) +- +-enum l2tp_pwtype { +- L2TP_PWTYPE_NONE = 0x0000, +- L2TP_PWTYPE_ETH_VLAN = 0x0004, +- L2TP_PWTYPE_ETH = 0x0005, +- L2TP_PWTYPE_PPP = 0x0007, +- L2TP_PWTYPE_PPP_AC = 0x0008, +- L2TP_PWTYPE_IP = 0x000b, +- __L2TP_PWTYPE_MAX +-}; +- +-enum l2tp_l2spec_type { +- L2TP_L2SPECTYPE_NONE, +- L2TP_L2SPECTYPE_DEFAULT, +-}; +- +-enum l2tp_encap_type { +- L2TP_ENCAPTYPE_UDP, +- L2TP_ENCAPTYPE_IP, +-}; +- +-enum l2tp_seqmode { +- L2TP_SEQ_NONE = 0, +- L2TP_SEQ_IP = 1, +- L2TP_SEQ_ALL = 2, +-}; +- +-/** +- * enum l2tp_debug_flags - debug message categories for L2TP tunnels/sessions +- * +- * @L2TP_MSG_DEBUG: verbose debug (if compiled in) +- * @L2TP_MSG_CONTROL: userspace - kernel interface +- * @L2TP_MSG_SEQ: sequence numbers +- * @L2TP_MSG_DATA: data packets +- */ +-enum l2tp_debug_flags { +- L2TP_MSG_DEBUG = (1 << 0), +- L2TP_MSG_CONTROL = (1 << 1), +- L2TP_MSG_SEQ = (1 << 2), +- L2TP_MSG_DATA = (1 << 3), +-}; +- +-/* +- * NETLINK_GENERIC related info +- */ +-#define L2TP_GENL_NAME "l2tp" +-#define L2TP_GENL_VERSION 0x1 +-#define L2TP_GENL_MCGROUP "l2tp" +- +-#endif /* _LINUX_L2TP_H_ */ +diff --git a/include/linux/libc-compat.h b/include/linux/libc-compat.h +deleted file mode 100644 +index f38571d..0000000 +--- a/include/linux/libc-compat.h ++++ /dev/null +@@ -1,213 +0,0 @@ +-/* +- * Compatibility interface for userspace libc header coordination: +- * +- * Define compatibility macros that are used to control the inclusion or +- * exclusion of UAPI structures and definitions in coordination with another +- * userspace C library. +- * +- * This header is intended to solve the problem of UAPI definitions that +- * conflict with userspace definitions. If a UAPI header has such conflicting +- * definitions then the solution is as follows: +- * +- * * Synchronize the UAPI header and the libc headers so either one can be +- * used and such that the ABI is preserved. If this is not possible then +- * no simple compatibility interface exists (you need to write translating +- * wrappers and rename things) and you can't use this interface. +- * +- * Then follow this process: +- * +- * (a) Include libc-compat.h in the UAPI header. +- * e.g. #include +- * This include must be as early as possible. +- * +- * (b) In libc-compat.h add enough code to detect that the comflicting +- * userspace libc header has been included first. +- * +- * (c) If the userspace libc header has been included first define a set of +- * guard macros of the form __UAPI_DEF_FOO and set their values to 1, else +- * set their values to 0. +- * +- * (d) Back in the UAPI header with the conflicting definitions, guard the +- * definitions with: +- * #if __UAPI_DEF_FOO +- * ... +- * #endif +- * +- * This fixes the situation where the linux headers are included *after* the +- * libc headers. To fix the problem with the inclusion in the other order the +- * userspace libc headers must be fixed like this: +- * +- * * For all definitions that conflict with kernel definitions wrap those +- * defines in the following: +- * #if !__UAPI_DEF_FOO +- * ... +- * #endif +- * +- * This prevents the redefinition of a construct already defined by the kernel. +- */ +-#ifndef _LIBC_COMPAT_H +-#define _LIBC_COMPAT_H +- +-/* We have included glibc headers... */ +-#if defined(__GLIBC__) +- +-/* Coordinate with glibc net/if.h header. */ +-#if defined(_NET_IF_H) && defined(__USE_MISC) +- +-/* GLIBC headers included first so don't define anything +- * that would already be defined. */ +- +-#define __UAPI_DEF_IF_IFCONF 0 +-#define __UAPI_DEF_IF_IFMAP 0 +-#define __UAPI_DEF_IF_IFNAMSIZ 0 +-#define __UAPI_DEF_IF_IFREQ 0 +-/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 +-/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +-#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO +-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +-#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ +- +-#else /* _NET_IF_H */ +- +-/* Linux headers included first, and we must define everything +- * we need. The expectation is that glibc will check the +- * __UAPI_DEF_* defines and adjust appropriately. */ +- +-#define __UAPI_DEF_IF_IFCONF 1 +-#define __UAPI_DEF_IF_IFMAP 1 +-#define __UAPI_DEF_IF_IFNAMSIZ 1 +-#define __UAPI_DEF_IF_IFREQ 1 +-/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +-/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +- +-#endif /* _NET_IF_H */ +- +-/* Coordinate with glibc netinet/in.h header. */ +-#if defined(_NETINET_IN_H) +- +-/* GLIBC headers included first so don't define anything +- * that would already be defined. */ +-#define __UAPI_DEF_IN_ADDR 0 +-#define __UAPI_DEF_IN_IPPROTO 0 +-#define __UAPI_DEF_IN_PKTINFO 0 +-#define __UAPI_DEF_IP_MREQ 0 +-#define __UAPI_DEF_SOCKADDR_IN 0 +-#define __UAPI_DEF_IN_CLASS 0 +- +-#define __UAPI_DEF_IN6_ADDR 0 +-/* The exception is the in6_addr macros which must be defined +- * if the glibc code didn't define them. This guard matches +- * the guard in glibc/inet/netinet/in.h which defines the +- * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */ +-#if defined(__USE_MISC) || defined (__USE_GNU) +-#define __UAPI_DEF_IN6_ADDR_ALT 0 +-#else +-#define __UAPI_DEF_IN6_ADDR_ALT 1 +-#endif +-#define __UAPI_DEF_SOCKADDR_IN6 0 +-#define __UAPI_DEF_IPV6_MREQ 0 +-#define __UAPI_DEF_IPPROTO_V6 0 +-#define __UAPI_DEF_IPV6_OPTIONS 0 +-#define __UAPI_DEF_IN6_PKTINFO 0 +-#define __UAPI_DEF_IP6_MTUINFO 0 +- +-#else +- +-/* Linux headers included first, and we must define everything +- * we need. The expectation is that glibc will check the +- * __UAPI_DEF_* defines and adjust appropriately. */ +-#define __UAPI_DEF_IN_ADDR 1 +-#define __UAPI_DEF_IN_IPPROTO 1 +-#define __UAPI_DEF_IN_PKTINFO 1 +-#define __UAPI_DEF_IP_MREQ 1 +-#define __UAPI_DEF_SOCKADDR_IN 1 +-#define __UAPI_DEF_IN_CLASS 1 +- +-#define __UAPI_DEF_IN6_ADDR 1 +-/* We unconditionally define the in6_addr macros and glibc must +- * coordinate. */ +-#define __UAPI_DEF_IN6_ADDR_ALT 1 +-#define __UAPI_DEF_SOCKADDR_IN6 1 +-#define __UAPI_DEF_IPV6_MREQ 1 +-#define __UAPI_DEF_IPPROTO_V6 1 +-#define __UAPI_DEF_IPV6_OPTIONS 1 +-#define __UAPI_DEF_IN6_PKTINFO 1 +-#define __UAPI_DEF_IP6_MTUINFO 1 +- +-#endif /* _NETINET_IN_H */ +- +-/* Coordinate with glibc netipx/ipx.h header. */ +-#if defined(__NETIPX_IPX_H) +- +-#define __UAPI_DEF_SOCKADDR_IPX 0 +-#define __UAPI_DEF_IPX_ROUTE_DEFINITION 0 +-#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 0 +-#define __UAPI_DEF_IPX_CONFIG_DATA 0 +-#define __UAPI_DEF_IPX_ROUTE_DEF 0 +- +-#else /* defined(__NETIPX_IPX_H) */ +- +-#define __UAPI_DEF_SOCKADDR_IPX 1 +-#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 +-#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 +-#define __UAPI_DEF_IPX_CONFIG_DATA 1 +-#define __UAPI_DEF_IPX_ROUTE_DEF 1 +- +-#endif /* defined(__NETIPX_IPX_H) */ +- +-/* Definitions for xattr.h */ +-#if defined(_SYS_XATTR_H) +-#define __UAPI_DEF_XATTR 0 +-#else +-#define __UAPI_DEF_XATTR 1 +-#endif +- +-/* If we did not see any headers from any supported C libraries, +- * or we are being included in the kernel, then define everything +- * that we need. */ +-#else /* !defined(__GLIBC__) */ +- +-/* Definitions for if.h */ +-#define __UAPI_DEF_IF_IFCONF 1 +-#define __UAPI_DEF_IF_IFMAP 1 +-#define __UAPI_DEF_IF_IFNAMSIZ 1 +-#define __UAPI_DEF_IF_IFREQ 1 +-/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +-/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +-#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +- +-/* Definitions for in.h */ +-#define __UAPI_DEF_IN_ADDR 1 +-#define __UAPI_DEF_IN_IPPROTO 1 +-#define __UAPI_DEF_IN_PKTINFO 1 +-#define __UAPI_DEF_IP_MREQ 1 +-#define __UAPI_DEF_SOCKADDR_IN 1 +-#define __UAPI_DEF_IN_CLASS 1 +- +-/* Definitions for in6.h */ +-#define __UAPI_DEF_IN6_ADDR 1 +-#define __UAPI_DEF_IN6_ADDR_ALT 1 +-#define __UAPI_DEF_SOCKADDR_IN6 1 +-#define __UAPI_DEF_IPV6_MREQ 1 +-#define __UAPI_DEF_IPPROTO_V6 1 +-#define __UAPI_DEF_IPV6_OPTIONS 1 +-#define __UAPI_DEF_IN6_PKTINFO 1 +-#define __UAPI_DEF_IP6_MTUINFO 1 +- +-/* Definitions for ipx.h */ +-#define __UAPI_DEF_SOCKADDR_IPX 1 +-#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 +-#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 +-#define __UAPI_DEF_IPX_CONFIG_DATA 1 +-#define __UAPI_DEF_IPX_ROUTE_DEF 1 +- +-/* Definitions for xattr.h */ +-#define __UAPI_DEF_XATTR 1 +- +-#endif /* __GLIBC__ */ +- +-#endif /* _LIBC_COMPAT_H */ +diff --git a/include/linux/limits.h b/include/linux/limits.h +deleted file mode 100644 +index 2d0f941..0000000 +--- a/include/linux/limits.h ++++ /dev/null +@@ -1,20 +0,0 @@ +-#ifndef _LINUX_LIMITS_H +-#define _LINUX_LIMITS_H +- +-#define NR_OPEN 1024 +- +-#define NGROUPS_MAX 65536 /* supplemental group IDs are available */ +-#define ARG_MAX 131072 /* # bytes of args + environ for exec() */ +-#define LINK_MAX 127 /* # links a file may have */ +-#define MAX_CANON 255 /* size of the canonical input queue */ +-#define MAX_INPUT 255 /* size of the type-ahead buffer */ +-#define NAME_MAX 255 /* # chars in a file name */ +-#define PATH_MAX 4096 /* # chars in a path name including nul */ +-#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ +-#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ +-#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ +-#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ +- +-#define RTSIG_MAX 32 +- +-#endif +diff --git a/include/linux/lwtunnel.h b/include/linux/lwtunnel.h +deleted file mode 100644 +index 3298426..0000000 +--- a/include/linux/lwtunnel.h ++++ /dev/null +@@ -1,70 +0,0 @@ +-#ifndef _LWTUNNEL_H_ +-#define _LWTUNNEL_H_ +- +-#include +- +-enum lwtunnel_encap_types { +- LWTUNNEL_ENCAP_NONE, +- LWTUNNEL_ENCAP_MPLS, +- LWTUNNEL_ENCAP_IP, +- LWTUNNEL_ENCAP_ILA, +- LWTUNNEL_ENCAP_IP6, +- LWTUNNEL_ENCAP_SEG6, +- LWTUNNEL_ENCAP_BPF, +- LWTUNNEL_ENCAP_SEG6_LOCAL, +- __LWTUNNEL_ENCAP_MAX, +-}; +- +-#define LWTUNNEL_ENCAP_MAX (__LWTUNNEL_ENCAP_MAX - 1) +- +-enum lwtunnel_ip_t { +- LWTUNNEL_IP_UNSPEC, +- LWTUNNEL_IP_ID, +- LWTUNNEL_IP_DST, +- LWTUNNEL_IP_SRC, +- LWTUNNEL_IP_TTL, +- LWTUNNEL_IP_TOS, +- LWTUNNEL_IP_FLAGS, +- LWTUNNEL_IP_PAD, +- __LWTUNNEL_IP_MAX, +-}; +- +-#define LWTUNNEL_IP_MAX (__LWTUNNEL_IP_MAX - 1) +- +-enum lwtunnel_ip6_t { +- LWTUNNEL_IP6_UNSPEC, +- LWTUNNEL_IP6_ID, +- LWTUNNEL_IP6_DST, +- LWTUNNEL_IP6_SRC, +- LWTUNNEL_IP6_HOPLIMIT, +- LWTUNNEL_IP6_TC, +- LWTUNNEL_IP6_FLAGS, +- LWTUNNEL_IP6_PAD, +- __LWTUNNEL_IP6_MAX, +-}; +- +-#define LWTUNNEL_IP6_MAX (__LWTUNNEL_IP6_MAX - 1) +- +-enum { +- LWT_BPF_PROG_UNSPEC, +- LWT_BPF_PROG_FD, +- LWT_BPF_PROG_NAME, +- __LWT_BPF_PROG_MAX, +-}; +- +-#define LWT_BPF_PROG_MAX (__LWT_BPF_PROG_MAX - 1) +- +-enum { +- LWT_BPF_UNSPEC, +- LWT_BPF_IN, +- LWT_BPF_OUT, +- LWT_BPF_XMIT, +- LWT_BPF_XMIT_HEADROOM, +- __LWT_BPF_MAX, +-}; +- +-#define LWT_BPF_MAX (__LWT_BPF_MAX - 1) +- +-#define LWT_BPF_MAX_HEADROOM 256 +- +-#endif /* _LWTUNNEL_H_ */ +diff --git a/include/linux/magic.h b/include/linux/magic.h +deleted file mode 100644 +index e439565..0000000 +--- a/include/linux/magic.h ++++ /dev/null +@@ -1,91 +0,0 @@ +-#ifndef __LINUX_MAGIC_H__ +-#define __LINUX_MAGIC_H__ +- +-#define ADFS_SUPER_MAGIC 0xadf5 +-#define AFFS_SUPER_MAGIC 0xadff +-#define AFS_SUPER_MAGIC 0x5346414F +-#define AUTOFS_SUPER_MAGIC 0x0187 +-#define CODA_SUPER_MAGIC 0x73757245 +-#define CRAMFS_MAGIC 0x28cd3d45 /* some random number */ +-#define CRAMFS_MAGIC_WEND 0x453dcd28 /* magic number with the wrong endianess */ +-#define DEBUGFS_MAGIC 0x64626720 +-#define SECURITYFS_MAGIC 0x73636673 +-#define SELINUX_MAGIC 0xf97cff8c +-#define SMACK_MAGIC 0x43415d53 /* "SMAC" */ +-#define RAMFS_MAGIC 0x858458f6 /* some random number */ +-#define TMPFS_MAGIC 0x01021994 +-#define HUGETLBFS_MAGIC 0x958458f6 /* some random number */ +-#define SQUASHFS_MAGIC 0x73717368 +-#define ECRYPTFS_SUPER_MAGIC 0xf15f +-#define EFS_SUPER_MAGIC 0x414A53 +-#define EXT2_SUPER_MAGIC 0xEF53 +-#define EXT3_SUPER_MAGIC 0xEF53 +-#define XENFS_SUPER_MAGIC 0xabba1974 +-#define EXT4_SUPER_MAGIC 0xEF53 +-#define BTRFS_SUPER_MAGIC 0x9123683E +-#define NILFS_SUPER_MAGIC 0x3434 +-#define F2FS_SUPER_MAGIC 0xF2F52010 +-#define HPFS_SUPER_MAGIC 0xf995e849 +-#define ISOFS_SUPER_MAGIC 0x9660 +-#define JFFS2_SUPER_MAGIC 0x72b6 +-#define PSTOREFS_MAGIC 0x6165676C +-#define EFIVARFS_MAGIC 0xde5e81e4 +-#define HOSTFS_SUPER_MAGIC 0x00c0ffee +-#define OVERLAYFS_SUPER_MAGIC 0x794c7630 +- +-#define MINIX_SUPER_MAGIC 0x137F /* minix v1 fs, 14 char names */ +-#define MINIX_SUPER_MAGIC2 0x138F /* minix v1 fs, 30 char names */ +-#define MINIX2_SUPER_MAGIC 0x2468 /* minix v2 fs, 14 char names */ +-#define MINIX2_SUPER_MAGIC2 0x2478 /* minix v2 fs, 30 char names */ +-#define MINIX3_SUPER_MAGIC 0x4d5a /* minix v3 fs, 60 char names */ +- +-#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */ +-#define NCP_SUPER_MAGIC 0x564c /* Guess, what 0x564c is :-) */ +-#define NFS_SUPER_MAGIC 0x6969 +-#define OCFS2_SUPER_MAGIC 0x7461636f +-#define OPENPROM_SUPER_MAGIC 0x9fa1 +-#define QNX4_SUPER_MAGIC 0x002f /* qnx4 fs detection */ +-#define QNX6_SUPER_MAGIC 0x68191122 /* qnx6 fs detection */ +- +-#define REISERFS_SUPER_MAGIC 0x52654973 /* used by gcc */ +- /* used by file system utilities that +- look at the superblock, etc. */ +-#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs" +-#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" +-#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" +- +-#define SMB_SUPER_MAGIC 0x517B +-#define CGROUP_SUPER_MAGIC 0x27e0eb +-#define CGROUP2_SUPER_MAGIC 0x63677270 +- +-#define RDTGROUP_SUPER_MAGIC 0x7655821 +- +-#define STACK_END_MAGIC 0x57AC6E9D +- +-#define TRACEFS_MAGIC 0x74726163 +- +-#define V9FS_MAGIC 0x01021997 +- +-#define BDEVFS_MAGIC 0x62646576 +-#define DAXFS_MAGIC 0x64646178 +-#define BINFMTFS_MAGIC 0x42494e4d +-#define DEVPTS_SUPER_MAGIC 0x1cd1 +-#define FUTEXFS_SUPER_MAGIC 0xBAD1DEA +-#define PIPEFS_MAGIC 0x50495045 +-#define PROC_SUPER_MAGIC 0x9fa0 +-#define SOCKFS_MAGIC 0x534F434B +-#define SYSFS_MAGIC 0x62656572 +-#define USBDEVICE_SUPER_MAGIC 0x9fa2 +-#define MTD_INODE_FS_MAGIC 0x11307854 +-#define ANON_INODE_FS_MAGIC 0x09041934 +-#define BTRFS_TEST_MAGIC 0x73727279 +-#define NSFS_MAGIC 0x6e736673 +-#define BPF_FS_MAGIC 0xcafe4a11 +-#define AAFS_MAGIC 0x5a3c69f0 +- +-/* Since UDF 2.01 is ISO 13346 based... */ +-#define UDF_SUPER_MAGIC 0x15013346 +-#define BALLOON_KVM_MAGIC 0x13661366 +-#define ZSMALLOC_MAGIC 0x58295829 +- +-#endif /* __LINUX_MAGIC_H__ */ +diff --git a/include/linux/mpls.h b/include/linux/mpls.h +deleted file mode 100644 +index bf5b625..0000000 +--- a/include/linux/mpls.h ++++ /dev/null +@@ -1,76 +0,0 @@ +-#ifndef _MPLS_H +-#define _MPLS_H +- +-#include +-#include +- +-/* Reference: RFC 5462, RFC 3032 +- * +- * 0 1 2 3 +- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +- * | Label | TC |S| TTL | +- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +- * +- * Label: Label Value, 20 bits +- * TC: Traffic Class field, 3 bits +- * S: Bottom of Stack, 1 bit +- * TTL: Time to Live, 8 bits +- */ +- +-struct mpls_label { +- __be32 entry; +-}; +- +-#define MPLS_LS_LABEL_MASK 0xFFFFF000 +-#define MPLS_LS_LABEL_SHIFT 12 +-#define MPLS_LS_TC_MASK 0x00000E00 +-#define MPLS_LS_TC_SHIFT 9 +-#define MPLS_LS_S_MASK 0x00000100 +-#define MPLS_LS_S_SHIFT 8 +-#define MPLS_LS_TTL_MASK 0x000000FF +-#define MPLS_LS_TTL_SHIFT 0 +- +-/* Reserved labels */ +-#define MPLS_LABEL_IPV4NULL 0 /* RFC3032 */ +-#define MPLS_LABEL_RTALERT 1 /* RFC3032 */ +-#define MPLS_LABEL_IPV6NULL 2 /* RFC3032 */ +-#define MPLS_LABEL_IMPLNULL 3 /* RFC3032 */ +-#define MPLS_LABEL_ENTROPY 7 /* RFC6790 */ +-#define MPLS_LABEL_GAL 13 /* RFC5586 */ +-#define MPLS_LABEL_OAMALERT 14 /* RFC3429 */ +-#define MPLS_LABEL_EXTENSION 15 /* RFC7274 */ +- +-#define MPLS_LABEL_FIRST_UNRESERVED 16 /* RFC3032 */ +- +-/* These are embedded into IFLA_STATS_AF_SPEC: +- * [IFLA_STATS_AF_SPEC] +- * -> [AF_MPLS] +- * -> [MPLS_STATS_xxx] +- * +- * Attributes: +- * [MPLS_STATS_LINK] = { +- * struct mpls_link_stats +- * } +- */ +-enum { +- MPLS_STATS_UNSPEC, /* also used as 64bit pad attribute */ +- MPLS_STATS_LINK, +- __MPLS_STATS_MAX, +-}; +- +-#define MPLS_STATS_MAX (__MPLS_STATS_MAX - 1) +- +-struct mpls_link_stats { +- __u64 rx_packets; /* total packets received */ +- __u64 tx_packets; /* total packets transmitted */ +- __u64 rx_bytes; /* total bytes received */ +- __u64 tx_bytes; /* total bytes transmitted */ +- __u64 rx_errors; /* bad packets received */ +- __u64 tx_errors; /* packet transmit problems */ +- __u64 rx_dropped; /* packet dropped on receive */ +- __u64 tx_dropped; /* packet dropped on transmit */ +- __u64 rx_noroute; /* no route for packet dest */ +-}; +- +-#endif /* _MPLS_H */ +diff --git a/include/linux/mpls_iptunnel.h b/include/linux/mpls_iptunnel.h +deleted file mode 100644 +index 1a0e57b..0000000 +--- a/include/linux/mpls_iptunnel.h ++++ /dev/null +@@ -1,30 +0,0 @@ +-/* +- * mpls tunnel api +- * +- * Authors: +- * Roopa Prabhu +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_MPLS_IPTUNNEL_H +-#define _LINUX_MPLS_IPTUNNEL_H +- +-/* MPLS tunnel attributes +- * [RTA_ENCAP] = { +- * [MPLS_IPTUNNEL_DST] +- * [MPLS_IPTUNNEL_TTL] +- * } +- */ +-enum { +- MPLS_IPTUNNEL_UNSPEC, +- MPLS_IPTUNNEL_DST, +- MPLS_IPTUNNEL_TTL, +- __MPLS_IPTUNNEL_MAX, +-}; +-#define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1) +- +-#endif /* _LINUX_MPLS_IPTUNNEL_H */ +diff --git a/include/linux/neighbour.h b/include/linux/neighbour.h +deleted file mode 100644 +index 3199d28..0000000 +--- a/include/linux/neighbour.h ++++ /dev/null +@@ -1,171 +0,0 @@ +-#ifndef __LINUX_NEIGHBOUR_H +-#define __LINUX_NEIGHBOUR_H +- +-#include +-#include +- +-struct ndmsg { +- __u8 ndm_family; +- __u8 ndm_pad1; +- __u16 ndm_pad2; +- __s32 ndm_ifindex; +- __u16 ndm_state; +- __u8 ndm_flags; +- __u8 ndm_type; +-}; +- +-enum { +- NDA_UNSPEC, +- NDA_DST, +- NDA_LLADDR, +- NDA_CACHEINFO, +- NDA_PROBES, +- NDA_VLAN, +- NDA_PORT, +- NDA_VNI, +- NDA_IFINDEX, +- NDA_MASTER, +- NDA_LINK_NETNSID, +- NDA_SRC_VNI, +- __NDA_MAX +-}; +- +-#define NDA_MAX (__NDA_MAX - 1) +- +-/* +- * Neighbor Cache Entry Flags +- */ +- +-#define NTF_USE 0x01 +-#define NTF_SELF 0x02 +-#define NTF_MASTER 0x04 +-#define NTF_PROXY 0x08 /* == ATF_PUBL */ +-#define NTF_EXT_LEARNED 0x10 +-#define NTF_OFFLOADED 0x20 +-#define NTF_ROUTER 0x80 +- +-/* +- * Neighbor Cache Entry States. +- */ +- +-#define NUD_INCOMPLETE 0x01 +-#define NUD_REACHABLE 0x02 +-#define NUD_STALE 0x04 +-#define NUD_DELAY 0x08 +-#define NUD_PROBE 0x10 +-#define NUD_FAILED 0x20 +- +-/* Dummy states */ +-#define NUD_NOARP 0x40 +-#define NUD_PERMANENT 0x80 +-#define NUD_NONE 0x00 +- +-/* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change +- and make no address resolution or NUD. +- NUD_PERMANENT also cannot be deleted by garbage collectors. +- */ +- +-struct nda_cacheinfo { +- __u32 ndm_confirmed; +- __u32 ndm_used; +- __u32 ndm_updated; +- __u32 ndm_refcnt; +-}; +- +-/***************************************************************** +- * Neighbour tables specific messages. +- * +- * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the +- * NLM_F_DUMP flag set. Every neighbour table configuration is +- * spread over multiple messages to avoid running into message +- * size limits on systems with many interfaces. The first message +- * in the sequence transports all not device specific data such as +- * statistics, configuration, and the default parameter set. +- * This message is followed by 0..n messages carrying device +- * specific parameter sets. +- * Although the ordering should be sufficient, NDTA_NAME can be +- * used to identify sequences. The initial message can be identified +- * by checking for NDTA_CONFIG. The device specific messages do +- * not contain this TLV but have NDTPA_IFINDEX set to the +- * corresponding interface index. +- * +- * To change neighbour table attributes, send RTM_SETNEIGHTBL +- * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3], +- * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked +- * otherwise. Device specific parameter sets can be changed by +- * setting NDTPA_IFINDEX to the interface index of the corresponding +- * device. +- ****/ +- +-struct ndt_stats { +- __u64 ndts_allocs; +- __u64 ndts_destroys; +- __u64 ndts_hash_grows; +- __u64 ndts_res_failed; +- __u64 ndts_lookups; +- __u64 ndts_hits; +- __u64 ndts_rcv_probes_mcast; +- __u64 ndts_rcv_probes_ucast; +- __u64 ndts_periodic_gc_runs; +- __u64 ndts_forced_gc_runs; +- __u64 ndts_table_fulls; +-}; +- +-enum { +- NDTPA_UNSPEC, +- NDTPA_IFINDEX, /* u32, unchangeable */ +- NDTPA_REFCNT, /* u32, read-only */ +- NDTPA_REACHABLE_TIME, /* u64, read-only, msecs */ +- NDTPA_BASE_REACHABLE_TIME, /* u64, msecs */ +- NDTPA_RETRANS_TIME, /* u64, msecs */ +- NDTPA_GC_STALETIME, /* u64, msecs */ +- NDTPA_DELAY_PROBE_TIME, /* u64, msecs */ +- NDTPA_QUEUE_LEN, /* u32 */ +- NDTPA_APP_PROBES, /* u32 */ +- NDTPA_UCAST_PROBES, /* u32 */ +- NDTPA_MCAST_PROBES, /* u32 */ +- NDTPA_ANYCAST_DELAY, /* u64, msecs */ +- NDTPA_PROXY_DELAY, /* u64, msecs */ +- NDTPA_PROXY_QLEN, /* u32 */ +- NDTPA_LOCKTIME, /* u64, msecs */ +- NDTPA_QUEUE_LENBYTES, /* u32 */ +- NDTPA_MCAST_REPROBES, /* u32 */ +- NDTPA_PAD, +- __NDTPA_MAX +-}; +-#define NDTPA_MAX (__NDTPA_MAX - 1) +- +-struct ndtmsg { +- __u8 ndtm_family; +- __u8 ndtm_pad1; +- __u16 ndtm_pad2; +-}; +- +-struct ndt_config { +- __u16 ndtc_key_len; +- __u16 ndtc_entry_size; +- __u32 ndtc_entries; +- __u32 ndtc_last_flush; /* delta to now in msecs */ +- __u32 ndtc_last_rand; /* delta to now in msecs */ +- __u32 ndtc_hash_rnd; +- __u32 ndtc_hash_mask; +- __u32 ndtc_hash_chain_gc; +- __u32 ndtc_proxy_qlen; +-}; +- +-enum { +- NDTA_UNSPEC, +- NDTA_NAME, /* char *, unchangeable */ +- NDTA_THRESH1, /* u32 */ +- NDTA_THRESH2, /* u32 */ +- NDTA_THRESH3, /* u32 */ +- NDTA_CONFIG, /* struct ndt_config, read-only */ +- NDTA_PARMS, /* nested TLV NDTPA_* */ +- NDTA_STATS, /* struct ndt_stats, read-only */ +- NDTA_GC_INTERVAL, /* u64, msecs */ +- NDTA_PAD, +- __NDTA_MAX +-}; +-#define NDTA_MAX (__NDTA_MAX - 1) +- +-#endif +diff --git a/include/linux/net_namespace.h b/include/linux/net_namespace.h +deleted file mode 100644 +index 9a92b7e..0000000 +--- a/include/linux/net_namespace.h ++++ /dev/null +@@ -1,23 +0,0 @@ +-/* Copyright (c) 2015 6WIND S.A. +- * Author: Nicolas Dichtel +- * +- * This program is free software; you can redistribute it and/or modify it +- * under the terms and conditions of the GNU General Public License, +- * version 2, as published by the Free Software Foundation. +- */ +-#ifndef _LINUX_NET_NAMESPACE_H_ +-#define _LINUX_NET_NAMESPACE_H_ +- +-/* Attributes of RTM_NEWNSID/RTM_GETNSID messages */ +-enum { +- NETNSA_NONE, +-#define NETNSA_NSID_NOT_ASSIGNED -1 +- NETNSA_NSID, +- NETNSA_PID, +- NETNSA_FD, +- __NETNSA_MAX, +-}; +- +-#define NETNSA_MAX (__NETNSA_MAX - 1) +- +-#endif /* _LINUX_NET_NAMESPACE_H_ */ +diff --git a/include/linux/netconf.h b/include/linux/netconf.h +deleted file mode 100644 +index 4afbd7d..0000000 +--- a/include/linux/netconf.h ++++ /dev/null +@@ -1,28 +0,0 @@ +-#ifndef _LINUX_NETCONF_H_ +-#define _LINUX_NETCONF_H_ +- +-#include +-#include +- +-struct netconfmsg { +- __u8 ncm_family; +-}; +- +-enum { +- NETCONFA_UNSPEC, +- NETCONFA_IFINDEX, +- NETCONFA_FORWARDING, +- NETCONFA_RP_FILTER, +- NETCONFA_MC_FORWARDING, +- NETCONFA_PROXY_NEIGH, +- NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, +- NETCONFA_INPUT, +- __NETCONFA_MAX +-}; +-#define NETCONFA_MAX (__NETCONFA_MAX - 1) +-#define NETCONFA_ALL -1 +- +-#define NETCONFA_IFINDEX_ALL -1 +-#define NETCONFA_IFINDEX_DEFAULT -2 +- +-#endif /* _LINUX_NETCONF_H_ */ +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +deleted file mode 100644 +index 66fceb4..0000000 +--- a/include/linux/netdevice.h ++++ /dev/null +@@ -1,65 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Definitions for the Interfaces handler. +- * +- * Version: @(#)dev.h 1.0.10 08/12/93 +- * +- * Authors: Ross Biro +- * Fred N. van Kempen, +- * Corey Minyard +- * Donald J. Becker, +- * Alan Cox, +- * Bjorn Ekwall. +- * Pekka Riikonen +- * +- * This program is free software; you can redistribute 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. +- * +- * Moved to /usr/include/linux for NET3 +- */ +-#ifndef _LINUX_NETDEVICE_H +-#define _LINUX_NETDEVICE_H +- +-#include +-#include +-#include +-#include +- +- +-#define MAX_ADDR_LEN 32 /* Largest hardware address length */ +- +-/* Initial net device group. All devices belong to group 0 by default. */ +-#define INIT_NETDEV_GROUP 0 +- +- +-/* interface name assignment types (sysfs name_assign_type attribute) */ +-#define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to userspace) */ +-#define NET_NAME_ENUM 1 /* enumerated by kernel */ +-#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */ +-#define NET_NAME_USER 3 /* provided by user-space */ +-#define NET_NAME_RENAMED 4 /* renamed by user-space */ +- +-/* Media selection options. */ +-enum { +- IF_PORT_UNKNOWN = 0, +- IF_PORT_10BASE2, +- IF_PORT_10BASET, +- IF_PORT_AUI, +- IF_PORT_100BASET, +- IF_PORT_100BASETX, +- IF_PORT_100BASEFX +-}; +- +-/* hardware address assignment types */ +-#define NET_ADDR_PERM 0 /* address is permanent (default) */ +-#define NET_ADDR_RANDOM 1 /* address is generated randomly */ +-#define NET_ADDR_STOLEN 2 /* address is stolen from other device */ +-#define NET_ADDR_SET 3 /* address is set using +- * dev_set_mac_address() */ +- +-#endif /* _LINUX_NETDEVICE_H */ +diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h +deleted file mode 100644 +index ff4a4a5..0000000 +--- a/include/linux/netfilter.h ++++ /dev/null +@@ -1,77 +0,0 @@ +-#ifndef __LINUX_NETFILTER_H +-#define __LINUX_NETFILTER_H +- +-#include +- +-#include +-#include +- +-/* Responses from hook functions. */ +-#define NF_DROP 0 +-#define NF_ACCEPT 1 +-#define NF_STOLEN 2 +-#define NF_QUEUE 3 +-#define NF_REPEAT 4 +-#define NF_STOP 5 /* Deprecated, for userspace nf_queue compatibility. */ +-#define NF_MAX_VERDICT NF_STOP +- +-/* we overload the higher bits for encoding auxiliary data such as the queue +- * number or errno values. Not nice, but better than additional function +- * arguments. */ +-#define NF_VERDICT_MASK 0x000000ff +- +-/* extra verdict flags have mask 0x0000ff00 */ +-#define NF_VERDICT_FLAG_QUEUE_BYPASS 0x00008000 +- +-/* queue number (NF_QUEUE) or errno (NF_DROP) */ +-#define NF_VERDICT_QMASK 0xffff0000 +-#define NF_VERDICT_QBITS 16 +- +-#define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE) +- +-#define NF_DROP_ERR(x) (((-x) << 16) | NF_DROP) +- +-/* only for userspace compatibility */ +-/* Generic cache responses from hook functions. +- <= 0x2000 is used for protocol-flags. */ +-#define NFC_UNKNOWN 0x4000 +-#define NFC_ALTERED 0x8000 +- +-/* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */ +-#define NF_VERDICT_BITS 16 +- +-enum nf_inet_hooks { +- NF_INET_PRE_ROUTING, +- NF_INET_LOCAL_IN, +- NF_INET_FORWARD, +- NF_INET_LOCAL_OUT, +- NF_INET_POST_ROUTING, +- NF_INET_NUMHOOKS +-}; +- +-enum nf_dev_hooks { +- NF_NETDEV_INGRESS, +- NF_NETDEV_NUMHOOKS +-}; +- +-enum { +- NFPROTO_UNSPEC = 0, +- NFPROTO_INET = 1, +- NFPROTO_IPV4 = 2, +- NFPROTO_ARP = 3, +- NFPROTO_NETDEV = 5, +- NFPROTO_BRIDGE = 7, +- NFPROTO_IPV6 = 10, +- NFPROTO_DECNET = 12, +- NFPROTO_NUMPROTO, +-}; +- +-union nf_inet_addr { +- __u32 all[4]; +- __be32 ip; +- __be32 ip6[4]; +- struct in_addr in; +- struct in6_addr in6; +-}; +- +-#endif /* __LINUX_NETFILTER_H */ +diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h +deleted file mode 100644 +index a6c96b0..0000000 +--- a/include/linux/netfilter/ipset/ip_set.h ++++ /dev/null +@@ -1,304 +0,0 @@ +-/* Copyright (C) 2000-2002 Joakim Axelsson +- * Patrick Schaaf +- * Martin Josefsson +- * Copyright (C) 2003-2011 Jozsef Kadlecsik +- * +- * This program is free software; you can redistribute it and/or modify +- * it under the terms of the GNU General Public License version 2 as +- * published by the Free Software Foundation. +- */ +-#ifndef _IP_SET_H +-#define _IP_SET_H +- +-#include +- +-/* The protocol version */ +-#define IPSET_PROTOCOL 6 +- +-/* The max length of strings including NUL: set and type identifiers */ +-#define IPSET_MAXNAMELEN 32 +- +-/* The maximum permissible comment length we will accept over netlink */ +-#define IPSET_MAX_COMMENT_SIZE 255 +- +-/* Message types and commands */ +-enum ipset_cmd { +- IPSET_CMD_NONE, +- IPSET_CMD_PROTOCOL, /* 1: Return protocol version */ +- IPSET_CMD_CREATE, /* 2: Create a new (empty) set */ +- IPSET_CMD_DESTROY, /* 3: Destroy a (empty) set */ +- IPSET_CMD_FLUSH, /* 4: Remove all elements from a set */ +- IPSET_CMD_RENAME, /* 5: Rename a set */ +- IPSET_CMD_SWAP, /* 6: Swap two sets */ +- IPSET_CMD_LIST, /* 7: List sets */ +- IPSET_CMD_SAVE, /* 8: Save sets */ +- IPSET_CMD_ADD, /* 9: Add an element to a set */ +- IPSET_CMD_DEL, /* 10: Delete an element from a set */ +- IPSET_CMD_TEST, /* 11: Test an element in a set */ +- IPSET_CMD_HEADER, /* 12: Get set header data only */ +- IPSET_CMD_TYPE, /* 13: Get set type */ +- IPSET_MSG_MAX, /* Netlink message commands */ +- +- /* Commands in userspace: */ +- IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */ +- IPSET_CMD_HELP, /* 15: Get help */ +- IPSET_CMD_VERSION, /* 16: Get program version */ +- IPSET_CMD_QUIT, /* 17: Quit from interactive mode */ +- +- IPSET_CMD_MAX, +- +- IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */ +-}; +- +-/* Attributes at command level */ +-enum { +- IPSET_ATTR_UNSPEC, +- IPSET_ATTR_PROTOCOL, /* 1: Protocol version */ +- IPSET_ATTR_SETNAME, /* 2: Name of the set */ +- IPSET_ATTR_TYPENAME, /* 3: Typename */ +- IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */ +- IPSET_ATTR_REVISION, /* 4: Settype revision */ +- IPSET_ATTR_FAMILY, /* 5: Settype family */ +- IPSET_ATTR_FLAGS, /* 6: Flags at command level */ +- IPSET_ATTR_DATA, /* 7: Nested attributes */ +- IPSET_ATTR_ADT, /* 8: Multiple data containers */ +- IPSET_ATTR_LINENO, /* 9: Restore lineno */ +- IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */ +- IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */ +- __IPSET_ATTR_CMD_MAX, +-}; +-#define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1) +- +-/* CADT specific attributes */ +-enum { +- IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1, +- IPSET_ATTR_IP_FROM = IPSET_ATTR_IP, +- IPSET_ATTR_IP_TO, /* 2 */ +- IPSET_ATTR_CIDR, /* 3 */ +- IPSET_ATTR_PORT, /* 4 */ +- IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT, +- IPSET_ATTR_PORT_TO, /* 5 */ +- IPSET_ATTR_TIMEOUT, /* 6 */ +- IPSET_ATTR_PROTO, /* 7 */ +- IPSET_ATTR_CADT_FLAGS, /* 8 */ +- IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO, /* 9 */ +- IPSET_ATTR_MARK, /* 10 */ +- IPSET_ATTR_MARKMASK, /* 11 */ +- /* Reserve empty slots */ +- IPSET_ATTR_CADT_MAX = 16, +- /* Create-only specific attributes */ +- IPSET_ATTR_GC, +- IPSET_ATTR_HASHSIZE, +- IPSET_ATTR_MAXELEM, +- IPSET_ATTR_NETMASK, +- IPSET_ATTR_PROBES, +- IPSET_ATTR_RESIZE, +- IPSET_ATTR_SIZE, +- /* Kernel-only */ +- IPSET_ATTR_ELEMENTS, +- IPSET_ATTR_REFERENCES, +- IPSET_ATTR_MEMSIZE, +- +- __IPSET_ATTR_CREATE_MAX, +-}; +-#define IPSET_ATTR_CREATE_MAX (__IPSET_ATTR_CREATE_MAX - 1) +- +-/* ADT specific attributes */ +-enum { +- IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1, +- IPSET_ATTR_NAME, +- IPSET_ATTR_NAMEREF, +- IPSET_ATTR_IP2, +- IPSET_ATTR_CIDR2, +- IPSET_ATTR_IP2_TO, +- IPSET_ATTR_IFACE, +- IPSET_ATTR_BYTES, +- IPSET_ATTR_PACKETS, +- IPSET_ATTR_COMMENT, +- IPSET_ATTR_SKBMARK, +- IPSET_ATTR_SKBPRIO, +- IPSET_ATTR_SKBQUEUE, +- IPSET_ATTR_PAD, +- __IPSET_ATTR_ADT_MAX, +-}; +-#define IPSET_ATTR_ADT_MAX (__IPSET_ATTR_ADT_MAX - 1) +- +-/* IP specific attributes */ +-enum { +- IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1, +- IPSET_ATTR_IPADDR_IPV6, +- __IPSET_ATTR_IPADDR_MAX, +-}; +-#define IPSET_ATTR_IPADDR_MAX (__IPSET_ATTR_IPADDR_MAX - 1) +- +-/* Error codes */ +-enum ipset_errno { +- IPSET_ERR_PRIVATE = 4096, +- IPSET_ERR_PROTOCOL, +- IPSET_ERR_FIND_TYPE, +- IPSET_ERR_MAX_SETS, +- IPSET_ERR_BUSY, +- IPSET_ERR_EXIST_SETNAME2, +- IPSET_ERR_TYPE_MISMATCH, +- IPSET_ERR_EXIST, +- IPSET_ERR_INVALID_CIDR, +- IPSET_ERR_INVALID_NETMASK, +- IPSET_ERR_INVALID_FAMILY, +- IPSET_ERR_TIMEOUT, +- IPSET_ERR_REFERENCED, +- IPSET_ERR_IPADDR_IPV4, +- IPSET_ERR_IPADDR_IPV6, +- IPSET_ERR_COUNTER, +- IPSET_ERR_COMMENT, +- IPSET_ERR_INVALID_MARKMASK, +- IPSET_ERR_SKBINFO, +- +- /* Type specific error codes */ +- IPSET_ERR_TYPE_SPECIFIC = 4352, +-}; +- +-/* Flags at command level or match/target flags, lower half of cmdattrs*/ +-enum ipset_cmd_flags { +- IPSET_FLAG_BIT_EXIST = 0, +- IPSET_FLAG_EXIST = (1 << IPSET_FLAG_BIT_EXIST), +- IPSET_FLAG_BIT_LIST_SETNAME = 1, +- IPSET_FLAG_LIST_SETNAME = (1 << IPSET_FLAG_BIT_LIST_SETNAME), +- IPSET_FLAG_BIT_LIST_HEADER = 2, +- IPSET_FLAG_LIST_HEADER = (1 << IPSET_FLAG_BIT_LIST_HEADER), +- IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3, +- IPSET_FLAG_SKIP_COUNTER_UPDATE = +- (1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE), +- IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4, +- IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE = +- (1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE), +- IPSET_FLAG_BIT_MATCH_COUNTERS = 5, +- IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS), +- IPSET_FLAG_BIT_RETURN_NOMATCH = 7, +- IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH), +- IPSET_FLAG_BIT_MAP_SKBMARK = 8, +- IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK), +- IPSET_FLAG_BIT_MAP_SKBPRIO = 9, +- IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO), +- IPSET_FLAG_BIT_MAP_SKBQUEUE = 10, +- IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE), +- IPSET_FLAG_CMD_MAX = 15, +-}; +- +-/* Flags at CADT attribute level, upper half of cmdattrs */ +-enum ipset_cadt_flags { +- IPSET_FLAG_BIT_BEFORE = 0, +- IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE), +- IPSET_FLAG_BIT_PHYSDEV = 1, +- IPSET_FLAG_PHYSDEV = (1 << IPSET_FLAG_BIT_PHYSDEV), +- IPSET_FLAG_BIT_NOMATCH = 2, +- IPSET_FLAG_NOMATCH = (1 << IPSET_FLAG_BIT_NOMATCH), +- IPSET_FLAG_BIT_WITH_COUNTERS = 3, +- IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS), +- IPSET_FLAG_BIT_WITH_COMMENT = 4, +- IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT), +- IPSET_FLAG_BIT_WITH_FORCEADD = 5, +- IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD), +- IPSET_FLAG_BIT_WITH_SKBINFO = 6, +- IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO), +- IPSET_FLAG_CADT_MAX = 15, +-}; +- +-/* The flag bits which correspond to the non-extension create flags */ +-enum ipset_create_flags { +- IPSET_CREATE_FLAG_BIT_FORCEADD = 0, +- IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD), +- IPSET_CREATE_FLAG_BIT_MAX = 7, +-}; +- +-/* Commands with settype-specific attributes */ +-enum ipset_adt { +- IPSET_ADD, +- IPSET_DEL, +- IPSET_TEST, +- IPSET_ADT_MAX, +- IPSET_CREATE = IPSET_ADT_MAX, +- IPSET_CADT_MAX, +-}; +- +-/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t +- * and IPSET_INVALID_ID if you want to increase the max number of sets. +- */ +-typedef __u16 ip_set_id_t; +- +-#define IPSET_INVALID_ID 65535 +- +-enum ip_set_dim { +- IPSET_DIM_ZERO = 0, +- IPSET_DIM_ONE, +- IPSET_DIM_TWO, +- IPSET_DIM_THREE, +- /* Max dimension in elements. +- * If changed, new revision of iptables match/target is required. +- */ +- IPSET_DIM_MAX = 6, +- /* Backward compatibility: set match revision 2 */ +- IPSET_BIT_RETURN_NOMATCH = 7, +-}; +- +-/* Option flags for kernel operations */ +-enum ip_set_kopt { +- IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO), +- IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE), +- IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO), +- IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE), +- IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH), +-}; +- +-enum { +- IPSET_COUNTER_NONE = 0, +- IPSET_COUNTER_EQ, +- IPSET_COUNTER_NE, +- IPSET_COUNTER_LT, +- IPSET_COUNTER_GT, +-}; +- +-/* Backward compatibility for set match v3 */ +-struct ip_set_counter_match0 { +- __u8 op; +- __u64 value; +-}; +- +-struct ip_set_counter_match { +- __aligned_u64 value; +- __u8 op; +-}; +- +-/* Interface to iptables/ip6tables */ +- +-#define SO_IP_SET 83 +- +-union ip_set_name_index { +- char name[IPSET_MAXNAMELEN]; +- ip_set_id_t index; +-}; +- +-#define IP_SET_OP_GET_BYNAME 0x00000006 /* Get set index by name */ +-struct ip_set_req_get_set { +- unsigned int op; +- unsigned int version; +- union ip_set_name_index set; +-}; +- +-#define IP_SET_OP_GET_BYINDEX 0x00000007 /* Get set name by index */ +-/* Uses ip_set_req_get_set */ +- +-#define IP_SET_OP_GET_FNAME 0x00000008 /* Get set index and family */ +-struct ip_set_req_get_set_family { +- unsigned int op; +- unsigned int version; +- unsigned int family; +- union ip_set_name_index set; +-}; +- +-#define IP_SET_OP_VERSION 0x00000100 /* Ask kernel version */ +-struct ip_set_req_version { +- unsigned int op; +- unsigned int version; +-}; +- +-#endif /* _IP_SET_H */ +diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h +deleted file mode 100644 +index 4120970..0000000 +--- a/include/linux/netfilter/x_tables.h ++++ /dev/null +@@ -1,185 +0,0 @@ +-#ifndef _X_TABLES_H +-#define _X_TABLES_H +-#include +-#include +- +-#define XT_FUNCTION_MAXNAMELEN 30 +-#define XT_EXTENSION_MAXNAMELEN 29 +-#define XT_TABLE_MAXNAMELEN 32 +- +-struct xt_entry_match { +- union { +- struct { +- __u16 match_size; +- +- /* Used by userspace */ +- char name[XT_EXTENSION_MAXNAMELEN]; +- __u8 revision; +- } user; +- struct { +- __u16 match_size; +- +- /* Used inside the kernel */ +- struct xt_match *match; +- } kernel; +- +- /* Total length */ +- __u16 match_size; +- } u; +- +- unsigned char data[0]; +-}; +- +-struct xt_entry_target { +- union { +- struct { +- __u16 target_size; +- +- /* Used by userspace */ +- char name[XT_EXTENSION_MAXNAMELEN]; +- __u8 revision; +- } user; +- struct { +- __u16 target_size; +- +- /* Used inside the kernel */ +- struct xt_target *target; +- } kernel; +- +- /* Total length */ +- __u16 target_size; +- } u; +- +- unsigned char data[0]; +-}; +- +-#define XT_TARGET_INIT(__name, __size) \ +-{ \ +- .target.u.user = { \ +- .target_size = XT_ALIGN(__size), \ +- .name = __name, \ +- }, \ +-} +- +-struct xt_standard_target { +- struct xt_entry_target target; +- int verdict; +-}; +- +-struct xt_error_target { +- struct xt_entry_target target; +- char errorname[XT_FUNCTION_MAXNAMELEN]; +-}; +- +-/* The argument to IPT_SO_GET_REVISION_*. Returns highest revision +- * kernel supports, if >= revision. */ +-struct xt_get_revision { +- char name[XT_EXTENSION_MAXNAMELEN]; +- __u8 revision; +-}; +- +-/* CONTINUE verdict for targets */ +-#define XT_CONTINUE 0xFFFFFFFF +- +-/* For standard target */ +-#define XT_RETURN (-NF_REPEAT - 1) +- +-/* this is a dummy structure to find out the alignment requirement for a struct +- * containing all the fundamental data types that are used in ipt_entry, +- * ip6t_entry and arpt_entry. This sucks, and it is a hack. It will be my +- * personal pleasure to remove it -HW +- */ +-struct _xt_align { +- __u8 u8; +- __u16 u16; +- __u32 u32; +- __u64 u64; +-}; +- +-#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align)) +- +-/* Standard return verdict, or do jump. */ +-#define XT_STANDARD_TARGET "" +-/* Error verdict. */ +-#define XT_ERROR_TARGET "ERROR" +- +-#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) +-#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) +- +-struct xt_counters { +- __u64 pcnt, bcnt; /* Packet and byte counters */ +-}; +- +-/* The argument to IPT_SO_ADD_COUNTERS. */ +-struct xt_counters_info { +- /* Which table. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- unsigned int num_counters; +- +- /* The counters (actually `number' of these). */ +- struct xt_counters counters[0]; +-}; +- +-#define XT_INV_PROTO 0x40 /* Invert the sense of PROTO. */ +- +-/* fn returns 0 to continue iteration */ +-#define XT_MATCH_ITERATE(type, e, fn, args...) \ +-({ \ +- unsigned int __i; \ +- int __ret = 0; \ +- struct xt_entry_match *__m; \ +- \ +- for (__i = sizeof(type); \ +- __i < (e)->target_offset; \ +- __i += __m->u.match_size) { \ +- __m = (void *)e + __i; \ +- \ +- __ret = fn(__m , ## args); \ +- if (__ret != 0) \ +- break; \ +- } \ +- __ret; \ +-}) +- +-/* fn returns 0 to continue iteration */ +-#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \ +-({ \ +- unsigned int __i, __n; \ +- int __ret = 0; \ +- type *__entry; \ +- \ +- for (__i = 0, __n = 0; __i < (size); \ +- __i += __entry->next_offset, __n++) { \ +- __entry = (void *)(entries) + __i; \ +- if (__n < n) \ +- continue; \ +- \ +- __ret = fn(__entry , ## args); \ +- if (__ret != 0) \ +- break; \ +- } \ +- __ret; \ +-}) +- +-/* fn returns 0 to continue iteration */ +-#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \ +- XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args) +- +- +-/* pos is normally a struct ipt_entry/ip6t_entry/etc. */ +-#define xt_entry_foreach(pos, ehead, esize) \ +- for ((pos) = (typeof(pos))(ehead); \ +- (pos) < (typeof(pos))((char *)(ehead) + (esize)); \ +- (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset)) +- +-/* can only be xt_entry_match, so no use of typeof here */ +-#define xt_ematch_foreach(pos, entry) \ +- for ((pos) = (struct xt_entry_match *)entry->elems; \ +- (pos) < (struct xt_entry_match *)((char *)(entry) + \ +- (entry)->target_offset); \ +- (pos) = (struct xt_entry_match *)((char *)(pos) + \ +- (pos)->u.match_size)) +- +- +-#endif /* _X_TABLES_H */ +diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h +deleted file mode 100644 +index d4e0234..0000000 +--- a/include/linux/netfilter/xt_set.h ++++ /dev/null +@@ -1,93 +0,0 @@ +-#ifndef _XT_SET_H +-#define _XT_SET_H +- +-#include +-#include +- +-/* Revision 0 interface: backward compatible with netfilter/iptables */ +- +-/* +- * Option flags for kernel operations (xt_set_info_v0) +- */ +-#define IPSET_SRC 0x01 /* Source match/add */ +-#define IPSET_DST 0x02 /* Destination match/add */ +-#define IPSET_MATCH_INV 0x04 /* Inverse matching */ +- +-struct xt_set_info_v0 { +- ip_set_id_t index; +- union { +- __u32 flags[IPSET_DIM_MAX + 1]; +- struct { +- __u32 __flags[IPSET_DIM_MAX]; +- __u8 dim; +- __u8 flags; +- } compat; +- } u; +-}; +- +-/* match and target infos */ +-struct xt_set_info_match_v0 { +- struct xt_set_info_v0 match_set; +-}; +- +-struct xt_set_info_target_v0 { +- struct xt_set_info_v0 add_set; +- struct xt_set_info_v0 del_set; +-}; +- +-/* Revision 1 match and target */ +- +-struct xt_set_info { +- ip_set_id_t index; +- __u8 dim; +- __u8 flags; +-}; +- +-/* match and target infos */ +-struct xt_set_info_match_v1 { +- struct xt_set_info match_set; +-}; +- +-struct xt_set_info_target_v1 { +- struct xt_set_info add_set; +- struct xt_set_info del_set; +-}; +- +-/* Revision 2 target */ +- +-struct xt_set_info_target_v2 { +- struct xt_set_info add_set; +- struct xt_set_info del_set; +- __u32 flags; +- __u32 timeout; +-}; +- +-/* Revision 3 match */ +- +-struct xt_set_info_match_v3 { +- struct xt_set_info match_set; +- struct ip_set_counter_match0 packets; +- struct ip_set_counter_match0 bytes; +- __u32 flags; +-}; +- +-/* Revision 3 target */ +- +-struct xt_set_info_target_v3 { +- struct xt_set_info add_set; +- struct xt_set_info del_set; +- struct xt_set_info map_set; +- __u32 flags; +- __u32 timeout; +-}; +- +-/* Revision 4 match */ +- +-struct xt_set_info_match_v4 { +- struct xt_set_info match_set; +- struct ip_set_counter_match packets; +- struct ip_set_counter_match bytes; +- __u32 flags; +-}; +- +-#endif /*_XT_SET_H*/ +diff --git a/include/linux/netfilter/xt_tcpudp.h b/include/linux/netfilter/xt_tcpudp.h +deleted file mode 100644 +index 38aa7b3..0000000 +--- a/include/linux/netfilter/xt_tcpudp.h ++++ /dev/null +@@ -1,36 +0,0 @@ +-#ifndef _XT_TCPUDP_H +-#define _XT_TCPUDP_H +- +-#include +- +-/* TCP matching stuff */ +-struct xt_tcp { +- __u16 spts[2]; /* Source port range. */ +- __u16 dpts[2]; /* Destination port range. */ +- __u8 option; /* TCP Option iff non-zero*/ +- __u8 flg_mask; /* TCP flags mask byte */ +- __u8 flg_cmp; /* TCP flags compare byte */ +- __u8 invflags; /* Inverse flags */ +-}; +- +-/* Values for "inv" field in struct ipt_tcp. */ +-#define XT_TCP_INV_SRCPT 0x01 /* Invert the sense of source ports. */ +-#define XT_TCP_INV_DSTPT 0x02 /* Invert the sense of dest ports. */ +-#define XT_TCP_INV_FLAGS 0x04 /* Invert the sense of TCP flags. */ +-#define XT_TCP_INV_OPTION 0x08 /* Invert the sense of option test. */ +-#define XT_TCP_INV_MASK 0x0F /* All possible flags. */ +- +-/* UDP matching stuff */ +-struct xt_udp { +- __u16 spts[2]; /* Source port range. */ +- __u16 dpts[2]; /* Destination port range. */ +- __u8 invflags; /* Inverse flags */ +-}; +- +-/* Values for "invflags" field in struct ipt_udp. */ +-#define XT_UDP_INV_SRCPT 0x01 /* Invert the sense of source ports. */ +-#define XT_UDP_INV_DSTPT 0x02 /* Invert the sense of dest ports. */ +-#define XT_UDP_INV_MASK 0x03 /* All possible flags. */ +- +- +-#endif +diff --git a/include/linux/netfilter_ipv4.h b/include/linux/netfilter_ipv4.h +deleted file mode 100644 +index a5f4dc7..0000000 +--- a/include/linux/netfilter_ipv4.h ++++ /dev/null +@@ -1,79 +0,0 @@ +-/* IPv4-specific defines for netfilter. +- * (C)1998 Rusty Russell -- This code is GPL. +- */ +-#ifndef __LINUX_IP_NETFILTER_H +-#define __LINUX_IP_NETFILTER_H +- +- +-#include +- +-/* only for userspace compatibility */ +- +-#include /* for INT_MIN, INT_MAX */ +- +-/* IP Cache bits. */ +-/* Src IP address. */ +-#define NFC_IP_SRC 0x0001 +-/* Dest IP address. */ +-#define NFC_IP_DST 0x0002 +-/* Input device. */ +-#define NFC_IP_IF_IN 0x0004 +-/* Output device. */ +-#define NFC_IP_IF_OUT 0x0008 +-/* TOS. */ +-#define NFC_IP_TOS 0x0010 +-/* Protocol. */ +-#define NFC_IP_PROTO 0x0020 +-/* IP options. */ +-#define NFC_IP_OPTIONS 0x0040 +-/* Frag & flags. */ +-#define NFC_IP_FRAG 0x0080 +- +-/* Per-protocol information: only matters if proto match. */ +-/* TCP flags. */ +-#define NFC_IP_TCPFLAGS 0x0100 +-/* Source port. */ +-#define NFC_IP_SRC_PT 0x0200 +-/* Dest port. */ +-#define NFC_IP_DST_PT 0x0400 +-/* Something else about the proto */ +-#define NFC_IP_PROTO_UNKNOWN 0x2000 +- +-/* IP Hooks */ +-/* After promisc drops, checksum checks. */ +-#define NF_IP_PRE_ROUTING 0 +-/* If the packet is destined for this box. */ +-#define NF_IP_LOCAL_IN 1 +-/* If the packet is destined for another interface. */ +-#define NF_IP_FORWARD 2 +-/* Packets coming from a local process. */ +-#define NF_IP_LOCAL_OUT 3 +-/* Packets about to hit the wire. */ +-#define NF_IP_POST_ROUTING 4 +-#define NF_IP_NUMHOOKS 5 +- +-enum nf_ip_hook_priorities { +- NF_IP_PRI_FIRST = INT_MIN, +- NF_IP_PRI_CONNTRACK_DEFRAG = -400, +- NF_IP_PRI_RAW = -300, +- NF_IP_PRI_SELINUX_FIRST = -225, +- NF_IP_PRI_CONNTRACK = -200, +- NF_IP_PRI_MANGLE = -150, +- NF_IP_PRI_NAT_DST = -100, +- NF_IP_PRI_FILTER = 0, +- NF_IP_PRI_SECURITY = 50, +- NF_IP_PRI_NAT_SRC = 100, +- NF_IP_PRI_SELINUX_LAST = 225, +- NF_IP_PRI_CONNTRACK_HELPER = 300, +- NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX, +- NF_IP_PRI_LAST = INT_MAX, +-}; +- +-/* Arguments for setsockopt SOL_IP: */ +-/* 2.0 firewalling went from 64 through 71 (and +256, +512, etc). */ +-/* 2.2 firewalling (+ masq) went from 64 through 76 */ +-/* 2.4 firewalling went 64 through 67. */ +-#define SO_ORIGINAL_DST 80 +- +- +-#endif /* __LINUX_IP_NETFILTER_H */ +diff --git a/include/linux/netfilter_ipv4/ip_tables.h b/include/linux/netfilter_ipv4/ip_tables.h +deleted file mode 100644 +index 456fb86..0000000 +--- a/include/linux/netfilter_ipv4/ip_tables.h ++++ /dev/null +@@ -1,228 +0,0 @@ +-/* +- * 25-Jul-1998 Major changes to allow for ip chain table +- * +- * 3-Jan-2000 Named tables to allow packet selection for different uses. +- */ +- +-/* +- * Format of an IP firewall descriptor +- * +- * src, dst, src_mask, dst_mask are always stored in network byte order. +- * flags are stored in host byte order (of course). +- * Port numbers are stored in HOST byte order. +- */ +- +-#ifndef _IPTABLES_H +-#define _IPTABLES_H +- +-#include +- +-#include +-#include +- +-#include +- +-#define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN +-#define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN +-#define ipt_match xt_match +-#define ipt_target xt_target +-#define ipt_table xt_table +-#define ipt_get_revision xt_get_revision +-#define ipt_entry_match xt_entry_match +-#define ipt_entry_target xt_entry_target +-#define ipt_standard_target xt_standard_target +-#define ipt_error_target xt_error_target +-#define ipt_counters xt_counters +-#define IPT_CONTINUE XT_CONTINUE +-#define IPT_RETURN XT_RETURN +- +-/* This group is older than old (iptables < v1.4.0-rc1~89) */ +-#include +-#define ipt_udp xt_udp +-#define ipt_tcp xt_tcp +-#define IPT_TCP_INV_SRCPT XT_TCP_INV_SRCPT +-#define IPT_TCP_INV_DSTPT XT_TCP_INV_DSTPT +-#define IPT_TCP_INV_FLAGS XT_TCP_INV_FLAGS +-#define IPT_TCP_INV_OPTION XT_TCP_INV_OPTION +-#define IPT_TCP_INV_MASK XT_TCP_INV_MASK +-#define IPT_UDP_INV_SRCPT XT_UDP_INV_SRCPT +-#define IPT_UDP_INV_DSTPT XT_UDP_INV_DSTPT +-#define IPT_UDP_INV_MASK XT_UDP_INV_MASK +- +-/* The argument to IPT_SO_ADD_COUNTERS. */ +-#define ipt_counters_info xt_counters_info +-/* Standard return verdict, or do jump. */ +-#define IPT_STANDARD_TARGET XT_STANDARD_TARGET +-/* Error verdict. */ +-#define IPT_ERROR_TARGET XT_ERROR_TARGET +- +-/* fn returns 0 to continue iteration */ +-#define IPT_MATCH_ITERATE(e, fn, args...) \ +- XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) +- +-/* fn returns 0 to continue iteration */ +-#define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ +- XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) +- +-/* Yes, Virginia, you have to zero the padding. */ +-struct ipt_ip { +- /* Source and destination IP addr */ +- struct in_addr src, dst; +- /* Mask for src and dest IP addr */ +- struct in_addr smsk, dmsk; +- char iniface[IFNAMSIZ], outiface[IFNAMSIZ]; +- unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ]; +- +- /* Protocol, 0 = ANY */ +- __u16 proto; +- +- /* Flags word */ +- __u8 flags; +- /* Inverse flags */ +- __u8 invflags; +-}; +- +-/* Values for "flag" field in struct ipt_ip (general ip structure). */ +-#define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ +-#define IPT_F_GOTO 0x02 /* Set if jump is a goto */ +-#define IPT_F_MASK 0x03 /* All possible flag bits mask. */ +- +-/* Values for "inv" field in struct ipt_ip. */ +-#define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ +-#define IPT_INV_VIA_OUT 0x02 /* Invert the sense of OUT IFACE */ +-#define IPT_INV_TOS 0x04 /* Invert the sense of TOS. */ +-#define IPT_INV_SRCIP 0x08 /* Invert the sense of SRC IP. */ +-#define IPT_INV_DSTIP 0x10 /* Invert the sense of DST OP. */ +-#define IPT_INV_FRAG 0x20 /* Invert the sense of FRAG. */ +-#define IPT_INV_PROTO XT_INV_PROTO +-#define IPT_INV_MASK 0x7F /* All possible flag bits mask. */ +- +-/* This structure defines each of the firewall rules. Consists of 3 +- parts which are 1) general IP header stuff 2) match specific +- stuff 3) the target to perform if the rule matches */ +-struct ipt_entry { +- struct ipt_ip ip; +- +- /* Mark with fields that we care about. */ +- unsigned int nfcache; +- +- /* Size of ipt_entry + matches */ +- __u16 target_offset; +- /* Size of ipt_entry + matches + target */ +- __u16 next_offset; +- +- /* Back pointer */ +- unsigned int comefrom; +- +- /* Packet and byte counters. */ +- struct xt_counters counters; +- +- /* The matches (if any), then the target. */ +- unsigned char elems[0]; +-}; +- +-/* +- * New IP firewall options for [gs]etsockopt at the RAW IP level. +- * Unlike BSD Linux inherits IP options so you don't have to use a raw +- * socket for this. Instead we check rights in the calls. +- * +- * ATTENTION: check linux/in.h before adding new number here. +- */ +-#define IPT_BASE_CTL 64 +- +-#define IPT_SO_SET_REPLACE (IPT_BASE_CTL) +-#define IPT_SO_SET_ADD_COUNTERS (IPT_BASE_CTL + 1) +-#define IPT_SO_SET_MAX IPT_SO_SET_ADD_COUNTERS +- +-#define IPT_SO_GET_INFO (IPT_BASE_CTL) +-#define IPT_SO_GET_ENTRIES (IPT_BASE_CTL + 1) +-#define IPT_SO_GET_REVISION_MATCH (IPT_BASE_CTL + 2) +-#define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) +-#define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET +- +-/* ICMP matching stuff */ +-struct ipt_icmp { +- __u8 type; /* type to match */ +- __u8 code[2]; /* range of code */ +- __u8 invflags; /* Inverse flags */ +-}; +- +-/* Values for "inv" field for struct ipt_icmp. */ +-#define IPT_ICMP_INV 0x01 /* Invert the sense of type/code test */ +- +-/* The argument to IPT_SO_GET_INFO */ +-struct ipt_getinfo { +- /* Which table: caller fills this in. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- /* Kernel fills these in. */ +- /* Which hook entry points are valid: bitmask */ +- unsigned int valid_hooks; +- +- /* Hook entry points: one per netfilter hook. */ +- unsigned int hook_entry[NF_INET_NUMHOOKS]; +- +- /* Underflow points. */ +- unsigned int underflow[NF_INET_NUMHOOKS]; +- +- /* Number of entries */ +- unsigned int num_entries; +- +- /* Size of entries. */ +- unsigned int size; +-}; +- +-/* The argument to IPT_SO_SET_REPLACE. */ +-struct ipt_replace { +- /* Which table. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- /* Which hook entry points are valid: bitmask. You can't +- change this. */ +- unsigned int valid_hooks; +- +- /* Number of entries */ +- unsigned int num_entries; +- +- /* Total size of new entries */ +- unsigned int size; +- +- /* Hook entry points. */ +- unsigned int hook_entry[NF_INET_NUMHOOKS]; +- +- /* Underflow points. */ +- unsigned int underflow[NF_INET_NUMHOOKS]; +- +- /* Information about old entries: */ +- /* Number of counters (must be equal to current number of entries). */ +- unsigned int num_counters; +- /* The old entries' counters. */ +- struct xt_counters *counters; +- +- /* The entries (hang off end: not really an array). */ +- struct ipt_entry entries[0]; +-}; +- +-/* The argument to IPT_SO_GET_ENTRIES. */ +-struct ipt_get_entries { +- /* Which table: user fills this in. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- /* User fills this in: total entry size. */ +- unsigned int size; +- +- /* The entries. */ +- struct ipt_entry entrytable[0]; +-}; +- +-/* Helper functions */ +-static __inline__ struct xt_entry_target * +-ipt_get_target(struct ipt_entry *e) +-{ +- return (void *)e + e->target_offset; +-} +- +-/* +- * Main firewall chains definitions and global var's definitions. +- */ +-#endif /* _IPTABLES_H */ +diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h +deleted file mode 100644 +index 8483d1d..0000000 +--- a/include/linux/netfilter_ipv6.h ++++ /dev/null +@@ -1,77 +0,0 @@ +-/* IPv6-specific defines for netfilter. +- * (C)1998 Rusty Russell -- This code is GPL. +- * (C)1999 David Jeffery +- * this header was blatantly ripped from netfilter_ipv4.h +- * it's amazing what adding a bunch of 6s can do =8^) +- */ +-#ifndef __LINUX_IP6_NETFILTER_H +-#define __LINUX_IP6_NETFILTER_H +- +- +-#include +- +-/* only for userspace compatibility */ +- +-#include /* for INT_MIN, INT_MAX */ +- +-/* IP Cache bits. */ +-/* Src IP address. */ +-#define NFC_IP6_SRC 0x0001 +-/* Dest IP address. */ +-#define NFC_IP6_DST 0x0002 +-/* Input device. */ +-#define NFC_IP6_IF_IN 0x0004 +-/* Output device. */ +-#define NFC_IP6_IF_OUT 0x0008 +-/* TOS. */ +-#define NFC_IP6_TOS 0x0010 +-/* Protocol. */ +-#define NFC_IP6_PROTO 0x0020 +-/* IP options. */ +-#define NFC_IP6_OPTIONS 0x0040 +-/* Frag & flags. */ +-#define NFC_IP6_FRAG 0x0080 +- +- +-/* Per-protocol information: only matters if proto match. */ +-/* TCP flags. */ +-#define NFC_IP6_TCPFLAGS 0x0100 +-/* Source port. */ +-#define NFC_IP6_SRC_PT 0x0200 +-/* Dest port. */ +-#define NFC_IP6_DST_PT 0x0400 +-/* Something else about the proto */ +-#define NFC_IP6_PROTO_UNKNOWN 0x2000 +- +-/* IP6 Hooks */ +-/* After promisc drops, checksum checks. */ +-#define NF_IP6_PRE_ROUTING 0 +-/* If the packet is destined for this box. */ +-#define NF_IP6_LOCAL_IN 1 +-/* If the packet is destined for another interface. */ +-#define NF_IP6_FORWARD 2 +-/* Packets coming from a local process. */ +-#define NF_IP6_LOCAL_OUT 3 +-/* Packets about to hit the wire. */ +-#define NF_IP6_POST_ROUTING 4 +-#define NF_IP6_NUMHOOKS 5 +- +- +-enum nf_ip6_hook_priorities { +- NF_IP6_PRI_FIRST = INT_MIN, +- NF_IP6_PRI_CONNTRACK_DEFRAG = -400, +- NF_IP6_PRI_RAW = -300, +- NF_IP6_PRI_SELINUX_FIRST = -225, +- NF_IP6_PRI_CONNTRACK = -200, +- NF_IP6_PRI_MANGLE = -150, +- NF_IP6_PRI_NAT_DST = -100, +- NF_IP6_PRI_FILTER = 0, +- NF_IP6_PRI_SECURITY = 50, +- NF_IP6_PRI_NAT_SRC = 100, +- NF_IP6_PRI_SELINUX_LAST = 225, +- NF_IP6_PRI_CONNTRACK_HELPER = 300, +- NF_IP6_PRI_LAST = INT_MAX, +-}; +- +- +-#endif /* __LINUX_IP6_NETFILTER_H */ +diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h +deleted file mode 100644 +index fcc8cca..0000000 +--- a/include/linux/netfilter_ipv6/ip6_tables.h ++++ /dev/null +@@ -1,269 +0,0 @@ +-/* +- * 25-Jul-1998 Major changes to allow for ip chain table +- * +- * 3-Jan-2000 Named tables to allow packet selection for different uses. +- */ +- +-/* +- * Format of an IP6 firewall descriptor +- * +- * src, dst, src_mask, dst_mask are always stored in network byte order. +- * flags are stored in host byte order (of course). +- * Port numbers are stored in HOST byte order. +- */ +- +-#ifndef _IP6_TABLES_H +-#define _IP6_TABLES_H +- +-#include +- +-#include +-#include +- +-#include +- +-#define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN +-#define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN +-#define ip6t_match xt_match +-#define ip6t_target xt_target +-#define ip6t_table xt_table +-#define ip6t_get_revision xt_get_revision +-#define ip6t_entry_match xt_entry_match +-#define ip6t_entry_target xt_entry_target +-#define ip6t_standard_target xt_standard_target +-#define ip6t_error_target xt_error_target +-#define ip6t_counters xt_counters +-#define IP6T_CONTINUE XT_CONTINUE +-#define IP6T_RETURN XT_RETURN +- +-/* Pre-iptables-1.4.0 */ +-#include +-#define ip6t_tcp xt_tcp +-#define ip6t_udp xt_udp +-#define IP6T_TCP_INV_SRCPT XT_TCP_INV_SRCPT +-#define IP6T_TCP_INV_DSTPT XT_TCP_INV_DSTPT +-#define IP6T_TCP_INV_FLAGS XT_TCP_INV_FLAGS +-#define IP6T_TCP_INV_OPTION XT_TCP_INV_OPTION +-#define IP6T_TCP_INV_MASK XT_TCP_INV_MASK +-#define IP6T_UDP_INV_SRCPT XT_UDP_INV_SRCPT +-#define IP6T_UDP_INV_DSTPT XT_UDP_INV_DSTPT +-#define IP6T_UDP_INV_MASK XT_UDP_INV_MASK +- +-#define ip6t_counters_info xt_counters_info +-#define IP6T_STANDARD_TARGET XT_STANDARD_TARGET +-#define IP6T_ERROR_TARGET XT_ERROR_TARGET +-#define IP6T_MATCH_ITERATE(e, fn, args...) \ +- XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) +-#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ +- XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) +- +-/* Yes, Virginia, you have to zero the padding. */ +-struct ip6t_ip6 { +- /* Source and destination IP6 addr */ +- struct in6_addr src, dst; +- /* Mask for src and dest IP6 addr */ +- struct in6_addr smsk, dmsk; +- char iniface[IFNAMSIZ], outiface[IFNAMSIZ]; +- unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ]; +- +- /* Upper protocol number +- * - The allowed value is 0 (any) or protocol number of last parsable +- * header, which is 50 (ESP), 59 (No Next Header), 135 (MH), or +- * the non IPv6 extension headers. +- * - The protocol numbers of IPv6 extension headers except of ESP and +- * MH do not match any packets. +- * - You also need to set IP6T_FLAGS_PROTO to "flags" to check protocol. +- */ +- __u16 proto; +- /* TOS to match iff flags & IP6T_F_TOS */ +- __u8 tos; +- +- /* Flags word */ +- __u8 flags; +- /* Inverse flags */ +- __u8 invflags; +-}; +- +-/* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ +-#define IP6T_F_PROTO 0x01 /* Set if rule cares about upper +- protocols */ +-#define IP6T_F_TOS 0x02 /* Match the TOS. */ +-#define IP6T_F_GOTO 0x04 /* Set if jump is a goto */ +-#define IP6T_F_MASK 0x07 /* All possible flag bits mask. */ +- +-/* Values for "inv" field in struct ip6t_ip6. */ +-#define IP6T_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ +-#define IP6T_INV_VIA_OUT 0x02 /* Invert the sense of OUT IFACE */ +-#define IP6T_INV_TOS 0x04 /* Invert the sense of TOS. */ +-#define IP6T_INV_SRCIP 0x08 /* Invert the sense of SRC IP. */ +-#define IP6T_INV_DSTIP 0x10 /* Invert the sense of DST OP. */ +-#define IP6T_INV_FRAG 0x20 /* Invert the sense of FRAG. */ +-#define IP6T_INV_PROTO XT_INV_PROTO +-#define IP6T_INV_MASK 0x7F /* All possible flag bits mask. */ +- +-/* This structure defines each of the firewall rules. Consists of 3 +- parts which are 1) general IP header stuff 2) match specific +- stuff 3) the target to perform if the rule matches */ +-struct ip6t_entry { +- struct ip6t_ip6 ipv6; +- +- /* Mark with fields that we care about. */ +- unsigned int nfcache; +- +- /* Size of ipt_entry + matches */ +- __u16 target_offset; +- /* Size of ipt_entry + matches + target */ +- __u16 next_offset; +- +- /* Back pointer */ +- unsigned int comefrom; +- +- /* Packet and byte counters. */ +- struct xt_counters counters; +- +- /* The matches (if any), then the target. */ +- unsigned char elems[0]; +-}; +- +-/* Standard entry */ +-struct ip6t_standard { +- struct ip6t_entry entry; +- struct xt_standard_target target; +-}; +- +-struct ip6t_error { +- struct ip6t_entry entry; +- struct xt_error_target target; +-}; +- +-#define IP6T_ENTRY_INIT(__size) \ +-{ \ +- .target_offset = sizeof(struct ip6t_entry), \ +- .next_offset = (__size), \ +-} +- +-#define IP6T_STANDARD_INIT(__verdict) \ +-{ \ +- .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)), \ +- .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ +- sizeof(struct xt_standard_target)), \ +- .target.verdict = -(__verdict) - 1, \ +-} +- +-#define IP6T_ERROR_INIT \ +-{ \ +- .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)), \ +- .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ +- sizeof(struct xt_error_target)), \ +- .target.errorname = "ERROR", \ +-} +- +-/* +- * New IP firewall options for [gs]etsockopt at the RAW IP level. +- * Unlike BSD Linux inherits IP options so you don't have to use +- * a raw socket for this. Instead we check rights in the calls. +- * +- * ATTENTION: check linux/in6.h before adding new number here. +- */ +-#define IP6T_BASE_CTL 64 +- +-#define IP6T_SO_SET_REPLACE (IP6T_BASE_CTL) +-#define IP6T_SO_SET_ADD_COUNTERS (IP6T_BASE_CTL + 1) +-#define IP6T_SO_SET_MAX IP6T_SO_SET_ADD_COUNTERS +- +-#define IP6T_SO_GET_INFO (IP6T_BASE_CTL) +-#define IP6T_SO_GET_ENTRIES (IP6T_BASE_CTL + 1) +-#define IP6T_SO_GET_REVISION_MATCH (IP6T_BASE_CTL + 4) +-#define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) +-#define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET +- +-/* obtain original address if REDIRECT'd connection */ +-#define IP6T_SO_ORIGINAL_DST 80 +- +-/* ICMP matching stuff */ +-struct ip6t_icmp { +- __u8 type; /* type to match */ +- __u8 code[2]; /* range of code */ +- __u8 invflags; /* Inverse flags */ +-}; +- +-/* Values for "inv" field for struct ipt_icmp. */ +-#define IP6T_ICMP_INV 0x01 /* Invert the sense of type/code test */ +- +-/* The argument to IP6T_SO_GET_INFO */ +-struct ip6t_getinfo { +- /* Which table: caller fills this in. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- /* Kernel fills these in. */ +- /* Which hook entry points are valid: bitmask */ +- unsigned int valid_hooks; +- +- /* Hook entry points: one per netfilter hook. */ +- unsigned int hook_entry[NF_INET_NUMHOOKS]; +- +- /* Underflow points. */ +- unsigned int underflow[NF_INET_NUMHOOKS]; +- +- /* Number of entries */ +- unsigned int num_entries; +- +- /* Size of entries. */ +- unsigned int size; +-}; +- +-/* The argument to IP6T_SO_SET_REPLACE. */ +-struct ip6t_replace { +- /* Which table. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- /* Which hook entry points are valid: bitmask. You can't +- change this. */ +- unsigned int valid_hooks; +- +- /* Number of entries */ +- unsigned int num_entries; +- +- /* Total size of new entries */ +- unsigned int size; +- +- /* Hook entry points. */ +- unsigned int hook_entry[NF_INET_NUMHOOKS]; +- +- /* Underflow points. */ +- unsigned int underflow[NF_INET_NUMHOOKS]; +- +- /* Information about old entries: */ +- /* Number of counters (must be equal to current number of entries). */ +- unsigned int num_counters; +- /* The old entries' counters. */ +- struct xt_counters *counters; +- +- /* The entries (hang off end: not really an array). */ +- struct ip6t_entry entries[0]; +-}; +- +-/* The argument to IP6T_SO_GET_ENTRIES. */ +-struct ip6t_get_entries { +- /* Which table: user fills this in. */ +- char name[XT_TABLE_MAXNAMELEN]; +- +- /* User fills this in: total entry size. */ +- unsigned int size; +- +- /* The entries. */ +- struct ip6t_entry entrytable[0]; +-}; +- +-/* Helper functions */ +-static __inline__ struct xt_entry_target * +-ip6t_get_target(struct ip6t_entry *e) +-{ +- return (void *)e + e->target_offset; +-} +- +-/* +- * Main firewall chains definitions and global var's definitions. +- */ +- +-#endif /* _IP6_TABLES_H */ +diff --git a/include/linux/netlink.h b/include/linux/netlink.h +deleted file mode 100644 +index ec0690b..0000000 +--- a/include/linux/netlink.h ++++ /dev/null +@@ -1,246 +0,0 @@ +-#ifndef __LINUX_NETLINK_H +-#define __LINUX_NETLINK_H +- +-#include +-#include /* for __kernel_sa_family_t */ +-#include +- +-#define NETLINK_ROUTE 0 /* Routing/device hook */ +-#define NETLINK_UNUSED 1 /* Unused number */ +-#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ +-#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ +-#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ +-#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ +-#define NETLINK_XFRM 6 /* ipsec */ +-#define NETLINK_SELINUX 7 /* SELinux event notifications */ +-#define NETLINK_ISCSI 8 /* Open-iSCSI */ +-#define NETLINK_AUDIT 9 /* auditing */ +-#define NETLINK_FIB_LOOKUP 10 +-#define NETLINK_CONNECTOR 11 +-#define NETLINK_NETFILTER 12 /* netfilter subsystem */ +-#define NETLINK_IP6_FW 13 +-#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ +-#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ +-#define NETLINK_GENERIC 16 +-/* leave room for NETLINK_DM (DM Events) */ +-#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ +-#define NETLINK_ECRYPTFS 19 +-#define NETLINK_RDMA 20 +-#define NETLINK_CRYPTO 21 /* Crypto layer */ +-#define NETLINK_SMC 22 /* SMC monitoring */ +- +-#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG +- +-#define MAX_LINKS 32 +- +-struct sockaddr_nl { +- __kernel_sa_family_t nl_family; /* AF_NETLINK */ +- unsigned short nl_pad; /* zero */ +- __u32 nl_pid; /* port ID */ +- __u32 nl_groups; /* multicast groups mask */ +-}; +- +-struct nlmsghdr { +- __u32 nlmsg_len; /* Length of message including header */ +- __u16 nlmsg_type; /* Message content */ +- __u16 nlmsg_flags; /* Additional flags */ +- __u32 nlmsg_seq; /* Sequence number */ +- __u32 nlmsg_pid; /* Sending process port ID */ +-}; +- +-/* Flags values */ +- +-#define NLM_F_REQUEST 0x01 /* It is request message. */ +-#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ +-#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ +-#define NLM_F_ECHO 0x08 /* Echo this request */ +-#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ +-#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ +- +-/* Modifiers to GET request */ +-#define NLM_F_ROOT 0x100 /* specify tree root */ +-#define NLM_F_MATCH 0x200 /* return all matching */ +-#define NLM_F_ATOMIC 0x400 /* atomic GET */ +-#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) +- +-/* Modifiers to NEW request */ +-#define NLM_F_REPLACE 0x100 /* Override existing */ +-#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ +-#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ +-#define NLM_F_APPEND 0x800 /* Add to end of list */ +- +-/* Modifiers to DELETE request */ +-#define NLM_F_NONREC 0x100 /* Do not delete recursively */ +- +-/* Flags for ACK message */ +-#define NLM_F_CAPPED 0x100 /* request was capped */ +-#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ +- +-/* +- 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL +- 4.4BSD CHANGE NLM_F_REPLACE +- +- True CHANGE NLM_F_CREATE|NLM_F_REPLACE +- Append NLM_F_CREATE +- Check NLM_F_EXCL +- */ +- +-#define NLMSG_ALIGNTO 4U +-#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) +-#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) +-#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) +-#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) +-#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) +-#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ +- (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) +-#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ +- (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ +- (nlh)->nlmsg_len <= (len)) +-#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) +- +-#define NLMSG_NOOP 0x1 /* Nothing. */ +-#define NLMSG_ERROR 0x2 /* Error */ +-#define NLMSG_DONE 0x3 /* End of a dump */ +-#define NLMSG_OVERRUN 0x4 /* Data lost */ +- +-#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ +- +-struct nlmsgerr { +- int error; +- struct nlmsghdr msg; +- /* +- * followed by the message contents unless NETLINK_CAP_ACK was set +- * or the ACK indicates success (error == 0) +- * message length is aligned with NLMSG_ALIGN() +- */ +- /* +- * followed by TLVs defined in enum nlmsgerr_attrs +- * if NETLINK_EXT_ACK was set +- */ +-}; +- +-/** +- * enum nlmsgerr_attrs - nlmsgerr attributes +- * @NLMSGERR_ATTR_UNUSED: unused +- * @NLMSGERR_ATTR_MSG: error message string (string) +- * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original +- * message, counting from the beginning of the header (u32) +- * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to +- * be used - in the success case - to identify a created +- * object or operation or similar (binary) +- * @__NLMSGERR_ATTR_MAX: number of attributes +- * @NLMSGERR_ATTR_MAX: highest attribute number +- */ +-enum nlmsgerr_attrs { +- NLMSGERR_ATTR_UNUSED, +- NLMSGERR_ATTR_MSG, +- NLMSGERR_ATTR_OFFS, +- NLMSGERR_ATTR_COOKIE, +- +- __NLMSGERR_ATTR_MAX, +- NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 +-}; +- +-#define NETLINK_ADD_MEMBERSHIP 1 +-#define NETLINK_DROP_MEMBERSHIP 2 +-#define NETLINK_PKTINFO 3 +-#define NETLINK_BROADCAST_ERROR 4 +-#define NETLINK_NO_ENOBUFS 5 +-#define NETLINK_RX_RING 6 +-#define NETLINK_TX_RING 7 +-#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; +-}; +- +-struct nl_mmap_req { +- unsigned int nm_block_size; +- unsigned int nm_block_nr; +- unsigned int nm_frame_size; +- unsigned int nm_frame_nr; +-}; +- +-struct nl_mmap_hdr { +- unsigned int nm_status; +- unsigned int nm_len; +- __u32 nm_group; +- /* credentials */ +- __u32 nm_pid; +- __u32 nm_uid; +- __u32 nm_gid; +-}; +- +-enum nl_mmap_status { +- NL_MMAP_STATUS_UNUSED, +- NL_MMAP_STATUS_RESERVED, +- NL_MMAP_STATUS_VALID, +- NL_MMAP_STATUS_COPY, +- NL_MMAP_STATUS_SKIP, +-}; +- +-#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO +-#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) +-#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) +- +-#define NET_MAJOR 36 /* Major 36 is reserved for networking */ +- +-enum { +- NETLINK_UNCONNECTED = 0, +- NETLINK_CONNECTED, +-}; +- +-/* +- * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> +- * +---------------------+- - -+- - - - - - - - - -+- - -+ +- * | Header | Pad | Payload | Pad | +- * | (struct nlattr) | ing | | ing | +- * +---------------------+- - -+- - - - - - - - - -+- - -+ +- * <-------------- nlattr->nla_len --------------> +- */ +- +-struct nlattr { +- __u16 nla_len; +- __u16 nla_type; +-}; +- +-/* +- * nla_type (16 bits) +- * +---+---+-------------------------------+ +- * | N | O | Attribute Type | +- * +---+---+-------------------------------+ +- * N := Carries nested attributes +- * O := Payload stored in network byte order +- * +- * Note: The N and O flag are mutually exclusive. +- */ +-#define NLA_F_NESTED (1 << 15) +-#define NLA_F_NET_BYTEORDER (1 << 14) +-#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) +- +-#define NLA_ALIGNTO 4 +-#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) +-#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) +- +-/* Generic 32 bitflags attribute content sent to the kernel. +- * +- * The value is a bitmap that defines the values being set +- * The selector is a bitmask that defines which value is legit +- * +- * Examples: +- * value = 0x0, and selector = 0x1 +- * implies we are selecting bit 1 and we want to set its value to 0. +- * +- * value = 0x2, and selector = 0x2 +- * implies we are selecting bit 2 and we want to set its value to 1. +- * +- */ +-struct nla_bitfield32 { +- __u32 value; +- __u32 selector; +-}; +- +-#endif /* __LINUX_NETLINK_H */ +diff --git a/include/linux/netlink_diag.h b/include/linux/netlink_diag.h +deleted file mode 100644 +index c8c8c7d..0000000 +--- a/include/linux/netlink_diag.h ++++ /dev/null +@@ -1,64 +0,0 @@ +-#ifndef __NETLINK_DIAG_H__ +-#define __NETLINK_DIAG_H__ +- +-#include +- +-struct netlink_diag_req { +- __u8 sdiag_family; +- __u8 sdiag_protocol; +- __u16 pad; +- __u32 ndiag_ino; +- __u32 ndiag_show; +- __u32 ndiag_cookie[2]; +-}; +- +-struct netlink_diag_msg { +- __u8 ndiag_family; +- __u8 ndiag_type; +- __u8 ndiag_protocol; +- __u8 ndiag_state; +- +- __u32 ndiag_portid; +- __u32 ndiag_dst_portid; +- __u32 ndiag_dst_group; +- __u32 ndiag_ino; +- __u32 ndiag_cookie[2]; +-}; +- +-struct netlink_diag_ring { +- __u32 ndr_block_size; +- __u32 ndr_block_nr; +- __u32 ndr_frame_size; +- __u32 ndr_frame_nr; +-}; +- +-enum { +- /* NETLINK_DIAG_NONE, standard nl API requires this attribute! */ +- NETLINK_DIAG_MEMINFO, +- NETLINK_DIAG_GROUPS, +- NETLINK_DIAG_RX_RING, +- NETLINK_DIAG_TX_RING, +- NETLINK_DIAG_FLAGS, +- +- __NETLINK_DIAG_MAX, +-}; +- +-#define NETLINK_DIAG_MAX (__NETLINK_DIAG_MAX - 1) +- +-#define NDIAG_PROTO_ALL ((__u8) ~0) +- +-#define NDIAG_SHOW_MEMINFO 0x00000001 /* show memory info of a socket */ +-#define NDIAG_SHOW_GROUPS 0x00000002 /* show groups of a netlink socket */ +-/* deprecated since 4.6 */ +-#define NDIAG_SHOW_RING_CFG 0x00000004 /* show ring configuration */ +-#define NDIAG_SHOW_FLAGS 0x00000008 /* show flags of a netlink socket */ +- +-/* flags */ +-#define NDIAG_FLAG_CB_RUNNING 0x00000001 +-#define NDIAG_FLAG_PKTINFO 0x00000002 +-#define NDIAG_FLAG_BROADCAST_ERROR 0x00000004 +-#define NDIAG_FLAG_NO_ENOBUFS 0x00000008 +-#define NDIAG_FLAG_LISTEN_ALL_NSID 0x00000010 +-#define NDIAG_FLAG_CAP_ACK 0x00000020 +- +-#endif +diff --git a/include/linux/packet_diag.h b/include/linux/packet_diag.h +deleted file mode 100644 +index 0c5d5dd..0000000 +--- a/include/linux/packet_diag.h ++++ /dev/null +@@ -1,80 +0,0 @@ +-#ifndef __PACKET_DIAG_H__ +-#define __PACKET_DIAG_H__ +- +-#include +- +-struct packet_diag_req { +- __u8 sdiag_family; +- __u8 sdiag_protocol; +- __u16 pad; +- __u32 pdiag_ino; +- __u32 pdiag_show; +- __u32 pdiag_cookie[2]; +-}; +- +-#define PACKET_SHOW_INFO 0x00000001 /* Basic packet_sk information */ +-#define PACKET_SHOW_MCLIST 0x00000002 /* A set of packet_diag_mclist-s */ +-#define PACKET_SHOW_RING_CFG 0x00000004 /* Rings configuration parameters */ +-#define PACKET_SHOW_FANOUT 0x00000008 +-#define PACKET_SHOW_MEMINFO 0x00000010 +-#define PACKET_SHOW_FILTER 0x00000020 +- +-struct packet_diag_msg { +- __u8 pdiag_family; +- __u8 pdiag_type; +- __u16 pdiag_num; +- +- __u32 pdiag_ino; +- __u32 pdiag_cookie[2]; +-}; +- +-enum { +- /* PACKET_DIAG_NONE, standard nl API requires this attribute! */ +- PACKET_DIAG_INFO, +- PACKET_DIAG_MCLIST, +- PACKET_DIAG_RX_RING, +- PACKET_DIAG_TX_RING, +- PACKET_DIAG_FANOUT, +- PACKET_DIAG_UID, +- PACKET_DIAG_MEMINFO, +- PACKET_DIAG_FILTER, +- +- __PACKET_DIAG_MAX, +-}; +- +-#define PACKET_DIAG_MAX (__PACKET_DIAG_MAX - 1) +- +-struct packet_diag_info { +- __u32 pdi_index; +- __u32 pdi_version; +- __u32 pdi_reserve; +- __u32 pdi_copy_thresh; +- __u32 pdi_tstamp; +- __u32 pdi_flags; +- +-#define PDI_RUNNING 0x1 +-#define PDI_AUXDATA 0x2 +-#define PDI_ORIGDEV 0x4 +-#define PDI_VNETHDR 0x8 +-#define PDI_LOSS 0x10 +-}; +- +-struct packet_diag_mclist { +- __u32 pdmc_index; +- __u32 pdmc_count; +- __u16 pdmc_type; +- __u16 pdmc_alen; +- __u8 pdmc_addr[32]; /* MAX_ADDR_LEN */ +-}; +- +-struct packet_diag_ring { +- __u32 pdr_block_size; +- __u32 pdr_block_nr; +- __u32 pdr_frame_size; +- __u32 pdr_frame_nr; +- __u32 pdr_retire_tmo; +- __u32 pdr_sizeof_priv; +- __u32 pdr_features; +-}; +- +-#endif +diff --git a/include/linux/param.h b/include/linux/param.h +deleted file mode 100644 +index 092e92f..0000000 +--- a/include/linux/param.h ++++ /dev/null +@@ -1,6 +0,0 @@ +-#ifndef _LINUX_PARAM_H +-#define _LINUX_PARAM_H +- +-#include +- +-#endif +diff --git a/include/linux/pfkeyv2.h b/include/linux/pfkeyv2.h +deleted file mode 100644 +index ada7f01..0000000 +--- a/include/linux/pfkeyv2.h ++++ /dev/null +@@ -1,383 +0,0 @@ +-/* PF_KEY user interface, this is defined by rfc2367 so +- * do not make arbitrary modifications or else this header +- * file will not be compliant. +- */ +- +-#ifndef _LINUX_PFKEY2_H +-#define _LINUX_PFKEY2_H +- +-#include +- +-#define PF_KEY_V2 2 +-#define PFKEYV2_REVISION 199806L +- +-struct sadb_msg { +- __u8 sadb_msg_version; +- __u8 sadb_msg_type; +- __u8 sadb_msg_errno; +- __u8 sadb_msg_satype; +- __u16 sadb_msg_len; +- __u16 sadb_msg_reserved; +- __u32 sadb_msg_seq; +- __u32 sadb_msg_pid; +-} __attribute__((packed)); +-/* sizeof(struct sadb_msg) == 16 */ +- +-struct sadb_ext { +- __u16 sadb_ext_len; +- __u16 sadb_ext_type; +-} __attribute__((packed)); +-/* sizeof(struct sadb_ext) == 4 */ +- +-struct sadb_sa { +- __u16 sadb_sa_len; +- __u16 sadb_sa_exttype; +- __be32 sadb_sa_spi; +- __u8 sadb_sa_replay; +- __u8 sadb_sa_state; +- __u8 sadb_sa_auth; +- __u8 sadb_sa_encrypt; +- __u32 sadb_sa_flags; +-} __attribute__((packed)); +-/* sizeof(struct sadb_sa) == 16 */ +- +-struct sadb_lifetime { +- __u16 sadb_lifetime_len; +- __u16 sadb_lifetime_exttype; +- __u32 sadb_lifetime_allocations; +- __u64 sadb_lifetime_bytes; +- __u64 sadb_lifetime_addtime; +- __u64 sadb_lifetime_usetime; +-} __attribute__((packed)); +-/* sizeof(struct sadb_lifetime) == 32 */ +- +-struct sadb_address { +- __u16 sadb_address_len; +- __u16 sadb_address_exttype; +- __u8 sadb_address_proto; +- __u8 sadb_address_prefixlen; +- __u16 sadb_address_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_address) == 8 */ +- +-struct sadb_key { +- __u16 sadb_key_len; +- __u16 sadb_key_exttype; +- __u16 sadb_key_bits; +- __u16 sadb_key_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_key) == 8 */ +- +-struct sadb_ident { +- __u16 sadb_ident_len; +- __u16 sadb_ident_exttype; +- __u16 sadb_ident_type; +- __u16 sadb_ident_reserved; +- __u64 sadb_ident_id; +-} __attribute__((packed)); +-/* sizeof(struct sadb_ident) == 16 */ +- +-struct sadb_sens { +- __u16 sadb_sens_len; +- __u16 sadb_sens_exttype; +- __u32 sadb_sens_dpd; +- __u8 sadb_sens_sens_level; +- __u8 sadb_sens_sens_len; +- __u8 sadb_sens_integ_level; +- __u8 sadb_sens_integ_len; +- __u32 sadb_sens_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_sens) == 16 */ +- +-/* followed by: +- __u64 sadb_sens_bitmap[sens_len]; +- __u64 sadb_integ_bitmap[integ_len]; */ +- +-struct sadb_prop { +- __u16 sadb_prop_len; +- __u16 sadb_prop_exttype; +- __u8 sadb_prop_replay; +- __u8 sadb_prop_reserved[3]; +-} __attribute__((packed)); +-/* sizeof(struct sadb_prop) == 8 */ +- +-/* followed by: +- struct sadb_comb sadb_combs[(sadb_prop_len + +- sizeof(__u64) - sizeof(struct sadb_prop)) / +- sizeof(struct sadb_comb)]; */ +- +-struct sadb_comb { +- __u8 sadb_comb_auth; +- __u8 sadb_comb_encrypt; +- __u16 sadb_comb_flags; +- __u16 sadb_comb_auth_minbits; +- __u16 sadb_comb_auth_maxbits; +- __u16 sadb_comb_encrypt_minbits; +- __u16 sadb_comb_encrypt_maxbits; +- __u32 sadb_comb_reserved; +- __u32 sadb_comb_soft_allocations; +- __u32 sadb_comb_hard_allocations; +- __u64 sadb_comb_soft_bytes; +- __u64 sadb_comb_hard_bytes; +- __u64 sadb_comb_soft_addtime; +- __u64 sadb_comb_hard_addtime; +- __u64 sadb_comb_soft_usetime; +- __u64 sadb_comb_hard_usetime; +-} __attribute__((packed)); +-/* sizeof(struct sadb_comb) == 72 */ +- +-struct sadb_supported { +- __u16 sadb_supported_len; +- __u16 sadb_supported_exttype; +- __u32 sadb_supported_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_supported) == 8 */ +- +-/* followed by: +- struct sadb_alg sadb_algs[(sadb_supported_len + +- sizeof(__u64) - sizeof(struct sadb_supported)) / +- sizeof(struct sadb_alg)]; */ +- +-struct sadb_alg { +- __u8 sadb_alg_id; +- __u8 sadb_alg_ivlen; +- __u16 sadb_alg_minbits; +- __u16 sadb_alg_maxbits; +- __u16 sadb_alg_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_alg) == 8 */ +- +-struct sadb_spirange { +- __u16 sadb_spirange_len; +- __u16 sadb_spirange_exttype; +- __u32 sadb_spirange_min; +- __u32 sadb_spirange_max; +- __u32 sadb_spirange_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_spirange) == 16 */ +- +-struct sadb_x_kmprivate { +- __u16 sadb_x_kmprivate_len; +- __u16 sadb_x_kmprivate_exttype; +- __u32 sadb_x_kmprivate_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_kmprivate) == 8 */ +- +-struct sadb_x_sa2 { +- __u16 sadb_x_sa2_len; +- __u16 sadb_x_sa2_exttype; +- __u8 sadb_x_sa2_mode; +- __u8 sadb_x_sa2_reserved1; +- __u16 sadb_x_sa2_reserved2; +- __u32 sadb_x_sa2_sequence; +- __u32 sadb_x_sa2_reqid; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_sa2) == 16 */ +- +-struct sadb_x_policy { +- __u16 sadb_x_policy_len; +- __u16 sadb_x_policy_exttype; +- __u16 sadb_x_policy_type; +- __u8 sadb_x_policy_dir; +- __u8 sadb_x_policy_reserved; +- __u32 sadb_x_policy_id; +- __u32 sadb_x_policy_priority; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_policy) == 16 */ +- +-struct sadb_x_ipsecrequest { +- __u16 sadb_x_ipsecrequest_len; +- __u16 sadb_x_ipsecrequest_proto; +- __u8 sadb_x_ipsecrequest_mode; +- __u8 sadb_x_ipsecrequest_level; +- __u16 sadb_x_ipsecrequest_reserved1; +- __u32 sadb_x_ipsecrequest_reqid; +- __u32 sadb_x_ipsecrequest_reserved2; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_ipsecrequest) == 16 */ +- +-/* This defines the TYPE of Nat Traversal in use. Currently only one +- * type of NAT-T is supported, draft-ietf-ipsec-udp-encaps-06 +- */ +-struct sadb_x_nat_t_type { +- __u16 sadb_x_nat_t_type_len; +- __u16 sadb_x_nat_t_type_exttype; +- __u8 sadb_x_nat_t_type_type; +- __u8 sadb_x_nat_t_type_reserved[3]; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_nat_t_type) == 8 */ +- +-/* Pass a NAT Traversal port (Source or Dest port) */ +-struct sadb_x_nat_t_port { +- __u16 sadb_x_nat_t_port_len; +- __u16 sadb_x_nat_t_port_exttype; +- __be16 sadb_x_nat_t_port_port; +- __u16 sadb_x_nat_t_port_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_nat_t_port) == 8 */ +- +-/* Generic LSM security context */ +-struct sadb_x_sec_ctx { +- __u16 sadb_x_sec_len; +- __u16 sadb_x_sec_exttype; +- __u8 sadb_x_ctx_alg; /* LSMs: e.g., selinux == 1 */ +- __u8 sadb_x_ctx_doi; +- __u16 sadb_x_ctx_len; +-} __attribute__((packed)); +-/* sizeof(struct sadb_sec_ctx) = 8 */ +- +-/* Used by MIGRATE to pass addresses IKE will use to perform +- * negotiation with the peer */ +-struct sadb_x_kmaddress { +- __u16 sadb_x_kmaddress_len; +- __u16 sadb_x_kmaddress_exttype; +- __u32 sadb_x_kmaddress_reserved; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_kmaddress) == 8 */ +- +-/* To specify the SA dump filter */ +-struct sadb_x_filter { +- __u16 sadb_x_filter_len; +- __u16 sadb_x_filter_exttype; +- __u32 sadb_x_filter_saddr[4]; +- __u32 sadb_x_filter_daddr[4]; +- __u16 sadb_x_filter_family; +- __u8 sadb_x_filter_splen; +- __u8 sadb_x_filter_dplen; +-} __attribute__((packed)); +-/* sizeof(struct sadb_x_filter) == 40 */ +- +-/* Message types */ +-#define SADB_RESERVED 0 +-#define SADB_GETSPI 1 +-#define SADB_UPDATE 2 +-#define SADB_ADD 3 +-#define SADB_DELETE 4 +-#define SADB_GET 5 +-#define SADB_ACQUIRE 6 +-#define SADB_REGISTER 7 +-#define SADB_EXPIRE 8 +-#define SADB_FLUSH 9 +-#define SADB_DUMP 10 +-#define SADB_X_PROMISC 11 +-#define SADB_X_PCHANGE 12 +-#define SADB_X_SPDUPDATE 13 +-#define SADB_X_SPDADD 14 +-#define SADB_X_SPDDELETE 15 +-#define SADB_X_SPDGET 16 +-#define SADB_X_SPDACQUIRE 17 +-#define SADB_X_SPDDUMP 18 +-#define SADB_X_SPDFLUSH 19 +-#define SADB_X_SPDSETIDX 20 +-#define SADB_X_SPDEXPIRE 21 +-#define SADB_X_SPDDELETE2 22 +-#define SADB_X_NAT_T_NEW_MAPPING 23 +-#define SADB_X_MIGRATE 24 +-#define SADB_MAX 24 +- +-/* Security Association flags */ +-#define SADB_SAFLAGS_PFS 1 +-#define SADB_SAFLAGS_NOPMTUDISC 0x20000000 +-#define SADB_SAFLAGS_DECAP_DSCP 0x40000000 +-#define SADB_SAFLAGS_NOECN 0x80000000 +- +-/* Security Association states */ +-#define SADB_SASTATE_LARVAL 0 +-#define SADB_SASTATE_MATURE 1 +-#define SADB_SASTATE_DYING 2 +-#define SADB_SASTATE_DEAD 3 +-#define SADB_SASTATE_MAX 3 +- +-/* Security Association types */ +-#define SADB_SATYPE_UNSPEC 0 +-#define SADB_SATYPE_AH 2 +-#define SADB_SATYPE_ESP 3 +-#define SADB_SATYPE_RSVP 5 +-#define SADB_SATYPE_OSPFV2 6 +-#define SADB_SATYPE_RIPV2 7 +-#define SADB_SATYPE_MIP 8 +-#define SADB_X_SATYPE_IPCOMP 9 +-#define SADB_SATYPE_MAX 9 +- +-/* Authentication algorithms */ +-#define SADB_AALG_NONE 0 +-#define SADB_AALG_MD5HMAC 2 +-#define SADB_AALG_SHA1HMAC 3 +-#define SADB_X_AALG_SHA2_256HMAC 5 +-#define SADB_X_AALG_SHA2_384HMAC 6 +-#define SADB_X_AALG_SHA2_512HMAC 7 +-#define SADB_X_AALG_RIPEMD160HMAC 8 +-#define SADB_X_AALG_AES_XCBC_MAC 9 +-#define SADB_X_AALG_NULL 251 /* kame */ +-#define SADB_AALG_MAX 251 +- +-/* Encryption algorithms */ +-#define SADB_EALG_NONE 0 +-#define SADB_EALG_DESCBC 2 +-#define SADB_EALG_3DESCBC 3 +-#define SADB_X_EALG_CASTCBC 6 +-#define SADB_X_EALG_BLOWFISHCBC 7 +-#define SADB_EALG_NULL 11 +-#define SADB_X_EALG_AESCBC 12 +-#define SADB_X_EALG_AESCTR 13 +-#define SADB_X_EALG_AES_CCM_ICV8 14 +-#define SADB_X_EALG_AES_CCM_ICV12 15 +-#define SADB_X_EALG_AES_CCM_ICV16 16 +-#define SADB_X_EALG_AES_GCM_ICV8 18 +-#define SADB_X_EALG_AES_GCM_ICV12 19 +-#define SADB_X_EALG_AES_GCM_ICV16 20 +-#define SADB_X_EALG_CAMELLIACBC 22 +-#define SADB_X_EALG_NULL_AES_GMAC 23 +-#define SADB_EALG_MAX 253 /* last EALG */ +-/* private allocations should use 249-255 (RFC2407) */ +-#define SADB_X_EALG_SERPENTCBC 252 /* draft-ietf-ipsec-ciph-aes-cbc-00 */ +-#define SADB_X_EALG_TWOFISHCBC 253 /* draft-ietf-ipsec-ciph-aes-cbc-00 */ +- +-/* Compression algorithms */ +-#define SADB_X_CALG_NONE 0 +-#define SADB_X_CALG_OUI 1 +-#define SADB_X_CALG_DEFLATE 2 +-#define SADB_X_CALG_LZS 3 +-#define SADB_X_CALG_LZJH 4 +-#define SADB_X_CALG_MAX 4 +- +-/* Extension Header values */ +-#define SADB_EXT_RESERVED 0 +-#define SADB_EXT_SA 1 +-#define SADB_EXT_LIFETIME_CURRENT 2 +-#define SADB_EXT_LIFETIME_HARD 3 +-#define SADB_EXT_LIFETIME_SOFT 4 +-#define SADB_EXT_ADDRESS_SRC 5 +-#define SADB_EXT_ADDRESS_DST 6 +-#define SADB_EXT_ADDRESS_PROXY 7 +-#define SADB_EXT_KEY_AUTH 8 +-#define SADB_EXT_KEY_ENCRYPT 9 +-#define SADB_EXT_IDENTITY_SRC 10 +-#define SADB_EXT_IDENTITY_DST 11 +-#define SADB_EXT_SENSITIVITY 12 +-#define SADB_EXT_PROPOSAL 13 +-#define SADB_EXT_SUPPORTED_AUTH 14 +-#define SADB_EXT_SUPPORTED_ENCRYPT 15 +-#define SADB_EXT_SPIRANGE 16 +-#define SADB_X_EXT_KMPRIVATE 17 +-#define SADB_X_EXT_POLICY 18 +-#define SADB_X_EXT_SA2 19 +-/* The next four entries are for setting up NAT Traversal */ +-#define SADB_X_EXT_NAT_T_TYPE 20 +-#define SADB_X_EXT_NAT_T_SPORT 21 +-#define SADB_X_EXT_NAT_T_DPORT 22 +-#define SADB_X_EXT_NAT_T_OA 23 +-#define SADB_X_EXT_SEC_CTX 24 +-/* Used with MIGRATE to pass @ to IKE for negotiation */ +-#define SADB_X_EXT_KMADDRESS 25 +-#define SADB_X_EXT_FILTER 26 +-#define SADB_EXT_MAX 26 +- +-/* Identity Extension values */ +-#define SADB_IDENTTYPE_RESERVED 0 +-#define SADB_IDENTTYPE_PREFIX 1 +-#define SADB_IDENTTYPE_FQDN 2 +-#define SADB_IDENTTYPE_USERFQDN 3 +-#define SADB_IDENTTYPE_MAX 3 +- +-#endif /* !(_LINUX_PFKEY2_H) */ +diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h +deleted file mode 100644 +index d5e2bf6..0000000 +--- a/include/linux/pkt_cls.h ++++ /dev/null +@@ -1,569 +0,0 @@ +-#ifndef __LINUX_PKT_CLS_H +-#define __LINUX_PKT_CLS_H +- +-#include +-#include +- +-#define TC_COOKIE_MAX_SIZE 16 +- +-/* Action attributes */ +-enum { +- TCA_ACT_UNSPEC, +- TCA_ACT_KIND, +- TCA_ACT_OPTIONS, +- TCA_ACT_INDEX, +- TCA_ACT_STATS, +- TCA_ACT_PAD, +- TCA_ACT_COOKIE, +- __TCA_ACT_MAX +-}; +- +-#define TCA_ACT_MAX __TCA_ACT_MAX +-#define TCA_OLD_COMPAT (TCA_ACT_MAX+1) +-#define TCA_ACT_MAX_PRIO 32 +-#define TCA_ACT_BIND 1 +-#define TCA_ACT_NOBIND 0 +-#define TCA_ACT_UNBIND 1 +-#define TCA_ACT_NOUNBIND 0 +-#define TCA_ACT_REPLACE 1 +-#define TCA_ACT_NOREPLACE 0 +- +-#define TC_ACT_UNSPEC (-1) +-#define TC_ACT_OK 0 +-#define TC_ACT_RECLASSIFY 1 +-#define TC_ACT_SHOT 2 +-#define TC_ACT_PIPE 3 +-#define TC_ACT_STOLEN 4 +-#define TC_ACT_QUEUED 5 +-#define TC_ACT_REPEAT 6 +-#define TC_ACT_REDIRECT 7 +-#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" +- * and don't further process the frame +- * in hardware. For sw path, this is +- * equivalent of TC_ACT_STOLEN - drop +- * the skb and act like everything +- * is alright. +- */ +- +-/* There is a special kind of actions called "extended actions", +- * which need a value parameter. These have a local opcode located in +- * the highest nibble, starting from 1. The rest of the bits +- * are used to carry the value. These two parts together make +- * a combined opcode. +- */ +-#define __TC_ACT_EXT_SHIFT 28 +-#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) +-#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) +-#define TC_ACT_EXT_CMP(combined, opcode) \ +- (((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode) +- +-#define TC_ACT_JUMP __TC_ACT_EXT(1) +-#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) +- +-/* Action type identifiers*/ +-enum { +- TCA_ID_UNSPEC=0, +- TCA_ID_POLICE=1, +- /* other actions go here */ +- __TCA_ID_MAX=255 +-}; +- +-#define TCA_ID_MAX __TCA_ID_MAX +- +-struct tc_police { +- __u32 index; +- int action; +-#define TC_POLICE_UNSPEC TC_ACT_UNSPEC +-#define TC_POLICE_OK TC_ACT_OK +-#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY +-#define TC_POLICE_SHOT TC_ACT_SHOT +-#define TC_POLICE_PIPE TC_ACT_PIPE +- +- __u32 limit; +- __u32 burst; +- __u32 mtu; +- struct tc_ratespec rate; +- struct tc_ratespec peakrate; +- int refcnt; +- int bindcnt; +- __u32 capab; +-}; +- +-struct tcf_t { +- __u64 install; +- __u64 lastuse; +- __u64 expires; +- __u64 firstuse; +-}; +- +-struct tc_cnt { +- int refcnt; +- int bindcnt; +-}; +- +-#define tc_gen \ +- __u32 index; \ +- __u32 capab; \ +- int action; \ +- int refcnt; \ +- int bindcnt +- +-enum { +- TCA_POLICE_UNSPEC, +- TCA_POLICE_TBF, +- TCA_POLICE_RATE, +- TCA_POLICE_PEAKRATE, +- TCA_POLICE_AVRATE, +- TCA_POLICE_RESULT, +- TCA_POLICE_TM, +- TCA_POLICE_PAD, +- __TCA_POLICE_MAX +-#define TCA_POLICE_RESULT TCA_POLICE_RESULT +-}; +- +-#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) +- +-/* tca flags definitions */ +-#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */ +-#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ +-#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ +-#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ +- +-/* U32 filters */ +- +-#define TC_U32_HTID(h) ((h)&0xFFF00000) +-#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20) +-#define TC_U32_HASH(h) (((h)>>12)&0xFF) +-#define TC_U32_NODE(h) ((h)&0xFFF) +-#define TC_U32_KEY(h) ((h)&0xFFFFF) +-#define TC_U32_UNSPEC 0 +-#define TC_U32_ROOT (0xFFF00000) +- +-enum { +- TCA_U32_UNSPEC, +- TCA_U32_CLASSID, +- TCA_U32_HASH, +- TCA_U32_LINK, +- TCA_U32_DIVISOR, +- TCA_U32_SEL, +- TCA_U32_POLICE, +- TCA_U32_ACT, +- TCA_U32_INDEV, +- TCA_U32_PCNT, +- TCA_U32_MARK, +- TCA_U32_FLAGS, +- TCA_U32_PAD, +- __TCA_U32_MAX +-}; +- +-#define TCA_U32_MAX (__TCA_U32_MAX - 1) +- +-struct tc_u32_key { +- __be32 mask; +- __be32 val; +- int off; +- int offmask; +-}; +- +-struct tc_u32_sel { +- unsigned char flags; +- unsigned char offshift; +- unsigned char nkeys; +- +- __be16 offmask; +- __u16 off; +- short offoff; +- +- short hoff; +- __be32 hmask; +- struct tc_u32_key keys[0]; +-}; +- +-struct tc_u32_mark { +- __u32 val; +- __u32 mask; +- __u32 success; +-}; +- +-struct tc_u32_pcnt { +- __u64 rcnt; +- __u64 rhit; +- __u64 kcnts[0]; +-}; +- +-/* Flags */ +- +-#define TC_U32_TERMINAL 1 +-#define TC_U32_OFFSET 2 +-#define TC_U32_VAROFFSET 4 +-#define TC_U32_EAT 8 +- +-#define TC_U32_MAXDEPTH 8 +- +- +-/* RSVP filter */ +- +-enum { +- TCA_RSVP_UNSPEC, +- TCA_RSVP_CLASSID, +- TCA_RSVP_DST, +- TCA_RSVP_SRC, +- TCA_RSVP_PINFO, +- TCA_RSVP_POLICE, +- TCA_RSVP_ACT, +- __TCA_RSVP_MAX +-}; +- +-#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 ) +- +-struct tc_rsvp_gpi { +- __u32 key; +- __u32 mask; +- int offset; +-}; +- +-struct tc_rsvp_pinfo { +- struct tc_rsvp_gpi dpi; +- struct tc_rsvp_gpi spi; +- __u8 protocol; +- __u8 tunnelid; +- __u8 tunnelhdr; +- __u8 pad; +-}; +- +-/* ROUTE filter */ +- +-enum { +- TCA_ROUTE4_UNSPEC, +- TCA_ROUTE4_CLASSID, +- TCA_ROUTE4_TO, +- TCA_ROUTE4_FROM, +- TCA_ROUTE4_IIF, +- TCA_ROUTE4_POLICE, +- TCA_ROUTE4_ACT, +- __TCA_ROUTE4_MAX +-}; +- +-#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) +- +- +-/* FW filter */ +- +-enum { +- TCA_FW_UNSPEC, +- TCA_FW_CLASSID, +- TCA_FW_POLICE, +- TCA_FW_INDEV, /* used by CONFIG_NET_CLS_IND */ +- TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */ +- TCA_FW_MASK, +- __TCA_FW_MAX +-}; +- +-#define TCA_FW_MAX (__TCA_FW_MAX - 1) +- +-/* TC index filter */ +- +-enum { +- TCA_TCINDEX_UNSPEC, +- TCA_TCINDEX_HASH, +- TCA_TCINDEX_MASK, +- TCA_TCINDEX_SHIFT, +- TCA_TCINDEX_FALL_THROUGH, +- TCA_TCINDEX_CLASSID, +- TCA_TCINDEX_POLICE, +- TCA_TCINDEX_ACT, +- __TCA_TCINDEX_MAX +-}; +- +-#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) +- +-/* Flow filter */ +- +-enum { +- FLOW_KEY_SRC, +- FLOW_KEY_DST, +- FLOW_KEY_PROTO, +- FLOW_KEY_PROTO_SRC, +- FLOW_KEY_PROTO_DST, +- FLOW_KEY_IIF, +- FLOW_KEY_PRIORITY, +- FLOW_KEY_MARK, +- FLOW_KEY_NFCT, +- FLOW_KEY_NFCT_SRC, +- FLOW_KEY_NFCT_DST, +- FLOW_KEY_NFCT_PROTO_SRC, +- FLOW_KEY_NFCT_PROTO_DST, +- FLOW_KEY_RTCLASSID, +- FLOW_KEY_SKUID, +- FLOW_KEY_SKGID, +- FLOW_KEY_VLAN_TAG, +- FLOW_KEY_RXHASH, +- __FLOW_KEY_MAX, +-}; +- +-#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1) +- +-enum { +- FLOW_MODE_MAP, +- FLOW_MODE_HASH, +-}; +- +-enum { +- TCA_FLOW_UNSPEC, +- TCA_FLOW_KEYS, +- TCA_FLOW_MODE, +- TCA_FLOW_BASECLASS, +- TCA_FLOW_RSHIFT, +- TCA_FLOW_ADDEND, +- TCA_FLOW_MASK, +- TCA_FLOW_XOR, +- TCA_FLOW_DIVISOR, +- TCA_FLOW_ACT, +- TCA_FLOW_POLICE, +- TCA_FLOW_EMATCHES, +- TCA_FLOW_PERTURB, +- __TCA_FLOW_MAX +-}; +- +-#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1) +- +-/* Basic filter */ +- +-enum { +- TCA_BASIC_UNSPEC, +- TCA_BASIC_CLASSID, +- TCA_BASIC_EMATCHES, +- TCA_BASIC_ACT, +- TCA_BASIC_POLICE, +- __TCA_BASIC_MAX +-}; +- +-#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1) +- +- +-/* Cgroup classifier */ +- +-enum { +- TCA_CGROUP_UNSPEC, +- TCA_CGROUP_ACT, +- TCA_CGROUP_POLICE, +- TCA_CGROUP_EMATCHES, +- __TCA_CGROUP_MAX, +-}; +- +-#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) +- +-/* BPF classifier */ +- +-#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0) +- +-enum { +- TCA_BPF_UNSPEC, +- TCA_BPF_ACT, +- TCA_BPF_POLICE, +- TCA_BPF_CLASSID, +- TCA_BPF_OPS_LEN, +- TCA_BPF_OPS, +- TCA_BPF_FD, +- TCA_BPF_NAME, +- TCA_BPF_FLAGS, +- TCA_BPF_FLAGS_GEN, +- TCA_BPF_TAG, +- TCA_BPF_ID, +- __TCA_BPF_MAX, +-}; +- +-#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) +- +-/* Flower classifier */ +- +-enum { +- TCA_FLOWER_UNSPEC, +- TCA_FLOWER_CLASSID, +- TCA_FLOWER_INDEV, +- TCA_FLOWER_ACT, +- TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ETH_TYPE, /* be16 */ +- TCA_FLOWER_KEY_IP_PROTO, /* u8 */ +- TCA_FLOWER_KEY_IPV4_SRC, /* be32 */ +- TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */ +- TCA_FLOWER_KEY_IPV4_DST, /* be32 */ +- TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */ +- TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */ +- TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */ +- TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */ +- TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */ +- TCA_FLOWER_KEY_TCP_SRC, /* be16 */ +- TCA_FLOWER_KEY_TCP_DST, /* be16 */ +- TCA_FLOWER_KEY_UDP_SRC, /* be16 */ +- TCA_FLOWER_KEY_UDP_DST, /* be16 */ +- +- TCA_FLOWER_FLAGS, +- TCA_FLOWER_KEY_VLAN_ID, /* be16 */ +- TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */ +- TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */ +- +- TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */ +- TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */ +- TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */ +- TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */ +- TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */ +- TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */ +- TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */ +- TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */ +- TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */ +- +- TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */ +- TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */ +- TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */ +- TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */ +- TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */ +- TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */ +- +- TCA_FLOWER_KEY_SCTP_SRC, /* be16 */ +- TCA_FLOWER_KEY_SCTP_DST, /* be16 */ +- +- TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */ +- TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ +- TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ +- TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ +- +- TCA_FLOWER_KEY_FLAGS, /* be32 */ +- TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ +- +- TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */ +- TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */ +- TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */ +- TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */ +- TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */ +- TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */ +- TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */ +- TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */ +- +- TCA_FLOWER_KEY_ARP_SIP, /* be32 */ +- TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */ +- TCA_FLOWER_KEY_ARP_TIP, /* be32 */ +- TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */ +- TCA_FLOWER_KEY_ARP_OP, /* u8 */ +- TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */ +- TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ +- TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ +- +- TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ +- TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ +- TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ +- TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ +- +- TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ +- TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ +- +- TCA_FLOWER_KEY_IP_TOS, /* u8 */ +- TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ +- TCA_FLOWER_KEY_IP_TTL, /* u8 */ +- TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ +- +- __TCA_FLOWER_MAX, +-}; +- +-#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) +- +-enum { +- TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), +-}; +- +-/* Match-all classifier */ +- +-enum { +- TCA_MATCHALL_UNSPEC, +- TCA_MATCHALL_CLASSID, +- TCA_MATCHALL_ACT, +- TCA_MATCHALL_FLAGS, +- __TCA_MATCHALL_MAX, +-}; +- +-#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1) +- +-/* Extended Matches */ +- +-struct tcf_ematch_tree_hdr { +- __u16 nmatches; +- __u16 progid; +-}; +- +-enum { +- TCA_EMATCH_TREE_UNSPEC, +- TCA_EMATCH_TREE_HDR, +- TCA_EMATCH_TREE_LIST, +- __TCA_EMATCH_TREE_MAX +-}; +-#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1) +- +-struct tcf_ematch_hdr { +- __u16 matchid; +- __u16 kind; +- __u16 flags; +- __u16 pad; /* currently unused */ +-}; +- +-/* 0 1 +- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +- * +-----------------------+-+-+---+ +- * | Unused |S|I| R | +- * +-----------------------+-+-+---+ +- * +- * R(2) ::= relation to next ematch +- * where: 0 0 END (last ematch) +- * 0 1 AND +- * 1 0 OR +- * 1 1 Unused (invalid) +- * I(1) ::= invert result +- * S(1) ::= simple payload +- */ +-#define TCF_EM_REL_END 0 +-#define TCF_EM_REL_AND (1<<0) +-#define TCF_EM_REL_OR (1<<1) +-#define TCF_EM_INVERT (1<<2) +-#define TCF_EM_SIMPLE (1<<3) +- +-#define TCF_EM_REL_MASK 3 +-#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK) +- +-enum { +- TCF_LAYER_LINK, +- TCF_LAYER_NETWORK, +- TCF_LAYER_TRANSPORT, +- __TCF_LAYER_MAX +-}; +-#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1) +- +-/* Ematch type assignments +- * 1..32767 Reserved for ematches inside kernel tree +- * 32768..65535 Free to use, not reliable +- */ +-#define TCF_EM_CONTAINER 0 +-#define TCF_EM_CMP 1 +-#define TCF_EM_NBYTE 2 +-#define TCF_EM_U32 3 +-#define TCF_EM_META 4 +-#define TCF_EM_TEXT 5 +-#define TCF_EM_VLAN 6 +-#define TCF_EM_CANID 7 +-#define TCF_EM_IPSET 8 +-#define TCF_EM_MAX 8 +- +-enum { +- TCF_EM_PROG_TC +-}; +- +-enum { +- TCF_EM_OPND_EQ, +- TCF_EM_OPND_GT, +- TCF_EM_OPND_LT +-}; +- +-#endif +diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h +deleted file mode 100644 +index 099bf55..0000000 +--- a/include/linux/pkt_sched.h ++++ /dev/null +@@ -1,874 +0,0 @@ +-#ifndef __LINUX_PKT_SCHED_H +-#define __LINUX_PKT_SCHED_H +- +-#include +- +-/* Logical priority bands not depending on specific packet scheduler. +- Every scheduler will map them to real traffic classes, if it has +- no more precise mechanism to classify packets. +- +- These numbers have no special meaning, though their coincidence +- with obsolete IPv6 values is not occasional :-). New IPv6 drafts +- preferred full anarchy inspired by diffserv group. +- +- Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy +- class, actually, as rule it will be handled with more care than +- filler or even bulk. +- */ +- +-#define TC_PRIO_BESTEFFORT 0 +-#define TC_PRIO_FILLER 1 +-#define TC_PRIO_BULK 2 +-#define TC_PRIO_INTERACTIVE_BULK 4 +-#define TC_PRIO_INTERACTIVE 6 +-#define TC_PRIO_CONTROL 7 +- +-#define TC_PRIO_MAX 15 +- +-/* Generic queue statistics, available for all the elements. +- Particular schedulers may have also their private records. +- */ +- +-struct tc_stats { +- __u64 bytes; /* Number of enqueued bytes */ +- __u32 packets; /* Number of enqueued packets */ +- __u32 drops; /* Packets dropped because of lack of resources */ +- __u32 overlimits; /* Number of throttle events when this +- * flow goes out of allocated bandwidth */ +- __u32 bps; /* Current flow byte rate */ +- __u32 pps; /* Current flow packet rate */ +- __u32 qlen; +- __u32 backlog; +-}; +- +-struct tc_estimator { +- signed char interval; +- unsigned char ewma_log; +-}; +- +-/* "Handles" +- --------- +- +- All the traffic control objects have 32bit identifiers, or "handles". +- +- They can be considered as opaque numbers from user API viewpoint, +- but actually they always consist of two fields: major and +- minor numbers, which are interpreted by kernel specially, +- that may be used by applications, though not recommended. +- +- F.e. qdisc handles always have minor number equal to zero, +- classes (or flows) have major equal to parent qdisc major, and +- minor uniquely identifying class inside qdisc. +- +- Macros to manipulate handles: +- */ +- +-#define TC_H_MAJ_MASK (0xFFFF0000U) +-#define TC_H_MIN_MASK (0x0000FFFFU) +-#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) +-#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) +-#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) +- +-#define TC_H_UNSPEC (0U) +-#define TC_H_ROOT (0xFFFFFFFFU) +-#define TC_H_INGRESS (0xFFFFFFF1U) +-#define TC_H_CLSACT TC_H_INGRESS +- +-#define TC_H_MIN_INGRESS 0xFFF2U +-#define TC_H_MIN_EGRESS 0xFFF3U +- +-/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */ +-enum tc_link_layer { +- TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */ +- TC_LINKLAYER_ETHERNET, +- TC_LINKLAYER_ATM, +-}; +-#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */ +- +-struct tc_ratespec { +- unsigned char cell_log; +- __u8 linklayer; /* lower 4 bits */ +- unsigned short overhead; +- short cell_align; +- unsigned short mpu; +- __u32 rate; +-}; +- +-#define TC_RTAB_SIZE 1024 +- +-struct tc_sizespec { +- unsigned char cell_log; +- unsigned char size_log; +- short cell_align; +- int overhead; +- unsigned int linklayer; +- unsigned int mpu; +- unsigned int mtu; +- unsigned int tsize; +-}; +- +-enum { +- TCA_STAB_UNSPEC, +- TCA_STAB_BASE, +- TCA_STAB_DATA, +- __TCA_STAB_MAX +-}; +- +-#define TCA_STAB_MAX (__TCA_STAB_MAX - 1) +- +-/* FIFO section */ +- +-struct tc_fifo_qopt { +- __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ +-}; +- +-/* PRIO section */ +- +-#define TCQ_PRIO_BANDS 16 +-#define TCQ_MIN_PRIO_BANDS 2 +- +-struct tc_prio_qopt { +- int bands; /* Number of bands */ +- __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ +-}; +- +-/* MULTIQ section */ +- +-struct tc_multiq_qopt { +- __u16 bands; /* Number of bands */ +- __u16 max_bands; /* Maximum number of queues */ +-}; +- +-/* PLUG section */ +- +-#define TCQ_PLUG_BUFFER 0 +-#define TCQ_PLUG_RELEASE_ONE 1 +-#define TCQ_PLUG_RELEASE_INDEFINITE 2 +-#define TCQ_PLUG_LIMIT 3 +- +-struct tc_plug_qopt { +- /* TCQ_PLUG_BUFFER: Inset a plug into the queue and +- * buffer any incoming packets +- * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head +- * to beginning of the next plug. +- * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. +- * Stop buffering packets until the next TCQ_PLUG_BUFFER +- * command is received (just act as a pass-thru queue). +- * TCQ_PLUG_LIMIT: Increase/decrease queue size +- */ +- int action; +- __u32 limit; +-}; +- +-/* TBF section */ +- +-struct tc_tbf_qopt { +- struct tc_ratespec rate; +- struct tc_ratespec peakrate; +- __u32 limit; +- __u32 buffer; +- __u32 mtu; +-}; +- +-enum { +- TCA_TBF_UNSPEC, +- TCA_TBF_PARMS, +- TCA_TBF_RTAB, +- TCA_TBF_PTAB, +- TCA_TBF_RATE64, +- TCA_TBF_PRATE64, +- TCA_TBF_BURST, +- TCA_TBF_PBURST, +- TCA_TBF_PAD, +- __TCA_TBF_MAX, +-}; +- +-#define TCA_TBF_MAX (__TCA_TBF_MAX - 1) +- +- +-/* TEQL section */ +- +-/* TEQL does not require any parameters */ +- +-/* SFQ section */ +- +-struct tc_sfq_qopt { +- unsigned quantum; /* Bytes per round allocated to flow */ +- int perturb_period; /* Period of hash perturbation */ +- __u32 limit; /* Maximal packets in queue */ +- unsigned divisor; /* Hash divisor */ +- unsigned flows; /* Maximal number of flows */ +-}; +- +-struct tc_sfqred_stats { +- __u32 prob_drop; /* Early drops, below max threshold */ +- __u32 forced_drop; /* Early drops, after max threshold */ +- __u32 prob_mark; /* Marked packets, below max threshold */ +- __u32 forced_mark; /* Marked packets, after max threshold */ +- __u32 prob_mark_head; /* Marked packets, below max threshold */ +- __u32 forced_mark_head;/* Marked packets, after max threshold */ +-}; +- +-struct tc_sfq_qopt_v1 { +- struct tc_sfq_qopt v0; +- unsigned int depth; /* max number of packets per flow */ +- unsigned int headdrop; +-/* SFQRED parameters */ +- __u32 limit; /* HARD maximal flow queue length (bytes) */ +- __u32 qth_min; /* Min average length threshold (bytes) */ +- __u32 qth_max; /* Max average length threshold (bytes) */ +- unsigned char Wlog; /* log(W) */ +- unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ +- unsigned char Scell_log; /* cell size for idle damping */ +- unsigned char flags; +- __u32 max_P; /* probability, high resolution */ +-/* SFQRED stats */ +- struct tc_sfqred_stats stats; +-}; +- +- +-struct tc_sfq_xstats { +- __s32 allot; +-}; +- +-/* RED section */ +- +-enum { +- TCA_RED_UNSPEC, +- TCA_RED_PARMS, +- TCA_RED_STAB, +- TCA_RED_MAX_P, +- __TCA_RED_MAX, +-}; +- +-#define TCA_RED_MAX (__TCA_RED_MAX - 1) +- +-struct tc_red_qopt { +- __u32 limit; /* HARD maximal queue length (bytes) */ +- __u32 qth_min; /* Min average length threshold (bytes) */ +- __u32 qth_max; /* Max average length threshold (bytes) */ +- unsigned char Wlog; /* log(W) */ +- unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ +- unsigned char Scell_log; /* cell size for idle damping */ +- unsigned char flags; +-#define TC_RED_ECN 1 +-#define TC_RED_HARDDROP 2 +-#define TC_RED_ADAPTATIVE 4 +-}; +- +-struct tc_red_xstats { +- __u32 early; /* Early drops */ +- __u32 pdrop; /* Drops due to queue limits */ +- __u32 other; /* Drops due to drop() calls */ +- __u32 marked; /* Marked packets */ +-}; +- +-/* GRED section */ +- +-#define MAX_DPs 16 +- +-enum { +- TCA_GRED_UNSPEC, +- TCA_GRED_PARMS, +- TCA_GRED_STAB, +- TCA_GRED_DPS, +- TCA_GRED_MAX_P, +- TCA_GRED_LIMIT, +- __TCA_GRED_MAX, +-}; +- +-#define TCA_GRED_MAX (__TCA_GRED_MAX - 1) +- +-struct tc_gred_qopt { +- __u32 limit; /* HARD maximal queue length (bytes) */ +- __u32 qth_min; /* Min average length threshold (bytes) */ +- __u32 qth_max; /* Max average length threshold (bytes) */ +- __u32 DP; /* up to 2^32 DPs */ +- __u32 backlog; +- __u32 qave; +- __u32 forced; +- __u32 early; +- __u32 other; +- __u32 pdrop; +- __u8 Wlog; /* log(W) */ +- __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ +- __u8 Scell_log; /* cell size for idle damping */ +- __u8 prio; /* prio of this VQ */ +- __u32 packets; +- __u32 bytesin; +-}; +- +-/* gred setup */ +-struct tc_gred_sopt { +- __u32 DPs; +- __u32 def_DP; +- __u8 grio; +- __u8 flags; +- __u16 pad1; +-}; +- +-/* CHOKe section */ +- +-enum { +- TCA_CHOKE_UNSPEC, +- TCA_CHOKE_PARMS, +- TCA_CHOKE_STAB, +- TCA_CHOKE_MAX_P, +- __TCA_CHOKE_MAX, +-}; +- +-#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) +- +-struct tc_choke_qopt { +- __u32 limit; /* Hard queue length (packets) */ +- __u32 qth_min; /* Min average threshold (packets) */ +- __u32 qth_max; /* Max average threshold (packets) */ +- unsigned char Wlog; /* log(W) */ +- unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ +- unsigned char Scell_log; /* cell size for idle damping */ +- unsigned char flags; /* see RED flags */ +-}; +- +-struct tc_choke_xstats { +- __u32 early; /* Early drops */ +- __u32 pdrop; /* Drops due to queue limits */ +- __u32 other; /* Drops due to drop() calls */ +- __u32 marked; /* Marked packets */ +- __u32 matched; /* Drops due to flow match */ +-}; +- +-/* HTB section */ +-#define TC_HTB_NUMPRIO 8 +-#define TC_HTB_MAXDEPTH 8 +-#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ +- +-struct tc_htb_opt { +- struct tc_ratespec rate; +- struct tc_ratespec ceil; +- __u32 buffer; +- __u32 cbuffer; +- __u32 quantum; +- __u32 level; /* out only */ +- __u32 prio; +-}; +-struct tc_htb_glob { +- __u32 version; /* to match HTB/TC */ +- __u32 rate2quantum; /* bps->quantum divisor */ +- __u32 defcls; /* default class number */ +- __u32 debug; /* debug flags */ +- +- /* stats */ +- __u32 direct_pkts; /* count of non shaped packets */ +-}; +-enum { +- TCA_HTB_UNSPEC, +- TCA_HTB_PARMS, +- TCA_HTB_INIT, +- TCA_HTB_CTAB, +- TCA_HTB_RTAB, +- TCA_HTB_DIRECT_QLEN, +- TCA_HTB_RATE64, +- TCA_HTB_CEIL64, +- TCA_HTB_PAD, +- __TCA_HTB_MAX, +-}; +- +-#define TCA_HTB_MAX (__TCA_HTB_MAX - 1) +- +-struct tc_htb_xstats { +- __u32 lends; +- __u32 borrows; +- __u32 giants; /* too big packets (rate will not be accurate) */ +- __u32 tokens; +- __u32 ctokens; +-}; +- +-/* HFSC section */ +- +-struct tc_hfsc_qopt { +- __u16 defcls; /* default class */ +-}; +- +-struct tc_service_curve { +- __u32 m1; /* slope of the first segment in bps */ +- __u32 d; /* x-projection of the first segment in us */ +- __u32 m2; /* slope of the second segment in bps */ +-}; +- +-struct tc_hfsc_stats { +- __u64 work; /* total work done */ +- __u64 rtwork; /* work done by real-time criteria */ +- __u32 period; /* current period */ +- __u32 level; /* class level in hierarchy */ +-}; +- +-enum { +- TCA_HFSC_UNSPEC, +- TCA_HFSC_RSC, +- TCA_HFSC_FSC, +- TCA_HFSC_USC, +- __TCA_HFSC_MAX, +-}; +- +-#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) +- +- +-/* CBQ section */ +- +-#define TC_CBQ_MAXPRIO 8 +-#define TC_CBQ_MAXLEVEL 8 +-#define TC_CBQ_DEF_EWMA 5 +- +-struct tc_cbq_lssopt { +- unsigned char change; +- unsigned char flags; +-#define TCF_CBQ_LSS_BOUNDED 1 +-#define TCF_CBQ_LSS_ISOLATED 2 +- unsigned char ewma_log; +- unsigned char level; +-#define TCF_CBQ_LSS_FLAGS 1 +-#define TCF_CBQ_LSS_EWMA 2 +-#define TCF_CBQ_LSS_MAXIDLE 4 +-#define TCF_CBQ_LSS_MINIDLE 8 +-#define TCF_CBQ_LSS_OFFTIME 0x10 +-#define TCF_CBQ_LSS_AVPKT 0x20 +- __u32 maxidle; +- __u32 minidle; +- __u32 offtime; +- __u32 avpkt; +-}; +- +-struct tc_cbq_wrropt { +- unsigned char flags; +- unsigned char priority; +- unsigned char cpriority; +- unsigned char __reserved; +- __u32 allot; +- __u32 weight; +-}; +- +-struct tc_cbq_ovl { +- unsigned char strategy; +-#define TC_CBQ_OVL_CLASSIC 0 +-#define TC_CBQ_OVL_DELAY 1 +-#define TC_CBQ_OVL_LOWPRIO 2 +-#define TC_CBQ_OVL_DROP 3 +-#define TC_CBQ_OVL_RCLASSIC 4 +- unsigned char priority2; +- __u16 pad; +- __u32 penalty; +-}; +- +-struct tc_cbq_police { +- unsigned char police; +- unsigned char __res1; +- unsigned short __res2; +-}; +- +-struct tc_cbq_fopt { +- __u32 split; +- __u32 defmap; +- __u32 defchange; +-}; +- +-struct tc_cbq_xstats { +- __u32 borrows; +- __u32 overactions; +- __s32 avgidle; +- __s32 undertime; +-}; +- +-enum { +- TCA_CBQ_UNSPEC, +- TCA_CBQ_LSSOPT, +- TCA_CBQ_WRROPT, +- TCA_CBQ_FOPT, +- TCA_CBQ_OVL_STRATEGY, +- TCA_CBQ_RATE, +- TCA_CBQ_RTAB, +- TCA_CBQ_POLICE, +- __TCA_CBQ_MAX, +-}; +- +-#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) +- +-/* dsmark section */ +- +-enum { +- TCA_DSMARK_UNSPEC, +- TCA_DSMARK_INDICES, +- TCA_DSMARK_DEFAULT_INDEX, +- TCA_DSMARK_SET_TC_INDEX, +- TCA_DSMARK_MASK, +- TCA_DSMARK_VALUE, +- __TCA_DSMARK_MAX, +-}; +- +-#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) +- +-/* ATM section */ +- +-enum { +- TCA_ATM_UNSPEC, +- TCA_ATM_FD, /* file/socket descriptor */ +- TCA_ATM_PTR, /* pointer to descriptor - later */ +- TCA_ATM_HDR, /* LL header */ +- TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ +- TCA_ATM_ADDR, /* PVC address (for output only) */ +- TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ +- __TCA_ATM_MAX, +-}; +- +-#define TCA_ATM_MAX (__TCA_ATM_MAX - 1) +- +-/* Network emulator */ +- +-enum { +- TCA_NETEM_UNSPEC, +- TCA_NETEM_CORR, +- TCA_NETEM_DELAY_DIST, +- TCA_NETEM_REORDER, +- TCA_NETEM_CORRUPT, +- TCA_NETEM_LOSS, +- TCA_NETEM_RATE, +- TCA_NETEM_ECN, +- TCA_NETEM_RATE64, +- TCA_NETEM_PAD, +- __TCA_NETEM_MAX, +-}; +- +-#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) +- +-struct tc_netem_qopt { +- __u32 latency; /* added delay (us) */ +- __u32 limit; /* fifo limit (packets) */ +- __u32 loss; /* random packet loss (0=none ~0=100%) */ +- __u32 gap; /* re-ordering gap (0 for none) */ +- __u32 duplicate; /* random packet dup (0=none ~0=100%) */ +- __u32 jitter; /* random jitter in latency (us) */ +-}; +- +-struct tc_netem_corr { +- __u32 delay_corr; /* delay correlation */ +- __u32 loss_corr; /* packet loss correlation */ +- __u32 dup_corr; /* duplicate correlation */ +-}; +- +-struct tc_netem_reorder { +- __u32 probability; +- __u32 correlation; +-}; +- +-struct tc_netem_corrupt { +- __u32 probability; +- __u32 correlation; +-}; +- +-struct tc_netem_rate { +- __u32 rate; /* byte/s */ +- __s32 packet_overhead; +- __u32 cell_size; +- __s32 cell_overhead; +-}; +- +-enum { +- NETEM_LOSS_UNSPEC, +- NETEM_LOSS_GI, /* General Intuitive - 4 state model */ +- NETEM_LOSS_GE, /* Gilbert Elliot models */ +- __NETEM_LOSS_MAX +-}; +-#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) +- +-/* State transition probabilities for 4 state model */ +-struct tc_netem_gimodel { +- __u32 p13; +- __u32 p31; +- __u32 p32; +- __u32 p14; +- __u32 p23; +-}; +- +-/* Gilbert-Elliot models */ +-struct tc_netem_gemodel { +- __u32 p; +- __u32 r; +- __u32 h; +- __u32 k1; +-}; +- +-#define NETEM_DIST_SCALE 8192 +-#define NETEM_DIST_MAX 16384 +- +-/* DRR */ +- +-enum { +- TCA_DRR_UNSPEC, +- TCA_DRR_QUANTUM, +- __TCA_DRR_MAX +-}; +- +-#define TCA_DRR_MAX (__TCA_DRR_MAX - 1) +- +-struct tc_drr_stats { +- __u32 deficit; +-}; +- +-/* MQPRIO */ +-#define TC_QOPT_BITMASK 15 +-#define TC_QOPT_MAX_QUEUE 16 +- +-enum { +- TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ +- TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ +- __TC_MQPRIO_HW_OFFLOAD_MAX +-}; +- +-#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) +- +-struct tc_mqprio_qopt { +- __u8 num_tc; +- __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; +- __u8 hw; +- __u16 count[TC_QOPT_MAX_QUEUE]; +- __u16 offset[TC_QOPT_MAX_QUEUE]; +-}; +- +-/* SFB */ +- +-enum { +- TCA_SFB_UNSPEC, +- TCA_SFB_PARMS, +- __TCA_SFB_MAX, +-}; +- +-#define TCA_SFB_MAX (__TCA_SFB_MAX - 1) +- +-/* +- * Note: increment, decrement are Q0.16 fixed-point values. +- */ +-struct tc_sfb_qopt { +- __u32 rehash_interval; /* delay between hash move, in ms */ +- __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ +- __u32 max; /* max len of qlen_min */ +- __u32 bin_size; /* maximum queue length per bin */ +- __u32 increment; /* probability increment, (d1 in Blue) */ +- __u32 decrement; /* probability decrement, (d2 in Blue) */ +- __u32 limit; /* max SFB queue length */ +- __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ +- __u32 penalty_burst; +-}; +- +-struct tc_sfb_xstats { +- __u32 earlydrop; +- __u32 penaltydrop; +- __u32 bucketdrop; +- __u32 queuedrop; +- __u32 childdrop; /* drops in child qdisc */ +- __u32 marked; +- __u32 maxqlen; +- __u32 maxprob; +- __u32 avgprob; +-}; +- +-#define SFB_MAX_PROB 0xFFFF +- +-/* QFQ */ +-enum { +- TCA_QFQ_UNSPEC, +- TCA_QFQ_WEIGHT, +- TCA_QFQ_LMAX, +- __TCA_QFQ_MAX +-}; +- +-#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1) +- +-struct tc_qfq_stats { +- __u32 weight; +- __u32 lmax; +-}; +- +-/* CODEL */ +- +-enum { +- TCA_CODEL_UNSPEC, +- TCA_CODEL_TARGET, +- TCA_CODEL_LIMIT, +- TCA_CODEL_INTERVAL, +- TCA_CODEL_ECN, +- TCA_CODEL_CE_THRESHOLD, +- __TCA_CODEL_MAX +-}; +- +-#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1) +- +-struct tc_codel_xstats { +- __u32 maxpacket; /* largest packet we've seen so far */ +- __u32 count; /* how many drops we've done since the last time we +- * entered dropping state +- */ +- __u32 lastcount; /* count at entry to dropping state */ +- __u32 ldelay; /* in-queue delay seen by most recently dequeued packet */ +- __s32 drop_next; /* time to drop next packet */ +- __u32 drop_overlimit; /* number of time max qdisc packet limit was hit */ +- __u32 ecn_mark; /* number of packets we ECN marked instead of dropped */ +- __u32 dropping; /* are we in dropping state ? */ +- __u32 ce_mark; /* number of CE marked packets because of ce_threshold */ +-}; +- +-/* FQ_CODEL */ +- +-enum { +- TCA_FQ_CODEL_UNSPEC, +- TCA_FQ_CODEL_TARGET, +- TCA_FQ_CODEL_LIMIT, +- TCA_FQ_CODEL_INTERVAL, +- TCA_FQ_CODEL_ECN, +- TCA_FQ_CODEL_FLOWS, +- TCA_FQ_CODEL_QUANTUM, +- TCA_FQ_CODEL_CE_THRESHOLD, +- TCA_FQ_CODEL_DROP_BATCH_SIZE, +- TCA_FQ_CODEL_MEMORY_LIMIT, +- __TCA_FQ_CODEL_MAX +-}; +- +-#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1) +- +-enum { +- TCA_FQ_CODEL_XSTATS_QDISC, +- TCA_FQ_CODEL_XSTATS_CLASS, +-}; +- +-struct tc_fq_codel_qd_stats { +- __u32 maxpacket; /* largest packet we've seen so far */ +- __u32 drop_overlimit; /* number of time max qdisc +- * packet limit was hit +- */ +- __u32 ecn_mark; /* number of packets we ECN marked +- * instead of being dropped +- */ +- __u32 new_flow_count; /* number of time packets +- * created a 'new flow' +- */ +- __u32 new_flows_len; /* count of flows in new list */ +- __u32 old_flows_len; /* count of flows in old list */ +- __u32 ce_mark; /* packets above ce_threshold */ +- __u32 memory_usage; /* in bytes */ +- __u32 drop_overmemory; +-}; +- +-struct tc_fq_codel_cl_stats { +- __s32 deficit; +- __u32 ldelay; /* in-queue delay seen by most recently +- * dequeued packet +- */ +- __u32 count; +- __u32 lastcount; +- __u32 dropping; +- __s32 drop_next; +-}; +- +-struct tc_fq_codel_xstats { +- __u32 type; +- union { +- struct tc_fq_codel_qd_stats qdisc_stats; +- struct tc_fq_codel_cl_stats class_stats; +- }; +-}; +- +-/* FQ */ +- +-enum { +- TCA_FQ_UNSPEC, +- +- TCA_FQ_PLIMIT, /* limit of total number of packets in queue */ +- +- TCA_FQ_FLOW_PLIMIT, /* limit of packets per flow */ +- +- TCA_FQ_QUANTUM, /* RR quantum */ +- +- TCA_FQ_INITIAL_QUANTUM, /* RR quantum for new flow */ +- +- TCA_FQ_RATE_ENABLE, /* enable/disable rate limiting */ +- +- TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */ +- +- TCA_FQ_FLOW_MAX_RATE, /* per flow max rate */ +- +- TCA_FQ_BUCKETS_LOG, /* log2(number of buckets) */ +- +- TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ +- +- TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ +- +- TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */ +- +- __TCA_FQ_MAX +-}; +- +-#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) +- +-struct tc_fq_qd_stats { +- __u64 gc_flows; +- __u64 highprio_packets; +- __u64 tcp_retrans; +- __u64 throttled; +- __u64 flows_plimit; +- __u64 pkts_too_long; +- __u64 allocation_errors; +- __s64 time_next_delayed_flow; +- __u32 flows; +- __u32 inactive_flows; +- __u32 throttled_flows; +- __u32 unthrottle_latency_ns; +-}; +- +-/* Heavy-Hitter Filter */ +- +-enum { +- TCA_HHF_UNSPEC, +- TCA_HHF_BACKLOG_LIMIT, +- TCA_HHF_QUANTUM, +- TCA_HHF_HH_FLOWS_LIMIT, +- TCA_HHF_RESET_TIMEOUT, +- TCA_HHF_ADMIT_BYTES, +- TCA_HHF_EVICT_TIMEOUT, +- TCA_HHF_NON_HH_WEIGHT, +- __TCA_HHF_MAX +-}; +- +-#define TCA_HHF_MAX (__TCA_HHF_MAX - 1) +- +-struct tc_hhf_xstats { +- __u32 drop_overlimit; /* number of times max qdisc packet limit +- * was hit +- */ +- __u32 hh_overlimit; /* number of times max heavy-hitters was hit */ +- __u32 hh_tot_count; /* number of captured heavy-hitters so far */ +- __u32 hh_cur_count; /* number of current heavy-hitters */ +-}; +- +-/* PIE */ +-enum { +- TCA_PIE_UNSPEC, +- TCA_PIE_TARGET, +- TCA_PIE_LIMIT, +- TCA_PIE_TUPDATE, +- TCA_PIE_ALPHA, +- TCA_PIE_BETA, +- TCA_PIE_ECN, +- TCA_PIE_BYTEMODE, +- __TCA_PIE_MAX +-}; +-#define TCA_PIE_MAX (__TCA_PIE_MAX - 1) +- +-struct tc_pie_xstats { +- __u32 prob; /* current probability */ +- __u32 delay; /* current delay in ms */ +- __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ +- __u32 packets_in; /* total number of packets enqueued */ +- __u32 dropped; /* packets dropped due to pie_action */ +- __u32 overlimit; /* dropped due to lack of space in queue */ +- __u32 maxq; /* maximum queue size */ +- __u32 ecn_mark; /* packets marked with ecn*/ +-}; +-#endif +diff --git a/include/linux/posix_types.h b/include/linux/posix_types.h +deleted file mode 100644 +index 988f76e..0000000 +--- a/include/linux/posix_types.h ++++ /dev/null +@@ -1,37 +0,0 @@ +-#ifndef _LINUX_POSIX_TYPES_H +-#define _LINUX_POSIX_TYPES_H +- +-#include +- +-/* +- * This allows for 1024 file descriptors: if NR_OPEN is ever grown +- * beyond that you'll have to change this too. But 1024 fd's seem to be +- * enough even for such "real" unices like OSF/1, so hopefully this is +- * one limit that doesn't have to be changed [again]. +- * +- * Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in +- * (and thus ) - but this is a more logical +- * place for them. Solved by having dummy defines in . +- */ +- +-/* +- * This macro may have been defined in . But we always +- * use the one here. +- */ +-#undef __FD_SETSIZE +-#define __FD_SETSIZE 1024 +- +-typedef struct { +- unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))]; +-} __kernel_fd_set; +- +-/* Type of a signal handler. */ +-typedef void (*__kernel_sighandler_t)(int); +- +-/* Type of a SYSV IPC key. */ +-typedef int __kernel_key_t; +-typedef int __kernel_mqd_t; +- +-#include +- +-#endif /* _LINUX_POSIX_TYPES_H */ +diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h +deleted file mode 100644 +index 813e9e0..0000000 +--- a/include/linux/rtnetlink.h ++++ /dev/null +@@ -1,718 +0,0 @@ +-#ifndef __LINUX_RTNETLINK_H +-#define __LINUX_RTNETLINK_H +- +-#include +-#include +-#include +-#include +-#include +- +-/* rtnetlink families. Values up to 127 are reserved for real address +- * families, values above 128 may be used arbitrarily. +- */ +-#define RTNL_FAMILY_IPMR 128 +-#define RTNL_FAMILY_IP6MR 129 +-#define RTNL_FAMILY_MAX 129 +- +-/**** +- * Routing/neighbour discovery messages. +- ****/ +- +-/* Types of messages */ +- +-enum { +- RTM_BASE = 16, +-#define RTM_BASE RTM_BASE +- +- RTM_NEWLINK = 16, +-#define RTM_NEWLINK RTM_NEWLINK +- RTM_DELLINK, +-#define RTM_DELLINK RTM_DELLINK +- RTM_GETLINK, +-#define RTM_GETLINK RTM_GETLINK +- RTM_SETLINK, +-#define RTM_SETLINK RTM_SETLINK +- +- RTM_NEWADDR = 20, +-#define RTM_NEWADDR RTM_NEWADDR +- RTM_DELADDR, +-#define RTM_DELADDR RTM_DELADDR +- RTM_GETADDR, +-#define RTM_GETADDR RTM_GETADDR +- +- RTM_NEWROUTE = 24, +-#define RTM_NEWROUTE RTM_NEWROUTE +- RTM_DELROUTE, +-#define RTM_DELROUTE RTM_DELROUTE +- RTM_GETROUTE, +-#define RTM_GETROUTE RTM_GETROUTE +- +- RTM_NEWNEIGH = 28, +-#define RTM_NEWNEIGH RTM_NEWNEIGH +- RTM_DELNEIGH, +-#define RTM_DELNEIGH RTM_DELNEIGH +- RTM_GETNEIGH, +-#define RTM_GETNEIGH RTM_GETNEIGH +- +- RTM_NEWRULE = 32, +-#define RTM_NEWRULE RTM_NEWRULE +- RTM_DELRULE, +-#define RTM_DELRULE RTM_DELRULE +- RTM_GETRULE, +-#define RTM_GETRULE RTM_GETRULE +- +- RTM_NEWQDISC = 36, +-#define RTM_NEWQDISC RTM_NEWQDISC +- RTM_DELQDISC, +-#define RTM_DELQDISC RTM_DELQDISC +- RTM_GETQDISC, +-#define RTM_GETQDISC RTM_GETQDISC +- +- RTM_NEWTCLASS = 40, +-#define RTM_NEWTCLASS RTM_NEWTCLASS +- RTM_DELTCLASS, +-#define RTM_DELTCLASS RTM_DELTCLASS +- RTM_GETTCLASS, +-#define RTM_GETTCLASS RTM_GETTCLASS +- +- RTM_NEWTFILTER = 44, +-#define RTM_NEWTFILTER RTM_NEWTFILTER +- RTM_DELTFILTER, +-#define RTM_DELTFILTER RTM_DELTFILTER +- RTM_GETTFILTER, +-#define RTM_GETTFILTER RTM_GETTFILTER +- +- RTM_NEWACTION = 48, +-#define RTM_NEWACTION RTM_NEWACTION +- RTM_DELACTION, +-#define RTM_DELACTION RTM_DELACTION +- RTM_GETACTION, +-#define RTM_GETACTION RTM_GETACTION +- +- RTM_NEWPREFIX = 52, +-#define RTM_NEWPREFIX RTM_NEWPREFIX +- +- RTM_GETMULTICAST = 58, +-#define RTM_GETMULTICAST RTM_GETMULTICAST +- +- RTM_GETANYCAST = 62, +-#define RTM_GETANYCAST RTM_GETANYCAST +- +- RTM_NEWNEIGHTBL = 64, +-#define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL +- RTM_GETNEIGHTBL = 66, +-#define RTM_GETNEIGHTBL RTM_GETNEIGHTBL +- RTM_SETNEIGHTBL, +-#define RTM_SETNEIGHTBL RTM_SETNEIGHTBL +- +- RTM_NEWNDUSEROPT = 68, +-#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT +- +- RTM_NEWADDRLABEL = 72, +-#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL +- RTM_DELADDRLABEL, +-#define RTM_DELADDRLABEL RTM_DELADDRLABEL +- RTM_GETADDRLABEL, +-#define RTM_GETADDRLABEL RTM_GETADDRLABEL +- +- RTM_GETDCB = 78, +-#define RTM_GETDCB RTM_GETDCB +- RTM_SETDCB, +-#define RTM_SETDCB RTM_SETDCB +- +- RTM_NEWNETCONF = 80, +-#define RTM_NEWNETCONF RTM_NEWNETCONF +- RTM_DELNETCONF, +-#define RTM_DELNETCONF RTM_DELNETCONF +- RTM_GETNETCONF = 82, +-#define RTM_GETNETCONF RTM_GETNETCONF +- +- RTM_NEWMDB = 84, +-#define RTM_NEWMDB RTM_NEWMDB +- RTM_DELMDB = 85, +-#define RTM_DELMDB RTM_DELMDB +- RTM_GETMDB = 86, +-#define RTM_GETMDB RTM_GETMDB +- +- RTM_NEWNSID = 88, +-#define RTM_NEWNSID RTM_NEWNSID +- RTM_DELNSID = 89, +-#define RTM_DELNSID RTM_DELNSID +- RTM_GETNSID = 90, +-#define RTM_GETNSID RTM_GETNSID +- +- RTM_NEWSTATS = 92, +-#define RTM_NEWSTATS RTM_NEWSTATS +- RTM_GETSTATS = 94, +-#define RTM_GETSTATS RTM_GETSTATS +- +- RTM_NEWCACHEREPORT = 96, +-#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT +- +- __RTM_MAX, +-#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) +-}; +- +-#define RTM_NR_MSGTYPES (RTM_MAX + 1 - RTM_BASE) +-#define RTM_NR_FAMILIES (RTM_NR_MSGTYPES >> 2) +-#define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2) +- +-/* +- Generic structure for encapsulation of optional route information. +- It is reminiscent of sockaddr, but with sa_family replaced +- with attribute type. +- */ +- +-struct rtattr { +- unsigned short rta_len; +- unsigned short rta_type; +-}; +- +-/* Macros to handle rtattributes */ +- +-#define RTA_ALIGNTO 4U +-#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) +-#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \ +- (rta)->rta_len >= sizeof(struct rtattr) && \ +- (rta)->rta_len <= (len)) +-#define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), \ +- (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len))) +-#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len)) +-#define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len)) +-#define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0))) +-#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0)) +- +- +- +- +-/****************************************************************************** +- * Definitions used in routing table administration. +- ****/ +- +-struct rtmsg { +- unsigned char rtm_family; +- unsigned char rtm_dst_len; +- unsigned char rtm_src_len; +- unsigned char rtm_tos; +- +- unsigned char rtm_table; /* Routing table id */ +- unsigned char rtm_protocol; /* Routing protocol; see below */ +- unsigned char rtm_scope; /* See below */ +- unsigned char rtm_type; /* See below */ +- +- unsigned rtm_flags; +-}; +- +-/* rtm_type */ +- +-enum { +- RTN_UNSPEC, +- RTN_UNICAST, /* Gateway or direct route */ +- RTN_LOCAL, /* Accept locally */ +- RTN_BROADCAST, /* Accept locally as broadcast, +- send as broadcast */ +- RTN_ANYCAST, /* Accept locally as broadcast, +- but send as unicast */ +- RTN_MULTICAST, /* Multicast route */ +- RTN_BLACKHOLE, /* Drop */ +- RTN_UNREACHABLE, /* Destination is unreachable */ +- RTN_PROHIBIT, /* Administratively prohibited */ +- RTN_THROW, /* Not in this table */ +- RTN_NAT, /* Translate this address */ +- RTN_XRESOLVE, /* Use external resolver */ +- __RTN_MAX +-}; +- +-#define RTN_MAX (__RTN_MAX - 1) +- +- +-/* rtm_protocol */ +- +-#define RTPROT_UNSPEC 0 +-#define RTPROT_REDIRECT 1 /* Route installed by ICMP redirects; +- not used by current IPv4 */ +-#define RTPROT_KERNEL 2 /* Route installed by kernel */ +-#define RTPROT_BOOT 3 /* Route installed during boot */ +-#define RTPROT_STATIC 4 /* Route installed by administrator */ +- +-/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel; +- they are just passed from user and back as is. +- It will be used by hypothetical multiple routing daemons. +- Note that protocol values should be standardized in order to +- avoid conflicts. +- */ +- +-#define RTPROT_GATED 8 /* Apparently, GateD */ +-#define RTPROT_RA 9 /* RDISC/ND router advertisements */ +-#define RTPROT_MRT 10 /* Merit MRT */ +-#define RTPROT_ZEBRA 11 /* Zebra */ +-#define RTPROT_BIRD 12 /* BIRD */ +-#define RTPROT_DNROUTED 13 /* DECnet routing daemon */ +-#define RTPROT_XORP 14 /* XORP */ +-#define RTPROT_NTK 15 /* Netsukuku */ +-#define RTPROT_DHCP 16 /* DHCP client */ +-#define RTPROT_MROUTED 17 /* Multicast daemon */ +-#define RTPROT_BABEL 42 /* Babel daemon */ +- +-/* rtm_scope +- +- Really it is not scope, but sort of distance to the destination. +- NOWHERE are reserved for not existing destinations, HOST is our +- local addresses, LINK are destinations, located on directly attached +- link and UNIVERSE is everywhere in the Universe. +- +- Intermediate values are also possible f.e. interior routes +- could be assigned a value between UNIVERSE and LINK. +-*/ +- +-enum rt_scope_t { +- RT_SCOPE_UNIVERSE=0, +-/* User defined values */ +- RT_SCOPE_SITE=200, +- RT_SCOPE_LINK=253, +- RT_SCOPE_HOST=254, +- RT_SCOPE_NOWHERE=255 +-}; +- +-/* rtm_flags */ +- +-#define RTM_F_NOTIFY 0x100 /* Notify user of route change */ +-#define RTM_F_CLONED 0x200 /* This route is cloned */ +-#define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */ +-#define RTM_F_PREFIX 0x800 /* Prefix addresses */ +-#define RTM_F_LOOKUP_TABLE 0x1000 /* set rtm_table to FIB lookup result */ +-#define RTM_F_FIB_MATCH 0x2000 /* return full fib lookup match */ +- +-/* Reserved table identifiers */ +- +-enum rt_class_t { +- RT_TABLE_UNSPEC=0, +-/* User defined values */ +- RT_TABLE_COMPAT=252, +- RT_TABLE_DEFAULT=253, +- RT_TABLE_MAIN=254, +- RT_TABLE_LOCAL=255, +- RT_TABLE_MAX=0xFFFFFFFF +-}; +- +- +-/* Routing message attributes */ +- +-enum rtattr_type_t { +- RTA_UNSPEC, +- RTA_DST, +- RTA_SRC, +- RTA_IIF, +- RTA_OIF, +- RTA_GATEWAY, +- RTA_PRIORITY, +- RTA_PREFSRC, +- RTA_METRICS, +- RTA_MULTIPATH, +- RTA_PROTOINFO, /* no longer used */ +- RTA_FLOW, +- RTA_CACHEINFO, +- RTA_SESSION, /* no longer used */ +- RTA_MP_ALGO, /* no longer used */ +- RTA_TABLE, +- RTA_MARK, +- RTA_MFC_STATS, +- RTA_VIA, +- RTA_NEWDST, +- RTA_PREF, +- RTA_ENCAP_TYPE, +- RTA_ENCAP, +- RTA_EXPIRES, +- RTA_PAD, +- RTA_UID, +- RTA_TTL_PROPAGATE, +- __RTA_MAX +-}; +- +-#define RTA_MAX (__RTA_MAX - 1) +- +-#define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg)))) +-#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg)) +- +-/* RTM_MULTIPATH --- array of struct rtnexthop. +- * +- * "struct rtnexthop" describes all necessary nexthop information, +- * i.e. parameters of path to a destination via this nexthop. +- * +- * At the moment it is impossible to set different prefsrc, mtu, window +- * and rtt for different paths from multipath. +- */ +- +-struct rtnexthop { +- unsigned short rtnh_len; +- unsigned char rtnh_flags; +- unsigned char rtnh_hops; +- int rtnh_ifindex; +-}; +- +-/* rtnh_flags */ +- +-#define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */ +-#define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */ +-#define RTNH_F_ONLINK 4 /* Gateway is forced on link */ +-#define RTNH_F_OFFLOAD 8 /* offloaded route */ +-#define RTNH_F_LINKDOWN 16 /* carrier-down on nexthop */ +-#define RTNH_F_UNRESOLVED 32 /* The entry is unresolved (ipmr) */ +- +-#define RTNH_COMPARE_MASK (RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD) +- +-/* Macros to handle hexthops */ +- +-#define RTNH_ALIGNTO 4 +-#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) ) +-#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \ +- ((int)(rtnh)->rtnh_len) <= (len)) +-#define RTNH_NEXT(rtnh) ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len))) +-#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len)) +-#define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len)) +-#define RTNH_DATA(rtnh) ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0))) +- +-/* RTA_VIA */ +-struct rtvia { +- __kernel_sa_family_t rtvia_family; +- __u8 rtvia_addr[0]; +-}; +- +-/* RTM_CACHEINFO */ +- +-struct rta_cacheinfo { +- __u32 rta_clntref; +- __u32 rta_lastuse; +- __s32 rta_expires; +- __u32 rta_error; +- __u32 rta_used; +- +-#define RTNETLINK_HAVE_PEERINFO 1 +- __u32 rta_id; +- __u32 rta_ts; +- __u32 rta_tsage; +-}; +- +-/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */ +- +-enum { +- RTAX_UNSPEC, +-#define RTAX_UNSPEC RTAX_UNSPEC +- RTAX_LOCK, +-#define RTAX_LOCK RTAX_LOCK +- RTAX_MTU, +-#define RTAX_MTU RTAX_MTU +- RTAX_WINDOW, +-#define RTAX_WINDOW RTAX_WINDOW +- RTAX_RTT, +-#define RTAX_RTT RTAX_RTT +- RTAX_RTTVAR, +-#define RTAX_RTTVAR RTAX_RTTVAR +- RTAX_SSTHRESH, +-#define RTAX_SSTHRESH RTAX_SSTHRESH +- RTAX_CWND, +-#define RTAX_CWND RTAX_CWND +- RTAX_ADVMSS, +-#define RTAX_ADVMSS RTAX_ADVMSS +- RTAX_REORDERING, +-#define RTAX_REORDERING RTAX_REORDERING +- RTAX_HOPLIMIT, +-#define RTAX_HOPLIMIT RTAX_HOPLIMIT +- RTAX_INITCWND, +-#define RTAX_INITCWND RTAX_INITCWND +- RTAX_FEATURES, +-#define RTAX_FEATURES RTAX_FEATURES +- RTAX_RTO_MIN, +-#define RTAX_RTO_MIN RTAX_RTO_MIN +- RTAX_INITRWND, +-#define RTAX_INITRWND RTAX_INITRWND +- RTAX_QUICKACK, +-#define RTAX_QUICKACK RTAX_QUICKACK +- RTAX_CC_ALGO, +-#define RTAX_CC_ALGO RTAX_CC_ALGO +- __RTAX_MAX +-}; +- +-#define RTAX_MAX (__RTAX_MAX - 1) +- +-#define RTAX_FEATURE_ECN (1 << 0) +-#define RTAX_FEATURE_SACK (1 << 1) +-#define RTAX_FEATURE_TIMESTAMP (1 << 2) +-#define RTAX_FEATURE_ALLFRAG (1 << 3) +- +-#define RTAX_FEATURE_MASK (RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \ +- RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG) +- +-struct rta_session { +- __u8 proto; +- __u8 pad1; +- __u16 pad2; +- +- union { +- struct { +- __u16 sport; +- __u16 dport; +- } ports; +- +- struct { +- __u8 type; +- __u8 code; +- __u16 ident; +- } icmpt; +- +- __u32 spi; +- } u; +-}; +- +-struct rta_mfc_stats { +- __u64 mfcs_packets; +- __u64 mfcs_bytes; +- __u64 mfcs_wrong_if; +-}; +- +-/**** +- * General form of address family dependent message. +- ****/ +- +-struct rtgenmsg { +- unsigned char rtgen_family; +-}; +- +-/***************************************************************** +- * Link layer specific messages. +- ****/ +- +-/* struct ifinfomsg +- * passes link level specific information, not dependent +- * on network protocol. +- */ +- +-struct ifinfomsg { +- unsigned char ifi_family; +- unsigned char __ifi_pad; +- unsigned short ifi_type; /* ARPHRD_* */ +- int ifi_index; /* Link index */ +- unsigned ifi_flags; /* IFF_* flags */ +- unsigned ifi_change; /* IFF_* change mask */ +-}; +- +-/******************************************************************** +- * prefix information +- ****/ +- +-struct prefixmsg { +- unsigned char prefix_family; +- unsigned char prefix_pad1; +- unsigned short prefix_pad2; +- int prefix_ifindex; +- unsigned char prefix_type; +- unsigned char prefix_len; +- unsigned char prefix_flags; +- unsigned char prefix_pad3; +-}; +- +-enum +-{ +- PREFIX_UNSPEC, +- PREFIX_ADDRESS, +- PREFIX_CACHEINFO, +- __PREFIX_MAX +-}; +- +-#define PREFIX_MAX (__PREFIX_MAX - 1) +- +-struct prefix_cacheinfo { +- __u32 preferred_time; +- __u32 valid_time; +-}; +- +- +-/***************************************************************** +- * Traffic control messages. +- ****/ +- +-struct tcmsg { +- unsigned char tcm_family; +- unsigned char tcm__pad1; +- unsigned short tcm__pad2; +- int tcm_ifindex; +- __u32 tcm_handle; +- __u32 tcm_parent; +- __u32 tcm_info; +-}; +- +-enum { +- TCA_UNSPEC, +- TCA_KIND, +- TCA_OPTIONS, +- TCA_STATS, +- TCA_XSTATS, +- TCA_RATE, +- TCA_FCNT, +- TCA_STATS2, +- TCA_STAB, +- TCA_PAD, +- TCA_DUMP_INVISIBLE, +- TCA_CHAIN, +- __TCA_MAX +-}; +- +-#define TCA_MAX (__TCA_MAX - 1) +- +-#define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) +-#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) +- +-/******************************************************************** +- * Neighbor Discovery userland options +- ****/ +- +-struct nduseroptmsg { +- unsigned char nduseropt_family; +- unsigned char nduseropt_pad1; +- unsigned short nduseropt_opts_len; /* Total length of options */ +- int nduseropt_ifindex; +- __u8 nduseropt_icmp_type; +- __u8 nduseropt_icmp_code; +- unsigned short nduseropt_pad2; +- unsigned int nduseropt_pad3; +- /* Followed by one or more ND options */ +-}; +- +-enum { +- NDUSEROPT_UNSPEC, +- NDUSEROPT_SRCADDR, +- __NDUSEROPT_MAX +-}; +- +-#define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1) +- +-/* RTnetlink multicast groups - backwards compatibility for userspace */ +-#define RTMGRP_LINK 1 +-#define RTMGRP_NOTIFY 2 +-#define RTMGRP_NEIGH 4 +-#define RTMGRP_TC 8 +- +-#define RTMGRP_IPV4_IFADDR 0x10 +-#define RTMGRP_IPV4_MROUTE 0x20 +-#define RTMGRP_IPV4_ROUTE 0x40 +-#define RTMGRP_IPV4_RULE 0x80 +- +-#define RTMGRP_IPV6_IFADDR 0x100 +-#define RTMGRP_IPV6_MROUTE 0x200 +-#define RTMGRP_IPV6_ROUTE 0x400 +-#define RTMGRP_IPV6_IFINFO 0x800 +- +-#define RTMGRP_DECnet_IFADDR 0x1000 +-#define RTMGRP_DECnet_ROUTE 0x4000 +- +-#define RTMGRP_IPV6_PREFIX 0x20000 +- +-/* RTnetlink multicast groups */ +-enum rtnetlink_groups { +- RTNLGRP_NONE, +-#define RTNLGRP_NONE RTNLGRP_NONE +- RTNLGRP_LINK, +-#define RTNLGRP_LINK RTNLGRP_LINK +- RTNLGRP_NOTIFY, +-#define RTNLGRP_NOTIFY RTNLGRP_NOTIFY +- RTNLGRP_NEIGH, +-#define RTNLGRP_NEIGH RTNLGRP_NEIGH +- RTNLGRP_TC, +-#define RTNLGRP_TC RTNLGRP_TC +- RTNLGRP_IPV4_IFADDR, +-#define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR +- RTNLGRP_IPV4_MROUTE, +-#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE +- RTNLGRP_IPV4_ROUTE, +-#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE +- RTNLGRP_IPV4_RULE, +-#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE +- RTNLGRP_IPV6_IFADDR, +-#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR +- RTNLGRP_IPV6_MROUTE, +-#define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE +- RTNLGRP_IPV6_ROUTE, +-#define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE +- RTNLGRP_IPV6_IFINFO, +-#define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO +- RTNLGRP_DECnet_IFADDR, +-#define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR +- RTNLGRP_NOP2, +- RTNLGRP_DECnet_ROUTE, +-#define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE +- RTNLGRP_DECnet_RULE, +-#define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE +- RTNLGRP_NOP4, +- RTNLGRP_IPV6_PREFIX, +-#define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX +- RTNLGRP_IPV6_RULE, +-#define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE +- RTNLGRP_ND_USEROPT, +-#define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT +- RTNLGRP_PHONET_IFADDR, +-#define RTNLGRP_PHONET_IFADDR RTNLGRP_PHONET_IFADDR +- RTNLGRP_PHONET_ROUTE, +-#define RTNLGRP_PHONET_ROUTE RTNLGRP_PHONET_ROUTE +- RTNLGRP_DCB, +-#define RTNLGRP_DCB RTNLGRP_DCB +- RTNLGRP_IPV4_NETCONF, +-#define RTNLGRP_IPV4_NETCONF RTNLGRP_IPV4_NETCONF +- RTNLGRP_IPV6_NETCONF, +-#define RTNLGRP_IPV6_NETCONF RTNLGRP_IPV6_NETCONF +- RTNLGRP_MDB, +-#define RTNLGRP_MDB RTNLGRP_MDB +- RTNLGRP_MPLS_ROUTE, +-#define RTNLGRP_MPLS_ROUTE RTNLGRP_MPLS_ROUTE +- RTNLGRP_NSID, +-#define RTNLGRP_NSID RTNLGRP_NSID +- RTNLGRP_MPLS_NETCONF, +-#define RTNLGRP_MPLS_NETCONF RTNLGRP_MPLS_NETCONF +- RTNLGRP_IPV4_MROUTE_R, +-#define RTNLGRP_IPV4_MROUTE_R RTNLGRP_IPV4_MROUTE_R +- RTNLGRP_IPV6_MROUTE_R, +-#define RTNLGRP_IPV6_MROUTE_R RTNLGRP_IPV6_MROUTE_R +- __RTNLGRP_MAX +-}; +-#define RTNLGRP_MAX (__RTNLGRP_MAX - 1) +- +-/* TC action piece */ +-struct tcamsg { +- unsigned char tca_family; +- unsigned char tca__pad1; +- unsigned short tca__pad2; +-}; +- +-enum { +- TCA_ROOT_UNSPEC, +- TCA_ROOT_TAB, +-#define TCA_ACT_TAB TCA_ROOT_TAB +-#define TCAA_MAX TCA_ROOT_TAB +- TCA_ROOT_FLAGS, +- TCA_ROOT_COUNT, +- TCA_ROOT_TIME_DELTA, /* in msecs */ +- __TCA_ROOT_MAX, +-#define TCA_ROOT_MAX (__TCA_ROOT_MAX - 1) +-}; +- +-#define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg)))) +-#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg)) +-/* tcamsg flags stored in attribute TCA_ROOT_FLAGS +- * +- * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO +- * actions in a dump. All dump responses will contain the number of actions +- * being dumped stored in for user app's consumption in TCA_ROOT_COUNT +- * +- */ +-#define TCA_FLAG_LARGE_DUMP_ON (1 << 0) +- +-/* New extended info filters for IFLA_EXT_MASK */ +-#define RTEXT_FILTER_VF (1 << 0) +-#define RTEXT_FILTER_BRVLAN (1 << 1) +-#define RTEXT_FILTER_BRVLAN_COMPRESSED (1 << 2) +-#define RTEXT_FILTER_SKIP_STATS (1 << 3) +- +-/* End of information exported to user level */ +- +- +- +-#endif /* __LINUX_RTNETLINK_H */ +diff --git a/include/linux/sctp.h b/include/linux/sctp.h +deleted file mode 100644 +index fec24c4..0000000 +--- a/include/linux/sctp.h ++++ /dev/null +@@ -1,1085 +0,0 @@ +-/* SCTP kernel implementation +- * (C) Copyright IBM Corp. 2001, 2004 +- * Copyright (c) 1999-2000 Cisco, Inc. +- * Copyright (c) 1999-2001 Motorola, Inc. +- * Copyright (c) 2002 Intel Corp. +- * +- * This file is part of the SCTP kernel implementation +- * +- * This header represents the structures and constants needed to support +- * the SCTP Extension to the Sockets API. +- * +- * This SCTP implementation is free software; +- * you can redistribute it and/or modify it under the terms of +- * the GNU General Public License as published by +- * the Free Software Foundation; either version 2, or (at your option) +- * any later version. +- * +- * This SCTP implementation is distributed in the hope that it +- * will be useful, but WITHOUT ANY WARRANTY; without even the implied +- * ************************ +- * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +- * See the GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with GNU CC; see the file COPYING. If not, see +- * . +- * +- * Please send any bug reports or fixes you make to the +- * email address(es): +- * lksctp developers +- * +- * Or submit a bug report through the following website: +- * http://www.sf.net/projects/lksctp +- * +- * Written or modified by: +- * La Monte H.P. Yarroll +- * R. Stewart +- * K. Morneau +- * Q. Xie +- * Karl Knutson +- * Jon Grimm +- * Daisy Chang +- * Ryan Layer +- * Ardelle Fan +- * Sridhar Samudrala +- * Inaky Perez-Gonzalez +- * Vlad Yasevich +- * +- * Any bugs reported given to us we will try to fix... any fixes shared will +- * be incorporated into the next SCTP release. +- */ +- +-#ifndef _SCTP_H +-#define _SCTP_H +- +-#include +-#include +- +-typedef __s32 sctp_assoc_t; +- +-/* The following symbols come from the Sockets API Extensions for +- * SCTP . +- */ +-#define SCTP_RTOINFO 0 +-#define SCTP_ASSOCINFO 1 +-#define SCTP_INITMSG 2 +-#define SCTP_NODELAY 3 /* Get/set nodelay option. */ +-#define SCTP_AUTOCLOSE 4 +-#define SCTP_SET_PEER_PRIMARY_ADDR 5 +-#define SCTP_PRIMARY_ADDR 6 +-#define SCTP_ADAPTATION_LAYER 7 +-#define SCTP_DISABLE_FRAGMENTS 8 +-#define SCTP_PEER_ADDR_PARAMS 9 +-#define SCTP_DEFAULT_SEND_PARAM 10 +-#define SCTP_EVENTS 11 +-#define SCTP_I_WANT_MAPPED_V4_ADDR 12 /* Turn on/off mapped v4 addresses */ +-#define SCTP_MAXSEG 13 /* Get/set maximum fragment. */ +-#define SCTP_STATUS 14 +-#define SCTP_GET_PEER_ADDR_INFO 15 +-#define SCTP_DELAYED_ACK_TIME 16 +-#define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME +-#define SCTP_DELAYED_SACK SCTP_DELAYED_ACK_TIME +-#define SCTP_CONTEXT 17 +-#define SCTP_FRAGMENT_INTERLEAVE 18 +-#define SCTP_PARTIAL_DELIVERY_POINT 19 /* Set/Get partial delivery point */ +-#define SCTP_MAX_BURST 20 /* Set/Get max burst */ +-#define SCTP_AUTH_CHUNK 21 /* Set only: add a chunk type to authenticate */ +-#define SCTP_HMAC_IDENT 22 +-#define SCTP_AUTH_KEY 23 +-#define SCTP_AUTH_ACTIVE_KEY 24 +-#define SCTP_AUTH_DELETE_KEY 25 +-#define SCTP_PEER_AUTH_CHUNKS 26 /* Read only */ +-#define SCTP_LOCAL_AUTH_CHUNKS 27 /* Read only */ +-#define SCTP_GET_ASSOC_NUMBER 28 /* Read only */ +-#define SCTP_GET_ASSOC_ID_LIST 29 /* Read only */ +-#define SCTP_AUTO_ASCONF 30 +-#define SCTP_PEER_ADDR_THLDS 31 +-#define SCTP_RECVRCVINFO 32 +-#define SCTP_RECVNXTINFO 33 +-#define SCTP_DEFAULT_SNDINFO 34 +- +-/* Internal Socket Options. Some of the sctp library functions are +- * implemented using these socket options. +- */ +-#define SCTP_SOCKOPT_BINDX_ADD 100 /* BINDX requests for adding addrs */ +-#define SCTP_SOCKOPT_BINDX_REM 101 /* BINDX requests for removing addrs. */ +-#define SCTP_SOCKOPT_PEELOFF 102 /* peel off association. */ +-/* Options 104-106 are deprecated and removed. Do not use this space */ +-#define SCTP_SOCKOPT_CONNECTX_OLD 107 /* CONNECTX old requests. */ +-#define SCTP_GET_PEER_ADDRS 108 /* Get all peer address. */ +-#define SCTP_GET_LOCAL_ADDRS 109 /* Get all local address. */ +-#define SCTP_SOCKOPT_CONNECTX 110 /* CONNECTX requests. */ +-#define SCTP_SOCKOPT_CONNECTX3 111 /* CONNECTX requests (updated) */ +-#define SCTP_GET_ASSOC_STATS 112 /* Read only */ +-#define SCTP_PR_SUPPORTED 113 +-#define SCTP_DEFAULT_PRINFO 114 +-#define SCTP_PR_ASSOC_STATUS 115 +-#define SCTP_PR_STREAM_STATUS 116 +-#define SCTP_RECONFIG_SUPPORTED 117 +-#define SCTP_ENABLE_STREAM_RESET 118 +-#define SCTP_RESET_STREAMS 119 +-#define SCTP_RESET_ASSOC 120 +-#define SCTP_ADD_STREAMS 121 +-#define SCTP_SOCKOPT_PEELOFF_FLAGS 122 +- +-/* PR-SCTP policies */ +-#define SCTP_PR_SCTP_NONE 0x0000 +-#define SCTP_PR_SCTP_TTL 0x0010 +-#define SCTP_PR_SCTP_RTX 0x0020 +-#define SCTP_PR_SCTP_PRIO 0x0030 +-#define SCTP_PR_SCTP_MAX SCTP_PR_SCTP_PRIO +-#define SCTP_PR_SCTP_MASK 0x0030 +- +-#define __SCTP_PR_INDEX(x) ((x >> 4) - 1) +-#define SCTP_PR_INDEX(x) __SCTP_PR_INDEX(SCTP_PR_SCTP_ ## x) +- +-#define SCTP_PR_POLICY(x) ((x) & SCTP_PR_SCTP_MASK) +-#define SCTP_PR_SET_POLICY(flags, x) \ +- do { \ +- flags &= ~SCTP_PR_SCTP_MASK; \ +- flags |= x; \ +- } while (0) +- +-#define SCTP_PR_TTL_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_TTL) +-#define SCTP_PR_RTX_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_RTX) +-#define SCTP_PR_PRIO_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_PRIO) +- +-/* For enable stream reset */ +-#define SCTP_ENABLE_RESET_STREAM_REQ 0x01 +-#define SCTP_ENABLE_RESET_ASSOC_REQ 0x02 +-#define SCTP_ENABLE_CHANGE_ASSOC_REQ 0x04 +-#define SCTP_ENABLE_STRRESET_MASK 0x07 +- +-#define SCTP_STREAM_RESET_INCOMING 0x01 +-#define SCTP_STREAM_RESET_OUTGOING 0x02 +- +-/* These are bit fields for msghdr->msg_flags. See section 5.1. */ +-/* On user space Linux, these live in as an enum. */ +-enum sctp_msg_flags { +- MSG_NOTIFICATION = 0x8000, +-#define MSG_NOTIFICATION MSG_NOTIFICATION +-}; +- +-/* 5.3.1 SCTP Initiation Structure (SCTP_INIT) +- * +- * This cmsghdr structure provides information for initializing new +- * SCTP associations with sendmsg(). The SCTP_INITMSG socket option +- * uses this same data structure. This structure is not used for +- * recvmsg(). +- * +- * cmsg_level cmsg_type cmsg_data[] +- * ------------ ------------ ---------------------- +- * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg +- */ +-struct sctp_initmsg { +- __u16 sinit_num_ostreams; +- __u16 sinit_max_instreams; +- __u16 sinit_max_attempts; +- __u16 sinit_max_init_timeo; +-}; +- +-/* 5.3.2 SCTP Header Information Structure (SCTP_SNDRCV) +- * +- * This cmsghdr structure specifies SCTP options for sendmsg() and +- * describes SCTP header information about a received message through +- * recvmsg(). +- * +- * cmsg_level cmsg_type cmsg_data[] +- * ------------ ------------ ---------------------- +- * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo +- */ +-struct sctp_sndrcvinfo { +- __u16 sinfo_stream; +- __u16 sinfo_ssn; +- __u16 sinfo_flags; +- __u32 sinfo_ppid; +- __u32 sinfo_context; +- __u32 sinfo_timetolive; +- __u32 sinfo_tsn; +- __u32 sinfo_cumtsn; +- sctp_assoc_t sinfo_assoc_id; +-}; +- +-/* 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO) +- * +- * This cmsghdr structure specifies SCTP options for sendmsg(). +- * +- * cmsg_level cmsg_type cmsg_data[] +- * ------------ ------------ ------------------- +- * IPPROTO_SCTP SCTP_SNDINFO struct sctp_sndinfo +- */ +-struct sctp_sndinfo { +- __u16 snd_sid; +- __u16 snd_flags; +- __u32 snd_ppid; +- __u32 snd_context; +- sctp_assoc_t snd_assoc_id; +-}; +- +-/* 5.3.5 SCTP Receive Information Structure (SCTP_RCVINFO) +- * +- * This cmsghdr structure describes SCTP receive information +- * about a received message through recvmsg(). +- * +- * cmsg_level cmsg_type cmsg_data[] +- * ------------ ------------ ------------------- +- * IPPROTO_SCTP SCTP_RCVINFO struct sctp_rcvinfo +- */ +-struct sctp_rcvinfo { +- __u16 rcv_sid; +- __u16 rcv_ssn; +- __u16 rcv_flags; +- __u32 rcv_ppid; +- __u32 rcv_tsn; +- __u32 rcv_cumtsn; +- __u32 rcv_context; +- sctp_assoc_t rcv_assoc_id; +-}; +- +-/* 5.3.6 SCTP Next Receive Information Structure (SCTP_NXTINFO) +- * +- * This cmsghdr structure describes SCTP receive information +- * of the next message that will be delivered through recvmsg() +- * if this information is already available when delivering +- * the current message. +- * +- * cmsg_level cmsg_type cmsg_data[] +- * ------------ ------------ ------------------- +- * IPPROTO_SCTP SCTP_NXTINFO struct sctp_nxtinfo +- */ +-struct sctp_nxtinfo { +- __u16 nxt_sid; +- __u16 nxt_flags; +- __u32 nxt_ppid; +- __u32 nxt_length; +- sctp_assoc_t nxt_assoc_id; +-}; +- +-/* +- * sinfo_flags: 16 bits (unsigned integer) +- * +- * This field may contain any of the following flags and is composed of +- * a bitwise OR of these values. +- */ +-enum sctp_sinfo_flags { +- SCTP_UNORDERED = (1 << 0), /* Send/receive message unordered. */ +- SCTP_ADDR_OVER = (1 << 1), /* Override the primary destination. */ +- SCTP_ABORT = (1 << 2), /* Send an ABORT message to the peer. */ +- SCTP_SACK_IMMEDIATELY = (1 << 3), /* SACK should be sent without delay. */ +- SCTP_NOTIFICATION = MSG_NOTIFICATION, /* Next message is not user msg but notification. */ +- SCTP_EOF = MSG_FIN, /* Initiate graceful shutdown process. */ +-}; +- +-typedef union { +- __u8 raw; +- struct sctp_initmsg init; +- struct sctp_sndrcvinfo sndrcv; +-} sctp_cmsg_data_t; +- +-/* These are cmsg_types. */ +-typedef enum sctp_cmsg_type { +- SCTP_INIT, /* 5.2.1 SCTP Initiation Structure */ +-#define SCTP_INIT SCTP_INIT +- SCTP_SNDRCV, /* 5.2.2 SCTP Header Information Structure */ +-#define SCTP_SNDRCV SCTP_SNDRCV +- SCTP_SNDINFO, /* 5.3.4 SCTP Send Information Structure */ +-#define SCTP_SNDINFO SCTP_SNDINFO +- SCTP_RCVINFO, /* 5.3.5 SCTP Receive Information Structure */ +-#define SCTP_RCVINFO SCTP_RCVINFO +- SCTP_NXTINFO, /* 5.3.6 SCTP Next Receive Information Structure */ +-#define SCTP_NXTINFO SCTP_NXTINFO +-} sctp_cmsg_t; +- +-/* +- * 5.3.1.1 SCTP_ASSOC_CHANGE +- * +- * Communication notifications inform the ULP that an SCTP association +- * has either begun or ended. The identifier for a new association is +- * provided by this notificaion. The notification information has the +- * following format: +- * +- */ +-struct sctp_assoc_change { +- __u16 sac_type; +- __u16 sac_flags; +- __u32 sac_length; +- __u16 sac_state; +- __u16 sac_error; +- __u16 sac_outbound_streams; +- __u16 sac_inbound_streams; +- sctp_assoc_t sac_assoc_id; +- __u8 sac_info[0]; +-}; +- +-/* +- * sac_state: 32 bits (signed integer) +- * +- * This field holds one of a number of values that communicate the +- * event that happened to the association. They include: +- * +- * Note: The following state names deviate from the API draft as +- * the names clash too easily with other kernel symbols. +- */ +-enum sctp_sac_state { +- SCTP_COMM_UP, +- SCTP_COMM_LOST, +- SCTP_RESTART, +- SCTP_SHUTDOWN_COMP, +- SCTP_CANT_STR_ASSOC, +-}; +- +-/* +- * 5.3.1.2 SCTP_PEER_ADDR_CHANGE +- * +- * When a destination address on a multi-homed peer encounters a change +- * an interface details event is sent. The information has the +- * following structure: +- */ +-struct sctp_paddr_change { +- __u16 spc_type; +- __u16 spc_flags; +- __u32 spc_length; +- struct sockaddr_storage spc_aaddr; +- int spc_state; +- int spc_error; +- sctp_assoc_t spc_assoc_id; +-} __attribute__((packed, aligned(4))); +- +-/* +- * spc_state: 32 bits (signed integer) +- * +- * This field holds one of a number of values that communicate the +- * event that happened to the address. They include: +- */ +-enum sctp_spc_state { +- SCTP_ADDR_AVAILABLE, +- SCTP_ADDR_UNREACHABLE, +- SCTP_ADDR_REMOVED, +- SCTP_ADDR_ADDED, +- SCTP_ADDR_MADE_PRIM, +- SCTP_ADDR_CONFIRMED, +-}; +- +- +-/* +- * 5.3.1.3 SCTP_REMOTE_ERROR +- * +- * A remote peer may send an Operational Error message to its peer. +- * This message indicates a variety of error conditions on an +- * association. The entire error TLV as it appears on the wire is +- * included in a SCTP_REMOTE_ERROR event. Please refer to the SCTP +- * specification [SCTP] and any extensions for a list of possible +- * error formats. SCTP error TLVs have the format: +- */ +-struct sctp_remote_error { +- __u16 sre_type; +- __u16 sre_flags; +- __u32 sre_length; +- __u16 sre_error; +- sctp_assoc_t sre_assoc_id; +- __u8 sre_data[0]; +-}; +- +- +-/* +- * 5.3.1.4 SCTP_SEND_FAILED +- * +- * If SCTP cannot deliver a message it may return the message as a +- * notification. +- */ +-struct sctp_send_failed { +- __u16 ssf_type; +- __u16 ssf_flags; +- __u32 ssf_length; +- __u32 ssf_error; +- struct sctp_sndrcvinfo ssf_info; +- sctp_assoc_t ssf_assoc_id; +- __u8 ssf_data[0]; +-}; +- +-/* +- * ssf_flags: 16 bits (unsigned integer) +- * +- * The flag value will take one of the following values +- * +- * SCTP_DATA_UNSENT - Indicates that the data was never put on +- * the wire. +- * +- * SCTP_DATA_SENT - Indicates that the data was put on the wire. +- * Note that this does not necessarily mean that the +- * data was (or was not) successfully delivered. +- */ +-enum sctp_ssf_flags { +- SCTP_DATA_UNSENT, +- SCTP_DATA_SENT, +-}; +- +-/* +- * 5.3.1.5 SCTP_SHUTDOWN_EVENT +- * +- * When a peer sends a SHUTDOWN, SCTP delivers this notification to +- * inform the application that it should cease sending data. +- */ +-struct sctp_shutdown_event { +- __u16 sse_type; +- __u16 sse_flags; +- __u32 sse_length; +- sctp_assoc_t sse_assoc_id; +-}; +- +-/* +- * 5.3.1.6 SCTP_ADAPTATION_INDICATION +- * +- * When a peer sends a Adaptation Layer Indication parameter , SCTP +- * delivers this notification to inform the application +- * that of the peers requested adaptation layer. +- */ +-struct sctp_adaptation_event { +- __u16 sai_type; +- __u16 sai_flags; +- __u32 sai_length; +- __u32 sai_adaptation_ind; +- sctp_assoc_t sai_assoc_id; +-}; +- +-/* +- * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT +- * +- * When a receiver is engaged in a partial delivery of a +- * message this notification will be used to indicate +- * various events. +- */ +-struct sctp_pdapi_event { +- __u16 pdapi_type; +- __u16 pdapi_flags; +- __u32 pdapi_length; +- __u32 pdapi_indication; +- sctp_assoc_t pdapi_assoc_id; +-}; +- +-enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, }; +- +-/* +- * 5.3.1.8. SCTP_AUTHENTICATION_EVENT +- * +- * When a receiver is using authentication this message will provide +- * notifications regarding new keys being made active as well as errors. +- */ +-struct sctp_authkey_event { +- __u16 auth_type; +- __u16 auth_flags; +- __u32 auth_length; +- __u16 auth_keynumber; +- __u16 auth_altkeynumber; +- __u32 auth_indication; +- sctp_assoc_t auth_assoc_id; +-}; +- +-enum { SCTP_AUTH_NEWKEY = 0, }; +- +-/* +- * 6.1.9. SCTP_SENDER_DRY_EVENT +- * +- * When the SCTP stack has no more user data to send or retransmit, this +- * notification is given to the user. Also, at the time when a user app +- * subscribes to this event, if there is no data to be sent or +- * retransmit, the stack will immediately send up this notification. +- */ +-struct sctp_sender_dry_event { +- __u16 sender_dry_type; +- __u16 sender_dry_flags; +- __u32 sender_dry_length; +- sctp_assoc_t sender_dry_assoc_id; +-}; +- +-#define SCTP_STREAM_RESET_INCOMING_SSN 0x0001 +-#define SCTP_STREAM_RESET_OUTGOING_SSN 0x0002 +-#define SCTP_STREAM_RESET_DENIED 0x0004 +-#define SCTP_STREAM_RESET_FAILED 0x0008 +-struct sctp_stream_reset_event { +- __u16 strreset_type; +- __u16 strreset_flags; +- __u32 strreset_length; +- sctp_assoc_t strreset_assoc_id; +- __u16 strreset_stream_list[]; +-}; +- +-#define SCTP_ASSOC_RESET_DENIED 0x0004 +-#define SCTP_ASSOC_RESET_FAILED 0x0008 +-struct sctp_assoc_reset_event { +- __u16 assocreset_type; +- __u16 assocreset_flags; +- __u32 assocreset_length; +- sctp_assoc_t assocreset_assoc_id; +- __u32 assocreset_local_tsn; +- __u32 assocreset_remote_tsn; +-}; +- +-#define SCTP_ASSOC_CHANGE_DENIED 0x0004 +-#define SCTP_ASSOC_CHANGE_FAILED 0x0008 +-struct sctp_stream_change_event { +- __u16 strchange_type; +- __u16 strchange_flags; +- __u32 strchange_length; +- sctp_assoc_t strchange_assoc_id; +- __u16 strchange_instrms; +- __u16 strchange_outstrms; +-}; +- +-/* +- * Described in Section 7.3 +- * Ancillary Data and Notification Interest Options +- */ +-struct sctp_event_subscribe { +- __u8 sctp_data_io_event; +- __u8 sctp_association_event; +- __u8 sctp_address_event; +- __u8 sctp_send_failure_event; +- __u8 sctp_peer_error_event; +- __u8 sctp_shutdown_event; +- __u8 sctp_partial_delivery_event; +- __u8 sctp_adaptation_layer_event; +- __u8 sctp_authentication_event; +- __u8 sctp_sender_dry_event; +- __u8 sctp_stream_reset_event; +- __u8 sctp_assoc_reset_event; +- __u8 sctp_stream_change_event; +-}; +- +-/* +- * 5.3.1 SCTP Notification Structure +- * +- * The notification structure is defined as the union of all +- * notification types. +- * +- */ +-union sctp_notification { +- struct { +- __u16 sn_type; /* Notification type. */ +- __u16 sn_flags; +- __u32 sn_length; +- } sn_header; +- struct sctp_assoc_change sn_assoc_change; +- struct sctp_paddr_change sn_paddr_change; +- struct sctp_remote_error sn_remote_error; +- struct sctp_send_failed sn_send_failed; +- struct sctp_shutdown_event sn_shutdown_event; +- struct sctp_adaptation_event sn_adaptation_event; +- struct sctp_pdapi_event sn_pdapi_event; +- struct sctp_authkey_event sn_authkey_event; +- struct sctp_sender_dry_event sn_sender_dry_event; +- struct sctp_stream_reset_event sn_strreset_event; +- struct sctp_assoc_reset_event sn_assocreset_event; +- struct sctp_stream_change_event sn_strchange_event; +-}; +- +-/* Section 5.3.1 +- * All standard values for sn_type flags are greater than 2^15. +- * Values from 2^15 and down are reserved. +- */ +- +-enum sctp_sn_type { +- SCTP_SN_TYPE_BASE = (1<<15), +- SCTP_ASSOC_CHANGE, +-#define SCTP_ASSOC_CHANGE SCTP_ASSOC_CHANGE +- SCTP_PEER_ADDR_CHANGE, +-#define SCTP_PEER_ADDR_CHANGE SCTP_PEER_ADDR_CHANGE +- SCTP_SEND_FAILED, +-#define SCTP_SEND_FAILED SCTP_SEND_FAILED +- SCTP_REMOTE_ERROR, +-#define SCTP_REMOTE_ERROR SCTP_REMOTE_ERROR +- SCTP_SHUTDOWN_EVENT, +-#define SCTP_SHUTDOWN_EVENT SCTP_SHUTDOWN_EVENT +- SCTP_PARTIAL_DELIVERY_EVENT, +-#define SCTP_PARTIAL_DELIVERY_EVENT SCTP_PARTIAL_DELIVERY_EVENT +- SCTP_ADAPTATION_INDICATION, +-#define SCTP_ADAPTATION_INDICATION SCTP_ADAPTATION_INDICATION +- SCTP_AUTHENTICATION_EVENT, +-#define SCTP_AUTHENTICATION_INDICATION SCTP_AUTHENTICATION_EVENT +- SCTP_SENDER_DRY_EVENT, +-#define SCTP_SENDER_DRY_EVENT SCTP_SENDER_DRY_EVENT +- SCTP_STREAM_RESET_EVENT, +-#define SCTP_STREAM_RESET_EVENT SCTP_STREAM_RESET_EVENT +- SCTP_ASSOC_RESET_EVENT, +-#define SCTP_ASSOC_RESET_EVENT SCTP_ASSOC_RESET_EVENT +- SCTP_STREAM_CHANGE_EVENT, +-#define SCTP_STREAM_CHANGE_EVENT SCTP_STREAM_CHANGE_EVENT +-}; +- +-/* Notification error codes used to fill up the error fields in some +- * notifications. +- * SCTP_PEER_ADDRESS_CHAGE : spc_error +- * SCTP_ASSOC_CHANGE : sac_error +- * These names should be potentially included in the draft 04 of the SCTP +- * sockets API specification. +- */ +-typedef enum sctp_sn_error { +- SCTP_FAILED_THRESHOLD, +- SCTP_RECEIVED_SACK, +- SCTP_HEARTBEAT_SUCCESS, +- SCTP_RESPONSE_TO_USER_REQ, +- SCTP_INTERNAL_ERROR, +- SCTP_SHUTDOWN_GUARD_EXPIRES, +- SCTP_PEER_FAULTY, +-} sctp_sn_error_t; +- +-/* +- * 7.1.1 Retransmission Timeout Parameters (SCTP_RTOINFO) +- * +- * The protocol parameters used to initialize and bound retransmission +- * timeout (RTO) are tunable. See [SCTP] for more information on how +- * these parameters are used in RTO calculation. +- */ +-struct sctp_rtoinfo { +- sctp_assoc_t srto_assoc_id; +- __u32 srto_initial; +- __u32 srto_max; +- __u32 srto_min; +-}; +- +-/* +- * 7.1.2 Association Parameters (SCTP_ASSOCINFO) +- * +- * This option is used to both examine and set various association and +- * endpoint parameters. +- */ +-struct sctp_assocparams { +- sctp_assoc_t sasoc_assoc_id; +- __u16 sasoc_asocmaxrxt; +- __u16 sasoc_number_peer_destinations; +- __u32 sasoc_peer_rwnd; +- __u32 sasoc_local_rwnd; +- __u32 sasoc_cookie_life; +-}; +- +-/* +- * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) +- * +- * Requests that the peer mark the enclosed address as the association +- * primary. The enclosed address must be one of the association's +- * locally bound addresses. The following structure is used to make a +- * set primary request: +- */ +-struct sctp_setpeerprim { +- sctp_assoc_t sspp_assoc_id; +- struct sockaddr_storage sspp_addr; +-} __attribute__((packed, aligned(4))); +- +-/* +- * 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR) +- * +- * Requests that the local SCTP stack use the enclosed peer address as +- * the association primary. The enclosed address must be one of the +- * association peer's addresses. The following structure is used to +- * make a set peer primary request: +- */ +-struct sctp_prim { +- sctp_assoc_t ssp_assoc_id; +- struct sockaddr_storage ssp_addr; +-} __attribute__((packed, aligned(4))); +- +-/* For backward compatibility use, define the old name too */ +-#define sctp_setprim sctp_prim +- +-/* +- * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER) +- * +- * Requests that the local endpoint set the specified Adaptation Layer +- * Indication parameter for all future INIT and INIT-ACK exchanges. +- */ +-struct sctp_setadaptation { +- __u32 ssb_adaptation_ind; +-}; +- +-/* +- * 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS) +- * +- * Applications can enable or disable heartbeats for any peer address +- * of an association, modify an address's heartbeat interval, force a +- * heartbeat to be sent immediately, and adjust the address's maximum +- * number of retransmissions sent before an address is considered +- * unreachable. The following structure is used to access and modify an +- * address's parameters: +- */ +-enum sctp_spp_flags { +- SPP_HB_ENABLE = 1<<0, /*Enable heartbeats*/ +- SPP_HB_DISABLE = 1<<1, /*Disable heartbeats*/ +- SPP_HB = SPP_HB_ENABLE | SPP_HB_DISABLE, +- SPP_HB_DEMAND = 1<<2, /*Send heartbeat immediately*/ +- SPP_PMTUD_ENABLE = 1<<3, /*Enable PMTU discovery*/ +- SPP_PMTUD_DISABLE = 1<<4, /*Disable PMTU discovery*/ +- SPP_PMTUD = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE, +- SPP_SACKDELAY_ENABLE = 1<<5, /*Enable SACK*/ +- SPP_SACKDELAY_DISABLE = 1<<6, /*Disable SACK*/ +- SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE, +- SPP_HB_TIME_IS_ZERO = 1<<7, /* Set HB delay to 0 */ +-}; +- +-struct sctp_paddrparams { +- sctp_assoc_t spp_assoc_id; +- struct sockaddr_storage spp_address; +- __u32 spp_hbinterval; +- __u16 spp_pathmaxrxt; +- __u32 spp_pathmtu; +- __u32 spp_sackdelay; +- __u32 spp_flags; +-} __attribute__((packed, aligned(4))); +- +-/* +- * 7.1.18. Add a chunk that must be authenticated (SCTP_AUTH_CHUNK) +- * +- * This set option adds a chunk type that the user is requesting to be +- * received only in an authenticated way. Changes to the list of chunks +- * will only effect future associations on the socket. +- */ +-struct sctp_authchunk { +- __u8 sauth_chunk; +-}; +- +-/* +- * 7.1.19. Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT) +- * +- * This option gets or sets the list of HMAC algorithms that the local +- * endpoint requires the peer to use. +- */ +-/* This here is only used by user space as is. It might not be a good idea +- * to export/reveal the whole structure with reserved fields etc. +- */ +-enum { +- SCTP_AUTH_HMAC_ID_SHA1 = 1, +- SCTP_AUTH_HMAC_ID_SHA256 = 3, +-}; +- +-struct sctp_hmacalgo { +- __u32 shmac_num_idents; +- __u16 shmac_idents[]; +-}; +- +-/* Sadly, user and kernel space have different names for +- * this structure member, so this is to not break anything. +- */ +-#define shmac_number_of_idents shmac_num_idents +- +-/* +- * 7.1.20. Set a shared key (SCTP_AUTH_KEY) +- * +- * This option will set a shared secret key which is used to build an +- * association shared key. +- */ +-struct sctp_authkey { +- sctp_assoc_t sca_assoc_id; +- __u16 sca_keynumber; +- __u16 sca_keylength; +- __u8 sca_key[]; +-}; +- +-/* +- * 7.1.21. Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY) +- * +- * This option will get or set the active shared key to be used to build +- * the association shared key. +- */ +- +-struct sctp_authkeyid { +- sctp_assoc_t scact_assoc_id; +- __u16 scact_keynumber; +-}; +- +- +-/* +- * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK) +- * +- * This option will effect the way delayed acks are performed. This +- * option allows you to get or set the delayed ack time, in +- * milliseconds. It also allows changing the delayed ack frequency. +- * Changing the frequency to 1 disables the delayed sack algorithm. If +- * the assoc_id is 0, then this sets or gets the endpoints default +- * values. If the assoc_id field is non-zero, then the set or get +- * effects the specified association for the one to many model (the +- * assoc_id field is ignored by the one to one model). Note that if +- * sack_delay or sack_freq are 0 when setting this option, then the +- * current values will remain unchanged. +- */ +-struct sctp_sack_info { +- sctp_assoc_t sack_assoc_id; +- uint32_t sack_delay; +- uint32_t sack_freq; +-}; +- +-struct sctp_assoc_value { +- sctp_assoc_t assoc_id; +- uint32_t assoc_value; +-}; +- +-/* +- * 7.2.2 Peer Address Information +- * +- * Applications can retrieve information about a specific peer address +- * of an association, including its reachability state, congestion +- * window, and retransmission timer values. This information is +- * read-only. The following structure is used to access this +- * information: +- */ +-struct sctp_paddrinfo { +- sctp_assoc_t spinfo_assoc_id; +- struct sockaddr_storage spinfo_address; +- __s32 spinfo_state; +- __u32 spinfo_cwnd; +- __u32 spinfo_srtt; +- __u32 spinfo_rto; +- __u32 spinfo_mtu; +-} __attribute__((packed, aligned(4))); +- +-/* Peer addresses's state. */ +-/* UNKNOWN: Peer address passed by the upper layer in sendmsg or connect[x] +- * calls. +- * UNCONFIRMED: Peer address received in INIT/INIT-ACK address parameters. +- * Not yet confirmed by a heartbeat and not available for data +- * transfers. +- * ACTIVE : Peer address confirmed, active and available for data transfers. +- * INACTIVE: Peer address inactive and not available for data transfers. +- */ +-enum sctp_spinfo_state { +- SCTP_INACTIVE, +- SCTP_PF, +- SCTP_ACTIVE, +- SCTP_UNCONFIRMED, +- SCTP_UNKNOWN = 0xffff /* Value used for transport state unknown */ +-}; +- +-/* +- * 7.2.1 Association Status (SCTP_STATUS) +- * +- * Applications can retrieve current status information about an +- * association, including association state, peer receiver window size, +- * number of unacked data chunks, and number of data chunks pending +- * receipt. This information is read-only. The following structure is +- * used to access this information: +- */ +-struct sctp_status { +- sctp_assoc_t sstat_assoc_id; +- __s32 sstat_state; +- __u32 sstat_rwnd; +- __u16 sstat_unackdata; +- __u16 sstat_penddata; +- __u16 sstat_instrms; +- __u16 sstat_outstrms; +- __u32 sstat_fragmentation_point; +- struct sctp_paddrinfo sstat_primary; +-}; +- +-/* +- * 7.2.3. Get the list of chunks the peer requires to be authenticated +- * (SCTP_PEER_AUTH_CHUNKS) +- * +- * This option gets a list of chunks for a specified association that +- * the peer requires to be received authenticated only. +- */ +-struct sctp_authchunks { +- sctp_assoc_t gauth_assoc_id; +- __u32 gauth_number_of_chunks; +- uint8_t gauth_chunks[]; +-}; +- +-/* The broken spelling has been released already in lksctp-tools header, +- * so don't break anyone, now that it's fixed. +- */ +-#define guth_number_of_chunks gauth_number_of_chunks +- +-/* Association states. */ +-enum sctp_sstat_state { +- SCTP_EMPTY = 0, +- SCTP_CLOSED = 1, +- SCTP_COOKIE_WAIT = 2, +- SCTP_COOKIE_ECHOED = 3, +- SCTP_ESTABLISHED = 4, +- SCTP_SHUTDOWN_PENDING = 5, +- SCTP_SHUTDOWN_SENT = 6, +- SCTP_SHUTDOWN_RECEIVED = 7, +- SCTP_SHUTDOWN_ACK_SENT = 8, +-}; +- +-/* +- * 8.2.6. Get the Current Identifiers of Associations +- * (SCTP_GET_ASSOC_ID_LIST) +- * +- * This option gets the current list of SCTP association identifiers of +- * the SCTP associations handled by a one-to-many style socket. +- */ +-struct sctp_assoc_ids { +- __u32 gaids_number_of_ids; +- sctp_assoc_t gaids_assoc_id[]; +-}; +- +-/* +- * 8.3, 8.5 get all peer/local addresses in an association. +- * This parameter struct is used by SCTP_GET_PEER_ADDRS and +- * SCTP_GET_LOCAL_ADDRS socket options used internally to implement +- * sctp_getpaddrs() and sctp_getladdrs() API. +- */ +-struct sctp_getaddrs_old { +- sctp_assoc_t assoc_id; +- int addr_num; +- struct sockaddr *addrs; +-}; +- +-struct sctp_getaddrs { +- sctp_assoc_t assoc_id; /*input*/ +- __u32 addr_num; /*output*/ +- __u8 addrs[0]; /*output, variable size*/ +-}; +- +-/* A socket user request obtained via SCTP_GET_ASSOC_STATS that retrieves +- * association stats. All stats are counts except sas_maxrto and +- * sas_obs_rto_ipaddr. maxrto is the max observed rto + transport since +- * the last call. Will return 0 when RTO was not update since last call +- */ +-struct sctp_assoc_stats { +- sctp_assoc_t sas_assoc_id; /* Input */ +- /* Transport of observed max RTO */ +- struct sockaddr_storage sas_obs_rto_ipaddr; +- __u64 sas_maxrto; /* Maximum Observed RTO for period */ +- __u64 sas_isacks; /* SACKs received */ +- __u64 sas_osacks; /* SACKs sent */ +- __u64 sas_opackets; /* Packets sent */ +- __u64 sas_ipackets; /* Packets received */ +- __u64 sas_rtxchunks; /* Retransmitted Chunks */ +- __u64 sas_outofseqtsns;/* TSN received > next expected */ +- __u64 sas_idupchunks; /* Dups received (ordered+unordered) */ +- __u64 sas_gapcnt; /* Gap Acknowledgements Received */ +- __u64 sas_ouodchunks; /* Unordered data chunks sent */ +- __u64 sas_iuodchunks; /* Unordered data chunks received */ +- __u64 sas_oodchunks; /* Ordered data chunks sent */ +- __u64 sas_iodchunks; /* Ordered data chunks received */ +- __u64 sas_octrlchunks; /* Control chunks sent */ +- __u64 sas_ictrlchunks; /* Control chunks received */ +-}; +- +-/* +- * 8.1 sctp_bindx() +- * +- * The flags parameter is formed from the bitwise OR of zero or more of the +- * following currently defined flags: +- */ +-#define SCTP_BINDX_ADD_ADDR 0x01 +-#define SCTP_BINDX_REM_ADDR 0x02 +- +-/* This is the structure that is passed as an argument(optval) to +- * getsockopt(SCTP_SOCKOPT_PEELOFF). +- */ +-typedef struct { +- sctp_assoc_t associd; +- int sd; +-} sctp_peeloff_arg_t; +- +-typedef struct { +- sctp_peeloff_arg_t p_arg; +- unsigned flags; +-} sctp_peeloff_flags_arg_t; +- +-/* +- * Peer Address Thresholds socket option +- */ +-struct sctp_paddrthlds { +- sctp_assoc_t spt_assoc_id; +- struct sockaddr_storage spt_address; +- __u16 spt_pathmaxrxt; +- __u16 spt_pathpfthld; +-}; +- +-/* +- * Socket Option for Getting the Association/Stream-Specific PR-SCTP Status +- */ +-struct sctp_prstatus { +- sctp_assoc_t sprstat_assoc_id; +- __u16 sprstat_sid; +- __u16 sprstat_policy; +- __u64 sprstat_abandoned_unsent; +- __u64 sprstat_abandoned_sent; +-}; +- +-struct sctp_default_prinfo { +- sctp_assoc_t pr_assoc_id; +- __u32 pr_value; +- __u16 pr_policy; +-}; +- +-struct sctp_info { +- __u32 sctpi_tag; +- __u32 sctpi_state; +- __u32 sctpi_rwnd; +- __u16 sctpi_unackdata; +- __u16 sctpi_penddata; +- __u16 sctpi_instrms; +- __u16 sctpi_outstrms; +- __u32 sctpi_fragmentation_point; +- __u32 sctpi_inqueue; +- __u32 sctpi_outqueue; +- __u32 sctpi_overall_error; +- __u32 sctpi_max_burst; +- __u32 sctpi_maxseg; +- __u32 sctpi_peer_rwnd; +- __u32 sctpi_peer_tag; +- __u8 sctpi_peer_capable; +- __u8 sctpi_peer_sack; +- __u16 __reserved1; +- +- /* assoc status info */ +- __u64 sctpi_isacks; +- __u64 sctpi_osacks; +- __u64 sctpi_opackets; +- __u64 sctpi_ipackets; +- __u64 sctpi_rtxchunks; +- __u64 sctpi_outofseqtsns; +- __u64 sctpi_idupchunks; +- __u64 sctpi_gapcnt; +- __u64 sctpi_ouodchunks; +- __u64 sctpi_iuodchunks; +- __u64 sctpi_oodchunks; +- __u64 sctpi_iodchunks; +- __u64 sctpi_octrlchunks; +- __u64 sctpi_ictrlchunks; +- +- /* primary transport info */ +- struct sockaddr_storage sctpi_p_address; +- __s32 sctpi_p_state; +- __u32 sctpi_p_cwnd; +- __u32 sctpi_p_srtt; +- __u32 sctpi_p_rto; +- __u32 sctpi_p_hbinterval; +- __u32 sctpi_p_pathmaxrxt; +- __u32 sctpi_p_sackdelay; +- __u32 sctpi_p_sackfreq; +- __u32 sctpi_p_ssthresh; +- __u32 sctpi_p_partial_bytes_acked; +- __u32 sctpi_p_flight_size; +- __u16 sctpi_p_error; +- __u16 __reserved2; +- +- /* sctp sock info */ +- __u32 sctpi_s_autoclose; +- __u32 sctpi_s_adaptation_ind; +- __u32 sctpi_s_pd_point; +- __u8 sctpi_s_nodelay; +- __u8 sctpi_s_disable_fragments; +- __u8 sctpi_s_v4mapped; +- __u8 sctpi_s_frag_interleave; +- __u32 sctpi_s_type; +- __u32 __reserved3; +-}; +- +-struct sctp_reset_streams { +- sctp_assoc_t srs_assoc_id; +- uint16_t srs_flags; +- uint16_t srs_number_streams; /* 0 == ALL */ +- uint16_t srs_stream_list[]; /* list if srs_num_streams is not 0 */ +-}; +- +-struct sctp_add_streams { +- sctp_assoc_t sas_assoc_id; +- uint16_t sas_instrms; +- uint16_t sas_outstrms; +-}; +- +-#endif /* _SCTP_H */ +diff --git a/include/linux/seg6.h b/include/linux/seg6.h +deleted file mode 100644 +index 0715279..0000000 +--- a/include/linux/seg6.h ++++ /dev/null +@@ -1,54 +0,0 @@ +-/* +- * SR-IPv6 implementation +- * +- * Author: +- * David Lebrun +- * +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_SEG6_H +-#define _LINUX_SEG6_H +- +-#include +-#include /* For struct in6_addr. */ +- +-/* +- * SRH +- */ +-struct ipv6_sr_hdr { +- __u8 nexthdr; +- __u8 hdrlen; +- __u8 type; +- __u8 segments_left; +- __u8 first_segment; +- __u8 flags; +- __u16 reserved; +- +- struct in6_addr segments[0]; +-}; +- +-#define SR6_FLAG1_PROTECTED (1 << 6) +-#define SR6_FLAG1_OAM (1 << 5) +-#define SR6_FLAG1_ALERT (1 << 4) +-#define SR6_FLAG1_HMAC (1 << 3) +- +-#define SR6_TLV_INGRESS 1 +-#define SR6_TLV_EGRESS 2 +-#define SR6_TLV_OPAQUE 3 +-#define SR6_TLV_PADDING 4 +-#define SR6_TLV_HMAC 5 +- +-#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC) +- +-struct sr6_tlv { +- __u8 type; +- __u8 len; +- __u8 data[0]; +-}; +- +-#endif +diff --git a/include/linux/seg6_genl.h b/include/linux/seg6_genl.h +deleted file mode 100644 +index 99382f9..0000000 +--- a/include/linux/seg6_genl.h ++++ /dev/null +@@ -1,32 +0,0 @@ +-#ifndef _LINUX_SEG6_GENL_H +-#define _LINUX_SEG6_GENL_H +- +-#define SEG6_GENL_NAME "SEG6" +-#define SEG6_GENL_VERSION 0x1 +- +-enum { +- SEG6_ATTR_UNSPEC, +- SEG6_ATTR_DST, +- SEG6_ATTR_DSTLEN, +- SEG6_ATTR_HMACKEYID, +- SEG6_ATTR_SECRET, +- SEG6_ATTR_SECRETLEN, +- SEG6_ATTR_ALGID, +- SEG6_ATTR_HMACINFO, +- __SEG6_ATTR_MAX, +-}; +- +-#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1) +- +-enum { +- SEG6_CMD_UNSPEC, +- SEG6_CMD_SETHMAC, +- SEG6_CMD_DUMPHMAC, +- SEG6_CMD_SET_TUNSRC, +- SEG6_CMD_GET_TUNSRC, +- __SEG6_CMD_MAX, +-}; +- +-#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1) +- +-#endif +diff --git a/include/linux/seg6_hmac.h b/include/linux/seg6_hmac.h +deleted file mode 100644 +index 704f93e..0000000 +--- a/include/linux/seg6_hmac.h ++++ /dev/null +@@ -1,22 +0,0 @@ +-#ifndef _LINUX_SEG6_HMAC_H +-#define _LINUX_SEG6_HMAC_H +- +-#include +-#include +- +-#define SEG6_HMAC_SECRET_LEN 64 +-#define SEG6_HMAC_FIELD_LEN 32 +- +-struct sr6_tlv_hmac { +- struct sr6_tlv tlvhdr; +- __u16 reserved; +- __be32 hmackeyid; +- __u8 hmac[SEG6_HMAC_FIELD_LEN]; +-}; +- +-enum { +- SEG6_HMAC_ALGO_SHA1 = 1, +- SEG6_HMAC_ALGO_SHA256 = 2, +-}; +- +-#endif +diff --git a/include/linux/seg6_iptunnel.h b/include/linux/seg6_iptunnel.h +deleted file mode 100644 +index a5dc05a..0000000 +--- a/include/linux/seg6_iptunnel.h ++++ /dev/null +@@ -1,40 +0,0 @@ +-/* +- * SR-IPv6 implementation +- * +- * Author: +- * David Lebrun +- * +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_SEG6_IPTUNNEL_H +-#define _LINUX_SEG6_IPTUNNEL_H +- +-#include /* For struct ipv6_sr_hdr. */ +- +-enum { +- SEG6_IPTUNNEL_UNSPEC, +- SEG6_IPTUNNEL_SRH, +- __SEG6_IPTUNNEL_MAX, +-}; +-#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1) +- +-struct seg6_iptunnel_encap { +- int mode; +- struct ipv6_sr_hdr srh[0]; +-}; +- +-#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3)) +- +-enum { +- SEG6_IPTUN_MODE_INLINE, +- SEG6_IPTUN_MODE_ENCAP, +- SEG6_IPTUN_MODE_L2ENCAP, +-}; +- +- +-#endif +diff --git a/include/linux/seg6_local.h b/include/linux/seg6_local.h +deleted file mode 100644 +index 76b90d6..0000000 +--- a/include/linux/seg6_local.h ++++ /dev/null +@@ -1,68 +0,0 @@ +-/* +- * SR-IPv6 implementation +- * +- * Author: +- * David Lebrun +- * +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef _LINUX_SEG6_LOCAL_H +-#define _LINUX_SEG6_LOCAL_H +- +-#include +- +-enum { +- SEG6_LOCAL_UNSPEC, +- SEG6_LOCAL_ACTION, +- SEG6_LOCAL_SRH, +- SEG6_LOCAL_TABLE, +- SEG6_LOCAL_NH4, +- SEG6_LOCAL_NH6, +- SEG6_LOCAL_IIF, +- SEG6_LOCAL_OIF, +- __SEG6_LOCAL_MAX, +-}; +-#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1) +- +-enum { +- SEG6_LOCAL_ACTION_UNSPEC = 0, +- /* node segment */ +- SEG6_LOCAL_ACTION_END = 1, +- /* adjacency segment (IPv6 cross-connect) */ +- SEG6_LOCAL_ACTION_END_X = 2, +- /* lookup of next seg NH in table */ +- SEG6_LOCAL_ACTION_END_T = 3, +- /* decap and L2 cross-connect */ +- SEG6_LOCAL_ACTION_END_DX2 = 4, +- /* decap and IPv6 cross-connect */ +- SEG6_LOCAL_ACTION_END_DX6 = 5, +- /* decap and IPv4 cross-connect */ +- SEG6_LOCAL_ACTION_END_DX4 = 6, +- /* decap and lookup of DA in v6 table */ +- SEG6_LOCAL_ACTION_END_DT6 = 7, +- /* decap and lookup of DA in v4 table */ +- SEG6_LOCAL_ACTION_END_DT4 = 8, +- /* binding segment with insertion */ +- SEG6_LOCAL_ACTION_END_B6 = 9, +- /* binding segment with encapsulation */ +- SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, +- /* binding segment with MPLS encap */ +- SEG6_LOCAL_ACTION_END_BM = 11, +- /* lookup last seg in table */ +- SEG6_LOCAL_ACTION_END_S = 12, +- /* forward to SR-unaware VNF with static proxy */ +- SEG6_LOCAL_ACTION_END_AS = 13, +- /* forward to SR-unaware VNF with masquerading */ +- SEG6_LOCAL_ACTION_END_AM = 14, +- +- __SEG6_LOCAL_ACTION_MAX, +-}; +- +-#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1) +- +-#endif +diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h +deleted file mode 100644 +index 901231e..0000000 +--- a/include/linux/sock_diag.h ++++ /dev/null +@@ -1,38 +0,0 @@ +-#ifndef __SOCK_DIAG_H__ +-#define __SOCK_DIAG_H__ +- +-#include +- +-#define SOCK_DIAG_BY_FAMILY 20 +-#define SOCK_DESTROY 21 +- +-struct sock_diag_req { +- __u8 sdiag_family; +- __u8 sdiag_protocol; +-}; +- +-enum { +- SK_MEMINFO_RMEM_ALLOC, +- SK_MEMINFO_RCVBUF, +- SK_MEMINFO_WMEM_ALLOC, +- SK_MEMINFO_SNDBUF, +- SK_MEMINFO_FWD_ALLOC, +- SK_MEMINFO_WMEM_QUEUED, +- SK_MEMINFO_OPTMEM, +- SK_MEMINFO_BACKLOG, +- SK_MEMINFO_DROPS, +- +- SK_MEMINFO_VARS, +-}; +- +-enum sknetlink_groups { +- SKNLGRP_NONE, +- SKNLGRP_INET_TCP_DESTROY, +- SKNLGRP_INET_UDP_DESTROY, +- SKNLGRP_INET6_TCP_DESTROY, +- SKNLGRP_INET6_UDP_DESTROY, +- __SKNLGRP_MAX, +-}; +-#define SKNLGRP_MAX (__SKNLGRP_MAX - 1) +- +-#endif /* __SOCK_DIAG_H__ */ +diff --git a/include/linux/socket.h b/include/linux/socket.h +deleted file mode 100644 +index 8c1e501..0000000 +--- a/include/linux/socket.h ++++ /dev/null +@@ -1,21 +0,0 @@ +-#ifndef _LINUX_SOCKET_H +-#define _LINUX_SOCKET_H +- +-/* +- * Desired design of maximum size and alignment (see RFC2553) +- */ +-#define _K_SS_MAXSIZE 128 /* Implementation specific max size */ +-#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *)) +- /* Implementation specific desired alignment */ +- +-typedef unsigned short __kernel_sa_family_t; +- +-struct __kernel_sockaddr_storage { +- __kernel_sa_family_t ss_family; /* address family */ +- /* Following field(s) are implementation specific */ +- char __data[_K_SS_MAXSIZE - sizeof(unsigned short)]; +- /* space to achieve desired size, */ +- /* _SS_MAXSIZE value minus size of ss_family */ +-} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */ +- +-#endif /* _LINUX_SOCKET_H */ +diff --git a/include/linux/sockios.h b/include/linux/sockios.h +deleted file mode 100644 +index 79d029d..0000000 +--- a/include/linux/sockios.h ++++ /dev/null +@@ -1,152 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Definitions of the socket-level I/O control calls. +- * +- * Version: @(#)sockios.h 1.0.2 03/09/93 +- * +- * Authors: Ross Biro +- * Fred N. van Kempen, +- * +- * This program is free software; you can redistribute 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. +- */ +-#ifndef _LINUX_SOCKIOS_H +-#define _LINUX_SOCKIOS_H +- +-#include +- +-/* Linux-specific socket ioctls */ +-#define SIOCINQ FIONREAD +-#define SIOCOUTQ TIOCOUTQ /* output queue size (not sent + not acked) */ +- +-#define SOCK_IOC_TYPE 0x89 +- +-/* Routing table calls. */ +-#define SIOCADDRT 0x890B /* add routing table entry */ +-#define SIOCDELRT 0x890C /* delete routing table entry */ +-#define SIOCRTMSG 0x890D /* unused */ +- +-/* Socket configuration controls. */ +-#define SIOCGIFNAME 0x8910 /* get iface name */ +-#define SIOCSIFLINK 0x8911 /* set iface channel */ +-#define SIOCGIFCONF 0x8912 /* get iface list */ +-#define SIOCGIFFLAGS 0x8913 /* get flags */ +-#define SIOCSIFFLAGS 0x8914 /* set flags */ +-#define SIOCGIFADDR 0x8915 /* get PA address */ +-#define SIOCSIFADDR 0x8916 /* set PA address */ +-#define SIOCGIFDSTADDR 0x8917 /* get remote PA address */ +-#define SIOCSIFDSTADDR 0x8918 /* set remote PA address */ +-#define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ +-#define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ +-#define SIOCGIFNETMASK 0x891b /* get network PA mask */ +-#define SIOCSIFNETMASK 0x891c /* set network PA mask */ +-#define SIOCGIFMETRIC 0x891d /* get metric */ +-#define SIOCSIFMETRIC 0x891e /* set metric */ +-#define SIOCGIFMEM 0x891f /* get memory address (BSD) */ +-#define SIOCSIFMEM 0x8920 /* set memory address (BSD) */ +-#define SIOCGIFMTU 0x8921 /* get MTU size */ +-#define SIOCSIFMTU 0x8922 /* set MTU size */ +-#define SIOCSIFNAME 0x8923 /* set interface name */ +-#define SIOCSIFHWADDR 0x8924 /* set hardware address */ +-#define SIOCGIFENCAP 0x8925 /* get/set encapsulations */ +-#define SIOCSIFENCAP 0x8926 +-#define SIOCGIFHWADDR 0x8927 /* Get hardware address */ +-#define SIOCGIFSLAVE 0x8929 /* Driver slaving support */ +-#define SIOCSIFSLAVE 0x8930 +-#define SIOCADDMULTI 0x8931 /* Multicast address lists */ +-#define SIOCDELMULTI 0x8932 +-#define SIOCGIFINDEX 0x8933 /* name -> if_index mapping */ +-#define SIOGIFINDEX SIOCGIFINDEX /* misprint compatibility :-) */ +-#define SIOCSIFPFLAGS 0x8934 /* set/get extended flags set */ +-#define SIOCGIFPFLAGS 0x8935 +-#define SIOCDIFADDR 0x8936 /* delete PA address */ +-#define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */ +-#define SIOCGIFCOUNT 0x8938 /* get number of devices */ +- +-#define SIOCGIFBR 0x8940 /* Bridging support */ +-#define SIOCSIFBR 0x8941 /* Set bridging options */ +- +-#define SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */ +-#define SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */ +- +-/* SIOCGIFDIVERT was: 0x8944 Frame diversion support */ +-/* SIOCSIFDIVERT was: 0x8945 Set frame diversion options */ +- +-#define SIOCETHTOOL 0x8946 /* Ethtool interface */ +- +-#define SIOCGMIIPHY 0x8947 /* Get address of MII PHY in use. */ +-#define SIOCGMIIREG 0x8948 /* Read MII PHY register. */ +-#define SIOCSMIIREG 0x8949 /* Write MII PHY register. */ +- +-#define SIOCWANDEV 0x894A /* get/set netdev parameters */ +- +-#define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */ +-#define SIOCGSKNS 0x894C /* get socket network namespace */ +- +-/* ARP cache control calls. */ +- /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ +-#define SIOCDARP 0x8953 /* delete ARP table entry */ +-#define SIOCGARP 0x8954 /* get ARP table entry */ +-#define SIOCSARP 0x8955 /* set ARP table entry */ +- +-/* RARP cache control calls. */ +-#define SIOCDRARP 0x8960 /* delete RARP table entry */ +-#define SIOCGRARP 0x8961 /* get RARP table entry */ +-#define SIOCSRARP 0x8962 /* set RARP table entry */ +- +-/* Driver configuration calls */ +- +-#define SIOCGIFMAP 0x8970 /* Get device parameters */ +-#define SIOCSIFMAP 0x8971 /* Set device parameters */ +- +-/* DLCI configuration calls */ +- +-#define SIOCADDDLCI 0x8980 /* Create new DLCI device */ +-#define SIOCDELDLCI 0x8981 /* Delete DLCI device */ +- +-#define SIOCGIFVLAN 0x8982 /* 802.1Q VLAN support */ +-#define SIOCSIFVLAN 0x8983 /* Set 802.1Q VLAN options */ +- +-/* bonding calls */ +- +-#define SIOCBONDENSLAVE 0x8990 /* enslave a device to the bond */ +-#define SIOCBONDRELEASE 0x8991 /* release a slave from the bond*/ +-#define SIOCBONDSETHWADDR 0x8992 /* set the hw addr of the bond */ +-#define SIOCBONDSLAVEINFOQUERY 0x8993 /* rtn info about slave state */ +-#define SIOCBONDINFOQUERY 0x8994 /* rtn info about bond state */ +-#define SIOCBONDCHANGEACTIVE 0x8995 /* update to a new active slave */ +- +-/* bridge calls */ +-#define SIOCBRADDBR 0x89a0 /* create new bridge device */ +-#define SIOCBRDELBR 0x89a1 /* remove bridge device */ +-#define SIOCBRADDIF 0x89a2 /* add interface to bridge */ +-#define SIOCBRDELIF 0x89a3 /* remove interface from bridge */ +- +-/* hardware time stamping: parameters in linux/net_tstamp.h */ +-#define SIOCSHWTSTAMP 0x89b0 /* set and get config */ +-#define SIOCGHWTSTAMP 0x89b1 /* get config */ +- +-/* Device private ioctl calls */ +- +-/* +- * These 16 ioctls are available to devices via the do_ioctl() device +- * vector. Each device should include this file and redefine these names +- * as their own. Because these are device dependent it is a good idea +- * _NOT_ to issue them to random objects and hope. +- * +- * THESE IOCTLS ARE _DEPRECATED_ AND WILL DISAPPEAR IN 2.5.X -DaveM +- */ +- +-#define SIOCDEVPRIVATE 0x89F0 /* to 89FF */ +- +-/* +- * These 16 ioctl calls are protocol private +- */ +- +-#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */ +-#endif /* _LINUX_SOCKIOS_H */ +diff --git a/include/linux/stddef.h b/include/linux/stddef.h +deleted file mode 100644 +index 4bb69de..0000000 +--- a/include/linux/stddef.h ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +-#ifndef __always_inline +-#define __always_inline __inline__ +-#endif +diff --git a/include/linux/sysinfo.h b/include/linux/sysinfo.h +deleted file mode 100644 +index 934335a..0000000 +--- a/include/linux/sysinfo.h ++++ /dev/null +@@ -1,24 +0,0 @@ +-#ifndef _LINUX_SYSINFO_H +-#define _LINUX_SYSINFO_H +- +-#include +- +-#define SI_LOAD_SHIFT 16 +-struct sysinfo { +- __kernel_long_t uptime; /* Seconds since boot */ +- __kernel_ulong_t loads[3]; /* 1, 5, and 15 minute load averages */ +- __kernel_ulong_t totalram; /* Total usable main memory size */ +- __kernel_ulong_t freeram; /* Available memory size */ +- __kernel_ulong_t sharedram; /* Amount of shared memory */ +- __kernel_ulong_t bufferram; /* Memory used by buffers */ +- __kernel_ulong_t totalswap; /* Total swap space size */ +- __kernel_ulong_t freeswap; /* swap space still available */ +- __u16 procs; /* Number of current processes */ +- __u16 pad; /* Explicit padding for m68k */ +- __kernel_ulong_t totalhigh; /* Total high memory size */ +- __kernel_ulong_t freehigh; /* Available high memory size */ +- __u32 mem_unit; /* Memory unit size in bytes */ +- char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)]; /* Padding: libc5 uses this.. */ +-}; +- +-#endif /* _LINUX_SYSINFO_H */ +diff --git a/include/linux/tc_act/tc_bpf.h b/include/linux/tc_act/tc_bpf.h +deleted file mode 100644 +index 8dc2ac0..0000000 +--- a/include/linux/tc_act/tc_bpf.h ++++ /dev/null +@@ -1,36 +0,0 @@ +-/* +- * Copyright (c) 2015 Jiri Pirko +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef __LINUX_TC_BPF_H +-#define __LINUX_TC_BPF_H +- +-#include +- +-#define TCA_ACT_BPF 13 +- +-struct tc_act_bpf { +- tc_gen; +-}; +- +-enum { +- TCA_ACT_BPF_UNSPEC, +- TCA_ACT_BPF_TM, +- TCA_ACT_BPF_PARMS, +- TCA_ACT_BPF_OPS_LEN, +- TCA_ACT_BPF_OPS, +- TCA_ACT_BPF_FD, +- TCA_ACT_BPF_NAME, +- TCA_ACT_BPF_PAD, +- TCA_ACT_BPF_TAG, +- TCA_ACT_BPF_ID, +- __TCA_ACT_BPF_MAX, +-}; +-#define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_connmark.h b/include/linux/tc_act/tc_connmark.h +deleted file mode 100644 +index 62a5e94..0000000 +--- a/include/linux/tc_act/tc_connmark.h ++++ /dev/null +@@ -1,23 +0,0 @@ +-#ifndef __UAPI_TC_CONNMARK_H +-#define __UAPI_TC_CONNMARK_H +- +-#include +-#include +- +-#define TCA_ACT_CONNMARK 14 +- +-struct tc_connmark { +- tc_gen; +- __u16 zone; +-}; +- +-enum { +- TCA_CONNMARK_UNSPEC, +- TCA_CONNMARK_PARMS, +- TCA_CONNMARK_TM, +- TCA_CONNMARK_PAD, +- __TCA_CONNMARK_MAX +-}; +-#define TCA_CONNMARK_MAX (__TCA_CONNMARK_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_csum.h b/include/linux/tc_act/tc_csum.h +deleted file mode 100644 +index a11bb35..0000000 +--- a/include/linux/tc_act/tc_csum.h ++++ /dev/null +@@ -1,34 +0,0 @@ +-#ifndef __LINUX_TC_CSUM_H +-#define __LINUX_TC_CSUM_H +- +-#include +-#include +- +-#define TCA_ACT_CSUM 16 +- +-enum { +- TCA_CSUM_UNSPEC, +- TCA_CSUM_PARMS, +- TCA_CSUM_TM, +- TCA_CSUM_PAD, +- __TCA_CSUM_MAX +-}; +-#define TCA_CSUM_MAX (__TCA_CSUM_MAX - 1) +- +-enum { +- TCA_CSUM_UPDATE_FLAG_IPV4HDR = 1, +- TCA_CSUM_UPDATE_FLAG_ICMP = 2, +- TCA_CSUM_UPDATE_FLAG_IGMP = 4, +- TCA_CSUM_UPDATE_FLAG_TCP = 8, +- TCA_CSUM_UPDATE_FLAG_UDP = 16, +- TCA_CSUM_UPDATE_FLAG_UDPLITE = 32, +- TCA_CSUM_UPDATE_FLAG_SCTP = 64, +-}; +- +-struct tc_csum { +- tc_gen; +- +- __u32 update_flags; +-}; +- +-#endif /* __LINUX_TC_CSUM_H */ +diff --git a/include/linux/tc_act/tc_defact.h b/include/linux/tc_act/tc_defact.h +deleted file mode 100644 +index d2a3abb..0000000 +--- a/include/linux/tc_act/tc_defact.h ++++ /dev/null +@@ -1,20 +0,0 @@ +-#ifndef __LINUX_TC_DEF_H +-#define __LINUX_TC_DEF_H +- +-#include +- +-struct tc_defact { +- tc_gen; +-}; +- +-enum { +- TCA_DEF_UNSPEC, +- TCA_DEF_TM, +- TCA_DEF_PARMS, +- TCA_DEF_DATA, +- TCA_DEF_PAD, +- __TCA_DEF_MAX +-}; +-#define TCA_DEF_MAX (__TCA_DEF_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_gact.h b/include/linux/tc_act/tc_gact.h +deleted file mode 100644 +index 70b536a..0000000 +--- a/include/linux/tc_act/tc_gact.h ++++ /dev/null +@@ -1,33 +0,0 @@ +-#ifndef __LINUX_TC_GACT_H +-#define __LINUX_TC_GACT_H +- +-#include +-#include +- +-#define TCA_ACT_GACT 5 +-struct tc_gact { +- tc_gen; +- +-}; +- +-struct tc_gact_p { +-#define PGACT_NONE 0 +-#define PGACT_NETRAND 1 +-#define PGACT_DETERM 2 +-#define MAX_RAND (PGACT_DETERM + 1 ) +- __u16 ptype; +- __u16 pval; +- int paction; +-}; +- +-enum { +- TCA_GACT_UNSPEC, +- TCA_GACT_TM, +- TCA_GACT_PARMS, +- TCA_GACT_PROB, +- TCA_GACT_PAD, +- __TCA_GACT_MAX +-}; +-#define TCA_GACT_MAX (__TCA_GACT_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_ife.h b/include/linux/tc_act/tc_ife.h +deleted file mode 100644 +index 7c28178..0000000 +--- a/include/linux/tc_act/tc_ife.h ++++ /dev/null +@@ -1,32 +0,0 @@ +-#ifndef __UAPI_TC_IFE_H +-#define __UAPI_TC_IFE_H +- +-#include +-#include +-#include +- +-#define TCA_ACT_IFE 25 +-/* Flag bits for now just encoding/decoding; mutually exclusive */ +-#define IFE_ENCODE 1 +-#define IFE_DECODE 0 +- +-struct tc_ife { +- tc_gen; +- __u16 flags; +-}; +- +-/*XXX: We need to encode the total number of bytes consumed */ +-enum { +- TCA_IFE_UNSPEC, +- TCA_IFE_PARMS, +- TCA_IFE_TM, +- TCA_IFE_DMAC, +- TCA_IFE_SMAC, +- TCA_IFE_TYPE, +- TCA_IFE_METALST, +- TCA_IFE_PAD, +- __TCA_IFE_MAX +-}; +-#define TCA_IFE_MAX (__TCA_IFE_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_ipt.h b/include/linux/tc_act/tc_ipt.h +deleted file mode 100644 +index 7c6e155..0000000 +--- a/include/linux/tc_act/tc_ipt.h ++++ /dev/null +@@ -1,22 +0,0 @@ +-#ifndef __LINUX_TC_IPT_H +-#define __LINUX_TC_IPT_H +- +-#include +- +-#define TCA_ACT_IPT 6 +-#define TCA_ACT_XT 10 +- +-enum { +- TCA_IPT_UNSPEC, +- TCA_IPT_TABLE, +- TCA_IPT_HOOK, +- TCA_IPT_INDEX, +- TCA_IPT_CNT, +- TCA_IPT_TM, +- TCA_IPT_TARG, +- TCA_IPT_PAD, +- __TCA_IPT_MAX +-}; +-#define TCA_IPT_MAX (__TCA_IPT_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_mirred.h b/include/linux/tc_act/tc_mirred.h +deleted file mode 100644 +index 3d7a2b3..0000000 +--- a/include/linux/tc_act/tc_mirred.h ++++ /dev/null +@@ -1,28 +0,0 @@ +-#ifndef __LINUX_TC_MIR_H +-#define __LINUX_TC_MIR_H +- +-#include +-#include +- +-#define TCA_ACT_MIRRED 8 +-#define TCA_EGRESS_REDIR 1 /* packet redirect to EGRESS*/ +-#define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */ +-#define TCA_INGRESS_REDIR 3 /* packet redirect to INGRESS*/ +-#define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */ +- +-struct tc_mirred { +- tc_gen; +- int eaction; /* one of IN/EGRESS_MIRROR/REDIR */ +- __u32 ifindex; /* ifindex of egress port */ +-}; +- +-enum { +- TCA_MIRRED_UNSPEC, +- TCA_MIRRED_TM, +- TCA_MIRRED_PARMS, +- TCA_MIRRED_PAD, +- __TCA_MIRRED_MAX +-}; +-#define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_nat.h b/include/linux/tc_act/tc_nat.h +deleted file mode 100644 +index 923457c..0000000 +--- a/include/linux/tc_act/tc_nat.h ++++ /dev/null +@@ -1,28 +0,0 @@ +-#ifndef __LINUX_TC_NAT_H +-#define __LINUX_TC_NAT_H +- +-#include +-#include +- +-#define TCA_ACT_NAT 9 +- +-enum { +- TCA_NAT_UNSPEC, +- TCA_NAT_PARMS, +- TCA_NAT_TM, +- TCA_NAT_PAD, +- __TCA_NAT_MAX +-}; +-#define TCA_NAT_MAX (__TCA_NAT_MAX - 1) +- +-#define TCA_NAT_FLAG_EGRESS 1 +- +-struct tc_nat { +- tc_gen; +- __be32 old_addr; +- __be32 new_addr; +- __be32 mask; +- __u32 flags; +-}; +- +-#endif +diff --git a/include/linux/tc_act/tc_pedit.h b/include/linux/tc_act/tc_pedit.h +deleted file mode 100644 +index 143d2b3..0000000 +--- a/include/linux/tc_act/tc_pedit.h ++++ /dev/null +@@ -1,66 +0,0 @@ +-#ifndef __LINUX_TC_PED_H +-#define __LINUX_TC_PED_H +- +-#include +-#include +- +-#define TCA_ACT_PEDIT 7 +- +-enum { +- TCA_PEDIT_UNSPEC, +- TCA_PEDIT_TM, +- TCA_PEDIT_PARMS, +- TCA_PEDIT_PAD, +- TCA_PEDIT_PARMS_EX, +- TCA_PEDIT_KEYS_EX, +- TCA_PEDIT_KEY_EX, +- __TCA_PEDIT_MAX +-}; +-#define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1) +- +-enum { +- TCA_PEDIT_KEY_EX_HTYPE = 1, +- TCA_PEDIT_KEY_EX_CMD = 2, +- __TCA_PEDIT_KEY_EX_MAX +-}; +-#define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1) +- +- /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It +- * means no specific header type - offset is relative to the network layer +- */ +-enum pedit_header_type { +- TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, +- TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, +- TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, +- TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, +- TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, +- TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, +- __PEDIT_HDR_TYPE_MAX, +-}; +-#define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1) +- +-enum pedit_cmd { +- TCA_PEDIT_KEY_EX_CMD_SET = 0, +- TCA_PEDIT_KEY_EX_CMD_ADD = 1, +- __PEDIT_CMD_MAX, +-}; +-#define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1) +- +-struct tc_pedit_key { +- __u32 mask; /* AND */ +- __u32 val; /*XOR */ +- __u32 off; /*offset */ +- __u32 at; +- __u32 offmask; +- __u32 shift; +-}; +- +-struct tc_pedit_sel { +- tc_gen; +- unsigned char nkeys; +- unsigned char flags; +- struct tc_pedit_key keys[0]; +-}; +-#define tc_pedit tc_pedit_sel +- +-#endif +diff --git a/include/linux/tc_act/tc_sample.h b/include/linux/tc_act/tc_sample.h +deleted file mode 100644 +index edc9058..0000000 +--- a/include/linux/tc_act/tc_sample.h ++++ /dev/null +@@ -1,26 +0,0 @@ +-#ifndef __LINUX_TC_SAMPLE_H +-#define __LINUX_TC_SAMPLE_H +- +-#include +-#include +-#include +- +-#define TCA_ACT_SAMPLE 26 +- +-struct tc_sample { +- tc_gen; +-}; +- +-enum { +- TCA_SAMPLE_UNSPEC, +- TCA_SAMPLE_TM, +- TCA_SAMPLE_PARMS, +- TCA_SAMPLE_RATE, +- TCA_SAMPLE_TRUNC_SIZE, +- TCA_SAMPLE_PSAMPLE_GROUP, +- TCA_SAMPLE_PAD, +- __TCA_SAMPLE_MAX +-}; +-#define TCA_SAMPLE_MAX (__TCA_SAMPLE_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_skbedit.h b/include/linux/tc_act/tc_skbedit.h +deleted file mode 100644 +index 2884425..0000000 +--- a/include/linux/tc_act/tc_skbedit.h ++++ /dev/null +@@ -1,51 +0,0 @@ +-/* +- * Copyright (c) 2008, Intel Corporation. +- * +- * This program is free software; you can redistribute it and/or modify it +- * under the terms and conditions of the GNU General Public License, +- * version 2, as published by the Free Software Foundation. +- * +- * This program is distributed in the hope it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +- * more details. +- * +- * You should have received a copy of the GNU General Public License along with +- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple +- * Place - Suite 330, Boston, MA 02111-1307 USA. +- * +- * Author: Alexander Duyck +- */ +- +-#ifndef __LINUX_TC_SKBEDIT_H +-#define __LINUX_TC_SKBEDIT_H +- +-#include +- +-#define TCA_ACT_SKBEDIT 11 +- +-#define SKBEDIT_F_PRIORITY 0x1 +-#define SKBEDIT_F_QUEUE_MAPPING 0x2 +-#define SKBEDIT_F_MARK 0x4 +-#define SKBEDIT_F_PTYPE 0x8 +-#define SKBEDIT_F_MASK 0x10 +- +-struct tc_skbedit { +- tc_gen; +-}; +- +-enum { +- TCA_SKBEDIT_UNSPEC, +- TCA_SKBEDIT_TM, +- TCA_SKBEDIT_PARMS, +- TCA_SKBEDIT_PRIORITY, +- TCA_SKBEDIT_QUEUE_MAPPING, +- TCA_SKBEDIT_MARK, +- TCA_SKBEDIT_PAD, +- TCA_SKBEDIT_PTYPE, +- TCA_SKBEDIT_MASK, +- __TCA_SKBEDIT_MAX +-}; +-#define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_skbmod.h b/include/linux/tc_act/tc_skbmod.h +deleted file mode 100644 +index 10fc07d..0000000 +--- a/include/linux/tc_act/tc_skbmod.h ++++ /dev/null +@@ -1,39 +0,0 @@ +-/* +- * Copyright (c) 2016, Jamal Hadi Salim +- * +- * This program is free software; you can redistribute 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. +-*/ +- +-#ifndef __LINUX_TC_SKBMOD_H +-#define __LINUX_TC_SKBMOD_H +- +-#include +- +-#define TCA_ACT_SKBMOD 15 +- +-#define SKBMOD_F_DMAC 0x1 +-#define SKBMOD_F_SMAC 0x2 +-#define SKBMOD_F_ETYPE 0x4 +-#define SKBMOD_F_SWAPMAC 0x8 +- +-struct tc_skbmod { +- tc_gen; +- __u64 flags; +-}; +- +-enum { +- TCA_SKBMOD_UNSPEC, +- TCA_SKBMOD_TM, +- TCA_SKBMOD_PARMS, +- TCA_SKBMOD_DMAC, +- TCA_SKBMOD_SMAC, +- TCA_SKBMOD_ETYPE, +- TCA_SKBMOD_PAD, +- __TCA_SKBMOD_MAX +-}; +-#define TCA_SKBMOD_MAX (__TCA_SKBMOD_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_tunnel_key.h b/include/linux/tc_act/tc_tunnel_key.h +deleted file mode 100644 +index afcd4be..0000000 +--- a/include/linux/tc_act/tc_tunnel_key.h ++++ /dev/null +@@ -1,43 +0,0 @@ +-/* +- * Copyright (c) 2016, Amir Vadai +- * Copyright (c) 2016, Mellanox Technologies. All rights reserved. +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef __LINUX_TC_TUNNEL_KEY_H +-#define __LINUX_TC_TUNNEL_KEY_H +- +-#include +- +-#define TCA_ACT_TUNNEL_KEY 17 +- +-#define TCA_TUNNEL_KEY_ACT_SET 1 +-#define TCA_TUNNEL_KEY_ACT_RELEASE 2 +- +-struct tc_tunnel_key { +- tc_gen; +- int t_action; +-}; +- +-enum { +- TCA_TUNNEL_KEY_UNSPEC, +- TCA_TUNNEL_KEY_TM, +- TCA_TUNNEL_KEY_PARMS, +- TCA_TUNNEL_KEY_ENC_IPV4_SRC, /* be32 */ +- TCA_TUNNEL_KEY_ENC_IPV4_DST, /* be32 */ +- TCA_TUNNEL_KEY_ENC_IPV6_SRC, /* struct in6_addr */ +- TCA_TUNNEL_KEY_ENC_IPV6_DST, /* struct in6_addr */ +- TCA_TUNNEL_KEY_ENC_KEY_ID, /* be64 */ +- TCA_TUNNEL_KEY_PAD, +- TCA_TUNNEL_KEY_ENC_DST_PORT, /* be16 */ +- TCA_TUNNEL_KEY_NO_CSUM, /* u8 */ +- __TCA_TUNNEL_KEY_MAX, +-}; +- +-#define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_act/tc_vlan.h b/include/linux/tc_act/tc_vlan.h +deleted file mode 100644 +index bddb272..0000000 +--- a/include/linux/tc_act/tc_vlan.h ++++ /dev/null +@@ -1,38 +0,0 @@ +-/* +- * Copyright (c) 2014 Jiri Pirko +- * +- * This program is free software; you can redistribute 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. +- */ +- +-#ifndef __LINUX_TC_VLAN_H +-#define __LINUX_TC_VLAN_H +- +-#include +- +-#define TCA_ACT_VLAN 12 +- +-#define TCA_VLAN_ACT_POP 1 +-#define TCA_VLAN_ACT_PUSH 2 +-#define TCA_VLAN_ACT_MODIFY 3 +- +-struct tc_vlan { +- tc_gen; +- int v_action; +-}; +- +-enum { +- TCA_VLAN_UNSPEC, +- TCA_VLAN_TM, +- TCA_VLAN_PARMS, +- TCA_VLAN_PUSH_VLAN_ID, +- TCA_VLAN_PUSH_VLAN_PROTOCOL, +- TCA_VLAN_PAD, +- TCA_VLAN_PUSH_VLAN_PRIORITY, +- __TCA_VLAN_MAX, +-}; +-#define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1) +- +-#endif +diff --git a/include/linux/tc_ematch/tc_em_cmp.h b/include/linux/tc_ematch/tc_em_cmp.h +deleted file mode 100644 +index f34bb1b..0000000 +--- a/include/linux/tc_ematch/tc_em_cmp.h ++++ /dev/null +@@ -1,25 +0,0 @@ +-#ifndef __LINUX_TC_EM_CMP_H +-#define __LINUX_TC_EM_CMP_H +- +-#include +-#include +- +-struct tcf_em_cmp { +- __u32 val; +- __u32 mask; +- __u16 off; +- __u8 align:4; +- __u8 flags:4; +- __u8 layer:4; +- __u8 opnd:4; +-}; +- +-enum { +- TCF_EM_ALIGN_U8 = 1, +- TCF_EM_ALIGN_U16 = 2, +- TCF_EM_ALIGN_U32 = 4 +-}; +- +-#define TCF_EM_CMP_TRANS 1 +- +-#endif +diff --git a/include/linux/tc_ematch/tc_em_meta.h b/include/linux/tc_ematch/tc_em_meta.h +deleted file mode 100644 +index b11f8ce..0000000 +--- a/include/linux/tc_ematch/tc_em_meta.h ++++ /dev/null +@@ -1,92 +0,0 @@ +-#ifndef __LINUX_TC_EM_META_H +-#define __LINUX_TC_EM_META_H +- +-#include +-#include +- +-enum { +- TCA_EM_META_UNSPEC, +- TCA_EM_META_HDR, +- TCA_EM_META_LVALUE, +- TCA_EM_META_RVALUE, +- __TCA_EM_META_MAX +-}; +-#define TCA_EM_META_MAX (__TCA_EM_META_MAX - 1) +- +-struct tcf_meta_val { +- __u16 kind; +- __u8 shift; +- __u8 op; +-}; +- +-#define TCF_META_TYPE_MASK (0xf << 12) +-#define TCF_META_TYPE(kind) (((kind) & TCF_META_TYPE_MASK) >> 12) +-#define TCF_META_ID_MASK 0x7ff +-#define TCF_META_ID(kind) ((kind) & TCF_META_ID_MASK) +- +-enum { +- TCF_META_TYPE_VAR, +- TCF_META_TYPE_INT, +- __TCF_META_TYPE_MAX +-}; +-#define TCF_META_TYPE_MAX (__TCF_META_TYPE_MAX - 1) +- +-enum { +- TCF_META_ID_VALUE, +- TCF_META_ID_RANDOM, +- TCF_META_ID_LOADAVG_0, +- TCF_META_ID_LOADAVG_1, +- TCF_META_ID_LOADAVG_2, +- TCF_META_ID_DEV, +- TCF_META_ID_PRIORITY, +- TCF_META_ID_PROTOCOL, +- TCF_META_ID_PKTTYPE, +- TCF_META_ID_PKTLEN, +- TCF_META_ID_DATALEN, +- TCF_META_ID_MACLEN, +- TCF_META_ID_NFMARK, +- TCF_META_ID_TCINDEX, +- TCF_META_ID_RTCLASSID, +- TCF_META_ID_RTIIF, +- TCF_META_ID_SK_FAMILY, +- TCF_META_ID_SK_STATE, +- TCF_META_ID_SK_REUSE, +- TCF_META_ID_SK_BOUND_IF, +- TCF_META_ID_SK_REFCNT, +- TCF_META_ID_SK_SHUTDOWN, +- TCF_META_ID_SK_PROTO, +- TCF_META_ID_SK_TYPE, +- TCF_META_ID_SK_RCVBUF, +- TCF_META_ID_SK_RMEM_ALLOC, +- TCF_META_ID_SK_WMEM_ALLOC, +- TCF_META_ID_SK_OMEM_ALLOC, +- TCF_META_ID_SK_WMEM_QUEUED, +- TCF_META_ID_SK_RCV_QLEN, +- TCF_META_ID_SK_SND_QLEN, +- TCF_META_ID_SK_ERR_QLEN, +- TCF_META_ID_SK_FORWARD_ALLOCS, +- TCF_META_ID_SK_SNDBUF, +- TCF_META_ID_SK_ALLOCS, +- __TCF_META_ID_SK_ROUTE_CAPS, /* unimplemented but in ABI already */ +- TCF_META_ID_SK_HASH, +- TCF_META_ID_SK_LINGERTIME, +- TCF_META_ID_SK_ACK_BACKLOG, +- TCF_META_ID_SK_MAX_ACK_BACKLOG, +- TCF_META_ID_SK_PRIO, +- TCF_META_ID_SK_RCVLOWAT, +- TCF_META_ID_SK_RCVTIMEO, +- TCF_META_ID_SK_SNDTIMEO, +- TCF_META_ID_SK_SENDMSG_OFF, +- TCF_META_ID_SK_WRITE_PENDING, +- TCF_META_ID_VLAN_TAG, +- TCF_META_ID_RXHASH, +- __TCF_META_ID_MAX +-}; +-#define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1) +- +-struct tcf_meta_hdr { +- struct tcf_meta_val left; +- struct tcf_meta_val right; +-}; +- +-#endif +diff --git a/include/linux/tc_ematch/tc_em_nbyte.h b/include/linux/tc_ematch/tc_em_nbyte.h +deleted file mode 100644 +index 7172cfb..0000000 +--- a/include/linux/tc_ematch/tc_em_nbyte.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-#ifndef __LINUX_TC_EM_NBYTE_H +-#define __LINUX_TC_EM_NBYTE_H +- +-#include +-#include +- +-struct tcf_em_nbyte { +- __u16 off; +- __u16 len:12; +- __u8 layer:4; +-}; +- +-#endif +diff --git a/include/linux/tcp.h b/include/linux/tcp.h +deleted file mode 100644 +index 8edad3f..0000000 +--- a/include/linux/tcp.h ++++ /dev/null +@@ -1,268 +0,0 @@ +-/* +- * INET An implementation of the TCP/IP protocol suite for the LINUX +- * operating system. INET is implemented using the BSD Socket +- * interface as the means of communication with the user level. +- * +- * Definitions for the TCP protocol. +- * +- * Version: @(#)tcp.h 1.0.2 04/28/93 +- * +- * Author: Fred N. van Kempen, +- * +- * This program is free software; you can redistribute 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. +- */ +-#ifndef _LINUX_TCP_H +-#define _LINUX_TCP_H +- +-#include +-#include +-#include +- +-struct tcphdr { +- __be16 source; +- __be16 dest; +- __be32 seq; +- __be32 ack_seq; +-#if defined(__LITTLE_ENDIAN_BITFIELD) +- __u16 res1:4, +- doff:4, +- fin:1, +- syn:1, +- rst:1, +- psh:1, +- ack:1, +- urg:1, +- ece:1, +- cwr:1; +-#elif defined(__BIG_ENDIAN_BITFIELD) +- __u16 doff:4, +- res1:4, +- cwr:1, +- ece:1, +- urg:1, +- ack:1, +- psh:1, +- rst:1, +- syn:1, +- fin:1; +-#else +-#error "Adjust your defines" +-#endif +- __be16 window; +- __sum16 check; +- __be16 urg_ptr; +-}; +- +-/* +- * The union cast uses a gcc extension to avoid aliasing problems +- * (union is compatible to any of its members) +- * This means this part of the code is -fstrict-aliasing safe now. +- */ +-union tcp_word_hdr { +- struct tcphdr hdr; +- __be32 words[5]; +-}; +- +-#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) +- +-enum { +- TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000), +- TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000), +- TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000), +- TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000), +- TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000), +- TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000), +- TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000), +- TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000), +- TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000), +- TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000) +-}; +- +-/* +- * TCP general constants +- */ +-#define TCP_MSS_DEFAULT 536U /* IPv4 (RFC1122, RFC2581) */ +-#define TCP_MSS_DESIRED 1220U /* IPv6 (tunneled), EDNS0 (RFC3226) */ +- +-/* TCP socket options */ +-#define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */ +-#define TCP_MAXSEG 2 /* Limit MSS */ +-#define TCP_CORK 3 /* Never send partially complete segments */ +-#define TCP_KEEPIDLE 4 /* Start keeplives after this period */ +-#define TCP_KEEPINTVL 5 /* Interval between keepalives */ +-#define TCP_KEEPCNT 6 /* Number of keepalives before death */ +-#define TCP_SYNCNT 7 /* Number of SYN retransmits */ +-#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */ +-#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */ +-#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */ +-#define TCP_INFO 11 /* Information about this connection. */ +-#define TCP_QUICKACK 12 /* Block/reenable quick acks */ +-#define TCP_CONGESTION 13 /* Congestion control algorithm */ +-#define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ +-#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ +-#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ +-#define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ +-#define TCP_REPAIR 19 /* TCP sock is under repair right now */ +-#define TCP_REPAIR_QUEUE 20 +-#define TCP_QUEUE_SEQ 21 +-#define TCP_REPAIR_OPTIONS 22 +-#define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */ +-#define TCP_TIMESTAMP 24 +-#define TCP_NOTSENT_LOWAT 25 /* limit number of unsent bytes in write queue */ +-#define TCP_CC_INFO 26 /* Get Congestion Control (optional) info */ +-#define TCP_SAVE_SYN 27 /* Record SYN headers for new connections */ +-#define TCP_SAVED_SYN 28 /* Get SYN headers recorded for connection */ +-#define TCP_REPAIR_WINDOW 29 /* Get/set window parameters */ +-#define TCP_FASTOPEN_CONNECT 30 /* Attempt FastOpen with connect */ +-#define TCP_ULP 31 /* Attach a ULP to a TCP connection */ +-#define TCP_MD5SIG_EXT 32 /* TCP MD5 Signature with extensions */ +- +-struct tcp_repair_opt { +- __u32 opt_code; +- __u32 opt_val; +-}; +- +-struct tcp_repair_window { +- __u32 snd_wl1; +- __u32 snd_wnd; +- __u32 max_window; +- +- __u32 rcv_wnd; +- __u32 rcv_wup; +-}; +- +-enum { +- TCP_NO_QUEUE, +- TCP_RECV_QUEUE, +- TCP_SEND_QUEUE, +- TCP_QUEUES_NR, +-}; +- +-/* for TCP_INFO socket option */ +-#define TCPI_OPT_TIMESTAMPS 1 +-#define TCPI_OPT_SACK 2 +-#define TCPI_OPT_WSCALE 4 +-#define TCPI_OPT_ECN 8 /* ECN was negociated at TCP session init */ +-#define TCPI_OPT_ECN_SEEN 16 /* we received at least one packet with ECT */ +-#define TCPI_OPT_SYN_DATA 32 /* SYN-ACK acked data in SYN sent or rcvd */ +- +-enum tcp_ca_state { +- TCP_CA_Open = 0, +-#define TCPF_CA_Open (1< +- +-/* NETLINK_GENERIC related info +- */ +-#define TCP_METRICS_GENL_NAME "tcp_metrics" +-#define TCP_METRICS_GENL_VERSION 0x1 +- +-enum tcp_metric_index { +- TCP_METRIC_RTT, /* in ms units */ +- TCP_METRIC_RTTVAR, /* in ms units */ +- TCP_METRIC_SSTHRESH, +- TCP_METRIC_CWND, +- TCP_METRIC_REORDERING, +- +- TCP_METRIC_RTT_US, /* in usec units */ +- TCP_METRIC_RTTVAR_US, /* in usec units */ +- +- /* Always last. */ +- __TCP_METRIC_MAX, +-}; +- +-#define TCP_METRIC_MAX (__TCP_METRIC_MAX - 1) +- +-enum { +- TCP_METRICS_ATTR_UNSPEC, +- TCP_METRICS_ATTR_ADDR_IPV4, /* u32 */ +- TCP_METRICS_ATTR_ADDR_IPV6, /* binary */ +- TCP_METRICS_ATTR_AGE, /* msecs */ +- TCP_METRICS_ATTR_TW_TSVAL, /* u32, raw, rcv tsval */ +- TCP_METRICS_ATTR_TW_TS_STAMP, /* s32, sec age */ +- TCP_METRICS_ATTR_VALS, /* nested +1, u32 */ +- TCP_METRICS_ATTR_FOPEN_MSS, /* u16 */ +- TCP_METRICS_ATTR_FOPEN_SYN_DROPS, /* u16, count of drops */ +- TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS, /* msecs age */ +- TCP_METRICS_ATTR_FOPEN_COOKIE, /* binary */ +- TCP_METRICS_ATTR_SADDR_IPV4, /* u32 */ +- TCP_METRICS_ATTR_SADDR_IPV6, /* binary */ +- TCP_METRICS_ATTR_PAD, +- +- __TCP_METRICS_ATTR_MAX, +-}; +- +-#define TCP_METRICS_ATTR_MAX (__TCP_METRICS_ATTR_MAX - 1) +- +-enum { +- TCP_METRICS_CMD_UNSPEC, +- TCP_METRICS_CMD_GET, +- TCP_METRICS_CMD_DEL, +- +- __TCP_METRICS_CMD_MAX, +-}; +- +-#define TCP_METRICS_CMD_MAX (__TCP_METRICS_CMD_MAX - 1) +- +-#endif /* _LINUX_TCP_METRICS_H */ +diff --git a/include/linux/tipc.h b/include/linux/tipc.h +deleted file mode 100644 +index 924fb5c..0000000 +--- a/include/linux/tipc.h ++++ /dev/null +@@ -1,256 +0,0 @@ +-/* +- * include/uapi/linux/tipc.h: Header for TIPC socket interface +- * +- * Copyright (c) 2003-2006, 2015-2016 Ericsson AB +- * Copyright (c) 2005, 2010-2011, Wind River Systems +- * All rights reserved. +- * +- * Redistribution and use in source and binary forms, with or without +- * modification, are permitted provided that the following conditions are met: +- * +- * 1. Redistributions of source code must retain the above copyright +- * notice, this list of conditions and the following disclaimer. +- * 2. Redistributions in binary form must reproduce the above copyright +- * notice, this list of conditions and the following disclaimer in the +- * documentation and/or other materials provided with the distribution. +- * 3. Neither the names of the copyright holders nor the names of its +- * contributors may be used to endorse or promote products derived from +- * this software without specific prior written permission. +- * +- * Alternatively, this software may be distributed under the terms of the +- * GNU General Public License ("GPL") version 2 as published by the Free +- * Software Foundation. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +- * POSSIBILITY OF SUCH DAMAGE. +- */ +- +-#ifndef _LINUX_TIPC_H_ +-#define _LINUX_TIPC_H_ +- +-#include +-#include +- +-/* +- * TIPC addressing primitives +- */ +- +-struct tipc_portid { +- __u32 ref; +- __u32 node; +-}; +- +-struct tipc_name { +- __u32 type; +- __u32 instance; +-}; +- +-struct tipc_name_seq { +- __u32 type; +- __u32 lower; +- __u32 upper; +-}; +- +-/* TIPC Address Size, Offset, Mask specification for Z.C.N +- */ +-#define TIPC_NODE_BITS 12 +-#define TIPC_CLUSTER_BITS 12 +-#define TIPC_ZONE_BITS 8 +- +-#define TIPC_NODE_OFFSET 0 +-#define TIPC_CLUSTER_OFFSET TIPC_NODE_BITS +-#define TIPC_ZONE_OFFSET (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS) +- +-#define TIPC_NODE_SIZE ((1UL << TIPC_NODE_BITS) - 1) +-#define TIPC_CLUSTER_SIZE ((1UL << TIPC_CLUSTER_BITS) - 1) +-#define TIPC_ZONE_SIZE ((1UL << TIPC_ZONE_BITS) - 1) +- +-#define TIPC_NODE_MASK (TIPC_NODE_SIZE << TIPC_NODE_OFFSET) +-#define TIPC_CLUSTER_MASK (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET) +-#define TIPC_ZONE_MASK (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET) +- +-#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK) +- +-static __inline__ __u32 tipc_addr(unsigned int zone, +- unsigned int cluster, +- unsigned int node) +-{ +- return (zone << TIPC_ZONE_OFFSET) | +- (cluster << TIPC_CLUSTER_OFFSET) | +- node; +-} +- +-static __inline__ unsigned int tipc_zone(__u32 addr) +-{ +- return addr >> TIPC_ZONE_OFFSET; +-} +- +-static __inline__ unsigned int tipc_cluster(__u32 addr) +-{ +- return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET; +-} +- +-static __inline__ unsigned int tipc_node(__u32 addr) +-{ +- return addr & TIPC_NODE_MASK; +-} +- +-/* +- * Application-accessible port name types +- */ +- +-#define TIPC_CFG_SRV 0 /* configuration service name type */ +-#define TIPC_TOP_SRV 1 /* topology service name type */ +-#define TIPC_LINK_STATE 2 /* link state name type */ +-#define TIPC_RESERVED_TYPES 64 /* lowest user-publishable name type */ +- +-/* +- * Publication scopes when binding port names and port name sequences +- */ +- +-#define TIPC_ZONE_SCOPE 1 +-#define TIPC_CLUSTER_SCOPE 2 +-#define TIPC_NODE_SCOPE 3 +- +-/* +- * Limiting values for messages +- */ +- +-#define TIPC_MAX_USER_MSG_SIZE 66000U +- +-/* +- * Message importance levels +- */ +- +-#define TIPC_LOW_IMPORTANCE 0 +-#define TIPC_MEDIUM_IMPORTANCE 1 +-#define TIPC_HIGH_IMPORTANCE 2 +-#define TIPC_CRITICAL_IMPORTANCE 3 +- +-/* +- * Msg rejection/connection shutdown reasons +- */ +- +-#define TIPC_OK 0 +-#define TIPC_ERR_NO_NAME 1 +-#define TIPC_ERR_NO_PORT 2 +-#define TIPC_ERR_NO_NODE 3 +-#define TIPC_ERR_OVERLOAD 4 +-#define TIPC_CONN_SHUTDOWN 5 +- +-/* +- * TIPC topology subscription service definitions +- */ +- +-#define TIPC_SUB_PORTS 0x01 /* filter for port availability */ +-#define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ +-#define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ +- +-#define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */ +- +-struct tipc_subscr { +- struct tipc_name_seq seq; /* name sequence of interest */ +- __u32 timeout; /* subscription duration (in ms) */ +- __u32 filter; /* bitmask of filter options */ +- char usr_handle[8]; /* available for subscriber use */ +-}; +- +-#define TIPC_PUBLISHED 1 /* publication event */ +-#define TIPC_WITHDRAWN 2 /* withdraw event */ +-#define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ +- +-struct tipc_event { +- __u32 event; /* event type */ +- __u32 found_lower; /* matching name seq instances */ +- __u32 found_upper; /* " " " " */ +- struct tipc_portid port; /* associated port */ +- struct tipc_subscr s; /* associated subscription */ +-}; +- +-/* +- * Socket API +- */ +- +-#ifndef AF_TIPC +-#define AF_TIPC 30 +-#endif +- +-#ifndef PF_TIPC +-#define PF_TIPC AF_TIPC +-#endif +- +-#ifndef SOL_TIPC +-#define SOL_TIPC 271 +-#endif +- +-#define TIPC_ADDR_NAMESEQ 1 +-#define TIPC_ADDR_MCAST 1 +-#define TIPC_ADDR_NAME 2 +-#define TIPC_ADDR_ID 3 +- +-struct sockaddr_tipc { +- unsigned short family; +- unsigned char addrtype; +- signed char scope; +- union { +- struct tipc_portid id; +- struct tipc_name_seq nameseq; +- struct { +- struct tipc_name name; +- __u32 domain; +- } name; +- } addr; +-}; +- +-/* +- * Ancillary data objects supported by recvmsg() +- */ +- +-#define TIPC_ERRINFO 1 /* error info */ +-#define TIPC_RETDATA 2 /* returned data */ +-#define TIPC_DESTNAME 3 /* destination name */ +- +-/* +- * TIPC-specific socket option names +- */ +- +-#define TIPC_IMPORTANCE 127 /* Default: TIPC_LOW_IMPORTANCE */ +-#define TIPC_SRC_DROPPABLE 128 /* Default: based on socket type */ +-#define TIPC_DEST_DROPPABLE 129 /* Default: based on socket type */ +-#define TIPC_CONN_TIMEOUT 130 /* Default: 8000 (ms) */ +-#define TIPC_NODE_RECVQ_DEPTH 131 /* Default: none (read only) */ +-#define TIPC_SOCK_RECVQ_DEPTH 132 /* Default: none (read only) */ +-#define TIPC_MCAST_BROADCAST 133 /* Default: TIPC selects. No arg */ +-#define TIPC_MCAST_REPLICAST 134 /* Default: TIPC selects. No arg */ +- +-/* +- * Maximum sizes of TIPC bearer-related names (including terminating NULL) +- * The string formatting for each name element is: +- * media: media +- * interface: media:interface name +- * link: Z.C.N:interface-Z.C.N:interface +- * +- */ +- +-#define TIPC_MAX_MEDIA_NAME 16 +-#define TIPC_MAX_IF_NAME 16 +-#define TIPC_MAX_BEARER_NAME 32 +-#define TIPC_MAX_LINK_NAME 60 +- +-#define SIOCGETLINKNAME SIOCPROTOPRIVATE +- +-struct tipc_sioc_ln_req { +- __u32 peer; +- __u32 bearer_id; +- char linkname[TIPC_MAX_LINK_NAME]; +-}; +-#endif +diff --git a/include/linux/tipc_netlink.h b/include/linux/tipc_netlink.h +deleted file mode 100644 +index f9edd20..0000000 +--- a/include/linux/tipc_netlink.h ++++ /dev/null +@@ -1,294 +0,0 @@ +-/* +- * Copyright (c) 2014, Ericsson AB +- * All rights reserved. +- * +- * Redistribution and use in source and binary forms, with or without +- * modification, are permitted provided that the following conditions are met: +- * +- * 1. Redistributions of source code must retain the above copyright +- * notice, this list of conditions and the following disclaimer. +- * 2. Redistributions in binary form must reproduce the above copyright +- * notice, this list of conditions and the following disclaimer in the +- * documentation and/or other materials provided with the distribution. +- * 3. Neither the names of the copyright holders nor the names of its +- * contributors may be used to endorse or promote products derived from +- * this software without specific prior written permission. +- * +- * Alternatively, this software may be distributed under the terms of the +- * GNU General Public License ("GPL") version 2 as published by the Free +- * Software Foundation. +- * +- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +- * POSSIBILITY OF SUCH DAMAGE. +- */ +- +-#ifndef _LINUX_TIPC_NETLINK_H_ +-#define _LINUX_TIPC_NETLINK_H_ +- +-#define TIPC_GENL_V2_NAME "TIPCv2" +-#define TIPC_GENL_V2_VERSION 0x1 +- +-/* Netlink commands */ +-enum { +- TIPC_NL_UNSPEC, +- TIPC_NL_LEGACY, +- TIPC_NL_BEARER_DISABLE, +- TIPC_NL_BEARER_ENABLE, +- TIPC_NL_BEARER_GET, +- TIPC_NL_BEARER_SET, +- TIPC_NL_SOCK_GET, +- TIPC_NL_PUBL_GET, +- TIPC_NL_LINK_GET, +- TIPC_NL_LINK_SET, +- TIPC_NL_LINK_RESET_STATS, +- TIPC_NL_MEDIA_GET, +- TIPC_NL_MEDIA_SET, +- TIPC_NL_NODE_GET, +- TIPC_NL_NET_GET, +- TIPC_NL_NET_SET, +- TIPC_NL_NAME_TABLE_GET, +- TIPC_NL_MON_SET, +- TIPC_NL_MON_GET, +- TIPC_NL_MON_PEER_GET, +- TIPC_NL_PEER_REMOVE, +- TIPC_NL_BEARER_ADD, +- TIPC_NL_UDP_GET_REMOTEIP, +- +- __TIPC_NL_CMD_MAX, +- TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1 +-}; +- +-/* Top level netlink attributes */ +-enum { +- TIPC_NLA_UNSPEC, +- TIPC_NLA_BEARER, /* nest */ +- TIPC_NLA_SOCK, /* nest */ +- TIPC_NLA_PUBL, /* nest */ +- TIPC_NLA_LINK, /* nest */ +- TIPC_NLA_MEDIA, /* nest */ +- TIPC_NLA_NODE, /* nest */ +- TIPC_NLA_NET, /* nest */ +- TIPC_NLA_NAME_TABLE, /* nest */ +- TIPC_NLA_MON, /* nest */ +- TIPC_NLA_MON_PEER, /* nest */ +- +- __TIPC_NLA_MAX, +- TIPC_NLA_MAX = __TIPC_NLA_MAX - 1 +-}; +- +-/* Bearer info */ +-enum { +- TIPC_NLA_BEARER_UNSPEC, +- TIPC_NLA_BEARER_NAME, /* string */ +- TIPC_NLA_BEARER_PROP, /* nest */ +- TIPC_NLA_BEARER_DOMAIN, /* u32 */ +- TIPC_NLA_BEARER_UDP_OPTS, /* nest */ +- +- __TIPC_NLA_BEARER_MAX, +- TIPC_NLA_BEARER_MAX = __TIPC_NLA_BEARER_MAX - 1 +-}; +- +-enum { +- TIPC_NLA_UDP_UNSPEC, +- TIPC_NLA_UDP_LOCAL, /* sockaddr_storage */ +- TIPC_NLA_UDP_REMOTE, /* sockaddr_storage */ +- TIPC_NLA_UDP_MULTI_REMOTEIP, /* flag */ +- +- __TIPC_NLA_UDP_MAX, +- TIPC_NLA_UDP_MAX = __TIPC_NLA_UDP_MAX - 1 +-}; +-/* Socket info */ +-enum { +- TIPC_NLA_SOCK_UNSPEC, +- TIPC_NLA_SOCK_ADDR, /* u32 */ +- TIPC_NLA_SOCK_REF, /* u32 */ +- TIPC_NLA_SOCK_CON, /* nest */ +- TIPC_NLA_SOCK_HAS_PUBL, /* flag */ +- +- __TIPC_NLA_SOCK_MAX, +- TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1 +-}; +- +-/* Link info */ +-enum { +- TIPC_NLA_LINK_UNSPEC, +- TIPC_NLA_LINK_NAME, /* string */ +- TIPC_NLA_LINK_DEST, /* u32 */ +- TIPC_NLA_LINK_MTU, /* u32 */ +- TIPC_NLA_LINK_BROADCAST, /* flag */ +- TIPC_NLA_LINK_UP, /* flag */ +- TIPC_NLA_LINK_ACTIVE, /* flag */ +- TIPC_NLA_LINK_PROP, /* nest */ +- TIPC_NLA_LINK_STATS, /* nest */ +- TIPC_NLA_LINK_RX, /* u32 */ +- TIPC_NLA_LINK_TX, /* u32 */ +- +- __TIPC_NLA_LINK_MAX, +- TIPC_NLA_LINK_MAX = __TIPC_NLA_LINK_MAX - 1 +-}; +- +-/* Media info */ +-enum { +- TIPC_NLA_MEDIA_UNSPEC, +- TIPC_NLA_MEDIA_NAME, /* string */ +- TIPC_NLA_MEDIA_PROP, /* nest */ +- +- __TIPC_NLA_MEDIA_MAX, +- TIPC_NLA_MEDIA_MAX = __TIPC_NLA_MEDIA_MAX - 1 +-}; +- +-/* Node info */ +-enum { +- TIPC_NLA_NODE_UNSPEC, +- TIPC_NLA_NODE_ADDR, /* u32 */ +- TIPC_NLA_NODE_UP, /* flag */ +- +- __TIPC_NLA_NODE_MAX, +- TIPC_NLA_NODE_MAX = __TIPC_NLA_NODE_MAX - 1 +-}; +- +-/* Net info */ +-enum { +- TIPC_NLA_NET_UNSPEC, +- TIPC_NLA_NET_ID, /* u32 */ +- TIPC_NLA_NET_ADDR, /* u32 */ +- +- __TIPC_NLA_NET_MAX, +- TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1 +-}; +- +-/* Name table info */ +-enum { +- TIPC_NLA_NAME_TABLE_UNSPEC, +- TIPC_NLA_NAME_TABLE_PUBL, /* nest */ +- +- __TIPC_NLA_NAME_TABLE_MAX, +- TIPC_NLA_NAME_TABLE_MAX = __TIPC_NLA_NAME_TABLE_MAX - 1 +-}; +- +-/* Monitor info */ +-enum { +- TIPC_NLA_MON_UNSPEC, +- TIPC_NLA_MON_ACTIVATION_THRESHOLD, /* u32 */ +- TIPC_NLA_MON_REF, /* u32 */ +- TIPC_NLA_MON_ACTIVE, /* flag */ +- TIPC_NLA_MON_BEARER_NAME, /* string */ +- TIPC_NLA_MON_PEERCNT, /* u32 */ +- TIPC_NLA_MON_LISTGEN, /* u32 */ +- +- __TIPC_NLA_MON_MAX, +- TIPC_NLA_MON_MAX = __TIPC_NLA_MON_MAX - 1 +-}; +- +-/* Publication info */ +-enum { +- TIPC_NLA_PUBL_UNSPEC, +- +- TIPC_NLA_PUBL_TYPE, /* u32 */ +- TIPC_NLA_PUBL_LOWER, /* u32 */ +- TIPC_NLA_PUBL_UPPER, /* u32 */ +- TIPC_NLA_PUBL_SCOPE, /* u32 */ +- TIPC_NLA_PUBL_NODE, /* u32 */ +- TIPC_NLA_PUBL_REF, /* u32 */ +- TIPC_NLA_PUBL_KEY, /* u32 */ +- +- __TIPC_NLA_PUBL_MAX, +- TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1 +-}; +- +-/* Monitor peer info */ +-enum { +- TIPC_NLA_MON_PEER_UNSPEC, +- +- TIPC_NLA_MON_PEER_ADDR, /* u32 */ +- TIPC_NLA_MON_PEER_DOMGEN, /* u32 */ +- TIPC_NLA_MON_PEER_APPLIED, /* u32 */ +- TIPC_NLA_MON_PEER_UPMAP, /* u64 */ +- TIPC_NLA_MON_PEER_MEMBERS, /* tlv */ +- TIPC_NLA_MON_PEER_UP, /* flag */ +- TIPC_NLA_MON_PEER_HEAD, /* flag */ +- TIPC_NLA_MON_PEER_LOCAL, /* flag */ +- TIPC_NLA_MON_PEER_PAD, /* flag */ +- +- __TIPC_NLA_MON_PEER_MAX, +- TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1 +-}; +- +-/* Nest, connection info */ +-enum { +- TIPC_NLA_CON_UNSPEC, +- +- TIPC_NLA_CON_FLAG, /* flag */ +- TIPC_NLA_CON_NODE, /* u32 */ +- TIPC_NLA_CON_SOCK, /* u32 */ +- TIPC_NLA_CON_TYPE, /* u32 */ +- TIPC_NLA_CON_INST, /* u32 */ +- +- __TIPC_NLA_CON_MAX, +- TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1 +-}; +- +-/* Nest, link propreties. Valid for link, media and bearer */ +-enum { +- TIPC_NLA_PROP_UNSPEC, +- +- TIPC_NLA_PROP_PRIO, /* u32 */ +- TIPC_NLA_PROP_TOL, /* u32 */ +- TIPC_NLA_PROP_WIN, /* u32 */ +- +- __TIPC_NLA_PROP_MAX, +- TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1 +-}; +- +-/* Nest, statistics info */ +-enum { +- TIPC_NLA_STATS_UNSPEC, +- +- TIPC_NLA_STATS_RX_INFO, /* u32 */ +- TIPC_NLA_STATS_RX_FRAGMENTS, /* u32 */ +- TIPC_NLA_STATS_RX_FRAGMENTED, /* u32 */ +- TIPC_NLA_STATS_RX_BUNDLES, /* u32 */ +- TIPC_NLA_STATS_RX_BUNDLED, /* u32 */ +- TIPC_NLA_STATS_TX_INFO, /* u32 */ +- TIPC_NLA_STATS_TX_FRAGMENTS, /* u32 */ +- TIPC_NLA_STATS_TX_FRAGMENTED, /* u32 */ +- TIPC_NLA_STATS_TX_BUNDLES, /* u32 */ +- TIPC_NLA_STATS_TX_BUNDLED, /* u32 */ +- TIPC_NLA_STATS_MSG_PROF_TOT, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_CNT, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_TOT, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P0, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P1, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P2, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P3, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P4, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P5, /* u32 */ +- TIPC_NLA_STATS_MSG_LEN_P6, /* u32 */ +- TIPC_NLA_STATS_RX_STATES, /* u32 */ +- TIPC_NLA_STATS_RX_PROBES, /* u32 */ +- TIPC_NLA_STATS_RX_NACKS, /* u32 */ +- TIPC_NLA_STATS_RX_DEFERRED, /* u32 */ +- TIPC_NLA_STATS_TX_STATES, /* u32 */ +- TIPC_NLA_STATS_TX_PROBES, /* u32 */ +- TIPC_NLA_STATS_TX_NACKS, /* u32 */ +- TIPC_NLA_STATS_TX_ACKS, /* u32 */ +- TIPC_NLA_STATS_RETRANSMITTED, /* u32 */ +- TIPC_NLA_STATS_DUPLICATES, /* u32 */ +- TIPC_NLA_STATS_LINK_CONGS, /* u32 */ +- TIPC_NLA_STATS_MAX_QUEUE, /* u32 */ +- TIPC_NLA_STATS_AVG_QUEUE, /* u32 */ +- +- __TIPC_NLA_STATS_MAX, +- TIPC_NLA_STATS_MAX = __TIPC_NLA_STATS_MAX - 1 +-}; +- +-#endif +diff --git a/include/linux/types.h b/include/linux/types.h +deleted file mode 100644 +index c640657..0000000 +--- a/include/linux/types.h ++++ /dev/null +@@ -1,47 +0,0 @@ +-#ifndef _LINUX_TYPES_H +-#define _LINUX_TYPES_H +- +-#include +- +-#ifndef __ASSEMBLY__ +- +-#include +- +- +-/* +- * Below are truly Linux-specific types that should never collide with +- * any application/library that wants linux/types.h. +- */ +- +-#ifdef __CHECKER__ +-#define __bitwise__ __attribute__((bitwise)) +-#else +-#define __bitwise__ +-#endif +-#define __bitwise __bitwise__ +- +-typedef __u16 __bitwise __le16; +-typedef __u16 __bitwise __be16; +-typedef __u32 __bitwise __le32; +-typedef __u32 __bitwise __be32; +-typedef __u64 __bitwise __le64; +-typedef __u64 __bitwise __be64; +- +-typedef __u16 __bitwise __sum16; +-typedef __u32 __bitwise __wsum; +- +-/* +- * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid +- * common 32/64-bit compat problems. +- * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other +- * architectures) and to 8-byte boundaries on 64-bit architectures. The new +- * aligned_64 type enforces 8-byte alignment so that structs containing +- * aligned_64 values have the same alignment on 32-bit and 64-bit architectures. +- * No conversions are necessary between 32-bit user-space and a 64-bit kernel. +- */ +-#define __aligned_u64 __u64 __attribute__((aligned(8))) +-#define __aligned_be64 __be64 __attribute__((aligned(8))) +-#define __aligned_le64 __le64 __attribute__((aligned(8))) +- +-#endif /* __ASSEMBLY__ */ +-#endif /* _LINUX_TYPES_H */ +diff --git a/include/linux/unix_diag.h b/include/linux/unix_diag.h +deleted file mode 100644 +index 1eb0b8d..0000000 +--- a/include/linux/unix_diag.h ++++ /dev/null +@@ -1,58 +0,0 @@ +-#ifndef __UNIX_DIAG_H__ +-#define __UNIX_DIAG_H__ +- +-#include +- +-struct unix_diag_req { +- __u8 sdiag_family; +- __u8 sdiag_protocol; +- __u16 pad; +- __u32 udiag_states; +- __u32 udiag_ino; +- __u32 udiag_show; +- __u32 udiag_cookie[2]; +-}; +- +-#define UDIAG_SHOW_NAME 0x00000001 /* show name (not path) */ +-#define UDIAG_SHOW_VFS 0x00000002 /* show VFS inode info */ +-#define UDIAG_SHOW_PEER 0x00000004 /* show peer socket info */ +-#define UDIAG_SHOW_ICONS 0x00000008 /* show pending connections */ +-#define UDIAG_SHOW_RQLEN 0x00000010 /* show skb receive queue len */ +-#define UDIAG_SHOW_MEMINFO 0x00000020 /* show memory info of a socket */ +- +-struct unix_diag_msg { +- __u8 udiag_family; +- __u8 udiag_type; +- __u8 udiag_state; +- __u8 pad; +- +- __u32 udiag_ino; +- __u32 udiag_cookie[2]; +-}; +- +-enum { +- /* UNIX_DIAG_NONE, standard nl API requires this attribute! */ +- UNIX_DIAG_NAME, +- UNIX_DIAG_VFS, +- UNIX_DIAG_PEER, +- UNIX_DIAG_ICONS, +- UNIX_DIAG_RQLEN, +- UNIX_DIAG_MEMINFO, +- UNIX_DIAG_SHUTDOWN, +- +- __UNIX_DIAG_MAX, +-}; +- +-#define UNIX_DIAG_MAX (__UNIX_DIAG_MAX - 1) +- +-struct unix_diag_vfs { +- __u32 udiag_vfs_ino; +- __u32 udiag_vfs_dev; +-}; +- +-struct unix_diag_rqlen { +- __u32 udiag_rqueue; +- __u32 udiag_wqueue; +-}; +- +-#endif +diff --git a/include/linux/veth.h b/include/linux/veth.h +deleted file mode 100644 +index 3354c1e..0000000 +--- a/include/linux/veth.h ++++ /dev/null +@@ -1,12 +0,0 @@ +-#ifndef __NET_VETH_H_ +-#define __NET_VETH_H_ +- +-enum { +- VETH_INFO_UNSPEC, +- VETH_INFO_PEER, +- +- __VETH_INFO_MAX +-#define VETH_INFO_MAX (__VETH_INFO_MAX - 1) +-}; +- +-#endif +diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h +deleted file mode 100644 +index 5790293..0000000 +--- a/include/linux/xfrm.h ++++ /dev/null +@@ -1,536 +0,0 @@ +-#ifndef _LINUX_XFRM_H +-#define _LINUX_XFRM_H +- +-#include +-#include +- +-/* All of the structures in this file may not change size as they are +- * passed into the kernel from userspace via netlink sockets. +- */ +- +-/* Structure to encapsulate addresses. I do not want to use +- * "standard" structure. My apologies. +- */ +-typedef union { +- __be32 a4; +- __be32 a6[4]; +- struct in6_addr in6; +-} xfrm_address_t; +- +-/* Ident of a specific xfrm_state. It is used on input to lookup +- * the state by (spi,daddr,ah/esp) or to store information about +- * spi, protocol and tunnel address on output. +- */ +-struct xfrm_id { +- xfrm_address_t daddr; +- __be32 spi; +- __u8 proto; +-}; +- +-struct xfrm_sec_ctx { +- __u8 ctx_doi; +- __u8 ctx_alg; +- __u16 ctx_len; +- __u32 ctx_sid; +- char ctx_str[0]; +-}; +- +-/* Security Context Domains of Interpretation */ +-#define XFRM_SC_DOI_RESERVED 0 +-#define XFRM_SC_DOI_LSM 1 +- +-/* Security Context Algorithms */ +-#define XFRM_SC_ALG_RESERVED 0 +-#define XFRM_SC_ALG_SELINUX 1 +- +-/* Selector, used as selector both on policy rules (SPD) and SAs. */ +- +-struct xfrm_selector { +- xfrm_address_t daddr; +- xfrm_address_t saddr; +- __be16 dport; +- __be16 dport_mask; +- __be16 sport; +- __be16 sport_mask; +- __u16 family; +- __u8 prefixlen_d; +- __u8 prefixlen_s; +- __u8 proto; +- int ifindex; +- __kernel_uid32_t user; +-}; +- +-#define XFRM_INF (~(__u64)0) +- +-struct xfrm_lifetime_cfg { +- __u64 soft_byte_limit; +- __u64 hard_byte_limit; +- __u64 soft_packet_limit; +- __u64 hard_packet_limit; +- __u64 soft_add_expires_seconds; +- __u64 hard_add_expires_seconds; +- __u64 soft_use_expires_seconds; +- __u64 hard_use_expires_seconds; +-}; +- +-struct xfrm_lifetime_cur { +- __u64 bytes; +- __u64 packets; +- __u64 add_time; +- __u64 use_time; +-}; +- +-struct xfrm_replay_state { +- __u32 oseq; +- __u32 seq; +- __u32 bitmap; +-}; +- +-#define XFRMA_REPLAY_ESN_MAX 4096 +- +-struct xfrm_replay_state_esn { +- unsigned int bmp_len; +- __u32 oseq; +- __u32 seq; +- __u32 oseq_hi; +- __u32 seq_hi; +- __u32 replay_window; +- __u32 bmp[0]; +-}; +- +-struct xfrm_algo { +- char alg_name[64]; +- unsigned int alg_key_len; /* in bits */ +- char alg_key[0]; +-}; +- +-struct xfrm_algo_auth { +- char alg_name[64]; +- unsigned int alg_key_len; /* in bits */ +- unsigned int alg_trunc_len; /* in bits */ +- char alg_key[0]; +-}; +- +-struct xfrm_algo_aead { +- char alg_name[64]; +- unsigned int alg_key_len; /* in bits */ +- unsigned int alg_icv_len; /* in bits */ +- char alg_key[0]; +-}; +- +-struct xfrm_stats { +- __u32 replay_window; +- __u32 replay; +- __u32 integrity_failed; +-}; +- +-enum { +- XFRM_POLICY_TYPE_MAIN = 0, +- XFRM_POLICY_TYPE_SUB = 1, +- XFRM_POLICY_TYPE_MAX = 2, +- XFRM_POLICY_TYPE_ANY = 255 +-}; +- +-enum { +- XFRM_POLICY_IN = 0, +- XFRM_POLICY_OUT = 1, +- XFRM_POLICY_FWD = 2, +- XFRM_POLICY_MASK = 3, +- XFRM_POLICY_MAX = 3 +-}; +- +-enum { +- XFRM_SHARE_ANY, /* No limitations */ +- XFRM_SHARE_SESSION, /* For this session only */ +- XFRM_SHARE_USER, /* For this user only */ +- XFRM_SHARE_UNIQUE /* Use once */ +-}; +- +-#define XFRM_MODE_TRANSPORT 0 +-#define XFRM_MODE_TUNNEL 1 +-#define XFRM_MODE_ROUTEOPTIMIZATION 2 +-#define XFRM_MODE_IN_TRIGGER 3 +-#define XFRM_MODE_BEET 4 +-#define XFRM_MODE_MAX 5 +- +-/* Netlink configuration messages. */ +-enum { +- XFRM_MSG_BASE = 0x10, +- +- XFRM_MSG_NEWSA = 0x10, +-#define XFRM_MSG_NEWSA XFRM_MSG_NEWSA +- XFRM_MSG_DELSA, +-#define XFRM_MSG_DELSA XFRM_MSG_DELSA +- XFRM_MSG_GETSA, +-#define XFRM_MSG_GETSA XFRM_MSG_GETSA +- +- XFRM_MSG_NEWPOLICY, +-#define XFRM_MSG_NEWPOLICY XFRM_MSG_NEWPOLICY +- XFRM_MSG_DELPOLICY, +-#define XFRM_MSG_DELPOLICY XFRM_MSG_DELPOLICY +- XFRM_MSG_GETPOLICY, +-#define XFRM_MSG_GETPOLICY XFRM_MSG_GETPOLICY +- +- XFRM_MSG_ALLOCSPI, +-#define XFRM_MSG_ALLOCSPI XFRM_MSG_ALLOCSPI +- XFRM_MSG_ACQUIRE, +-#define XFRM_MSG_ACQUIRE XFRM_MSG_ACQUIRE +- XFRM_MSG_EXPIRE, +-#define XFRM_MSG_EXPIRE XFRM_MSG_EXPIRE +- +- XFRM_MSG_UPDPOLICY, +-#define XFRM_MSG_UPDPOLICY XFRM_MSG_UPDPOLICY +- XFRM_MSG_UPDSA, +-#define XFRM_MSG_UPDSA XFRM_MSG_UPDSA +- +- XFRM_MSG_POLEXPIRE, +-#define XFRM_MSG_POLEXPIRE XFRM_MSG_POLEXPIRE +- +- XFRM_MSG_FLUSHSA, +-#define XFRM_MSG_FLUSHSA XFRM_MSG_FLUSHSA +- XFRM_MSG_FLUSHPOLICY, +-#define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY +- +- XFRM_MSG_NEWAE, +-#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE +- XFRM_MSG_GETAE, +-#define XFRM_MSG_GETAE XFRM_MSG_GETAE +- +- XFRM_MSG_REPORT, +-#define XFRM_MSG_REPORT XFRM_MSG_REPORT +- +- XFRM_MSG_MIGRATE, +-#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE +- +- XFRM_MSG_NEWSADINFO, +-#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO +- XFRM_MSG_GETSADINFO, +-#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO +- +- XFRM_MSG_NEWSPDINFO, +-#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO +- XFRM_MSG_GETSPDINFO, +-#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO +- +- XFRM_MSG_MAPPING, +-#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING +- __XFRM_MSG_MAX +-}; +-#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1) +- +-#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE) +- +-/* +- * Generic LSM security context for comunicating to user space +- * NOTE: Same format as sadb_x_sec_ctx +- */ +-struct xfrm_user_sec_ctx { +- __u16 len; +- __u16 exttype; +- __u8 ctx_alg; /* LSMs: e.g., selinux == 1 */ +- __u8 ctx_doi; +- __u16 ctx_len; +-}; +- +-struct xfrm_user_tmpl { +- struct xfrm_id id; +- __u16 family; +- xfrm_address_t saddr; +- __u32 reqid; +- __u8 mode; +- __u8 share; +- __u8 optional; +- __u32 aalgos; +- __u32 ealgos; +- __u32 calgos; +-}; +- +-struct xfrm_encap_tmpl { +- __u16 encap_type; +- __be16 encap_sport; +- __be16 encap_dport; +- xfrm_address_t encap_oa; +-}; +- +-/* AEVENT flags */ +-enum xfrm_ae_ftype_t { +- XFRM_AE_UNSPEC, +- XFRM_AE_RTHR=1, /* replay threshold*/ +- XFRM_AE_RVAL=2, /* replay value */ +- XFRM_AE_LVAL=4, /* lifetime value */ +- XFRM_AE_ETHR=8, /* expiry timer threshold */ +- XFRM_AE_CR=16, /* Event cause is replay update */ +- XFRM_AE_CE=32, /* Event cause is timer expiry */ +- XFRM_AE_CU=64, /* Event cause is policy update */ +- __XFRM_AE_MAX +- +-#define XFRM_AE_MAX (__XFRM_AE_MAX - 1) +-}; +- +-struct xfrm_userpolicy_type { +- __u8 type; +- __u16 reserved1; +- __u8 reserved2; +-}; +- +-/* Netlink message attributes. */ +-enum xfrm_attr_type_t { +- XFRMA_UNSPEC, +- XFRMA_ALG_AUTH, /* struct xfrm_algo */ +- XFRMA_ALG_CRYPT, /* struct xfrm_algo */ +- XFRMA_ALG_COMP, /* struct xfrm_algo */ +- XFRMA_ENCAP, /* struct xfrm_algo + struct xfrm_encap_tmpl */ +- XFRMA_TMPL, /* 1 or more struct xfrm_user_tmpl */ +- XFRMA_SA, /* struct xfrm_usersa_info */ +- XFRMA_POLICY, /*struct xfrm_userpolicy_info */ +- XFRMA_SEC_CTX, /* struct xfrm_sec_ctx */ +- XFRMA_LTIME_VAL, +- XFRMA_REPLAY_VAL, +- XFRMA_REPLAY_THRESH, +- XFRMA_ETIMER_THRESH, +- XFRMA_SRCADDR, /* xfrm_address_t */ +- XFRMA_COADDR, /* xfrm_address_t */ +- XFRMA_LASTUSED, /* unsigned long */ +- XFRMA_POLICY_TYPE, /* struct xfrm_userpolicy_type */ +- XFRMA_MIGRATE, +- XFRMA_ALG_AEAD, /* struct xfrm_algo_aead */ +- XFRMA_KMADDRESS, /* struct xfrm_user_kmaddress */ +- XFRMA_ALG_AUTH_TRUNC, /* struct xfrm_algo_auth */ +- XFRMA_MARK, /* struct xfrm_mark */ +- XFRMA_TFCPAD, /* __u32 */ +- XFRMA_REPLAY_ESN_VAL, /* struct xfrm_replay_state_esn */ +- XFRMA_SA_EXTRA_FLAGS, /* __u32 */ +- XFRMA_PROTO, /* __u8 */ +- XFRMA_ADDRESS_FILTER, /* struct xfrm_address_filter */ +- XFRMA_PAD, +- XFRMA_OFFLOAD_DEV, /* struct xfrm_state_offload */ +- XFRMA_OUTPUT_MARK, /* __u32 */ +- __XFRMA_MAX +- +-#define XFRMA_MAX (__XFRMA_MAX - 1) +-}; +- +-struct xfrm_mark { +- __u32 v; /* value */ +- __u32 m; /* mask */ +-}; +- +-enum xfrm_sadattr_type_t { +- XFRMA_SAD_UNSPEC, +- XFRMA_SAD_CNT, +- XFRMA_SAD_HINFO, +- __XFRMA_SAD_MAX +- +-#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1) +-}; +- +-struct xfrmu_sadhinfo { +- __u32 sadhcnt; /* current hash bkts */ +- __u32 sadhmcnt; /* max allowed hash bkts */ +-}; +- +-enum xfrm_spdattr_type_t { +- XFRMA_SPD_UNSPEC, +- XFRMA_SPD_INFO, +- XFRMA_SPD_HINFO, +- XFRMA_SPD_IPV4_HTHRESH, +- XFRMA_SPD_IPV6_HTHRESH, +- __XFRMA_SPD_MAX +- +-#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1) +-}; +- +-struct xfrmu_spdinfo { +- __u32 incnt; +- __u32 outcnt; +- __u32 fwdcnt; +- __u32 inscnt; +- __u32 outscnt; +- __u32 fwdscnt; +-}; +- +-struct xfrmu_spdhinfo { +- __u32 spdhcnt; +- __u32 spdhmcnt; +-}; +- +-struct xfrmu_spdhthresh { +- __u8 lbits; +- __u8 rbits; +-}; +- +-struct xfrm_usersa_info { +- struct xfrm_selector sel; +- struct xfrm_id id; +- xfrm_address_t saddr; +- struct xfrm_lifetime_cfg lft; +- struct xfrm_lifetime_cur curlft; +- struct xfrm_stats stats; +- __u32 seq; +- __u32 reqid; +- __u16 family; +- __u8 mode; /* XFRM_MODE_xxx */ +- __u8 replay_window; +- __u8 flags; +-#define XFRM_STATE_NOECN 1 +-#define XFRM_STATE_DECAP_DSCP 2 +-#define XFRM_STATE_NOPMTUDISC 4 +-#define XFRM_STATE_WILDRECV 8 +-#define XFRM_STATE_ICMP 16 +-#define XFRM_STATE_AF_UNSPEC 32 +-#define XFRM_STATE_ALIGN4 64 +-#define XFRM_STATE_ESN 128 +-}; +- +-#define XFRM_SA_XFLAG_DONT_ENCAP_DSCP 1 +- +-struct xfrm_usersa_id { +- xfrm_address_t daddr; +- __be32 spi; +- __u16 family; +- __u8 proto; +-}; +- +-struct xfrm_aevent_id { +- struct xfrm_usersa_id sa_id; +- xfrm_address_t saddr; +- __u32 flags; +- __u32 reqid; +-}; +- +-struct xfrm_userspi_info { +- struct xfrm_usersa_info info; +- __u32 min; +- __u32 max; +-}; +- +-struct xfrm_userpolicy_info { +- struct xfrm_selector sel; +- struct xfrm_lifetime_cfg lft; +- struct xfrm_lifetime_cur curlft; +- __u32 priority; +- __u32 index; +- __u8 dir; +- __u8 action; +-#define XFRM_POLICY_ALLOW 0 +-#define XFRM_POLICY_BLOCK 1 +- __u8 flags; +-#define XFRM_POLICY_LOCALOK 1 /* Allow user to override global policy */ +- /* Automatically expand selector to include matching ICMP payloads. */ +-#define XFRM_POLICY_ICMP 2 +- __u8 share; +-}; +- +-struct xfrm_userpolicy_id { +- struct xfrm_selector sel; +- __u32 index; +- __u8 dir; +-}; +- +-struct xfrm_user_acquire { +- struct xfrm_id id; +- xfrm_address_t saddr; +- struct xfrm_selector sel; +- struct xfrm_userpolicy_info policy; +- __u32 aalgos; +- __u32 ealgos; +- __u32 calgos; +- __u32 seq; +-}; +- +-struct xfrm_user_expire { +- struct xfrm_usersa_info state; +- __u8 hard; +-}; +- +-struct xfrm_user_polexpire { +- struct xfrm_userpolicy_info pol; +- __u8 hard; +-}; +- +-struct xfrm_usersa_flush { +- __u8 proto; +-}; +- +-struct xfrm_user_report { +- __u8 proto; +- struct xfrm_selector sel; +-}; +- +-/* Used by MIGRATE to pass addresses IKE should use to perform +- * SA negotiation with the peer */ +-struct xfrm_user_kmaddress { +- xfrm_address_t local; +- xfrm_address_t remote; +- __u32 reserved; +- __u16 family; +-}; +- +-struct xfrm_user_migrate { +- xfrm_address_t old_daddr; +- xfrm_address_t old_saddr; +- xfrm_address_t new_daddr; +- xfrm_address_t new_saddr; +- __u8 proto; +- __u8 mode; +- __u16 reserved; +- __u32 reqid; +- __u16 old_family; +- __u16 new_family; +-}; +- +-struct xfrm_user_mapping { +- struct xfrm_usersa_id id; +- __u32 reqid; +- xfrm_address_t old_saddr; +- xfrm_address_t new_saddr; +- __be16 old_sport; +- __be16 new_sport; +-}; +- +-struct xfrm_address_filter { +- xfrm_address_t saddr; +- xfrm_address_t daddr; +- __u16 family; +- __u8 splen; +- __u8 dplen; +-}; +- +-struct xfrm_user_offload { +- int ifindex; +- __u8 flags; +-}; +-#define XFRM_OFFLOAD_IPV6 1 +-#define XFRM_OFFLOAD_INBOUND 2 +- +-/* backwards compatibility for userspace */ +-#define XFRMGRP_ACQUIRE 1 +-#define XFRMGRP_EXPIRE 2 +-#define XFRMGRP_SA 4 +-#define XFRMGRP_POLICY 8 +-#define XFRMGRP_REPORT 0x20 +- +-enum xfrm_nlgroups { +- XFRMNLGRP_NONE, +-#define XFRMNLGRP_NONE XFRMNLGRP_NONE +- XFRMNLGRP_ACQUIRE, +-#define XFRMNLGRP_ACQUIRE XFRMNLGRP_ACQUIRE +- XFRMNLGRP_EXPIRE, +-#define XFRMNLGRP_EXPIRE XFRMNLGRP_EXPIRE +- XFRMNLGRP_SA, +-#define XFRMNLGRP_SA XFRMNLGRP_SA +- XFRMNLGRP_POLICY, +-#define XFRMNLGRP_POLICY XFRMNLGRP_POLICY +- XFRMNLGRP_AEVENTS, +-#define XFRMNLGRP_AEVENTS XFRMNLGRP_AEVENTS +- XFRMNLGRP_REPORT, +-#define XFRMNLGRP_REPORT XFRMNLGRP_REPORT +- XFRMNLGRP_MIGRATE, +-#define XFRMNLGRP_MIGRATE XFRMNLGRP_MIGRATE +- XFRMNLGRP_MAPPING, +-#define XFRMNLGRP_MAPPING XFRMNLGRP_MAPPING +- __XFRMNLGRP_MAX +-}; +-#define XFRMNLGRP_MAX (__XFRMNLGRP_MAX - 1) +- +-#endif /* _LINUX_XFRM_H */ +diff --git a/include/uapi/linux/atm.h b/include/uapi/linux/atm.h +new file mode 100644 +index 0000000..08e27be +--- /dev/null ++++ b/include/uapi/linux/atm.h +@@ -0,0 +1,241 @@ ++/* atm.h - general ATM declarations */ ++ ++/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ ++ ++ ++/* ++ * WARNING: User-space programs should not #include directly. ++ * Instead, #include ++ */ ++ ++#ifndef _LINUX_ATM_H ++#define _LINUX_ATM_H ++ ++/* ++ * BEGIN_xx and END_xx markers are used for automatic generation of ++ * documentation. Do not change them. ++ */ ++ ++ ++#include ++#include ++#include ++#include ++ ++ ++/* general ATM constants */ ++#define ATM_CELL_SIZE 53 /* ATM cell size incl. header */ ++#define ATM_CELL_PAYLOAD 48 /* ATM payload size */ ++#define ATM_AAL0_SDU 52 /* AAL0 SDU size */ ++#define ATM_MAX_AAL34_PDU 65535 /* maximum AAL3/4 PDU payload */ ++#define ATM_AAL5_TRAILER 8 /* AAL5 trailer size */ ++#define ATM_MAX_AAL5_PDU 65535 /* maximum AAL5 PDU payload */ ++#define ATM_MAX_CDV 9999 /* maximum (default) CDV */ ++#define ATM_NOT_RSV_VCI 32 /* first non-reserved VCI value */ ++ ++#define ATM_MAX_VPI 255 /* maximum VPI at the UNI */ ++#define ATM_MAX_VPI_NNI 4096 /* maximum VPI at the NNI */ ++#define ATM_MAX_VCI 65535 /* maximum VCI */ ++ ++ ++/* "protcol" values for the socket system call */ ++#define ATM_NO_AAL 0 /* AAL not specified */ ++#define ATM_AAL0 13 /* "raw" ATM cells */ ++#define ATM_AAL1 1 /* AAL1 (CBR) */ ++#define ATM_AAL2 2 /* AAL2 (VBR) */ ++#define ATM_AAL34 3 /* AAL3/4 (data) */ ++#define ATM_AAL5 5 /* AAL5 (data) */ ++ ++/* ++ * socket option name coding functions ++ * ++ * Note that __SO_ENCODE and __SO_LEVEL are somewhat a hack since the ++ * << 22 only reserves 9 bits for the level. On some architectures ++ * SOL_SOCKET is 0xFFFF, so that's a bit of a problem ++ */ ++ ++#define __SO_ENCODE(l,n,t) ((((l) & 0x1FF) << 22) | ((n) << 16) | \ ++ sizeof(t)) ++#define __SO_LEVEL_MATCH(c,m) (((c) >> 22) == ((m) & 0x1FF)) ++#define __SO_NUMBER(c) (((c) >> 16) & 0x3f) ++#define __SO_SIZE(c) ((c) & 0x3fff) ++ ++/* ++ * ATM layer ++ */ ++ ++#define SO_SETCLP __SO_ENCODE(SOL_ATM,0,int) ++ /* set CLP bit value - TODO */ ++#define SO_CIRANGE __SO_ENCODE(SOL_ATM,1,struct atm_cirange) ++ /* connection identifier range; socket must be ++ bound or connected */ ++#define SO_ATMQOS __SO_ENCODE(SOL_ATM,2,struct atm_qos) ++ /* Quality of Service setting */ ++#define SO_ATMSAP __SO_ENCODE(SOL_ATM,3,struct atm_sap) ++ /* Service Access Point */ ++#define SO_ATMPVC __SO_ENCODE(SOL_ATM,4,struct sockaddr_atmpvc) ++ /* "PVC" address (also for SVCs); get only */ ++#define SO_MULTIPOINT __SO_ENCODE(SOL_ATM, 5, int) ++ /* make this vc a p2mp */ ++ ++ ++/* ++ * Note @@@: since the socket layers don't really distinguish the control and ++ * the data plane but generally seems to be data plane-centric, any layer is ++ * about equally wrong for the SAP. If you have a better idea about this, ++ * please speak up ... ++ */ ++ ++ ++/* ATM cell header (for AAL0) */ ++ ++/* BEGIN_CH */ ++#define ATM_HDR_GFC_MASK 0xf0000000 ++#define ATM_HDR_GFC_SHIFT 28 ++#define ATM_HDR_VPI_MASK 0x0ff00000 ++#define ATM_HDR_VPI_SHIFT 20 ++#define ATM_HDR_VCI_MASK 0x000ffff0 ++#define ATM_HDR_VCI_SHIFT 4 ++#define ATM_HDR_PTI_MASK 0x0000000e ++#define ATM_HDR_PTI_SHIFT 1 ++#define ATM_HDR_CLP 0x00000001 ++/* END_CH */ ++ ++ ++/* PTI codings */ ++ ++/* BEGIN_PTI */ ++#define ATM_PTI_US0 0 /* user data cell, congestion not exp, SDU-type 0 */ ++#define ATM_PTI_US1 1 /* user data cell, congestion not exp, SDU-type 1 */ ++#define ATM_PTI_UCES0 2 /* user data cell, cong. experienced, SDU-type 0 */ ++#define ATM_PTI_UCES1 3 /* user data cell, cong. experienced, SDU-type 1 */ ++#define ATM_PTI_SEGF5 4 /* segment OAM F5 flow related cell */ ++#define ATM_PTI_E2EF5 5 /* end-to-end OAM F5 flow related cell */ ++#define ATM_PTI_RSV_RM 6 /* reserved for traffic control/resource mgmt */ ++#define ATM_PTI_RSV 7 /* reserved */ ++/* END_PTI */ ++ ++ ++/* ++ * The following items should stay in linux/atm.h, which should be linked to ++ * netatm/atm.h ++ */ ++ ++/* Traffic description */ ++ ++#define ATM_NONE 0 /* no traffic */ ++#define ATM_UBR 1 ++#define ATM_CBR 2 ++#define ATM_VBR 3 ++#define ATM_ABR 4 ++#define ATM_ANYCLASS 5 /* compatible with everything */ ++ ++#define ATM_MAX_PCR -1 /* maximum available PCR */ ++ ++struct atm_trafprm { ++ unsigned char traffic_class; /* traffic class (ATM_UBR, ...) */ ++ int max_pcr; /* maximum PCR in cells per second */ ++ int pcr; /* desired PCR in cells per second */ ++ int min_pcr; /* minimum PCR in cells per second */ ++ int max_cdv; /* maximum CDV in microseconds */ ++ int max_sdu; /* maximum SDU in bytes */ ++ /* extra params for ABR */ ++ unsigned int icr; /* Initial Cell Rate (24-bit) */ ++ unsigned int tbe; /* Transient Buffer Exposure (24-bit) */ ++ unsigned int frtt : 24; /* Fixed Round Trip Time (24-bit) */ ++ unsigned int rif : 4; /* Rate Increment Factor (4-bit) */ ++ unsigned int rdf : 4; /* Rate Decrease Factor (4-bit) */ ++ unsigned int nrm_pres :1; /* nrm present bit */ ++ unsigned int trm_pres :1; /* rm present bit */ ++ unsigned int adtf_pres :1; /* adtf present bit */ ++ unsigned int cdf_pres :1; /* cdf present bit*/ ++ unsigned int nrm :3; /* Max # of Cells for each forward RM cell (3-bit) */ ++ unsigned int trm :3; /* Time between forward RM cells (3-bit) */ ++ unsigned int adtf :10; /* ACR Decrease Time Factor (10-bit) */ ++ unsigned int cdf :3; /* Cutoff Decrease Factor (3-bit) */ ++ unsigned int spare :9; /* spare bits */ ++}; ++ ++struct atm_qos { ++ struct atm_trafprm txtp; /* parameters in TX direction */ ++ struct atm_trafprm rxtp __ATM_API_ALIGN; ++ /* parameters in RX direction */ ++ unsigned char aal __ATM_API_ALIGN; ++}; ++ ++/* PVC addressing */ ++ ++#define ATM_ITF_ANY -1 /* "magic" PVC address values */ ++#define ATM_VPI_ANY -1 ++#define ATM_VCI_ANY -1 ++#define ATM_VPI_UNSPEC -2 ++#define ATM_VCI_UNSPEC -2 ++ ++ ++struct sockaddr_atmpvc { ++ unsigned short sap_family; /* address family, AF_ATMPVC */ ++ struct { /* PVC address */ ++ short itf; /* ATM interface */ ++ short vpi; /* VPI (only 8 bits at UNI) */ ++ int vci; /* VCI (only 16 bits at UNI) */ ++ } sap_addr __ATM_API_ALIGN; /* PVC address */ ++}; ++ ++/* SVC addressing */ ++ ++#define ATM_ESA_LEN 20 /* ATM End System Address length */ ++#define ATM_E164_LEN 12 /* maximum E.164 number length */ ++ ++#define ATM_AFI_DCC 0x39 /* DCC ATM Format */ ++#define ATM_AFI_ICD 0x47 /* ICD ATM Format */ ++#define ATM_AFI_E164 0x45 /* E.164 ATM Format */ ++#define ATM_AFI_LOCAL 0x49 /* Local ATM Format */ ++ ++#define ATM_AFI_DCC_GROUP 0xBD /* DCC ATM Group Format */ ++#define ATM_AFI_ICD_GROUP 0xC5 /* ICD ATM Group Format */ ++#define ATM_AFI_E164_GROUP 0xC3 /* E.164 ATM Group Format */ ++#define ATM_AFI_LOCAL_GROUP 0xC7 /* Local ATM Group Format */ ++ ++#define ATM_LIJ_NONE 0 /* no leaf-initiated join */ ++#define ATM_LIJ 1 /* request joining */ ++#define ATM_LIJ_RPJ 2 /* set to root-prompted join */ ++#define ATM_LIJ_NJ 3 /* set to network join */ ++ ++ ++struct sockaddr_atmsvc { ++ unsigned short sas_family; /* address family, AF_ATMSVC */ ++ struct { /* SVC address */ ++ unsigned char prv[ATM_ESA_LEN];/* private ATM address */ ++ char pub[ATM_E164_LEN+1]; /* public address (E.164) */ ++ /* unused addresses must be bzero'ed */ ++ char lij_type; /* role in LIJ call; one of ATM_LIJ* */ ++ __u32 lij_id; /* LIJ call identifier */ ++ } sas_addr __ATM_API_ALIGN; /* SVC address */ ++}; ++ ++ ++static __inline__ int atmsvc_addr_in_use(struct sockaddr_atmsvc addr) ++{ ++ return *addr.sas_addr.prv || *addr.sas_addr.pub; ++} ++ ++ ++static __inline__ int atmpvc_addr_in_use(struct sockaddr_atmpvc addr) ++{ ++ return addr.sap_addr.itf || addr.sap_addr.vpi || addr.sap_addr.vci; ++} ++ ++ ++/* ++ * Some stuff for linux/sockios.h ++ */ ++ ++struct atmif_sioc { ++ int number; ++ int length; ++ void *arg; ++}; ++ ++ ++typedef unsigned short atm_backend_t; ++#endif /* _LINUX_ATM_H */ +diff --git a/include/uapi/linux/atmapi.h b/include/uapi/linux/atmapi.h +new file mode 100644 +index 0000000..8fe54d9 +--- /dev/null ++++ b/include/uapi/linux/atmapi.h +@@ -0,0 +1,29 @@ ++/* atmapi.h - ATM API user space/kernel compatibility */ ++ ++/* Written 1999,2000 by Werner Almesberger, EPFL ICA */ ++ ++ ++#ifndef _LINUX_ATMAPI_H ++#define _LINUX_ATMAPI_H ++ ++#if defined(__sparc__) || defined(__ia64__) ++/* such alignment is not required on 32 bit sparcs, but we can't ++ figure that we are on a sparc64 while compiling user-space programs. */ ++#define __ATM_API_ALIGN __attribute__((aligned(8))) ++#else ++#define __ATM_API_ALIGN ++#endif ++ ++ ++/* ++ * Opaque type for kernel pointers. Note that _ is never accessed. We need ++ * the struct in order hide the array, so that we can make simple assignments ++ * instead of being forced to use memcpy. It also improves error reporting for ++ * code that still assumes that we're passing unsigned longs. ++ * ++ * Convention: NULL pointers are passed as a field of all zeroes. ++ */ ++ ++typedef struct { unsigned char _[8]; } __ATM_API_ALIGN atm_kptr_t; ++ ++#endif +diff --git a/include/uapi/linux/atmarp.h b/include/uapi/linux/atmarp.h +new file mode 100644 +index 0000000..231f4bd +--- /dev/null ++++ b/include/uapi/linux/atmarp.h +@@ -0,0 +1,41 @@ ++/* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */ ++ ++/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ ++ ++ ++#ifndef _LINUX_ATMARP_H ++#define _LINUX_ATMARP_H ++ ++#include ++#include ++#include ++ ++ ++#define ATMARP_RETRY_DELAY 30 /* request next resolution or forget ++ NAK after 30 sec - should go into ++ atmclip.h */ ++#define ATMARP_MAX_UNRES_PACKETS 5 /* queue that many packets while ++ waiting for the resolver */ ++ ++ ++#define ATMARPD_CTRL _IO('a',ATMIOC_CLIP+1) /* become atmarpd ctrl sock */ ++#define ATMARP_MKIP _IO('a',ATMIOC_CLIP+2) /* attach socket to IP */ ++#define ATMARP_SETENTRY _IO('a',ATMIOC_CLIP+3) /* fill or hide ARP entry */ ++#define ATMARP_ENCAP _IO('a',ATMIOC_CLIP+5) /* change encapsulation */ ++ ++ ++enum atmarp_ctrl_type { ++ act_invalid, /* catch uninitialized structures */ ++ act_need, /* need address resolution */ ++ act_up, /* interface is coming up */ ++ act_down, /* interface is going down */ ++ act_change /* interface configuration has changed */ ++}; ++ ++struct atmarp_ctrl { ++ enum atmarp_ctrl_type type; /* message type */ ++ int itf_num;/* interface number (if present) */ ++ __be32 ip; /* IP address (act_need only) */ ++}; ++ ++#endif +diff --git a/include/uapi/linux/atmdev.h b/include/uapi/linux/atmdev.h +new file mode 100644 +index 0000000..8faa8b9 +--- /dev/null ++++ b/include/uapi/linux/atmdev.h +@@ -0,0 +1,215 @@ ++/* atmdev.h - ATM device driver declarations and various related items */ ++ ++/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ ++ ++ ++#ifndef LINUX_ATMDEV_H ++#define LINUX_ATMDEV_H ++ ++ ++#include ++#include ++#include ++ ++ ++#define ESI_LEN 6 ++ ++#define ATM_OC3_PCR (155520000/270*260/8/53) ++ /* OC3 link rate: 155520000 bps ++ SONET overhead: /270*260 (9 section, 1 path) ++ bits per cell: /8/53 ++ max cell rate: 353207.547 cells/sec */ ++#define ATM_25_PCR ((25600000/8-8000)/54) ++ /* 25 Mbps ATM cell rate (59111) */ ++#define ATM_OC12_PCR (622080000/1080*1040/8/53) ++ /* OC12 link rate: 622080000 bps ++ SONET overhead: /1080*1040 ++ bits per cell: /8/53 ++ max cell rate: 1412830.188 cells/sec */ ++#define ATM_DS3_PCR (8000*12) ++ /* DS3: 12 cells in a 125 usec time slot */ ++ ++ ++#define __AAL_STAT_ITEMS \ ++ __HANDLE_ITEM(tx); /* TX okay */ \ ++ __HANDLE_ITEM(tx_err); /* TX errors */ \ ++ __HANDLE_ITEM(rx); /* RX okay */ \ ++ __HANDLE_ITEM(rx_err); /* RX errors */ \ ++ __HANDLE_ITEM(rx_drop); /* RX out of memory */ ++ ++struct atm_aal_stats { ++#define __HANDLE_ITEM(i) int i ++ __AAL_STAT_ITEMS ++#undef __HANDLE_ITEM ++}; ++ ++ ++struct atm_dev_stats { ++ struct atm_aal_stats aal0; ++ struct atm_aal_stats aal34; ++ struct atm_aal_stats aal5; ++} __ATM_API_ALIGN; ++ ++ ++#define ATM_GETLINKRATE _IOW('a',ATMIOC_ITF+1,struct atmif_sioc) ++ /* get link rate */ ++#define ATM_GETNAMES _IOW('a',ATMIOC_ITF+3,struct atm_iobuf) ++ /* get interface names (numbers) */ ++#define ATM_GETTYPE _IOW('a',ATMIOC_ITF+4,struct atmif_sioc) ++ /* get interface type name */ ++#define ATM_GETESI _IOW('a',ATMIOC_ITF+5,struct atmif_sioc) ++ /* get interface ESI */ ++#define ATM_GETADDR _IOW('a',ATMIOC_ITF+6,struct atmif_sioc) ++ /* get itf's local ATM addr. list */ ++#define ATM_RSTADDR _IOW('a',ATMIOC_ITF+7,struct atmif_sioc) ++ /* reset itf's ATM address list */ ++#define ATM_ADDADDR _IOW('a',ATMIOC_ITF+8,struct atmif_sioc) ++ /* add a local ATM address */ ++#define ATM_DELADDR _IOW('a',ATMIOC_ITF+9,struct atmif_sioc) ++ /* remove a local ATM address */ ++#define ATM_GETCIRANGE _IOW('a',ATMIOC_ITF+10,struct atmif_sioc) ++ /* get connection identifier range */ ++#define ATM_SETCIRANGE _IOW('a',ATMIOC_ITF+11,struct atmif_sioc) ++ /* set connection identifier range */ ++#define ATM_SETESI _IOW('a',ATMIOC_ITF+12,struct atmif_sioc) ++ /* set interface ESI */ ++#define ATM_SETESIF _IOW('a',ATMIOC_ITF+13,struct atmif_sioc) ++ /* force interface ESI */ ++#define ATM_ADDLECSADDR _IOW('a', ATMIOC_ITF+14, struct atmif_sioc) ++ /* register a LECS address */ ++#define ATM_DELLECSADDR _IOW('a', ATMIOC_ITF+15, struct atmif_sioc) ++ /* unregister a LECS address */ ++#define ATM_GETLECSADDR _IOW('a', ATMIOC_ITF+16, struct atmif_sioc) ++ /* retrieve LECS address(es) */ ++ ++#define ATM_GETSTAT _IOW('a',ATMIOC_SARCOM+0,struct atmif_sioc) ++ /* get AAL layer statistics */ ++#define ATM_GETSTATZ _IOW('a',ATMIOC_SARCOM+1,struct atmif_sioc) ++ /* get AAL layer statistics and zero */ ++#define ATM_GETLOOP _IOW('a',ATMIOC_SARCOM+2,struct atmif_sioc) ++ /* get loopback mode */ ++#define ATM_SETLOOP _IOW('a',ATMIOC_SARCOM+3,struct atmif_sioc) ++ /* set loopback mode */ ++#define ATM_QUERYLOOP _IOW('a',ATMIOC_SARCOM+4,struct atmif_sioc) ++ /* query supported loopback modes */ ++#define ATM_SETSC _IOW('a',ATMIOC_SPECIAL+1,int) ++ /* enable or disable single-copy */ ++#define ATM_SETBACKEND _IOW('a',ATMIOC_SPECIAL+2,atm_backend_t) ++ /* set backend handler */ ++#define ATM_NEWBACKENDIF _IOW('a',ATMIOC_SPECIAL+3,atm_backend_t) ++ /* use backend to make new if */ ++#define ATM_ADDPARTY _IOW('a', ATMIOC_SPECIAL+4,struct atm_iobuf) ++ /* add party to p2mp call */ ++#ifdef CONFIG_COMPAT ++/* It actually takes struct sockaddr_atmsvc, not struct atm_iobuf */ ++#define COMPAT_ATM_ADDPARTY _IOW('a', ATMIOC_SPECIAL+4,struct compat_atm_iobuf) ++#endif ++#define ATM_DROPPARTY _IOW('a', ATMIOC_SPECIAL+5,int) ++ /* drop party from p2mp call */ ++ ++/* ++ * These are backend handkers that can be set via the ATM_SETBACKEND call ++ * above. In the future we may support dynamic loading of these - for now, ++ * they're just being used to share the ATMIOC_BACKEND ioctls ++ */ ++#define ATM_BACKEND_RAW 0 ++#define ATM_BACKEND_PPP 1 /* PPPoATM - RFC2364 */ ++#define ATM_BACKEND_BR2684 2 /* Bridged RFC1483/2684 */ ++ ++/* for ATM_GETTYPE */ ++#define ATM_ITFTYP_LEN 8 /* maximum length of interface type name */ ++ ++/* ++ * Loopback modes for ATM_{PHY,SAR}_{GET,SET}LOOP ++ */ ++ ++/* Point of loopback CPU-->SAR-->PHY-->line--> ... */ ++#define __ATM_LM_NONE 0 /* no loop back ^ ^ ^ ^ */ ++#define __ATM_LM_AAL 1 /* loop back PDUs --' | | | */ ++#define __ATM_LM_ATM 2 /* loop back ATM cells ---' | | */ ++/* RESERVED 4 loop back on PHY side ---' */ ++#define __ATM_LM_PHY 8 /* loop back bits (digital) ----' | */ ++#define __ATM_LM_ANALOG 16 /* loop back the analog signal --------' */ ++ ++/* Direction of loopback */ ++#define __ATM_LM_MKLOC(n) ((n)) /* Local (i.e. loop TX to RX) */ ++#define __ATM_LM_MKRMT(n) ((n) << 8) /* Remote (i.e. loop RX to TX) */ ++ ++#define __ATM_LM_XTLOC(n) ((n) & 0xff) ++#define __ATM_LM_XTRMT(n) (((n) >> 8) & 0xff) ++ ++#define ATM_LM_NONE 0 /* no loopback */ ++ ++#define ATM_LM_LOC_AAL __ATM_LM_MKLOC(__ATM_LM_AAL) ++#define ATM_LM_LOC_ATM __ATM_LM_MKLOC(__ATM_LM_ATM) ++#define ATM_LM_LOC_PHY __ATM_LM_MKLOC(__ATM_LM_PHY) ++#define ATM_LM_LOC_ANALOG __ATM_LM_MKLOC(__ATM_LM_ANALOG) ++ ++#define ATM_LM_RMT_AAL __ATM_LM_MKRMT(__ATM_LM_AAL) ++#define ATM_LM_RMT_ATM __ATM_LM_MKRMT(__ATM_LM_ATM) ++#define ATM_LM_RMT_PHY __ATM_LM_MKRMT(__ATM_LM_PHY) ++#define ATM_LM_RMT_ANALOG __ATM_LM_MKRMT(__ATM_LM_ANALOG) ++ ++/* ++ * Note: ATM_LM_LOC_* and ATM_LM_RMT_* can be combined, provided that ++ * __ATM_LM_XTLOC(x) <= __ATM_LM_XTRMT(x) ++ */ ++ ++ ++struct atm_iobuf { ++ int length; ++ void *buffer; ++}; ++ ++/* for ATM_GETCIRANGE / ATM_SETCIRANGE */ ++ ++#define ATM_CI_MAX -1 /* use maximum range of VPI/VCI */ ++ ++struct atm_cirange { ++ signed char vpi_bits; /* 1..8, ATM_CI_MAX (-1) for maximum */ ++ signed char vci_bits; /* 1..16, ATM_CI_MAX (-1) for maximum */ ++}; ++ ++/* for ATM_SETSC; actually taken from the ATM_VF number space */ ++ ++#define ATM_SC_RX 1024 /* enable RX single-copy */ ++#define ATM_SC_TX 2048 /* enable TX single-copy */ ++ ++#define ATM_BACKLOG_DEFAULT 32 /* if we get more, we're likely to time out ++ anyway */ ++ ++/* MF: change_qos (Modify) flags */ ++ ++#define ATM_MF_IMMED 1 /* Block until change is effective */ ++#define ATM_MF_INC_RSV 2 /* Change reservation on increase */ ++#define ATM_MF_INC_SHP 4 /* Change shaping on increase */ ++#define ATM_MF_DEC_RSV 8 /* Change reservation on decrease */ ++#define ATM_MF_DEC_SHP 16 /* Change shaping on decrease */ ++#define ATM_MF_BWD 32 /* Set the backward direction parameters */ ++ ++#define ATM_MF_SET (ATM_MF_INC_RSV | ATM_MF_INC_SHP | ATM_MF_DEC_RSV | \ ++ ATM_MF_DEC_SHP | ATM_MF_BWD) ++ ++/* ++ * ATM_VS_* are used to express VC state in a human-friendly way. ++ */ ++ ++#define ATM_VS_IDLE 0 /* VC is not used */ ++#define ATM_VS_CONNECTED 1 /* VC is connected */ ++#define ATM_VS_CLOSING 2 /* VC is closing */ ++#define ATM_VS_LISTEN 3 /* VC is listening for incoming setups */ ++#define ATM_VS_INUSE 4 /* VC is in use (registered with atmsigd) */ ++#define ATM_VS_BOUND 5 /* VC is bound */ ++ ++#define ATM_VS2TXT_MAP \ ++ "IDLE", "CONNECTED", "CLOSING", "LISTEN", "INUSE", "BOUND" ++ ++#define ATM_VF2TXT_MAP \ ++ "ADDR", "READY", "PARTIAL", "REGIS", \ ++ "RELEASED", "HASQOS", "LISTEN", "META", \ ++ "256", "512", "1024", "2048", \ ++ "SESSION", "HASSAP", "BOUND", "CLOSE" ++ ++ ++ ++#endif /* LINUX_ATMDEV_H */ +diff --git a/include/uapi/linux/atmioc.h b/include/uapi/linux/atmioc.h +new file mode 100644 +index 0000000..37f67aa +--- /dev/null ++++ b/include/uapi/linux/atmioc.h +@@ -0,0 +1,41 @@ ++/* atmioc.h - ranges for ATM-related ioctl numbers */ ++ ++/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ ++ ++ ++/* ++ * See http://icawww1.epfl.ch/linux-atm/magic.html for the complete list of ++ * "magic" ioctl numbers. ++ */ ++ ++ ++#ifndef _LINUX_ATMIOC_H ++#define _LINUX_ATMIOC_H ++ ++#include ++ /* everybody including atmioc.h will also need _IO{,R,W,WR} */ ++ ++#define ATMIOC_PHYCOM 0x00 /* PHY device common ioctls, globally unique */ ++#define ATMIOC_PHYCOM_END 0x0f ++#define ATMIOC_PHYTYP 0x10 /* PHY dev type ioctls, unique per PHY type */ ++#define ATMIOC_PHYTYP_END 0x2f ++#define ATMIOC_PHYPRV 0x30 /* PHY dev private ioctls, unique per driver */ ++#define ATMIOC_PHYPRV_END 0x4f ++#define ATMIOC_SARCOM 0x50 /* SAR device common ioctls, globally unique */ ++#define ATMIOC_SARCOM_END 0x50 ++#define ATMIOC_SARPRV 0x60 /* SAR dev private ioctls, unique per driver */ ++#define ATMIOC_SARPRV_END 0x7f ++#define ATMIOC_ITF 0x80 /* Interface ioctls, globally unique */ ++#define ATMIOC_ITF_END 0x8f ++#define ATMIOC_BACKEND 0x90 /* ATM generic backend ioctls, u. per backend */ ++#define ATMIOC_BACKEND_END 0xaf ++/* 0xb0-0xbf: Reserved for future use */ ++#define ATMIOC_AREQUIPA 0xc0 /* Application requested IP over ATM, glob. u. */ ++#define ATMIOC_LANE 0xd0 /* LAN Emulation, globally unique */ ++#define ATMIOC_MPOA 0xd8 /* MPOA, globally unique */ ++#define ATMIOC_CLIP 0xe0 /* Classical IP over ATM control, globally u. */ ++#define ATMIOC_CLIP_END 0xef ++#define ATMIOC_SPECIAL 0xf0 /* Special-purpose controls, globally unique */ ++#define ATMIOC_SPECIAL_END 0xff ++ ++#endif +diff --git a/include/uapi/linux/atmsap.h b/include/uapi/linux/atmsap.h +new file mode 100644 +index 0000000..799b104 +--- /dev/null ++++ b/include/uapi/linux/atmsap.h +@@ -0,0 +1,162 @@ ++/* atmsap.h - ATM Service Access Point addressing definitions */ ++ ++/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ ++ ++ ++#ifndef _LINUX_ATMSAP_H ++#define _LINUX_ATMSAP_H ++ ++#include ++ ++/* ++ * BEGIN_xx and END_xx markers are used for automatic generation of ++ * documentation. Do not change them. ++ */ ++ ++ ++/* ++ * Layer 2 protocol identifiers ++ */ ++ ++/* BEGIN_L2 */ ++#define ATM_L2_NONE 0 /* L2 not specified */ ++#define ATM_L2_ISO1745 0x01 /* Basic mode ISO 1745 */ ++#define ATM_L2_Q291 0x02 /* ITU-T Q.291 (Rec. I.441) */ ++#define ATM_L2_X25_LL 0x06 /* ITU-T X.25, link layer */ ++#define ATM_L2_X25_ML 0x07 /* ITU-T X.25, multilink */ ++#define ATM_L2_LAPB 0x08 /* Extended LAPB, half-duplex (Rec. T.71) */ ++#define ATM_L2_HDLC_ARM 0x09 /* HDLC ARM (ISO/IEC 4335) */ ++#define ATM_L2_HDLC_NRM 0x0a /* HDLC NRM (ISO/IEC 4335) */ ++#define ATM_L2_HDLC_ABM 0x0b /* HDLC ABM (ISO/IEC 4335) */ ++#define ATM_L2_ISO8802 0x0c /* LAN LLC (ISO/IEC 8802/2) */ ++#define ATM_L2_X75 0x0d /* ITU-T X.75, SLP */ ++#define ATM_L2_Q922 0x0e /* ITU-T Q.922 */ ++#define ATM_L2_USER 0x10 /* user-specified */ ++#define ATM_L2_ISO7776 0x11 /* ISO 7776 DTE-DTE */ ++/* END_L2 */ ++ ++ ++/* ++ * Layer 3 protocol identifiers ++ */ ++ ++/* BEGIN_L3 */ ++#define ATM_L3_NONE 0 /* L3 not specified */ ++#define ATM_L3_X25 0x06 /* ITU-T X.25, packet layer */ ++#define ATM_L3_ISO8208 0x07 /* ISO/IEC 8208 */ ++#define ATM_L3_X223 0x08 /* ITU-T X.223 | ISO/IEC 8878 */ ++#define ATM_L3_ISO8473 0x09 /* ITU-T X.233 | ISO/IEC 8473 */ ++#define ATM_L3_T70 0x0a /* ITU-T T.70 minimum network layer */ ++#define ATM_L3_TR9577 0x0b /* ISO/IEC TR 9577 */ ++#define ATM_L3_H310 0x0c /* ITU-T Recommendation H.310 */ ++#define ATM_L3_H321 0x0d /* ITU-T Recommendation H.321 */ ++#define ATM_L3_USER 0x10 /* user-specified */ ++/* END_L3 */ ++ ++ ++/* ++ * High layer identifiers ++ */ ++ ++/* BEGIN_HL */ ++#define ATM_HL_NONE 0 /* HL not specified */ ++#define ATM_HL_ISO 0x01 /* ISO */ ++#define ATM_HL_USER 0x02 /* user-specific */ ++#define ATM_HL_HLP 0x03 /* high layer profile - UNI 3.0 only */ ++#define ATM_HL_VENDOR 0x04 /* vendor-specific application identifier */ ++/* END_HL */ ++ ++ ++/* ++ * ITU-T coded mode of operation ++ */ ++ ++/* BEGIN_IMD */ ++#define ATM_IMD_NONE 0 /* mode not specified */ ++#define ATM_IMD_NORMAL 1 /* normal mode of operation */ ++#define ATM_IMD_EXTENDED 2 /* extended mode of operation */ ++/* END_IMD */ ++ ++/* ++ * H.310 code points ++ */ ++ ++#define ATM_TT_NONE 0 /* terminal type not specified */ ++#define ATM_TT_RX 1 /* receive only */ ++#define ATM_TT_TX 2 /* send only */ ++#define ATM_TT_RXTX 3 /* receive and send */ ++ ++#define ATM_MC_NONE 0 /* no multiplexing */ ++#define ATM_MC_TS 1 /* transport stream (TS) */ ++#define ATM_MC_TS_FEC 2 /* transport stream with forward error corr. */ ++#define ATM_MC_PS 3 /* program stream (PS) */ ++#define ATM_MC_PS_FEC 4 /* program stream with forward error corr. */ ++#define ATM_MC_H221 5 /* ITU-T Rec. H.221 */ ++ ++/* ++ * SAP structures ++ */ ++ ++#define ATM_MAX_HLI 8 /* maximum high-layer information length */ ++ ++ ++struct atm_blli { ++ unsigned char l2_proto; /* layer 2 protocol */ ++ union { ++ struct { ++ unsigned char mode; /* mode of operation (ATM_IMD_xxx), 0 if */ ++ /* absent */ ++ unsigned char window; /* window size (k), 1-127 (0 to omit) */ ++ } itu; /* ITU-T encoding */ ++ unsigned char user; /* user-specified l2 information */ ++ } l2; ++ unsigned char l3_proto; /* layer 3 protocol */ ++ union { ++ struct { ++ unsigned char mode; /* mode of operation (ATM_IMD_xxx), 0 if */ ++ /* absent */ ++ unsigned char def_size; /* default packet size (log2), 4-12 (0 to */ ++ /* omit) */ ++ unsigned char window;/* packet window size, 1-127 (0 to omit) */ ++ } itu; /* ITU-T encoding */ ++ unsigned char user; /* user specified l3 information */ ++ struct { /* if l3_proto = ATM_L3_H310 */ ++ unsigned char term_type; /* terminal type */ ++ unsigned char fw_mpx_cap; /* forward multiplexing capability */ ++ /* only if term_type != ATM_TT_NONE */ ++ unsigned char bw_mpx_cap; /* backward multiplexing capability */ ++ /* only if term_type != ATM_TT_NONE */ ++ } h310; ++ struct { /* if l3_proto = ATM_L3_TR9577 */ ++ unsigned char ipi; /* initial protocol id */ ++ unsigned char snap[5];/* IEEE 802.1 SNAP identifier */ ++ /* (only if ipi == NLPID_IEEE802_1_SNAP) */ ++ } tr9577; ++ } l3; ++} __ATM_API_ALIGN; ++ ++ ++struct atm_bhli { ++ unsigned char hl_type; /* high layer information type */ ++ unsigned char hl_length; /* length (only if hl_type == ATM_HL_USER || */ ++ /* hl_type == ATM_HL_ISO) */ ++ unsigned char hl_info[ATM_MAX_HLI];/* high layer information */ ++}; ++ ++ ++#define ATM_MAX_BLLI 3 /* maximum number of BLLI elements */ ++ ++ ++struct atm_sap { ++ struct atm_bhli bhli; /* local SAP, high-layer information */ ++ struct atm_blli blli[ATM_MAX_BLLI] __ATM_API_ALIGN; ++ /* local SAP, low-layer info */ ++}; ++ ++ ++static __inline__ int blli_in_use(struct atm_blli blli) ++{ ++ return blli.l2_proto || blli.l3_proto; ++} ++ ++#endif +diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h +new file mode 100644 +index 0000000..0895a52 +--- /dev/null ++++ b/include/uapi/linux/bpf.h +@@ -0,0 +1,867 @@ ++/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of version 2 of the GNU General Public ++ * License as published by the Free Software Foundation. ++ */ ++#ifndef __LINUX_BPF_H__ ++#define __LINUX_BPF_H__ ++ ++#include ++#include ++ ++/* Extended instruction set based on top of classic BPF */ ++ ++/* instruction classes */ ++#define BPF_ALU64 0x07 /* alu mode in double word width */ ++ ++/* ld/ldx fields */ ++#define BPF_DW 0x18 /* double word */ ++#define BPF_XADD 0xc0 /* exclusive add */ ++ ++/* alu/jmp fields */ ++#define BPF_MOV 0xb0 /* mov reg to reg */ ++#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */ ++ ++/* change endianness of a register */ ++#define BPF_END 0xd0 /* flags for endianness conversion: */ ++#define BPF_TO_LE 0x00 /* convert to little-endian */ ++#define BPF_TO_BE 0x08 /* convert to big-endian */ ++#define BPF_FROM_LE BPF_TO_LE ++#define BPF_FROM_BE BPF_TO_BE ++ ++/* jmp encodings */ ++#define BPF_JNE 0x50 /* jump != */ ++#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ ++#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ ++#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ ++#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ ++#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ ++#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ ++#define BPF_CALL 0x80 /* function call */ ++#define BPF_EXIT 0x90 /* function return */ ++ ++/* Register numbers */ ++enum { ++ BPF_REG_0 = 0, ++ BPF_REG_1, ++ BPF_REG_2, ++ BPF_REG_3, ++ BPF_REG_4, ++ BPF_REG_5, ++ BPF_REG_6, ++ BPF_REG_7, ++ BPF_REG_8, ++ BPF_REG_9, ++ BPF_REG_10, ++ __MAX_BPF_REG, ++}; ++ ++/* BPF has 10 general purpose 64-bit registers and stack frame. */ ++#define MAX_BPF_REG __MAX_BPF_REG ++ ++struct bpf_insn { ++ __u8 code; /* opcode */ ++ __u8 dst_reg:4; /* dest register */ ++ __u8 src_reg:4; /* source register */ ++ __s16 off; /* signed offset */ ++ __s32 imm; /* signed immediate constant */ ++}; ++ ++/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ ++struct bpf_lpm_trie_key { ++ __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ ++ __u8 data[0]; /* Arbitrary size */ ++}; ++ ++/* BPF syscall commands, see bpf(2) man-page for details. */ ++enum bpf_cmd { ++ BPF_MAP_CREATE, ++ BPF_MAP_LOOKUP_ELEM, ++ BPF_MAP_UPDATE_ELEM, ++ BPF_MAP_DELETE_ELEM, ++ BPF_MAP_GET_NEXT_KEY, ++ BPF_PROG_LOAD, ++ BPF_OBJ_PIN, ++ BPF_OBJ_GET, ++ BPF_PROG_ATTACH, ++ BPF_PROG_DETACH, ++ BPF_PROG_TEST_RUN, ++ BPF_PROG_GET_NEXT_ID, ++ BPF_MAP_GET_NEXT_ID, ++ BPF_PROG_GET_FD_BY_ID, ++ BPF_MAP_GET_FD_BY_ID, ++ BPF_OBJ_GET_INFO_BY_FD, ++}; ++ ++enum bpf_map_type { ++ BPF_MAP_TYPE_UNSPEC, ++ BPF_MAP_TYPE_HASH, ++ BPF_MAP_TYPE_ARRAY, ++ BPF_MAP_TYPE_PROG_ARRAY, ++ BPF_MAP_TYPE_PERF_EVENT_ARRAY, ++ BPF_MAP_TYPE_PERCPU_HASH, ++ BPF_MAP_TYPE_PERCPU_ARRAY, ++ BPF_MAP_TYPE_STACK_TRACE, ++ BPF_MAP_TYPE_CGROUP_ARRAY, ++ BPF_MAP_TYPE_LRU_HASH, ++ BPF_MAP_TYPE_LRU_PERCPU_HASH, ++ BPF_MAP_TYPE_LPM_TRIE, ++ BPF_MAP_TYPE_ARRAY_OF_MAPS, ++ BPF_MAP_TYPE_HASH_OF_MAPS, ++ BPF_MAP_TYPE_DEVMAP, ++ BPF_MAP_TYPE_SOCKMAP, ++}; ++ ++enum bpf_prog_type { ++ BPF_PROG_TYPE_UNSPEC, ++ BPF_PROG_TYPE_SOCKET_FILTER, ++ BPF_PROG_TYPE_KPROBE, ++ BPF_PROG_TYPE_SCHED_CLS, ++ BPF_PROG_TYPE_SCHED_ACT, ++ BPF_PROG_TYPE_TRACEPOINT, ++ BPF_PROG_TYPE_XDP, ++ BPF_PROG_TYPE_PERF_EVENT, ++ BPF_PROG_TYPE_CGROUP_SKB, ++ BPF_PROG_TYPE_CGROUP_SOCK, ++ BPF_PROG_TYPE_LWT_IN, ++ BPF_PROG_TYPE_LWT_OUT, ++ BPF_PROG_TYPE_LWT_XMIT, ++ BPF_PROG_TYPE_SOCK_OPS, ++ BPF_PROG_TYPE_SK_SKB, ++}; ++ ++enum bpf_attach_type { ++ BPF_CGROUP_INET_INGRESS, ++ BPF_CGROUP_INET_EGRESS, ++ BPF_CGROUP_INET_SOCK_CREATE, ++ BPF_CGROUP_SOCK_OPS, ++ BPF_SK_SKB_STREAM_PARSER, ++ BPF_SK_SKB_STREAM_VERDICT, ++ __MAX_BPF_ATTACH_TYPE ++}; ++ ++#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE ++ ++/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command ++ * to the given target_fd cgroup the descendent cgroup will be able to ++ * override effective bpf program that was inherited from this cgroup ++ */ ++#define BPF_F_ALLOW_OVERRIDE (1U << 0) ++ ++/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the ++ * verifier will perform strict alignment checking as if the kernel ++ * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, ++ * and NET_IP_ALIGN defined to 2. ++ */ ++#define BPF_F_STRICT_ALIGNMENT (1U << 0) ++ ++#define BPF_PSEUDO_MAP_FD 1 ++ ++/* flags for BPF_MAP_UPDATE_ELEM command */ ++#define BPF_ANY 0 /* create new element or update existing */ ++#define BPF_NOEXIST 1 /* create new element if it didn't exist */ ++#define BPF_EXIST 2 /* update existing element */ ++ ++/* flags for BPF_MAP_CREATE command */ ++#define BPF_F_NO_PREALLOC (1U << 0) ++/* Instead of having one common LRU list in the ++ * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list ++ * which can scale and perform better. ++ * Note, the LRU nodes (including free nodes) cannot be moved ++ * across different LRU lists. ++ */ ++#define BPF_F_NO_COMMON_LRU (1U << 1) ++/* Specify numa node during map creation */ ++#define BPF_F_NUMA_NODE (1U << 2) ++ ++union bpf_attr { ++ struct { /* anonymous struct used by BPF_MAP_CREATE command */ ++ __u32 map_type; /* one of enum bpf_map_type */ ++ __u32 key_size; /* size of key in bytes */ ++ __u32 value_size; /* size of value in bytes */ ++ __u32 max_entries; /* max number of entries in a map */ ++ __u32 map_flags; /* BPF_MAP_CREATE related ++ * flags defined above. ++ */ ++ __u32 inner_map_fd; /* fd pointing to the inner map */ ++ __u32 numa_node; /* numa node (effective only if ++ * BPF_F_NUMA_NODE is set). ++ */ ++ }; ++ ++ struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ ++ __u32 map_fd; ++ __aligned_u64 key; ++ union { ++ __aligned_u64 value; ++ __aligned_u64 next_key; ++ }; ++ __u64 flags; ++ }; ++ ++ struct { /* anonymous struct used by BPF_PROG_LOAD command */ ++ __u32 prog_type; /* one of enum bpf_prog_type */ ++ __u32 insn_cnt; ++ __aligned_u64 insns; ++ __aligned_u64 license; ++ __u32 log_level; /* verbosity level of verifier */ ++ __u32 log_size; /* size of user buffer */ ++ __aligned_u64 log_buf; /* user supplied buffer */ ++ __u32 kern_version; /* checked when prog_type=kprobe */ ++ __u32 prog_flags; ++ }; ++ ++ struct { /* anonymous struct used by BPF_OBJ_* commands */ ++ __aligned_u64 pathname; ++ __u32 bpf_fd; ++ }; ++ ++ struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ ++ __u32 target_fd; /* container object to attach to */ ++ __u32 attach_bpf_fd; /* eBPF program to attach */ ++ __u32 attach_type; ++ __u32 attach_flags; ++ }; ++ ++ struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ ++ __u32 prog_fd; ++ __u32 retval; ++ __u32 data_size_in; ++ __u32 data_size_out; ++ __aligned_u64 data_in; ++ __aligned_u64 data_out; ++ __u32 repeat; ++ __u32 duration; ++ } test; ++ ++ struct { /* anonymous struct used by BPF_*_GET_*_ID */ ++ union { ++ __u32 start_id; ++ __u32 prog_id; ++ __u32 map_id; ++ }; ++ __u32 next_id; ++ }; ++ ++ struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ ++ __u32 bpf_fd; ++ __u32 info_len; ++ __aligned_u64 info; ++ } info; ++} __attribute__((aligned(8))); ++ ++/* BPF helper function descriptions: ++ * ++ * void *bpf_map_lookup_elem(&map, &key) ++ * Return: Map value or NULL ++ * ++ * int bpf_map_update_elem(&map, &key, &value, flags) ++ * Return: 0 on success or negative error ++ * ++ * int bpf_map_delete_elem(&map, &key) ++ * Return: 0 on success or negative error ++ * ++ * int bpf_probe_read(void *dst, int size, void *src) ++ * Return: 0 on success or negative error ++ * ++ * u64 bpf_ktime_get_ns(void) ++ * Return: current ktime ++ * ++ * int bpf_trace_printk(const char *fmt, int fmt_size, ...) ++ * Return: length of buffer written or negative error ++ * ++ * u32 bpf_prandom_u32(void) ++ * Return: random value ++ * ++ * u32 bpf_raw_smp_processor_id(void) ++ * Return: SMP processor ID ++ * ++ * int bpf_skb_store_bytes(skb, offset, from, len, flags) ++ * store bytes into packet ++ * @skb: pointer to skb ++ * @offset: offset within packet from skb->mac_header ++ * @from: pointer where to copy bytes from ++ * @len: number of bytes to store into packet ++ * @flags: bit 0 - if true, recompute skb->csum ++ * other bits - reserved ++ * Return: 0 on success or negative error ++ * ++ * int bpf_l3_csum_replace(skb, offset, from, to, flags) ++ * recompute IP checksum ++ * @skb: pointer to skb ++ * @offset: offset within packet where IP checksum is located ++ * @from: old value of header field ++ * @to: new value of header field ++ * @flags: bits 0-3 - size of header field ++ * other bits - reserved ++ * Return: 0 on success or negative error ++ * ++ * int bpf_l4_csum_replace(skb, offset, from, to, flags) ++ * recompute TCP/UDP checksum ++ * @skb: pointer to skb ++ * @offset: offset within packet where TCP/UDP checksum is located ++ * @from: old value of header field ++ * @to: new value of header field ++ * @flags: bits 0-3 - size of header field ++ * bit 4 - is pseudo header ++ * other bits - reserved ++ * Return: 0 on success or negative error ++ * ++ * int bpf_tail_call(ctx, prog_array_map, index) ++ * jump into another BPF program ++ * @ctx: context pointer passed to next program ++ * @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY ++ * @index: index inside array that selects specific program to run ++ * Return: 0 on success or negative error ++ * ++ * int bpf_clone_redirect(skb, ifindex, flags) ++ * redirect to another netdev ++ * @skb: pointer to skb ++ * @ifindex: ifindex of the net device ++ * @flags: bit 0 - if set, redirect to ingress instead of egress ++ * other bits - reserved ++ * Return: 0 on success or negative error ++ * ++ * u64 bpf_get_current_pid_tgid(void) ++ * Return: current->tgid << 32 | current->pid ++ * ++ * u64 bpf_get_current_uid_gid(void) ++ * Return: current_gid << 32 | current_uid ++ * ++ * int bpf_get_current_comm(char *buf, int size_of_buf) ++ * stores current->comm into buf ++ * Return: 0 on success or negative error ++ * ++ * u32 bpf_get_cgroup_classid(skb) ++ * retrieve a proc's classid ++ * @skb: pointer to skb ++ * Return: classid if != 0 ++ * ++ * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci) ++ * Return: 0 on success or negative error ++ * ++ * int bpf_skb_vlan_pop(skb) ++ * Return: 0 on success or negative error ++ * ++ * int bpf_skb_get_tunnel_key(skb, key, size, flags) ++ * int bpf_skb_set_tunnel_key(skb, key, size, flags) ++ * retrieve or populate tunnel metadata ++ * @skb: pointer to skb ++ * @key: pointer to 'struct bpf_tunnel_key' ++ * @size: size of 'struct bpf_tunnel_key' ++ * @flags: room for future extensions ++ * Return: 0 on success or negative error ++ * ++ * u64 bpf_perf_event_read(map, flags) ++ * read perf event counter value ++ * @map: pointer to perf_event_array map ++ * @flags: index of event in the map or bitmask flags ++ * Return: value of perf event counter read or error code ++ * ++ * int bpf_redirect(ifindex, flags) ++ * redirect to another netdev ++ * @ifindex: ifindex of the net device ++ * @flags: ++ * cls_bpf: ++ * bit 0 - if set, redirect to ingress instead of egress ++ * other bits - reserved ++ * xdp_bpf: ++ * all bits - reserved ++ * Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error ++ * xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error ++ * int bpf_redirect_map(map, key, flags) ++ * redirect to endpoint in map ++ * @map: pointer to dev map ++ * @key: index in map to lookup ++ * @flags: -- ++ * Return: XDP_REDIRECT on success or XDP_ABORT on error ++ * ++ * u32 bpf_get_route_realm(skb) ++ * retrieve a dst's tclassid ++ * @skb: pointer to skb ++ * Return: realm if != 0 ++ * ++ * int bpf_perf_event_output(ctx, map, flags, data, size) ++ * output perf raw sample ++ * @ctx: struct pt_regs* ++ * @map: pointer to perf_event_array map ++ * @flags: index of event in the map or bitmask flags ++ * @data: data on stack to be output as raw data ++ * @size: size of data ++ * Return: 0 on success or negative error ++ * ++ * int bpf_get_stackid(ctx, map, flags) ++ * walk user or kernel stack and return id ++ * @ctx: struct pt_regs* ++ * @map: pointer to stack_trace map ++ * @flags: bits 0-7 - numer of stack frames to skip ++ * bit 8 - collect user stack instead of kernel ++ * bit 9 - compare stacks by hash only ++ * bit 10 - if two different stacks hash into the same stackid ++ * discard old ++ * other bits - reserved ++ * Return: >= 0 stackid on success or negative error ++ * ++ * s64 bpf_csum_diff(from, from_size, to, to_size, seed) ++ * calculate csum diff ++ * @from: raw from buffer ++ * @from_size: length of from buffer ++ * @to: raw to buffer ++ * @to_size: length of to buffer ++ * @seed: optional seed ++ * Return: csum result or negative error code ++ * ++ * int bpf_skb_get_tunnel_opt(skb, opt, size) ++ * retrieve tunnel options metadata ++ * @skb: pointer to skb ++ * @opt: pointer to raw tunnel option data ++ * @size: size of @opt ++ * Return: option size ++ * ++ * int bpf_skb_set_tunnel_opt(skb, opt, size) ++ * populate tunnel options metadata ++ * @skb: pointer to skb ++ * @opt: pointer to raw tunnel option data ++ * @size: size of @opt ++ * Return: 0 on success or negative error ++ * ++ * int bpf_skb_change_proto(skb, proto, flags) ++ * Change protocol of the skb. Currently supported is v4 -> v6, ++ * v6 -> v4 transitions. The helper will also resize the skb. eBPF ++ * program is expected to fill the new headers via skb_store_bytes ++ * and lX_csum_replace. ++ * @skb: pointer to skb ++ * @proto: new skb->protocol type ++ * @flags: reserved ++ * Return: 0 on success or negative error ++ * ++ * int bpf_skb_change_type(skb, type) ++ * Change packet type of skb. ++ * @skb: pointer to skb ++ * @type: new skb->pkt_type type ++ * Return: 0 on success or negative error ++ * ++ * int bpf_skb_under_cgroup(skb, map, index) ++ * Check cgroup2 membership of skb ++ * @skb: pointer to skb ++ * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type ++ * @index: index of the cgroup in the bpf_map ++ * Return: ++ * == 0 skb failed the cgroup2 descendant test ++ * == 1 skb succeeded the cgroup2 descendant test ++ * < 0 error ++ * ++ * u32 bpf_get_hash_recalc(skb) ++ * Retrieve and possibly recalculate skb->hash. ++ * @skb: pointer to skb ++ * Return: hash ++ * ++ * u64 bpf_get_current_task(void) ++ * Returns current task_struct ++ * Return: current ++ * ++ * int bpf_probe_write_user(void *dst, void *src, int len) ++ * safely attempt to write to a location ++ * @dst: destination address in userspace ++ * @src: source address on stack ++ * @len: number of bytes to copy ++ * Return: 0 on success or negative error ++ * ++ * int bpf_current_task_under_cgroup(map, index) ++ * Check cgroup2 membership of current task ++ * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type ++ * @index: index of the cgroup in the bpf_map ++ * Return: ++ * == 0 current failed the cgroup2 descendant test ++ * == 1 current succeeded the cgroup2 descendant test ++ * < 0 error ++ * ++ * int bpf_skb_change_tail(skb, len, flags) ++ * The helper will resize the skb to the given new size, to be used f.e. ++ * with control messages. ++ * @skb: pointer to skb ++ * @len: new skb length ++ * @flags: reserved ++ * Return: 0 on success or negative error ++ * ++ * int bpf_skb_pull_data(skb, len) ++ * The helper will pull in non-linear data in case the skb is non-linear ++ * and not all of len are part of the linear section. Only needed for ++ * read/write with direct packet access. ++ * @skb: pointer to skb ++ * @len: len to make read/writeable ++ * Return: 0 on success or negative error ++ * ++ * s64 bpf_csum_update(skb, csum) ++ * Adds csum into skb->csum in case of CHECKSUM_COMPLETE. ++ * @skb: pointer to skb ++ * @csum: csum to add ++ * Return: csum on success or negative error ++ * ++ * void bpf_set_hash_invalid(skb) ++ * Invalidate current skb->hash. ++ * @skb: pointer to skb ++ * ++ * int bpf_get_numa_node_id() ++ * Return: Id of current NUMA node. ++ * ++ * int bpf_skb_change_head() ++ * Grows headroom of skb and adjusts MAC header offset accordingly. ++ * Will extends/reallocae as required automatically. ++ * May change skb data pointer and will thus invalidate any check ++ * performed for direct packet access. ++ * @skb: pointer to skb ++ * @len: length of header to be pushed in front ++ * @flags: Flags (unused for now) ++ * Return: 0 on success or negative error ++ * ++ * int bpf_xdp_adjust_head(xdp_md, delta) ++ * Adjust the xdp_md.data by delta ++ * @xdp_md: pointer to xdp_md ++ * @delta: An positive/negative integer to be added to xdp_md.data ++ * Return: 0 on success or negative on error ++ * ++ * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr) ++ * Copy a NUL terminated string from unsafe address. In case the string ++ * length is smaller than size, the target is not padded with further NUL ++ * bytes. In case the string length is larger than size, just count-1 ++ * bytes are copied and the last byte is set to NUL. ++ * @dst: destination address ++ * @size: maximum number of bytes to copy, including the trailing NUL ++ * @unsafe_ptr: unsafe address ++ * Return: ++ * > 0 length of the string including the trailing NUL on success ++ * < 0 error ++ * ++ * u64 bpf_get_socket_cookie(skb) ++ * Get the cookie for the socket stored inside sk_buff. ++ * @skb: pointer to skb ++ * Return: 8 Bytes non-decreasing number on success or 0 if the socket ++ * field is missing inside sk_buff ++ * ++ * u32 bpf_get_socket_uid(skb) ++ * Get the owner uid of the socket stored inside sk_buff. ++ * @skb: pointer to skb ++ * Return: uid of the socket owner on success or overflowuid if failed. ++ * ++ * u32 bpf_set_hash(skb, hash) ++ * Set full skb->hash. ++ * @skb: pointer to skb ++ * @hash: hash to set ++ * ++ * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen) ++ * Calls setsockopt. Not all opts are available, only those with ++ * integer optvals plus TCP_CONGESTION. ++ * Supported levels: SOL_SOCKET and IPROTO_TCP ++ * @bpf_socket: pointer to bpf_socket ++ * @level: SOL_SOCKET or IPROTO_TCP ++ * @optname: option name ++ * @optval: pointer to option value ++ * @optlen: length of optval in byes ++ * Return: 0 or negative error ++ * ++ * int bpf_skb_adjust_room(skb, len_diff, mode, flags) ++ * Grow or shrink room in sk_buff. ++ * @skb: pointer to skb ++ * @len_diff: (signed) amount of room to grow/shrink ++ * @mode: operation mode (enum bpf_adj_room_mode) ++ * @flags: reserved for future use ++ * Return: 0 on success or negative error code ++ * ++ * int bpf_sk_redirect_map(map, key, flags) ++ * Redirect skb to a sock in map using key as a lookup key for the ++ * sock in map. ++ * @map: pointer to sockmap ++ * @key: key to lookup sock in map ++ * @flags: reserved for future use ++ * Return: SK_REDIRECT ++ * ++ * int bpf_sock_map_update(skops, map, key, flags) ++ * @skops: pointer to bpf_sock_ops ++ * @map: pointer to sockmap to update ++ * @key: key to insert/update sock in map ++ * @flags: same flags as map update elem ++ */ ++#define __BPF_FUNC_MAPPER(FN) \ ++ FN(unspec), \ ++ FN(map_lookup_elem), \ ++ FN(map_update_elem), \ ++ FN(map_delete_elem), \ ++ FN(probe_read), \ ++ FN(ktime_get_ns), \ ++ FN(trace_printk), \ ++ FN(get_prandom_u32), \ ++ FN(get_smp_processor_id), \ ++ FN(skb_store_bytes), \ ++ FN(l3_csum_replace), \ ++ FN(l4_csum_replace), \ ++ FN(tail_call), \ ++ FN(clone_redirect), \ ++ FN(get_current_pid_tgid), \ ++ FN(get_current_uid_gid), \ ++ FN(get_current_comm), \ ++ FN(get_cgroup_classid), \ ++ FN(skb_vlan_push), \ ++ FN(skb_vlan_pop), \ ++ FN(skb_get_tunnel_key), \ ++ FN(skb_set_tunnel_key), \ ++ FN(perf_event_read), \ ++ FN(redirect), \ ++ FN(get_route_realm), \ ++ FN(perf_event_output), \ ++ FN(skb_load_bytes), \ ++ FN(get_stackid), \ ++ FN(csum_diff), \ ++ FN(skb_get_tunnel_opt), \ ++ FN(skb_set_tunnel_opt), \ ++ FN(skb_change_proto), \ ++ FN(skb_change_type), \ ++ FN(skb_under_cgroup), \ ++ FN(get_hash_recalc), \ ++ FN(get_current_task), \ ++ FN(probe_write_user), \ ++ FN(current_task_under_cgroup), \ ++ FN(skb_change_tail), \ ++ FN(skb_pull_data), \ ++ FN(csum_update), \ ++ FN(set_hash_invalid), \ ++ FN(get_numa_node_id), \ ++ FN(skb_change_head), \ ++ FN(xdp_adjust_head), \ ++ FN(probe_read_str), \ ++ FN(get_socket_cookie), \ ++ FN(get_socket_uid), \ ++ FN(set_hash), \ ++ FN(setsockopt), \ ++ FN(skb_adjust_room), \ ++ FN(redirect_map), \ ++ FN(sk_redirect_map), \ ++ FN(sock_map_update), \ ++ ++/* integer value in 'imm' field of BPF_CALL instruction selects which helper ++ * function eBPF program intends to call ++ */ ++#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x ++enum bpf_func_id { ++ __BPF_FUNC_MAPPER(__BPF_ENUM_FN) ++ __BPF_FUNC_MAX_ID, ++}; ++#undef __BPF_ENUM_FN ++ ++/* All flags used by eBPF helper functions, placed here. */ ++ ++/* BPF_FUNC_skb_store_bytes flags. */ ++#define BPF_F_RECOMPUTE_CSUM (1ULL << 0) ++#define BPF_F_INVALIDATE_HASH (1ULL << 1) ++ ++/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. ++ * First 4 bits are for passing the header field size. ++ */ ++#define BPF_F_HDR_FIELD_MASK 0xfULL ++ ++/* BPF_FUNC_l4_csum_replace flags. */ ++#define BPF_F_PSEUDO_HDR (1ULL << 4) ++#define BPF_F_MARK_MANGLED_0 (1ULL << 5) ++#define BPF_F_MARK_ENFORCE (1ULL << 6) ++ ++/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ ++#define BPF_F_INGRESS (1ULL << 0) ++ ++/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ ++#define BPF_F_TUNINFO_IPV6 (1ULL << 0) ++ ++/* BPF_FUNC_get_stackid flags. */ ++#define BPF_F_SKIP_FIELD_MASK 0xffULL ++#define BPF_F_USER_STACK (1ULL << 8) ++#define BPF_F_FAST_STACK_CMP (1ULL << 9) ++#define BPF_F_REUSE_STACKID (1ULL << 10) ++ ++/* BPF_FUNC_skb_set_tunnel_key flags. */ ++#define BPF_F_ZERO_CSUM_TX (1ULL << 1) ++#define BPF_F_DONT_FRAGMENT (1ULL << 2) ++ ++/* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */ ++#define BPF_F_INDEX_MASK 0xffffffffULL ++#define BPF_F_CURRENT_CPU BPF_F_INDEX_MASK ++/* BPF_FUNC_perf_event_output for sk_buff input context. */ ++#define BPF_F_CTXLEN_MASK (0xfffffULL << 32) ++ ++/* Mode for BPF_FUNC_skb_adjust_room helper. */ ++enum bpf_adj_room_mode { ++ BPF_ADJ_ROOM_NET, ++}; ++ ++/* user accessible mirror of in-kernel sk_buff. ++ * new fields can only be added to the end of this structure ++ */ ++struct __sk_buff { ++ __u32 len; ++ __u32 pkt_type; ++ __u32 mark; ++ __u32 queue_mapping; ++ __u32 protocol; ++ __u32 vlan_present; ++ __u32 vlan_tci; ++ __u32 vlan_proto; ++ __u32 priority; ++ __u32 ingress_ifindex; ++ __u32 ifindex; ++ __u32 tc_index; ++ __u32 cb[5]; ++ __u32 hash; ++ __u32 tc_classid; ++ __u32 data; ++ __u32 data_end; ++ __u32 napi_id; ++ ++ /* accessed by BPF_PROG_TYPE_sk_skb types */ ++ __u32 family; ++ __u32 remote_ip4; /* Stored in network byte order */ ++ __u32 local_ip4; /* Stored in network byte order */ ++ __u32 remote_ip6[4]; /* Stored in network byte order */ ++ __u32 local_ip6[4]; /* Stored in network byte order */ ++ __u32 remote_port; /* Stored in network byte order */ ++ __u32 local_port; /* stored in host byte order */ ++}; ++ ++struct bpf_tunnel_key { ++ __u32 tunnel_id; ++ union { ++ __u32 remote_ipv4; ++ __u32 remote_ipv6[4]; ++ }; ++ __u8 tunnel_tos; ++ __u8 tunnel_ttl; ++ __u16 tunnel_ext; ++ __u32 tunnel_label; ++}; ++ ++/* Generic BPF return codes which all BPF program types may support. ++ * The values are binary compatible with their TC_ACT_* counter-part to ++ * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT ++ * programs. ++ * ++ * XDP is handled seprately, see XDP_*. ++ */ ++enum bpf_ret_code { ++ BPF_OK = 0, ++ /* 1 reserved */ ++ BPF_DROP = 2, ++ /* 3-6 reserved */ ++ BPF_REDIRECT = 7, ++ /* >127 are reserved for prog type specific return codes */ ++}; ++ ++struct bpf_sock { ++ __u32 bound_dev_if; ++ __u32 family; ++ __u32 type; ++ __u32 protocol; ++ __u32 mark; ++ __u32 priority; ++}; ++ ++#define XDP_PACKET_HEADROOM 256 ++ ++/* User return codes for XDP prog type. ++ * A valid XDP program must return one of these defined values. All other ++ * return codes are reserved for future use. Unknown return codes will ++ * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). ++ */ ++enum xdp_action { ++ XDP_ABORTED = 0, ++ XDP_DROP, ++ XDP_PASS, ++ XDP_TX, ++ XDP_REDIRECT, ++}; ++ ++/* user accessible metadata for XDP packet hook ++ * new fields must be added to the end of this structure ++ */ ++struct xdp_md { ++ __u32 data; ++ __u32 data_end; ++}; ++ ++enum sk_action { ++ SK_ABORTED = 0, ++ SK_DROP, ++ SK_REDIRECT, ++}; ++ ++#define BPF_TAG_SIZE 8 ++ ++struct bpf_prog_info { ++ __u32 type; ++ __u32 id; ++ __u8 tag[BPF_TAG_SIZE]; ++ __u32 jited_prog_len; ++ __u32 xlated_prog_len; ++ __aligned_u64 jited_prog_insns; ++ __aligned_u64 xlated_prog_insns; ++} __attribute__((aligned(8))); ++ ++struct bpf_map_info { ++ __u32 type; ++ __u32 id; ++ __u32 key_size; ++ __u32 value_size; ++ __u32 max_entries; ++ __u32 map_flags; ++} __attribute__((aligned(8))); ++ ++/* User bpf_sock_ops struct to access socket values and specify request ops ++ * and their replies. ++ * Some of this fields are in network (bigendian) byte order and may need ++ * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). ++ * New fields can only be added at the end of this structure ++ */ ++struct bpf_sock_ops { ++ __u32 op; ++ union { ++ __u32 reply; ++ __u32 replylong[4]; ++ }; ++ __u32 family; ++ __u32 remote_ip4; /* Stored in network byte order */ ++ __u32 local_ip4; /* Stored in network byte order */ ++ __u32 remote_ip6[4]; /* Stored in network byte order */ ++ __u32 local_ip6[4]; /* Stored in network byte order */ ++ __u32 remote_port; /* Stored in network byte order */ ++ __u32 local_port; /* stored in host byte order */ ++}; ++ ++/* List of known BPF sock_ops operators. ++ * New entries can only be added at the end ++ */ ++enum { ++ BPF_SOCK_OPS_VOID, ++ BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or ++ * -1 if default value should be used ++ */ ++ BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized ++ * window (in packets) or -1 if default ++ * value should be used ++ */ ++ BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an ++ * active connection is initialized ++ */ ++ BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an ++ * active connection is ++ * established ++ */ ++ BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a ++ * passive connection is ++ * established ++ */ ++ BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control ++ * needs ECN ++ */ ++}; ++ ++#define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ ++#define TCP_BPF_SNDCWND_CLAMP 1002 /* Set sndcwnd_clamp */ ++ ++#endif /* __LINUX_BPF_H__ */ +diff --git a/include/uapi/linux/bpf_common.h b/include/uapi/linux/bpf_common.h +new file mode 100644 +index 0000000..afe7433 +--- /dev/null ++++ b/include/uapi/linux/bpf_common.h +@@ -0,0 +1,55 @@ ++#ifndef __LINUX_BPF_COMMON_H__ ++#define __LINUX_BPF_COMMON_H__ ++ ++/* Instruction classes */ ++#define BPF_CLASS(code) ((code) & 0x07) ++#define BPF_LD 0x00 ++#define BPF_LDX 0x01 ++#define BPF_ST 0x02 ++#define BPF_STX 0x03 ++#define BPF_ALU 0x04 ++#define BPF_JMP 0x05 ++#define BPF_RET 0x06 ++#define BPF_MISC 0x07 ++ ++/* ld/ldx fields */ ++#define BPF_SIZE(code) ((code) & 0x18) ++#define BPF_W 0x00 ++#define BPF_H 0x08 ++#define BPF_B 0x10 ++#define BPF_MODE(code) ((code) & 0xe0) ++#define BPF_IMM 0x00 ++#define BPF_ABS 0x20 ++#define BPF_IND 0x40 ++#define BPF_MEM 0x60 ++#define BPF_LEN 0x80 ++#define BPF_MSH 0xa0 ++ ++/* alu/jmp fields */ ++#define BPF_OP(code) ((code) & 0xf0) ++#define BPF_ADD 0x00 ++#define BPF_SUB 0x10 ++#define BPF_MUL 0x20 ++#define BPF_DIV 0x30 ++#define BPF_OR 0x40 ++#define BPF_AND 0x50 ++#define BPF_LSH 0x60 ++#define BPF_RSH 0x70 ++#define BPF_NEG 0x80 ++#define BPF_MOD 0x90 ++#define BPF_XOR 0xa0 ++ ++#define BPF_JA 0x00 ++#define BPF_JEQ 0x10 ++#define BPF_JGT 0x20 ++#define BPF_JGE 0x30 ++#define BPF_JSET 0x40 ++#define BPF_SRC(code) ((code) & 0x08) ++#define BPF_K 0x00 ++#define BPF_X 0x08 ++ ++#ifndef BPF_MAXINSNS ++#define BPF_MAXINSNS 4096 ++#endif ++ ++#endif /* __LINUX_BPF_COMMON_H__ */ +diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h +new file mode 100644 +index 0000000..f7a810d +--- /dev/null ++++ b/include/uapi/linux/can.h +@@ -0,0 +1,201 @@ ++/* ++ * linux/can.h ++ * ++ * Definitions for CAN network layer (socket addr / CAN frame / CAN filter) ++ * ++ * Authors: Oliver Hartkopp ++ * Urs Thuermann ++ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of Volkswagen nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * Alternatively, provided that this notice is retained in full, this ++ * software may be distributed under the terms of the GNU General ++ * Public License ("GPL") version 2, in which case the provisions of the ++ * GPL apply INSTEAD OF those given above. ++ * ++ * The provided data structures and external interfaces from this code ++ * are not restricted to be used by modules with a GPL compatible license. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ */ ++ ++#ifndef _CAN_H ++#define _CAN_H ++ ++#include ++#include ++ ++/* controller area network (CAN) kernel definitions */ ++ ++/* special address description flags for the CAN_ID */ ++#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */ ++#define CAN_RTR_FLAG 0x40000000U /* remote transmission request */ ++#define CAN_ERR_FLAG 0x20000000U /* error message frame */ ++ ++/* valid bits in CAN ID for frame formats */ ++#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */ ++#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */ ++#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */ ++ ++/* ++ * Controller Area Network Identifier structure ++ * ++ * bit 0-28 : CAN identifier (11/29 bit) ++ * bit 29 : error message frame flag (0 = data frame, 1 = error message) ++ * bit 30 : remote transmission request flag (1 = rtr frame) ++ * bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit) ++ */ ++typedef __u32 canid_t; ++ ++#define CAN_SFF_ID_BITS 11 ++#define CAN_EFF_ID_BITS 29 ++ ++/* ++ * Controller Area Network Error Message Frame Mask structure ++ * ++ * bit 0-28 : error class mask (see include/linux/can/error.h) ++ * bit 29-31 : set to zero ++ */ ++typedef __u32 can_err_mask_t; ++ ++/* CAN payload length and DLC definitions according to ISO 11898-1 */ ++#define CAN_MAX_DLC 8 ++#define CAN_MAX_DLEN 8 ++ ++/* CAN FD payload length and DLC definitions according to ISO 11898-7 */ ++#define CANFD_MAX_DLC 15 ++#define CANFD_MAX_DLEN 64 ++ ++/** ++ * struct can_frame - basic CAN frame structure ++ * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition ++ * @can_dlc: frame payload length in byte (0 .. 8) aka data length code ++ * N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1 ++ * mapping of the 'data length code' to the real payload length ++ * @__pad: padding ++ * @__res0: reserved / padding ++ * @__res1: reserved / padding ++ * @data: CAN frame payload (up to 8 byte) ++ */ ++struct can_frame { ++ canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ ++ __u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ ++ __u8 __pad; /* padding */ ++ __u8 __res0; /* reserved / padding */ ++ __u8 __res1; /* reserved / padding */ ++ __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8))); ++}; ++ ++/* ++ * defined bits for canfd_frame.flags ++ * ++ * The use of struct canfd_frame implies the Extended Data Length (EDL) bit to ++ * be set in the CAN frame bitstream on the wire. The EDL bit switch turns ++ * the CAN controllers bitstream processor into the CAN FD mode which creates ++ * two new options within the CAN FD frame specification: ++ * ++ * Bit Rate Switch - to indicate a second bitrate is/was used for the payload ++ * Error State Indicator - represents the error state of the transmitting node ++ * ++ * As the CANFD_ESI bit is internally generated by the transmitting CAN ++ * controller only the CANFD_BRS bit is relevant for real CAN controllers when ++ * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make ++ * sense for virtual CAN interfaces to test applications with echoed frames. ++ */ ++#define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */ ++#define CANFD_ESI 0x02 /* error state indicator of the transmitting node */ ++ ++/** ++ * struct canfd_frame - CAN flexible data rate frame structure ++ * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition ++ * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN) ++ * @flags: additional flags for CAN FD ++ * @__res0: reserved / padding ++ * @__res1: reserved / padding ++ * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte) ++ */ ++struct canfd_frame { ++ canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ ++ __u8 len; /* frame payload length in byte */ ++ __u8 flags; /* additional flags for CAN FD */ ++ __u8 __res0; /* reserved / padding */ ++ __u8 __res1; /* reserved / padding */ ++ __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); ++}; ++ ++#define CAN_MTU (sizeof(struct can_frame)) ++#define CANFD_MTU (sizeof(struct canfd_frame)) ++ ++/* particular protocols of the protocol family PF_CAN */ ++#define CAN_RAW 1 /* RAW sockets */ ++#define CAN_BCM 2 /* Broadcast Manager */ ++#define CAN_TP16 3 /* VAG Transport Protocol v1.6 */ ++#define CAN_TP20 4 /* VAG Transport Protocol v2.0 */ ++#define CAN_MCNET 5 /* Bosch MCNet */ ++#define CAN_ISOTP 6 /* ISO 15765-2 Transport Protocol */ ++#define CAN_NPROTO 7 ++ ++#define SOL_CAN_BASE 100 ++ ++/** ++ * struct sockaddr_can - the sockaddr structure for CAN sockets ++ * @can_family: address family number AF_CAN. ++ * @can_ifindex: CAN network interface index. ++ * @can_addr: protocol specific address information ++ */ ++struct sockaddr_can { ++ __kernel_sa_family_t can_family; ++ int can_ifindex; ++ union { ++ /* transport protocol class address information (e.g. ISOTP) */ ++ struct { canid_t rx_id, tx_id; } tp; ++ ++ /* reserved for future CAN protocols address information */ ++ } can_addr; ++}; ++ ++/** ++ * struct can_filter - CAN ID based filter in can_register(). ++ * @can_id: relevant bits of CAN ID which are not masked out. ++ * @can_mask: CAN mask (see description) ++ * ++ * Description: ++ * A filter matches, when ++ * ++ * & mask == can_id & mask ++ * ++ * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can ++ * filter for error message frames (CAN_ERR_FLAG bit set in mask). ++ */ ++struct can_filter { ++ canid_t can_id; ++ canid_t can_mask; ++}; ++ ++#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */ ++#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */ ++ ++#endif /* !_UAPI_CAN_H */ +diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h +new file mode 100644 +index 0000000..b9214bd +--- /dev/null ++++ b/include/uapi/linux/can/netlink.h +@@ -0,0 +1,142 @@ ++/* ++ * linux/can/netlink.h ++ * ++ * Definitions for the CAN netlink interface ++ * ++ * Copyright (c) 2009 Wolfgang Grandegger ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the version 2 of the GNU General Public License ++ * as published by the Free Software Foundation ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++#ifndef _CAN_NETLINK_H ++#define _CAN_NETLINK_H ++ ++#include ++ ++/* ++ * CAN bit-timing parameters ++ * ++ * For further information, please read chapter "8 BIT TIMING ++ * REQUIREMENTS" of the "Bosch CAN Specification version 2.0" ++ * at http://www.semiconductors.bosch.de/pdf/can2spec.pdf. ++ */ ++struct can_bittiming { ++ __u32 bitrate; /* Bit-rate in bits/second */ ++ __u32 sample_point; /* Sample point in one-tenth of a percent */ ++ __u32 tq; /* Time quanta (TQ) in nanoseconds */ ++ __u32 prop_seg; /* Propagation segment in TQs */ ++ __u32 phase_seg1; /* Phase buffer segment 1 in TQs */ ++ __u32 phase_seg2; /* Phase buffer segment 2 in TQs */ ++ __u32 sjw; /* Synchronisation jump width in TQs */ ++ __u32 brp; /* Bit-rate prescaler */ ++}; ++ ++/* ++ * CAN harware-dependent bit-timing constant ++ * ++ * Used for calculating and checking bit-timing parameters ++ */ ++struct can_bittiming_const { ++ char name[16]; /* Name of the CAN controller hardware */ ++ __u32 tseg1_min; /* Time segement 1 = prop_seg + phase_seg1 */ ++ __u32 tseg1_max; ++ __u32 tseg2_min; /* Time segement 2 = phase_seg2 */ ++ __u32 tseg2_max; ++ __u32 sjw_max; /* Synchronisation jump width */ ++ __u32 brp_min; /* Bit-rate prescaler */ ++ __u32 brp_max; ++ __u32 brp_inc; ++}; ++ ++/* ++ * CAN clock parameters ++ */ ++struct can_clock { ++ __u32 freq; /* CAN system clock frequency in Hz */ ++}; ++ ++/* ++ * CAN operational and error states ++ */ ++enum can_state { ++ CAN_STATE_ERROR_ACTIVE = 0, /* RX/TX error count < 96 */ ++ CAN_STATE_ERROR_WARNING, /* RX/TX error count < 128 */ ++ CAN_STATE_ERROR_PASSIVE, /* RX/TX error count < 256 */ ++ CAN_STATE_BUS_OFF, /* RX/TX error count >= 256 */ ++ CAN_STATE_STOPPED, /* Device is stopped */ ++ CAN_STATE_SLEEPING, /* Device is sleeping */ ++ CAN_STATE_MAX ++}; ++ ++/* ++ * CAN bus error counters ++ */ ++struct can_berr_counter { ++ __u16 txerr; ++ __u16 rxerr; ++}; ++ ++/* ++ * CAN controller mode ++ */ ++struct can_ctrlmode { ++ __u32 mask; ++ __u32 flags; ++}; ++ ++#define CAN_CTRLMODE_LOOPBACK 0x01 /* Loopback mode */ ++#define CAN_CTRLMODE_LISTENONLY 0x02 /* Listen-only mode */ ++#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */ ++#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */ ++#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ ++#define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */ ++#define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */ ++#define CAN_CTRLMODE_FD_NON_ISO 0x80 /* CAN FD in non-ISO mode */ ++ ++/* ++ * CAN device statistics ++ */ ++struct can_device_stats { ++ __u32 bus_error; /* Bus errors */ ++ __u32 error_warning; /* Changes to error warning state */ ++ __u32 error_passive; /* Changes to error passive state */ ++ __u32 bus_off; /* Changes to bus off state */ ++ __u32 arbitration_lost; /* Arbitration lost errors */ ++ __u32 restarts; /* CAN controller re-starts */ ++}; ++ ++/* ++ * CAN netlink interface ++ */ ++enum { ++ IFLA_CAN_UNSPEC, ++ IFLA_CAN_BITTIMING, ++ IFLA_CAN_BITTIMING_CONST, ++ IFLA_CAN_CLOCK, ++ IFLA_CAN_STATE, ++ IFLA_CAN_CTRLMODE, ++ IFLA_CAN_RESTART_MS, ++ IFLA_CAN_RESTART, ++ IFLA_CAN_BERR_COUNTER, ++ IFLA_CAN_DATA_BITTIMING, ++ IFLA_CAN_DATA_BITTIMING_CONST, ++ IFLA_CAN_TERMINATION, ++ IFLA_CAN_TERMINATION_CONST, ++ IFLA_CAN_BITRATE_CONST, ++ IFLA_CAN_DATA_BITRATE_CONST, ++ __IFLA_CAN_MAX ++}; ++ ++#define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1) ++ ++/* u16 termination range: 1..65535 Ohms */ ++#define CAN_TERMINATION_DISABLED 0 ++ ++#endif /* !_UAPI_CAN_NETLINK_H */ +diff --git a/include/uapi/linux/can/vxcan.h b/include/uapi/linux/can/vxcan.h +new file mode 100644 +index 0000000..5b29e8a +--- /dev/null ++++ b/include/uapi/linux/can/vxcan.h +@@ -0,0 +1,12 @@ ++#ifndef _CAN_VXCAN_H ++#define _CAN_VXCAN_H ++ ++enum { ++ VXCAN_INFO_UNSPEC, ++ VXCAN_INFO_PEER, ++ ++ __VXCAN_INFO_MAX ++#define VXCAN_INFO_MAX (__VXCAN_INFO_MAX - 1) ++}; ++ ++#endif +diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h +new file mode 100644 +index 0000000..a62695e +--- /dev/null ++++ b/include/uapi/linux/devlink.h +@@ -0,0 +1,247 @@ ++/* ++ * include/uapi/linux/devlink.h - Network physical device Netlink interface ++ * Copyright (c) 2016 Mellanox Technologies. All rights reserved. ++ * Copyright (c) 2016 Jiri Pirko ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_DEVLINK_H_ ++#define _LINUX_DEVLINK_H_ ++ ++#define DEVLINK_GENL_NAME "devlink" ++#define DEVLINK_GENL_VERSION 0x1 ++#define DEVLINK_GENL_MCGRP_CONFIG_NAME "config" ++ ++enum devlink_command { ++ /* don't change the order or add anything between, this is ABI! */ ++ DEVLINK_CMD_UNSPEC, ++ ++ DEVLINK_CMD_GET, /* can dump */ ++ DEVLINK_CMD_SET, ++ DEVLINK_CMD_NEW, ++ DEVLINK_CMD_DEL, ++ ++ DEVLINK_CMD_PORT_GET, /* can dump */ ++ DEVLINK_CMD_PORT_SET, ++ DEVLINK_CMD_PORT_NEW, ++ DEVLINK_CMD_PORT_DEL, ++ ++ DEVLINK_CMD_PORT_SPLIT, ++ DEVLINK_CMD_PORT_UNSPLIT, ++ ++ DEVLINK_CMD_SB_GET, /* can dump */ ++ DEVLINK_CMD_SB_SET, ++ DEVLINK_CMD_SB_NEW, ++ DEVLINK_CMD_SB_DEL, ++ ++ DEVLINK_CMD_SB_POOL_GET, /* can dump */ ++ DEVLINK_CMD_SB_POOL_SET, ++ DEVLINK_CMD_SB_POOL_NEW, ++ DEVLINK_CMD_SB_POOL_DEL, ++ ++ DEVLINK_CMD_SB_PORT_POOL_GET, /* can dump */ ++ DEVLINK_CMD_SB_PORT_POOL_SET, ++ DEVLINK_CMD_SB_PORT_POOL_NEW, ++ DEVLINK_CMD_SB_PORT_POOL_DEL, ++ ++ DEVLINK_CMD_SB_TC_POOL_BIND_GET, /* can dump */ ++ DEVLINK_CMD_SB_TC_POOL_BIND_SET, ++ DEVLINK_CMD_SB_TC_POOL_BIND_NEW, ++ DEVLINK_CMD_SB_TC_POOL_BIND_DEL, ++ ++ /* Shared buffer occupancy monitoring commands */ ++ DEVLINK_CMD_SB_OCC_SNAPSHOT, ++ DEVLINK_CMD_SB_OCC_MAX_CLEAR, ++ ++ DEVLINK_CMD_ESWITCH_GET, ++#define DEVLINK_CMD_ESWITCH_MODE_GET /* obsolete, never use this! */ \ ++ DEVLINK_CMD_ESWITCH_GET ++ ++ DEVLINK_CMD_ESWITCH_SET, ++#define DEVLINK_CMD_ESWITCH_MODE_SET /* obsolete, never use this! */ \ ++ DEVLINK_CMD_ESWITCH_SET ++ ++ DEVLINK_CMD_DPIPE_TABLE_GET, ++ DEVLINK_CMD_DPIPE_ENTRIES_GET, ++ DEVLINK_CMD_DPIPE_HEADERS_GET, ++ DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, ++ ++ /* add new commands above here */ ++ __DEVLINK_CMD_MAX, ++ DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 ++}; ++ ++enum devlink_port_type { ++ DEVLINK_PORT_TYPE_NOTSET, ++ DEVLINK_PORT_TYPE_AUTO, ++ DEVLINK_PORT_TYPE_ETH, ++ DEVLINK_PORT_TYPE_IB, ++}; ++ ++enum devlink_sb_pool_type { ++ DEVLINK_SB_POOL_TYPE_INGRESS, ++ DEVLINK_SB_POOL_TYPE_EGRESS, ++}; ++ ++/* static threshold - limiting the maximum number of bytes. ++ * dynamic threshold - limiting the maximum number of bytes ++ * based on the currently available free space in the shared buffer pool. ++ * In this mode, the maximum quota is calculated based ++ * on the following formula: ++ * max_quota = alpha / (1 + alpha) * Free_Buffer ++ * While Free_Buffer is the amount of none-occupied buffer associated to ++ * the relevant pool. ++ * The value range which can be passed is 0-20 and serves ++ * for computation of alpha by following formula: ++ * alpha = 2 ^ (passed_value - 10) ++ */ ++ ++enum devlink_sb_threshold_type { ++ DEVLINK_SB_THRESHOLD_TYPE_STATIC, ++ DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC, ++}; ++ ++#define DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX 20 ++ ++enum devlink_eswitch_mode { ++ DEVLINK_ESWITCH_MODE_LEGACY, ++ DEVLINK_ESWITCH_MODE_SWITCHDEV, ++}; ++ ++enum devlink_eswitch_inline_mode { ++ DEVLINK_ESWITCH_INLINE_MODE_NONE, ++ DEVLINK_ESWITCH_INLINE_MODE_LINK, ++ DEVLINK_ESWITCH_INLINE_MODE_NETWORK, ++ DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT, ++}; ++ ++enum devlink_eswitch_encap_mode { ++ DEVLINK_ESWITCH_ENCAP_MODE_NONE, ++ DEVLINK_ESWITCH_ENCAP_MODE_BASIC, ++}; ++ ++enum devlink_attr { ++ /* don't change the order or add anything between, this is ABI! */ ++ DEVLINK_ATTR_UNSPEC, ++ ++ /* bus name + dev name together are a handle for devlink entity */ ++ DEVLINK_ATTR_BUS_NAME, /* string */ ++ DEVLINK_ATTR_DEV_NAME, /* string */ ++ ++ DEVLINK_ATTR_PORT_INDEX, /* u32 */ ++ DEVLINK_ATTR_PORT_TYPE, /* u16 */ ++ DEVLINK_ATTR_PORT_DESIRED_TYPE, /* u16 */ ++ DEVLINK_ATTR_PORT_NETDEV_IFINDEX, /* u32 */ ++ DEVLINK_ATTR_PORT_NETDEV_NAME, /* string */ ++ DEVLINK_ATTR_PORT_IBDEV_NAME, /* string */ ++ DEVLINK_ATTR_PORT_SPLIT_COUNT, /* u32 */ ++ DEVLINK_ATTR_PORT_SPLIT_GROUP, /* u32 */ ++ DEVLINK_ATTR_SB_INDEX, /* u32 */ ++ DEVLINK_ATTR_SB_SIZE, /* u32 */ ++ DEVLINK_ATTR_SB_INGRESS_POOL_COUNT, /* u16 */ ++ DEVLINK_ATTR_SB_EGRESS_POOL_COUNT, /* u16 */ ++ DEVLINK_ATTR_SB_INGRESS_TC_COUNT, /* u16 */ ++ DEVLINK_ATTR_SB_EGRESS_TC_COUNT, /* u16 */ ++ DEVLINK_ATTR_SB_POOL_INDEX, /* u16 */ ++ DEVLINK_ATTR_SB_POOL_TYPE, /* u8 */ ++ DEVLINK_ATTR_SB_POOL_SIZE, /* u32 */ ++ DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE, /* u8 */ ++ DEVLINK_ATTR_SB_THRESHOLD, /* u32 */ ++ DEVLINK_ATTR_SB_TC_INDEX, /* u16 */ ++ DEVLINK_ATTR_SB_OCC_CUR, /* u32 */ ++ DEVLINK_ATTR_SB_OCC_MAX, /* u32 */ ++ DEVLINK_ATTR_ESWITCH_MODE, /* u16 */ ++ DEVLINK_ATTR_ESWITCH_INLINE_MODE, /* u8 */ ++ ++ DEVLINK_ATTR_DPIPE_TABLES, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE_NAME, /* string */ ++ DEVLINK_ATTR_DPIPE_TABLE_SIZE, /* u64 */ ++ DEVLINK_ATTR_DPIPE_TABLE_MATCHES, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE_ACTIONS, /* nested */ ++ DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, /* u8 */ ++ ++ DEVLINK_ATTR_DPIPE_ENTRIES, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY_INDEX, /* u64 */ ++ DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES, /* nested */ ++ DEVLINK_ATTR_DPIPE_ENTRY_COUNTER, /* u64 */ ++ ++ DEVLINK_ATTR_DPIPE_MATCH, /* nested */ ++ DEVLINK_ATTR_DPIPE_MATCH_VALUE, /* nested */ ++ DEVLINK_ATTR_DPIPE_MATCH_TYPE, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_ACTION, /* nested */ ++ DEVLINK_ATTR_DPIPE_ACTION_VALUE, /* nested */ ++ DEVLINK_ATTR_DPIPE_ACTION_TYPE, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_VALUE, ++ DEVLINK_ATTR_DPIPE_VALUE_MASK, ++ DEVLINK_ATTR_DPIPE_VALUE_MAPPING, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_HEADERS, /* nested */ ++ DEVLINK_ATTR_DPIPE_HEADER, /* nested */ ++ DEVLINK_ATTR_DPIPE_HEADER_NAME, /* string */ ++ DEVLINK_ATTR_DPIPE_HEADER_ID, /* u32 */ ++ DEVLINK_ATTR_DPIPE_HEADER_FIELDS, /* nested */ ++ DEVLINK_ATTR_DPIPE_HEADER_GLOBAL, /* u8 */ ++ DEVLINK_ATTR_DPIPE_HEADER_INDEX, /* u32 */ ++ ++ DEVLINK_ATTR_DPIPE_FIELD, /* nested */ ++ DEVLINK_ATTR_DPIPE_FIELD_NAME, /* string */ ++ DEVLINK_ATTR_DPIPE_FIELD_ID, /* u32 */ ++ DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH, /* u32 */ ++ DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE, /* u32 */ ++ ++ DEVLINK_ATTR_PAD, ++ ++ DEVLINK_ATTR_ESWITCH_ENCAP_MODE, /* u8 */ ++ ++ /* add new attributes above here, update the policy in devlink.c */ ++ ++ __DEVLINK_ATTR_MAX, ++ DEVLINK_ATTR_MAX = __DEVLINK_ATTR_MAX - 1 ++}; ++ ++/* Mapping between internal resource described by the field and system ++ * structure ++ */ ++enum devlink_dpipe_field_mapping_type { ++ DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE, ++ DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX, ++}; ++ ++/* Match type - specify the type of the match */ ++enum devlink_dpipe_match_type { ++ DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT, ++}; ++ ++/* Action type - specify the action type */ ++enum devlink_dpipe_action_type { ++ DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY, ++}; ++ ++enum devlink_dpipe_field_ethernet_id { ++ DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC, ++}; ++ ++enum devlink_dpipe_field_ipv4_id { ++ DEVLINK_DPIPE_FIELD_IPV4_DST_IP, ++}; ++ ++enum devlink_dpipe_field_ipv6_id { ++ DEVLINK_DPIPE_FIELD_IPV6_DST_IP, ++}; ++ ++enum devlink_dpipe_header_id { ++ DEVLINK_DPIPE_HEADER_ETHERNET, ++ DEVLINK_DPIPE_HEADER_IPV4, ++ DEVLINK_DPIPE_HEADER_IPV6, ++}; ++ ++#endif /* _LINUX_DEVLINK_H_ */ +diff --git a/include/uapi/linux/elf-em.h b/include/uapi/linux/elf-em.h +new file mode 100644 +index 0000000..9cd1de9 +--- /dev/null ++++ b/include/uapi/linux/elf-em.h +@@ -0,0 +1,60 @@ ++#ifndef _LINUX_ELF_EM_H ++#define _LINUX_ELF_EM_H ++ ++/* These constants define the various ELF target machines */ ++#define EM_NONE 0 ++#define EM_M32 1 ++#define EM_SPARC 2 ++#define EM_386 3 ++#define EM_68K 4 ++#define EM_88K 5 ++#define EM_486 6 /* Perhaps disused */ ++#define EM_860 7 ++#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ ++ /* Next two are historical and binaries and ++ modules of these types will be rejected by ++ Linux. */ ++#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ ++#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */ ++ ++#define EM_PARISC 15 /* HPPA */ ++#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ ++#define EM_PPC 20 /* PowerPC */ ++#define EM_PPC64 21 /* PowerPC64 */ ++#define EM_SPU 23 /* Cell BE SPU */ ++#define EM_ARM 40 /* ARM 32 bit */ ++#define EM_SH 42 /* SuperH */ ++#define EM_SPARCV9 43 /* SPARC v9 64-bit */ ++#define EM_H8_300 46 /* Renesas H8/300 */ ++#define EM_IA_64 50 /* HP/Intel IA-64 */ ++#define EM_X86_64 62 /* AMD x86-64 */ ++#define EM_S390 22 /* IBM S/390 */ ++#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ ++#define EM_M32R 88 /* Renesas M32R */ ++#define EM_MN10300 89 /* Panasonic/MEI MN10300, AM33 */ ++#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ ++#define EM_BLACKFIN 106 /* ADI Blackfin Processor */ ++#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */ ++#define EM_TI_C6000 140 /* TI C6X DSPs */ ++#define EM_AARCH64 183 /* ARM 64 bit */ ++#define EM_TILEPRO 188 /* Tilera TILEPro */ ++#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ ++#define EM_TILEGX 191 /* Tilera TILE-Gx */ ++#define EM_BPF 247 /* Linux BPF - in-kernel virtual machine */ ++#define EM_FRV 0x5441 /* Fujitsu FR-V */ ++ ++/* ++ * This is an interim value that we will use until the committee comes ++ * up with a final number. ++ */ ++#define EM_ALPHA 0x9026 ++ ++/* Bogus old m32r magic number, used by old tools. */ ++#define EM_CYGNUS_M32R 0x9041 ++/* This is the old interim value for S/390 architecture */ ++#define EM_S390_OLD 0xA390 ++/* Also Panasonic/MEI MN10300, AM33 */ ++#define EM_CYGNUS_MN10300 0xbeef ++ ++ ++#endif /* _LINUX_ELF_EM_H */ +diff --git a/include/uapi/linux/fib_rules.h b/include/uapi/linux/fib_rules.h +new file mode 100644 +index 0000000..bbf02a6 +--- /dev/null ++++ b/include/uapi/linux/fib_rules.h +@@ -0,0 +1,80 @@ ++#ifndef __LINUX_FIB_RULES_H ++#define __LINUX_FIB_RULES_H ++ ++#include ++#include ++ ++/* rule is permanent, and cannot be deleted */ ++#define FIB_RULE_PERMANENT 0x00000001 ++#define FIB_RULE_INVERT 0x00000002 ++#define FIB_RULE_UNRESOLVED 0x00000004 ++#define FIB_RULE_IIF_DETACHED 0x00000008 ++#define FIB_RULE_DEV_DETACHED FIB_RULE_IIF_DETACHED ++#define FIB_RULE_OIF_DETACHED 0x00000010 ++ ++/* try to find source address in routing lookups */ ++#define FIB_RULE_FIND_SADDR 0x00010000 ++ ++struct fib_rule_hdr { ++ __u8 family; ++ __u8 dst_len; ++ __u8 src_len; ++ __u8 tos; ++ ++ __u8 table; ++ __u8 res1; /* reserved */ ++ __u8 res2; /* reserved */ ++ __u8 action; ++ ++ __u32 flags; ++}; ++ ++struct fib_rule_uid_range { ++ __u32 start; ++ __u32 end; ++}; ++ ++enum { ++ FRA_UNSPEC, ++ FRA_DST, /* destination address */ ++ FRA_SRC, /* source address */ ++ FRA_IIFNAME, /* interface name */ ++#define FRA_IFNAME FRA_IIFNAME ++ FRA_GOTO, /* target to jump to (FR_ACT_GOTO) */ ++ FRA_UNUSED2, ++ FRA_PRIORITY, /* priority/preference */ ++ FRA_UNUSED3, ++ FRA_UNUSED4, ++ FRA_UNUSED5, ++ FRA_FWMARK, /* mark */ ++ FRA_FLOW, /* flow/class id */ ++ FRA_TUN_ID, ++ FRA_SUPPRESS_IFGROUP, ++ FRA_SUPPRESS_PREFIXLEN, ++ FRA_TABLE, /* Extended table id */ ++ FRA_FWMASK, /* mask for netfilter mark */ ++ FRA_OIFNAME, ++ FRA_PAD, ++ FRA_L3MDEV, /* iif or oif is l3mdev goto its table */ ++ FRA_UID_RANGE, /* UID range */ ++ __FRA_MAX ++}; ++ ++#define FRA_MAX (__FRA_MAX - 1) ++ ++enum { ++ FR_ACT_UNSPEC, ++ FR_ACT_TO_TBL, /* Pass to fixed table */ ++ FR_ACT_GOTO, /* Jump to another rule */ ++ FR_ACT_NOP, /* No operation */ ++ FR_ACT_RES3, ++ FR_ACT_RES4, ++ FR_ACT_BLACKHOLE, /* Drop without notification */ ++ FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */ ++ FR_ACT_PROHIBIT, /* Drop with EACCES */ ++ __FR_ACT_MAX, ++}; ++ ++#define FR_ACT_MAX (__FR_ACT_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/filter.h b/include/uapi/linux/filter.h +new file mode 100644 +index 0000000..e4f2f74 +--- /dev/null ++++ b/include/uapi/linux/filter.h +@@ -0,0 +1,89 @@ ++/* ++ * Linux Socket Filter Data Structures ++ */ ++ ++#ifndef __LINUX_FILTER_H__ ++#define __LINUX_FILTER_H__ ++ ++ ++#include ++#include ++ ++/* ++ * Current version of the filter code architecture. ++ */ ++#define BPF_MAJOR_VERSION 1 ++#define BPF_MINOR_VERSION 1 ++ ++/* ++ * Try and keep these values and structures similar to BSD, especially ++ * the BPF code definitions which need to match so you can share filters ++ */ ++ ++struct sock_filter { /* Filter block */ ++ __u16 code; /* Actual filter code */ ++ __u8 jt; /* Jump true */ ++ __u8 jf; /* Jump false */ ++ __u32 k; /* Generic multiuse field */ ++}; ++ ++struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ ++ unsigned short len; /* Number of filter blocks */ ++ struct sock_filter *filter; ++}; ++ ++/* ret - BPF_K and BPF_X also apply */ ++#define BPF_RVAL(code) ((code) & 0x18) ++#define BPF_A 0x10 ++ ++/* misc */ ++#define BPF_MISCOP(code) ((code) & 0xf8) ++#define BPF_TAX 0x00 ++#define BPF_TXA 0x80 ++ ++/* ++ * Macros for filter block array initializers. ++ */ ++#ifndef BPF_STMT ++#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } ++#endif ++#ifndef BPF_JUMP ++#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } ++#endif ++ ++/* ++ * Number of scratch memory words for: BPF_ST and BPF_STX ++ */ ++#define BPF_MEMWORDS 16 ++ ++/* RATIONALE. Negative offsets are invalid in BPF. ++ We use them to reference ancillary data. ++ Unlike introduction new instructions, it does not break ++ existing compilers/optimizers. ++ */ ++#define SKF_AD_OFF (-0x1000) ++#define SKF_AD_PROTOCOL 0 ++#define SKF_AD_PKTTYPE 4 ++#define SKF_AD_IFINDEX 8 ++#define SKF_AD_NLATTR 12 ++#define SKF_AD_NLATTR_NEST 16 ++#define SKF_AD_MARK 20 ++#define SKF_AD_QUEUE 24 ++#define SKF_AD_HATYPE 28 ++#define SKF_AD_RXHASH 32 ++#define SKF_AD_CPU 36 ++#define SKF_AD_ALU_XOR_X 40 ++#define SKF_AD_VLAN_TAG 44 ++#define SKF_AD_VLAN_TAG_PRESENT 48 ++#define SKF_AD_PAY_OFFSET 52 ++#define SKF_AD_RANDOM 56 ++#define SKF_AD_VLAN_TPID 60 ++#define SKF_AD_MAX 64 ++ ++#define SKF_NET_OFF (-0x100000) ++#define SKF_LL_OFF (-0x200000) ++ ++#define BPF_NET_OFF SKF_NET_OFF ++#define BPF_LL_OFF SKF_LL_OFF ++ ++#endif /* __LINUX_FILTER_H__ */ +diff --git a/include/uapi/linux/fou.h b/include/uapi/linux/fou.h +new file mode 100644 +index 0000000..744c323 +--- /dev/null ++++ b/include/uapi/linux/fou.h +@@ -0,0 +1,41 @@ ++/* fou.h - FOU Interface */ ++ ++#ifndef _LINUX_FOU_H ++#define _LINUX_FOU_H ++ ++/* NETLINK_GENERIC related info ++ */ ++#define FOU_GENL_NAME "fou" ++#define FOU_GENL_VERSION 0x1 ++ ++enum { ++ FOU_ATTR_UNSPEC, ++ FOU_ATTR_PORT, /* u16 */ ++ FOU_ATTR_AF, /* u8 */ ++ FOU_ATTR_IPPROTO, /* u8 */ ++ FOU_ATTR_TYPE, /* u8 */ ++ FOU_ATTR_REMCSUM_NOPARTIAL, /* flag */ ++ ++ __FOU_ATTR_MAX, ++}; ++ ++#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1) ++ ++enum { ++ FOU_CMD_UNSPEC, ++ FOU_CMD_ADD, ++ FOU_CMD_DEL, ++ FOU_CMD_GET, ++ ++ __FOU_CMD_MAX, ++}; ++ ++enum { ++ FOU_ENCAP_UNSPEC, ++ FOU_ENCAP_DIRECT, ++ FOU_ENCAP_GUE, ++}; ++ ++#define FOU_CMD_MAX (__FOU_CMD_MAX - 1) ++ ++#endif /* _LINUX_FOU_H */ +diff --git a/include/uapi/linux/gen_stats.h b/include/uapi/linux/gen_stats.h +new file mode 100644 +index 0000000..52deccc +--- /dev/null ++++ b/include/uapi/linux/gen_stats.h +@@ -0,0 +1,79 @@ ++#ifndef __LINUX_GEN_STATS_H ++#define __LINUX_GEN_STATS_H ++ ++#include ++ ++enum { ++ TCA_STATS_UNSPEC, ++ TCA_STATS_BASIC, ++ TCA_STATS_RATE_EST, ++ TCA_STATS_QUEUE, ++ TCA_STATS_APP, ++ TCA_STATS_RATE_EST64, ++ TCA_STATS_PAD, ++ __TCA_STATS_MAX, ++}; ++#define TCA_STATS_MAX (__TCA_STATS_MAX - 1) ++ ++/** ++ * struct gnet_stats_basic - byte/packet throughput statistics ++ * @bytes: number of seen bytes ++ * @packets: number of seen packets ++ */ ++struct gnet_stats_basic { ++ __u64 bytes; ++ __u32 packets; ++}; ++struct gnet_stats_basic_packed { ++ __u64 bytes; ++ __u32 packets; ++} __attribute__ ((packed)); ++ ++/** ++ * struct gnet_stats_rate_est - rate estimator ++ * @bps: current byte rate ++ * @pps: current packet rate ++ */ ++struct gnet_stats_rate_est { ++ __u32 bps; ++ __u32 pps; ++}; ++ ++/** ++ * struct gnet_stats_rate_est64 - rate estimator ++ * @bps: current byte rate ++ * @pps: current packet rate ++ */ ++struct gnet_stats_rate_est64 { ++ __u64 bps; ++ __u64 pps; ++}; ++ ++/** ++ * struct gnet_stats_queue - queuing statistics ++ * @qlen: queue length ++ * @backlog: backlog size of queue ++ * @drops: number of dropped packets ++ * @requeues: number of requeues ++ * @overlimits: number of enqueues over the limit ++ */ ++struct gnet_stats_queue { ++ __u32 qlen; ++ __u32 backlog; ++ __u32 drops; ++ __u32 requeues; ++ __u32 overlimits; ++}; ++ ++/** ++ * struct gnet_estimator - rate estimator configuration ++ * @interval: sampling period ++ * @ewma_log: the log of measurement window weight ++ */ ++struct gnet_estimator { ++ signed char interval; ++ unsigned char ewma_log; ++}; ++ ++ ++#endif /* __LINUX_GEN_STATS_H */ +diff --git a/include/uapi/linux/genetlink.h b/include/uapi/linux/genetlink.h +new file mode 100644 +index 0000000..08239d8 +--- /dev/null ++++ b/include/uapi/linux/genetlink.h +@@ -0,0 +1,88 @@ ++#ifndef __LINUX_GENERIC_NETLINK_H ++#define __LINUX_GENERIC_NETLINK_H ++ ++#include ++#include ++ ++#define GENL_NAMSIZ 16 /* length of family name */ ++ ++#define GENL_MIN_ID NLMSG_MIN_TYPE ++#define GENL_MAX_ID 1023 ++ ++struct genlmsghdr { ++ __u8 cmd; ++ __u8 version; ++ __u16 reserved; ++}; ++ ++#define GENL_HDRLEN NLMSG_ALIGN(sizeof(struct genlmsghdr)) ++ ++#define GENL_ADMIN_PERM 0x01 ++#define GENL_CMD_CAP_DO 0x02 ++#define GENL_CMD_CAP_DUMP 0x04 ++#define GENL_CMD_CAP_HASPOL 0x08 ++#define GENL_UNS_ADMIN_PERM 0x10 ++ ++/* ++ * List of reserved static generic netlink identifiers: ++ */ ++#define GENL_ID_CTRL NLMSG_MIN_TYPE ++#define GENL_ID_VFS_DQUOT (NLMSG_MIN_TYPE + 1) ++#define GENL_ID_PMCRAID (NLMSG_MIN_TYPE + 2) ++/* must be last reserved + 1 */ ++#define GENL_START_ALLOC (NLMSG_MIN_TYPE + 3) ++ ++/************************************************************************** ++ * Controller ++ **************************************************************************/ ++ ++enum { ++ CTRL_CMD_UNSPEC, ++ CTRL_CMD_NEWFAMILY, ++ CTRL_CMD_DELFAMILY, ++ CTRL_CMD_GETFAMILY, ++ CTRL_CMD_NEWOPS, ++ CTRL_CMD_DELOPS, ++ CTRL_CMD_GETOPS, ++ CTRL_CMD_NEWMCAST_GRP, ++ CTRL_CMD_DELMCAST_GRP, ++ CTRL_CMD_GETMCAST_GRP, /* unused */ ++ __CTRL_CMD_MAX, ++}; ++ ++#define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1) ++ ++enum { ++ CTRL_ATTR_UNSPEC, ++ CTRL_ATTR_FAMILY_ID, ++ CTRL_ATTR_FAMILY_NAME, ++ CTRL_ATTR_VERSION, ++ CTRL_ATTR_HDRSIZE, ++ CTRL_ATTR_MAXATTR, ++ CTRL_ATTR_OPS, ++ CTRL_ATTR_MCAST_GROUPS, ++ __CTRL_ATTR_MAX, ++}; ++ ++#define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1) ++ ++enum { ++ CTRL_ATTR_OP_UNSPEC, ++ CTRL_ATTR_OP_ID, ++ CTRL_ATTR_OP_FLAGS, ++ __CTRL_ATTR_OP_MAX, ++}; ++ ++#define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1) ++ ++enum { ++ CTRL_ATTR_MCAST_GRP_UNSPEC, ++ CTRL_ATTR_MCAST_GRP_NAME, ++ CTRL_ATTR_MCAST_GRP_ID, ++ __CTRL_ATTR_MCAST_GRP_MAX, ++}; ++ ++#define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1) ++ ++ ++#endif /* __LINUX_GENERIC_NETLINK_H */ +diff --git a/include/uapi/linux/hdlc/ioctl.h b/include/uapi/linux/hdlc/ioctl.h +new file mode 100644 +index 0000000..04bc027 +--- /dev/null ++++ b/include/uapi/linux/hdlc/ioctl.h +@@ -0,0 +1,84 @@ ++#ifndef __HDLC_IOCTL_H__ ++#define __HDLC_IOCTL_H__ ++ ++ ++#define GENERIC_HDLC_VERSION 4 /* For synchronization with sethdlc utility */ ++ ++#define CLOCK_DEFAULT 0 /* Default setting */ ++#define CLOCK_EXT 1 /* External TX and RX clock - DTE */ ++#define CLOCK_INT 2 /* Internal TX and RX clock - DCE */ ++#define CLOCK_TXINT 3 /* Internal TX and external RX clock */ ++#define CLOCK_TXFROMRX 4 /* TX clock derived from external RX clock */ ++ ++ ++#define ENCODING_DEFAULT 0 /* Default setting */ ++#define ENCODING_NRZ 1 ++#define ENCODING_NRZI 2 ++#define ENCODING_FM_MARK 3 ++#define ENCODING_FM_SPACE 4 ++#define ENCODING_MANCHESTER 5 ++ ++ ++#define PARITY_DEFAULT 0 /* Default setting */ ++#define PARITY_NONE 1 /* No parity */ ++#define PARITY_CRC16_PR0 2 /* CRC16, initial value 0x0000 */ ++#define PARITY_CRC16_PR1 3 /* CRC16, initial value 0xFFFF */ ++#define PARITY_CRC16_PR0_CCITT 4 /* CRC16, initial 0x0000, ITU-T version */ ++#define PARITY_CRC16_PR1_CCITT 5 /* CRC16, initial 0xFFFF, ITU-T version */ ++#define PARITY_CRC32_PR0_CCITT 6 /* CRC32, initial value 0x00000000 */ ++#define PARITY_CRC32_PR1_CCITT 7 /* CRC32, initial value 0xFFFFFFFF */ ++ ++#define LMI_DEFAULT 0 /* Default setting */ ++#define LMI_NONE 1 /* No LMI, all PVCs are static */ ++#define LMI_ANSI 2 /* ANSI Annex D */ ++#define LMI_CCITT 3 /* ITU-T Annex A */ ++#define LMI_CISCO 4 /* The "original" LMI, aka Gang of Four */ ++ ++#ifndef __ASSEMBLY__ ++ ++typedef struct { ++ unsigned int clock_rate; /* bits per second */ ++ unsigned int clock_type; /* internal, external, TX-internal etc. */ ++ unsigned short loopback; ++} sync_serial_settings; /* V.35, V.24, X.21 */ ++ ++typedef struct { ++ unsigned int clock_rate; /* bits per second */ ++ unsigned int clock_type; /* internal, external, TX-internal etc. */ ++ unsigned short loopback; ++ unsigned int slot_map; ++} te1_settings; /* T1, E1 */ ++ ++typedef struct { ++ unsigned short encoding; ++ unsigned short parity; ++} raw_hdlc_proto; ++ ++typedef struct { ++ unsigned int t391; ++ unsigned int t392; ++ unsigned int n391; ++ unsigned int n392; ++ unsigned int n393; ++ unsigned short lmi; ++ unsigned short dce; /* 1 for DCE (network side) operation */ ++} fr_proto; ++ ++typedef struct { ++ unsigned int dlci; ++} fr_proto_pvc; /* for creating/deleting FR PVCs */ ++ ++typedef struct { ++ unsigned int dlci; ++ char master[IFNAMSIZ]; /* Name of master FRAD device */ ++}fr_proto_pvc_info; /* for returning PVC information only */ ++ ++typedef struct { ++ unsigned int interval; ++ unsigned int timeout; ++} cisco_proto; ++ ++/* PPP doesn't need any info now - supply length = 0 to ioctl */ ++ ++#endif /* __ASSEMBLY__ */ ++#endif /* __HDLC_IOCTL_H__ */ +diff --git a/include/uapi/linux/icmpv6.h b/include/uapi/linux/icmpv6.h +new file mode 100644 +index 0000000..a2e839e +--- /dev/null ++++ b/include/uapi/linux/icmpv6.h +@@ -0,0 +1,166 @@ ++#ifndef _LINUX_ICMPV6_H ++#define _LINUX_ICMPV6_H ++ ++#include ++#include ++ ++struct icmp6hdr { ++ ++ __u8 icmp6_type; ++ __u8 icmp6_code; ++ __sum16 icmp6_cksum; ++ ++ ++ union { ++ __be32 un_data32[1]; ++ __be16 un_data16[2]; ++ __u8 un_data8[4]; ++ ++ struct icmpv6_echo { ++ __be16 identifier; ++ __be16 sequence; ++ } u_echo; ++ ++ struct icmpv6_nd_advt { ++#if defined(__LITTLE_ENDIAN_BITFIELD) ++ __u32 reserved:5, ++ override:1, ++ solicited:1, ++ router:1, ++ reserved2:24; ++#elif defined(__BIG_ENDIAN_BITFIELD) ++ __u32 router:1, ++ solicited:1, ++ override:1, ++ reserved:29; ++#else ++#error "Please fix " ++#endif ++ } u_nd_advt; ++ ++ struct icmpv6_nd_ra { ++ __u8 hop_limit; ++#if defined(__LITTLE_ENDIAN_BITFIELD) ++ __u8 reserved:3, ++ router_pref:2, ++ home_agent:1, ++ other:1, ++ managed:1; ++ ++#elif defined(__BIG_ENDIAN_BITFIELD) ++ __u8 managed:1, ++ other:1, ++ home_agent:1, ++ router_pref:2, ++ reserved:3; ++#else ++#error "Please fix " ++#endif ++ __be16 rt_lifetime; ++ } u_nd_ra; ++ ++ } icmp6_dataun; ++ ++#define icmp6_identifier icmp6_dataun.u_echo.identifier ++#define icmp6_sequence icmp6_dataun.u_echo.sequence ++#define icmp6_pointer icmp6_dataun.un_data32[0] ++#define icmp6_mtu icmp6_dataun.un_data32[0] ++#define icmp6_unused icmp6_dataun.un_data32[0] ++#define icmp6_maxdelay icmp6_dataun.un_data16[0] ++#define icmp6_router icmp6_dataun.u_nd_advt.router ++#define icmp6_solicited icmp6_dataun.u_nd_advt.solicited ++#define icmp6_override icmp6_dataun.u_nd_advt.override ++#define icmp6_ndiscreserved icmp6_dataun.u_nd_advt.reserved ++#define icmp6_hop_limit icmp6_dataun.u_nd_ra.hop_limit ++#define icmp6_addrconf_managed icmp6_dataun.u_nd_ra.managed ++#define icmp6_addrconf_other icmp6_dataun.u_nd_ra.other ++#define icmp6_rt_lifetime icmp6_dataun.u_nd_ra.rt_lifetime ++#define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref ++}; ++ ++ ++#define ICMPV6_ROUTER_PREF_LOW 0x3 ++#define ICMPV6_ROUTER_PREF_MEDIUM 0x0 ++#define ICMPV6_ROUTER_PREF_HIGH 0x1 ++#define ICMPV6_ROUTER_PREF_INVALID 0x2 ++ ++#define ICMPV6_DEST_UNREACH 1 ++#define ICMPV6_PKT_TOOBIG 2 ++#define ICMPV6_TIME_EXCEED 3 ++#define ICMPV6_PARAMPROB 4 ++ ++#define ICMPV6_INFOMSG_MASK 0x80 ++ ++#define ICMPV6_ECHO_REQUEST 128 ++#define ICMPV6_ECHO_REPLY 129 ++#define ICMPV6_MGM_QUERY 130 ++#define ICMPV6_MGM_REPORT 131 ++#define ICMPV6_MGM_REDUCTION 132 ++ ++#define ICMPV6_NI_QUERY 139 ++#define ICMPV6_NI_REPLY 140 ++ ++#define ICMPV6_MLD2_REPORT 143 ++ ++#define ICMPV6_DHAAD_REQUEST 144 ++#define ICMPV6_DHAAD_REPLY 145 ++#define ICMPV6_MOBILE_PREFIX_SOL 146 ++#define ICMPV6_MOBILE_PREFIX_ADV 147 ++ ++/* ++ * Codes for Destination Unreachable ++ */ ++#define ICMPV6_NOROUTE 0 ++#define ICMPV6_ADM_PROHIBITED 1 ++#define ICMPV6_NOT_NEIGHBOUR 2 ++#define ICMPV6_ADDR_UNREACH 3 ++#define ICMPV6_PORT_UNREACH 4 ++#define ICMPV6_POLICY_FAIL 5 ++#define ICMPV6_REJECT_ROUTE 6 ++ ++/* ++ * Codes for Time Exceeded ++ */ ++#define ICMPV6_EXC_HOPLIMIT 0 ++#define ICMPV6_EXC_FRAGTIME 1 ++ ++/* ++ * Codes for Parameter Problem ++ */ ++#define ICMPV6_HDR_FIELD 0 ++#define ICMPV6_UNK_NEXTHDR 1 ++#define ICMPV6_UNK_OPTION 2 ++ ++/* ++ * constants for (set|get)sockopt ++ */ ++ ++#define ICMPV6_FILTER 1 ++ ++/* ++ * ICMPV6 filter ++ */ ++ ++#define ICMPV6_FILTER_BLOCK 1 ++#define ICMPV6_FILTER_PASS 2 ++#define ICMPV6_FILTER_BLOCKOTHERS 3 ++#define ICMPV6_FILTER_PASSONLY 4 ++ ++struct icmp6_filter { ++ __u32 data[8]; ++}; ++ ++/* ++ * Definitions for MLDv2 ++ */ ++#define MLD2_MODE_IS_INCLUDE 1 ++#define MLD2_MODE_IS_EXCLUDE 2 ++#define MLD2_CHANGE_TO_INCLUDE 3 ++#define MLD2_CHANGE_TO_EXCLUDE 4 ++#define MLD2_ALLOW_NEW_SOURCES 5 ++#define MLD2_BLOCK_OLD_SOURCES 6 ++ ++#define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } } ++ ++ ++#endif /* _LINUX_ICMPV6_H */ +diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h +new file mode 100644 +index 0000000..b4ba020 +--- /dev/null ++++ b/include/uapi/linux/if.h +@@ -0,0 +1,292 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Global definitions for the INET interface module. ++ * ++ * Version: @(#)if.h 1.0.2 04/18/93 ++ * ++ * Authors: Original taken from Berkeley UNIX 4.3, (c) UCB 1982-1988 ++ * Ross Biro ++ * Fred N. van Kempen, ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++#ifndef _LINUX_IF_H ++#define _LINUX_IF_H ++ ++#include /* for compatibility with glibc */ ++#include /* for "__kernel_caddr_t" et al */ ++#include /* for "struct sockaddr" et al */ ++ /* for "__user" et al */ ++ ++#include /* for struct sockaddr. */ ++ ++#if __UAPI_DEF_IF_IFNAMSIZ ++#define IFNAMSIZ 16 ++#endif /* __UAPI_DEF_IF_IFNAMSIZ */ ++#define IFALIASZ 256 ++#include ++ ++/* For glibc compatibility. An empty enum does not compile. */ ++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \ ++ __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 ++/** ++ * enum net_device_flags - &struct net_device flags ++ * ++ * These are the &struct net_device flags, they can be set by drivers, the ++ * kernel and some can be triggered by userspace. Userspace can query and ++ * set these flags using userspace utilities but there is also a sysfs ++ * entry available for all dev flags which can be queried and set. These flags ++ * are shared for all types of net_devices. The sysfs entries are available ++ * via /sys/class/net//flags. Flags which can be toggled through sysfs ++ * are annotated below, note that only a few flags can be toggled and some ++ * other flags are always preserved from the original net_device flags ++ * even if you try to set them via sysfs. Flags which are always preserved ++ * are kept under the flag grouping @IFF_VOLATILE. Flags which are __volatile__ ++ * are annotated below as such. ++ * ++ * You should have a pretty good reason to be extending these flags. ++ * ++ * @IFF_UP: interface is up. Can be toggled through sysfs. ++ * @IFF_BROADCAST: broadcast address valid. Volatile. ++ * @IFF_DEBUG: turn on debugging. Can be toggled through sysfs. ++ * @IFF_LOOPBACK: is a loopback net. Volatile. ++ * @IFF_POINTOPOINT: interface is has p-p link. Volatile. ++ * @IFF_NOTRAILERS: avoid use of trailers. Can be toggled through sysfs. ++ * Volatile. ++ * @IFF_RUNNING: interface RFC2863 OPER_UP. Volatile. ++ * @IFF_NOARP: no ARP protocol. Can be toggled through sysfs. Volatile. ++ * @IFF_PROMISC: receive all packets. Can be toggled through sysfs. ++ * @IFF_ALLMULTI: receive all multicast packets. Can be toggled through ++ * sysfs. ++ * @IFF_MASTER: master of a load balancer. Volatile. ++ * @IFF_SLAVE: slave of a load balancer. Volatile. ++ * @IFF_MULTICAST: Supports multicast. Can be toggled through sysfs. ++ * @IFF_PORTSEL: can set media type. Can be toggled through sysfs. ++ * @IFF_AUTOMEDIA: auto media select active. Can be toggled through sysfs. ++ * @IFF_DYNAMIC: dialup device with changing addresses. Can be toggled ++ * through sysfs. ++ * @IFF_LOWER_UP: driver signals L1 up. Volatile. ++ * @IFF_DORMANT: driver signals dormant. Volatile. ++ * @IFF_ECHO: echo sent packets. Volatile. ++ */ ++enum net_device_flags { ++/* for compatibility with glibc net/if.h */ ++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS ++ IFF_UP = 1<<0, /* sysfs */ ++ IFF_BROADCAST = 1<<1, /* __volatile__ */ ++ IFF_DEBUG = 1<<2, /* sysfs */ ++ IFF_LOOPBACK = 1<<3, /* __volatile__ */ ++ IFF_POINTOPOINT = 1<<4, /* __volatile__ */ ++ IFF_NOTRAILERS = 1<<5, /* sysfs */ ++ IFF_RUNNING = 1<<6, /* __volatile__ */ ++ IFF_NOARP = 1<<7, /* sysfs */ ++ IFF_PROMISC = 1<<8, /* sysfs */ ++ IFF_ALLMULTI = 1<<9, /* sysfs */ ++ IFF_MASTER = 1<<10, /* __volatile__ */ ++ IFF_SLAVE = 1<<11, /* __volatile__ */ ++ IFF_MULTICAST = 1<<12, /* sysfs */ ++ IFF_PORTSEL = 1<<13, /* sysfs */ ++ IFF_AUTOMEDIA = 1<<14, /* sysfs */ ++ IFF_DYNAMIC = 1<<15, /* sysfs */ ++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ ++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO ++ IFF_LOWER_UP = 1<<16, /* __volatile__ */ ++ IFF_DORMANT = 1<<17, /* __volatile__ */ ++ IFF_ECHO = 1<<18, /* __volatile__ */ ++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ ++}; ++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ ++ ++/* for compatibility with glibc net/if.h */ ++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS ++#define IFF_UP IFF_UP ++#define IFF_BROADCAST IFF_BROADCAST ++#define IFF_DEBUG IFF_DEBUG ++#define IFF_LOOPBACK IFF_LOOPBACK ++#define IFF_POINTOPOINT IFF_POINTOPOINT ++#define IFF_NOTRAILERS IFF_NOTRAILERS ++#define IFF_RUNNING IFF_RUNNING ++#define IFF_NOARP IFF_NOARP ++#define IFF_PROMISC IFF_PROMISC ++#define IFF_ALLMULTI IFF_ALLMULTI ++#define IFF_MASTER IFF_MASTER ++#define IFF_SLAVE IFF_SLAVE ++#define IFF_MULTICAST IFF_MULTICAST ++#define IFF_PORTSEL IFF_PORTSEL ++#define IFF_AUTOMEDIA IFF_AUTOMEDIA ++#define IFF_DYNAMIC IFF_DYNAMIC ++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ ++ ++#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO ++#define IFF_LOWER_UP IFF_LOWER_UP ++#define IFF_DORMANT IFF_DORMANT ++#define IFF_ECHO IFF_ECHO ++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ ++ ++#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ ++ IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) ++ ++#define IF_GET_IFACE 0x0001 /* for querying only */ ++#define IF_GET_PROTO 0x0002 ++ ++/* For definitions see hdlc.h */ ++#define IF_IFACE_V35 0x1000 /* V.35 serial interface */ ++#define IF_IFACE_V24 0x1001 /* V.24 serial interface */ ++#define IF_IFACE_X21 0x1002 /* X.21 serial interface */ ++#define IF_IFACE_T1 0x1003 /* T1 telco serial interface */ ++#define IF_IFACE_E1 0x1004 /* E1 telco serial interface */ ++#define IF_IFACE_SYNC_SERIAL 0x1005 /* can't be set by software */ ++#define IF_IFACE_X21D 0x1006 /* X.21 Dual Clocking (FarSite) */ ++ ++/* For definitions see hdlc.h */ ++#define IF_PROTO_HDLC 0x2000 /* raw HDLC protocol */ ++#define IF_PROTO_PPP 0x2001 /* PPP protocol */ ++#define IF_PROTO_CISCO 0x2002 /* Cisco HDLC protocol */ ++#define IF_PROTO_FR 0x2003 /* Frame Relay protocol */ ++#define IF_PROTO_FR_ADD_PVC 0x2004 /* Create FR PVC */ ++#define IF_PROTO_FR_DEL_PVC 0x2005 /* Delete FR PVC */ ++#define IF_PROTO_X25 0x2006 /* X.25 */ ++#define IF_PROTO_HDLC_ETH 0x2007 /* raw HDLC, Ethernet emulation */ ++#define IF_PROTO_FR_ADD_ETH_PVC 0x2008 /* Create FR Ethernet-bridged PVC */ ++#define IF_PROTO_FR_DEL_ETH_PVC 0x2009 /* Delete FR Ethernet-bridged PVC */ ++#define IF_PROTO_FR_PVC 0x200A /* for reading PVC status */ ++#define IF_PROTO_FR_ETH_PVC 0x200B ++#define IF_PROTO_RAW 0x200C /* RAW Socket */ ++ ++/* RFC 2863 operational status */ ++enum { ++ IF_OPER_UNKNOWN, ++ IF_OPER_NOTPRESENT, ++ IF_OPER_DOWN, ++ IF_OPER_LOWERLAYERDOWN, ++ IF_OPER_TESTING, ++ IF_OPER_DORMANT, ++ IF_OPER_UP, ++}; ++ ++/* link modes */ ++enum { ++ IF_LINK_MODE_DEFAULT, ++ IF_LINK_MODE_DORMANT, /* limit upward transition to dormant */ ++}; ++ ++/* ++ * Device mapping structure. I'd just gone off and designed a ++ * beautiful scheme using only loadable modules with arguments ++ * for driver options and along come the PCMCIA people 8) ++ * ++ * Ah well. The get() side of this is good for WDSETUP, and it'll ++ * be handy for debugging things. The set side is fine for now and ++ * being very small might be worth keeping for clean configuration. ++ */ ++ ++/* for compatibility with glibc net/if.h */ ++#if __UAPI_DEF_IF_IFMAP ++struct ifmap { ++ unsigned long mem_start; ++ unsigned long mem_end; ++ unsigned short base_addr; ++ unsigned char irq; ++ unsigned char dma; ++ unsigned char port; ++ /* 3 bytes spare */ ++}; ++#endif /* __UAPI_DEF_IF_IFMAP */ ++ ++struct if_settings { ++ unsigned int type; /* Type of physical device or protocol */ ++ unsigned int size; /* Size of the data allocated by the caller */ ++ union { ++ /* {atm/eth/dsl}_settings anyone ? */ ++ raw_hdlc_proto *raw_hdlc; ++ cisco_proto *cisco; ++ fr_proto *fr; ++ fr_proto_pvc *fr_pvc; ++ fr_proto_pvc_info *fr_pvc_info; ++ ++ /* interface settings */ ++ sync_serial_settings *sync; ++ te1_settings *te1; ++ } ifs_ifsu; ++}; ++ ++/* ++ * Interface request structure used for socket ++ * ioctl's. All interface ioctl's must have parameter ++ * definitions which begin with ifr_name. The ++ * remainder may be interface specific. ++ */ ++ ++/* for compatibility with glibc net/if.h */ ++#if __UAPI_DEF_IF_IFREQ ++struct ifreq { ++#define IFHWADDRLEN 6 ++ union ++ { ++ char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ ++ } ifr_ifrn; ++ ++ union { ++ struct sockaddr ifru_addr; ++ struct sockaddr ifru_dstaddr; ++ struct sockaddr ifru_broadaddr; ++ struct sockaddr ifru_netmask; ++ struct sockaddr ifru_hwaddr; ++ short ifru_flags; ++ int ifru_ivalue; ++ int ifru_mtu; ++ struct ifmap ifru_map; ++ char ifru_slave[IFNAMSIZ]; /* Just fits the size */ ++ char ifru_newname[IFNAMSIZ]; ++ void * ifru_data; ++ struct if_settings ifru_settings; ++ } ifr_ifru; ++}; ++#endif /* __UAPI_DEF_IF_IFREQ */ ++ ++#define ifr_name ifr_ifrn.ifrn_name /* interface name */ ++#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ ++#define ifr_addr ifr_ifru.ifru_addr /* address */ ++#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ ++#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ ++#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ ++#define ifr_flags ifr_ifru.ifru_flags /* flags */ ++#define ifr_metric ifr_ifru.ifru_ivalue /* metric */ ++#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ ++#define ifr_map ifr_ifru.ifru_map /* device map */ ++#define ifr_slave ifr_ifru.ifru_slave /* slave device */ ++#define ifr_data ifr_ifru.ifru_data /* for use by interface */ ++#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ ++#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ ++#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */ ++#define ifr_newname ifr_ifru.ifru_newname /* New name */ ++#define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/ ++ ++/* ++ * Structure used in SIOCGIFCONF request. ++ * Used to retrieve interface configuration ++ * for machine (useful for programs which ++ * must know all networks accessible). ++ */ ++ ++/* for compatibility with glibc net/if.h */ ++#if __UAPI_DEF_IF_IFCONF ++struct ifconf { ++ int ifc_len; /* size of buffer */ ++ union { ++ char *ifcu_buf; ++ struct ifreq *ifcu_req; ++ } ifc_ifcu; ++}; ++#endif /* __UAPI_DEF_IF_IFCONF */ ++ ++#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ ++#define ifc_req ifc_ifcu.ifcu_req /* array of structures */ ++ ++#endif /* _LINUX_IF_H */ +diff --git a/include/uapi/linux/if_addr.h b/include/uapi/linux/if_addr.h +new file mode 100644 +index 0000000..26f0ecf +--- /dev/null ++++ b/include/uapi/linux/if_addr.h +@@ -0,0 +1,67 @@ ++#ifndef __LINUX_IF_ADDR_H ++#define __LINUX_IF_ADDR_H ++ ++#include ++#include ++ ++struct ifaddrmsg { ++ __u8 ifa_family; ++ __u8 ifa_prefixlen; /* The prefix length */ ++ __u8 ifa_flags; /* Flags */ ++ __u8 ifa_scope; /* Address scope */ ++ __u32 ifa_index; /* Link index */ ++}; ++ ++/* ++ * Important comment: ++ * IFA_ADDRESS is prefix address, rather than local interface address. ++ * It makes no difference for normally configured broadcast interfaces, ++ * but for point-to-point IFA_ADDRESS is DESTINATION address, ++ * local address is supplied in IFA_LOCAL attribute. ++ * ++ * IFA_FLAGS is a u32 attribute that extends the u8 field ifa_flags. ++ * If present, the value from struct ifaddrmsg will be ignored. ++ */ ++enum { ++ IFA_UNSPEC, ++ IFA_ADDRESS, ++ IFA_LOCAL, ++ IFA_LABEL, ++ IFA_BROADCAST, ++ IFA_ANYCAST, ++ IFA_CACHEINFO, ++ IFA_MULTICAST, ++ IFA_FLAGS, ++ __IFA_MAX, ++}; ++ ++#define IFA_MAX (__IFA_MAX - 1) ++ ++/* ifa_flags */ ++#define IFA_F_SECONDARY 0x01 ++#define IFA_F_TEMPORARY IFA_F_SECONDARY ++ ++#define IFA_F_NODAD 0x02 ++#define IFA_F_OPTIMISTIC 0x04 ++#define IFA_F_DADFAILED 0x08 ++#define IFA_F_HOMEADDRESS 0x10 ++#define IFA_F_DEPRECATED 0x20 ++#define IFA_F_TENTATIVE 0x40 ++#define IFA_F_PERMANENT 0x80 ++#define IFA_F_MANAGETEMPADDR 0x100 ++#define IFA_F_NOPREFIXROUTE 0x200 ++#define IFA_F_MCAUTOJOIN 0x400 ++#define IFA_F_STABLE_PRIVACY 0x800 ++ ++struct ifa_cacheinfo { ++ __u32 ifa_prefered; ++ __u32 ifa_valid; ++ __u32 cstamp; /* created timestamp, hundredths of seconds */ ++ __u32 tstamp; /* updated timestamp, hundredths of seconds */ ++}; ++ ++/* backwards compatibility for userspace */ ++#define IFA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) ++#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) ++ ++#endif +diff --git a/include/uapi/linux/if_addrlabel.h b/include/uapi/linux/if_addrlabel.h +new file mode 100644 +index 0000000..54580c2 +--- /dev/null ++++ b/include/uapi/linux/if_addrlabel.h +@@ -0,0 +1,32 @@ ++/* ++ * if_addrlabel.h - netlink interface for address labels ++ * ++ * Copyright (C)2007 USAGI/WIDE Project, All Rights Reserved. ++ * ++ * Authors: ++ * YOSHIFUJI Hideaki @ USAGI/WIDE ++ */ ++ ++#ifndef __LINUX_IF_ADDRLABEL_H ++#define __LINUX_IF_ADDRLABEL_H ++ ++#include ++ ++struct ifaddrlblmsg { ++ __u8 ifal_family; /* Address family */ ++ __u8 __ifal_reserved; /* Reserved */ ++ __u8 ifal_prefixlen; /* Prefix length */ ++ __u8 ifal_flags; /* Flags */ ++ __u32 ifal_index; /* Link index */ ++ __u32 ifal_seq; /* sequence number */ ++}; ++ ++enum { ++ IFAL_ADDRESS = 1, ++ IFAL_LABEL = 2, ++ __IFAL_MAX ++}; ++ ++#define IFAL_MAX (__IFAL_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/if_alg.h b/include/uapi/linux/if_alg.h +new file mode 100644 +index 0000000..f2acd2f +--- /dev/null ++++ b/include/uapi/linux/if_alg.h +@@ -0,0 +1,42 @@ ++/* ++ * if_alg: User-space algorithm interface ++ * ++ * Copyright (c) 2010 Herbert Xu ++ * ++ * This program is free software; you can redistribute 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. ++ * ++ */ ++ ++#ifndef _LINUX_IF_ALG_H ++#define _LINUX_IF_ALG_H ++ ++#include ++ ++struct sockaddr_alg { ++ __u16 salg_family; ++ __u8 salg_type[14]; ++ __u32 salg_feat; ++ __u32 salg_mask; ++ __u8 salg_name[64]; ++}; ++ ++struct af_alg_iv { ++ __u32 ivlen; ++ __u8 iv[0]; ++}; ++ ++/* Socket options */ ++#define ALG_SET_KEY 1 ++#define ALG_SET_IV 2 ++#define ALG_SET_OP 3 ++#define ALG_SET_AEAD_ASSOCLEN 4 ++#define ALG_SET_AEAD_AUTHSIZE 5 ++ ++/* Operations */ ++#define ALG_OP_DECRYPT 0 ++#define ALG_OP_ENCRYPT 1 ++ ++#endif /* _LINUX_IF_ALG_H */ +diff --git a/include/uapi/linux/if_arp.h b/include/uapi/linux/if_arp.h +new file mode 100644 +index 0000000..199f253 +--- /dev/null ++++ b/include/uapi/linux/if_arp.h +@@ -0,0 +1,163 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Global definitions for the ARP (RFC 826) protocol. ++ * ++ * Version: @(#)if_arp.h 1.0.1 04/16/93 ++ * ++ * Authors: Original taken from Berkeley UNIX 4.3, (c) UCB 1986-1988 ++ * Portions taken from the KA9Q/NOS (v2.00m PA0GRI) source. ++ * Ross Biro ++ * Fred N. van Kempen, ++ * Florian La Roche, ++ * Jonathan Layes ++ * Arnaldo Carvalho de Melo ARPHRD_HWX25 ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++#ifndef _LINUX_IF_ARP_H ++#define _LINUX_IF_ARP_H ++ ++#include ++ ++/* ARP protocol HARDWARE identifiers. */ ++#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */ ++#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ ++#define ARPHRD_EETHER 2 /* Experimental Ethernet */ ++#define ARPHRD_AX25 3 /* AX.25 Level 2 */ ++#define ARPHRD_PRONET 4 /* PROnet token ring */ ++#define ARPHRD_CHAOS 5 /* Chaosnet */ ++#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */ ++#define ARPHRD_ARCNET 7 /* ARCnet */ ++#define ARPHRD_APPLETLK 8 /* APPLEtalk */ ++#define ARPHRD_DLCI 15 /* Frame Relay DLCI */ ++#define ARPHRD_ATM 19 /* ATM */ ++#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id) */ ++#define ARPHRD_IEEE1394 24 /* IEEE 1394 IPv4 - RFC 2734 */ ++#define ARPHRD_EUI64 27 /* EUI-64 */ ++#define ARPHRD_INFINIBAND 32 /* InfiniBand */ ++ ++/* Dummy types for non ARP hardware */ ++#define ARPHRD_SLIP 256 ++#define ARPHRD_CSLIP 257 ++#define ARPHRD_SLIP6 258 ++#define ARPHRD_CSLIP6 259 ++#define ARPHRD_RSRVD 260 /* Notional KISS type */ ++#define ARPHRD_ADAPT 264 ++#define ARPHRD_ROSE 270 ++#define ARPHRD_X25 271 /* CCITT X.25 */ ++#define ARPHRD_HWX25 272 /* Boards with X.25 in firmware */ ++#define ARPHRD_CAN 280 /* Controller Area Network */ ++#define ARPHRD_PPP 512 ++#define ARPHRD_CISCO 513 /* Cisco HDLC */ ++#define ARPHRD_HDLC ARPHRD_CISCO ++#define ARPHRD_LAPB 516 /* LAPB */ ++#define ARPHRD_DDCMP 517 /* Digital's DDCMP protocol */ ++#define ARPHRD_RAWHDLC 518 /* Raw HDLC */ ++#define ARPHRD_RAWIP 519 /* Raw IP */ ++ ++#define ARPHRD_TUNNEL 768 /* IPIP tunnel */ ++#define ARPHRD_TUNNEL6 769 /* IP6IP6 tunnel */ ++#define ARPHRD_FRAD 770 /* Frame Relay Access Device */ ++#define ARPHRD_SKIP 771 /* SKIP vif */ ++#define ARPHRD_LOOPBACK 772 /* Loopback device */ ++#define ARPHRD_LOCALTLK 773 /* Localtalk device */ ++#define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface */ ++#define ARPHRD_BIF 775 /* AP1000 BIF */ ++#define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4 */ ++#define ARPHRD_IPDDP 777 /* IP over DDP tunneller */ ++#define ARPHRD_IPGRE 778 /* GRE over IP */ ++#define ARPHRD_PIMREG 779 /* PIMSM register interface */ ++#define ARPHRD_HIPPI 780 /* High Performance Parallel Interface */ ++#define ARPHRD_ASH 781 /* Nexus 64Mbps Ash */ ++#define ARPHRD_ECONET 782 /* Acorn Econet */ ++#define ARPHRD_IRDA 783 /* Linux-IrDA */ ++/* ARP works differently on different FC media .. so */ ++#define ARPHRD_FCPP 784 /* Point to point fibrechannel */ ++#define ARPHRD_FCAL 785 /* Fibrechannel arbitrated loop */ ++#define ARPHRD_FCPL 786 /* Fibrechannel public loop */ ++#define ARPHRD_FCFABRIC 787 /* Fibrechannel fabric */ ++ /* 787->799 reserved for fibrechannel media types */ ++#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */ ++#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */ ++#define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */ ++#define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */ ++#define ARPHRD_IEEE802154 804 ++#define ARPHRD_IEEE802154_MONITOR 805 /* IEEE 802.15.4 network monitor */ ++ ++#define ARPHRD_PHONET 820 /* PhoNet media type */ ++#define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ ++#define ARPHRD_CAIF 822 /* CAIF media type */ ++#define ARPHRD_IP6GRE 823 /* GRE over IPv6 */ ++#define ARPHRD_NETLINK 824 /* Netlink header */ ++#define ARPHRD_6LOWPAN 825 /* IPv6 over LoWPAN */ ++#define ARPHRD_VSOCKMON 826 /* Vsock monitor header */ ++ ++#define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ ++#define ARPHRD_NONE 0xFFFE /* zero header length */ ++ ++/* ARP protocol opcodes. */ ++#define ARPOP_REQUEST 1 /* ARP request */ ++#define ARPOP_REPLY 2 /* ARP reply */ ++#define ARPOP_RREQUEST 3 /* RARP request */ ++#define ARPOP_RREPLY 4 /* RARP reply */ ++#define ARPOP_InREQUEST 8 /* InARP request */ ++#define ARPOP_InREPLY 9 /* InARP reply */ ++#define ARPOP_NAK 10 /* (ATM)ARP NAK */ ++ ++ ++/* ARP ioctl request. */ ++struct arpreq { ++ struct sockaddr arp_pa; /* protocol address */ ++ struct sockaddr arp_ha; /* hardware address */ ++ int arp_flags; /* flags */ ++ struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ ++ char arp_dev[16]; ++}; ++ ++struct arpreq_old { ++ struct sockaddr arp_pa; /* protocol address */ ++ struct sockaddr arp_ha; /* hardware address */ ++ int arp_flags; /* flags */ ++ struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ ++}; ++ ++/* ARP Flag values. */ ++#define ATF_COM 0x02 /* completed entry (ha valid) */ ++#define ATF_PERM 0x04 /* permanent entry */ ++#define ATF_PUBL 0x08 /* publish entry */ ++#define ATF_USETRAILERS 0x10 /* has requested trailers */ ++#define ATF_NETMASK 0x20 /* want to use a netmask (only ++ for proxy entries) */ ++#define ATF_DONTPUB 0x40 /* don't answer this addresses */ ++ ++/* ++ * This structure defines an ethernet arp header. ++ */ ++ ++struct arphdr { ++ __be16 ar_hrd; /* format of hardware address */ ++ __be16 ar_pro; /* format of protocol address */ ++ unsigned char ar_hln; /* length of hardware address */ ++ unsigned char ar_pln; /* length of protocol address */ ++ __be16 ar_op; /* ARP opcode (command) */ ++ ++#if 0 ++ /* ++ * Ethernet looks like this : This bit is variable sized however... ++ */ ++ unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ ++ unsigned char ar_sip[4]; /* sender IP address */ ++ unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ ++ unsigned char ar_tip[4]; /* target IP address */ ++#endif ++ ++}; ++ ++ ++#endif /* _LINUX_IF_ARP_H */ +diff --git a/include/uapi/linux/if_bonding.h b/include/uapi/linux/if_bonding.h +new file mode 100644 +index 0000000..9635a62 +--- /dev/null ++++ b/include/uapi/linux/if_bonding.h +@@ -0,0 +1,130 @@ ++/* ++ * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'. ++ * ++ * ++ * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes ++ * NCM: Network and Communications Management, Inc. ++ * ++ * BUT, I'm the one who modified it for ethernet, so: ++ * (c) Copyright 1999, Thomas Davis, tadavis@lbl.gov ++ * ++ * This software may be used and distributed according to the terms ++ * of the GNU Public License, incorporated herein by reference. ++ * ++ * 2003/03/18 - Amir Noam ++ * - Added support for getting slave's speed and duplex via ethtool. ++ * Needed for 802.3ad and other future modes. ++ * ++ * 2003/03/18 - Tsippy Mendelson and ++ * Shmulik Hen ++ * - Enable support of modes that need to use the unique mac address of ++ * each slave. ++ * ++ * 2003/03/18 - Tsippy Mendelson and ++ * Amir Noam ++ * - Moved driver's private data types to bonding.h ++ * ++ * 2003/03/18 - Amir Noam , ++ * Tsippy Mendelson and ++ * Shmulik Hen ++ * - Added support for IEEE 802.3ad Dynamic link aggregation mode. ++ * ++ * 2003/05/01 - Amir Noam ++ * - Added ABI version control to restore compatibility between ++ * new/old ifenslave and new/old bonding. ++ * ++ * 2003/12/01 - Shmulik Hen ++ * - Code cleanup and style changes ++ * ++ * 2005/05/05 - Jason Gabler ++ * - added definitions for various XOR hashing policies ++ */ ++ ++#ifndef _LINUX_IF_BONDING_H ++#define _LINUX_IF_BONDING_H ++ ++#include ++#include ++#include ++ ++/* userland - kernel ABI version (2003/05/08) */ ++#define BOND_ABI_VERSION 2 ++ ++/* ++ * We can remove these ioctl definitions in 2.5. People should use the ++ * SIOC*** versions of them instead ++ */ ++#define BOND_ENSLAVE_OLD (SIOCDEVPRIVATE) ++#define BOND_RELEASE_OLD (SIOCDEVPRIVATE + 1) ++#define BOND_SETHWADDR_OLD (SIOCDEVPRIVATE + 2) ++#define BOND_SLAVE_INFO_QUERY_OLD (SIOCDEVPRIVATE + 11) ++#define BOND_INFO_QUERY_OLD (SIOCDEVPRIVATE + 12) ++#define BOND_CHANGE_ACTIVE_OLD (SIOCDEVPRIVATE + 13) ++ ++#define BOND_CHECK_MII_STATUS (SIOCGMIIPHY) ++ ++#define BOND_MODE_ROUNDROBIN 0 ++#define BOND_MODE_ACTIVEBACKUP 1 ++#define BOND_MODE_XOR 2 ++#define BOND_MODE_BROADCAST 3 ++#define BOND_MODE_8023AD 4 ++#define BOND_MODE_TLB 5 ++#define BOND_MODE_ALB 6 /* TLB + RLB (receive load balancing) */ ++ ++/* each slave's link has 4 states */ ++#define BOND_LINK_UP 0 /* link is up and running */ ++#define BOND_LINK_FAIL 1 /* link has just gone down */ ++#define BOND_LINK_DOWN 2 /* link has been down for too long time */ ++#define BOND_LINK_BACK 3 /* link is going back */ ++ ++/* each slave has several states */ ++#define BOND_STATE_ACTIVE 0 /* link is active */ ++#define BOND_STATE_BACKUP 1 /* link is backup */ ++ ++#define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */ ++ ++#define BOND_DEFAULT_TX_QUEUES 16 /* Default number of tx queues per device */ ++ ++#define BOND_DEFAULT_RESEND_IGMP 1 /* Default number of IGMP membership reports */ ++ ++/* hashing types */ ++#define BOND_XMIT_POLICY_LAYER2 0 /* layer 2 (MAC only), default */ ++#define BOND_XMIT_POLICY_LAYER34 1 /* layer 3+4 (IP ^ (TCP || UDP)) */ ++#define BOND_XMIT_POLICY_LAYER23 2 /* layer 2+3 (IP ^ MAC) */ ++#define BOND_XMIT_POLICY_ENCAP23 3 /* encapsulated layer 2+3 */ ++#define BOND_XMIT_POLICY_ENCAP34 4 /* encapsulated layer 3+4 */ ++ ++typedef struct ifbond { ++ __s32 bond_mode; ++ __s32 num_slaves; ++ __s32 miimon; ++} ifbond; ++ ++typedef struct ifslave { ++ __s32 slave_id; /* Used as an IN param to the BOND_SLAVE_INFO_QUERY ioctl */ ++ char slave_name[IFNAMSIZ]; ++ __s8 link; ++ __s8 state; ++ __u32 link_failure_count; ++} ifslave; ++ ++struct ad_info { ++ __u16 aggregator_id; ++ __u16 ports; ++ __u16 actor_key; ++ __u16 partner_key; ++ __u8 partner_system[ETH_ALEN]; ++}; ++ ++#endif /* _LINUX_IF_BONDING_H */ ++ ++/* ++ * Local variables: ++ * version-control: t ++ * kept-new-versions: 5 ++ * c-indent-level: 8 ++ * c-basic-offset: 8 ++ * tab-width: 8 ++ * End: ++ */ ++ +diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h +new file mode 100644 +index 0000000..156f443 +--- /dev/null ++++ b/include/uapi/linux/if_bridge.h +@@ -0,0 +1,294 @@ ++/* ++ * Linux ethernet bridge ++ * ++ * Authors: ++ * Lennert Buytenhek ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_IF_BRIDGE_H ++#define _LINUX_IF_BRIDGE_H ++ ++#include ++#include ++#include ++ ++#define SYSFS_BRIDGE_ATTR "bridge" ++#define SYSFS_BRIDGE_FDB "brforward" ++#define SYSFS_BRIDGE_PORT_SUBDIR "brif" ++#define SYSFS_BRIDGE_PORT_ATTR "brport" ++#define SYSFS_BRIDGE_PORT_LINK "bridge" ++ ++#define BRCTL_VERSION 1 ++ ++#define BRCTL_GET_VERSION 0 ++#define BRCTL_GET_BRIDGES 1 ++#define BRCTL_ADD_BRIDGE 2 ++#define BRCTL_DEL_BRIDGE 3 ++#define BRCTL_ADD_IF 4 ++#define BRCTL_DEL_IF 5 ++#define BRCTL_GET_BRIDGE_INFO 6 ++#define BRCTL_GET_PORT_LIST 7 ++#define BRCTL_SET_BRIDGE_FORWARD_DELAY 8 ++#define BRCTL_SET_BRIDGE_HELLO_TIME 9 ++#define BRCTL_SET_BRIDGE_MAX_AGE 10 ++#define BRCTL_SET_AGEING_TIME 11 ++#define BRCTL_SET_GC_INTERVAL 12 ++#define BRCTL_GET_PORT_INFO 13 ++#define BRCTL_SET_BRIDGE_STP_STATE 14 ++#define BRCTL_SET_BRIDGE_PRIORITY 15 ++#define BRCTL_SET_PORT_PRIORITY 16 ++#define BRCTL_SET_PATH_COST 17 ++#define BRCTL_GET_FDB_ENTRIES 18 ++ ++#define BR_STATE_DISABLED 0 ++#define BR_STATE_LISTENING 1 ++#define BR_STATE_LEARNING 2 ++#define BR_STATE_FORWARDING 3 ++#define BR_STATE_BLOCKING 4 ++ ++struct __bridge_info { ++ __u64 designated_root; ++ __u64 bridge_id; ++ __u32 root_path_cost; ++ __u32 max_age; ++ __u32 hello_time; ++ __u32 forward_delay; ++ __u32 bridge_max_age; ++ __u32 bridge_hello_time; ++ __u32 bridge_forward_delay; ++ __u8 topology_change; ++ __u8 topology_change_detected; ++ __u8 root_port; ++ __u8 stp_enabled; ++ __u32 ageing_time; ++ __u32 gc_interval; ++ __u32 hello_timer_value; ++ __u32 tcn_timer_value; ++ __u32 topology_change_timer_value; ++ __u32 gc_timer_value; ++}; ++ ++struct __port_info { ++ __u64 designated_root; ++ __u64 designated_bridge; ++ __u16 port_id; ++ __u16 designated_port; ++ __u32 path_cost; ++ __u32 designated_cost; ++ __u8 state; ++ __u8 top_change_ack; ++ __u8 config_pending; ++ __u8 unused0; ++ __u32 message_age_timer_value; ++ __u32 forward_delay_timer_value; ++ __u32 hold_timer_value; ++}; ++ ++struct __fdb_entry { ++ __u8 mac_addr[ETH_ALEN]; ++ __u8 port_no; ++ __u8 is_local; ++ __u32 ageing_timer_value; ++ __u8 port_hi; ++ __u8 pad0; ++ __u16 unused; ++}; ++ ++/* Bridge Flags */ ++#define BRIDGE_FLAGS_MASTER 1 /* Bridge command to/from master */ ++#define BRIDGE_FLAGS_SELF 2 /* Bridge command to/from lowerdev */ ++ ++#define BRIDGE_MODE_VEB 0 /* Default loopback mode */ ++#define BRIDGE_MODE_VEPA 1 /* 802.1Qbg defined VEPA mode */ ++#define BRIDGE_MODE_UNDEF 0xFFFF /* mode undefined */ ++ ++/* Bridge management nested attributes ++ * [IFLA_AF_SPEC] = { ++ * [IFLA_BRIDGE_FLAGS] ++ * [IFLA_BRIDGE_MODE] ++ * [IFLA_BRIDGE_VLAN_INFO] ++ * } ++ */ ++enum { ++ IFLA_BRIDGE_FLAGS, ++ IFLA_BRIDGE_MODE, ++ IFLA_BRIDGE_VLAN_INFO, ++ IFLA_BRIDGE_VLAN_TUNNEL_INFO, ++ __IFLA_BRIDGE_MAX, ++}; ++#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1) ++ ++#define BRIDGE_VLAN_INFO_MASTER (1<<0) /* Operate on Bridge device as well */ ++#define BRIDGE_VLAN_INFO_PVID (1<<1) /* VLAN is PVID, ingress untagged */ ++#define BRIDGE_VLAN_INFO_UNTAGGED (1<<2) /* VLAN egresses untagged */ ++#define BRIDGE_VLAN_INFO_RANGE_BEGIN (1<<3) /* VLAN is start of vlan range */ ++#define BRIDGE_VLAN_INFO_RANGE_END (1<<4) /* VLAN is end of vlan range */ ++#define BRIDGE_VLAN_INFO_BRENTRY (1<<5) /* Global bridge VLAN entry */ ++ ++struct bridge_vlan_info { ++ __u16 flags; ++ __u16 vid; ++}; ++ ++enum { ++ IFLA_BRIDGE_VLAN_TUNNEL_UNSPEC, ++ IFLA_BRIDGE_VLAN_TUNNEL_ID, ++ IFLA_BRIDGE_VLAN_TUNNEL_VID, ++ IFLA_BRIDGE_VLAN_TUNNEL_FLAGS, ++ __IFLA_BRIDGE_VLAN_TUNNEL_MAX, ++}; ++ ++#define IFLA_BRIDGE_VLAN_TUNNEL_MAX (__IFLA_BRIDGE_VLAN_TUNNEL_MAX - 1) ++ ++struct bridge_vlan_xstats { ++ __u64 rx_bytes; ++ __u64 rx_packets; ++ __u64 tx_bytes; ++ __u64 tx_packets; ++ __u16 vid; ++ __u16 flags; ++ __u32 pad2; ++}; ++ ++/* Bridge multicast database attributes ++ * [MDBA_MDB] = { ++ * [MDBA_MDB_ENTRY] = { ++ * [MDBA_MDB_ENTRY_INFO] { ++ * struct br_mdb_entry ++ * [MDBA_MDB_EATTR attributes] ++ * } ++ * } ++ * } ++ * [MDBA_ROUTER] = { ++ * [MDBA_ROUTER_PORT] = { ++ * u32 ifindex ++ * [MDBA_ROUTER_PATTR attributes] ++ * } ++ * } ++ */ ++enum { ++ MDBA_UNSPEC, ++ MDBA_MDB, ++ MDBA_ROUTER, ++ __MDBA_MAX, ++}; ++#define MDBA_MAX (__MDBA_MAX - 1) ++ ++enum { ++ MDBA_MDB_UNSPEC, ++ MDBA_MDB_ENTRY, ++ __MDBA_MDB_MAX, ++}; ++#define MDBA_MDB_MAX (__MDBA_MDB_MAX - 1) ++ ++enum { ++ MDBA_MDB_ENTRY_UNSPEC, ++ MDBA_MDB_ENTRY_INFO, ++ __MDBA_MDB_ENTRY_MAX, ++}; ++#define MDBA_MDB_ENTRY_MAX (__MDBA_MDB_ENTRY_MAX - 1) ++ ++/* per mdb entry additional attributes */ ++enum { ++ MDBA_MDB_EATTR_UNSPEC, ++ MDBA_MDB_EATTR_TIMER, ++ __MDBA_MDB_EATTR_MAX ++}; ++#define MDBA_MDB_EATTR_MAX (__MDBA_MDB_EATTR_MAX - 1) ++ ++/* multicast router types */ ++enum { ++ MDB_RTR_TYPE_DISABLED, ++ MDB_RTR_TYPE_TEMP_QUERY, ++ MDB_RTR_TYPE_PERM, ++ MDB_RTR_TYPE_TEMP ++}; ++ ++enum { ++ MDBA_ROUTER_UNSPEC, ++ MDBA_ROUTER_PORT, ++ __MDBA_ROUTER_MAX, ++}; ++#define MDBA_ROUTER_MAX (__MDBA_ROUTER_MAX - 1) ++ ++/* router port attributes */ ++enum { ++ MDBA_ROUTER_PATTR_UNSPEC, ++ MDBA_ROUTER_PATTR_TIMER, ++ MDBA_ROUTER_PATTR_TYPE, ++ __MDBA_ROUTER_PATTR_MAX ++}; ++#define MDBA_ROUTER_PATTR_MAX (__MDBA_ROUTER_PATTR_MAX - 1) ++ ++struct br_port_msg { ++ __u8 family; ++ __u32 ifindex; ++}; ++ ++struct br_mdb_entry { ++ __u32 ifindex; ++#define MDB_TEMPORARY 0 ++#define MDB_PERMANENT 1 ++ __u8 state; ++#define MDB_FLAGS_OFFLOAD (1 << 0) ++ __u8 flags; ++ __u16 vid; ++ struct { ++ union { ++ __be32 ip4; ++ struct in6_addr ip6; ++ } u; ++ __be16 proto; ++ } addr; ++}; ++ ++enum { ++ MDBA_SET_ENTRY_UNSPEC, ++ MDBA_SET_ENTRY, ++ __MDBA_SET_ENTRY_MAX, ++}; ++#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1) ++ ++/* Embedded inside LINK_XSTATS_TYPE_BRIDGE */ ++enum { ++ BRIDGE_XSTATS_UNSPEC, ++ BRIDGE_XSTATS_VLAN, ++ BRIDGE_XSTATS_MCAST, ++ BRIDGE_XSTATS_PAD, ++ __BRIDGE_XSTATS_MAX ++}; ++#define BRIDGE_XSTATS_MAX (__BRIDGE_XSTATS_MAX - 1) ++ ++enum { ++ BR_MCAST_DIR_RX, ++ BR_MCAST_DIR_TX, ++ BR_MCAST_DIR_SIZE ++}; ++ ++/* IGMP/MLD statistics */ ++struct br_mcast_stats { ++ __u64 igmp_v1queries[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_v2queries[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_v3queries[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_leaves[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_v1reports[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_v2reports[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_v3reports[BR_MCAST_DIR_SIZE]; ++ __u64 igmp_parse_errors; ++ ++ __u64 mld_v1queries[BR_MCAST_DIR_SIZE]; ++ __u64 mld_v2queries[BR_MCAST_DIR_SIZE]; ++ __u64 mld_leaves[BR_MCAST_DIR_SIZE]; ++ __u64 mld_v1reports[BR_MCAST_DIR_SIZE]; ++ __u64 mld_v2reports[BR_MCAST_DIR_SIZE]; ++ __u64 mld_parse_errors; ++ ++ __u64 mcast_bytes[BR_MCAST_DIR_SIZE]; ++ __u64 mcast_packets[BR_MCAST_DIR_SIZE]; ++}; ++#endif /* _LINUX_IF_BRIDGE_H */ +diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h +new file mode 100644 +index 0000000..7dde037 +--- /dev/null ++++ b/include/uapi/linux/if_ether.h +@@ -0,0 +1,158 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Global definitions for the Ethernet IEEE 802.3 interface. ++ * ++ * Version: @(#)if_ether.h 1.0.1a 02/08/94 ++ * ++ * Author: Fred N. van Kempen, ++ * Donald Becker, ++ * Alan Cox, ++ * Steve Whitehouse, ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_IF_ETHER_H ++#define _LINUX_IF_ETHER_H ++ ++#include ++ ++/* ++ * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble ++ * and FCS/CRC (frame check sequence). ++ */ ++ ++#define ETH_ALEN 6 /* Octets in one ethernet addr */ ++#define ETH_HLEN 14 /* Total octets in header. */ ++#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ ++#define ETH_DATA_LEN 1500 /* Max. octets in payload */ ++#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */ ++#define ETH_FCS_LEN 4 /* Octets in the FCS */ ++ ++#define ETH_MIN_MTU 68 /* Min IPv4 MTU per RFC791 */ ++#define ETH_MAX_MTU 0xFFFFU /* 65535, same as IP_MAX_MTU */ ++ ++/* ++ * These are the defined Ethernet Protocol ID's. ++ */ ++ ++#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */ ++#define ETH_P_PUP 0x0200 /* Xerox PUP packet */ ++#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ ++#define ETH_P_TSN 0x22F0 /* TSN (IEEE 1722) packet */ ++#define ETH_P_IP 0x0800 /* Internet Protocol packet */ ++#define ETH_P_X25 0x0805 /* CCITT X.25 */ ++#define ETH_P_ARP 0x0806 /* Address Resolution packet */ ++#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */ ++#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */ ++#define ETH_P_BATMAN 0x4305 /* B.A.T.M.A.N.-Advanced packet [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_DEC 0x6000 /* DEC Assigned proto */ ++#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */ ++#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */ ++#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */ ++#define ETH_P_LAT 0x6004 /* DEC LAT */ ++#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */ ++#define ETH_P_CUST 0x6006 /* DEC Customer use */ ++#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */ ++#define ETH_P_TEB 0x6558 /* Trans Ether Bridging */ ++#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */ ++#define ETH_P_ATALK 0x809B /* Appletalk DDP */ ++#define ETH_P_AARP 0x80F3 /* Appletalk AARP */ ++#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ ++#define ETH_P_ERSPAN 0x88BE /* ERSPAN type II */ ++#define ETH_P_IPX 0x8137 /* IPX over DIX */ ++#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ ++#define ETH_P_PAUSE 0x8808 /* IEEE Pause frames. See 802.3 31B */ ++#define ETH_P_SLOW 0x8809 /* Slow Protocol. See 802.3ad 43B */ ++#define ETH_P_WCCP 0x883E /* Web-cache coordination protocol ++ * defined in draft-wilson-wrec-wccp-v2-00.txt */ ++#define ETH_P_MPLS_UC 0x8847 /* MPLS Unicast traffic */ ++#define ETH_P_MPLS_MC 0x8848 /* MPLS Multicast traffic */ ++#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */ ++#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ ++#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ ++#define ETH_P_LINK_CTL 0x886c /* HPNA, wlan link local tunnel */ ++#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport ++ * over Ethernet ++ */ ++#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ ++#define ETH_P_AOE 0x88A2 /* ATA over Ethernet */ ++#define ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */ ++#define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */ ++#define ETH_P_TIPC 0x88CA /* TIPC */ ++#define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */ ++#define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */ ++#define ETH_P_MVRP 0x88F5 /* 802.1Q MVRP */ ++#define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */ ++#define ETH_P_NCSI 0x88F8 /* NCSI protocol */ ++#define ETH_P_PRP 0x88FB /* IEC 62439-3 PRP/HSRv0 */ ++#define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */ ++#define ETH_P_IBOE 0x8915 /* Infiniband over Ethernet */ ++#define ETH_P_TDLS 0x890D /* TDLS */ ++#define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */ ++#define ETH_P_80221 0x8917 /* IEEE 802.21 Media Independent Handover Protocol */ ++#define ETH_P_HSR 0x892F /* IEC 62439-3 HSRv1 */ ++#define ETH_P_NSH 0x894F /* Network Service Header */ ++#define ETH_P_LOOPBACK 0x9000 /* Ethernet loopback packet, per IEEE 802.3 */ ++#define ETH_P_QINQ1 0x9100 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_QINQ2 0x9200 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_QINQ3 0x9300 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */ ++#define ETH_P_IFE 0xED3E /* ForCES inter-FE LFB type */ ++#define ETH_P_AF_IUCV 0xFBFB /* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */ ++ ++#define ETH_P_802_3_MIN 0x0600 /* If the value in the ethernet type is less than this value ++ * then the frame is Ethernet II. Else it is 802.3 */ ++ ++/* ++ * Non DIX types. Won't clash for 1500 types. ++ */ ++ ++#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */ ++#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */ ++#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */ ++#define ETH_P_802_2 0x0004 /* 802.2 frames */ ++#define ETH_P_SNAP 0x0005 /* Internal only */ ++#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */ ++#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ ++#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ ++#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ ++#define ETH_P_CAN 0x000C /* CAN: Controller Area Network */ ++#define ETH_P_CANFD 0x000D /* CANFD: CAN flexible data rate*/ ++#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ ++#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ ++#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ ++#define ETH_P_CONTROL 0x0016 /* Card specific control frames */ ++#define ETH_P_IRDA 0x0017 /* Linux-IrDA */ ++#define ETH_P_ECONET 0x0018 /* Acorn Econet */ ++#define ETH_P_HDLC 0x0019 /* HDLC frames */ ++#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */ ++#define ETH_P_DSA 0x001B /* Distributed Switch Arch. */ ++#define ETH_P_TRAILER 0x001C /* Trailer switch tagging */ ++#define ETH_P_PHONET 0x00F5 /* Nokia Phonet frames */ ++#define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frame */ ++#define ETH_P_CAIF 0x00F7 /* ST-Ericsson CAIF protocol */ ++#define ETH_P_XDSA 0x00F8 /* Multiplexed DSA protocol */ ++#define ETH_P_MAP 0x00F9 /* Qualcomm multiplexing and ++ * aggregation protocol ++ */ ++ ++/* ++ * This is an Ethernet frame header. ++ */ ++ ++struct ethhdr { ++ unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ ++ unsigned char h_source[ETH_ALEN]; /* source ether addr */ ++ __be16 h_proto; /* packet type ID field */ ++} __attribute__((packed)); ++ ++ ++#endif /* _LINUX_IF_ETHER_H */ +diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h +new file mode 100644 +index 0000000..1f97d05 +--- /dev/null ++++ b/include/uapi/linux/if_link.h +@@ -0,0 +1,928 @@ ++#ifndef _LINUX_IF_LINK_H ++#define _LINUX_IF_LINK_H ++ ++#include ++#include ++ ++/* This struct should be in sync with struct rtnl_link_stats64 */ ++struct rtnl_link_stats { ++ __u32 rx_packets; /* total packets received */ ++ __u32 tx_packets; /* total packets transmitted */ ++ __u32 rx_bytes; /* total bytes received */ ++ __u32 tx_bytes; /* total bytes transmitted */ ++ __u32 rx_errors; /* bad packets received */ ++ __u32 tx_errors; /* packet transmit problems */ ++ __u32 rx_dropped; /* no space in linux buffers */ ++ __u32 tx_dropped; /* no space available in linux */ ++ __u32 multicast; /* multicast packets received */ ++ __u32 collisions; ++ ++ /* detailed rx_errors: */ ++ __u32 rx_length_errors; ++ __u32 rx_over_errors; /* receiver ring buff overflow */ ++ __u32 rx_crc_errors; /* recved pkt with crc error */ ++ __u32 rx_frame_errors; /* recv'd frame alignment error */ ++ __u32 rx_fifo_errors; /* recv'r fifo overrun */ ++ __u32 rx_missed_errors; /* receiver missed packet */ ++ ++ /* detailed tx_errors */ ++ __u32 tx_aborted_errors; ++ __u32 tx_carrier_errors; ++ __u32 tx_fifo_errors; ++ __u32 tx_heartbeat_errors; ++ __u32 tx_window_errors; ++ ++ /* for cslip etc */ ++ __u32 rx_compressed; ++ __u32 tx_compressed; ++ ++ __u32 rx_nohandler; /* dropped, no handler found */ ++}; ++ ++/* The main device statistics structure */ ++struct rtnl_link_stats64 { ++ __u64 rx_packets; /* total packets received */ ++ __u64 tx_packets; /* total packets transmitted */ ++ __u64 rx_bytes; /* total bytes received */ ++ __u64 tx_bytes; /* total bytes transmitted */ ++ __u64 rx_errors; /* bad packets received */ ++ __u64 tx_errors; /* packet transmit problems */ ++ __u64 rx_dropped; /* no space in linux buffers */ ++ __u64 tx_dropped; /* no space available in linux */ ++ __u64 multicast; /* multicast packets received */ ++ __u64 collisions; ++ ++ /* detailed rx_errors: */ ++ __u64 rx_length_errors; ++ __u64 rx_over_errors; /* receiver ring buff overflow */ ++ __u64 rx_crc_errors; /* recved pkt with crc error */ ++ __u64 rx_frame_errors; /* recv'd frame alignment error */ ++ __u64 rx_fifo_errors; /* recv'r fifo overrun */ ++ __u64 rx_missed_errors; /* receiver missed packet */ ++ ++ /* detailed tx_errors */ ++ __u64 tx_aborted_errors; ++ __u64 tx_carrier_errors; ++ __u64 tx_fifo_errors; ++ __u64 tx_heartbeat_errors; ++ __u64 tx_window_errors; ++ ++ /* for cslip etc */ ++ __u64 rx_compressed; ++ __u64 tx_compressed; ++ ++ __u64 rx_nohandler; /* dropped, no handler found */ ++}; ++ ++/* The struct should be in sync with struct ifmap */ ++struct rtnl_link_ifmap { ++ __u64 mem_start; ++ __u64 mem_end; ++ __u64 base_addr; ++ __u16 irq; ++ __u8 dma; ++ __u8 port; ++}; ++ ++/* ++ * IFLA_AF_SPEC ++ * Contains nested attributes for address family specific attributes. ++ * Each address family may create a attribute with the address family ++ * number as type and create its own attribute structure in it. ++ * ++ * Example: ++ * [IFLA_AF_SPEC] = { ++ * [AF_INET] = { ++ * [IFLA_INET_CONF] = ..., ++ * }, ++ * [AF_INET6] = { ++ * [IFLA_INET6_FLAGS] = ..., ++ * [IFLA_INET6_CONF] = ..., ++ * } ++ * } ++ */ ++ ++enum { ++ IFLA_UNSPEC, ++ IFLA_ADDRESS, ++ IFLA_BROADCAST, ++ IFLA_IFNAME, ++ IFLA_MTU, ++ IFLA_LINK, ++ IFLA_QDISC, ++ IFLA_STATS, ++ IFLA_COST, ++#define IFLA_COST IFLA_COST ++ IFLA_PRIORITY, ++#define IFLA_PRIORITY IFLA_PRIORITY ++ IFLA_MASTER, ++#define IFLA_MASTER IFLA_MASTER ++ IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ ++#define IFLA_WIRELESS IFLA_WIRELESS ++ IFLA_PROTINFO, /* Protocol specific information for a link */ ++#define IFLA_PROTINFO IFLA_PROTINFO ++ IFLA_TXQLEN, ++#define IFLA_TXQLEN IFLA_TXQLEN ++ IFLA_MAP, ++#define IFLA_MAP IFLA_MAP ++ IFLA_WEIGHT, ++#define IFLA_WEIGHT IFLA_WEIGHT ++ IFLA_OPERSTATE, ++ IFLA_LINKMODE, ++ IFLA_LINKINFO, ++#define IFLA_LINKINFO IFLA_LINKINFO ++ IFLA_NET_NS_PID, ++ IFLA_IFALIAS, ++ IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ ++ IFLA_VFINFO_LIST, ++ IFLA_STATS64, ++ IFLA_VF_PORTS, ++ IFLA_PORT_SELF, ++ IFLA_AF_SPEC, ++ IFLA_GROUP, /* Group the device belongs to */ ++ IFLA_NET_NS_FD, ++ IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ ++ IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ ++#define IFLA_PROMISCUITY IFLA_PROMISCUITY ++ IFLA_NUM_TX_QUEUES, ++ IFLA_NUM_RX_QUEUES, ++ IFLA_CARRIER, ++ IFLA_PHYS_PORT_ID, ++ IFLA_CARRIER_CHANGES, ++ IFLA_PHYS_SWITCH_ID, ++ IFLA_LINK_NETNSID, ++ IFLA_PHYS_PORT_NAME, ++ IFLA_PROTO_DOWN, ++ IFLA_GSO_MAX_SEGS, ++ IFLA_GSO_MAX_SIZE, ++ IFLA_PAD, ++ IFLA_XDP, ++ IFLA_EVENT, ++ __IFLA_MAX ++}; ++ ++ ++#define IFLA_MAX (__IFLA_MAX - 1) ++ ++/* backwards compatibility for userspace */ ++#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) ++#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) ++ ++enum { ++ IFLA_INET_UNSPEC, ++ IFLA_INET_CONF, ++ __IFLA_INET_MAX, ++}; ++ ++#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) ++ ++/* ifi_flags. ++ ++ IFF_* flags. ++ ++ The only change is: ++ IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are ++ more not changeable by user. They describe link media ++ characteristics and set by device driver. ++ ++ Comments: ++ - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid ++ - If neither of these three flags are set; ++ the interface is NBMA. ++ ++ - IFF_MULTICAST does not mean anything special: ++ multicasts can be used on all not-NBMA links. ++ IFF_MULTICAST means that this media uses special encapsulation ++ for multicast frames. Apparently, all IFF_POINTOPOINT and ++ IFF_BROADCAST devices are able to use multicasts too. ++ */ ++ ++/* IFLA_LINK. ++ For usual devices it is equal ifi_index. ++ If it is a "virtual interface" (f.e. tunnel), ifi_link ++ can point to real physical interface (f.e. for bandwidth calculations), ++ or maybe 0, what means, that real media is unknown (usual ++ for IPIP tunnels, when route to endpoint is allowed to change) ++ */ ++ ++/* Subtype attributes for IFLA_PROTINFO */ ++enum { ++ IFLA_INET6_UNSPEC, ++ IFLA_INET6_FLAGS, /* link flags */ ++ IFLA_INET6_CONF, /* sysctl parameters */ ++ IFLA_INET6_STATS, /* statistics */ ++ IFLA_INET6_MCAST, /* MC things. What of them? */ ++ IFLA_INET6_CACHEINFO, /* time values and max reasm size */ ++ IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ ++ IFLA_INET6_TOKEN, /* device token */ ++ IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ ++ __IFLA_INET6_MAX ++}; ++ ++#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) ++ ++enum in6_addr_gen_mode { ++ IN6_ADDR_GEN_MODE_EUI64, ++ IN6_ADDR_GEN_MODE_NONE, ++ IN6_ADDR_GEN_MODE_STABLE_PRIVACY, ++ IN6_ADDR_GEN_MODE_RANDOM, ++}; ++ ++/* Bridge section */ ++ ++enum { ++ IFLA_BR_UNSPEC, ++ IFLA_BR_FORWARD_DELAY, ++ IFLA_BR_HELLO_TIME, ++ IFLA_BR_MAX_AGE, ++ IFLA_BR_AGEING_TIME, ++ IFLA_BR_STP_STATE, ++ IFLA_BR_PRIORITY, ++ IFLA_BR_VLAN_FILTERING, ++ IFLA_BR_VLAN_PROTOCOL, ++ IFLA_BR_GROUP_FWD_MASK, ++ IFLA_BR_ROOT_ID, ++ IFLA_BR_BRIDGE_ID, ++ IFLA_BR_ROOT_PORT, ++ IFLA_BR_ROOT_PATH_COST, ++ IFLA_BR_TOPOLOGY_CHANGE, ++ IFLA_BR_TOPOLOGY_CHANGE_DETECTED, ++ IFLA_BR_HELLO_TIMER, ++ IFLA_BR_TCN_TIMER, ++ IFLA_BR_TOPOLOGY_CHANGE_TIMER, ++ IFLA_BR_GC_TIMER, ++ IFLA_BR_GROUP_ADDR, ++ IFLA_BR_FDB_FLUSH, ++ IFLA_BR_MCAST_ROUTER, ++ IFLA_BR_MCAST_SNOOPING, ++ IFLA_BR_MCAST_QUERY_USE_IFADDR, ++ IFLA_BR_MCAST_QUERIER, ++ IFLA_BR_MCAST_HASH_ELASTICITY, ++ IFLA_BR_MCAST_HASH_MAX, ++ IFLA_BR_MCAST_LAST_MEMBER_CNT, ++ IFLA_BR_MCAST_STARTUP_QUERY_CNT, ++ IFLA_BR_MCAST_LAST_MEMBER_INTVL, ++ IFLA_BR_MCAST_MEMBERSHIP_INTVL, ++ IFLA_BR_MCAST_QUERIER_INTVL, ++ IFLA_BR_MCAST_QUERY_INTVL, ++ IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, ++ IFLA_BR_MCAST_STARTUP_QUERY_INTVL, ++ IFLA_BR_NF_CALL_IPTABLES, ++ IFLA_BR_NF_CALL_IP6TABLES, ++ IFLA_BR_NF_CALL_ARPTABLES, ++ IFLA_BR_VLAN_DEFAULT_PVID, ++ IFLA_BR_PAD, ++ IFLA_BR_VLAN_STATS_ENABLED, ++ IFLA_BR_MCAST_STATS_ENABLED, ++ IFLA_BR_MCAST_IGMP_VERSION, ++ IFLA_BR_MCAST_MLD_VERSION, ++ __IFLA_BR_MAX, ++}; ++ ++#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) ++ ++struct ifla_bridge_id { ++ __u8 prio[2]; ++ __u8 addr[6]; /* ETH_ALEN */ ++}; ++ ++enum { ++ BRIDGE_MODE_UNSPEC, ++ BRIDGE_MODE_HAIRPIN, ++}; ++ ++enum { ++ IFLA_BRPORT_UNSPEC, ++ IFLA_BRPORT_STATE, /* Spanning tree state */ ++ IFLA_BRPORT_PRIORITY, /* " priority */ ++ IFLA_BRPORT_COST, /* " cost */ ++ IFLA_BRPORT_MODE, /* mode (hairpin) */ ++ IFLA_BRPORT_GUARD, /* bpdu guard */ ++ IFLA_BRPORT_PROTECT, /* root port protection */ ++ IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ ++ IFLA_BRPORT_LEARNING, /* mac learning */ ++ IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ ++ IFLA_BRPORT_PROXYARP, /* proxy ARP */ ++ IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ ++ IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ ++ IFLA_BRPORT_ROOT_ID, /* designated root */ ++ IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ ++ IFLA_BRPORT_DESIGNATED_PORT, ++ IFLA_BRPORT_DESIGNATED_COST, ++ IFLA_BRPORT_ID, ++ IFLA_BRPORT_NO, ++ IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, ++ IFLA_BRPORT_CONFIG_PENDING, ++ IFLA_BRPORT_MESSAGE_AGE_TIMER, ++ IFLA_BRPORT_FORWARD_DELAY_TIMER, ++ IFLA_BRPORT_HOLD_TIMER, ++ IFLA_BRPORT_FLUSH, ++ IFLA_BRPORT_MULTICAST_ROUTER, ++ IFLA_BRPORT_PAD, ++ IFLA_BRPORT_MCAST_FLOOD, ++ IFLA_BRPORT_MCAST_TO_UCAST, ++ IFLA_BRPORT_VLAN_TUNNEL, ++ IFLA_BRPORT_BCAST_FLOOD, ++ __IFLA_BRPORT_MAX ++}; ++#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) ++ ++struct ifla_cacheinfo { ++ __u32 max_reasm_len; ++ __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ ++ __u32 reachable_time; ++ __u32 retrans_time; ++}; ++ ++enum { ++ IFLA_INFO_UNSPEC, ++ IFLA_INFO_KIND, ++ IFLA_INFO_DATA, ++ IFLA_INFO_XSTATS, ++ IFLA_INFO_SLAVE_KIND, ++ IFLA_INFO_SLAVE_DATA, ++ __IFLA_INFO_MAX, ++}; ++ ++#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) ++ ++/* VLAN section */ ++ ++enum { ++ IFLA_VLAN_UNSPEC, ++ IFLA_VLAN_ID, ++ IFLA_VLAN_FLAGS, ++ IFLA_VLAN_EGRESS_QOS, ++ IFLA_VLAN_INGRESS_QOS, ++ IFLA_VLAN_PROTOCOL, ++ __IFLA_VLAN_MAX, ++}; ++ ++#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) ++ ++struct ifla_vlan_flags { ++ __u32 flags; ++ __u32 mask; ++}; ++ ++enum { ++ IFLA_VLAN_QOS_UNSPEC, ++ IFLA_VLAN_QOS_MAPPING, ++ __IFLA_VLAN_QOS_MAX ++}; ++ ++#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) ++ ++struct ifla_vlan_qos_mapping { ++ __u32 from; ++ __u32 to; ++}; ++ ++/* MACVLAN section */ ++enum { ++ IFLA_MACVLAN_UNSPEC, ++ IFLA_MACVLAN_MODE, ++ IFLA_MACVLAN_FLAGS, ++ IFLA_MACVLAN_MACADDR_MODE, ++ IFLA_MACVLAN_MACADDR, ++ IFLA_MACVLAN_MACADDR_DATA, ++ IFLA_MACVLAN_MACADDR_COUNT, ++ __IFLA_MACVLAN_MAX, ++}; ++ ++#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) ++ ++enum macvlan_mode { ++ MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ ++ MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ ++ MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ ++ MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ ++ MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ ++}; ++ ++enum macvlan_macaddr_mode { ++ MACVLAN_MACADDR_ADD, ++ MACVLAN_MACADDR_DEL, ++ MACVLAN_MACADDR_FLUSH, ++ MACVLAN_MACADDR_SET, ++}; ++ ++#define MACVLAN_FLAG_NOPROMISC 1 ++ ++/* VRF section */ ++enum { ++ IFLA_VRF_UNSPEC, ++ IFLA_VRF_TABLE, ++ __IFLA_VRF_MAX ++}; ++ ++#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) ++ ++enum { ++ IFLA_VRF_PORT_UNSPEC, ++ IFLA_VRF_PORT_TABLE, ++ __IFLA_VRF_PORT_MAX ++}; ++ ++#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) ++ ++/* MACSEC section */ ++enum { ++ IFLA_MACSEC_UNSPEC, ++ IFLA_MACSEC_SCI, ++ IFLA_MACSEC_PORT, ++ IFLA_MACSEC_ICV_LEN, ++ IFLA_MACSEC_CIPHER_SUITE, ++ IFLA_MACSEC_WINDOW, ++ IFLA_MACSEC_ENCODING_SA, ++ IFLA_MACSEC_ENCRYPT, ++ IFLA_MACSEC_PROTECT, ++ IFLA_MACSEC_INC_SCI, ++ IFLA_MACSEC_ES, ++ IFLA_MACSEC_SCB, ++ IFLA_MACSEC_REPLAY_PROTECT, ++ IFLA_MACSEC_VALIDATION, ++ IFLA_MACSEC_PAD, ++ __IFLA_MACSEC_MAX, ++}; ++ ++#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) ++ ++enum macsec_validation_type { ++ MACSEC_VALIDATE_DISABLED = 0, ++ MACSEC_VALIDATE_CHECK = 1, ++ MACSEC_VALIDATE_STRICT = 2, ++ __MACSEC_VALIDATE_END, ++ MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, ++}; ++ ++/* IPVLAN section */ ++enum { ++ IFLA_IPVLAN_UNSPEC, ++ IFLA_IPVLAN_MODE, ++ __IFLA_IPVLAN_MAX ++}; ++ ++#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) ++ ++enum ipvlan_mode { ++ IPVLAN_MODE_L2 = 0, ++ IPVLAN_MODE_L3, ++ IPVLAN_MODE_L3S, ++ IPVLAN_MODE_MAX ++}; ++ ++/* VXLAN section */ ++enum { ++ IFLA_VXLAN_UNSPEC, ++ IFLA_VXLAN_ID, ++ IFLA_VXLAN_GROUP, /* group or remote address */ ++ IFLA_VXLAN_LINK, ++ IFLA_VXLAN_LOCAL, ++ IFLA_VXLAN_TTL, ++ IFLA_VXLAN_TOS, ++ IFLA_VXLAN_LEARNING, ++ IFLA_VXLAN_AGEING, ++ IFLA_VXLAN_LIMIT, ++ IFLA_VXLAN_PORT_RANGE, /* source port */ ++ IFLA_VXLAN_PROXY, ++ IFLA_VXLAN_RSC, ++ IFLA_VXLAN_L2MISS, ++ IFLA_VXLAN_L3MISS, ++ IFLA_VXLAN_PORT, /* destination port */ ++ IFLA_VXLAN_GROUP6, ++ IFLA_VXLAN_LOCAL6, ++ IFLA_VXLAN_UDP_CSUM, ++ IFLA_VXLAN_UDP_ZERO_CSUM6_TX, ++ IFLA_VXLAN_UDP_ZERO_CSUM6_RX, ++ IFLA_VXLAN_REMCSUM_TX, ++ IFLA_VXLAN_REMCSUM_RX, ++ IFLA_VXLAN_GBP, ++ IFLA_VXLAN_REMCSUM_NOPARTIAL, ++ IFLA_VXLAN_COLLECT_METADATA, ++ IFLA_VXLAN_LABEL, ++ IFLA_VXLAN_GPE, ++ __IFLA_VXLAN_MAX ++}; ++#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) ++ ++struct ifla_vxlan_port_range { ++ __be16 low; ++ __be16 high; ++}; ++ ++/* GENEVE section */ ++enum { ++ IFLA_GENEVE_UNSPEC, ++ IFLA_GENEVE_ID, ++ IFLA_GENEVE_REMOTE, ++ IFLA_GENEVE_TTL, ++ IFLA_GENEVE_TOS, ++ IFLA_GENEVE_PORT, /* destination port */ ++ IFLA_GENEVE_COLLECT_METADATA, ++ IFLA_GENEVE_REMOTE6, ++ IFLA_GENEVE_UDP_CSUM, ++ IFLA_GENEVE_UDP_ZERO_CSUM6_TX, ++ IFLA_GENEVE_UDP_ZERO_CSUM6_RX, ++ IFLA_GENEVE_LABEL, ++ __IFLA_GENEVE_MAX ++}; ++#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) ++ ++/* PPP section */ ++enum { ++ IFLA_PPP_UNSPEC, ++ IFLA_PPP_DEV_FD, ++ __IFLA_PPP_MAX ++}; ++#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) ++ ++/* GTP section */ ++ ++enum ifla_gtp_role { ++ GTP_ROLE_GGSN = 0, ++ GTP_ROLE_SGSN, ++}; ++ ++enum { ++ IFLA_GTP_UNSPEC, ++ IFLA_GTP_FD0, ++ IFLA_GTP_FD1, ++ IFLA_GTP_PDP_HASHSIZE, ++ IFLA_GTP_ROLE, ++ __IFLA_GTP_MAX, ++}; ++#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) ++ ++/* Bonding section */ ++ ++enum { ++ IFLA_BOND_UNSPEC, ++ IFLA_BOND_MODE, ++ IFLA_BOND_ACTIVE_SLAVE, ++ IFLA_BOND_MIIMON, ++ IFLA_BOND_UPDELAY, ++ IFLA_BOND_DOWNDELAY, ++ IFLA_BOND_USE_CARRIER, ++ IFLA_BOND_ARP_INTERVAL, ++ IFLA_BOND_ARP_IP_TARGET, ++ IFLA_BOND_ARP_VALIDATE, ++ IFLA_BOND_ARP_ALL_TARGETS, ++ IFLA_BOND_PRIMARY, ++ IFLA_BOND_PRIMARY_RESELECT, ++ IFLA_BOND_FAIL_OVER_MAC, ++ IFLA_BOND_XMIT_HASH_POLICY, ++ IFLA_BOND_RESEND_IGMP, ++ IFLA_BOND_NUM_PEER_NOTIF, ++ IFLA_BOND_ALL_SLAVES_ACTIVE, ++ IFLA_BOND_MIN_LINKS, ++ IFLA_BOND_LP_INTERVAL, ++ IFLA_BOND_PACKETS_PER_SLAVE, ++ IFLA_BOND_AD_LACP_RATE, ++ IFLA_BOND_AD_SELECT, ++ IFLA_BOND_AD_INFO, ++ IFLA_BOND_AD_ACTOR_SYS_PRIO, ++ IFLA_BOND_AD_USER_PORT_KEY, ++ IFLA_BOND_AD_ACTOR_SYSTEM, ++ IFLA_BOND_TLB_DYNAMIC_LB, ++ __IFLA_BOND_MAX, ++}; ++ ++#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) ++ ++enum { ++ IFLA_BOND_AD_INFO_UNSPEC, ++ IFLA_BOND_AD_INFO_AGGREGATOR, ++ IFLA_BOND_AD_INFO_NUM_PORTS, ++ IFLA_BOND_AD_INFO_ACTOR_KEY, ++ IFLA_BOND_AD_INFO_PARTNER_KEY, ++ IFLA_BOND_AD_INFO_PARTNER_MAC, ++ __IFLA_BOND_AD_INFO_MAX, ++}; ++ ++#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) ++ ++enum { ++ IFLA_BOND_SLAVE_UNSPEC, ++ IFLA_BOND_SLAVE_STATE, ++ IFLA_BOND_SLAVE_MII_STATUS, ++ IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, ++ IFLA_BOND_SLAVE_PERM_HWADDR, ++ IFLA_BOND_SLAVE_QUEUE_ID, ++ IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, ++ IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, ++ IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, ++ __IFLA_BOND_SLAVE_MAX, ++}; ++ ++#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) ++ ++/* SR-IOV virtual function management section */ ++ ++enum { ++ IFLA_VF_INFO_UNSPEC, ++ IFLA_VF_INFO, ++ __IFLA_VF_INFO_MAX, ++}; ++ ++#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) ++ ++enum { ++ IFLA_VF_UNSPEC, ++ IFLA_VF_MAC, /* Hardware queue specific attributes */ ++ IFLA_VF_VLAN, /* VLAN ID and QoS */ ++ IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ ++ IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ ++ IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ ++ IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ ++ IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query ++ * on/off switch ++ */ ++ IFLA_VF_STATS, /* network device statistics */ ++ IFLA_VF_TRUST, /* Trust VF */ ++ IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ ++ IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ ++ IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ ++ __IFLA_VF_MAX, ++}; ++ ++#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) ++ ++struct ifla_vf_mac { ++ __u32 vf; ++ __u8 mac[32]; /* MAX_ADDR_LEN */ ++}; ++ ++struct ifla_vf_vlan { ++ __u32 vf; ++ __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ ++ __u32 qos; ++}; ++ ++enum { ++ IFLA_VF_VLAN_INFO_UNSPEC, ++ IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ ++ __IFLA_VF_VLAN_INFO_MAX, ++}; ++ ++#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) ++#define MAX_VLAN_LIST_LEN 1 ++ ++struct ifla_vf_vlan_info { ++ __u32 vf; ++ __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ ++ __u32 qos; ++ __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ ++}; ++ ++struct ifla_vf_tx_rate { ++ __u32 vf; ++ __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ ++}; ++ ++struct ifla_vf_rate { ++ __u32 vf; ++ __u32 min_tx_rate; /* Min Bandwidth in Mbps */ ++ __u32 max_tx_rate; /* Max Bandwidth in Mbps */ ++}; ++ ++struct ifla_vf_spoofchk { ++ __u32 vf; ++ __u32 setting; ++}; ++ ++struct ifla_vf_guid { ++ __u32 vf; ++ __u64 guid; ++}; ++ ++enum { ++ IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ ++ IFLA_VF_LINK_STATE_ENABLE, /* link always up */ ++ IFLA_VF_LINK_STATE_DISABLE, /* link always down */ ++ __IFLA_VF_LINK_STATE_MAX, ++}; ++ ++struct ifla_vf_link_state { ++ __u32 vf; ++ __u32 link_state; ++}; ++ ++struct ifla_vf_rss_query_en { ++ __u32 vf; ++ __u32 setting; ++}; ++ ++enum { ++ IFLA_VF_STATS_RX_PACKETS, ++ IFLA_VF_STATS_TX_PACKETS, ++ IFLA_VF_STATS_RX_BYTES, ++ IFLA_VF_STATS_TX_BYTES, ++ IFLA_VF_STATS_BROADCAST, ++ IFLA_VF_STATS_MULTICAST, ++ IFLA_VF_STATS_PAD, ++ __IFLA_VF_STATS_MAX, ++}; ++ ++#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) ++ ++struct ifla_vf_trust { ++ __u32 vf; ++ __u32 setting; ++}; ++ ++/* VF ports management section ++ * ++ * Nested layout of set/get msg is: ++ * ++ * [IFLA_NUM_VF] ++ * [IFLA_VF_PORTS] ++ * [IFLA_VF_PORT] ++ * [IFLA_PORT_*], ... ++ * [IFLA_VF_PORT] ++ * [IFLA_PORT_*], ... ++ * ... ++ * [IFLA_PORT_SELF] ++ * [IFLA_PORT_*], ... ++ */ ++ ++enum { ++ IFLA_VF_PORT_UNSPEC, ++ IFLA_VF_PORT, /* nest */ ++ __IFLA_VF_PORT_MAX, ++}; ++ ++#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) ++ ++enum { ++ IFLA_PORT_UNSPEC, ++ IFLA_PORT_VF, /* __u32 */ ++ IFLA_PORT_PROFILE, /* string */ ++ IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ ++ IFLA_PORT_INSTANCE_UUID, /* binary UUID */ ++ IFLA_PORT_HOST_UUID, /* binary UUID */ ++ IFLA_PORT_REQUEST, /* __u8 */ ++ IFLA_PORT_RESPONSE, /* __u16, output only */ ++ __IFLA_PORT_MAX, ++}; ++ ++#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) ++ ++#define PORT_PROFILE_MAX 40 ++#define PORT_UUID_MAX 16 ++#define PORT_SELF_VF -1 ++ ++enum { ++ PORT_REQUEST_PREASSOCIATE = 0, ++ PORT_REQUEST_PREASSOCIATE_RR, ++ PORT_REQUEST_ASSOCIATE, ++ PORT_REQUEST_DISASSOCIATE, ++}; ++ ++enum { ++ PORT_VDP_RESPONSE_SUCCESS = 0, ++ PORT_VDP_RESPONSE_INVALID_FORMAT, ++ PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, ++ PORT_VDP_RESPONSE_UNUSED_VTID, ++ PORT_VDP_RESPONSE_VTID_VIOLATION, ++ PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, ++ PORT_VDP_RESPONSE_OUT_OF_SYNC, ++ /* 0x08-0xFF reserved for future VDP use */ ++ PORT_PROFILE_RESPONSE_SUCCESS = 0x100, ++ PORT_PROFILE_RESPONSE_INPROGRESS, ++ PORT_PROFILE_RESPONSE_INVALID, ++ PORT_PROFILE_RESPONSE_BADSTATE, ++ PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, ++ PORT_PROFILE_RESPONSE_ERROR, ++}; ++ ++struct ifla_port_vsi { ++ __u8 vsi_mgr_id; ++ __u8 vsi_type_id[3]; ++ __u8 vsi_type_version; ++ __u8 pad[3]; ++}; ++ ++ ++/* IPoIB section */ ++ ++enum { ++ IFLA_IPOIB_UNSPEC, ++ IFLA_IPOIB_PKEY, ++ IFLA_IPOIB_MODE, ++ IFLA_IPOIB_UMCAST, ++ __IFLA_IPOIB_MAX ++}; ++ ++enum { ++ IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ ++ IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ ++}; ++ ++#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) ++ ++ ++/* HSR section */ ++ ++enum { ++ IFLA_HSR_UNSPEC, ++ IFLA_HSR_SLAVE1, ++ IFLA_HSR_SLAVE2, ++ IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ ++ IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ ++ IFLA_HSR_SEQ_NR, ++ IFLA_HSR_VERSION, /* HSR version */ ++ __IFLA_HSR_MAX, ++}; ++ ++#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) ++ ++/* STATS section */ ++ ++struct if_stats_msg { ++ __u8 family; ++ __u8 pad1; ++ __u16 pad2; ++ __u32 ifindex; ++ __u32 filter_mask; ++}; ++ ++/* A stats attribute can be netdev specific or a global stat. ++ * For netdev stats, lets use the prefix IFLA_STATS_LINK_* ++ */ ++enum { ++ IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ ++ IFLA_STATS_LINK_64, ++ IFLA_STATS_LINK_XSTATS, ++ IFLA_STATS_LINK_XSTATS_SLAVE, ++ IFLA_STATS_LINK_OFFLOAD_XSTATS, ++ IFLA_STATS_AF_SPEC, ++ __IFLA_STATS_MAX, ++}; ++ ++#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) ++ ++#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) ++ ++/* These are embedded into IFLA_STATS_LINK_XSTATS: ++ * [IFLA_STATS_LINK_XSTATS] ++ * -> [LINK_XSTATS_TYPE_xxx] ++ * -> [rtnl link type specific attributes] ++ */ ++enum { ++ LINK_XSTATS_TYPE_UNSPEC, ++ LINK_XSTATS_TYPE_BRIDGE, ++ __LINK_XSTATS_TYPE_MAX ++}; ++#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) ++ ++/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ ++enum { ++ IFLA_OFFLOAD_XSTATS_UNSPEC, ++ IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ ++ __IFLA_OFFLOAD_XSTATS_MAX ++}; ++#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) ++ ++/* XDP section */ ++ ++#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) ++#define XDP_FLAGS_SKB_MODE (1U << 1) ++#define XDP_FLAGS_DRV_MODE (1U << 2) ++#define XDP_FLAGS_HW_MODE (1U << 3) ++#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ ++ XDP_FLAGS_DRV_MODE | \ ++ XDP_FLAGS_HW_MODE) ++#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ ++ XDP_FLAGS_MODES) ++ ++/* These are stored into IFLA_XDP_ATTACHED on dump. */ ++enum { ++ XDP_ATTACHED_NONE = 0, ++ XDP_ATTACHED_DRV, ++ XDP_ATTACHED_SKB, ++ XDP_ATTACHED_HW, ++}; ++ ++enum { ++ IFLA_XDP_UNSPEC, ++ IFLA_XDP_FD, ++ IFLA_XDP_ATTACHED, ++ IFLA_XDP_FLAGS, ++ IFLA_XDP_PROG_ID, ++ __IFLA_XDP_MAX, ++}; ++ ++#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) ++ ++enum { ++ IFLA_EVENT_NONE, ++ IFLA_EVENT_REBOOT, /* internal reset / reboot */ ++ IFLA_EVENT_FEATURES, /* change in offload features */ ++ IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ ++ IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ ++ IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ ++ IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ ++}; ++ ++#endif /* _LINUX_IF_LINK_H */ +diff --git a/include/uapi/linux/if_macsec.h b/include/uapi/linux/if_macsec.h +new file mode 100644 +index 0000000..22939a3 +--- /dev/null ++++ b/include/uapi/linux/if_macsec.h +@@ -0,0 +1,171 @@ ++/* ++ * include/uapi/linux/if_macsec.h - MACsec device ++ * ++ * Copyright (c) 2015 Sabrina Dubroca ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _MACSEC_H ++#define _MACSEC_H ++ ++#include ++ ++#define MACSEC_GENL_NAME "macsec" ++#define MACSEC_GENL_VERSION 1 ++ ++#define MACSEC_MAX_KEY_LEN 128 ++ ++#define MACSEC_KEYID_LEN 16 ++ ++#define MACSEC_DEFAULT_CIPHER_ID 0x0080020001000001ULL ++#define MACSEC_DEFAULT_CIPHER_ALT 0x0080C20001000001ULL ++ ++#define MACSEC_MIN_ICV_LEN 8 ++#define MACSEC_MAX_ICV_LEN 32 ++/* upper limit for ICV length as recommended by IEEE802.1AE-2006 */ ++#define MACSEC_STD_ICV_LEN 16 ++ ++enum macsec_attrs { ++ MACSEC_ATTR_UNSPEC, ++ MACSEC_ATTR_IFINDEX, /* u32, ifindex of the MACsec netdevice */ ++ MACSEC_ATTR_RXSC_CONFIG, /* config, nested macsec_rxsc_attrs */ ++ MACSEC_ATTR_SA_CONFIG, /* config, nested macsec_sa_attrs */ ++ MACSEC_ATTR_SECY, /* dump, nested macsec_secy_attrs */ ++ MACSEC_ATTR_TXSA_LIST, /* dump, nested, macsec_sa_attrs for each TXSA */ ++ MACSEC_ATTR_RXSC_LIST, /* dump, nested, macsec_rxsc_attrs for each RXSC */ ++ MACSEC_ATTR_TXSC_STATS, /* dump, nested, macsec_txsc_stats_attr */ ++ MACSEC_ATTR_SECY_STATS, /* dump, nested, macsec_secy_stats_attr */ ++ __MACSEC_ATTR_END, ++ NUM_MACSEC_ATTR = __MACSEC_ATTR_END, ++ MACSEC_ATTR_MAX = __MACSEC_ATTR_END - 1, ++}; ++ ++enum macsec_secy_attrs { ++ MACSEC_SECY_ATTR_UNSPEC, ++ MACSEC_SECY_ATTR_SCI, ++ MACSEC_SECY_ATTR_ENCODING_SA, ++ MACSEC_SECY_ATTR_WINDOW, ++ MACSEC_SECY_ATTR_CIPHER_SUITE, ++ MACSEC_SECY_ATTR_ICV_LEN, ++ MACSEC_SECY_ATTR_PROTECT, ++ MACSEC_SECY_ATTR_REPLAY, ++ MACSEC_SECY_ATTR_OPER, ++ MACSEC_SECY_ATTR_VALIDATE, ++ MACSEC_SECY_ATTR_ENCRYPT, ++ MACSEC_SECY_ATTR_INC_SCI, ++ MACSEC_SECY_ATTR_ES, ++ MACSEC_SECY_ATTR_SCB, ++ MACSEC_SECY_ATTR_PAD, ++ __MACSEC_SECY_ATTR_END, ++ NUM_MACSEC_SECY_ATTR = __MACSEC_SECY_ATTR_END, ++ MACSEC_SECY_ATTR_MAX = __MACSEC_SECY_ATTR_END - 1, ++}; ++ ++enum macsec_rxsc_attrs { ++ MACSEC_RXSC_ATTR_UNSPEC, ++ MACSEC_RXSC_ATTR_SCI, /* config/dump, u64 */ ++ MACSEC_RXSC_ATTR_ACTIVE, /* config/dump, u8 0..1 */ ++ MACSEC_RXSC_ATTR_SA_LIST, /* dump, nested */ ++ MACSEC_RXSC_ATTR_STATS, /* dump, nested, macsec_rxsc_stats_attr */ ++ MACSEC_RXSC_ATTR_PAD, ++ __MACSEC_RXSC_ATTR_END, ++ NUM_MACSEC_RXSC_ATTR = __MACSEC_RXSC_ATTR_END, ++ MACSEC_RXSC_ATTR_MAX = __MACSEC_RXSC_ATTR_END - 1, ++}; ++ ++enum macsec_sa_attrs { ++ MACSEC_SA_ATTR_UNSPEC, ++ MACSEC_SA_ATTR_AN, /* config/dump, u8 0..3 */ ++ MACSEC_SA_ATTR_ACTIVE, /* config/dump, u8 0..1 */ ++ MACSEC_SA_ATTR_PN, /* config/dump, u32 */ ++ MACSEC_SA_ATTR_KEY, /* config, data */ ++ MACSEC_SA_ATTR_KEYID, /* config/dump, 128-bit */ ++ MACSEC_SA_ATTR_STATS, /* dump, nested, macsec_sa_stats_attr */ ++ MACSEC_SA_ATTR_PAD, ++ __MACSEC_SA_ATTR_END, ++ NUM_MACSEC_SA_ATTR = __MACSEC_SA_ATTR_END, ++ MACSEC_SA_ATTR_MAX = __MACSEC_SA_ATTR_END - 1, ++}; ++ ++enum macsec_nl_commands { ++ MACSEC_CMD_GET_TXSC, ++ MACSEC_CMD_ADD_RXSC, ++ MACSEC_CMD_DEL_RXSC, ++ MACSEC_CMD_UPD_RXSC, ++ MACSEC_CMD_ADD_TXSA, ++ MACSEC_CMD_DEL_TXSA, ++ MACSEC_CMD_UPD_TXSA, ++ MACSEC_CMD_ADD_RXSA, ++ MACSEC_CMD_DEL_RXSA, ++ MACSEC_CMD_UPD_RXSA, ++}; ++ ++/* u64 per-RXSC stats */ ++enum macsec_rxsc_stats_attr { ++ MACSEC_RXSC_STATS_ATTR_UNSPEC, ++ MACSEC_RXSC_STATS_ATTR_IN_OCTETS_VALIDATED, ++ MACSEC_RXSC_STATS_ATTR_IN_OCTETS_DECRYPTED, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNCHECKED, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_DELAYED, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_OK, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_INVALID, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_LATE, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_VALID, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_NOT_USING_SA, ++ MACSEC_RXSC_STATS_ATTR_IN_PKTS_UNUSED_SA, ++ MACSEC_RXSC_STATS_ATTR_PAD, ++ __MACSEC_RXSC_STATS_ATTR_END, ++ NUM_MACSEC_RXSC_STATS_ATTR = __MACSEC_RXSC_STATS_ATTR_END, ++ MACSEC_RXSC_STATS_ATTR_MAX = __MACSEC_RXSC_STATS_ATTR_END - 1, ++}; ++ ++/* u32 per-{RX,TX}SA stats */ ++enum macsec_sa_stats_attr { ++ MACSEC_SA_STATS_ATTR_UNSPEC, ++ MACSEC_SA_STATS_ATTR_IN_PKTS_OK, ++ MACSEC_SA_STATS_ATTR_IN_PKTS_INVALID, ++ MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_VALID, ++ MACSEC_SA_STATS_ATTR_IN_PKTS_NOT_USING_SA, ++ MACSEC_SA_STATS_ATTR_IN_PKTS_UNUSED_SA, ++ MACSEC_SA_STATS_ATTR_OUT_PKTS_PROTECTED, ++ MACSEC_SA_STATS_ATTR_OUT_PKTS_ENCRYPTED, ++ __MACSEC_SA_STATS_ATTR_END, ++ NUM_MACSEC_SA_STATS_ATTR = __MACSEC_SA_STATS_ATTR_END, ++ MACSEC_SA_STATS_ATTR_MAX = __MACSEC_SA_STATS_ATTR_END - 1, ++}; ++ ++/* u64 per-TXSC stats */ ++enum macsec_txsc_stats_attr { ++ MACSEC_TXSC_STATS_ATTR_UNSPEC, ++ MACSEC_TXSC_STATS_ATTR_OUT_PKTS_PROTECTED, ++ MACSEC_TXSC_STATS_ATTR_OUT_PKTS_ENCRYPTED, ++ MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_PROTECTED, ++ MACSEC_TXSC_STATS_ATTR_OUT_OCTETS_ENCRYPTED, ++ MACSEC_TXSC_STATS_ATTR_PAD, ++ __MACSEC_TXSC_STATS_ATTR_END, ++ NUM_MACSEC_TXSC_STATS_ATTR = __MACSEC_TXSC_STATS_ATTR_END, ++ MACSEC_TXSC_STATS_ATTR_MAX = __MACSEC_TXSC_STATS_ATTR_END - 1, ++}; ++ ++/* u64 per-SecY stats */ ++enum macsec_secy_stats_attr { ++ MACSEC_SECY_STATS_ATTR_UNSPEC, ++ MACSEC_SECY_STATS_ATTR_OUT_PKTS_UNTAGGED, ++ MACSEC_SECY_STATS_ATTR_IN_PKTS_UNTAGGED, ++ MACSEC_SECY_STATS_ATTR_OUT_PKTS_TOO_LONG, ++ MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_TAG, ++ MACSEC_SECY_STATS_ATTR_IN_PKTS_BAD_TAG, ++ MACSEC_SECY_STATS_ATTR_IN_PKTS_UNKNOWN_SCI, ++ MACSEC_SECY_STATS_ATTR_IN_PKTS_NO_SCI, ++ MACSEC_SECY_STATS_ATTR_IN_PKTS_OVERRUN, ++ MACSEC_SECY_STATS_ATTR_PAD, ++ __MACSEC_SECY_STATS_ATTR_END, ++ NUM_MACSEC_SECY_STATS_ATTR = __MACSEC_SECY_STATS_ATTR_END, ++ MACSEC_SECY_STATS_ATTR_MAX = __MACSEC_SECY_STATS_ATTR_END - 1, ++}; ++ ++#endif /* _MACSEC_H */ +diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h +new file mode 100644 +index 0000000..4df96a7 +--- /dev/null ++++ b/include/uapi/linux/if_packet.h +@@ -0,0 +1,302 @@ ++#ifndef __LINUX_IF_PACKET_H ++#define __LINUX_IF_PACKET_H ++ ++#include ++ ++struct sockaddr_pkt { ++ unsigned short spkt_family; ++ unsigned char spkt_device[14]; ++ __be16 spkt_protocol; ++}; ++ ++struct sockaddr_ll { ++ unsigned short sll_family; ++ __be16 sll_protocol; ++ int sll_ifindex; ++ unsigned short sll_hatype; ++ unsigned char sll_pkttype; ++ unsigned char sll_halen; ++ unsigned char sll_addr[8]; ++}; ++ ++/* Packet types */ ++ ++#define PACKET_HOST 0 /* To us */ ++#define PACKET_BROADCAST 1 /* To all */ ++#define PACKET_MULTICAST 2 /* To group */ ++#define PACKET_OTHERHOST 3 /* To someone else */ ++#define PACKET_OUTGOING 4 /* Outgoing of any type */ ++#define PACKET_LOOPBACK 5 /* MC/BRD frame looped back */ ++#define PACKET_USER 6 /* To user space */ ++#define PACKET_KERNEL 7 /* To kernel space */ ++/* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ ++#define PACKET_FASTROUTE 6 /* Fastrouted frame */ ++ ++/* Packet socket options */ ++ ++#define PACKET_ADD_MEMBERSHIP 1 ++#define PACKET_DROP_MEMBERSHIP 2 ++#define PACKET_RECV_OUTPUT 3 ++/* Value 4 is still used by obsolete turbo-packet. */ ++#define PACKET_RX_RING 5 ++#define PACKET_STATISTICS 6 ++#define PACKET_COPY_THRESH 7 ++#define PACKET_AUXDATA 8 ++#define PACKET_ORIGDEV 9 ++#define PACKET_VERSION 10 ++#define PACKET_HDRLEN 11 ++#define PACKET_RESERVE 12 ++#define PACKET_TX_RING 13 ++#define PACKET_LOSS 14 ++#define PACKET_VNET_HDR 15 ++#define PACKET_TX_TIMESTAMP 16 ++#define PACKET_TIMESTAMP 17 ++#define PACKET_FANOUT 18 ++#define PACKET_TX_HAS_OFF 19 ++#define PACKET_QDISC_BYPASS 20 ++#define PACKET_ROLLOVER_STATS 21 ++#define PACKET_FANOUT_DATA 22 ++ ++#define PACKET_FANOUT_HASH 0 ++#define PACKET_FANOUT_LB 1 ++#define PACKET_FANOUT_CPU 2 ++#define PACKET_FANOUT_ROLLOVER 3 ++#define PACKET_FANOUT_RND 4 ++#define PACKET_FANOUT_QM 5 ++#define PACKET_FANOUT_CBPF 6 ++#define PACKET_FANOUT_EBPF 7 ++#define PACKET_FANOUT_FLAG_ROLLOVER 0x1000 ++#define PACKET_FANOUT_FLAG_UNIQUEID 0x2000 ++#define PACKET_FANOUT_FLAG_DEFRAG 0x8000 ++ ++struct tpacket_stats { ++ unsigned int tp_packets; ++ unsigned int tp_drops; ++}; ++ ++struct tpacket_stats_v3 { ++ unsigned int tp_packets; ++ unsigned int tp_drops; ++ unsigned int tp_freeze_q_cnt; ++}; ++ ++struct tpacket_rollover_stats { ++ __aligned_u64 tp_all; ++ __aligned_u64 tp_huge; ++ __aligned_u64 tp_failed; ++}; ++ ++union tpacket_stats_u { ++ struct tpacket_stats stats1; ++ struct tpacket_stats_v3 stats3; ++}; ++ ++struct tpacket_auxdata { ++ __u32 tp_status; ++ __u32 tp_len; ++ __u32 tp_snaplen; ++ __u16 tp_mac; ++ __u16 tp_net; ++ __u16 tp_vlan_tci; ++ __u16 tp_vlan_tpid; ++}; ++ ++/* Rx ring - header status */ ++#define TP_STATUS_KERNEL 0 ++#define TP_STATUS_USER (1 << 0) ++#define TP_STATUS_COPY (1 << 1) ++#define TP_STATUS_LOSING (1 << 2) ++#define TP_STATUS_CSUMNOTREADY (1 << 3) ++#define TP_STATUS_VLAN_VALID (1 << 4) /* auxdata has valid tp_vlan_tci */ ++#define TP_STATUS_BLK_TMO (1 << 5) ++#define TP_STATUS_VLAN_TPID_VALID (1 << 6) /* auxdata has valid tp_vlan_tpid */ ++#define TP_STATUS_CSUM_VALID (1 << 7) ++ ++/* Tx ring - header status */ ++#define TP_STATUS_AVAILABLE 0 ++#define TP_STATUS_SEND_REQUEST (1 << 0) ++#define TP_STATUS_SENDING (1 << 1) ++#define TP_STATUS_WRONG_FORMAT (1 << 2) ++ ++/* Rx and Tx ring - header status */ ++#define TP_STATUS_TS_SOFTWARE (1 << 29) ++#define TP_STATUS_TS_SYS_HARDWARE (1 << 30) /* deprecated, never set */ ++#define TP_STATUS_TS_RAW_HARDWARE (1 << 31) ++ ++/* Rx ring - feature request bits */ ++#define TP_FT_REQ_FILL_RXHASH 0x1 ++ ++struct tpacket_hdr { ++ unsigned long tp_status; ++ unsigned int tp_len; ++ unsigned int tp_snaplen; ++ unsigned short tp_mac; ++ unsigned short tp_net; ++ unsigned int tp_sec; ++ unsigned int tp_usec; ++}; ++ ++#define TPACKET_ALIGNMENT 16 ++#define TPACKET_ALIGN(x) (((x)+TPACKET_ALIGNMENT-1)&~(TPACKET_ALIGNMENT-1)) ++#define TPACKET_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll)) ++ ++struct tpacket2_hdr { ++ __u32 tp_status; ++ __u32 tp_len; ++ __u32 tp_snaplen; ++ __u16 tp_mac; ++ __u16 tp_net; ++ __u32 tp_sec; ++ __u32 tp_nsec; ++ __u16 tp_vlan_tci; ++ __u16 tp_vlan_tpid; ++ __u8 tp_padding[4]; ++}; ++ ++struct tpacket_hdr_variant1 { ++ __u32 tp_rxhash; ++ __u32 tp_vlan_tci; ++ __u16 tp_vlan_tpid; ++ __u16 tp_padding; ++}; ++ ++struct tpacket3_hdr { ++ __u32 tp_next_offset; ++ __u32 tp_sec; ++ __u32 tp_nsec; ++ __u32 tp_snaplen; ++ __u32 tp_len; ++ __u32 tp_status; ++ __u16 tp_mac; ++ __u16 tp_net; ++ /* pkt_hdr variants */ ++ union { ++ struct tpacket_hdr_variant1 hv1; ++ }; ++ __u8 tp_padding[8]; ++}; ++ ++struct tpacket_bd_ts { ++ unsigned int ts_sec; ++ union { ++ unsigned int ts_usec; ++ unsigned int ts_nsec; ++ }; ++}; ++ ++struct tpacket_hdr_v1 { ++ __u32 block_status; ++ __u32 num_pkts; ++ __u32 offset_to_first_pkt; ++ ++ /* Number of valid bytes (including padding) ++ * blk_len <= tp_block_size ++ */ ++ __u32 blk_len; ++ ++ /* ++ * Quite a few uses of sequence number: ++ * 1. Make sure cache flush etc worked. ++ * Well, one can argue - why not use the increasing ts below? ++ * But look at 2. below first. ++ * 2. When you pass around blocks to other user space decoders, ++ * you can see which blk[s] is[are] outstanding etc. ++ * 3. Validate kernel code. ++ */ ++ __aligned_u64 seq_num; ++ ++ /* ++ * ts_last_pkt: ++ * ++ * Case 1. Block has 'N'(N >=1) packets and TMO'd(timed out) ++ * ts_last_pkt == 'time-stamp of last packet' and NOT the ++ * time when the timer fired and the block was closed. ++ * By providing the ts of the last packet we can absolutely ++ * guarantee that time-stamp wise, the first packet in the ++ * next block will never precede the last packet of the ++ * previous block. ++ * Case 2. Block has zero packets and TMO'd ++ * ts_last_pkt = time when the timer fired and the block ++ * was closed. ++ * Case 3. Block has 'N' packets and NO TMO. ++ * ts_last_pkt = time-stamp of the last pkt in the block. ++ * ++ * ts_first_pkt: ++ * Is always the time-stamp when the block was opened. ++ * Case a) ZERO packets ++ * No packets to deal with but atleast you know the ++ * time-interval of this block. ++ * Case b) Non-zero packets ++ * Use the ts of the first packet in the block. ++ * ++ */ ++ struct tpacket_bd_ts ts_first_pkt, ts_last_pkt; ++}; ++ ++union tpacket_bd_header_u { ++ struct tpacket_hdr_v1 bh1; ++}; ++ ++struct tpacket_block_desc { ++ __u32 version; ++ __u32 offset_to_priv; ++ union tpacket_bd_header_u hdr; ++}; ++ ++#define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) ++#define TPACKET3_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll)) ++ ++enum tpacket_versions { ++ TPACKET_V1, ++ TPACKET_V2, ++ TPACKET_V3 ++}; ++ ++/* ++ Frame structure: ++ ++ - Start. Frame must be aligned to TPACKET_ALIGNMENT=16 ++ - struct tpacket_hdr ++ - pad to TPACKET_ALIGNMENT=16 ++ - struct sockaddr_ll ++ - Gap, chosen so that packet data (Start+tp_net) alignes to TPACKET_ALIGNMENT=16 ++ - Start+tp_mac: [ Optional MAC header ] ++ - Start+tp_net: Packet data, aligned to TPACKET_ALIGNMENT=16. ++ - Pad to align to TPACKET_ALIGNMENT=16 ++ */ ++ ++struct tpacket_req { ++ unsigned int tp_block_size; /* Minimal size of contiguous block */ ++ unsigned int tp_block_nr; /* Number of blocks */ ++ unsigned int tp_frame_size; /* Size of frame */ ++ unsigned int tp_frame_nr; /* Total number of frames */ ++}; ++ ++struct tpacket_req3 { ++ unsigned int tp_block_size; /* Minimal size of contiguous block */ ++ unsigned int tp_block_nr; /* Number of blocks */ ++ unsigned int tp_frame_size; /* Size of frame */ ++ unsigned int tp_frame_nr; /* Total number of frames */ ++ unsigned int tp_retire_blk_tov; /* timeout in msecs */ ++ unsigned int tp_sizeof_priv; /* offset to private data area */ ++ unsigned int tp_feature_req_word; ++}; ++ ++union tpacket_req_u { ++ struct tpacket_req req; ++ struct tpacket_req3 req3; ++}; ++ ++struct packet_mreq { ++ int mr_ifindex; ++ unsigned short mr_type; ++ unsigned short mr_alen; ++ unsigned char mr_address[8]; ++}; ++ ++#define PACKET_MR_MULTICAST 0 ++#define PACKET_MR_PROMISC 1 ++#define PACKET_MR_ALLMULTI 2 ++#define PACKET_MR_UNICAST 3 ++ ++#endif +diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h +new file mode 100644 +index 0000000..d5ecb42 +--- /dev/null ++++ b/include/uapi/linux/if_tun.h +@@ -0,0 +1,107 @@ ++/* ++ * Universal TUN/TAP device driver. ++ * Copyright (C) 1999-2000 Maxim Krasnyansky ++ * ++ * This program is free software; you can redistribute 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++#ifndef __IF_TUN_H ++#define __IF_TUN_H ++ ++#include ++#include ++#include ++ ++/* Read queue size */ ++#define TUN_READQ_SIZE 500 ++/* TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. */ ++#define TUN_TUN_DEV IFF_TUN ++#define TUN_TAP_DEV IFF_TAP ++#define TUN_TYPE_MASK 0x000f ++ ++/* Ioctl defines */ ++#define TUNSETNOCSUM _IOW('T', 200, int) ++#define TUNSETDEBUG _IOW('T', 201, int) ++#define TUNSETIFF _IOW('T', 202, int) ++#define TUNSETPERSIST _IOW('T', 203, int) ++#define TUNSETOWNER _IOW('T', 204, int) ++#define TUNSETLINK _IOW('T', 205, int) ++#define TUNSETGROUP _IOW('T', 206, int) ++#define TUNGETFEATURES _IOR('T', 207, unsigned int) ++#define TUNSETOFFLOAD _IOW('T', 208, unsigned int) ++#define TUNSETTXFILTER _IOW('T', 209, unsigned int) ++#define TUNGETIFF _IOR('T', 210, unsigned int) ++#define TUNGETSNDBUF _IOR('T', 211, int) ++#define TUNSETSNDBUF _IOW('T', 212, int) ++#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog) ++#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog) ++#define TUNGETVNETHDRSZ _IOR('T', 215, int) ++#define TUNSETVNETHDRSZ _IOW('T', 216, int) ++#define TUNSETQUEUE _IOW('T', 217, int) ++#define TUNSETIFINDEX _IOW('T', 218, unsigned int) ++#define TUNGETFILTER _IOR('T', 219, struct sock_fprog) ++#define TUNSETVNETLE _IOW('T', 220, int) ++#define TUNGETVNETLE _IOR('T', 221, int) ++/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on ++ * little-endian hosts. Not all kernel configurations support them, but all ++ * configurations that support SET also support GET. ++ */ ++#define TUNSETVNETBE _IOW('T', 222, int) ++#define TUNGETVNETBE _IOR('T', 223, int) ++ ++/* TUNSETIFF ifr flags */ ++#define IFF_TUN 0x0001 ++#define IFF_TAP 0x0002 ++#define IFF_NO_PI 0x1000 ++/* This flag has no real effect */ ++#define IFF_ONE_QUEUE 0x2000 ++#define IFF_VNET_HDR 0x4000 ++#define IFF_TUN_EXCL 0x8000 ++#define IFF_MULTI_QUEUE 0x0100 ++#define IFF_ATTACH_QUEUE 0x0200 ++#define IFF_DETACH_QUEUE 0x0400 ++/* read-only flag */ ++#define IFF_PERSIST 0x0800 ++#define IFF_NOFILTER 0x1000 ++ ++/* Socket options */ ++#define TUN_TX_TIMESTAMP 1 ++ ++/* Features for GSO (TUNSETOFFLOAD). */ ++#define TUN_F_CSUM 0x01 /* You can hand me unchecksummed packets. */ ++#define TUN_F_TSO4 0x02 /* I can handle TSO for IPv4 packets */ ++#define TUN_F_TSO6 0x04 /* I can handle TSO for IPv6 packets */ ++#define TUN_F_TSO_ECN 0x08 /* I can handle TSO with ECN bits. */ ++#define TUN_F_UFO 0x10 /* I can handle UFO packets */ ++ ++/* Protocol info prepended to the packets (when IFF_NO_PI is not set) */ ++#define TUN_PKT_STRIP 0x0001 ++struct tun_pi { ++ __u16 flags; ++ __be16 proto; ++}; ++ ++/* ++ * Filter spec (used for SETXXFILTER ioctls) ++ * This stuff is applicable only to the TAP (Ethernet) devices. ++ * If the count is zero the filter is disabled and the driver accepts ++ * all packets (promisc mode). ++ * If the filter is enabled in order to accept broadcast packets ++ * broadcast addr must be explicitly included in the addr list. ++ */ ++#define TUN_FLT_ALLMULTI 0x0001 /* Accept all multicast packets */ ++struct tun_filter { ++ __u16 flags; /* TUN_FLT_ flags see above */ ++ __u16 count; /* Number of addresses */ ++ __u8 addr[0][ETH_ALEN]; ++}; ++ ++#endif /* __IF_TUN_H */ +diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h +new file mode 100644 +index 0000000..21834ca +--- /dev/null ++++ b/include/uapi/linux/if_tunnel.h +@@ -0,0 +1,158 @@ ++#ifndef _IF_TUNNEL_H_ ++#define _IF_TUNNEL_H_ ++ ++#include ++#include ++#include ++#include ++#include ++ ++ ++#define SIOCGETTUNNEL (SIOCDEVPRIVATE + 0) ++#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1) ++#define SIOCDELTUNNEL (SIOCDEVPRIVATE + 2) ++#define SIOCCHGTUNNEL (SIOCDEVPRIVATE + 3) ++#define SIOCGETPRL (SIOCDEVPRIVATE + 4) ++#define SIOCADDPRL (SIOCDEVPRIVATE + 5) ++#define SIOCDELPRL (SIOCDEVPRIVATE + 6) ++#define SIOCCHGPRL (SIOCDEVPRIVATE + 7) ++#define SIOCGET6RD (SIOCDEVPRIVATE + 8) ++#define SIOCADD6RD (SIOCDEVPRIVATE + 9) ++#define SIOCDEL6RD (SIOCDEVPRIVATE + 10) ++#define SIOCCHG6RD (SIOCDEVPRIVATE + 11) ++ ++#define GRE_CSUM __cpu_to_be16(0x8000) ++#define GRE_ROUTING __cpu_to_be16(0x4000) ++#define GRE_KEY __cpu_to_be16(0x2000) ++#define GRE_SEQ __cpu_to_be16(0x1000) ++#define GRE_STRICT __cpu_to_be16(0x0800) ++#define GRE_REC __cpu_to_be16(0x0700) ++#define GRE_ACK __cpu_to_be16(0x0080) ++#define GRE_FLAGS __cpu_to_be16(0x0078) ++#define GRE_VERSION __cpu_to_be16(0x0007) ++ ++#define GRE_IS_CSUM(f) ((f) & GRE_CSUM) ++#define GRE_IS_ROUTING(f) ((f) & GRE_ROUTING) ++#define GRE_IS_KEY(f) ((f) & GRE_KEY) ++#define GRE_IS_SEQ(f) ((f) & GRE_SEQ) ++#define GRE_IS_STRICT(f) ((f) & GRE_STRICT) ++#define GRE_IS_REC(f) ((f) & GRE_REC) ++#define GRE_IS_ACK(f) ((f) & GRE_ACK) ++ ++#define GRE_VERSION_0 __cpu_to_be16(0x0000) ++#define GRE_VERSION_1 __cpu_to_be16(0x0001) ++#define GRE_PROTO_PPP __cpu_to_be16(0x880b) ++#define GRE_PPTP_KEY_MASK __cpu_to_be32(0xffff) ++ ++struct ip_tunnel_parm { ++ char name[IFNAMSIZ]; ++ int link; ++ __be16 i_flags; ++ __be16 o_flags; ++ __be32 i_key; ++ __be32 o_key; ++ struct iphdr iph; ++}; ++ ++enum { ++ IFLA_IPTUN_UNSPEC, ++ IFLA_IPTUN_LINK, ++ IFLA_IPTUN_LOCAL, ++ IFLA_IPTUN_REMOTE, ++ IFLA_IPTUN_TTL, ++ IFLA_IPTUN_TOS, ++ IFLA_IPTUN_ENCAP_LIMIT, ++ IFLA_IPTUN_FLOWINFO, ++ IFLA_IPTUN_FLAGS, ++ IFLA_IPTUN_PROTO, ++ IFLA_IPTUN_PMTUDISC, ++ IFLA_IPTUN_6RD_PREFIX, ++ IFLA_IPTUN_6RD_RELAY_PREFIX, ++ IFLA_IPTUN_6RD_PREFIXLEN, ++ IFLA_IPTUN_6RD_RELAY_PREFIXLEN, ++ IFLA_IPTUN_ENCAP_TYPE, ++ IFLA_IPTUN_ENCAP_FLAGS, ++ IFLA_IPTUN_ENCAP_SPORT, ++ IFLA_IPTUN_ENCAP_DPORT, ++ IFLA_IPTUN_COLLECT_METADATA, ++ IFLA_IPTUN_FWMARK, ++ __IFLA_IPTUN_MAX, ++}; ++#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) ++ ++enum tunnel_encap_types { ++ TUNNEL_ENCAP_NONE, ++ TUNNEL_ENCAP_FOU, ++ TUNNEL_ENCAP_GUE, ++}; ++ ++#define TUNNEL_ENCAP_FLAG_CSUM (1<<0) ++#define TUNNEL_ENCAP_FLAG_CSUM6 (1<<1) ++#define TUNNEL_ENCAP_FLAG_REMCSUM (1<<2) ++ ++/* SIT-mode i_flags */ ++#define SIT_ISATAP 0x0001 ++ ++struct ip_tunnel_prl { ++ __be32 addr; ++ __u16 flags; ++ __u16 __reserved; ++ __u32 datalen; ++ __u32 __reserved2; ++ /* data follows */ ++}; ++ ++/* PRL flags */ ++#define PRL_DEFAULT 0x0001 ++ ++struct ip_tunnel_6rd { ++ struct in6_addr prefix; ++ __be32 relay_prefix; ++ __u16 prefixlen; ++ __u16 relay_prefixlen; ++}; ++ ++enum { ++ IFLA_GRE_UNSPEC, ++ IFLA_GRE_LINK, ++ IFLA_GRE_IFLAGS, ++ IFLA_GRE_OFLAGS, ++ IFLA_GRE_IKEY, ++ IFLA_GRE_OKEY, ++ IFLA_GRE_LOCAL, ++ IFLA_GRE_REMOTE, ++ IFLA_GRE_TTL, ++ IFLA_GRE_TOS, ++ IFLA_GRE_PMTUDISC, ++ IFLA_GRE_ENCAP_LIMIT, ++ IFLA_GRE_FLOWINFO, ++ IFLA_GRE_FLAGS, ++ IFLA_GRE_ENCAP_TYPE, ++ IFLA_GRE_ENCAP_FLAGS, ++ IFLA_GRE_ENCAP_SPORT, ++ IFLA_GRE_ENCAP_DPORT, ++ IFLA_GRE_COLLECT_METADATA, ++ IFLA_GRE_IGNORE_DF, ++ IFLA_GRE_FWMARK, ++ IFLA_GRE_ERSPAN_INDEX, ++ __IFLA_GRE_MAX, ++}; ++ ++#define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1) ++ ++/* VTI-mode i_flags */ ++#define VTI_ISVTI ((__be16)0x0001) ++ ++enum { ++ IFLA_VTI_UNSPEC, ++ IFLA_VTI_LINK, ++ IFLA_VTI_IKEY, ++ IFLA_VTI_OKEY, ++ IFLA_VTI_LOCAL, ++ IFLA_VTI_REMOTE, ++ IFLA_VTI_FWMARK, ++ __IFLA_VTI_MAX, ++}; ++ ++#define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1) ++#endif /* _IF_TUNNEL_H_ */ +diff --git a/include/uapi/linux/if_vlan.h b/include/uapi/linux/if_vlan.h +new file mode 100644 +index 0000000..24ae007 +--- /dev/null ++++ b/include/uapi/linux/if_vlan.h +@@ -0,0 +1,64 @@ ++/* ++ * VLAN An implementation of 802.1Q VLAN tagging. ++ * ++ * Authors: Ben Greear ++ * ++ * This program is free software; you can redistribute 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. ++ * ++ */ ++ ++#ifndef _LINUX_IF_VLAN_H_ ++#define _LINUX_IF_VLAN_H_ ++ ++ ++/* VLAN IOCTLs are found in sockios.h */ ++ ++/* Passed in vlan_ioctl_args structure to determine behaviour. */ ++enum vlan_ioctl_cmds { ++ ADD_VLAN_CMD, ++ DEL_VLAN_CMD, ++ SET_VLAN_INGRESS_PRIORITY_CMD, ++ SET_VLAN_EGRESS_PRIORITY_CMD, ++ GET_VLAN_INGRESS_PRIORITY_CMD, ++ GET_VLAN_EGRESS_PRIORITY_CMD, ++ SET_VLAN_NAME_TYPE_CMD, ++ SET_VLAN_FLAG_CMD, ++ GET_VLAN_REALDEV_NAME_CMD, /* If this works, you know it's a VLAN device, btw */ ++ GET_VLAN_VID_CMD /* Get the VID of this VLAN (specified by name) */ ++}; ++ ++enum vlan_flags { ++ VLAN_FLAG_REORDER_HDR = 0x1, ++ VLAN_FLAG_GVRP = 0x2, ++ VLAN_FLAG_LOOSE_BINDING = 0x4, ++ VLAN_FLAG_MVRP = 0x8, ++}; ++ ++enum vlan_name_types { ++ VLAN_NAME_TYPE_PLUS_VID, /* Name will look like: vlan0005 */ ++ VLAN_NAME_TYPE_RAW_PLUS_VID, /* name will look like: eth1.0005 */ ++ VLAN_NAME_TYPE_PLUS_VID_NO_PAD, /* Name will look like: vlan5 */ ++ VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, /* Name will look like: eth0.5 */ ++ VLAN_NAME_TYPE_HIGHEST ++}; ++ ++struct vlan_ioctl_args { ++ int cmd; /* Should be one of the vlan_ioctl_cmds enum above. */ ++ char device1[24]; ++ ++ union { ++ char device2[24]; ++ int VID; ++ unsigned int skb_priority; ++ unsigned int name_type; ++ unsigned int bind_type; ++ unsigned int flag; /* Matches vlan_dev_priv flags */ ++ } u; ++ ++ short vlan_qos; ++}; ++ ++#endif /* _LINUX_IF_VLAN_H_ */ +diff --git a/include/uapi/linux/ife.h b/include/uapi/linux/ife.h +new file mode 100644 +index 0000000..2954da3 +--- /dev/null ++++ b/include/uapi/linux/ife.h +@@ -0,0 +1,18 @@ ++#ifndef __UAPI_IFE_H ++#define __UAPI_IFE_H ++ ++#define IFE_METAHDRLEN 2 ++ ++enum { ++ IFE_META_SKBMARK = 1, ++ IFE_META_HASHID, ++ IFE_META_PRIO, ++ IFE_META_QMAP, ++ IFE_META_TCINDEX, ++ __IFE_META_MAX ++}; ++ ++/*Can be overridden at runtime by module option*/ ++#define IFE_META_MAX (__IFE_META_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h +new file mode 100644 +index 0000000..7e328d7 +--- /dev/null ++++ b/include/uapi/linux/ila.h +@@ -0,0 +1,45 @@ ++/* ila.h - ILA Interface */ ++ ++#ifndef _LINUX_ILA_H ++#define _LINUX_ILA_H ++ ++/* NETLINK_GENERIC related info */ ++#define ILA_GENL_NAME "ila" ++#define ILA_GENL_VERSION 0x1 ++ ++enum { ++ ILA_ATTR_UNSPEC, ++ ILA_ATTR_LOCATOR, /* u64 */ ++ ILA_ATTR_IDENTIFIER, /* u64 */ ++ ILA_ATTR_LOCATOR_MATCH, /* u64 */ ++ ILA_ATTR_IFINDEX, /* s32 */ ++ ILA_ATTR_DIR, /* u32 */ ++ ILA_ATTR_PAD, ++ ILA_ATTR_CSUM_MODE, /* u8 */ ++ ++ __ILA_ATTR_MAX, ++}; ++ ++#define ILA_ATTR_MAX (__ILA_ATTR_MAX - 1) ++ ++enum { ++ ILA_CMD_UNSPEC, ++ ILA_CMD_ADD, ++ ILA_CMD_DEL, ++ ILA_CMD_GET, ++ ++ __ILA_CMD_MAX, ++}; ++ ++#define ILA_CMD_MAX (__ILA_CMD_MAX - 1) ++ ++#define ILA_DIR_IN (1 << 0) ++#define ILA_DIR_OUT (1 << 1) ++ ++enum { ++ ILA_CSUM_ADJUST_TRANSPORT, ++ ILA_CSUM_NEUTRAL_MAP, ++ ILA_CSUM_NO_ACTION, ++}; ++ ++#endif /* _LINUX_ILA_H */ +diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h +new file mode 100644 +index 0000000..9439efa +--- /dev/null ++++ b/include/uapi/linux/in.h +@@ -0,0 +1,300 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Definitions of the Internet Protocol. ++ * ++ * Version: @(#)in.h 1.0.1 04/21/93 ++ * ++ * Authors: Original taken from the GNU Project file. ++ * Fred N. van Kempen, ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++#ifndef _LINUX_IN_H ++#define _LINUX_IN_H ++ ++#include ++#include ++#include ++ ++#if __UAPI_DEF_IN_IPPROTO ++/* Standard well-defined IP protocols. */ ++enum { ++ IPPROTO_IP = 0, /* Dummy protocol for TCP */ ++#define IPPROTO_IP IPPROTO_IP ++ IPPROTO_ICMP = 1, /* Internet Control Message Protocol */ ++#define IPPROTO_ICMP IPPROTO_ICMP ++ IPPROTO_IGMP = 2, /* Internet Group Management Protocol */ ++#define IPPROTO_IGMP IPPROTO_IGMP ++ IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */ ++#define IPPROTO_IPIP IPPROTO_IPIP ++ IPPROTO_TCP = 6, /* Transmission Control Protocol */ ++#define IPPROTO_TCP IPPROTO_TCP ++ IPPROTO_EGP = 8, /* Exterior Gateway Protocol */ ++#define IPPROTO_EGP IPPROTO_EGP ++ IPPROTO_PUP = 12, /* PUP protocol */ ++#define IPPROTO_PUP IPPROTO_PUP ++ IPPROTO_UDP = 17, /* User Datagram Protocol */ ++#define IPPROTO_UDP IPPROTO_UDP ++ IPPROTO_IDP = 22, /* XNS IDP protocol */ ++#define IPPROTO_IDP IPPROTO_IDP ++ IPPROTO_TP = 29, /* SO Transport Protocol Class 4 */ ++#define IPPROTO_TP IPPROTO_TP ++ IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol */ ++#define IPPROTO_DCCP IPPROTO_DCCP ++ IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */ ++#define IPPROTO_IPV6 IPPROTO_IPV6 ++ IPPROTO_RSVP = 46, /* RSVP Protocol */ ++#define IPPROTO_RSVP IPPROTO_RSVP ++ IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ ++#define IPPROTO_GRE IPPROTO_GRE ++ IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ ++#define IPPROTO_ESP IPPROTO_ESP ++ IPPROTO_AH = 51, /* Authentication Header protocol */ ++#define IPPROTO_AH IPPROTO_AH ++ IPPROTO_MTP = 92, /* Multicast Transport Protocol */ ++#define IPPROTO_MTP IPPROTO_MTP ++ IPPROTO_BEETPH = 94, /* IP option pseudo header for BEET */ ++#define IPPROTO_BEETPH IPPROTO_BEETPH ++ IPPROTO_ENCAP = 98, /* Encapsulation Header */ ++#define IPPROTO_ENCAP IPPROTO_ENCAP ++ IPPROTO_PIM = 103, /* Protocol Independent Multicast */ ++#define IPPROTO_PIM IPPROTO_PIM ++ IPPROTO_COMP = 108, /* Compression Header Protocol */ ++#define IPPROTO_COMP IPPROTO_COMP ++ IPPROTO_SCTP = 132, /* Stream Control Transport Protocol */ ++#define IPPROTO_SCTP IPPROTO_SCTP ++ IPPROTO_UDPLITE = 136, /* UDP-Lite (RFC 3828) */ ++#define IPPROTO_UDPLITE IPPROTO_UDPLITE ++ IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ ++#define IPPROTO_MPLS IPPROTO_MPLS ++ IPPROTO_RAW = 255, /* Raw IP packets */ ++#define IPPROTO_RAW IPPROTO_RAW ++ IPPROTO_MAX ++}; ++#endif ++ ++#if __UAPI_DEF_IN_ADDR ++/* Internet address. */ ++struct in_addr { ++ __be32 s_addr; ++}; ++#endif ++ ++#define IP_TOS 1 ++#define IP_TTL 2 ++#define IP_HDRINCL 3 ++#define IP_OPTIONS 4 ++#define IP_ROUTER_ALERT 5 ++#define IP_RECVOPTS 6 ++#define IP_RETOPTS 7 ++#define IP_PKTINFO 8 ++#define IP_PKTOPTIONS 9 ++#define IP_MTU_DISCOVER 10 ++#define IP_RECVERR 11 ++#define IP_RECVTTL 12 ++#define IP_RECVTOS 13 ++#define IP_MTU 14 ++#define IP_FREEBIND 15 ++#define IP_IPSEC_POLICY 16 ++#define IP_XFRM_POLICY 17 ++#define IP_PASSSEC 18 ++#define IP_TRANSPARENT 19 ++ ++/* BSD compatibility */ ++#define IP_RECVRETOPTS IP_RETOPTS ++ ++/* TProxy original addresses */ ++#define IP_ORIGDSTADDR 20 ++#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR ++ ++#define IP_MINTTL 21 ++#define IP_NODEFRAG 22 ++#define IP_CHECKSUM 23 ++#define IP_BIND_ADDRESS_NO_PORT 24 ++#define IP_RECVFRAGSIZE 25 ++ ++/* IP_MTU_DISCOVER values */ ++#define IP_PMTUDISC_DONT 0 /* Never send DF frames */ ++#define IP_PMTUDISC_WANT 1 /* Use per route hints */ ++#define IP_PMTUDISC_DO 2 /* Always DF */ ++#define IP_PMTUDISC_PROBE 3 /* Ignore dst pmtu */ ++/* Always use interface mtu (ignores dst pmtu) but don't set DF flag. ++ * Also incoming ICMP frag_needed notifications will be ignored on ++ * this socket to prevent accepting spoofed ones. ++ */ ++#define IP_PMTUDISC_INTERFACE 4 ++/* weaker version of IP_PMTUDISC_INTERFACE, which allos packets to get ++ * fragmented if they exeed the interface mtu ++ */ ++#define IP_PMTUDISC_OMIT 5 ++ ++#define IP_MULTICAST_IF 32 ++#define IP_MULTICAST_TTL 33 ++#define IP_MULTICAST_LOOP 34 ++#define IP_ADD_MEMBERSHIP 35 ++#define IP_DROP_MEMBERSHIP 36 ++#define IP_UNBLOCK_SOURCE 37 ++#define IP_BLOCK_SOURCE 38 ++#define IP_ADD_SOURCE_MEMBERSHIP 39 ++#define IP_DROP_SOURCE_MEMBERSHIP 40 ++#define IP_MSFILTER 41 ++#define MCAST_JOIN_GROUP 42 ++#define MCAST_BLOCK_SOURCE 43 ++#define MCAST_UNBLOCK_SOURCE 44 ++#define MCAST_LEAVE_GROUP 45 ++#define MCAST_JOIN_SOURCE_GROUP 46 ++#define MCAST_LEAVE_SOURCE_GROUP 47 ++#define MCAST_MSFILTER 48 ++#define IP_MULTICAST_ALL 49 ++#define IP_UNICAST_IF 50 ++ ++#define MCAST_EXCLUDE 0 ++#define MCAST_INCLUDE 1 ++ ++/* These need to appear somewhere around here */ ++#define IP_DEFAULT_MULTICAST_TTL 1 ++#define IP_DEFAULT_MULTICAST_LOOP 1 ++ ++/* Request struct for multicast socket ops */ ++ ++#if __UAPI_DEF_IP_MREQ ++struct ip_mreq { ++ struct in_addr imr_multiaddr; /* IP multicast address of group */ ++ struct in_addr imr_interface; /* local IP address of interface */ ++}; ++ ++struct ip_mreqn { ++ struct in_addr imr_multiaddr; /* IP multicast address of group */ ++ struct in_addr imr_address; /* local IP address of interface */ ++ int imr_ifindex; /* Interface index */ ++}; ++ ++struct ip_mreq_source { ++ __be32 imr_multiaddr; ++ __be32 imr_interface; ++ __be32 imr_sourceaddr; ++}; ++ ++struct ip_msfilter { ++ __be32 imsf_multiaddr; ++ __be32 imsf_interface; ++ __u32 imsf_fmode; ++ __u32 imsf_numsrc; ++ __be32 imsf_slist[1]; ++}; ++ ++#define IP_MSFILTER_SIZE(numsrc) \ ++ (sizeof(struct ip_msfilter) - sizeof(__u32) \ ++ + (numsrc) * sizeof(__u32)) ++ ++struct group_req { ++ __u32 gr_interface; /* interface index */ ++ struct __kernel_sockaddr_storage gr_group; /* group address */ ++}; ++ ++struct group_source_req { ++ __u32 gsr_interface; /* interface index */ ++ struct __kernel_sockaddr_storage gsr_group; /* group address */ ++ struct __kernel_sockaddr_storage gsr_source; /* source address */ ++}; ++ ++struct group_filter { ++ __u32 gf_interface; /* interface index */ ++ struct __kernel_sockaddr_storage gf_group; /* multicast address */ ++ __u32 gf_fmode; /* filter mode */ ++ __u32 gf_numsrc; /* number of sources */ ++ struct __kernel_sockaddr_storage gf_slist[1]; /* interface index */ ++}; ++ ++#define GROUP_FILTER_SIZE(numsrc) \ ++ (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \ ++ + (numsrc) * sizeof(struct __kernel_sockaddr_storage)) ++#endif ++ ++#if __UAPI_DEF_IN_PKTINFO ++struct in_pktinfo { ++ int ipi_ifindex; ++ struct in_addr ipi_spec_dst; ++ struct in_addr ipi_addr; ++}; ++#endif ++ ++/* Structure describing an Internet (IP) socket address. */ ++#if __UAPI_DEF_SOCKADDR_IN ++#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ ++struct sockaddr_in { ++ __kernel_sa_family_t sin_family; /* Address family */ ++ __be16 sin_port; /* Port number */ ++ struct in_addr sin_addr; /* Internet address */ ++ ++ /* Pad to size of `struct sockaddr'. */ ++ unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - ++ sizeof(unsigned short int) - sizeof(struct in_addr)]; ++}; ++#define sin_zero __pad /* for BSD UNIX comp. -FvK */ ++#endif ++ ++#if __UAPI_DEF_IN_CLASS ++/* ++ * Definitions of the bits in an Internet address integer. ++ * On subnets, host and network parts are found according ++ * to the subnet mask, not these masks. ++ */ ++#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) ++#define IN_CLASSA_NET 0xff000000 ++#define IN_CLASSA_NSHIFT 24 ++#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) ++#define IN_CLASSA_MAX 128 ++ ++#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) ++#define IN_CLASSB_NET 0xffff0000 ++#define IN_CLASSB_NSHIFT 16 ++#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) ++#define IN_CLASSB_MAX 65536 ++ ++#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) ++#define IN_CLASSC_NET 0xffffff00 ++#define IN_CLASSC_NSHIFT 8 ++#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) ++ ++#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) ++#define IN_MULTICAST(a) IN_CLASSD(a) ++#define IN_MULTICAST_NET 0xF0000000 ++ ++#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000) ++#define IN_BADCLASS(a) IN_EXPERIMENTAL((a)) ++ ++/* Address to accept any incoming messages. */ ++#define INADDR_ANY ((unsigned long int) 0x00000000) ++ ++/* Address to send to all hosts. */ ++#define INADDR_BROADCAST ((unsigned long int) 0xffffffff) ++ ++/* Address indicating an error return. */ ++#define INADDR_NONE ((unsigned long int) 0xffffffff) ++ ++/* Network number for local host loopback. */ ++#define IN_LOOPBACKNET 127 ++ ++/* Address to loopback in software to local host. */ ++#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ ++#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000) ++ ++/* Defines for Multicast INADDR */ ++#define INADDR_UNSPEC_GROUP 0xe0000000U /* 224.0.0.0 */ ++#define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */ ++#define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */ ++#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU /* 224.0.0.255 */ ++#endif ++ ++/* contains the htonl type stuff.. */ ++#include ++ ++ ++#endif /* _LINUX_IN_H */ +diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h +new file mode 100644 +index 0000000..6f3bdee +--- /dev/null ++++ b/include/uapi/linux/in6.h +@@ -0,0 +1,296 @@ ++/* ++ * Types and definitions for AF_INET6 ++ * Linux INET6 implementation ++ * ++ * Authors: ++ * Pedro Roque ++ * ++ * Sources: ++ * IPv6 Program Interfaces for BSD Systems ++ * ++ * ++ * Advanced Sockets API for IPv6 ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_IN6_H ++#define _LINUX_IN6_H ++ ++#include ++#include ++ ++/* ++ * IPv6 address structure ++ */ ++ ++#if __UAPI_DEF_IN6_ADDR ++struct in6_addr { ++ union { ++ __u8 u6_addr8[16]; ++#if __UAPI_DEF_IN6_ADDR_ALT ++ __be16 u6_addr16[8]; ++ __be32 u6_addr32[4]; ++#endif ++ } in6_u; ++#define s6_addr in6_u.u6_addr8 ++#if __UAPI_DEF_IN6_ADDR_ALT ++#define s6_addr16 in6_u.u6_addr16 ++#define s6_addr32 in6_u.u6_addr32 ++#endif ++}; ++#endif /* __UAPI_DEF_IN6_ADDR */ ++ ++#if __UAPI_DEF_SOCKADDR_IN6 ++struct sockaddr_in6 { ++ unsigned short int sin6_family; /* AF_INET6 */ ++ __be16 sin6_port; /* Transport layer port # */ ++ __be32 sin6_flowinfo; /* IPv6 flow information */ ++ struct in6_addr sin6_addr; /* IPv6 address */ ++ __u32 sin6_scope_id; /* scope id (new in RFC2553) */ ++}; ++#endif /* __UAPI_DEF_SOCKADDR_IN6 */ ++ ++#if __UAPI_DEF_IPV6_MREQ ++struct ipv6_mreq { ++ /* IPv6 multicast address of group */ ++ struct in6_addr ipv6mr_multiaddr; ++ ++ /* local IPv6 address of interface */ ++ int ipv6mr_ifindex; ++}; ++#endif /* __UAPI_DEF_IVP6_MREQ */ ++ ++#define ipv6mr_acaddr ipv6mr_multiaddr ++ ++struct in6_flowlabel_req { ++ struct in6_addr flr_dst; ++ __be32 flr_label; ++ __u8 flr_action; ++ __u8 flr_share; ++ __u16 flr_flags; ++ __u16 flr_expires; ++ __u16 flr_linger; ++ __u32 __flr_pad; ++ /* Options in format of IPV6_PKTOPTIONS */ ++}; ++ ++#define IPV6_FL_A_GET 0 ++#define IPV6_FL_A_PUT 1 ++#define IPV6_FL_A_RENEW 2 ++ ++#define IPV6_FL_F_CREATE 1 ++#define IPV6_FL_F_EXCL 2 ++#define IPV6_FL_F_REFLECT 4 ++#define IPV6_FL_F_REMOTE 8 ++ ++#define IPV6_FL_S_NONE 0 ++#define IPV6_FL_S_EXCL 1 ++#define IPV6_FL_S_PROCESS 2 ++#define IPV6_FL_S_USER 3 ++#define IPV6_FL_S_ANY 255 ++ ++ ++/* ++ * Bitmask constant declarations to help applications select out the ++ * flow label and priority fields. ++ * ++ * Note that this are in host byte order while the flowinfo field of ++ * sockaddr_in6 is in network byte order. ++ */ ++ ++#define IPV6_FLOWINFO_FLOWLABEL 0x000fffff ++#define IPV6_FLOWINFO_PRIORITY 0x0ff00000 ++ ++/* These definitions are obsolete */ ++#define IPV6_PRIORITY_UNCHARACTERIZED 0x0000 ++#define IPV6_PRIORITY_FILLER 0x0100 ++#define IPV6_PRIORITY_UNATTENDED 0x0200 ++#define IPV6_PRIORITY_RESERVED1 0x0300 ++#define IPV6_PRIORITY_BULK 0x0400 ++#define IPV6_PRIORITY_RESERVED2 0x0500 ++#define IPV6_PRIORITY_INTERACTIVE 0x0600 ++#define IPV6_PRIORITY_CONTROL 0x0700 ++#define IPV6_PRIORITY_8 0x0800 ++#define IPV6_PRIORITY_9 0x0900 ++#define IPV6_PRIORITY_10 0x0a00 ++#define IPV6_PRIORITY_11 0x0b00 ++#define IPV6_PRIORITY_12 0x0c00 ++#define IPV6_PRIORITY_13 0x0d00 ++#define IPV6_PRIORITY_14 0x0e00 ++#define IPV6_PRIORITY_15 0x0f00 ++ ++/* ++ * IPV6 extension headers ++ */ ++#if __UAPI_DEF_IPPROTO_V6 ++#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ ++#define IPPROTO_ROUTING 43 /* IPv6 routing header */ ++#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ ++#define IPPROTO_ICMPV6 58 /* ICMPv6 */ ++#define IPPROTO_NONE 59 /* IPv6 no next header */ ++#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ ++#define IPPROTO_MH 135 /* IPv6 mobility header */ ++#endif /* __UAPI_DEF_IPPROTO_V6 */ ++ ++/* ++ * IPv6 TLV options. ++ */ ++#define IPV6_TLV_PAD1 0 ++#define IPV6_TLV_PADN 1 ++#define IPV6_TLV_ROUTERALERT 5 ++#define IPV6_TLV_CALIPSO 7 /* RFC 5570 */ ++#define IPV6_TLV_JUMBO 194 ++#define IPV6_TLV_HAO 201 /* home address option */ ++ ++/* ++ * IPV6 socket options ++ */ ++#if __UAPI_DEF_IPV6_OPTIONS ++#define IPV6_ADDRFORM 1 ++#define IPV6_2292PKTINFO 2 ++#define IPV6_2292HOPOPTS 3 ++#define IPV6_2292DSTOPTS 4 ++#define IPV6_2292RTHDR 5 ++#define IPV6_2292PKTOPTIONS 6 ++#define IPV6_CHECKSUM 7 ++#define IPV6_2292HOPLIMIT 8 ++#define IPV6_NEXTHOP 9 ++#define IPV6_AUTHHDR 10 /* obsolete */ ++#define IPV6_FLOWINFO 11 ++ ++#define IPV6_UNICAST_HOPS 16 ++#define IPV6_MULTICAST_IF 17 ++#define IPV6_MULTICAST_HOPS 18 ++#define IPV6_MULTICAST_LOOP 19 ++#define IPV6_ADD_MEMBERSHIP 20 ++#define IPV6_DROP_MEMBERSHIP 21 ++#define IPV6_ROUTER_ALERT 22 ++#define IPV6_MTU_DISCOVER 23 ++#define IPV6_MTU 24 ++#define IPV6_RECVERR 25 ++#define IPV6_V6ONLY 26 ++#define IPV6_JOIN_ANYCAST 27 ++#define IPV6_LEAVE_ANYCAST 28 ++ ++/* IPV6_MTU_DISCOVER values */ ++#define IPV6_PMTUDISC_DONT 0 ++#define IPV6_PMTUDISC_WANT 1 ++#define IPV6_PMTUDISC_DO 2 ++#define IPV6_PMTUDISC_PROBE 3 ++/* same as IPV6_PMTUDISC_PROBE, provided for symetry with IPv4 ++ * also see comments on IP_PMTUDISC_INTERFACE ++ */ ++#define IPV6_PMTUDISC_INTERFACE 4 ++/* weaker version of IPV6_PMTUDISC_INTERFACE, which allows packets to ++ * get fragmented if they exceed the interface mtu ++ */ ++#define IPV6_PMTUDISC_OMIT 5 ++ ++/* Flowlabel */ ++#define IPV6_FLOWLABEL_MGR 32 ++#define IPV6_FLOWINFO_SEND 33 ++ ++#define IPV6_IPSEC_POLICY 34 ++#define IPV6_XFRM_POLICY 35 ++#define IPV6_HDRINCL 36 ++#endif ++ ++/* ++ * Multicast: ++ * Following socket options are shared between IPv4 and IPv6. ++ * ++ * MCAST_JOIN_GROUP 42 ++ * MCAST_BLOCK_SOURCE 43 ++ * MCAST_UNBLOCK_SOURCE 44 ++ * MCAST_LEAVE_GROUP 45 ++ * MCAST_JOIN_SOURCE_GROUP 46 ++ * MCAST_LEAVE_SOURCE_GROUP 47 ++ * MCAST_MSFILTER 48 ++ */ ++ ++/* ++ * Advanced API (RFC3542) (1) ++ * ++ * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c. ++ */ ++ ++#define IPV6_RECVPKTINFO 49 ++#define IPV6_PKTINFO 50 ++#define IPV6_RECVHOPLIMIT 51 ++#define IPV6_HOPLIMIT 52 ++#define IPV6_RECVHOPOPTS 53 ++#define IPV6_HOPOPTS 54 ++#define IPV6_RTHDRDSTOPTS 55 ++#define IPV6_RECVRTHDR 56 ++#define IPV6_RTHDR 57 ++#define IPV6_RECVDSTOPTS 58 ++#define IPV6_DSTOPTS 59 ++#define IPV6_RECVPATHMTU 60 ++#define IPV6_PATHMTU 61 ++#define IPV6_DONTFRAG 62 ++#if 0 /* not yet */ ++#define IPV6_USE_MIN_MTU 63 ++#endif ++ ++/* ++ * Netfilter (1) ++ * ++ * Following socket options are used in ip6_tables; ++ * see include/linux/netfilter_ipv6/ip6_tables.h. ++ * ++ * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO 64 ++ * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES 65 ++ */ ++ ++/* ++ * Advanced API (RFC3542) (2) ++ */ ++#define IPV6_RECVTCLASS 66 ++#define IPV6_TCLASS 67 ++ ++/* ++ * Netfilter (2) ++ * ++ * Following socket options are used in ip6_tables; ++ * see include/linux/netfilter_ipv6/ip6_tables.h. ++ * ++ * IP6T_SO_GET_REVISION_MATCH 68 ++ * IP6T_SO_GET_REVISION_TARGET 69 ++ * IP6T_SO_ORIGINAL_DST 80 ++ */ ++ ++#define IPV6_AUTOFLOWLABEL 70 ++/* RFC5014: Source address selection */ ++#define IPV6_ADDR_PREFERENCES 72 ++ ++#define IPV6_PREFER_SRC_TMP 0x0001 ++#define IPV6_PREFER_SRC_PUBLIC 0x0002 ++#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100 ++#define IPV6_PREFER_SRC_COA 0x0004 ++#define IPV6_PREFER_SRC_HOME 0x0400 ++#define IPV6_PREFER_SRC_CGA 0x0008 ++#define IPV6_PREFER_SRC_NONCGA 0x0800 ++ ++/* RFC5082: Generalized Ttl Security Mechanism */ ++#define IPV6_MINHOPCOUNT 73 ++ ++#define IPV6_ORIGDSTADDR 74 ++#define IPV6_RECVORIGDSTADDR IPV6_ORIGDSTADDR ++#define IPV6_TRANSPARENT 75 ++#define IPV6_UNICAST_IF 76 ++#define IPV6_RECVFRAGSIZE 77 ++ ++/* ++ * Multicast Routing: ++ * see include/uapi/linux/mroute6.h. ++ * ++ * MRT6_BASE 200 ++ * ... ++ * MRT6_MAX ++ */ ++#endif /* _LINUX_IN6_H */ +diff --git a/include/uapi/linux/in_route.h b/include/uapi/linux/in_route.h +new file mode 100644 +index 0000000..b261b8c +--- /dev/null ++++ b/include/uapi/linux/in_route.h +@@ -0,0 +1,32 @@ ++#ifndef _LINUX_IN_ROUTE_H ++#define _LINUX_IN_ROUTE_H ++ ++/* IPv4 routing cache flags */ ++ ++#define RTCF_DEAD RTNH_F_DEAD ++#define RTCF_ONLINK RTNH_F_ONLINK ++ ++/* Obsolete flag. About to be deleted */ ++#define RTCF_NOPMTUDISC RTM_F_NOPMTUDISC ++ ++#define RTCF_NOTIFY 0x00010000 ++#define RTCF_DIRECTDST 0x00020000 /* unused */ ++#define RTCF_REDIRECTED 0x00040000 ++#define RTCF_TPROXY 0x00080000 /* unused */ ++ ++#define RTCF_FAST 0x00200000 /* unused */ ++#define RTCF_MASQ 0x00400000 /* unused */ ++#define RTCF_SNAT 0x00800000 /* unused */ ++#define RTCF_DOREDIRECT 0x01000000 ++#define RTCF_DIRECTSRC 0x04000000 ++#define RTCF_DNAT 0x08000000 ++#define RTCF_BROADCAST 0x10000000 ++#define RTCF_MULTICAST 0x20000000 ++#define RTCF_REJECT 0x40000000 /* unused */ ++#define RTCF_LOCAL 0x80000000 ++ ++#define RTCF_NAT (RTCF_DNAT|RTCF_SNAT) ++ ++#define RT_TOS(tos) ((tos)&IPTOS_TOS_MASK) ++ ++#endif /* _LINUX_IN_ROUTE_H */ +diff --git a/include/uapi/linux/inet_diag.h b/include/uapi/linux/inet_diag.h +new file mode 100644 +index 0000000..bada4d7 +--- /dev/null ++++ b/include/uapi/linux/inet_diag.h +@@ -0,0 +1,196 @@ ++#ifndef _INET_DIAG_H_ ++#define _INET_DIAG_H_ ++ ++#include ++ ++/* Just some random number */ ++#define TCPDIAG_GETSOCK 18 ++#define DCCPDIAG_GETSOCK 19 ++ ++#define INET_DIAG_GETSOCK_MAX 24 ++ ++/* Socket identity */ ++struct inet_diag_sockid { ++ __be16 idiag_sport; ++ __be16 idiag_dport; ++ __be32 idiag_src[4]; ++ __be32 idiag_dst[4]; ++ __u32 idiag_if; ++ __u32 idiag_cookie[2]; ++#define INET_DIAG_NOCOOKIE (~0U) ++}; ++ ++/* Request structure */ ++ ++struct inet_diag_req { ++ __u8 idiag_family; /* Family of addresses. */ ++ __u8 idiag_src_len; ++ __u8 idiag_dst_len; ++ __u8 idiag_ext; /* Query extended information */ ++ ++ struct inet_diag_sockid id; ++ ++ __u32 idiag_states; /* States to dump */ ++ __u32 idiag_dbs; /* Tables to dump (NI) */ ++}; ++ ++struct inet_diag_req_v2 { ++ __u8 sdiag_family; ++ __u8 sdiag_protocol; ++ __u8 idiag_ext; ++ __u8 pad; ++ __u32 idiag_states; ++ struct inet_diag_sockid id; ++}; ++ ++/* ++ * SOCK_RAW sockets require the underlied protocol to be ++ * additionally specified so we can use @pad member for ++ * this, but we can't rename it because userspace programs ++ * still may depend on this name. Instead lets use another ++ * structure definition as an alias for struct ++ * @inet_diag_req_v2. ++ */ ++struct inet_diag_req_raw { ++ __u8 sdiag_family; ++ __u8 sdiag_protocol; ++ __u8 idiag_ext; ++ __u8 sdiag_raw_protocol; ++ __u32 idiag_states; ++ struct inet_diag_sockid id; ++}; ++ ++enum { ++ INET_DIAG_REQ_NONE, ++ INET_DIAG_REQ_BYTECODE, ++}; ++ ++#define INET_DIAG_REQ_MAX INET_DIAG_REQ_BYTECODE ++ ++/* Bytecode is sequence of 4 byte commands followed by variable arguments. ++ * All the commands identified by "code" are conditional jumps forward: ++ * to offset cc+"yes" or to offset cc+"no". "yes" is supposed to be ++ * length of the command and its arguments. ++ */ ++ ++struct inet_diag_bc_op { ++ unsigned char code; ++ unsigned char yes; ++ unsigned short no; ++}; ++ ++enum { ++ INET_DIAG_BC_NOP, ++ INET_DIAG_BC_JMP, ++ INET_DIAG_BC_S_GE, ++ INET_DIAG_BC_S_LE, ++ INET_DIAG_BC_D_GE, ++ INET_DIAG_BC_D_LE, ++ INET_DIAG_BC_AUTO, ++ INET_DIAG_BC_S_COND, ++ INET_DIAG_BC_D_COND, ++ INET_DIAG_BC_DEV_COND, /* u32 ifindex */ ++ INET_DIAG_BC_MARK_COND, ++}; ++ ++struct inet_diag_hostcond { ++ __u8 family; ++ __u8 prefix_len; ++ int port; ++ __be32 addr[0]; ++}; ++ ++struct inet_diag_markcond { ++ __u32 mark; ++ __u32 mask; ++}; ++ ++/* Base info structure. It contains socket identity (addrs/ports/cookie) ++ * and, alas, the information shown by netstat. */ ++struct inet_diag_msg { ++ __u8 idiag_family; ++ __u8 idiag_state; ++ __u8 idiag_timer; ++ __u8 idiag_retrans; ++ ++ struct inet_diag_sockid id; ++ ++ __u32 idiag_expires; ++ __u32 idiag_rqueue; ++ __u32 idiag_wqueue; ++ __u32 idiag_uid; ++ __u32 idiag_inode; ++}; ++ ++/* Extensions */ ++ ++enum { ++ INET_DIAG_NONE, ++ INET_DIAG_MEMINFO, ++ INET_DIAG_INFO, ++ INET_DIAG_VEGASINFO, ++ INET_DIAG_CONG, ++ INET_DIAG_TOS, ++ INET_DIAG_TCLASS, ++ INET_DIAG_SKMEMINFO, ++ INET_DIAG_SHUTDOWN, ++ INET_DIAG_DCTCPINFO, ++ INET_DIAG_PROTOCOL, /* response attribute only */ ++ INET_DIAG_SKV6ONLY, ++ INET_DIAG_LOCALS, ++ INET_DIAG_PEERS, ++ INET_DIAG_PAD, ++ INET_DIAG_MARK, ++ INET_DIAG_BBRINFO, ++ INET_DIAG_CLASS_ID, ++ INET_DIAG_MD5SIG, ++ __INET_DIAG_MAX, ++}; ++ ++#define INET_DIAG_MAX (__INET_DIAG_MAX - 1) ++ ++/* INET_DIAG_MEM */ ++ ++struct inet_diag_meminfo { ++ __u32 idiag_rmem; ++ __u32 idiag_wmem; ++ __u32 idiag_fmem; ++ __u32 idiag_tmem; ++}; ++ ++/* INET_DIAG_VEGASINFO */ ++ ++struct tcpvegas_info { ++ __u32 tcpv_enabled; ++ __u32 tcpv_rttcnt; ++ __u32 tcpv_rtt; ++ __u32 tcpv_minrtt; ++}; ++ ++/* INET_DIAG_DCTCPINFO */ ++ ++struct tcp_dctcp_info { ++ __u16 dctcp_enabled; ++ __u16 dctcp_ce_state; ++ __u32 dctcp_alpha; ++ __u32 dctcp_ab_ecn; ++ __u32 dctcp_ab_tot; ++}; ++ ++/* INET_DIAG_BBRINFO */ ++ ++struct tcp_bbr_info { ++ /* u64 bw: max-filtered BW (app throughput) estimate in Byte per sec: */ ++ __u32 bbr_bw_lo; /* lower 32 bits of bw */ ++ __u32 bbr_bw_hi; /* upper 32 bits of bw */ ++ __u32 bbr_min_rtt; /* min-filtered RTT in uSec */ ++ __u32 bbr_pacing_gain; /* pacing gain shifted left 8 bits */ ++ __u32 bbr_cwnd_gain; /* cwnd gain shifted left 8 bits */ ++}; ++ ++union tcp_cc_info { ++ struct tcpvegas_info vegas; ++ struct tcp_dctcp_info dctcp; ++ struct tcp_bbr_info bbr; ++}; ++#endif /* _INET_DIAG_H_ */ +diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h +new file mode 100644 +index 0000000..1907284 +--- /dev/null ++++ b/include/uapi/linux/ip.h +@@ -0,0 +1,175 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Definitions for the IP protocol. ++ * ++ * Version: @(#)ip.h 1.0.2 04/28/93 ++ * ++ * Authors: Fred N. van Kempen, ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++#ifndef _LINUX_IP_H ++#define _LINUX_IP_H ++#include ++#include ++ ++#define IPTOS_TOS_MASK 0x1E ++#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) ++#define IPTOS_LOWDELAY 0x10 ++#define IPTOS_THROUGHPUT 0x08 ++#define IPTOS_RELIABILITY 0x04 ++#define IPTOS_MINCOST 0x02 ++ ++#define IPTOS_PREC_MASK 0xE0 ++#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) ++#define IPTOS_PREC_NETCONTROL 0xe0 ++#define IPTOS_PREC_INTERNETCONTROL 0xc0 ++#define IPTOS_PREC_CRITIC_ECP 0xa0 ++#define IPTOS_PREC_FLASHOVERRIDE 0x80 ++#define IPTOS_PREC_FLASH 0x60 ++#define IPTOS_PREC_IMMEDIATE 0x40 ++#define IPTOS_PREC_PRIORITY 0x20 ++#define IPTOS_PREC_ROUTINE 0x00 ++ ++ ++/* IP options */ ++#define IPOPT_COPY 0x80 ++#define IPOPT_CLASS_MASK 0x60 ++#define IPOPT_NUMBER_MASK 0x1f ++ ++#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) ++#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) ++#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) ++ ++#define IPOPT_CONTROL 0x00 ++#define IPOPT_RESERVED1 0x20 ++#define IPOPT_MEASUREMENT 0x40 ++#define IPOPT_RESERVED2 0x60 ++ ++#define IPOPT_END (0 |IPOPT_CONTROL) ++#define IPOPT_NOOP (1 |IPOPT_CONTROL) ++#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) ++#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) ++#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) ++#define IPOPT_CIPSO (6 |IPOPT_CONTROL|IPOPT_COPY) ++#define IPOPT_RR (7 |IPOPT_CONTROL) ++#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) ++#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) ++#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) ++ ++#define IPVERSION 4 ++#define MAXTTL 255 ++#define IPDEFTTL 64 ++ ++#define IPOPT_OPTVAL 0 ++#define IPOPT_OLEN 1 ++#define IPOPT_OFFSET 2 ++#define IPOPT_MINOFF 4 ++#define MAX_IPOPTLEN 40 ++#define IPOPT_NOP IPOPT_NOOP ++#define IPOPT_EOL IPOPT_END ++#define IPOPT_TS IPOPT_TIMESTAMP ++ ++#define IPOPT_TS_TSONLY 0 /* timestamps only */ ++#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ ++#define IPOPT_TS_PRESPEC 3 /* specified modules only */ ++ ++#define IPV4_BEET_PHMAXLEN 8 ++ ++struct iphdr { ++#if defined(__LITTLE_ENDIAN_BITFIELD) ++ __u8 ihl:4, ++ version:4; ++#elif defined (__BIG_ENDIAN_BITFIELD) ++ __u8 version:4, ++ ihl:4; ++#else ++#error "Please fix " ++#endif ++ __u8 tos; ++ __be16 tot_len; ++ __be16 id; ++ __be16 frag_off; ++ __u8 ttl; ++ __u8 protocol; ++ __sum16 check; ++ __be32 saddr; ++ __be32 daddr; ++ /*The options start here. */ ++}; ++ ++ ++struct ip_auth_hdr { ++ __u8 nexthdr; ++ __u8 hdrlen; /* This one is measured in 32 bit units! */ ++ __be16 reserved; ++ __be32 spi; ++ __be32 seq_no; /* Sequence number */ ++ __u8 auth_data[0]; /* Variable len but >=4. Mind the 64 bit alignment! */ ++}; ++ ++struct ip_esp_hdr { ++ __be32 spi; ++ __be32 seq_no; /* Sequence number */ ++ __u8 enc_data[0]; /* Variable len but >=8. Mind the 64 bit alignment! */ ++}; ++ ++struct ip_comp_hdr { ++ __u8 nexthdr; ++ __u8 flags; ++ __be16 cpi; ++}; ++ ++struct ip_beet_phdr { ++ __u8 nexthdr; ++ __u8 hdrlen; ++ __u8 padlen; ++ __u8 reserved; ++}; ++ ++/* index values for the variables in ipv4_devconf */ ++enum ++{ ++ IPV4_DEVCONF_FORWARDING=1, ++ IPV4_DEVCONF_MC_FORWARDING, ++ IPV4_DEVCONF_PROXY_ARP, ++ IPV4_DEVCONF_ACCEPT_REDIRECTS, ++ IPV4_DEVCONF_SECURE_REDIRECTS, ++ IPV4_DEVCONF_SEND_REDIRECTS, ++ IPV4_DEVCONF_SHARED_MEDIA, ++ IPV4_DEVCONF_RP_FILTER, ++ IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, ++ IPV4_DEVCONF_BOOTP_RELAY, ++ IPV4_DEVCONF_LOG_MARTIANS, ++ IPV4_DEVCONF_TAG, ++ IPV4_DEVCONF_ARPFILTER, ++ IPV4_DEVCONF_MEDIUM_ID, ++ IPV4_DEVCONF_NOXFRM, ++ IPV4_DEVCONF_NOPOLICY, ++ IPV4_DEVCONF_FORCE_IGMP_VERSION, ++ IPV4_DEVCONF_ARP_ANNOUNCE, ++ IPV4_DEVCONF_ARP_IGNORE, ++ IPV4_DEVCONF_PROMOTE_SECONDARIES, ++ IPV4_DEVCONF_ARP_ACCEPT, ++ IPV4_DEVCONF_ARP_NOTIFY, ++ IPV4_DEVCONF_ACCEPT_LOCAL, ++ IPV4_DEVCONF_SRC_VMARK, ++ IPV4_DEVCONF_PROXY_ARP_PVLAN, ++ IPV4_DEVCONF_ROUTE_LOCALNET, ++ IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL, ++ IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL, ++ IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN, ++ IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST, ++ IPV4_DEVCONF_DROP_GRATUITOUS_ARP, ++ __IPV4_DEVCONF_MAX ++}; ++ ++#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1) ++ ++#endif /* _LINUX_IP_H */ +diff --git a/include/uapi/linux/ip6_tunnel.h b/include/uapi/linux/ip6_tunnel.h +new file mode 100644 +index 0000000..425926c +--- /dev/null ++++ b/include/uapi/linux/ip6_tunnel.h +@@ -0,0 +1,53 @@ ++#ifndef _IP6_TUNNEL_H ++#define _IP6_TUNNEL_H ++ ++#include ++#include /* For IFNAMSIZ. */ ++#include /* For struct in6_addr. */ ++ ++#define IPV6_TLV_TNL_ENCAP_LIMIT 4 ++#define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4 ++ ++/* don't add encapsulation limit if one isn't present in inner packet */ ++#define IP6_TNL_F_IGN_ENCAP_LIMIT 0x1 ++/* copy the traffic class field from the inner packet */ ++#define IP6_TNL_F_USE_ORIG_TCLASS 0x2 ++/* copy the flowlabel from the inner packet */ ++#define IP6_TNL_F_USE_ORIG_FLOWLABEL 0x4 ++/* being used for Mobile IPv6 */ ++#define IP6_TNL_F_MIP6_DEV 0x8 ++/* copy DSCP from the outer packet */ ++#define IP6_TNL_F_RCV_DSCP_COPY 0x10 ++/* copy fwmark from inner packet */ ++#define IP6_TNL_F_USE_ORIG_FWMARK 0x20 ++ ++struct ip6_tnl_parm { ++ char name[IFNAMSIZ]; /* name of tunnel device */ ++ int link; /* ifindex of underlying L2 interface */ ++ __u8 proto; /* tunnel protocol */ ++ __u8 encap_limit; /* encapsulation limit for tunnel */ ++ __u8 hop_limit; /* hop limit for tunnel */ ++ __be32 flowinfo; /* traffic class and flowlabel for tunnel */ ++ __u32 flags; /* tunnel flags */ ++ struct in6_addr laddr; /* local tunnel end-point address */ ++ struct in6_addr raddr; /* remote tunnel end-point address */ ++}; ++ ++struct ip6_tnl_parm2 { ++ char name[IFNAMSIZ]; /* name of tunnel device */ ++ int link; /* ifindex of underlying L2 interface */ ++ __u8 proto; /* tunnel protocol */ ++ __u8 encap_limit; /* encapsulation limit for tunnel */ ++ __u8 hop_limit; /* hop limit for tunnel */ ++ __be32 flowinfo; /* traffic class and flowlabel for tunnel */ ++ __u32 flags; /* tunnel flags */ ++ struct in6_addr laddr; /* local tunnel end-point address */ ++ struct in6_addr raddr; /* remote tunnel end-point address */ ++ ++ __be16 i_flags; ++ __be16 o_flags; ++ __be32 i_key; ++ __be32 o_key; ++}; ++ ++#endif +diff --git a/include/uapi/linux/ipsec.h b/include/uapi/linux/ipsec.h +new file mode 100644 +index 0000000..d17a630 +--- /dev/null ++++ b/include/uapi/linux/ipsec.h +@@ -0,0 +1,47 @@ ++#ifndef _LINUX_IPSEC_H ++#define _LINUX_IPSEC_H ++ ++/* The definitions, required to talk to KAME racoon IKE. */ ++ ++#include ++ ++#define IPSEC_PORT_ANY 0 ++#define IPSEC_ULPROTO_ANY 255 ++#define IPSEC_PROTO_ANY 255 ++ ++enum { ++ IPSEC_MODE_ANY = 0, /* We do not support this for SA */ ++ IPSEC_MODE_TRANSPORT = 1, ++ IPSEC_MODE_TUNNEL = 2, ++ IPSEC_MODE_BEET = 3 ++}; ++ ++enum { ++ IPSEC_DIR_ANY = 0, ++ IPSEC_DIR_INBOUND = 1, ++ IPSEC_DIR_OUTBOUND = 2, ++ IPSEC_DIR_FWD = 3, /* It is our own */ ++ IPSEC_DIR_MAX = 4, ++ IPSEC_DIR_INVALID = 5 ++}; ++ ++enum { ++ IPSEC_POLICY_DISCARD = 0, ++ IPSEC_POLICY_NONE = 1, ++ IPSEC_POLICY_IPSEC = 2, ++ IPSEC_POLICY_ENTRUST = 3, ++ IPSEC_POLICY_BYPASS = 4 ++}; ++ ++enum { ++ IPSEC_LEVEL_DEFAULT = 0, ++ IPSEC_LEVEL_USE = 1, ++ IPSEC_LEVEL_REQUIRE = 2, ++ IPSEC_LEVEL_UNIQUE = 3 ++}; ++ ++#define IPSEC_MANUAL_REQID_MAX 0x3fff ++ ++#define IPSEC_REPLAYWSIZE 32 ++ ++#endif /* _LINUX_IPSEC_H */ +diff --git a/include/uapi/linux/kernel.h b/include/uapi/linux/kernel.h +new file mode 100644 +index 0000000..527549f +--- /dev/null ++++ b/include/uapi/linux/kernel.h +@@ -0,0 +1,14 @@ ++#ifndef _LINUX_KERNEL_H ++#define _LINUX_KERNEL_H ++ ++#include ++ ++/* ++ * 'kernel.h' contains some often-used function prototypes etc ++ */ ++#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) ++#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) ++ ++#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) ++ ++#endif /* _LINUX_KERNEL_H */ +diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h +new file mode 100644 +index 0000000..8a80007 +--- /dev/null ++++ b/include/uapi/linux/l2tp.h +@@ -0,0 +1,199 @@ ++/* ++ * L2TP-over-IP socket for L2TPv3. ++ * ++ * Author: James Chapman ++ */ ++ ++#ifndef _LINUX_L2TP_H_ ++#define _LINUX_L2TP_H_ ++ ++#include ++#include ++#include ++#include ++ ++#define IPPROTO_L2TP 115 ++ ++/** ++ * struct sockaddr_l2tpip - the sockaddr structure for L2TP-over-IP sockets ++ * @l2tp_family: address family number AF_L2TPIP. ++ * @l2tp_addr: protocol specific address information ++ * @l2tp_conn_id: connection id of tunnel ++ */ ++#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ ++struct sockaddr_l2tpip { ++ /* The first fields must match struct sockaddr_in */ ++ __kernel_sa_family_t l2tp_family; /* AF_INET */ ++ __be16 l2tp_unused; /* INET port number (unused) */ ++ struct in_addr l2tp_addr; /* Internet address */ ++ ++ __u32 l2tp_conn_id; /* Connection ID of tunnel */ ++ ++ /* Pad to size of `struct sockaddr'. */ ++ unsigned char __pad[__SOCK_SIZE__ - ++ sizeof(__kernel_sa_family_t) - ++ sizeof(__be16) - sizeof(struct in_addr) - ++ sizeof(__u32)]; ++}; ++ ++/** ++ * struct sockaddr_l2tpip6 - the sockaddr structure for L2TP-over-IPv6 sockets ++ * @l2tp_family: address family number AF_L2TPIP. ++ * @l2tp_addr: protocol specific address information ++ * @l2tp_conn_id: connection id of tunnel ++ */ ++struct sockaddr_l2tpip6 { ++ /* The first fields must match struct sockaddr_in6 */ ++ __kernel_sa_family_t l2tp_family; /* AF_INET6 */ ++ __be16 l2tp_unused; /* INET port number (unused) */ ++ __be32 l2tp_flowinfo; /* IPv6 flow information */ ++ struct in6_addr l2tp_addr; /* IPv6 address */ ++ __u32 l2tp_scope_id; /* scope id (new in RFC2553) */ ++ __u32 l2tp_conn_id; /* Connection ID of tunnel */ ++}; ++ ++/***************************************************************************** ++ * NETLINK_GENERIC netlink family. ++ *****************************************************************************/ ++ ++/* ++ * Commands. ++ * Valid TLVs of each command are:- ++ * TUNNEL_CREATE - CONN_ID, pw_type, netns, ifname, ipinfo, udpinfo, udpcsum, vlanid ++ * TUNNEL_DELETE - CONN_ID ++ * TUNNEL_MODIFY - CONN_ID, udpcsum ++ * TUNNEL_GETSTATS - CONN_ID, (stats) ++ * TUNNEL_GET - CONN_ID, (...) ++ * SESSION_CREATE - SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec ++ * SESSION_DELETE - SESSION_ID ++ * SESSION_MODIFY - SESSION_ID, data_seq ++ * SESSION_GET - SESSION_ID, (...) ++ * SESSION_GETSTATS - SESSION_ID, (stats) ++ * ++ */ ++enum { ++ L2TP_CMD_NOOP, ++ L2TP_CMD_TUNNEL_CREATE, ++ L2TP_CMD_TUNNEL_DELETE, ++ L2TP_CMD_TUNNEL_MODIFY, ++ L2TP_CMD_TUNNEL_GET, ++ L2TP_CMD_SESSION_CREATE, ++ L2TP_CMD_SESSION_DELETE, ++ L2TP_CMD_SESSION_MODIFY, ++ L2TP_CMD_SESSION_GET, ++ __L2TP_CMD_MAX, ++}; ++ ++#define L2TP_CMD_MAX (__L2TP_CMD_MAX - 1) ++ ++/* ++ * ATTR types defined for L2TP ++ */ ++enum { ++ L2TP_ATTR_NONE, /* no data */ ++ L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ ++ L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ ++ L2TP_ATTR_OFFSET, /* u16 */ ++ L2TP_ATTR_DATA_SEQ, /* u16 */ ++ L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ ++ L2TP_ATTR_L2SPEC_LEN, /* u8, enum l2tp_l2spec_type */ ++ L2TP_ATTR_PROTO_VERSION, /* u8 */ ++ L2TP_ATTR_IFNAME, /* string */ ++ L2TP_ATTR_CONN_ID, /* u32 */ ++ L2TP_ATTR_PEER_CONN_ID, /* u32 */ ++ L2TP_ATTR_SESSION_ID, /* u32 */ ++ L2TP_ATTR_PEER_SESSION_ID, /* u32 */ ++ L2TP_ATTR_UDP_CSUM, /* u8 */ ++ L2TP_ATTR_VLAN_ID, /* u16 */ ++ L2TP_ATTR_COOKIE, /* 0, 4 or 8 bytes */ ++ L2TP_ATTR_PEER_COOKIE, /* 0, 4 or 8 bytes */ ++ L2TP_ATTR_DEBUG, /* u32, enum l2tp_debug_flags */ ++ L2TP_ATTR_RECV_SEQ, /* u8 */ ++ L2TP_ATTR_SEND_SEQ, /* u8 */ ++ L2TP_ATTR_LNS_MODE, /* u8 */ ++ L2TP_ATTR_USING_IPSEC, /* u8 */ ++ L2TP_ATTR_RECV_TIMEOUT, /* msec */ ++ L2TP_ATTR_FD, /* int */ ++ L2TP_ATTR_IP_SADDR, /* u32 */ ++ L2TP_ATTR_IP_DADDR, /* u32 */ ++ L2TP_ATTR_UDP_SPORT, /* u16 */ ++ L2TP_ATTR_UDP_DPORT, /* u16 */ ++ L2TP_ATTR_MTU, /* u16 */ ++ L2TP_ATTR_MRU, /* u16 */ ++ L2TP_ATTR_STATS, /* nested */ ++ L2TP_ATTR_IP6_SADDR, /* struct in6_addr */ ++ L2TP_ATTR_IP6_DADDR, /* struct in6_addr */ ++ L2TP_ATTR_UDP_ZERO_CSUM6_TX, /* flag */ ++ L2TP_ATTR_UDP_ZERO_CSUM6_RX, /* flag */ ++ L2TP_ATTR_PAD, ++ __L2TP_ATTR_MAX, ++}; ++ ++#define L2TP_ATTR_MAX (__L2TP_ATTR_MAX - 1) ++ ++/* Nested in L2TP_ATTR_STATS */ ++enum { ++ L2TP_ATTR_STATS_NONE, /* no data */ ++ L2TP_ATTR_TX_PACKETS, /* u64 */ ++ L2TP_ATTR_TX_BYTES, /* u64 */ ++ L2TP_ATTR_TX_ERRORS, /* u64 */ ++ L2TP_ATTR_RX_PACKETS, /* u64 */ ++ L2TP_ATTR_RX_BYTES, /* u64 */ ++ L2TP_ATTR_RX_SEQ_DISCARDS, /* u64 */ ++ L2TP_ATTR_RX_OOS_PACKETS, /* u64 */ ++ L2TP_ATTR_RX_ERRORS, /* u64 */ ++ L2TP_ATTR_STATS_PAD, ++ __L2TP_ATTR_STATS_MAX, ++}; ++ ++#define L2TP_ATTR_STATS_MAX (__L2TP_ATTR_STATS_MAX - 1) ++ ++enum l2tp_pwtype { ++ L2TP_PWTYPE_NONE = 0x0000, ++ L2TP_PWTYPE_ETH_VLAN = 0x0004, ++ L2TP_PWTYPE_ETH = 0x0005, ++ L2TP_PWTYPE_PPP = 0x0007, ++ L2TP_PWTYPE_PPP_AC = 0x0008, ++ L2TP_PWTYPE_IP = 0x000b, ++ __L2TP_PWTYPE_MAX ++}; ++ ++enum l2tp_l2spec_type { ++ L2TP_L2SPECTYPE_NONE, ++ L2TP_L2SPECTYPE_DEFAULT, ++}; ++ ++enum l2tp_encap_type { ++ L2TP_ENCAPTYPE_UDP, ++ L2TP_ENCAPTYPE_IP, ++}; ++ ++enum l2tp_seqmode { ++ L2TP_SEQ_NONE = 0, ++ L2TP_SEQ_IP = 1, ++ L2TP_SEQ_ALL = 2, ++}; ++ ++/** ++ * enum l2tp_debug_flags - debug message categories for L2TP tunnels/sessions ++ * ++ * @L2TP_MSG_DEBUG: verbose debug (if compiled in) ++ * @L2TP_MSG_CONTROL: userspace - kernel interface ++ * @L2TP_MSG_SEQ: sequence numbers ++ * @L2TP_MSG_DATA: data packets ++ */ ++enum l2tp_debug_flags { ++ L2TP_MSG_DEBUG = (1 << 0), ++ L2TP_MSG_CONTROL = (1 << 1), ++ L2TP_MSG_SEQ = (1 << 2), ++ L2TP_MSG_DATA = (1 << 3), ++}; ++ ++/* ++ * NETLINK_GENERIC related info ++ */ ++#define L2TP_GENL_NAME "l2tp" ++#define L2TP_GENL_VERSION 0x1 ++#define L2TP_GENL_MCGROUP "l2tp" ++ ++#endif /* _LINUX_L2TP_H_ */ +diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h +new file mode 100644 +index 0000000..f38571d +--- /dev/null ++++ b/include/uapi/linux/libc-compat.h +@@ -0,0 +1,213 @@ ++/* ++ * Compatibility interface for userspace libc header coordination: ++ * ++ * Define compatibility macros that are used to control the inclusion or ++ * exclusion of UAPI structures and definitions in coordination with another ++ * userspace C library. ++ * ++ * This header is intended to solve the problem of UAPI definitions that ++ * conflict with userspace definitions. If a UAPI header has such conflicting ++ * definitions then the solution is as follows: ++ * ++ * * Synchronize the UAPI header and the libc headers so either one can be ++ * used and such that the ABI is preserved. If this is not possible then ++ * no simple compatibility interface exists (you need to write translating ++ * wrappers and rename things) and you can't use this interface. ++ * ++ * Then follow this process: ++ * ++ * (a) Include libc-compat.h in the UAPI header. ++ * e.g. #include ++ * This include must be as early as possible. ++ * ++ * (b) In libc-compat.h add enough code to detect that the comflicting ++ * userspace libc header has been included first. ++ * ++ * (c) If the userspace libc header has been included first define a set of ++ * guard macros of the form __UAPI_DEF_FOO and set their values to 1, else ++ * set their values to 0. ++ * ++ * (d) Back in the UAPI header with the conflicting definitions, guard the ++ * definitions with: ++ * #if __UAPI_DEF_FOO ++ * ... ++ * #endif ++ * ++ * This fixes the situation where the linux headers are included *after* the ++ * libc headers. To fix the problem with the inclusion in the other order the ++ * userspace libc headers must be fixed like this: ++ * ++ * * For all definitions that conflict with kernel definitions wrap those ++ * defines in the following: ++ * #if !__UAPI_DEF_FOO ++ * ... ++ * #endif ++ * ++ * This prevents the redefinition of a construct already defined by the kernel. ++ */ ++#ifndef _LIBC_COMPAT_H ++#define _LIBC_COMPAT_H ++ ++/* We have included glibc headers... */ ++#if defined(__GLIBC__) ++ ++/* Coordinate with glibc net/if.h header. */ ++#if defined(_NET_IF_H) && defined(__USE_MISC) ++ ++/* GLIBC headers included first so don't define anything ++ * that would already be defined. */ ++ ++#define __UAPI_DEF_IF_IFCONF 0 ++#define __UAPI_DEF_IF_IFMAP 0 ++#define __UAPI_DEF_IF_IFNAMSIZ 0 ++#define __UAPI_DEF_IF_IFREQ 0 ++/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ ++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 ++/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ ++#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO ++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 ++#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ ++ ++#else /* _NET_IF_H */ ++ ++/* Linux headers included first, and we must define everything ++ * we need. The expectation is that glibc will check the ++ * __UAPI_DEF_* defines and adjust appropriately. */ ++ ++#define __UAPI_DEF_IF_IFCONF 1 ++#define __UAPI_DEF_IF_IFMAP 1 ++#define __UAPI_DEF_IF_IFNAMSIZ 1 ++#define __UAPI_DEF_IF_IFREQ 1 ++/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ ++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 ++/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ ++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 ++ ++#endif /* _NET_IF_H */ ++ ++/* Coordinate with glibc netinet/in.h header. */ ++#if defined(_NETINET_IN_H) ++ ++/* GLIBC headers included first so don't define anything ++ * that would already be defined. */ ++#define __UAPI_DEF_IN_ADDR 0 ++#define __UAPI_DEF_IN_IPPROTO 0 ++#define __UAPI_DEF_IN_PKTINFO 0 ++#define __UAPI_DEF_IP_MREQ 0 ++#define __UAPI_DEF_SOCKADDR_IN 0 ++#define __UAPI_DEF_IN_CLASS 0 ++ ++#define __UAPI_DEF_IN6_ADDR 0 ++/* The exception is the in6_addr macros which must be defined ++ * if the glibc code didn't define them. This guard matches ++ * the guard in glibc/inet/netinet/in.h which defines the ++ * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */ ++#if defined(__USE_MISC) || defined (__USE_GNU) ++#define __UAPI_DEF_IN6_ADDR_ALT 0 ++#else ++#define __UAPI_DEF_IN6_ADDR_ALT 1 ++#endif ++#define __UAPI_DEF_SOCKADDR_IN6 0 ++#define __UAPI_DEF_IPV6_MREQ 0 ++#define __UAPI_DEF_IPPROTO_V6 0 ++#define __UAPI_DEF_IPV6_OPTIONS 0 ++#define __UAPI_DEF_IN6_PKTINFO 0 ++#define __UAPI_DEF_IP6_MTUINFO 0 ++ ++#else ++ ++/* Linux headers included first, and we must define everything ++ * we need. The expectation is that glibc will check the ++ * __UAPI_DEF_* defines and adjust appropriately. */ ++#define __UAPI_DEF_IN_ADDR 1 ++#define __UAPI_DEF_IN_IPPROTO 1 ++#define __UAPI_DEF_IN_PKTINFO 1 ++#define __UAPI_DEF_IP_MREQ 1 ++#define __UAPI_DEF_SOCKADDR_IN 1 ++#define __UAPI_DEF_IN_CLASS 1 ++ ++#define __UAPI_DEF_IN6_ADDR 1 ++/* We unconditionally define the in6_addr macros and glibc must ++ * coordinate. */ ++#define __UAPI_DEF_IN6_ADDR_ALT 1 ++#define __UAPI_DEF_SOCKADDR_IN6 1 ++#define __UAPI_DEF_IPV6_MREQ 1 ++#define __UAPI_DEF_IPPROTO_V6 1 ++#define __UAPI_DEF_IPV6_OPTIONS 1 ++#define __UAPI_DEF_IN6_PKTINFO 1 ++#define __UAPI_DEF_IP6_MTUINFO 1 ++ ++#endif /* _NETINET_IN_H */ ++ ++/* Coordinate with glibc netipx/ipx.h header. */ ++#if defined(__NETIPX_IPX_H) ++ ++#define __UAPI_DEF_SOCKADDR_IPX 0 ++#define __UAPI_DEF_IPX_ROUTE_DEFINITION 0 ++#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 0 ++#define __UAPI_DEF_IPX_CONFIG_DATA 0 ++#define __UAPI_DEF_IPX_ROUTE_DEF 0 ++ ++#else /* defined(__NETIPX_IPX_H) */ ++ ++#define __UAPI_DEF_SOCKADDR_IPX 1 ++#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 ++#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 ++#define __UAPI_DEF_IPX_CONFIG_DATA 1 ++#define __UAPI_DEF_IPX_ROUTE_DEF 1 ++ ++#endif /* defined(__NETIPX_IPX_H) */ ++ ++/* Definitions for xattr.h */ ++#if defined(_SYS_XATTR_H) ++#define __UAPI_DEF_XATTR 0 ++#else ++#define __UAPI_DEF_XATTR 1 ++#endif ++ ++/* If we did not see any headers from any supported C libraries, ++ * or we are being included in the kernel, then define everything ++ * that we need. */ ++#else /* !defined(__GLIBC__) */ ++ ++/* Definitions for if.h */ ++#define __UAPI_DEF_IF_IFCONF 1 ++#define __UAPI_DEF_IF_IFMAP 1 ++#define __UAPI_DEF_IF_IFNAMSIZ 1 ++#define __UAPI_DEF_IF_IFREQ 1 ++/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ ++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 ++/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ ++#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 ++ ++/* Definitions for in.h */ ++#define __UAPI_DEF_IN_ADDR 1 ++#define __UAPI_DEF_IN_IPPROTO 1 ++#define __UAPI_DEF_IN_PKTINFO 1 ++#define __UAPI_DEF_IP_MREQ 1 ++#define __UAPI_DEF_SOCKADDR_IN 1 ++#define __UAPI_DEF_IN_CLASS 1 ++ ++/* Definitions for in6.h */ ++#define __UAPI_DEF_IN6_ADDR 1 ++#define __UAPI_DEF_IN6_ADDR_ALT 1 ++#define __UAPI_DEF_SOCKADDR_IN6 1 ++#define __UAPI_DEF_IPV6_MREQ 1 ++#define __UAPI_DEF_IPPROTO_V6 1 ++#define __UAPI_DEF_IPV6_OPTIONS 1 ++#define __UAPI_DEF_IN6_PKTINFO 1 ++#define __UAPI_DEF_IP6_MTUINFO 1 ++ ++/* Definitions for ipx.h */ ++#define __UAPI_DEF_SOCKADDR_IPX 1 ++#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 ++#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 ++#define __UAPI_DEF_IPX_CONFIG_DATA 1 ++#define __UAPI_DEF_IPX_ROUTE_DEF 1 ++ ++/* Definitions for xattr.h */ ++#define __UAPI_DEF_XATTR 1 ++ ++#endif /* __GLIBC__ */ ++ ++#endif /* _LIBC_COMPAT_H */ +diff --git a/include/uapi/linux/limits.h b/include/uapi/linux/limits.h +new file mode 100644 +index 0000000..2d0f941 +--- /dev/null ++++ b/include/uapi/linux/limits.h +@@ -0,0 +1,20 @@ ++#ifndef _LINUX_LIMITS_H ++#define _LINUX_LIMITS_H ++ ++#define NR_OPEN 1024 ++ ++#define NGROUPS_MAX 65536 /* supplemental group IDs are available */ ++#define ARG_MAX 131072 /* # bytes of args + environ for exec() */ ++#define LINK_MAX 127 /* # links a file may have */ ++#define MAX_CANON 255 /* size of the canonical input queue */ ++#define MAX_INPUT 255 /* size of the type-ahead buffer */ ++#define NAME_MAX 255 /* # chars in a file name */ ++#define PATH_MAX 4096 /* # chars in a path name including nul */ ++#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ ++#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ ++#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ ++#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ ++ ++#define RTSIG_MAX 32 ++ ++#endif +diff --git a/include/uapi/linux/lwtunnel.h b/include/uapi/linux/lwtunnel.h +new file mode 100644 +index 0000000..3298426 +--- /dev/null ++++ b/include/uapi/linux/lwtunnel.h +@@ -0,0 +1,70 @@ ++#ifndef _LWTUNNEL_H_ ++#define _LWTUNNEL_H_ ++ ++#include ++ ++enum lwtunnel_encap_types { ++ LWTUNNEL_ENCAP_NONE, ++ LWTUNNEL_ENCAP_MPLS, ++ LWTUNNEL_ENCAP_IP, ++ LWTUNNEL_ENCAP_ILA, ++ LWTUNNEL_ENCAP_IP6, ++ LWTUNNEL_ENCAP_SEG6, ++ LWTUNNEL_ENCAP_BPF, ++ LWTUNNEL_ENCAP_SEG6_LOCAL, ++ __LWTUNNEL_ENCAP_MAX, ++}; ++ ++#define LWTUNNEL_ENCAP_MAX (__LWTUNNEL_ENCAP_MAX - 1) ++ ++enum lwtunnel_ip_t { ++ LWTUNNEL_IP_UNSPEC, ++ LWTUNNEL_IP_ID, ++ LWTUNNEL_IP_DST, ++ LWTUNNEL_IP_SRC, ++ LWTUNNEL_IP_TTL, ++ LWTUNNEL_IP_TOS, ++ LWTUNNEL_IP_FLAGS, ++ LWTUNNEL_IP_PAD, ++ __LWTUNNEL_IP_MAX, ++}; ++ ++#define LWTUNNEL_IP_MAX (__LWTUNNEL_IP_MAX - 1) ++ ++enum lwtunnel_ip6_t { ++ LWTUNNEL_IP6_UNSPEC, ++ LWTUNNEL_IP6_ID, ++ LWTUNNEL_IP6_DST, ++ LWTUNNEL_IP6_SRC, ++ LWTUNNEL_IP6_HOPLIMIT, ++ LWTUNNEL_IP6_TC, ++ LWTUNNEL_IP6_FLAGS, ++ LWTUNNEL_IP6_PAD, ++ __LWTUNNEL_IP6_MAX, ++}; ++ ++#define LWTUNNEL_IP6_MAX (__LWTUNNEL_IP6_MAX - 1) ++ ++enum { ++ LWT_BPF_PROG_UNSPEC, ++ LWT_BPF_PROG_FD, ++ LWT_BPF_PROG_NAME, ++ __LWT_BPF_PROG_MAX, ++}; ++ ++#define LWT_BPF_PROG_MAX (__LWT_BPF_PROG_MAX - 1) ++ ++enum { ++ LWT_BPF_UNSPEC, ++ LWT_BPF_IN, ++ LWT_BPF_OUT, ++ LWT_BPF_XMIT, ++ LWT_BPF_XMIT_HEADROOM, ++ __LWT_BPF_MAX, ++}; ++ ++#define LWT_BPF_MAX (__LWT_BPF_MAX - 1) ++ ++#define LWT_BPF_MAX_HEADROOM 256 ++ ++#endif /* _LWTUNNEL_H_ */ +diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h +new file mode 100644 +index 0000000..e439565 +--- /dev/null ++++ b/include/uapi/linux/magic.h +@@ -0,0 +1,91 @@ ++#ifndef __LINUX_MAGIC_H__ ++#define __LINUX_MAGIC_H__ ++ ++#define ADFS_SUPER_MAGIC 0xadf5 ++#define AFFS_SUPER_MAGIC 0xadff ++#define AFS_SUPER_MAGIC 0x5346414F ++#define AUTOFS_SUPER_MAGIC 0x0187 ++#define CODA_SUPER_MAGIC 0x73757245 ++#define CRAMFS_MAGIC 0x28cd3d45 /* some random number */ ++#define CRAMFS_MAGIC_WEND 0x453dcd28 /* magic number with the wrong endianess */ ++#define DEBUGFS_MAGIC 0x64626720 ++#define SECURITYFS_MAGIC 0x73636673 ++#define SELINUX_MAGIC 0xf97cff8c ++#define SMACK_MAGIC 0x43415d53 /* "SMAC" */ ++#define RAMFS_MAGIC 0x858458f6 /* some random number */ ++#define TMPFS_MAGIC 0x01021994 ++#define HUGETLBFS_MAGIC 0x958458f6 /* some random number */ ++#define SQUASHFS_MAGIC 0x73717368 ++#define ECRYPTFS_SUPER_MAGIC 0xf15f ++#define EFS_SUPER_MAGIC 0x414A53 ++#define EXT2_SUPER_MAGIC 0xEF53 ++#define EXT3_SUPER_MAGIC 0xEF53 ++#define XENFS_SUPER_MAGIC 0xabba1974 ++#define EXT4_SUPER_MAGIC 0xEF53 ++#define BTRFS_SUPER_MAGIC 0x9123683E ++#define NILFS_SUPER_MAGIC 0x3434 ++#define F2FS_SUPER_MAGIC 0xF2F52010 ++#define HPFS_SUPER_MAGIC 0xf995e849 ++#define ISOFS_SUPER_MAGIC 0x9660 ++#define JFFS2_SUPER_MAGIC 0x72b6 ++#define PSTOREFS_MAGIC 0x6165676C ++#define EFIVARFS_MAGIC 0xde5e81e4 ++#define HOSTFS_SUPER_MAGIC 0x00c0ffee ++#define OVERLAYFS_SUPER_MAGIC 0x794c7630 ++ ++#define MINIX_SUPER_MAGIC 0x137F /* minix v1 fs, 14 char names */ ++#define MINIX_SUPER_MAGIC2 0x138F /* minix v1 fs, 30 char names */ ++#define MINIX2_SUPER_MAGIC 0x2468 /* minix v2 fs, 14 char names */ ++#define MINIX2_SUPER_MAGIC2 0x2478 /* minix v2 fs, 30 char names */ ++#define MINIX3_SUPER_MAGIC 0x4d5a /* minix v3 fs, 60 char names */ ++ ++#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */ ++#define NCP_SUPER_MAGIC 0x564c /* Guess, what 0x564c is :-) */ ++#define NFS_SUPER_MAGIC 0x6969 ++#define OCFS2_SUPER_MAGIC 0x7461636f ++#define OPENPROM_SUPER_MAGIC 0x9fa1 ++#define QNX4_SUPER_MAGIC 0x002f /* qnx4 fs detection */ ++#define QNX6_SUPER_MAGIC 0x68191122 /* qnx6 fs detection */ ++ ++#define REISERFS_SUPER_MAGIC 0x52654973 /* used by gcc */ ++ /* used by file system utilities that ++ look at the superblock, etc. */ ++#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs" ++#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" ++#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" ++ ++#define SMB_SUPER_MAGIC 0x517B ++#define CGROUP_SUPER_MAGIC 0x27e0eb ++#define CGROUP2_SUPER_MAGIC 0x63677270 ++ ++#define RDTGROUP_SUPER_MAGIC 0x7655821 ++ ++#define STACK_END_MAGIC 0x57AC6E9D ++ ++#define TRACEFS_MAGIC 0x74726163 ++ ++#define V9FS_MAGIC 0x01021997 ++ ++#define BDEVFS_MAGIC 0x62646576 ++#define DAXFS_MAGIC 0x64646178 ++#define BINFMTFS_MAGIC 0x42494e4d ++#define DEVPTS_SUPER_MAGIC 0x1cd1 ++#define FUTEXFS_SUPER_MAGIC 0xBAD1DEA ++#define PIPEFS_MAGIC 0x50495045 ++#define PROC_SUPER_MAGIC 0x9fa0 ++#define SOCKFS_MAGIC 0x534F434B ++#define SYSFS_MAGIC 0x62656572 ++#define USBDEVICE_SUPER_MAGIC 0x9fa2 ++#define MTD_INODE_FS_MAGIC 0x11307854 ++#define ANON_INODE_FS_MAGIC 0x09041934 ++#define BTRFS_TEST_MAGIC 0x73727279 ++#define NSFS_MAGIC 0x6e736673 ++#define BPF_FS_MAGIC 0xcafe4a11 ++#define AAFS_MAGIC 0x5a3c69f0 ++ ++/* Since UDF 2.01 is ISO 13346 based... */ ++#define UDF_SUPER_MAGIC 0x15013346 ++#define BALLOON_KVM_MAGIC 0x13661366 ++#define ZSMALLOC_MAGIC 0x58295829 ++ ++#endif /* __LINUX_MAGIC_H__ */ +diff --git a/include/uapi/linux/mpls.h b/include/uapi/linux/mpls.h +new file mode 100644 +index 0000000..bf5b625 +--- /dev/null ++++ b/include/uapi/linux/mpls.h +@@ -0,0 +1,76 @@ ++#ifndef _MPLS_H ++#define _MPLS_H ++ ++#include ++#include ++ ++/* Reference: RFC 5462, RFC 3032 ++ * ++ * 0 1 2 3 ++ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * | Label | TC |S| TTL | ++ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++ * ++ * Label: Label Value, 20 bits ++ * TC: Traffic Class field, 3 bits ++ * S: Bottom of Stack, 1 bit ++ * TTL: Time to Live, 8 bits ++ */ ++ ++struct mpls_label { ++ __be32 entry; ++}; ++ ++#define MPLS_LS_LABEL_MASK 0xFFFFF000 ++#define MPLS_LS_LABEL_SHIFT 12 ++#define MPLS_LS_TC_MASK 0x00000E00 ++#define MPLS_LS_TC_SHIFT 9 ++#define MPLS_LS_S_MASK 0x00000100 ++#define MPLS_LS_S_SHIFT 8 ++#define MPLS_LS_TTL_MASK 0x000000FF ++#define MPLS_LS_TTL_SHIFT 0 ++ ++/* Reserved labels */ ++#define MPLS_LABEL_IPV4NULL 0 /* RFC3032 */ ++#define MPLS_LABEL_RTALERT 1 /* RFC3032 */ ++#define MPLS_LABEL_IPV6NULL 2 /* RFC3032 */ ++#define MPLS_LABEL_IMPLNULL 3 /* RFC3032 */ ++#define MPLS_LABEL_ENTROPY 7 /* RFC6790 */ ++#define MPLS_LABEL_GAL 13 /* RFC5586 */ ++#define MPLS_LABEL_OAMALERT 14 /* RFC3429 */ ++#define MPLS_LABEL_EXTENSION 15 /* RFC7274 */ ++ ++#define MPLS_LABEL_FIRST_UNRESERVED 16 /* RFC3032 */ ++ ++/* These are embedded into IFLA_STATS_AF_SPEC: ++ * [IFLA_STATS_AF_SPEC] ++ * -> [AF_MPLS] ++ * -> [MPLS_STATS_xxx] ++ * ++ * Attributes: ++ * [MPLS_STATS_LINK] = { ++ * struct mpls_link_stats ++ * } ++ */ ++enum { ++ MPLS_STATS_UNSPEC, /* also used as 64bit pad attribute */ ++ MPLS_STATS_LINK, ++ __MPLS_STATS_MAX, ++}; ++ ++#define MPLS_STATS_MAX (__MPLS_STATS_MAX - 1) ++ ++struct mpls_link_stats { ++ __u64 rx_packets; /* total packets received */ ++ __u64 tx_packets; /* total packets transmitted */ ++ __u64 rx_bytes; /* total bytes received */ ++ __u64 tx_bytes; /* total bytes transmitted */ ++ __u64 rx_errors; /* bad packets received */ ++ __u64 tx_errors; /* packet transmit problems */ ++ __u64 rx_dropped; /* packet dropped on receive */ ++ __u64 tx_dropped; /* packet dropped on transmit */ ++ __u64 rx_noroute; /* no route for packet dest */ ++}; ++ ++#endif /* _MPLS_H */ +diff --git a/include/uapi/linux/mpls_iptunnel.h b/include/uapi/linux/mpls_iptunnel.h +new file mode 100644 +index 0000000..1a0e57b +--- /dev/null ++++ b/include/uapi/linux/mpls_iptunnel.h +@@ -0,0 +1,30 @@ ++/* ++ * mpls tunnel api ++ * ++ * Authors: ++ * Roopa Prabhu ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_MPLS_IPTUNNEL_H ++#define _LINUX_MPLS_IPTUNNEL_H ++ ++/* MPLS tunnel attributes ++ * [RTA_ENCAP] = { ++ * [MPLS_IPTUNNEL_DST] ++ * [MPLS_IPTUNNEL_TTL] ++ * } ++ */ ++enum { ++ MPLS_IPTUNNEL_UNSPEC, ++ MPLS_IPTUNNEL_DST, ++ MPLS_IPTUNNEL_TTL, ++ __MPLS_IPTUNNEL_MAX, ++}; ++#define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1) ++ ++#endif /* _LINUX_MPLS_IPTUNNEL_H */ +diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h +new file mode 100644 +index 0000000..3199d28 +--- /dev/null ++++ b/include/uapi/linux/neighbour.h +@@ -0,0 +1,171 @@ ++#ifndef __LINUX_NEIGHBOUR_H ++#define __LINUX_NEIGHBOUR_H ++ ++#include ++#include ++ ++struct ndmsg { ++ __u8 ndm_family; ++ __u8 ndm_pad1; ++ __u16 ndm_pad2; ++ __s32 ndm_ifindex; ++ __u16 ndm_state; ++ __u8 ndm_flags; ++ __u8 ndm_type; ++}; ++ ++enum { ++ NDA_UNSPEC, ++ NDA_DST, ++ NDA_LLADDR, ++ NDA_CACHEINFO, ++ NDA_PROBES, ++ NDA_VLAN, ++ NDA_PORT, ++ NDA_VNI, ++ NDA_IFINDEX, ++ NDA_MASTER, ++ NDA_LINK_NETNSID, ++ NDA_SRC_VNI, ++ __NDA_MAX ++}; ++ ++#define NDA_MAX (__NDA_MAX - 1) ++ ++/* ++ * Neighbor Cache Entry Flags ++ */ ++ ++#define NTF_USE 0x01 ++#define NTF_SELF 0x02 ++#define NTF_MASTER 0x04 ++#define NTF_PROXY 0x08 /* == ATF_PUBL */ ++#define NTF_EXT_LEARNED 0x10 ++#define NTF_OFFLOADED 0x20 ++#define NTF_ROUTER 0x80 ++ ++/* ++ * Neighbor Cache Entry States. ++ */ ++ ++#define NUD_INCOMPLETE 0x01 ++#define NUD_REACHABLE 0x02 ++#define NUD_STALE 0x04 ++#define NUD_DELAY 0x08 ++#define NUD_PROBE 0x10 ++#define NUD_FAILED 0x20 ++ ++/* Dummy states */ ++#define NUD_NOARP 0x40 ++#define NUD_PERMANENT 0x80 ++#define NUD_NONE 0x00 ++ ++/* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change ++ and make no address resolution or NUD. ++ NUD_PERMANENT also cannot be deleted by garbage collectors. ++ */ ++ ++struct nda_cacheinfo { ++ __u32 ndm_confirmed; ++ __u32 ndm_used; ++ __u32 ndm_updated; ++ __u32 ndm_refcnt; ++}; ++ ++/***************************************************************** ++ * Neighbour tables specific messages. ++ * ++ * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the ++ * NLM_F_DUMP flag set. Every neighbour table configuration is ++ * spread over multiple messages to avoid running into message ++ * size limits on systems with many interfaces. The first message ++ * in the sequence transports all not device specific data such as ++ * statistics, configuration, and the default parameter set. ++ * This message is followed by 0..n messages carrying device ++ * specific parameter sets. ++ * Although the ordering should be sufficient, NDTA_NAME can be ++ * used to identify sequences. The initial message can be identified ++ * by checking for NDTA_CONFIG. The device specific messages do ++ * not contain this TLV but have NDTPA_IFINDEX set to the ++ * corresponding interface index. ++ * ++ * To change neighbour table attributes, send RTM_SETNEIGHTBL ++ * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3], ++ * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked ++ * otherwise. Device specific parameter sets can be changed by ++ * setting NDTPA_IFINDEX to the interface index of the corresponding ++ * device. ++ ****/ ++ ++struct ndt_stats { ++ __u64 ndts_allocs; ++ __u64 ndts_destroys; ++ __u64 ndts_hash_grows; ++ __u64 ndts_res_failed; ++ __u64 ndts_lookups; ++ __u64 ndts_hits; ++ __u64 ndts_rcv_probes_mcast; ++ __u64 ndts_rcv_probes_ucast; ++ __u64 ndts_periodic_gc_runs; ++ __u64 ndts_forced_gc_runs; ++ __u64 ndts_table_fulls; ++}; ++ ++enum { ++ NDTPA_UNSPEC, ++ NDTPA_IFINDEX, /* u32, unchangeable */ ++ NDTPA_REFCNT, /* u32, read-only */ ++ NDTPA_REACHABLE_TIME, /* u64, read-only, msecs */ ++ NDTPA_BASE_REACHABLE_TIME, /* u64, msecs */ ++ NDTPA_RETRANS_TIME, /* u64, msecs */ ++ NDTPA_GC_STALETIME, /* u64, msecs */ ++ NDTPA_DELAY_PROBE_TIME, /* u64, msecs */ ++ NDTPA_QUEUE_LEN, /* u32 */ ++ NDTPA_APP_PROBES, /* u32 */ ++ NDTPA_UCAST_PROBES, /* u32 */ ++ NDTPA_MCAST_PROBES, /* u32 */ ++ NDTPA_ANYCAST_DELAY, /* u64, msecs */ ++ NDTPA_PROXY_DELAY, /* u64, msecs */ ++ NDTPA_PROXY_QLEN, /* u32 */ ++ NDTPA_LOCKTIME, /* u64, msecs */ ++ NDTPA_QUEUE_LENBYTES, /* u32 */ ++ NDTPA_MCAST_REPROBES, /* u32 */ ++ NDTPA_PAD, ++ __NDTPA_MAX ++}; ++#define NDTPA_MAX (__NDTPA_MAX - 1) ++ ++struct ndtmsg { ++ __u8 ndtm_family; ++ __u8 ndtm_pad1; ++ __u16 ndtm_pad2; ++}; ++ ++struct ndt_config { ++ __u16 ndtc_key_len; ++ __u16 ndtc_entry_size; ++ __u32 ndtc_entries; ++ __u32 ndtc_last_flush; /* delta to now in msecs */ ++ __u32 ndtc_last_rand; /* delta to now in msecs */ ++ __u32 ndtc_hash_rnd; ++ __u32 ndtc_hash_mask; ++ __u32 ndtc_hash_chain_gc; ++ __u32 ndtc_proxy_qlen; ++}; ++ ++enum { ++ NDTA_UNSPEC, ++ NDTA_NAME, /* char *, unchangeable */ ++ NDTA_THRESH1, /* u32 */ ++ NDTA_THRESH2, /* u32 */ ++ NDTA_THRESH3, /* u32 */ ++ NDTA_CONFIG, /* struct ndt_config, read-only */ ++ NDTA_PARMS, /* nested TLV NDTPA_* */ ++ NDTA_STATS, /* struct ndt_stats, read-only */ ++ NDTA_GC_INTERVAL, /* u64, msecs */ ++ NDTA_PAD, ++ __NDTA_MAX ++}; ++#define NDTA_MAX (__NDTA_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/net_namespace.h b/include/uapi/linux/net_namespace.h +new file mode 100644 +index 0000000..9a92b7e +--- /dev/null ++++ b/include/uapi/linux/net_namespace.h +@@ -0,0 +1,23 @@ ++/* Copyright (c) 2015 6WIND S.A. ++ * Author: Nicolas Dichtel ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ */ ++#ifndef _LINUX_NET_NAMESPACE_H_ ++#define _LINUX_NET_NAMESPACE_H_ ++ ++/* Attributes of RTM_NEWNSID/RTM_GETNSID messages */ ++enum { ++ NETNSA_NONE, ++#define NETNSA_NSID_NOT_ASSIGNED -1 ++ NETNSA_NSID, ++ NETNSA_PID, ++ NETNSA_FD, ++ __NETNSA_MAX, ++}; ++ ++#define NETNSA_MAX (__NETNSA_MAX - 1) ++ ++#endif /* _LINUX_NET_NAMESPACE_H_ */ +diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h +new file mode 100644 +index 0000000..4afbd7d +--- /dev/null ++++ b/include/uapi/linux/netconf.h +@@ -0,0 +1,28 @@ ++#ifndef _LINUX_NETCONF_H_ ++#define _LINUX_NETCONF_H_ ++ ++#include ++#include ++ ++struct netconfmsg { ++ __u8 ncm_family; ++}; ++ ++enum { ++ NETCONFA_UNSPEC, ++ NETCONFA_IFINDEX, ++ NETCONFA_FORWARDING, ++ NETCONFA_RP_FILTER, ++ NETCONFA_MC_FORWARDING, ++ NETCONFA_PROXY_NEIGH, ++ NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, ++ NETCONFA_INPUT, ++ __NETCONFA_MAX ++}; ++#define NETCONFA_MAX (__NETCONFA_MAX - 1) ++#define NETCONFA_ALL -1 ++ ++#define NETCONFA_IFINDEX_ALL -1 ++#define NETCONFA_IFINDEX_DEFAULT -2 ++ ++#endif /* _LINUX_NETCONF_H_ */ +diff --git a/include/uapi/linux/netdevice.h b/include/uapi/linux/netdevice.h +new file mode 100644 +index 0000000..66fceb4 +--- /dev/null ++++ b/include/uapi/linux/netdevice.h +@@ -0,0 +1,65 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Definitions for the Interfaces handler. ++ * ++ * Version: @(#)dev.h 1.0.10 08/12/93 ++ * ++ * Authors: Ross Biro ++ * Fred N. van Kempen, ++ * Corey Minyard ++ * Donald J. Becker, ++ * Alan Cox, ++ * Bjorn Ekwall. ++ * Pekka Riikonen ++ * ++ * This program is free software; you can redistribute 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. ++ * ++ * Moved to /usr/include/linux for NET3 ++ */ ++#ifndef _LINUX_NETDEVICE_H ++#define _LINUX_NETDEVICE_H ++ ++#include ++#include ++#include ++#include ++ ++ ++#define MAX_ADDR_LEN 32 /* Largest hardware address length */ ++ ++/* Initial net device group. All devices belong to group 0 by default. */ ++#define INIT_NETDEV_GROUP 0 ++ ++ ++/* interface name assignment types (sysfs name_assign_type attribute) */ ++#define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to userspace) */ ++#define NET_NAME_ENUM 1 /* enumerated by kernel */ ++#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */ ++#define NET_NAME_USER 3 /* provided by user-space */ ++#define NET_NAME_RENAMED 4 /* renamed by user-space */ ++ ++/* Media selection options. */ ++enum { ++ IF_PORT_UNKNOWN = 0, ++ IF_PORT_10BASE2, ++ IF_PORT_10BASET, ++ IF_PORT_AUI, ++ IF_PORT_100BASET, ++ IF_PORT_100BASETX, ++ IF_PORT_100BASEFX ++}; ++ ++/* hardware address assignment types */ ++#define NET_ADDR_PERM 0 /* address is permanent (default) */ ++#define NET_ADDR_RANDOM 1 /* address is generated randomly */ ++#define NET_ADDR_STOLEN 2 /* address is stolen from other device */ ++#define NET_ADDR_SET 3 /* address is set using ++ * dev_set_mac_address() */ ++ ++#endif /* _LINUX_NETDEVICE_H */ +diff --git a/include/uapi/linux/netfilter.h b/include/uapi/linux/netfilter.h +new file mode 100644 +index 0000000..ff4a4a5 +--- /dev/null ++++ b/include/uapi/linux/netfilter.h +@@ -0,0 +1,77 @@ ++#ifndef __LINUX_NETFILTER_H ++#define __LINUX_NETFILTER_H ++ ++#include ++ ++#include ++#include ++ ++/* Responses from hook functions. */ ++#define NF_DROP 0 ++#define NF_ACCEPT 1 ++#define NF_STOLEN 2 ++#define NF_QUEUE 3 ++#define NF_REPEAT 4 ++#define NF_STOP 5 /* Deprecated, for userspace nf_queue compatibility. */ ++#define NF_MAX_VERDICT NF_STOP ++ ++/* we overload the higher bits for encoding auxiliary data such as the queue ++ * number or errno values. Not nice, but better than additional function ++ * arguments. */ ++#define NF_VERDICT_MASK 0x000000ff ++ ++/* extra verdict flags have mask 0x0000ff00 */ ++#define NF_VERDICT_FLAG_QUEUE_BYPASS 0x00008000 ++ ++/* queue number (NF_QUEUE) or errno (NF_DROP) */ ++#define NF_VERDICT_QMASK 0xffff0000 ++#define NF_VERDICT_QBITS 16 ++ ++#define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE) ++ ++#define NF_DROP_ERR(x) (((-x) << 16) | NF_DROP) ++ ++/* only for userspace compatibility */ ++/* Generic cache responses from hook functions. ++ <= 0x2000 is used for protocol-flags. */ ++#define NFC_UNKNOWN 0x4000 ++#define NFC_ALTERED 0x8000 ++ ++/* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */ ++#define NF_VERDICT_BITS 16 ++ ++enum nf_inet_hooks { ++ NF_INET_PRE_ROUTING, ++ NF_INET_LOCAL_IN, ++ NF_INET_FORWARD, ++ NF_INET_LOCAL_OUT, ++ NF_INET_POST_ROUTING, ++ NF_INET_NUMHOOKS ++}; ++ ++enum nf_dev_hooks { ++ NF_NETDEV_INGRESS, ++ NF_NETDEV_NUMHOOKS ++}; ++ ++enum { ++ NFPROTO_UNSPEC = 0, ++ NFPROTO_INET = 1, ++ NFPROTO_IPV4 = 2, ++ NFPROTO_ARP = 3, ++ NFPROTO_NETDEV = 5, ++ NFPROTO_BRIDGE = 7, ++ NFPROTO_IPV6 = 10, ++ NFPROTO_DECNET = 12, ++ NFPROTO_NUMPROTO, ++}; ++ ++union nf_inet_addr { ++ __u32 all[4]; ++ __be32 ip; ++ __be32 ip6[4]; ++ struct in_addr in; ++ struct in6_addr in6; ++}; ++ ++#endif /* __LINUX_NETFILTER_H */ +diff --git a/include/uapi/linux/netfilter/ipset/ip_set.h b/include/uapi/linux/netfilter/ipset/ip_set.h +new file mode 100644 +index 0000000..a6c96b0 +--- /dev/null ++++ b/include/uapi/linux/netfilter/ipset/ip_set.h +@@ -0,0 +1,304 @@ ++/* Copyright (C) 2000-2002 Joakim Axelsson ++ * Patrick Schaaf ++ * Martin Josefsson ++ * Copyright (C) 2003-2011 Jozsef Kadlecsik ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++#ifndef _IP_SET_H ++#define _IP_SET_H ++ ++#include ++ ++/* The protocol version */ ++#define IPSET_PROTOCOL 6 ++ ++/* The max length of strings including NUL: set and type identifiers */ ++#define IPSET_MAXNAMELEN 32 ++ ++/* The maximum permissible comment length we will accept over netlink */ ++#define IPSET_MAX_COMMENT_SIZE 255 ++ ++/* Message types and commands */ ++enum ipset_cmd { ++ IPSET_CMD_NONE, ++ IPSET_CMD_PROTOCOL, /* 1: Return protocol version */ ++ IPSET_CMD_CREATE, /* 2: Create a new (empty) set */ ++ IPSET_CMD_DESTROY, /* 3: Destroy a (empty) set */ ++ IPSET_CMD_FLUSH, /* 4: Remove all elements from a set */ ++ IPSET_CMD_RENAME, /* 5: Rename a set */ ++ IPSET_CMD_SWAP, /* 6: Swap two sets */ ++ IPSET_CMD_LIST, /* 7: List sets */ ++ IPSET_CMD_SAVE, /* 8: Save sets */ ++ IPSET_CMD_ADD, /* 9: Add an element to a set */ ++ IPSET_CMD_DEL, /* 10: Delete an element from a set */ ++ IPSET_CMD_TEST, /* 11: Test an element in a set */ ++ IPSET_CMD_HEADER, /* 12: Get set header data only */ ++ IPSET_CMD_TYPE, /* 13: Get set type */ ++ IPSET_MSG_MAX, /* Netlink message commands */ ++ ++ /* Commands in userspace: */ ++ IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */ ++ IPSET_CMD_HELP, /* 15: Get help */ ++ IPSET_CMD_VERSION, /* 16: Get program version */ ++ IPSET_CMD_QUIT, /* 17: Quit from interactive mode */ ++ ++ IPSET_CMD_MAX, ++ ++ IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */ ++}; ++ ++/* Attributes at command level */ ++enum { ++ IPSET_ATTR_UNSPEC, ++ IPSET_ATTR_PROTOCOL, /* 1: Protocol version */ ++ IPSET_ATTR_SETNAME, /* 2: Name of the set */ ++ IPSET_ATTR_TYPENAME, /* 3: Typename */ ++ IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */ ++ IPSET_ATTR_REVISION, /* 4: Settype revision */ ++ IPSET_ATTR_FAMILY, /* 5: Settype family */ ++ IPSET_ATTR_FLAGS, /* 6: Flags at command level */ ++ IPSET_ATTR_DATA, /* 7: Nested attributes */ ++ IPSET_ATTR_ADT, /* 8: Multiple data containers */ ++ IPSET_ATTR_LINENO, /* 9: Restore lineno */ ++ IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */ ++ IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */ ++ __IPSET_ATTR_CMD_MAX, ++}; ++#define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1) ++ ++/* CADT specific attributes */ ++enum { ++ IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1, ++ IPSET_ATTR_IP_FROM = IPSET_ATTR_IP, ++ IPSET_ATTR_IP_TO, /* 2 */ ++ IPSET_ATTR_CIDR, /* 3 */ ++ IPSET_ATTR_PORT, /* 4 */ ++ IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT, ++ IPSET_ATTR_PORT_TO, /* 5 */ ++ IPSET_ATTR_TIMEOUT, /* 6 */ ++ IPSET_ATTR_PROTO, /* 7 */ ++ IPSET_ATTR_CADT_FLAGS, /* 8 */ ++ IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO, /* 9 */ ++ IPSET_ATTR_MARK, /* 10 */ ++ IPSET_ATTR_MARKMASK, /* 11 */ ++ /* Reserve empty slots */ ++ IPSET_ATTR_CADT_MAX = 16, ++ /* Create-only specific attributes */ ++ IPSET_ATTR_GC, ++ IPSET_ATTR_HASHSIZE, ++ IPSET_ATTR_MAXELEM, ++ IPSET_ATTR_NETMASK, ++ IPSET_ATTR_PROBES, ++ IPSET_ATTR_RESIZE, ++ IPSET_ATTR_SIZE, ++ /* Kernel-only */ ++ IPSET_ATTR_ELEMENTS, ++ IPSET_ATTR_REFERENCES, ++ IPSET_ATTR_MEMSIZE, ++ ++ __IPSET_ATTR_CREATE_MAX, ++}; ++#define IPSET_ATTR_CREATE_MAX (__IPSET_ATTR_CREATE_MAX - 1) ++ ++/* ADT specific attributes */ ++enum { ++ IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1, ++ IPSET_ATTR_NAME, ++ IPSET_ATTR_NAMEREF, ++ IPSET_ATTR_IP2, ++ IPSET_ATTR_CIDR2, ++ IPSET_ATTR_IP2_TO, ++ IPSET_ATTR_IFACE, ++ IPSET_ATTR_BYTES, ++ IPSET_ATTR_PACKETS, ++ IPSET_ATTR_COMMENT, ++ IPSET_ATTR_SKBMARK, ++ IPSET_ATTR_SKBPRIO, ++ IPSET_ATTR_SKBQUEUE, ++ IPSET_ATTR_PAD, ++ __IPSET_ATTR_ADT_MAX, ++}; ++#define IPSET_ATTR_ADT_MAX (__IPSET_ATTR_ADT_MAX - 1) ++ ++/* IP specific attributes */ ++enum { ++ IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1, ++ IPSET_ATTR_IPADDR_IPV6, ++ __IPSET_ATTR_IPADDR_MAX, ++}; ++#define IPSET_ATTR_IPADDR_MAX (__IPSET_ATTR_IPADDR_MAX - 1) ++ ++/* Error codes */ ++enum ipset_errno { ++ IPSET_ERR_PRIVATE = 4096, ++ IPSET_ERR_PROTOCOL, ++ IPSET_ERR_FIND_TYPE, ++ IPSET_ERR_MAX_SETS, ++ IPSET_ERR_BUSY, ++ IPSET_ERR_EXIST_SETNAME2, ++ IPSET_ERR_TYPE_MISMATCH, ++ IPSET_ERR_EXIST, ++ IPSET_ERR_INVALID_CIDR, ++ IPSET_ERR_INVALID_NETMASK, ++ IPSET_ERR_INVALID_FAMILY, ++ IPSET_ERR_TIMEOUT, ++ IPSET_ERR_REFERENCED, ++ IPSET_ERR_IPADDR_IPV4, ++ IPSET_ERR_IPADDR_IPV6, ++ IPSET_ERR_COUNTER, ++ IPSET_ERR_COMMENT, ++ IPSET_ERR_INVALID_MARKMASK, ++ IPSET_ERR_SKBINFO, ++ ++ /* Type specific error codes */ ++ IPSET_ERR_TYPE_SPECIFIC = 4352, ++}; ++ ++/* Flags at command level or match/target flags, lower half of cmdattrs*/ ++enum ipset_cmd_flags { ++ IPSET_FLAG_BIT_EXIST = 0, ++ IPSET_FLAG_EXIST = (1 << IPSET_FLAG_BIT_EXIST), ++ IPSET_FLAG_BIT_LIST_SETNAME = 1, ++ IPSET_FLAG_LIST_SETNAME = (1 << IPSET_FLAG_BIT_LIST_SETNAME), ++ IPSET_FLAG_BIT_LIST_HEADER = 2, ++ IPSET_FLAG_LIST_HEADER = (1 << IPSET_FLAG_BIT_LIST_HEADER), ++ IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3, ++ IPSET_FLAG_SKIP_COUNTER_UPDATE = ++ (1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE), ++ IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4, ++ IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE = ++ (1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE), ++ IPSET_FLAG_BIT_MATCH_COUNTERS = 5, ++ IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS), ++ IPSET_FLAG_BIT_RETURN_NOMATCH = 7, ++ IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH), ++ IPSET_FLAG_BIT_MAP_SKBMARK = 8, ++ IPSET_FLAG_MAP_SKBMARK = (1 << IPSET_FLAG_BIT_MAP_SKBMARK), ++ IPSET_FLAG_BIT_MAP_SKBPRIO = 9, ++ IPSET_FLAG_MAP_SKBPRIO = (1 << IPSET_FLAG_BIT_MAP_SKBPRIO), ++ IPSET_FLAG_BIT_MAP_SKBQUEUE = 10, ++ IPSET_FLAG_MAP_SKBQUEUE = (1 << IPSET_FLAG_BIT_MAP_SKBQUEUE), ++ IPSET_FLAG_CMD_MAX = 15, ++}; ++ ++/* Flags at CADT attribute level, upper half of cmdattrs */ ++enum ipset_cadt_flags { ++ IPSET_FLAG_BIT_BEFORE = 0, ++ IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE), ++ IPSET_FLAG_BIT_PHYSDEV = 1, ++ IPSET_FLAG_PHYSDEV = (1 << IPSET_FLAG_BIT_PHYSDEV), ++ IPSET_FLAG_BIT_NOMATCH = 2, ++ IPSET_FLAG_NOMATCH = (1 << IPSET_FLAG_BIT_NOMATCH), ++ IPSET_FLAG_BIT_WITH_COUNTERS = 3, ++ IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS), ++ IPSET_FLAG_BIT_WITH_COMMENT = 4, ++ IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT), ++ IPSET_FLAG_BIT_WITH_FORCEADD = 5, ++ IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD), ++ IPSET_FLAG_BIT_WITH_SKBINFO = 6, ++ IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO), ++ IPSET_FLAG_CADT_MAX = 15, ++}; ++ ++/* The flag bits which correspond to the non-extension create flags */ ++enum ipset_create_flags { ++ IPSET_CREATE_FLAG_BIT_FORCEADD = 0, ++ IPSET_CREATE_FLAG_FORCEADD = (1 << IPSET_CREATE_FLAG_BIT_FORCEADD), ++ IPSET_CREATE_FLAG_BIT_MAX = 7, ++}; ++ ++/* Commands with settype-specific attributes */ ++enum ipset_adt { ++ IPSET_ADD, ++ IPSET_DEL, ++ IPSET_TEST, ++ IPSET_ADT_MAX, ++ IPSET_CREATE = IPSET_ADT_MAX, ++ IPSET_CADT_MAX, ++}; ++ ++/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t ++ * and IPSET_INVALID_ID if you want to increase the max number of sets. ++ */ ++typedef __u16 ip_set_id_t; ++ ++#define IPSET_INVALID_ID 65535 ++ ++enum ip_set_dim { ++ IPSET_DIM_ZERO = 0, ++ IPSET_DIM_ONE, ++ IPSET_DIM_TWO, ++ IPSET_DIM_THREE, ++ /* Max dimension in elements. ++ * If changed, new revision of iptables match/target is required. ++ */ ++ IPSET_DIM_MAX = 6, ++ /* Backward compatibility: set match revision 2 */ ++ IPSET_BIT_RETURN_NOMATCH = 7, ++}; ++ ++/* Option flags for kernel operations */ ++enum ip_set_kopt { ++ IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO), ++ IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE), ++ IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO), ++ IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE), ++ IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH), ++}; ++ ++enum { ++ IPSET_COUNTER_NONE = 0, ++ IPSET_COUNTER_EQ, ++ IPSET_COUNTER_NE, ++ IPSET_COUNTER_LT, ++ IPSET_COUNTER_GT, ++}; ++ ++/* Backward compatibility for set match v3 */ ++struct ip_set_counter_match0 { ++ __u8 op; ++ __u64 value; ++}; ++ ++struct ip_set_counter_match { ++ __aligned_u64 value; ++ __u8 op; ++}; ++ ++/* Interface to iptables/ip6tables */ ++ ++#define SO_IP_SET 83 ++ ++union ip_set_name_index { ++ char name[IPSET_MAXNAMELEN]; ++ ip_set_id_t index; ++}; ++ ++#define IP_SET_OP_GET_BYNAME 0x00000006 /* Get set index by name */ ++struct ip_set_req_get_set { ++ unsigned int op; ++ unsigned int version; ++ union ip_set_name_index set; ++}; ++ ++#define IP_SET_OP_GET_BYINDEX 0x00000007 /* Get set name by index */ ++/* Uses ip_set_req_get_set */ ++ ++#define IP_SET_OP_GET_FNAME 0x00000008 /* Get set index and family */ ++struct ip_set_req_get_set_family { ++ unsigned int op; ++ unsigned int version; ++ unsigned int family; ++ union ip_set_name_index set; ++}; ++ ++#define IP_SET_OP_VERSION 0x00000100 /* Ask kernel version */ ++struct ip_set_req_version { ++ unsigned int op; ++ unsigned int version; ++}; ++ ++#endif /* _IP_SET_H */ +diff --git a/include/uapi/linux/netfilter/x_tables.h b/include/uapi/linux/netfilter/x_tables.h +new file mode 100644 +index 0000000..4120970 +--- /dev/null ++++ b/include/uapi/linux/netfilter/x_tables.h +@@ -0,0 +1,185 @@ ++#ifndef _X_TABLES_H ++#define _X_TABLES_H ++#include ++#include ++ ++#define XT_FUNCTION_MAXNAMELEN 30 ++#define XT_EXTENSION_MAXNAMELEN 29 ++#define XT_TABLE_MAXNAMELEN 32 ++ ++struct xt_entry_match { ++ union { ++ struct { ++ __u16 match_size; ++ ++ /* Used by userspace */ ++ char name[XT_EXTENSION_MAXNAMELEN]; ++ __u8 revision; ++ } user; ++ struct { ++ __u16 match_size; ++ ++ /* Used inside the kernel */ ++ struct xt_match *match; ++ } kernel; ++ ++ /* Total length */ ++ __u16 match_size; ++ } u; ++ ++ unsigned char data[0]; ++}; ++ ++struct xt_entry_target { ++ union { ++ struct { ++ __u16 target_size; ++ ++ /* Used by userspace */ ++ char name[XT_EXTENSION_MAXNAMELEN]; ++ __u8 revision; ++ } user; ++ struct { ++ __u16 target_size; ++ ++ /* Used inside the kernel */ ++ struct xt_target *target; ++ } kernel; ++ ++ /* Total length */ ++ __u16 target_size; ++ } u; ++ ++ unsigned char data[0]; ++}; ++ ++#define XT_TARGET_INIT(__name, __size) \ ++{ \ ++ .target.u.user = { \ ++ .target_size = XT_ALIGN(__size), \ ++ .name = __name, \ ++ }, \ ++} ++ ++struct xt_standard_target { ++ struct xt_entry_target target; ++ int verdict; ++}; ++ ++struct xt_error_target { ++ struct xt_entry_target target; ++ char errorname[XT_FUNCTION_MAXNAMELEN]; ++}; ++ ++/* The argument to IPT_SO_GET_REVISION_*. Returns highest revision ++ * kernel supports, if >= revision. */ ++struct xt_get_revision { ++ char name[XT_EXTENSION_MAXNAMELEN]; ++ __u8 revision; ++}; ++ ++/* CONTINUE verdict for targets */ ++#define XT_CONTINUE 0xFFFFFFFF ++ ++/* For standard target */ ++#define XT_RETURN (-NF_REPEAT - 1) ++ ++/* this is a dummy structure to find out the alignment requirement for a struct ++ * containing all the fundamental data types that are used in ipt_entry, ++ * ip6t_entry and arpt_entry. This sucks, and it is a hack. It will be my ++ * personal pleasure to remove it -HW ++ */ ++struct _xt_align { ++ __u8 u8; ++ __u16 u16; ++ __u32 u32; ++ __u64 u64; ++}; ++ ++#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align)) ++ ++/* Standard return verdict, or do jump. */ ++#define XT_STANDARD_TARGET "" ++/* Error verdict. */ ++#define XT_ERROR_TARGET "ERROR" ++ ++#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) ++#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) ++ ++struct xt_counters { ++ __u64 pcnt, bcnt; /* Packet and byte counters */ ++}; ++ ++/* The argument to IPT_SO_ADD_COUNTERS. */ ++struct xt_counters_info { ++ /* Which table. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ unsigned int num_counters; ++ ++ /* The counters (actually `number' of these). */ ++ struct xt_counters counters[0]; ++}; ++ ++#define XT_INV_PROTO 0x40 /* Invert the sense of PROTO. */ ++ ++/* fn returns 0 to continue iteration */ ++#define XT_MATCH_ITERATE(type, e, fn, args...) \ ++({ \ ++ unsigned int __i; \ ++ int __ret = 0; \ ++ struct xt_entry_match *__m; \ ++ \ ++ for (__i = sizeof(type); \ ++ __i < (e)->target_offset; \ ++ __i += __m->u.match_size) { \ ++ __m = (void *)e + __i; \ ++ \ ++ __ret = fn(__m , ## args); \ ++ if (__ret != 0) \ ++ break; \ ++ } \ ++ __ret; \ ++}) ++ ++/* fn returns 0 to continue iteration */ ++#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \ ++({ \ ++ unsigned int __i, __n; \ ++ int __ret = 0; \ ++ type *__entry; \ ++ \ ++ for (__i = 0, __n = 0; __i < (size); \ ++ __i += __entry->next_offset, __n++) { \ ++ __entry = (void *)(entries) + __i; \ ++ if (__n < n) \ ++ continue; \ ++ \ ++ __ret = fn(__entry , ## args); \ ++ if (__ret != 0) \ ++ break; \ ++ } \ ++ __ret; \ ++}) ++ ++/* fn returns 0 to continue iteration */ ++#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \ ++ XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args) ++ ++ ++/* pos is normally a struct ipt_entry/ip6t_entry/etc. */ ++#define xt_entry_foreach(pos, ehead, esize) \ ++ for ((pos) = (typeof(pos))(ehead); \ ++ (pos) < (typeof(pos))((char *)(ehead) + (esize)); \ ++ (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset)) ++ ++/* can only be xt_entry_match, so no use of typeof here */ ++#define xt_ematch_foreach(pos, entry) \ ++ for ((pos) = (struct xt_entry_match *)entry->elems; \ ++ (pos) < (struct xt_entry_match *)((char *)(entry) + \ ++ (entry)->target_offset); \ ++ (pos) = (struct xt_entry_match *)((char *)(pos) + \ ++ (pos)->u.match_size)) ++ ++ ++#endif /* _X_TABLES_H */ +diff --git a/include/uapi/linux/netfilter/xt_set.h b/include/uapi/linux/netfilter/xt_set.h +new file mode 100644 +index 0000000..d4e0234 +--- /dev/null ++++ b/include/uapi/linux/netfilter/xt_set.h +@@ -0,0 +1,93 @@ ++#ifndef _XT_SET_H ++#define _XT_SET_H ++ ++#include ++#include ++ ++/* Revision 0 interface: backward compatible with netfilter/iptables */ ++ ++/* ++ * Option flags for kernel operations (xt_set_info_v0) ++ */ ++#define IPSET_SRC 0x01 /* Source match/add */ ++#define IPSET_DST 0x02 /* Destination match/add */ ++#define IPSET_MATCH_INV 0x04 /* Inverse matching */ ++ ++struct xt_set_info_v0 { ++ ip_set_id_t index; ++ union { ++ __u32 flags[IPSET_DIM_MAX + 1]; ++ struct { ++ __u32 __flags[IPSET_DIM_MAX]; ++ __u8 dim; ++ __u8 flags; ++ } compat; ++ } u; ++}; ++ ++/* match and target infos */ ++struct xt_set_info_match_v0 { ++ struct xt_set_info_v0 match_set; ++}; ++ ++struct xt_set_info_target_v0 { ++ struct xt_set_info_v0 add_set; ++ struct xt_set_info_v0 del_set; ++}; ++ ++/* Revision 1 match and target */ ++ ++struct xt_set_info { ++ ip_set_id_t index; ++ __u8 dim; ++ __u8 flags; ++}; ++ ++/* match and target infos */ ++struct xt_set_info_match_v1 { ++ struct xt_set_info match_set; ++}; ++ ++struct xt_set_info_target_v1 { ++ struct xt_set_info add_set; ++ struct xt_set_info del_set; ++}; ++ ++/* Revision 2 target */ ++ ++struct xt_set_info_target_v2 { ++ struct xt_set_info add_set; ++ struct xt_set_info del_set; ++ __u32 flags; ++ __u32 timeout; ++}; ++ ++/* Revision 3 match */ ++ ++struct xt_set_info_match_v3 { ++ struct xt_set_info match_set; ++ struct ip_set_counter_match0 packets; ++ struct ip_set_counter_match0 bytes; ++ __u32 flags; ++}; ++ ++/* Revision 3 target */ ++ ++struct xt_set_info_target_v3 { ++ struct xt_set_info add_set; ++ struct xt_set_info del_set; ++ struct xt_set_info map_set; ++ __u32 flags; ++ __u32 timeout; ++}; ++ ++/* Revision 4 match */ ++ ++struct xt_set_info_match_v4 { ++ struct xt_set_info match_set; ++ struct ip_set_counter_match packets; ++ struct ip_set_counter_match bytes; ++ __u32 flags; ++}; ++ ++#endif /*_XT_SET_H*/ +diff --git a/include/uapi/linux/netfilter/xt_tcpudp.h b/include/uapi/linux/netfilter/xt_tcpudp.h +new file mode 100644 +index 0000000..38aa7b3 +--- /dev/null ++++ b/include/uapi/linux/netfilter/xt_tcpudp.h +@@ -0,0 +1,36 @@ ++#ifndef _XT_TCPUDP_H ++#define _XT_TCPUDP_H ++ ++#include ++ ++/* TCP matching stuff */ ++struct xt_tcp { ++ __u16 spts[2]; /* Source port range. */ ++ __u16 dpts[2]; /* Destination port range. */ ++ __u8 option; /* TCP Option iff non-zero*/ ++ __u8 flg_mask; /* TCP flags mask byte */ ++ __u8 flg_cmp; /* TCP flags compare byte */ ++ __u8 invflags; /* Inverse flags */ ++}; ++ ++/* Values for "inv" field in struct ipt_tcp. */ ++#define XT_TCP_INV_SRCPT 0x01 /* Invert the sense of source ports. */ ++#define XT_TCP_INV_DSTPT 0x02 /* Invert the sense of dest ports. */ ++#define XT_TCP_INV_FLAGS 0x04 /* Invert the sense of TCP flags. */ ++#define XT_TCP_INV_OPTION 0x08 /* Invert the sense of option test. */ ++#define XT_TCP_INV_MASK 0x0F /* All possible flags. */ ++ ++/* UDP matching stuff */ ++struct xt_udp { ++ __u16 spts[2]; /* Source port range. */ ++ __u16 dpts[2]; /* Destination port range. */ ++ __u8 invflags; /* Inverse flags */ ++}; ++ ++/* Values for "invflags" field in struct ipt_udp. */ ++#define XT_UDP_INV_SRCPT 0x01 /* Invert the sense of source ports. */ ++#define XT_UDP_INV_DSTPT 0x02 /* Invert the sense of dest ports. */ ++#define XT_UDP_INV_MASK 0x03 /* All possible flags. */ ++ ++ ++#endif +diff --git a/include/uapi/linux/netfilter_ipv4.h b/include/uapi/linux/netfilter_ipv4.h +new file mode 100644 +index 0000000..a5f4dc7 +--- /dev/null ++++ b/include/uapi/linux/netfilter_ipv4.h +@@ -0,0 +1,79 @@ ++/* IPv4-specific defines for netfilter. ++ * (C)1998 Rusty Russell -- This code is GPL. ++ */ ++#ifndef __LINUX_IP_NETFILTER_H ++#define __LINUX_IP_NETFILTER_H ++ ++ ++#include ++ ++/* only for userspace compatibility */ ++ ++#include /* for INT_MIN, INT_MAX */ ++ ++/* IP Cache bits. */ ++/* Src IP address. */ ++#define NFC_IP_SRC 0x0001 ++/* Dest IP address. */ ++#define NFC_IP_DST 0x0002 ++/* Input device. */ ++#define NFC_IP_IF_IN 0x0004 ++/* Output device. */ ++#define NFC_IP_IF_OUT 0x0008 ++/* TOS. */ ++#define NFC_IP_TOS 0x0010 ++/* Protocol. */ ++#define NFC_IP_PROTO 0x0020 ++/* IP options. */ ++#define NFC_IP_OPTIONS 0x0040 ++/* Frag & flags. */ ++#define NFC_IP_FRAG 0x0080 ++ ++/* Per-protocol information: only matters if proto match. */ ++/* TCP flags. */ ++#define NFC_IP_TCPFLAGS 0x0100 ++/* Source port. */ ++#define NFC_IP_SRC_PT 0x0200 ++/* Dest port. */ ++#define NFC_IP_DST_PT 0x0400 ++/* Something else about the proto */ ++#define NFC_IP_PROTO_UNKNOWN 0x2000 ++ ++/* IP Hooks */ ++/* After promisc drops, checksum checks. */ ++#define NF_IP_PRE_ROUTING 0 ++/* If the packet is destined for this box. */ ++#define NF_IP_LOCAL_IN 1 ++/* If the packet is destined for another interface. */ ++#define NF_IP_FORWARD 2 ++/* Packets coming from a local process. */ ++#define NF_IP_LOCAL_OUT 3 ++/* Packets about to hit the wire. */ ++#define NF_IP_POST_ROUTING 4 ++#define NF_IP_NUMHOOKS 5 ++ ++enum nf_ip_hook_priorities { ++ NF_IP_PRI_FIRST = INT_MIN, ++ NF_IP_PRI_CONNTRACK_DEFRAG = -400, ++ NF_IP_PRI_RAW = -300, ++ NF_IP_PRI_SELINUX_FIRST = -225, ++ NF_IP_PRI_CONNTRACK = -200, ++ NF_IP_PRI_MANGLE = -150, ++ NF_IP_PRI_NAT_DST = -100, ++ NF_IP_PRI_FILTER = 0, ++ NF_IP_PRI_SECURITY = 50, ++ NF_IP_PRI_NAT_SRC = 100, ++ NF_IP_PRI_SELINUX_LAST = 225, ++ NF_IP_PRI_CONNTRACK_HELPER = 300, ++ NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX, ++ NF_IP_PRI_LAST = INT_MAX, ++}; ++ ++/* Arguments for setsockopt SOL_IP: */ ++/* 2.0 firewalling went from 64 through 71 (and +256, +512, etc). */ ++/* 2.2 firewalling (+ masq) went from 64 through 76 */ ++/* 2.4 firewalling went 64 through 67. */ ++#define SO_ORIGINAL_DST 80 ++ ++ ++#endif /* __LINUX_IP_NETFILTER_H */ +diff --git a/include/uapi/linux/netfilter_ipv4/ip_tables.h b/include/uapi/linux/netfilter_ipv4/ip_tables.h +new file mode 100644 +index 0000000..456fb86 +--- /dev/null ++++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h +@@ -0,0 +1,228 @@ ++/* ++ * 25-Jul-1998 Major changes to allow for ip chain table ++ * ++ * 3-Jan-2000 Named tables to allow packet selection for different uses. ++ */ ++ ++/* ++ * Format of an IP firewall descriptor ++ * ++ * src, dst, src_mask, dst_mask are always stored in network byte order. ++ * flags are stored in host byte order (of course). ++ * Port numbers are stored in HOST byte order. ++ */ ++ ++#ifndef _IPTABLES_H ++#define _IPTABLES_H ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#define IPT_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN ++#define IPT_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN ++#define ipt_match xt_match ++#define ipt_target xt_target ++#define ipt_table xt_table ++#define ipt_get_revision xt_get_revision ++#define ipt_entry_match xt_entry_match ++#define ipt_entry_target xt_entry_target ++#define ipt_standard_target xt_standard_target ++#define ipt_error_target xt_error_target ++#define ipt_counters xt_counters ++#define IPT_CONTINUE XT_CONTINUE ++#define IPT_RETURN XT_RETURN ++ ++/* This group is older than old (iptables < v1.4.0-rc1~89) */ ++#include ++#define ipt_udp xt_udp ++#define ipt_tcp xt_tcp ++#define IPT_TCP_INV_SRCPT XT_TCP_INV_SRCPT ++#define IPT_TCP_INV_DSTPT XT_TCP_INV_DSTPT ++#define IPT_TCP_INV_FLAGS XT_TCP_INV_FLAGS ++#define IPT_TCP_INV_OPTION XT_TCP_INV_OPTION ++#define IPT_TCP_INV_MASK XT_TCP_INV_MASK ++#define IPT_UDP_INV_SRCPT XT_UDP_INV_SRCPT ++#define IPT_UDP_INV_DSTPT XT_UDP_INV_DSTPT ++#define IPT_UDP_INV_MASK XT_UDP_INV_MASK ++ ++/* The argument to IPT_SO_ADD_COUNTERS. */ ++#define ipt_counters_info xt_counters_info ++/* Standard return verdict, or do jump. */ ++#define IPT_STANDARD_TARGET XT_STANDARD_TARGET ++/* Error verdict. */ ++#define IPT_ERROR_TARGET XT_ERROR_TARGET ++ ++/* fn returns 0 to continue iteration */ ++#define IPT_MATCH_ITERATE(e, fn, args...) \ ++ XT_MATCH_ITERATE(struct ipt_entry, e, fn, ## args) ++ ++/* fn returns 0 to continue iteration */ ++#define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ ++ XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) ++ ++/* Yes, Virginia, you have to zero the padding. */ ++struct ipt_ip { ++ /* Source and destination IP addr */ ++ struct in_addr src, dst; ++ /* Mask for src and dest IP addr */ ++ struct in_addr smsk, dmsk; ++ char iniface[IFNAMSIZ], outiface[IFNAMSIZ]; ++ unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ]; ++ ++ /* Protocol, 0 = ANY */ ++ __u16 proto; ++ ++ /* Flags word */ ++ __u8 flags; ++ /* Inverse flags */ ++ __u8 invflags; ++}; ++ ++/* Values for "flag" field in struct ipt_ip (general ip structure). */ ++#define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ ++#define IPT_F_GOTO 0x02 /* Set if jump is a goto */ ++#define IPT_F_MASK 0x03 /* All possible flag bits mask. */ ++ ++/* Values for "inv" field in struct ipt_ip. */ ++#define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ ++#define IPT_INV_VIA_OUT 0x02 /* Invert the sense of OUT IFACE */ ++#define IPT_INV_TOS 0x04 /* Invert the sense of TOS. */ ++#define IPT_INV_SRCIP 0x08 /* Invert the sense of SRC IP. */ ++#define IPT_INV_DSTIP 0x10 /* Invert the sense of DST OP. */ ++#define IPT_INV_FRAG 0x20 /* Invert the sense of FRAG. */ ++#define IPT_INV_PROTO XT_INV_PROTO ++#define IPT_INV_MASK 0x7F /* All possible flag bits mask. */ ++ ++/* This structure defines each of the firewall rules. Consists of 3 ++ parts which are 1) general IP header stuff 2) match specific ++ stuff 3) the target to perform if the rule matches */ ++struct ipt_entry { ++ struct ipt_ip ip; ++ ++ /* Mark with fields that we care about. */ ++ unsigned int nfcache; ++ ++ /* Size of ipt_entry + matches */ ++ __u16 target_offset; ++ /* Size of ipt_entry + matches + target */ ++ __u16 next_offset; ++ ++ /* Back pointer */ ++ unsigned int comefrom; ++ ++ /* Packet and byte counters. */ ++ struct xt_counters counters; ++ ++ /* The matches (if any), then the target. */ ++ unsigned char elems[0]; ++}; ++ ++/* ++ * New IP firewall options for [gs]etsockopt at the RAW IP level. ++ * Unlike BSD Linux inherits IP options so you don't have to use a raw ++ * socket for this. Instead we check rights in the calls. ++ * ++ * ATTENTION: check linux/in.h before adding new number here. ++ */ ++#define IPT_BASE_CTL 64 ++ ++#define IPT_SO_SET_REPLACE (IPT_BASE_CTL) ++#define IPT_SO_SET_ADD_COUNTERS (IPT_BASE_CTL + 1) ++#define IPT_SO_SET_MAX IPT_SO_SET_ADD_COUNTERS ++ ++#define IPT_SO_GET_INFO (IPT_BASE_CTL) ++#define IPT_SO_GET_ENTRIES (IPT_BASE_CTL + 1) ++#define IPT_SO_GET_REVISION_MATCH (IPT_BASE_CTL + 2) ++#define IPT_SO_GET_REVISION_TARGET (IPT_BASE_CTL + 3) ++#define IPT_SO_GET_MAX IPT_SO_GET_REVISION_TARGET ++ ++/* ICMP matching stuff */ ++struct ipt_icmp { ++ __u8 type; /* type to match */ ++ __u8 code[2]; /* range of code */ ++ __u8 invflags; /* Inverse flags */ ++}; ++ ++/* Values for "inv" field for struct ipt_icmp. */ ++#define IPT_ICMP_INV 0x01 /* Invert the sense of type/code test */ ++ ++/* The argument to IPT_SO_GET_INFO */ ++struct ipt_getinfo { ++ /* Which table: caller fills this in. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ /* Kernel fills these in. */ ++ /* Which hook entry points are valid: bitmask */ ++ unsigned int valid_hooks; ++ ++ /* Hook entry points: one per netfilter hook. */ ++ unsigned int hook_entry[NF_INET_NUMHOOKS]; ++ ++ /* Underflow points. */ ++ unsigned int underflow[NF_INET_NUMHOOKS]; ++ ++ /* Number of entries */ ++ unsigned int num_entries; ++ ++ /* Size of entries. */ ++ unsigned int size; ++}; ++ ++/* The argument to IPT_SO_SET_REPLACE. */ ++struct ipt_replace { ++ /* Which table. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ /* Which hook entry points are valid: bitmask. You can't ++ change this. */ ++ unsigned int valid_hooks; ++ ++ /* Number of entries */ ++ unsigned int num_entries; ++ ++ /* Total size of new entries */ ++ unsigned int size; ++ ++ /* Hook entry points. */ ++ unsigned int hook_entry[NF_INET_NUMHOOKS]; ++ ++ /* Underflow points. */ ++ unsigned int underflow[NF_INET_NUMHOOKS]; ++ ++ /* Information about old entries: */ ++ /* Number of counters (must be equal to current number of entries). */ ++ unsigned int num_counters; ++ /* The old entries' counters. */ ++ struct xt_counters *counters; ++ ++ /* The entries (hang off end: not really an array). */ ++ struct ipt_entry entries[0]; ++}; ++ ++/* The argument to IPT_SO_GET_ENTRIES. */ ++struct ipt_get_entries { ++ /* Which table: user fills this in. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ /* User fills this in: total entry size. */ ++ unsigned int size; ++ ++ /* The entries. */ ++ struct ipt_entry entrytable[0]; ++}; ++ ++/* Helper functions */ ++static __inline__ struct xt_entry_target * ++ipt_get_target(struct ipt_entry *e) ++{ ++ return (void *)e + e->target_offset; ++} ++ ++/* ++ * Main firewall chains definitions and global var's definitions. ++ */ ++#endif /* _IPTABLES_H */ +diff --git a/include/uapi/linux/netfilter_ipv6.h b/include/uapi/linux/netfilter_ipv6.h +new file mode 100644 +index 0000000..8483d1d +--- /dev/null ++++ b/include/uapi/linux/netfilter_ipv6.h +@@ -0,0 +1,77 @@ ++/* IPv6-specific defines for netfilter. ++ * (C)1998 Rusty Russell -- This code is GPL. ++ * (C)1999 David Jeffery ++ * this header was blatantly ripped from netfilter_ipv4.h ++ * it's amazing what adding a bunch of 6s can do =8^) ++ */ ++#ifndef __LINUX_IP6_NETFILTER_H ++#define __LINUX_IP6_NETFILTER_H ++ ++ ++#include ++ ++/* only for userspace compatibility */ ++ ++#include /* for INT_MIN, INT_MAX */ ++ ++/* IP Cache bits. */ ++/* Src IP address. */ ++#define NFC_IP6_SRC 0x0001 ++/* Dest IP address. */ ++#define NFC_IP6_DST 0x0002 ++/* Input device. */ ++#define NFC_IP6_IF_IN 0x0004 ++/* Output device. */ ++#define NFC_IP6_IF_OUT 0x0008 ++/* TOS. */ ++#define NFC_IP6_TOS 0x0010 ++/* Protocol. */ ++#define NFC_IP6_PROTO 0x0020 ++/* IP options. */ ++#define NFC_IP6_OPTIONS 0x0040 ++/* Frag & flags. */ ++#define NFC_IP6_FRAG 0x0080 ++ ++ ++/* Per-protocol information: only matters if proto match. */ ++/* TCP flags. */ ++#define NFC_IP6_TCPFLAGS 0x0100 ++/* Source port. */ ++#define NFC_IP6_SRC_PT 0x0200 ++/* Dest port. */ ++#define NFC_IP6_DST_PT 0x0400 ++/* Something else about the proto */ ++#define NFC_IP6_PROTO_UNKNOWN 0x2000 ++ ++/* IP6 Hooks */ ++/* After promisc drops, checksum checks. */ ++#define NF_IP6_PRE_ROUTING 0 ++/* If the packet is destined for this box. */ ++#define NF_IP6_LOCAL_IN 1 ++/* If the packet is destined for another interface. */ ++#define NF_IP6_FORWARD 2 ++/* Packets coming from a local process. */ ++#define NF_IP6_LOCAL_OUT 3 ++/* Packets about to hit the wire. */ ++#define NF_IP6_POST_ROUTING 4 ++#define NF_IP6_NUMHOOKS 5 ++ ++ ++enum nf_ip6_hook_priorities { ++ NF_IP6_PRI_FIRST = INT_MIN, ++ NF_IP6_PRI_CONNTRACK_DEFRAG = -400, ++ NF_IP6_PRI_RAW = -300, ++ NF_IP6_PRI_SELINUX_FIRST = -225, ++ NF_IP6_PRI_CONNTRACK = -200, ++ NF_IP6_PRI_MANGLE = -150, ++ NF_IP6_PRI_NAT_DST = -100, ++ NF_IP6_PRI_FILTER = 0, ++ NF_IP6_PRI_SECURITY = 50, ++ NF_IP6_PRI_NAT_SRC = 100, ++ NF_IP6_PRI_SELINUX_LAST = 225, ++ NF_IP6_PRI_CONNTRACK_HELPER = 300, ++ NF_IP6_PRI_LAST = INT_MAX, ++}; ++ ++ ++#endif /* __LINUX_IP6_NETFILTER_H */ +diff --git a/include/uapi/linux/netfilter_ipv6/ip6_tables.h b/include/uapi/linux/netfilter_ipv6/ip6_tables.h +new file mode 100644 +index 0000000..fcc8cca +--- /dev/null ++++ b/include/uapi/linux/netfilter_ipv6/ip6_tables.h +@@ -0,0 +1,269 @@ ++/* ++ * 25-Jul-1998 Major changes to allow for ip chain table ++ * ++ * 3-Jan-2000 Named tables to allow packet selection for different uses. ++ */ ++ ++/* ++ * Format of an IP6 firewall descriptor ++ * ++ * src, dst, src_mask, dst_mask are always stored in network byte order. ++ * flags are stored in host byte order (of course). ++ * Port numbers are stored in HOST byte order. ++ */ ++ ++#ifndef _IP6_TABLES_H ++#define _IP6_TABLES_H ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#define IP6T_FUNCTION_MAXNAMELEN XT_FUNCTION_MAXNAMELEN ++#define IP6T_TABLE_MAXNAMELEN XT_TABLE_MAXNAMELEN ++#define ip6t_match xt_match ++#define ip6t_target xt_target ++#define ip6t_table xt_table ++#define ip6t_get_revision xt_get_revision ++#define ip6t_entry_match xt_entry_match ++#define ip6t_entry_target xt_entry_target ++#define ip6t_standard_target xt_standard_target ++#define ip6t_error_target xt_error_target ++#define ip6t_counters xt_counters ++#define IP6T_CONTINUE XT_CONTINUE ++#define IP6T_RETURN XT_RETURN ++ ++/* Pre-iptables-1.4.0 */ ++#include ++#define ip6t_tcp xt_tcp ++#define ip6t_udp xt_udp ++#define IP6T_TCP_INV_SRCPT XT_TCP_INV_SRCPT ++#define IP6T_TCP_INV_DSTPT XT_TCP_INV_DSTPT ++#define IP6T_TCP_INV_FLAGS XT_TCP_INV_FLAGS ++#define IP6T_TCP_INV_OPTION XT_TCP_INV_OPTION ++#define IP6T_TCP_INV_MASK XT_TCP_INV_MASK ++#define IP6T_UDP_INV_SRCPT XT_UDP_INV_SRCPT ++#define IP6T_UDP_INV_DSTPT XT_UDP_INV_DSTPT ++#define IP6T_UDP_INV_MASK XT_UDP_INV_MASK ++ ++#define ip6t_counters_info xt_counters_info ++#define IP6T_STANDARD_TARGET XT_STANDARD_TARGET ++#define IP6T_ERROR_TARGET XT_ERROR_TARGET ++#define IP6T_MATCH_ITERATE(e, fn, args...) \ ++ XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args) ++#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ ++ XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args) ++ ++/* Yes, Virginia, you have to zero the padding. */ ++struct ip6t_ip6 { ++ /* Source and destination IP6 addr */ ++ struct in6_addr src, dst; ++ /* Mask for src and dest IP6 addr */ ++ struct in6_addr smsk, dmsk; ++ char iniface[IFNAMSIZ], outiface[IFNAMSIZ]; ++ unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ]; ++ ++ /* Upper protocol number ++ * - The allowed value is 0 (any) or protocol number of last parsable ++ * header, which is 50 (ESP), 59 (No Next Header), 135 (MH), or ++ * the non IPv6 extension headers. ++ * - The protocol numbers of IPv6 extension headers except of ESP and ++ * MH do not match any packets. ++ * - You also need to set IP6T_FLAGS_PROTO to "flags" to check protocol. ++ */ ++ __u16 proto; ++ /* TOS to match iff flags & IP6T_F_TOS */ ++ __u8 tos; ++ ++ /* Flags word */ ++ __u8 flags; ++ /* Inverse flags */ ++ __u8 invflags; ++}; ++ ++/* Values for "flag" field in struct ip6t_ip6 (general ip6 structure). */ ++#define IP6T_F_PROTO 0x01 /* Set if rule cares about upper ++ protocols */ ++#define IP6T_F_TOS 0x02 /* Match the TOS. */ ++#define IP6T_F_GOTO 0x04 /* Set if jump is a goto */ ++#define IP6T_F_MASK 0x07 /* All possible flag bits mask. */ ++ ++/* Values for "inv" field in struct ip6t_ip6. */ ++#define IP6T_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ ++#define IP6T_INV_VIA_OUT 0x02 /* Invert the sense of OUT IFACE */ ++#define IP6T_INV_TOS 0x04 /* Invert the sense of TOS. */ ++#define IP6T_INV_SRCIP 0x08 /* Invert the sense of SRC IP. */ ++#define IP6T_INV_DSTIP 0x10 /* Invert the sense of DST OP. */ ++#define IP6T_INV_FRAG 0x20 /* Invert the sense of FRAG. */ ++#define IP6T_INV_PROTO XT_INV_PROTO ++#define IP6T_INV_MASK 0x7F /* All possible flag bits mask. */ ++ ++/* This structure defines each of the firewall rules. Consists of 3 ++ parts which are 1) general IP header stuff 2) match specific ++ stuff 3) the target to perform if the rule matches */ ++struct ip6t_entry { ++ struct ip6t_ip6 ipv6; ++ ++ /* Mark with fields that we care about. */ ++ unsigned int nfcache; ++ ++ /* Size of ipt_entry + matches */ ++ __u16 target_offset; ++ /* Size of ipt_entry + matches + target */ ++ __u16 next_offset; ++ ++ /* Back pointer */ ++ unsigned int comefrom; ++ ++ /* Packet and byte counters. */ ++ struct xt_counters counters; ++ ++ /* The matches (if any), then the target. */ ++ unsigned char elems[0]; ++}; ++ ++/* Standard entry */ ++struct ip6t_standard { ++ struct ip6t_entry entry; ++ struct xt_standard_target target; ++}; ++ ++struct ip6t_error { ++ struct ip6t_entry entry; ++ struct xt_error_target target; ++}; ++ ++#define IP6T_ENTRY_INIT(__size) \ ++{ \ ++ .target_offset = sizeof(struct ip6t_entry), \ ++ .next_offset = (__size), \ ++} ++ ++#define IP6T_STANDARD_INIT(__verdict) \ ++{ \ ++ .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_standard)), \ ++ .target = XT_TARGET_INIT(XT_STANDARD_TARGET, \ ++ sizeof(struct xt_standard_target)), \ ++ .target.verdict = -(__verdict) - 1, \ ++} ++ ++#define IP6T_ERROR_INIT \ ++{ \ ++ .entry = IP6T_ENTRY_INIT(sizeof(struct ip6t_error)), \ ++ .target = XT_TARGET_INIT(XT_ERROR_TARGET, \ ++ sizeof(struct xt_error_target)), \ ++ .target.errorname = "ERROR", \ ++} ++ ++/* ++ * New IP firewall options for [gs]etsockopt at the RAW IP level. ++ * Unlike BSD Linux inherits IP options so you don't have to use ++ * a raw socket for this. Instead we check rights in the calls. ++ * ++ * ATTENTION: check linux/in6.h before adding new number here. ++ */ ++#define IP6T_BASE_CTL 64 ++ ++#define IP6T_SO_SET_REPLACE (IP6T_BASE_CTL) ++#define IP6T_SO_SET_ADD_COUNTERS (IP6T_BASE_CTL + 1) ++#define IP6T_SO_SET_MAX IP6T_SO_SET_ADD_COUNTERS ++ ++#define IP6T_SO_GET_INFO (IP6T_BASE_CTL) ++#define IP6T_SO_GET_ENTRIES (IP6T_BASE_CTL + 1) ++#define IP6T_SO_GET_REVISION_MATCH (IP6T_BASE_CTL + 4) ++#define IP6T_SO_GET_REVISION_TARGET (IP6T_BASE_CTL + 5) ++#define IP6T_SO_GET_MAX IP6T_SO_GET_REVISION_TARGET ++ ++/* obtain original address if REDIRECT'd connection */ ++#define IP6T_SO_ORIGINAL_DST 80 ++ ++/* ICMP matching stuff */ ++struct ip6t_icmp { ++ __u8 type; /* type to match */ ++ __u8 code[2]; /* range of code */ ++ __u8 invflags; /* Inverse flags */ ++}; ++ ++/* Values for "inv" field for struct ipt_icmp. */ ++#define IP6T_ICMP_INV 0x01 /* Invert the sense of type/code test */ ++ ++/* The argument to IP6T_SO_GET_INFO */ ++struct ip6t_getinfo { ++ /* Which table: caller fills this in. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ /* Kernel fills these in. */ ++ /* Which hook entry points are valid: bitmask */ ++ unsigned int valid_hooks; ++ ++ /* Hook entry points: one per netfilter hook. */ ++ unsigned int hook_entry[NF_INET_NUMHOOKS]; ++ ++ /* Underflow points. */ ++ unsigned int underflow[NF_INET_NUMHOOKS]; ++ ++ /* Number of entries */ ++ unsigned int num_entries; ++ ++ /* Size of entries. */ ++ unsigned int size; ++}; ++ ++/* The argument to IP6T_SO_SET_REPLACE. */ ++struct ip6t_replace { ++ /* Which table. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ /* Which hook entry points are valid: bitmask. You can't ++ change this. */ ++ unsigned int valid_hooks; ++ ++ /* Number of entries */ ++ unsigned int num_entries; ++ ++ /* Total size of new entries */ ++ unsigned int size; ++ ++ /* Hook entry points. */ ++ unsigned int hook_entry[NF_INET_NUMHOOKS]; ++ ++ /* Underflow points. */ ++ unsigned int underflow[NF_INET_NUMHOOKS]; ++ ++ /* Information about old entries: */ ++ /* Number of counters (must be equal to current number of entries). */ ++ unsigned int num_counters; ++ /* The old entries' counters. */ ++ struct xt_counters *counters; ++ ++ /* The entries (hang off end: not really an array). */ ++ struct ip6t_entry entries[0]; ++}; ++ ++/* The argument to IP6T_SO_GET_ENTRIES. */ ++struct ip6t_get_entries { ++ /* Which table: user fills this in. */ ++ char name[XT_TABLE_MAXNAMELEN]; ++ ++ /* User fills this in: total entry size. */ ++ unsigned int size; ++ ++ /* The entries. */ ++ struct ip6t_entry entrytable[0]; ++}; ++ ++/* Helper functions */ ++static __inline__ struct xt_entry_target * ++ip6t_get_target(struct ip6t_entry *e) ++{ ++ return (void *)e + e->target_offset; ++} ++ ++/* ++ * Main firewall chains definitions and global var's definitions. ++ */ ++ ++#endif /* _IP6_TABLES_H */ +diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h +new file mode 100644 +index 0000000..ec0690b +--- /dev/null ++++ b/include/uapi/linux/netlink.h +@@ -0,0 +1,246 @@ ++#ifndef __LINUX_NETLINK_H ++#define __LINUX_NETLINK_H ++ ++#include ++#include /* for __kernel_sa_family_t */ ++#include ++ ++#define NETLINK_ROUTE 0 /* Routing/device hook */ ++#define NETLINK_UNUSED 1 /* Unused number */ ++#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ ++#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ ++#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ ++#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ ++#define NETLINK_XFRM 6 /* ipsec */ ++#define NETLINK_SELINUX 7 /* SELinux event notifications */ ++#define NETLINK_ISCSI 8 /* Open-iSCSI */ ++#define NETLINK_AUDIT 9 /* auditing */ ++#define NETLINK_FIB_LOOKUP 10 ++#define NETLINK_CONNECTOR 11 ++#define NETLINK_NETFILTER 12 /* netfilter subsystem */ ++#define NETLINK_IP6_FW 13 ++#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ ++#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ ++#define NETLINK_GENERIC 16 ++/* leave room for NETLINK_DM (DM Events) */ ++#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ ++#define NETLINK_ECRYPTFS 19 ++#define NETLINK_RDMA 20 ++#define NETLINK_CRYPTO 21 /* Crypto layer */ ++#define NETLINK_SMC 22 /* SMC monitoring */ ++ ++#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG ++ ++#define MAX_LINKS 32 ++ ++struct sockaddr_nl { ++ __kernel_sa_family_t nl_family; /* AF_NETLINK */ ++ unsigned short nl_pad; /* zero */ ++ __u32 nl_pid; /* port ID */ ++ __u32 nl_groups; /* multicast groups mask */ ++}; ++ ++struct nlmsghdr { ++ __u32 nlmsg_len; /* Length of message including header */ ++ __u16 nlmsg_type; /* Message content */ ++ __u16 nlmsg_flags; /* Additional flags */ ++ __u32 nlmsg_seq; /* Sequence number */ ++ __u32 nlmsg_pid; /* Sending process port ID */ ++}; ++ ++/* Flags values */ ++ ++#define NLM_F_REQUEST 0x01 /* It is request message. */ ++#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ ++#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ ++#define NLM_F_ECHO 0x08 /* Echo this request */ ++#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ ++#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ ++ ++/* Modifiers to GET request */ ++#define NLM_F_ROOT 0x100 /* specify tree root */ ++#define NLM_F_MATCH 0x200 /* return all matching */ ++#define NLM_F_ATOMIC 0x400 /* atomic GET */ ++#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) ++ ++/* Modifiers to NEW request */ ++#define NLM_F_REPLACE 0x100 /* Override existing */ ++#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ ++#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ ++#define NLM_F_APPEND 0x800 /* Add to end of list */ ++ ++/* Modifiers to DELETE request */ ++#define NLM_F_NONREC 0x100 /* Do not delete recursively */ ++ ++/* Flags for ACK message */ ++#define NLM_F_CAPPED 0x100 /* request was capped */ ++#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ ++ ++/* ++ 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL ++ 4.4BSD CHANGE NLM_F_REPLACE ++ ++ True CHANGE NLM_F_CREATE|NLM_F_REPLACE ++ Append NLM_F_CREATE ++ Check NLM_F_EXCL ++ */ ++ ++#define NLMSG_ALIGNTO 4U ++#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) ++#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) ++#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) ++#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) ++#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) ++#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ ++ (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) ++#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ ++ (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ ++ (nlh)->nlmsg_len <= (len)) ++#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) ++ ++#define NLMSG_NOOP 0x1 /* Nothing. */ ++#define NLMSG_ERROR 0x2 /* Error */ ++#define NLMSG_DONE 0x3 /* End of a dump */ ++#define NLMSG_OVERRUN 0x4 /* Data lost */ ++ ++#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ ++ ++struct nlmsgerr { ++ int error; ++ struct nlmsghdr msg; ++ /* ++ * followed by the message contents unless NETLINK_CAP_ACK was set ++ * or the ACK indicates success (error == 0) ++ * message length is aligned with NLMSG_ALIGN() ++ */ ++ /* ++ * followed by TLVs defined in enum nlmsgerr_attrs ++ * if NETLINK_EXT_ACK was set ++ */ ++}; ++ ++/** ++ * enum nlmsgerr_attrs - nlmsgerr attributes ++ * @NLMSGERR_ATTR_UNUSED: unused ++ * @NLMSGERR_ATTR_MSG: error message string (string) ++ * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original ++ * message, counting from the beginning of the header (u32) ++ * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to ++ * be used - in the success case - to identify a created ++ * object or operation or similar (binary) ++ * @__NLMSGERR_ATTR_MAX: number of attributes ++ * @NLMSGERR_ATTR_MAX: highest attribute number ++ */ ++enum nlmsgerr_attrs { ++ NLMSGERR_ATTR_UNUSED, ++ NLMSGERR_ATTR_MSG, ++ NLMSGERR_ATTR_OFFS, ++ NLMSGERR_ATTR_COOKIE, ++ ++ __NLMSGERR_ATTR_MAX, ++ NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 ++}; ++ ++#define NETLINK_ADD_MEMBERSHIP 1 ++#define NETLINK_DROP_MEMBERSHIP 2 ++#define NETLINK_PKTINFO 3 ++#define NETLINK_BROADCAST_ERROR 4 ++#define NETLINK_NO_ENOBUFS 5 ++#define NETLINK_RX_RING 6 ++#define NETLINK_TX_RING 7 ++#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; ++}; ++ ++struct nl_mmap_req { ++ unsigned int nm_block_size; ++ unsigned int nm_block_nr; ++ unsigned int nm_frame_size; ++ unsigned int nm_frame_nr; ++}; ++ ++struct nl_mmap_hdr { ++ unsigned int nm_status; ++ unsigned int nm_len; ++ __u32 nm_group; ++ /* credentials */ ++ __u32 nm_pid; ++ __u32 nm_uid; ++ __u32 nm_gid; ++}; ++ ++enum nl_mmap_status { ++ NL_MMAP_STATUS_UNUSED, ++ NL_MMAP_STATUS_RESERVED, ++ NL_MMAP_STATUS_VALID, ++ NL_MMAP_STATUS_COPY, ++ NL_MMAP_STATUS_SKIP, ++}; ++ ++#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO ++#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) ++#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) ++ ++#define NET_MAJOR 36 /* Major 36 is reserved for networking */ ++ ++enum { ++ NETLINK_UNCONNECTED = 0, ++ NETLINK_CONNECTED, ++}; ++ ++/* ++ * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> ++ * +---------------------+- - -+- - - - - - - - - -+- - -+ ++ * | Header | Pad | Payload | Pad | ++ * | (struct nlattr) | ing | | ing | ++ * +---------------------+- - -+- - - - - - - - - -+- - -+ ++ * <-------------- nlattr->nla_len --------------> ++ */ ++ ++struct nlattr { ++ __u16 nla_len; ++ __u16 nla_type; ++}; ++ ++/* ++ * nla_type (16 bits) ++ * +---+---+-------------------------------+ ++ * | N | O | Attribute Type | ++ * +---+---+-------------------------------+ ++ * N := Carries nested attributes ++ * O := Payload stored in network byte order ++ * ++ * Note: The N and O flag are mutually exclusive. ++ */ ++#define NLA_F_NESTED (1 << 15) ++#define NLA_F_NET_BYTEORDER (1 << 14) ++#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) ++ ++#define NLA_ALIGNTO 4 ++#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) ++#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) ++ ++/* Generic 32 bitflags attribute content sent to the kernel. ++ * ++ * The value is a bitmap that defines the values being set ++ * The selector is a bitmask that defines which value is legit ++ * ++ * Examples: ++ * value = 0x0, and selector = 0x1 ++ * implies we are selecting bit 1 and we want to set its value to 0. ++ * ++ * value = 0x2, and selector = 0x2 ++ * implies we are selecting bit 2 and we want to set its value to 1. ++ * ++ */ ++struct nla_bitfield32 { ++ __u32 value; ++ __u32 selector; ++}; ++ ++#endif /* __LINUX_NETLINK_H */ +diff --git a/include/uapi/linux/netlink_diag.h b/include/uapi/linux/netlink_diag.h +new file mode 100644 +index 0000000..c8c8c7d +--- /dev/null ++++ b/include/uapi/linux/netlink_diag.h +@@ -0,0 +1,64 @@ ++#ifndef __NETLINK_DIAG_H__ ++#define __NETLINK_DIAG_H__ ++ ++#include ++ ++struct netlink_diag_req { ++ __u8 sdiag_family; ++ __u8 sdiag_protocol; ++ __u16 pad; ++ __u32 ndiag_ino; ++ __u32 ndiag_show; ++ __u32 ndiag_cookie[2]; ++}; ++ ++struct netlink_diag_msg { ++ __u8 ndiag_family; ++ __u8 ndiag_type; ++ __u8 ndiag_protocol; ++ __u8 ndiag_state; ++ ++ __u32 ndiag_portid; ++ __u32 ndiag_dst_portid; ++ __u32 ndiag_dst_group; ++ __u32 ndiag_ino; ++ __u32 ndiag_cookie[2]; ++}; ++ ++struct netlink_diag_ring { ++ __u32 ndr_block_size; ++ __u32 ndr_block_nr; ++ __u32 ndr_frame_size; ++ __u32 ndr_frame_nr; ++}; ++ ++enum { ++ /* NETLINK_DIAG_NONE, standard nl API requires this attribute! */ ++ NETLINK_DIAG_MEMINFO, ++ NETLINK_DIAG_GROUPS, ++ NETLINK_DIAG_RX_RING, ++ NETLINK_DIAG_TX_RING, ++ NETLINK_DIAG_FLAGS, ++ ++ __NETLINK_DIAG_MAX, ++}; ++ ++#define NETLINK_DIAG_MAX (__NETLINK_DIAG_MAX - 1) ++ ++#define NDIAG_PROTO_ALL ((__u8) ~0) ++ ++#define NDIAG_SHOW_MEMINFO 0x00000001 /* show memory info of a socket */ ++#define NDIAG_SHOW_GROUPS 0x00000002 /* show groups of a netlink socket */ ++/* deprecated since 4.6 */ ++#define NDIAG_SHOW_RING_CFG 0x00000004 /* show ring configuration */ ++#define NDIAG_SHOW_FLAGS 0x00000008 /* show flags of a netlink socket */ ++ ++/* flags */ ++#define NDIAG_FLAG_CB_RUNNING 0x00000001 ++#define NDIAG_FLAG_PKTINFO 0x00000002 ++#define NDIAG_FLAG_BROADCAST_ERROR 0x00000004 ++#define NDIAG_FLAG_NO_ENOBUFS 0x00000008 ++#define NDIAG_FLAG_LISTEN_ALL_NSID 0x00000010 ++#define NDIAG_FLAG_CAP_ACK 0x00000020 ++ ++#endif +diff --git a/include/uapi/linux/packet_diag.h b/include/uapi/linux/packet_diag.h +new file mode 100644 +index 0000000..0c5d5dd +--- /dev/null ++++ b/include/uapi/linux/packet_diag.h +@@ -0,0 +1,80 @@ ++#ifndef __PACKET_DIAG_H__ ++#define __PACKET_DIAG_H__ ++ ++#include ++ ++struct packet_diag_req { ++ __u8 sdiag_family; ++ __u8 sdiag_protocol; ++ __u16 pad; ++ __u32 pdiag_ino; ++ __u32 pdiag_show; ++ __u32 pdiag_cookie[2]; ++}; ++ ++#define PACKET_SHOW_INFO 0x00000001 /* Basic packet_sk information */ ++#define PACKET_SHOW_MCLIST 0x00000002 /* A set of packet_diag_mclist-s */ ++#define PACKET_SHOW_RING_CFG 0x00000004 /* Rings configuration parameters */ ++#define PACKET_SHOW_FANOUT 0x00000008 ++#define PACKET_SHOW_MEMINFO 0x00000010 ++#define PACKET_SHOW_FILTER 0x00000020 ++ ++struct packet_diag_msg { ++ __u8 pdiag_family; ++ __u8 pdiag_type; ++ __u16 pdiag_num; ++ ++ __u32 pdiag_ino; ++ __u32 pdiag_cookie[2]; ++}; ++ ++enum { ++ /* PACKET_DIAG_NONE, standard nl API requires this attribute! */ ++ PACKET_DIAG_INFO, ++ PACKET_DIAG_MCLIST, ++ PACKET_DIAG_RX_RING, ++ PACKET_DIAG_TX_RING, ++ PACKET_DIAG_FANOUT, ++ PACKET_DIAG_UID, ++ PACKET_DIAG_MEMINFO, ++ PACKET_DIAG_FILTER, ++ ++ __PACKET_DIAG_MAX, ++}; ++ ++#define PACKET_DIAG_MAX (__PACKET_DIAG_MAX - 1) ++ ++struct packet_diag_info { ++ __u32 pdi_index; ++ __u32 pdi_version; ++ __u32 pdi_reserve; ++ __u32 pdi_copy_thresh; ++ __u32 pdi_tstamp; ++ __u32 pdi_flags; ++ ++#define PDI_RUNNING 0x1 ++#define PDI_AUXDATA 0x2 ++#define PDI_ORIGDEV 0x4 ++#define PDI_VNETHDR 0x8 ++#define PDI_LOSS 0x10 ++}; ++ ++struct packet_diag_mclist { ++ __u32 pdmc_index; ++ __u32 pdmc_count; ++ __u16 pdmc_type; ++ __u16 pdmc_alen; ++ __u8 pdmc_addr[32]; /* MAX_ADDR_LEN */ ++}; ++ ++struct packet_diag_ring { ++ __u32 pdr_block_size; ++ __u32 pdr_block_nr; ++ __u32 pdr_frame_size; ++ __u32 pdr_frame_nr; ++ __u32 pdr_retire_tmo; ++ __u32 pdr_sizeof_priv; ++ __u32 pdr_features; ++}; ++ ++#endif +diff --git a/include/uapi/linux/param.h b/include/uapi/linux/param.h +new file mode 100644 +index 0000000..092e92f +--- /dev/null ++++ b/include/uapi/linux/param.h +@@ -0,0 +1,6 @@ ++#ifndef _LINUX_PARAM_H ++#define _LINUX_PARAM_H ++ ++#include ++ ++#endif +diff --git a/include/uapi/linux/pfkeyv2.h b/include/uapi/linux/pfkeyv2.h +new file mode 100644 +index 0000000..ada7f01 +--- /dev/null ++++ b/include/uapi/linux/pfkeyv2.h +@@ -0,0 +1,383 @@ ++/* PF_KEY user interface, this is defined by rfc2367 so ++ * do not make arbitrary modifications or else this header ++ * file will not be compliant. ++ */ ++ ++#ifndef _LINUX_PFKEY2_H ++#define _LINUX_PFKEY2_H ++ ++#include ++ ++#define PF_KEY_V2 2 ++#define PFKEYV2_REVISION 199806L ++ ++struct sadb_msg { ++ __u8 sadb_msg_version; ++ __u8 sadb_msg_type; ++ __u8 sadb_msg_errno; ++ __u8 sadb_msg_satype; ++ __u16 sadb_msg_len; ++ __u16 sadb_msg_reserved; ++ __u32 sadb_msg_seq; ++ __u32 sadb_msg_pid; ++} __attribute__((packed)); ++/* sizeof(struct sadb_msg) == 16 */ ++ ++struct sadb_ext { ++ __u16 sadb_ext_len; ++ __u16 sadb_ext_type; ++} __attribute__((packed)); ++/* sizeof(struct sadb_ext) == 4 */ ++ ++struct sadb_sa { ++ __u16 sadb_sa_len; ++ __u16 sadb_sa_exttype; ++ __be32 sadb_sa_spi; ++ __u8 sadb_sa_replay; ++ __u8 sadb_sa_state; ++ __u8 sadb_sa_auth; ++ __u8 sadb_sa_encrypt; ++ __u32 sadb_sa_flags; ++} __attribute__((packed)); ++/* sizeof(struct sadb_sa) == 16 */ ++ ++struct sadb_lifetime { ++ __u16 sadb_lifetime_len; ++ __u16 sadb_lifetime_exttype; ++ __u32 sadb_lifetime_allocations; ++ __u64 sadb_lifetime_bytes; ++ __u64 sadb_lifetime_addtime; ++ __u64 sadb_lifetime_usetime; ++} __attribute__((packed)); ++/* sizeof(struct sadb_lifetime) == 32 */ ++ ++struct sadb_address { ++ __u16 sadb_address_len; ++ __u16 sadb_address_exttype; ++ __u8 sadb_address_proto; ++ __u8 sadb_address_prefixlen; ++ __u16 sadb_address_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_address) == 8 */ ++ ++struct sadb_key { ++ __u16 sadb_key_len; ++ __u16 sadb_key_exttype; ++ __u16 sadb_key_bits; ++ __u16 sadb_key_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_key) == 8 */ ++ ++struct sadb_ident { ++ __u16 sadb_ident_len; ++ __u16 sadb_ident_exttype; ++ __u16 sadb_ident_type; ++ __u16 sadb_ident_reserved; ++ __u64 sadb_ident_id; ++} __attribute__((packed)); ++/* sizeof(struct sadb_ident) == 16 */ ++ ++struct sadb_sens { ++ __u16 sadb_sens_len; ++ __u16 sadb_sens_exttype; ++ __u32 sadb_sens_dpd; ++ __u8 sadb_sens_sens_level; ++ __u8 sadb_sens_sens_len; ++ __u8 sadb_sens_integ_level; ++ __u8 sadb_sens_integ_len; ++ __u32 sadb_sens_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_sens) == 16 */ ++ ++/* followed by: ++ __u64 sadb_sens_bitmap[sens_len]; ++ __u64 sadb_integ_bitmap[integ_len]; */ ++ ++struct sadb_prop { ++ __u16 sadb_prop_len; ++ __u16 sadb_prop_exttype; ++ __u8 sadb_prop_replay; ++ __u8 sadb_prop_reserved[3]; ++} __attribute__((packed)); ++/* sizeof(struct sadb_prop) == 8 */ ++ ++/* followed by: ++ struct sadb_comb sadb_combs[(sadb_prop_len + ++ sizeof(__u64) - sizeof(struct sadb_prop)) / ++ sizeof(struct sadb_comb)]; */ ++ ++struct sadb_comb { ++ __u8 sadb_comb_auth; ++ __u8 sadb_comb_encrypt; ++ __u16 sadb_comb_flags; ++ __u16 sadb_comb_auth_minbits; ++ __u16 sadb_comb_auth_maxbits; ++ __u16 sadb_comb_encrypt_minbits; ++ __u16 sadb_comb_encrypt_maxbits; ++ __u32 sadb_comb_reserved; ++ __u32 sadb_comb_soft_allocations; ++ __u32 sadb_comb_hard_allocations; ++ __u64 sadb_comb_soft_bytes; ++ __u64 sadb_comb_hard_bytes; ++ __u64 sadb_comb_soft_addtime; ++ __u64 sadb_comb_hard_addtime; ++ __u64 sadb_comb_soft_usetime; ++ __u64 sadb_comb_hard_usetime; ++} __attribute__((packed)); ++/* sizeof(struct sadb_comb) == 72 */ ++ ++struct sadb_supported { ++ __u16 sadb_supported_len; ++ __u16 sadb_supported_exttype; ++ __u32 sadb_supported_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_supported) == 8 */ ++ ++/* followed by: ++ struct sadb_alg sadb_algs[(sadb_supported_len + ++ sizeof(__u64) - sizeof(struct sadb_supported)) / ++ sizeof(struct sadb_alg)]; */ ++ ++struct sadb_alg { ++ __u8 sadb_alg_id; ++ __u8 sadb_alg_ivlen; ++ __u16 sadb_alg_minbits; ++ __u16 sadb_alg_maxbits; ++ __u16 sadb_alg_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_alg) == 8 */ ++ ++struct sadb_spirange { ++ __u16 sadb_spirange_len; ++ __u16 sadb_spirange_exttype; ++ __u32 sadb_spirange_min; ++ __u32 sadb_spirange_max; ++ __u32 sadb_spirange_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_spirange) == 16 */ ++ ++struct sadb_x_kmprivate { ++ __u16 sadb_x_kmprivate_len; ++ __u16 sadb_x_kmprivate_exttype; ++ __u32 sadb_x_kmprivate_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_kmprivate) == 8 */ ++ ++struct sadb_x_sa2 { ++ __u16 sadb_x_sa2_len; ++ __u16 sadb_x_sa2_exttype; ++ __u8 sadb_x_sa2_mode; ++ __u8 sadb_x_sa2_reserved1; ++ __u16 sadb_x_sa2_reserved2; ++ __u32 sadb_x_sa2_sequence; ++ __u32 sadb_x_sa2_reqid; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_sa2) == 16 */ ++ ++struct sadb_x_policy { ++ __u16 sadb_x_policy_len; ++ __u16 sadb_x_policy_exttype; ++ __u16 sadb_x_policy_type; ++ __u8 sadb_x_policy_dir; ++ __u8 sadb_x_policy_reserved; ++ __u32 sadb_x_policy_id; ++ __u32 sadb_x_policy_priority; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_policy) == 16 */ ++ ++struct sadb_x_ipsecrequest { ++ __u16 sadb_x_ipsecrequest_len; ++ __u16 sadb_x_ipsecrequest_proto; ++ __u8 sadb_x_ipsecrequest_mode; ++ __u8 sadb_x_ipsecrequest_level; ++ __u16 sadb_x_ipsecrequest_reserved1; ++ __u32 sadb_x_ipsecrequest_reqid; ++ __u32 sadb_x_ipsecrequest_reserved2; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_ipsecrequest) == 16 */ ++ ++/* This defines the TYPE of Nat Traversal in use. Currently only one ++ * type of NAT-T is supported, draft-ietf-ipsec-udp-encaps-06 ++ */ ++struct sadb_x_nat_t_type { ++ __u16 sadb_x_nat_t_type_len; ++ __u16 sadb_x_nat_t_type_exttype; ++ __u8 sadb_x_nat_t_type_type; ++ __u8 sadb_x_nat_t_type_reserved[3]; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_nat_t_type) == 8 */ ++ ++/* Pass a NAT Traversal port (Source or Dest port) */ ++struct sadb_x_nat_t_port { ++ __u16 sadb_x_nat_t_port_len; ++ __u16 sadb_x_nat_t_port_exttype; ++ __be16 sadb_x_nat_t_port_port; ++ __u16 sadb_x_nat_t_port_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_nat_t_port) == 8 */ ++ ++/* Generic LSM security context */ ++struct sadb_x_sec_ctx { ++ __u16 sadb_x_sec_len; ++ __u16 sadb_x_sec_exttype; ++ __u8 sadb_x_ctx_alg; /* LSMs: e.g., selinux == 1 */ ++ __u8 sadb_x_ctx_doi; ++ __u16 sadb_x_ctx_len; ++} __attribute__((packed)); ++/* sizeof(struct sadb_sec_ctx) = 8 */ ++ ++/* Used by MIGRATE to pass addresses IKE will use to perform ++ * negotiation with the peer */ ++struct sadb_x_kmaddress { ++ __u16 sadb_x_kmaddress_len; ++ __u16 sadb_x_kmaddress_exttype; ++ __u32 sadb_x_kmaddress_reserved; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_kmaddress) == 8 */ ++ ++/* To specify the SA dump filter */ ++struct sadb_x_filter { ++ __u16 sadb_x_filter_len; ++ __u16 sadb_x_filter_exttype; ++ __u32 sadb_x_filter_saddr[4]; ++ __u32 sadb_x_filter_daddr[4]; ++ __u16 sadb_x_filter_family; ++ __u8 sadb_x_filter_splen; ++ __u8 sadb_x_filter_dplen; ++} __attribute__((packed)); ++/* sizeof(struct sadb_x_filter) == 40 */ ++ ++/* Message types */ ++#define SADB_RESERVED 0 ++#define SADB_GETSPI 1 ++#define SADB_UPDATE 2 ++#define SADB_ADD 3 ++#define SADB_DELETE 4 ++#define SADB_GET 5 ++#define SADB_ACQUIRE 6 ++#define SADB_REGISTER 7 ++#define SADB_EXPIRE 8 ++#define SADB_FLUSH 9 ++#define SADB_DUMP 10 ++#define SADB_X_PROMISC 11 ++#define SADB_X_PCHANGE 12 ++#define SADB_X_SPDUPDATE 13 ++#define SADB_X_SPDADD 14 ++#define SADB_X_SPDDELETE 15 ++#define SADB_X_SPDGET 16 ++#define SADB_X_SPDACQUIRE 17 ++#define SADB_X_SPDDUMP 18 ++#define SADB_X_SPDFLUSH 19 ++#define SADB_X_SPDSETIDX 20 ++#define SADB_X_SPDEXPIRE 21 ++#define SADB_X_SPDDELETE2 22 ++#define SADB_X_NAT_T_NEW_MAPPING 23 ++#define SADB_X_MIGRATE 24 ++#define SADB_MAX 24 ++ ++/* Security Association flags */ ++#define SADB_SAFLAGS_PFS 1 ++#define SADB_SAFLAGS_NOPMTUDISC 0x20000000 ++#define SADB_SAFLAGS_DECAP_DSCP 0x40000000 ++#define SADB_SAFLAGS_NOECN 0x80000000 ++ ++/* Security Association states */ ++#define SADB_SASTATE_LARVAL 0 ++#define SADB_SASTATE_MATURE 1 ++#define SADB_SASTATE_DYING 2 ++#define SADB_SASTATE_DEAD 3 ++#define SADB_SASTATE_MAX 3 ++ ++/* Security Association types */ ++#define SADB_SATYPE_UNSPEC 0 ++#define SADB_SATYPE_AH 2 ++#define SADB_SATYPE_ESP 3 ++#define SADB_SATYPE_RSVP 5 ++#define SADB_SATYPE_OSPFV2 6 ++#define SADB_SATYPE_RIPV2 7 ++#define SADB_SATYPE_MIP 8 ++#define SADB_X_SATYPE_IPCOMP 9 ++#define SADB_SATYPE_MAX 9 ++ ++/* Authentication algorithms */ ++#define SADB_AALG_NONE 0 ++#define SADB_AALG_MD5HMAC 2 ++#define SADB_AALG_SHA1HMAC 3 ++#define SADB_X_AALG_SHA2_256HMAC 5 ++#define SADB_X_AALG_SHA2_384HMAC 6 ++#define SADB_X_AALG_SHA2_512HMAC 7 ++#define SADB_X_AALG_RIPEMD160HMAC 8 ++#define SADB_X_AALG_AES_XCBC_MAC 9 ++#define SADB_X_AALG_NULL 251 /* kame */ ++#define SADB_AALG_MAX 251 ++ ++/* Encryption algorithms */ ++#define SADB_EALG_NONE 0 ++#define SADB_EALG_DESCBC 2 ++#define SADB_EALG_3DESCBC 3 ++#define SADB_X_EALG_CASTCBC 6 ++#define SADB_X_EALG_BLOWFISHCBC 7 ++#define SADB_EALG_NULL 11 ++#define SADB_X_EALG_AESCBC 12 ++#define SADB_X_EALG_AESCTR 13 ++#define SADB_X_EALG_AES_CCM_ICV8 14 ++#define SADB_X_EALG_AES_CCM_ICV12 15 ++#define SADB_X_EALG_AES_CCM_ICV16 16 ++#define SADB_X_EALG_AES_GCM_ICV8 18 ++#define SADB_X_EALG_AES_GCM_ICV12 19 ++#define SADB_X_EALG_AES_GCM_ICV16 20 ++#define SADB_X_EALG_CAMELLIACBC 22 ++#define SADB_X_EALG_NULL_AES_GMAC 23 ++#define SADB_EALG_MAX 253 /* last EALG */ ++/* private allocations should use 249-255 (RFC2407) */ ++#define SADB_X_EALG_SERPENTCBC 252 /* draft-ietf-ipsec-ciph-aes-cbc-00 */ ++#define SADB_X_EALG_TWOFISHCBC 253 /* draft-ietf-ipsec-ciph-aes-cbc-00 */ ++ ++/* Compression algorithms */ ++#define SADB_X_CALG_NONE 0 ++#define SADB_X_CALG_OUI 1 ++#define SADB_X_CALG_DEFLATE 2 ++#define SADB_X_CALG_LZS 3 ++#define SADB_X_CALG_LZJH 4 ++#define SADB_X_CALG_MAX 4 ++ ++/* Extension Header values */ ++#define SADB_EXT_RESERVED 0 ++#define SADB_EXT_SA 1 ++#define SADB_EXT_LIFETIME_CURRENT 2 ++#define SADB_EXT_LIFETIME_HARD 3 ++#define SADB_EXT_LIFETIME_SOFT 4 ++#define SADB_EXT_ADDRESS_SRC 5 ++#define SADB_EXT_ADDRESS_DST 6 ++#define SADB_EXT_ADDRESS_PROXY 7 ++#define SADB_EXT_KEY_AUTH 8 ++#define SADB_EXT_KEY_ENCRYPT 9 ++#define SADB_EXT_IDENTITY_SRC 10 ++#define SADB_EXT_IDENTITY_DST 11 ++#define SADB_EXT_SENSITIVITY 12 ++#define SADB_EXT_PROPOSAL 13 ++#define SADB_EXT_SUPPORTED_AUTH 14 ++#define SADB_EXT_SUPPORTED_ENCRYPT 15 ++#define SADB_EXT_SPIRANGE 16 ++#define SADB_X_EXT_KMPRIVATE 17 ++#define SADB_X_EXT_POLICY 18 ++#define SADB_X_EXT_SA2 19 ++/* The next four entries are for setting up NAT Traversal */ ++#define SADB_X_EXT_NAT_T_TYPE 20 ++#define SADB_X_EXT_NAT_T_SPORT 21 ++#define SADB_X_EXT_NAT_T_DPORT 22 ++#define SADB_X_EXT_NAT_T_OA 23 ++#define SADB_X_EXT_SEC_CTX 24 ++/* Used with MIGRATE to pass @ to IKE for negotiation */ ++#define SADB_X_EXT_KMADDRESS 25 ++#define SADB_X_EXT_FILTER 26 ++#define SADB_EXT_MAX 26 ++ ++/* Identity Extension values */ ++#define SADB_IDENTTYPE_RESERVED 0 ++#define SADB_IDENTTYPE_PREFIX 1 ++#define SADB_IDENTTYPE_FQDN 2 ++#define SADB_IDENTTYPE_USERFQDN 3 ++#define SADB_IDENTTYPE_MAX 3 ++ ++#endif /* !(_LINUX_PFKEY2_H) */ +diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h +new file mode 100644 +index 0000000..d5e2bf6 +--- /dev/null ++++ b/include/uapi/linux/pkt_cls.h +@@ -0,0 +1,569 @@ ++#ifndef __LINUX_PKT_CLS_H ++#define __LINUX_PKT_CLS_H ++ ++#include ++#include ++ ++#define TC_COOKIE_MAX_SIZE 16 ++ ++/* Action attributes */ ++enum { ++ TCA_ACT_UNSPEC, ++ TCA_ACT_KIND, ++ TCA_ACT_OPTIONS, ++ TCA_ACT_INDEX, ++ TCA_ACT_STATS, ++ TCA_ACT_PAD, ++ TCA_ACT_COOKIE, ++ __TCA_ACT_MAX ++}; ++ ++#define TCA_ACT_MAX __TCA_ACT_MAX ++#define TCA_OLD_COMPAT (TCA_ACT_MAX+1) ++#define TCA_ACT_MAX_PRIO 32 ++#define TCA_ACT_BIND 1 ++#define TCA_ACT_NOBIND 0 ++#define TCA_ACT_UNBIND 1 ++#define TCA_ACT_NOUNBIND 0 ++#define TCA_ACT_REPLACE 1 ++#define TCA_ACT_NOREPLACE 0 ++ ++#define TC_ACT_UNSPEC (-1) ++#define TC_ACT_OK 0 ++#define TC_ACT_RECLASSIFY 1 ++#define TC_ACT_SHOT 2 ++#define TC_ACT_PIPE 3 ++#define TC_ACT_STOLEN 4 ++#define TC_ACT_QUEUED 5 ++#define TC_ACT_REPEAT 6 ++#define TC_ACT_REDIRECT 7 ++#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" ++ * and don't further process the frame ++ * in hardware. For sw path, this is ++ * equivalent of TC_ACT_STOLEN - drop ++ * the skb and act like everything ++ * is alright. ++ */ ++ ++/* There is a special kind of actions called "extended actions", ++ * which need a value parameter. These have a local opcode located in ++ * the highest nibble, starting from 1. The rest of the bits ++ * are used to carry the value. These two parts together make ++ * a combined opcode. ++ */ ++#define __TC_ACT_EXT_SHIFT 28 ++#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) ++#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) ++#define TC_ACT_EXT_CMP(combined, opcode) \ ++ (((combined) & (~TC_ACT_EXT_VAL_MASK)) == opcode) ++ ++#define TC_ACT_JUMP __TC_ACT_EXT(1) ++#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) ++ ++/* Action type identifiers*/ ++enum { ++ TCA_ID_UNSPEC=0, ++ TCA_ID_POLICE=1, ++ /* other actions go here */ ++ __TCA_ID_MAX=255 ++}; ++ ++#define TCA_ID_MAX __TCA_ID_MAX ++ ++struct tc_police { ++ __u32 index; ++ int action; ++#define TC_POLICE_UNSPEC TC_ACT_UNSPEC ++#define TC_POLICE_OK TC_ACT_OK ++#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY ++#define TC_POLICE_SHOT TC_ACT_SHOT ++#define TC_POLICE_PIPE TC_ACT_PIPE ++ ++ __u32 limit; ++ __u32 burst; ++ __u32 mtu; ++ struct tc_ratespec rate; ++ struct tc_ratespec peakrate; ++ int refcnt; ++ int bindcnt; ++ __u32 capab; ++}; ++ ++struct tcf_t { ++ __u64 install; ++ __u64 lastuse; ++ __u64 expires; ++ __u64 firstuse; ++}; ++ ++struct tc_cnt { ++ int refcnt; ++ int bindcnt; ++}; ++ ++#define tc_gen \ ++ __u32 index; \ ++ __u32 capab; \ ++ int action; \ ++ int refcnt; \ ++ int bindcnt ++ ++enum { ++ TCA_POLICE_UNSPEC, ++ TCA_POLICE_TBF, ++ TCA_POLICE_RATE, ++ TCA_POLICE_PEAKRATE, ++ TCA_POLICE_AVRATE, ++ TCA_POLICE_RESULT, ++ TCA_POLICE_TM, ++ TCA_POLICE_PAD, ++ __TCA_POLICE_MAX ++#define TCA_POLICE_RESULT TCA_POLICE_RESULT ++}; ++ ++#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) ++ ++/* tca flags definitions */ ++#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */ ++#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ ++#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ ++#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ ++ ++/* U32 filters */ ++ ++#define TC_U32_HTID(h) ((h)&0xFFF00000) ++#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20) ++#define TC_U32_HASH(h) (((h)>>12)&0xFF) ++#define TC_U32_NODE(h) ((h)&0xFFF) ++#define TC_U32_KEY(h) ((h)&0xFFFFF) ++#define TC_U32_UNSPEC 0 ++#define TC_U32_ROOT (0xFFF00000) ++ ++enum { ++ TCA_U32_UNSPEC, ++ TCA_U32_CLASSID, ++ TCA_U32_HASH, ++ TCA_U32_LINK, ++ TCA_U32_DIVISOR, ++ TCA_U32_SEL, ++ TCA_U32_POLICE, ++ TCA_U32_ACT, ++ TCA_U32_INDEV, ++ TCA_U32_PCNT, ++ TCA_U32_MARK, ++ TCA_U32_FLAGS, ++ TCA_U32_PAD, ++ __TCA_U32_MAX ++}; ++ ++#define TCA_U32_MAX (__TCA_U32_MAX - 1) ++ ++struct tc_u32_key { ++ __be32 mask; ++ __be32 val; ++ int off; ++ int offmask; ++}; ++ ++struct tc_u32_sel { ++ unsigned char flags; ++ unsigned char offshift; ++ unsigned char nkeys; ++ ++ __be16 offmask; ++ __u16 off; ++ short offoff; ++ ++ short hoff; ++ __be32 hmask; ++ struct tc_u32_key keys[0]; ++}; ++ ++struct tc_u32_mark { ++ __u32 val; ++ __u32 mask; ++ __u32 success; ++}; ++ ++struct tc_u32_pcnt { ++ __u64 rcnt; ++ __u64 rhit; ++ __u64 kcnts[0]; ++}; ++ ++/* Flags */ ++ ++#define TC_U32_TERMINAL 1 ++#define TC_U32_OFFSET 2 ++#define TC_U32_VAROFFSET 4 ++#define TC_U32_EAT 8 ++ ++#define TC_U32_MAXDEPTH 8 ++ ++ ++/* RSVP filter */ ++ ++enum { ++ TCA_RSVP_UNSPEC, ++ TCA_RSVP_CLASSID, ++ TCA_RSVP_DST, ++ TCA_RSVP_SRC, ++ TCA_RSVP_PINFO, ++ TCA_RSVP_POLICE, ++ TCA_RSVP_ACT, ++ __TCA_RSVP_MAX ++}; ++ ++#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 ) ++ ++struct tc_rsvp_gpi { ++ __u32 key; ++ __u32 mask; ++ int offset; ++}; ++ ++struct tc_rsvp_pinfo { ++ struct tc_rsvp_gpi dpi; ++ struct tc_rsvp_gpi spi; ++ __u8 protocol; ++ __u8 tunnelid; ++ __u8 tunnelhdr; ++ __u8 pad; ++}; ++ ++/* ROUTE filter */ ++ ++enum { ++ TCA_ROUTE4_UNSPEC, ++ TCA_ROUTE4_CLASSID, ++ TCA_ROUTE4_TO, ++ TCA_ROUTE4_FROM, ++ TCA_ROUTE4_IIF, ++ TCA_ROUTE4_POLICE, ++ TCA_ROUTE4_ACT, ++ __TCA_ROUTE4_MAX ++}; ++ ++#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) ++ ++ ++/* FW filter */ ++ ++enum { ++ TCA_FW_UNSPEC, ++ TCA_FW_CLASSID, ++ TCA_FW_POLICE, ++ TCA_FW_INDEV, /* used by CONFIG_NET_CLS_IND */ ++ TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */ ++ TCA_FW_MASK, ++ __TCA_FW_MAX ++}; ++ ++#define TCA_FW_MAX (__TCA_FW_MAX - 1) ++ ++/* TC index filter */ ++ ++enum { ++ TCA_TCINDEX_UNSPEC, ++ TCA_TCINDEX_HASH, ++ TCA_TCINDEX_MASK, ++ TCA_TCINDEX_SHIFT, ++ TCA_TCINDEX_FALL_THROUGH, ++ TCA_TCINDEX_CLASSID, ++ TCA_TCINDEX_POLICE, ++ TCA_TCINDEX_ACT, ++ __TCA_TCINDEX_MAX ++}; ++ ++#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) ++ ++/* Flow filter */ ++ ++enum { ++ FLOW_KEY_SRC, ++ FLOW_KEY_DST, ++ FLOW_KEY_PROTO, ++ FLOW_KEY_PROTO_SRC, ++ FLOW_KEY_PROTO_DST, ++ FLOW_KEY_IIF, ++ FLOW_KEY_PRIORITY, ++ FLOW_KEY_MARK, ++ FLOW_KEY_NFCT, ++ FLOW_KEY_NFCT_SRC, ++ FLOW_KEY_NFCT_DST, ++ FLOW_KEY_NFCT_PROTO_SRC, ++ FLOW_KEY_NFCT_PROTO_DST, ++ FLOW_KEY_RTCLASSID, ++ FLOW_KEY_SKUID, ++ FLOW_KEY_SKGID, ++ FLOW_KEY_VLAN_TAG, ++ FLOW_KEY_RXHASH, ++ __FLOW_KEY_MAX, ++}; ++ ++#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1) ++ ++enum { ++ FLOW_MODE_MAP, ++ FLOW_MODE_HASH, ++}; ++ ++enum { ++ TCA_FLOW_UNSPEC, ++ TCA_FLOW_KEYS, ++ TCA_FLOW_MODE, ++ TCA_FLOW_BASECLASS, ++ TCA_FLOW_RSHIFT, ++ TCA_FLOW_ADDEND, ++ TCA_FLOW_MASK, ++ TCA_FLOW_XOR, ++ TCA_FLOW_DIVISOR, ++ TCA_FLOW_ACT, ++ TCA_FLOW_POLICE, ++ TCA_FLOW_EMATCHES, ++ TCA_FLOW_PERTURB, ++ __TCA_FLOW_MAX ++}; ++ ++#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1) ++ ++/* Basic filter */ ++ ++enum { ++ TCA_BASIC_UNSPEC, ++ TCA_BASIC_CLASSID, ++ TCA_BASIC_EMATCHES, ++ TCA_BASIC_ACT, ++ TCA_BASIC_POLICE, ++ __TCA_BASIC_MAX ++}; ++ ++#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1) ++ ++ ++/* Cgroup classifier */ ++ ++enum { ++ TCA_CGROUP_UNSPEC, ++ TCA_CGROUP_ACT, ++ TCA_CGROUP_POLICE, ++ TCA_CGROUP_EMATCHES, ++ __TCA_CGROUP_MAX, ++}; ++ ++#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) ++ ++/* BPF classifier */ ++ ++#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0) ++ ++enum { ++ TCA_BPF_UNSPEC, ++ TCA_BPF_ACT, ++ TCA_BPF_POLICE, ++ TCA_BPF_CLASSID, ++ TCA_BPF_OPS_LEN, ++ TCA_BPF_OPS, ++ TCA_BPF_FD, ++ TCA_BPF_NAME, ++ TCA_BPF_FLAGS, ++ TCA_BPF_FLAGS_GEN, ++ TCA_BPF_TAG, ++ TCA_BPF_ID, ++ __TCA_BPF_MAX, ++}; ++ ++#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) ++ ++/* Flower classifier */ ++ ++enum { ++ TCA_FLOWER_UNSPEC, ++ TCA_FLOWER_CLASSID, ++ TCA_FLOWER_INDEV, ++ TCA_FLOWER_ACT, ++ TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ETH_TYPE, /* be16 */ ++ TCA_FLOWER_KEY_IP_PROTO, /* u8 */ ++ TCA_FLOWER_KEY_IPV4_SRC, /* be32 */ ++ TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */ ++ TCA_FLOWER_KEY_IPV4_DST, /* be32 */ ++ TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */ ++ TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */ ++ TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */ ++ TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */ ++ TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */ ++ TCA_FLOWER_KEY_TCP_SRC, /* be16 */ ++ TCA_FLOWER_KEY_TCP_DST, /* be16 */ ++ TCA_FLOWER_KEY_UDP_SRC, /* be16 */ ++ TCA_FLOWER_KEY_UDP_DST, /* be16 */ ++ ++ TCA_FLOWER_FLAGS, ++ TCA_FLOWER_KEY_VLAN_ID, /* be16 */ ++ TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */ ++ TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */ ++ ++ TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */ ++ TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */ ++ TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */ ++ TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */ ++ TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */ ++ TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */ ++ TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */ ++ TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */ ++ TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */ ++ ++ TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */ ++ TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */ ++ TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */ ++ TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */ ++ TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */ ++ TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */ ++ ++ TCA_FLOWER_KEY_SCTP_SRC, /* be16 */ ++ TCA_FLOWER_KEY_SCTP_DST, /* be16 */ ++ ++ TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */ ++ TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ ++ TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ ++ TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ ++ ++ TCA_FLOWER_KEY_FLAGS, /* be32 */ ++ TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ ++ ++ TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */ ++ TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */ ++ TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */ ++ TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */ ++ TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */ ++ TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */ ++ TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */ ++ TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */ ++ ++ TCA_FLOWER_KEY_ARP_SIP, /* be32 */ ++ TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */ ++ TCA_FLOWER_KEY_ARP_TIP, /* be32 */ ++ TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */ ++ TCA_FLOWER_KEY_ARP_OP, /* u8 */ ++ TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */ ++ TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ ++ TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ ++ ++ TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ ++ TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ ++ TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ ++ TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ ++ ++ TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ ++ TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ ++ ++ TCA_FLOWER_KEY_IP_TOS, /* u8 */ ++ TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ ++ TCA_FLOWER_KEY_IP_TTL, /* u8 */ ++ TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ ++ ++ __TCA_FLOWER_MAX, ++}; ++ ++#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) ++ ++enum { ++ TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), ++}; ++ ++/* Match-all classifier */ ++ ++enum { ++ TCA_MATCHALL_UNSPEC, ++ TCA_MATCHALL_CLASSID, ++ TCA_MATCHALL_ACT, ++ TCA_MATCHALL_FLAGS, ++ __TCA_MATCHALL_MAX, ++}; ++ ++#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1) ++ ++/* Extended Matches */ ++ ++struct tcf_ematch_tree_hdr { ++ __u16 nmatches; ++ __u16 progid; ++}; ++ ++enum { ++ TCA_EMATCH_TREE_UNSPEC, ++ TCA_EMATCH_TREE_HDR, ++ TCA_EMATCH_TREE_LIST, ++ __TCA_EMATCH_TREE_MAX ++}; ++#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1) ++ ++struct tcf_ematch_hdr { ++ __u16 matchid; ++ __u16 kind; ++ __u16 flags; ++ __u16 pad; /* currently unused */ ++}; ++ ++/* 0 1 ++ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++ * +-----------------------+-+-+---+ ++ * | Unused |S|I| R | ++ * +-----------------------+-+-+---+ ++ * ++ * R(2) ::= relation to next ematch ++ * where: 0 0 END (last ematch) ++ * 0 1 AND ++ * 1 0 OR ++ * 1 1 Unused (invalid) ++ * I(1) ::= invert result ++ * S(1) ::= simple payload ++ */ ++#define TCF_EM_REL_END 0 ++#define TCF_EM_REL_AND (1<<0) ++#define TCF_EM_REL_OR (1<<1) ++#define TCF_EM_INVERT (1<<2) ++#define TCF_EM_SIMPLE (1<<3) ++ ++#define TCF_EM_REL_MASK 3 ++#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK) ++ ++enum { ++ TCF_LAYER_LINK, ++ TCF_LAYER_NETWORK, ++ TCF_LAYER_TRANSPORT, ++ __TCF_LAYER_MAX ++}; ++#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1) ++ ++/* Ematch type assignments ++ * 1..32767 Reserved for ematches inside kernel tree ++ * 32768..65535 Free to use, not reliable ++ */ ++#define TCF_EM_CONTAINER 0 ++#define TCF_EM_CMP 1 ++#define TCF_EM_NBYTE 2 ++#define TCF_EM_U32 3 ++#define TCF_EM_META 4 ++#define TCF_EM_TEXT 5 ++#define TCF_EM_VLAN 6 ++#define TCF_EM_CANID 7 ++#define TCF_EM_IPSET 8 ++#define TCF_EM_MAX 8 ++ ++enum { ++ TCF_EM_PROG_TC ++}; ++ ++enum { ++ TCF_EM_OPND_EQ, ++ TCF_EM_OPND_GT, ++ TCF_EM_OPND_LT ++}; ++ ++#endif +diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h +new file mode 100644 +index 0000000..099bf55 +--- /dev/null ++++ b/include/uapi/linux/pkt_sched.h +@@ -0,0 +1,874 @@ ++#ifndef __LINUX_PKT_SCHED_H ++#define __LINUX_PKT_SCHED_H ++ ++#include ++ ++/* Logical priority bands not depending on specific packet scheduler. ++ Every scheduler will map them to real traffic classes, if it has ++ no more precise mechanism to classify packets. ++ ++ These numbers have no special meaning, though their coincidence ++ with obsolete IPv6 values is not occasional :-). New IPv6 drafts ++ preferred full anarchy inspired by diffserv group. ++ ++ Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy ++ class, actually, as rule it will be handled with more care than ++ filler or even bulk. ++ */ ++ ++#define TC_PRIO_BESTEFFORT 0 ++#define TC_PRIO_FILLER 1 ++#define TC_PRIO_BULK 2 ++#define TC_PRIO_INTERACTIVE_BULK 4 ++#define TC_PRIO_INTERACTIVE 6 ++#define TC_PRIO_CONTROL 7 ++ ++#define TC_PRIO_MAX 15 ++ ++/* Generic queue statistics, available for all the elements. ++ Particular schedulers may have also their private records. ++ */ ++ ++struct tc_stats { ++ __u64 bytes; /* Number of enqueued bytes */ ++ __u32 packets; /* Number of enqueued packets */ ++ __u32 drops; /* Packets dropped because of lack of resources */ ++ __u32 overlimits; /* Number of throttle events when this ++ * flow goes out of allocated bandwidth */ ++ __u32 bps; /* Current flow byte rate */ ++ __u32 pps; /* Current flow packet rate */ ++ __u32 qlen; ++ __u32 backlog; ++}; ++ ++struct tc_estimator { ++ signed char interval; ++ unsigned char ewma_log; ++}; ++ ++/* "Handles" ++ --------- ++ ++ All the traffic control objects have 32bit identifiers, or "handles". ++ ++ They can be considered as opaque numbers from user API viewpoint, ++ but actually they always consist of two fields: major and ++ minor numbers, which are interpreted by kernel specially, ++ that may be used by applications, though not recommended. ++ ++ F.e. qdisc handles always have minor number equal to zero, ++ classes (or flows) have major equal to parent qdisc major, and ++ minor uniquely identifying class inside qdisc. ++ ++ Macros to manipulate handles: ++ */ ++ ++#define TC_H_MAJ_MASK (0xFFFF0000U) ++#define TC_H_MIN_MASK (0x0000FFFFU) ++#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) ++#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) ++#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) ++ ++#define TC_H_UNSPEC (0U) ++#define TC_H_ROOT (0xFFFFFFFFU) ++#define TC_H_INGRESS (0xFFFFFFF1U) ++#define TC_H_CLSACT TC_H_INGRESS ++ ++#define TC_H_MIN_INGRESS 0xFFF2U ++#define TC_H_MIN_EGRESS 0xFFF3U ++ ++/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */ ++enum tc_link_layer { ++ TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */ ++ TC_LINKLAYER_ETHERNET, ++ TC_LINKLAYER_ATM, ++}; ++#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */ ++ ++struct tc_ratespec { ++ unsigned char cell_log; ++ __u8 linklayer; /* lower 4 bits */ ++ unsigned short overhead; ++ short cell_align; ++ unsigned short mpu; ++ __u32 rate; ++}; ++ ++#define TC_RTAB_SIZE 1024 ++ ++struct tc_sizespec { ++ unsigned char cell_log; ++ unsigned char size_log; ++ short cell_align; ++ int overhead; ++ unsigned int linklayer; ++ unsigned int mpu; ++ unsigned int mtu; ++ unsigned int tsize; ++}; ++ ++enum { ++ TCA_STAB_UNSPEC, ++ TCA_STAB_BASE, ++ TCA_STAB_DATA, ++ __TCA_STAB_MAX ++}; ++ ++#define TCA_STAB_MAX (__TCA_STAB_MAX - 1) ++ ++/* FIFO section */ ++ ++struct tc_fifo_qopt { ++ __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ ++}; ++ ++/* PRIO section */ ++ ++#define TCQ_PRIO_BANDS 16 ++#define TCQ_MIN_PRIO_BANDS 2 ++ ++struct tc_prio_qopt { ++ int bands; /* Number of bands */ ++ __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ ++}; ++ ++/* MULTIQ section */ ++ ++struct tc_multiq_qopt { ++ __u16 bands; /* Number of bands */ ++ __u16 max_bands; /* Maximum number of queues */ ++}; ++ ++/* PLUG section */ ++ ++#define TCQ_PLUG_BUFFER 0 ++#define TCQ_PLUG_RELEASE_ONE 1 ++#define TCQ_PLUG_RELEASE_INDEFINITE 2 ++#define TCQ_PLUG_LIMIT 3 ++ ++struct tc_plug_qopt { ++ /* TCQ_PLUG_BUFFER: Inset a plug into the queue and ++ * buffer any incoming packets ++ * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head ++ * to beginning of the next plug. ++ * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. ++ * Stop buffering packets until the next TCQ_PLUG_BUFFER ++ * command is received (just act as a pass-thru queue). ++ * TCQ_PLUG_LIMIT: Increase/decrease queue size ++ */ ++ int action; ++ __u32 limit; ++}; ++ ++/* TBF section */ ++ ++struct tc_tbf_qopt { ++ struct tc_ratespec rate; ++ struct tc_ratespec peakrate; ++ __u32 limit; ++ __u32 buffer; ++ __u32 mtu; ++}; ++ ++enum { ++ TCA_TBF_UNSPEC, ++ TCA_TBF_PARMS, ++ TCA_TBF_RTAB, ++ TCA_TBF_PTAB, ++ TCA_TBF_RATE64, ++ TCA_TBF_PRATE64, ++ TCA_TBF_BURST, ++ TCA_TBF_PBURST, ++ TCA_TBF_PAD, ++ __TCA_TBF_MAX, ++}; ++ ++#define TCA_TBF_MAX (__TCA_TBF_MAX - 1) ++ ++ ++/* TEQL section */ ++ ++/* TEQL does not require any parameters */ ++ ++/* SFQ section */ ++ ++struct tc_sfq_qopt { ++ unsigned quantum; /* Bytes per round allocated to flow */ ++ int perturb_period; /* Period of hash perturbation */ ++ __u32 limit; /* Maximal packets in queue */ ++ unsigned divisor; /* Hash divisor */ ++ unsigned flows; /* Maximal number of flows */ ++}; ++ ++struct tc_sfqred_stats { ++ __u32 prob_drop; /* Early drops, below max threshold */ ++ __u32 forced_drop; /* Early drops, after max threshold */ ++ __u32 prob_mark; /* Marked packets, below max threshold */ ++ __u32 forced_mark; /* Marked packets, after max threshold */ ++ __u32 prob_mark_head; /* Marked packets, below max threshold */ ++ __u32 forced_mark_head;/* Marked packets, after max threshold */ ++}; ++ ++struct tc_sfq_qopt_v1 { ++ struct tc_sfq_qopt v0; ++ unsigned int depth; /* max number of packets per flow */ ++ unsigned int headdrop; ++/* SFQRED parameters */ ++ __u32 limit; /* HARD maximal flow queue length (bytes) */ ++ __u32 qth_min; /* Min average length threshold (bytes) */ ++ __u32 qth_max; /* Max average length threshold (bytes) */ ++ unsigned char Wlog; /* log(W) */ ++ unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ ++ unsigned char Scell_log; /* cell size for idle damping */ ++ unsigned char flags; ++ __u32 max_P; /* probability, high resolution */ ++/* SFQRED stats */ ++ struct tc_sfqred_stats stats; ++}; ++ ++ ++struct tc_sfq_xstats { ++ __s32 allot; ++}; ++ ++/* RED section */ ++ ++enum { ++ TCA_RED_UNSPEC, ++ TCA_RED_PARMS, ++ TCA_RED_STAB, ++ TCA_RED_MAX_P, ++ __TCA_RED_MAX, ++}; ++ ++#define TCA_RED_MAX (__TCA_RED_MAX - 1) ++ ++struct tc_red_qopt { ++ __u32 limit; /* HARD maximal queue length (bytes) */ ++ __u32 qth_min; /* Min average length threshold (bytes) */ ++ __u32 qth_max; /* Max average length threshold (bytes) */ ++ unsigned char Wlog; /* log(W) */ ++ unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ ++ unsigned char Scell_log; /* cell size for idle damping */ ++ unsigned char flags; ++#define TC_RED_ECN 1 ++#define TC_RED_HARDDROP 2 ++#define TC_RED_ADAPTATIVE 4 ++}; ++ ++struct tc_red_xstats { ++ __u32 early; /* Early drops */ ++ __u32 pdrop; /* Drops due to queue limits */ ++ __u32 other; /* Drops due to drop() calls */ ++ __u32 marked; /* Marked packets */ ++}; ++ ++/* GRED section */ ++ ++#define MAX_DPs 16 ++ ++enum { ++ TCA_GRED_UNSPEC, ++ TCA_GRED_PARMS, ++ TCA_GRED_STAB, ++ TCA_GRED_DPS, ++ TCA_GRED_MAX_P, ++ TCA_GRED_LIMIT, ++ __TCA_GRED_MAX, ++}; ++ ++#define TCA_GRED_MAX (__TCA_GRED_MAX - 1) ++ ++struct tc_gred_qopt { ++ __u32 limit; /* HARD maximal queue length (bytes) */ ++ __u32 qth_min; /* Min average length threshold (bytes) */ ++ __u32 qth_max; /* Max average length threshold (bytes) */ ++ __u32 DP; /* up to 2^32 DPs */ ++ __u32 backlog; ++ __u32 qave; ++ __u32 forced; ++ __u32 early; ++ __u32 other; ++ __u32 pdrop; ++ __u8 Wlog; /* log(W) */ ++ __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ ++ __u8 Scell_log; /* cell size for idle damping */ ++ __u8 prio; /* prio of this VQ */ ++ __u32 packets; ++ __u32 bytesin; ++}; ++ ++/* gred setup */ ++struct tc_gred_sopt { ++ __u32 DPs; ++ __u32 def_DP; ++ __u8 grio; ++ __u8 flags; ++ __u16 pad1; ++}; ++ ++/* CHOKe section */ ++ ++enum { ++ TCA_CHOKE_UNSPEC, ++ TCA_CHOKE_PARMS, ++ TCA_CHOKE_STAB, ++ TCA_CHOKE_MAX_P, ++ __TCA_CHOKE_MAX, ++}; ++ ++#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) ++ ++struct tc_choke_qopt { ++ __u32 limit; /* Hard queue length (packets) */ ++ __u32 qth_min; /* Min average threshold (packets) */ ++ __u32 qth_max; /* Max average threshold (packets) */ ++ unsigned char Wlog; /* log(W) */ ++ unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ ++ unsigned char Scell_log; /* cell size for idle damping */ ++ unsigned char flags; /* see RED flags */ ++}; ++ ++struct tc_choke_xstats { ++ __u32 early; /* Early drops */ ++ __u32 pdrop; /* Drops due to queue limits */ ++ __u32 other; /* Drops due to drop() calls */ ++ __u32 marked; /* Marked packets */ ++ __u32 matched; /* Drops due to flow match */ ++}; ++ ++/* HTB section */ ++#define TC_HTB_NUMPRIO 8 ++#define TC_HTB_MAXDEPTH 8 ++#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ ++ ++struct tc_htb_opt { ++ struct tc_ratespec rate; ++ struct tc_ratespec ceil; ++ __u32 buffer; ++ __u32 cbuffer; ++ __u32 quantum; ++ __u32 level; /* out only */ ++ __u32 prio; ++}; ++struct tc_htb_glob { ++ __u32 version; /* to match HTB/TC */ ++ __u32 rate2quantum; /* bps->quantum divisor */ ++ __u32 defcls; /* default class number */ ++ __u32 debug; /* debug flags */ ++ ++ /* stats */ ++ __u32 direct_pkts; /* count of non shaped packets */ ++}; ++enum { ++ TCA_HTB_UNSPEC, ++ TCA_HTB_PARMS, ++ TCA_HTB_INIT, ++ TCA_HTB_CTAB, ++ TCA_HTB_RTAB, ++ TCA_HTB_DIRECT_QLEN, ++ TCA_HTB_RATE64, ++ TCA_HTB_CEIL64, ++ TCA_HTB_PAD, ++ __TCA_HTB_MAX, ++}; ++ ++#define TCA_HTB_MAX (__TCA_HTB_MAX - 1) ++ ++struct tc_htb_xstats { ++ __u32 lends; ++ __u32 borrows; ++ __u32 giants; /* too big packets (rate will not be accurate) */ ++ __u32 tokens; ++ __u32 ctokens; ++}; ++ ++/* HFSC section */ ++ ++struct tc_hfsc_qopt { ++ __u16 defcls; /* default class */ ++}; ++ ++struct tc_service_curve { ++ __u32 m1; /* slope of the first segment in bps */ ++ __u32 d; /* x-projection of the first segment in us */ ++ __u32 m2; /* slope of the second segment in bps */ ++}; ++ ++struct tc_hfsc_stats { ++ __u64 work; /* total work done */ ++ __u64 rtwork; /* work done by real-time criteria */ ++ __u32 period; /* current period */ ++ __u32 level; /* class level in hierarchy */ ++}; ++ ++enum { ++ TCA_HFSC_UNSPEC, ++ TCA_HFSC_RSC, ++ TCA_HFSC_FSC, ++ TCA_HFSC_USC, ++ __TCA_HFSC_MAX, ++}; ++ ++#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) ++ ++ ++/* CBQ section */ ++ ++#define TC_CBQ_MAXPRIO 8 ++#define TC_CBQ_MAXLEVEL 8 ++#define TC_CBQ_DEF_EWMA 5 ++ ++struct tc_cbq_lssopt { ++ unsigned char change; ++ unsigned char flags; ++#define TCF_CBQ_LSS_BOUNDED 1 ++#define TCF_CBQ_LSS_ISOLATED 2 ++ unsigned char ewma_log; ++ unsigned char level; ++#define TCF_CBQ_LSS_FLAGS 1 ++#define TCF_CBQ_LSS_EWMA 2 ++#define TCF_CBQ_LSS_MAXIDLE 4 ++#define TCF_CBQ_LSS_MINIDLE 8 ++#define TCF_CBQ_LSS_OFFTIME 0x10 ++#define TCF_CBQ_LSS_AVPKT 0x20 ++ __u32 maxidle; ++ __u32 minidle; ++ __u32 offtime; ++ __u32 avpkt; ++}; ++ ++struct tc_cbq_wrropt { ++ unsigned char flags; ++ unsigned char priority; ++ unsigned char cpriority; ++ unsigned char __reserved; ++ __u32 allot; ++ __u32 weight; ++}; ++ ++struct tc_cbq_ovl { ++ unsigned char strategy; ++#define TC_CBQ_OVL_CLASSIC 0 ++#define TC_CBQ_OVL_DELAY 1 ++#define TC_CBQ_OVL_LOWPRIO 2 ++#define TC_CBQ_OVL_DROP 3 ++#define TC_CBQ_OVL_RCLASSIC 4 ++ unsigned char priority2; ++ __u16 pad; ++ __u32 penalty; ++}; ++ ++struct tc_cbq_police { ++ unsigned char police; ++ unsigned char __res1; ++ unsigned short __res2; ++}; ++ ++struct tc_cbq_fopt { ++ __u32 split; ++ __u32 defmap; ++ __u32 defchange; ++}; ++ ++struct tc_cbq_xstats { ++ __u32 borrows; ++ __u32 overactions; ++ __s32 avgidle; ++ __s32 undertime; ++}; ++ ++enum { ++ TCA_CBQ_UNSPEC, ++ TCA_CBQ_LSSOPT, ++ TCA_CBQ_WRROPT, ++ TCA_CBQ_FOPT, ++ TCA_CBQ_OVL_STRATEGY, ++ TCA_CBQ_RATE, ++ TCA_CBQ_RTAB, ++ TCA_CBQ_POLICE, ++ __TCA_CBQ_MAX, ++}; ++ ++#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) ++ ++/* dsmark section */ ++ ++enum { ++ TCA_DSMARK_UNSPEC, ++ TCA_DSMARK_INDICES, ++ TCA_DSMARK_DEFAULT_INDEX, ++ TCA_DSMARK_SET_TC_INDEX, ++ TCA_DSMARK_MASK, ++ TCA_DSMARK_VALUE, ++ __TCA_DSMARK_MAX, ++}; ++ ++#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) ++ ++/* ATM section */ ++ ++enum { ++ TCA_ATM_UNSPEC, ++ TCA_ATM_FD, /* file/socket descriptor */ ++ TCA_ATM_PTR, /* pointer to descriptor - later */ ++ TCA_ATM_HDR, /* LL header */ ++ TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ ++ TCA_ATM_ADDR, /* PVC address (for output only) */ ++ TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ ++ __TCA_ATM_MAX, ++}; ++ ++#define TCA_ATM_MAX (__TCA_ATM_MAX - 1) ++ ++/* Network emulator */ ++ ++enum { ++ TCA_NETEM_UNSPEC, ++ TCA_NETEM_CORR, ++ TCA_NETEM_DELAY_DIST, ++ TCA_NETEM_REORDER, ++ TCA_NETEM_CORRUPT, ++ TCA_NETEM_LOSS, ++ TCA_NETEM_RATE, ++ TCA_NETEM_ECN, ++ TCA_NETEM_RATE64, ++ TCA_NETEM_PAD, ++ __TCA_NETEM_MAX, ++}; ++ ++#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) ++ ++struct tc_netem_qopt { ++ __u32 latency; /* added delay (us) */ ++ __u32 limit; /* fifo limit (packets) */ ++ __u32 loss; /* random packet loss (0=none ~0=100%) */ ++ __u32 gap; /* re-ordering gap (0 for none) */ ++ __u32 duplicate; /* random packet dup (0=none ~0=100%) */ ++ __u32 jitter; /* random jitter in latency (us) */ ++}; ++ ++struct tc_netem_corr { ++ __u32 delay_corr; /* delay correlation */ ++ __u32 loss_corr; /* packet loss correlation */ ++ __u32 dup_corr; /* duplicate correlation */ ++}; ++ ++struct tc_netem_reorder { ++ __u32 probability; ++ __u32 correlation; ++}; ++ ++struct tc_netem_corrupt { ++ __u32 probability; ++ __u32 correlation; ++}; ++ ++struct tc_netem_rate { ++ __u32 rate; /* byte/s */ ++ __s32 packet_overhead; ++ __u32 cell_size; ++ __s32 cell_overhead; ++}; ++ ++enum { ++ NETEM_LOSS_UNSPEC, ++ NETEM_LOSS_GI, /* General Intuitive - 4 state model */ ++ NETEM_LOSS_GE, /* Gilbert Elliot models */ ++ __NETEM_LOSS_MAX ++}; ++#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) ++ ++/* State transition probabilities for 4 state model */ ++struct tc_netem_gimodel { ++ __u32 p13; ++ __u32 p31; ++ __u32 p32; ++ __u32 p14; ++ __u32 p23; ++}; ++ ++/* Gilbert-Elliot models */ ++struct tc_netem_gemodel { ++ __u32 p; ++ __u32 r; ++ __u32 h; ++ __u32 k1; ++}; ++ ++#define NETEM_DIST_SCALE 8192 ++#define NETEM_DIST_MAX 16384 ++ ++/* DRR */ ++ ++enum { ++ TCA_DRR_UNSPEC, ++ TCA_DRR_QUANTUM, ++ __TCA_DRR_MAX ++}; ++ ++#define TCA_DRR_MAX (__TCA_DRR_MAX - 1) ++ ++struct tc_drr_stats { ++ __u32 deficit; ++}; ++ ++/* MQPRIO */ ++#define TC_QOPT_BITMASK 15 ++#define TC_QOPT_MAX_QUEUE 16 ++ ++enum { ++ TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ ++ TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ ++ __TC_MQPRIO_HW_OFFLOAD_MAX ++}; ++ ++#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) ++ ++struct tc_mqprio_qopt { ++ __u8 num_tc; ++ __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; ++ __u8 hw; ++ __u16 count[TC_QOPT_MAX_QUEUE]; ++ __u16 offset[TC_QOPT_MAX_QUEUE]; ++}; ++ ++/* SFB */ ++ ++enum { ++ TCA_SFB_UNSPEC, ++ TCA_SFB_PARMS, ++ __TCA_SFB_MAX, ++}; ++ ++#define TCA_SFB_MAX (__TCA_SFB_MAX - 1) ++ ++/* ++ * Note: increment, decrement are Q0.16 fixed-point values. ++ */ ++struct tc_sfb_qopt { ++ __u32 rehash_interval; /* delay between hash move, in ms */ ++ __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ ++ __u32 max; /* max len of qlen_min */ ++ __u32 bin_size; /* maximum queue length per bin */ ++ __u32 increment; /* probability increment, (d1 in Blue) */ ++ __u32 decrement; /* probability decrement, (d2 in Blue) */ ++ __u32 limit; /* max SFB queue length */ ++ __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ ++ __u32 penalty_burst; ++}; ++ ++struct tc_sfb_xstats { ++ __u32 earlydrop; ++ __u32 penaltydrop; ++ __u32 bucketdrop; ++ __u32 queuedrop; ++ __u32 childdrop; /* drops in child qdisc */ ++ __u32 marked; ++ __u32 maxqlen; ++ __u32 maxprob; ++ __u32 avgprob; ++}; ++ ++#define SFB_MAX_PROB 0xFFFF ++ ++/* QFQ */ ++enum { ++ TCA_QFQ_UNSPEC, ++ TCA_QFQ_WEIGHT, ++ TCA_QFQ_LMAX, ++ __TCA_QFQ_MAX ++}; ++ ++#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1) ++ ++struct tc_qfq_stats { ++ __u32 weight; ++ __u32 lmax; ++}; ++ ++/* CODEL */ ++ ++enum { ++ TCA_CODEL_UNSPEC, ++ TCA_CODEL_TARGET, ++ TCA_CODEL_LIMIT, ++ TCA_CODEL_INTERVAL, ++ TCA_CODEL_ECN, ++ TCA_CODEL_CE_THRESHOLD, ++ __TCA_CODEL_MAX ++}; ++ ++#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1) ++ ++struct tc_codel_xstats { ++ __u32 maxpacket; /* largest packet we've seen so far */ ++ __u32 count; /* how many drops we've done since the last time we ++ * entered dropping state ++ */ ++ __u32 lastcount; /* count at entry to dropping state */ ++ __u32 ldelay; /* in-queue delay seen by most recently dequeued packet */ ++ __s32 drop_next; /* time to drop next packet */ ++ __u32 drop_overlimit; /* number of time max qdisc packet limit was hit */ ++ __u32 ecn_mark; /* number of packets we ECN marked instead of dropped */ ++ __u32 dropping; /* are we in dropping state ? */ ++ __u32 ce_mark; /* number of CE marked packets because of ce_threshold */ ++}; ++ ++/* FQ_CODEL */ ++ ++enum { ++ TCA_FQ_CODEL_UNSPEC, ++ TCA_FQ_CODEL_TARGET, ++ TCA_FQ_CODEL_LIMIT, ++ TCA_FQ_CODEL_INTERVAL, ++ TCA_FQ_CODEL_ECN, ++ TCA_FQ_CODEL_FLOWS, ++ TCA_FQ_CODEL_QUANTUM, ++ TCA_FQ_CODEL_CE_THRESHOLD, ++ TCA_FQ_CODEL_DROP_BATCH_SIZE, ++ TCA_FQ_CODEL_MEMORY_LIMIT, ++ __TCA_FQ_CODEL_MAX ++}; ++ ++#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1) ++ ++enum { ++ TCA_FQ_CODEL_XSTATS_QDISC, ++ TCA_FQ_CODEL_XSTATS_CLASS, ++}; ++ ++struct tc_fq_codel_qd_stats { ++ __u32 maxpacket; /* largest packet we've seen so far */ ++ __u32 drop_overlimit; /* number of time max qdisc ++ * packet limit was hit ++ */ ++ __u32 ecn_mark; /* number of packets we ECN marked ++ * instead of being dropped ++ */ ++ __u32 new_flow_count; /* number of time packets ++ * created a 'new flow' ++ */ ++ __u32 new_flows_len; /* count of flows in new list */ ++ __u32 old_flows_len; /* count of flows in old list */ ++ __u32 ce_mark; /* packets above ce_threshold */ ++ __u32 memory_usage; /* in bytes */ ++ __u32 drop_overmemory; ++}; ++ ++struct tc_fq_codel_cl_stats { ++ __s32 deficit; ++ __u32 ldelay; /* in-queue delay seen by most recently ++ * dequeued packet ++ */ ++ __u32 count; ++ __u32 lastcount; ++ __u32 dropping; ++ __s32 drop_next; ++}; ++ ++struct tc_fq_codel_xstats { ++ __u32 type; ++ union { ++ struct tc_fq_codel_qd_stats qdisc_stats; ++ struct tc_fq_codel_cl_stats class_stats; ++ }; ++}; ++ ++/* FQ */ ++ ++enum { ++ TCA_FQ_UNSPEC, ++ ++ TCA_FQ_PLIMIT, /* limit of total number of packets in queue */ ++ ++ TCA_FQ_FLOW_PLIMIT, /* limit of packets per flow */ ++ ++ TCA_FQ_QUANTUM, /* RR quantum */ ++ ++ TCA_FQ_INITIAL_QUANTUM, /* RR quantum for new flow */ ++ ++ TCA_FQ_RATE_ENABLE, /* enable/disable rate limiting */ ++ ++ TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */ ++ ++ TCA_FQ_FLOW_MAX_RATE, /* per flow max rate */ ++ ++ TCA_FQ_BUCKETS_LOG, /* log2(number of buckets) */ ++ ++ TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ ++ ++ TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ ++ ++ TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */ ++ ++ __TCA_FQ_MAX ++}; ++ ++#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) ++ ++struct tc_fq_qd_stats { ++ __u64 gc_flows; ++ __u64 highprio_packets; ++ __u64 tcp_retrans; ++ __u64 throttled; ++ __u64 flows_plimit; ++ __u64 pkts_too_long; ++ __u64 allocation_errors; ++ __s64 time_next_delayed_flow; ++ __u32 flows; ++ __u32 inactive_flows; ++ __u32 throttled_flows; ++ __u32 unthrottle_latency_ns; ++}; ++ ++/* Heavy-Hitter Filter */ ++ ++enum { ++ TCA_HHF_UNSPEC, ++ TCA_HHF_BACKLOG_LIMIT, ++ TCA_HHF_QUANTUM, ++ TCA_HHF_HH_FLOWS_LIMIT, ++ TCA_HHF_RESET_TIMEOUT, ++ TCA_HHF_ADMIT_BYTES, ++ TCA_HHF_EVICT_TIMEOUT, ++ TCA_HHF_NON_HH_WEIGHT, ++ __TCA_HHF_MAX ++}; ++ ++#define TCA_HHF_MAX (__TCA_HHF_MAX - 1) ++ ++struct tc_hhf_xstats { ++ __u32 drop_overlimit; /* number of times max qdisc packet limit ++ * was hit ++ */ ++ __u32 hh_overlimit; /* number of times max heavy-hitters was hit */ ++ __u32 hh_tot_count; /* number of captured heavy-hitters so far */ ++ __u32 hh_cur_count; /* number of current heavy-hitters */ ++}; ++ ++/* PIE */ ++enum { ++ TCA_PIE_UNSPEC, ++ TCA_PIE_TARGET, ++ TCA_PIE_LIMIT, ++ TCA_PIE_TUPDATE, ++ TCA_PIE_ALPHA, ++ TCA_PIE_BETA, ++ TCA_PIE_ECN, ++ TCA_PIE_BYTEMODE, ++ __TCA_PIE_MAX ++}; ++#define TCA_PIE_MAX (__TCA_PIE_MAX - 1) ++ ++struct tc_pie_xstats { ++ __u32 prob; /* current probability */ ++ __u32 delay; /* current delay in ms */ ++ __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ ++ __u32 packets_in; /* total number of packets enqueued */ ++ __u32 dropped; /* packets dropped due to pie_action */ ++ __u32 overlimit; /* dropped due to lack of space in queue */ ++ __u32 maxq; /* maximum queue size */ ++ __u32 ecn_mark; /* packets marked with ecn*/ ++}; ++#endif +diff --git a/include/uapi/linux/posix_types.h b/include/uapi/linux/posix_types.h +new file mode 100644 +index 0000000..988f76e +--- /dev/null ++++ b/include/uapi/linux/posix_types.h +@@ -0,0 +1,37 @@ ++#ifndef _LINUX_POSIX_TYPES_H ++#define _LINUX_POSIX_TYPES_H ++ ++#include ++ ++/* ++ * This allows for 1024 file descriptors: if NR_OPEN is ever grown ++ * beyond that you'll have to change this too. But 1024 fd's seem to be ++ * enough even for such "real" unices like OSF/1, so hopefully this is ++ * one limit that doesn't have to be changed [again]. ++ * ++ * Note that POSIX wants the FD_CLEAR(fd,fdsetp) defines to be in ++ * (and thus ) - but this is a more logical ++ * place for them. Solved by having dummy defines in . ++ */ ++ ++/* ++ * This macro may have been defined in . But we always ++ * use the one here. ++ */ ++#undef __FD_SETSIZE ++#define __FD_SETSIZE 1024 ++ ++typedef struct { ++ unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))]; ++} __kernel_fd_set; ++ ++/* Type of a signal handler. */ ++typedef void (*__kernel_sighandler_t)(int); ++ ++/* Type of a SYSV IPC key. */ ++typedef int __kernel_key_t; ++typedef int __kernel_mqd_t; ++ ++#include ++ ++#endif /* _LINUX_POSIX_TYPES_H */ +diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h +new file mode 100644 +index 0000000..813e9e0 +--- /dev/null ++++ b/include/uapi/linux/rtnetlink.h +@@ -0,0 +1,718 @@ ++#ifndef __LINUX_RTNETLINK_H ++#define __LINUX_RTNETLINK_H ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* rtnetlink families. Values up to 127 are reserved for real address ++ * families, values above 128 may be used arbitrarily. ++ */ ++#define RTNL_FAMILY_IPMR 128 ++#define RTNL_FAMILY_IP6MR 129 ++#define RTNL_FAMILY_MAX 129 ++ ++/**** ++ * Routing/neighbour discovery messages. ++ ****/ ++ ++/* Types of messages */ ++ ++enum { ++ RTM_BASE = 16, ++#define RTM_BASE RTM_BASE ++ ++ RTM_NEWLINK = 16, ++#define RTM_NEWLINK RTM_NEWLINK ++ RTM_DELLINK, ++#define RTM_DELLINK RTM_DELLINK ++ RTM_GETLINK, ++#define RTM_GETLINK RTM_GETLINK ++ RTM_SETLINK, ++#define RTM_SETLINK RTM_SETLINK ++ ++ RTM_NEWADDR = 20, ++#define RTM_NEWADDR RTM_NEWADDR ++ RTM_DELADDR, ++#define RTM_DELADDR RTM_DELADDR ++ RTM_GETADDR, ++#define RTM_GETADDR RTM_GETADDR ++ ++ RTM_NEWROUTE = 24, ++#define RTM_NEWROUTE RTM_NEWROUTE ++ RTM_DELROUTE, ++#define RTM_DELROUTE RTM_DELROUTE ++ RTM_GETROUTE, ++#define RTM_GETROUTE RTM_GETROUTE ++ ++ RTM_NEWNEIGH = 28, ++#define RTM_NEWNEIGH RTM_NEWNEIGH ++ RTM_DELNEIGH, ++#define RTM_DELNEIGH RTM_DELNEIGH ++ RTM_GETNEIGH, ++#define RTM_GETNEIGH RTM_GETNEIGH ++ ++ RTM_NEWRULE = 32, ++#define RTM_NEWRULE RTM_NEWRULE ++ RTM_DELRULE, ++#define RTM_DELRULE RTM_DELRULE ++ RTM_GETRULE, ++#define RTM_GETRULE RTM_GETRULE ++ ++ RTM_NEWQDISC = 36, ++#define RTM_NEWQDISC RTM_NEWQDISC ++ RTM_DELQDISC, ++#define RTM_DELQDISC RTM_DELQDISC ++ RTM_GETQDISC, ++#define RTM_GETQDISC RTM_GETQDISC ++ ++ RTM_NEWTCLASS = 40, ++#define RTM_NEWTCLASS RTM_NEWTCLASS ++ RTM_DELTCLASS, ++#define RTM_DELTCLASS RTM_DELTCLASS ++ RTM_GETTCLASS, ++#define RTM_GETTCLASS RTM_GETTCLASS ++ ++ RTM_NEWTFILTER = 44, ++#define RTM_NEWTFILTER RTM_NEWTFILTER ++ RTM_DELTFILTER, ++#define RTM_DELTFILTER RTM_DELTFILTER ++ RTM_GETTFILTER, ++#define RTM_GETTFILTER RTM_GETTFILTER ++ ++ RTM_NEWACTION = 48, ++#define RTM_NEWACTION RTM_NEWACTION ++ RTM_DELACTION, ++#define RTM_DELACTION RTM_DELACTION ++ RTM_GETACTION, ++#define RTM_GETACTION RTM_GETACTION ++ ++ RTM_NEWPREFIX = 52, ++#define RTM_NEWPREFIX RTM_NEWPREFIX ++ ++ RTM_GETMULTICAST = 58, ++#define RTM_GETMULTICAST RTM_GETMULTICAST ++ ++ RTM_GETANYCAST = 62, ++#define RTM_GETANYCAST RTM_GETANYCAST ++ ++ RTM_NEWNEIGHTBL = 64, ++#define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL ++ RTM_GETNEIGHTBL = 66, ++#define RTM_GETNEIGHTBL RTM_GETNEIGHTBL ++ RTM_SETNEIGHTBL, ++#define RTM_SETNEIGHTBL RTM_SETNEIGHTBL ++ ++ RTM_NEWNDUSEROPT = 68, ++#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT ++ ++ RTM_NEWADDRLABEL = 72, ++#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL ++ RTM_DELADDRLABEL, ++#define RTM_DELADDRLABEL RTM_DELADDRLABEL ++ RTM_GETADDRLABEL, ++#define RTM_GETADDRLABEL RTM_GETADDRLABEL ++ ++ RTM_GETDCB = 78, ++#define RTM_GETDCB RTM_GETDCB ++ RTM_SETDCB, ++#define RTM_SETDCB RTM_SETDCB ++ ++ RTM_NEWNETCONF = 80, ++#define RTM_NEWNETCONF RTM_NEWNETCONF ++ RTM_DELNETCONF, ++#define RTM_DELNETCONF RTM_DELNETCONF ++ RTM_GETNETCONF = 82, ++#define RTM_GETNETCONF RTM_GETNETCONF ++ ++ RTM_NEWMDB = 84, ++#define RTM_NEWMDB RTM_NEWMDB ++ RTM_DELMDB = 85, ++#define RTM_DELMDB RTM_DELMDB ++ RTM_GETMDB = 86, ++#define RTM_GETMDB RTM_GETMDB ++ ++ RTM_NEWNSID = 88, ++#define RTM_NEWNSID RTM_NEWNSID ++ RTM_DELNSID = 89, ++#define RTM_DELNSID RTM_DELNSID ++ RTM_GETNSID = 90, ++#define RTM_GETNSID RTM_GETNSID ++ ++ RTM_NEWSTATS = 92, ++#define RTM_NEWSTATS RTM_NEWSTATS ++ RTM_GETSTATS = 94, ++#define RTM_GETSTATS RTM_GETSTATS ++ ++ RTM_NEWCACHEREPORT = 96, ++#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT ++ ++ __RTM_MAX, ++#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) ++}; ++ ++#define RTM_NR_MSGTYPES (RTM_MAX + 1 - RTM_BASE) ++#define RTM_NR_FAMILIES (RTM_NR_MSGTYPES >> 2) ++#define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2) ++ ++/* ++ Generic structure for encapsulation of optional route information. ++ It is reminiscent of sockaddr, but with sa_family replaced ++ with attribute type. ++ */ ++ ++struct rtattr { ++ unsigned short rta_len; ++ unsigned short rta_type; ++}; ++ ++/* Macros to handle rtattributes */ ++ ++#define RTA_ALIGNTO 4U ++#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) ++#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \ ++ (rta)->rta_len >= sizeof(struct rtattr) && \ ++ (rta)->rta_len <= (len)) ++#define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), \ ++ (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len))) ++#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len)) ++#define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len)) ++#define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0))) ++#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0)) ++ ++ ++ ++ ++/****************************************************************************** ++ * Definitions used in routing table administration. ++ ****/ ++ ++struct rtmsg { ++ unsigned char rtm_family; ++ unsigned char rtm_dst_len; ++ unsigned char rtm_src_len; ++ unsigned char rtm_tos; ++ ++ unsigned char rtm_table; /* Routing table id */ ++ unsigned char rtm_protocol; /* Routing protocol; see below */ ++ unsigned char rtm_scope; /* See below */ ++ unsigned char rtm_type; /* See below */ ++ ++ unsigned rtm_flags; ++}; ++ ++/* rtm_type */ ++ ++enum { ++ RTN_UNSPEC, ++ RTN_UNICAST, /* Gateway or direct route */ ++ RTN_LOCAL, /* Accept locally */ ++ RTN_BROADCAST, /* Accept locally as broadcast, ++ send as broadcast */ ++ RTN_ANYCAST, /* Accept locally as broadcast, ++ but send as unicast */ ++ RTN_MULTICAST, /* Multicast route */ ++ RTN_BLACKHOLE, /* Drop */ ++ RTN_UNREACHABLE, /* Destination is unreachable */ ++ RTN_PROHIBIT, /* Administratively prohibited */ ++ RTN_THROW, /* Not in this table */ ++ RTN_NAT, /* Translate this address */ ++ RTN_XRESOLVE, /* Use external resolver */ ++ __RTN_MAX ++}; ++ ++#define RTN_MAX (__RTN_MAX - 1) ++ ++ ++/* rtm_protocol */ ++ ++#define RTPROT_UNSPEC 0 ++#define RTPROT_REDIRECT 1 /* Route installed by ICMP redirects; ++ not used by current IPv4 */ ++#define RTPROT_KERNEL 2 /* Route installed by kernel */ ++#define RTPROT_BOOT 3 /* Route installed during boot */ ++#define RTPROT_STATIC 4 /* Route installed by administrator */ ++ ++/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel; ++ they are just passed from user and back as is. ++ It will be used by hypothetical multiple routing daemons. ++ Note that protocol values should be standardized in order to ++ avoid conflicts. ++ */ ++ ++#define RTPROT_GATED 8 /* Apparently, GateD */ ++#define RTPROT_RA 9 /* RDISC/ND router advertisements */ ++#define RTPROT_MRT 10 /* Merit MRT */ ++#define RTPROT_ZEBRA 11 /* Zebra */ ++#define RTPROT_BIRD 12 /* BIRD */ ++#define RTPROT_DNROUTED 13 /* DECnet routing daemon */ ++#define RTPROT_XORP 14 /* XORP */ ++#define RTPROT_NTK 15 /* Netsukuku */ ++#define RTPROT_DHCP 16 /* DHCP client */ ++#define RTPROT_MROUTED 17 /* Multicast daemon */ ++#define RTPROT_BABEL 42 /* Babel daemon */ ++ ++/* rtm_scope ++ ++ Really it is not scope, but sort of distance to the destination. ++ NOWHERE are reserved for not existing destinations, HOST is our ++ local addresses, LINK are destinations, located on directly attached ++ link and UNIVERSE is everywhere in the Universe. ++ ++ Intermediate values are also possible f.e. interior routes ++ could be assigned a value between UNIVERSE and LINK. ++*/ ++ ++enum rt_scope_t { ++ RT_SCOPE_UNIVERSE=0, ++/* User defined values */ ++ RT_SCOPE_SITE=200, ++ RT_SCOPE_LINK=253, ++ RT_SCOPE_HOST=254, ++ RT_SCOPE_NOWHERE=255 ++}; ++ ++/* rtm_flags */ ++ ++#define RTM_F_NOTIFY 0x100 /* Notify user of route change */ ++#define RTM_F_CLONED 0x200 /* This route is cloned */ ++#define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */ ++#define RTM_F_PREFIX 0x800 /* Prefix addresses */ ++#define RTM_F_LOOKUP_TABLE 0x1000 /* set rtm_table to FIB lookup result */ ++#define RTM_F_FIB_MATCH 0x2000 /* return full fib lookup match */ ++ ++/* Reserved table identifiers */ ++ ++enum rt_class_t { ++ RT_TABLE_UNSPEC=0, ++/* User defined values */ ++ RT_TABLE_COMPAT=252, ++ RT_TABLE_DEFAULT=253, ++ RT_TABLE_MAIN=254, ++ RT_TABLE_LOCAL=255, ++ RT_TABLE_MAX=0xFFFFFFFF ++}; ++ ++ ++/* Routing message attributes */ ++ ++enum rtattr_type_t { ++ RTA_UNSPEC, ++ RTA_DST, ++ RTA_SRC, ++ RTA_IIF, ++ RTA_OIF, ++ RTA_GATEWAY, ++ RTA_PRIORITY, ++ RTA_PREFSRC, ++ RTA_METRICS, ++ RTA_MULTIPATH, ++ RTA_PROTOINFO, /* no longer used */ ++ RTA_FLOW, ++ RTA_CACHEINFO, ++ RTA_SESSION, /* no longer used */ ++ RTA_MP_ALGO, /* no longer used */ ++ RTA_TABLE, ++ RTA_MARK, ++ RTA_MFC_STATS, ++ RTA_VIA, ++ RTA_NEWDST, ++ RTA_PREF, ++ RTA_ENCAP_TYPE, ++ RTA_ENCAP, ++ RTA_EXPIRES, ++ RTA_PAD, ++ RTA_UID, ++ RTA_TTL_PROPAGATE, ++ __RTA_MAX ++}; ++ ++#define RTA_MAX (__RTA_MAX - 1) ++ ++#define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg)))) ++#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg)) ++ ++/* RTM_MULTIPATH --- array of struct rtnexthop. ++ * ++ * "struct rtnexthop" describes all necessary nexthop information, ++ * i.e. parameters of path to a destination via this nexthop. ++ * ++ * At the moment it is impossible to set different prefsrc, mtu, window ++ * and rtt for different paths from multipath. ++ */ ++ ++struct rtnexthop { ++ unsigned short rtnh_len; ++ unsigned char rtnh_flags; ++ unsigned char rtnh_hops; ++ int rtnh_ifindex; ++}; ++ ++/* rtnh_flags */ ++ ++#define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */ ++#define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */ ++#define RTNH_F_ONLINK 4 /* Gateway is forced on link */ ++#define RTNH_F_OFFLOAD 8 /* offloaded route */ ++#define RTNH_F_LINKDOWN 16 /* carrier-down on nexthop */ ++#define RTNH_F_UNRESOLVED 32 /* The entry is unresolved (ipmr) */ ++ ++#define RTNH_COMPARE_MASK (RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD) ++ ++/* Macros to handle hexthops */ ++ ++#define RTNH_ALIGNTO 4 ++#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) ) ++#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \ ++ ((int)(rtnh)->rtnh_len) <= (len)) ++#define RTNH_NEXT(rtnh) ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len))) ++#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len)) ++#define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len)) ++#define RTNH_DATA(rtnh) ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0))) ++ ++/* RTA_VIA */ ++struct rtvia { ++ __kernel_sa_family_t rtvia_family; ++ __u8 rtvia_addr[0]; ++}; ++ ++/* RTM_CACHEINFO */ ++ ++struct rta_cacheinfo { ++ __u32 rta_clntref; ++ __u32 rta_lastuse; ++ __s32 rta_expires; ++ __u32 rta_error; ++ __u32 rta_used; ++ ++#define RTNETLINK_HAVE_PEERINFO 1 ++ __u32 rta_id; ++ __u32 rta_ts; ++ __u32 rta_tsage; ++}; ++ ++/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */ ++ ++enum { ++ RTAX_UNSPEC, ++#define RTAX_UNSPEC RTAX_UNSPEC ++ RTAX_LOCK, ++#define RTAX_LOCK RTAX_LOCK ++ RTAX_MTU, ++#define RTAX_MTU RTAX_MTU ++ RTAX_WINDOW, ++#define RTAX_WINDOW RTAX_WINDOW ++ RTAX_RTT, ++#define RTAX_RTT RTAX_RTT ++ RTAX_RTTVAR, ++#define RTAX_RTTVAR RTAX_RTTVAR ++ RTAX_SSTHRESH, ++#define RTAX_SSTHRESH RTAX_SSTHRESH ++ RTAX_CWND, ++#define RTAX_CWND RTAX_CWND ++ RTAX_ADVMSS, ++#define RTAX_ADVMSS RTAX_ADVMSS ++ RTAX_REORDERING, ++#define RTAX_REORDERING RTAX_REORDERING ++ RTAX_HOPLIMIT, ++#define RTAX_HOPLIMIT RTAX_HOPLIMIT ++ RTAX_INITCWND, ++#define RTAX_INITCWND RTAX_INITCWND ++ RTAX_FEATURES, ++#define RTAX_FEATURES RTAX_FEATURES ++ RTAX_RTO_MIN, ++#define RTAX_RTO_MIN RTAX_RTO_MIN ++ RTAX_INITRWND, ++#define RTAX_INITRWND RTAX_INITRWND ++ RTAX_QUICKACK, ++#define RTAX_QUICKACK RTAX_QUICKACK ++ RTAX_CC_ALGO, ++#define RTAX_CC_ALGO RTAX_CC_ALGO ++ __RTAX_MAX ++}; ++ ++#define RTAX_MAX (__RTAX_MAX - 1) ++ ++#define RTAX_FEATURE_ECN (1 << 0) ++#define RTAX_FEATURE_SACK (1 << 1) ++#define RTAX_FEATURE_TIMESTAMP (1 << 2) ++#define RTAX_FEATURE_ALLFRAG (1 << 3) ++ ++#define RTAX_FEATURE_MASK (RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \ ++ RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG) ++ ++struct rta_session { ++ __u8 proto; ++ __u8 pad1; ++ __u16 pad2; ++ ++ union { ++ struct { ++ __u16 sport; ++ __u16 dport; ++ } ports; ++ ++ struct { ++ __u8 type; ++ __u8 code; ++ __u16 ident; ++ } icmpt; ++ ++ __u32 spi; ++ } u; ++}; ++ ++struct rta_mfc_stats { ++ __u64 mfcs_packets; ++ __u64 mfcs_bytes; ++ __u64 mfcs_wrong_if; ++}; ++ ++/**** ++ * General form of address family dependent message. ++ ****/ ++ ++struct rtgenmsg { ++ unsigned char rtgen_family; ++}; ++ ++/***************************************************************** ++ * Link layer specific messages. ++ ****/ ++ ++/* struct ifinfomsg ++ * passes link level specific information, not dependent ++ * on network protocol. ++ */ ++ ++struct ifinfomsg { ++ unsigned char ifi_family; ++ unsigned char __ifi_pad; ++ unsigned short ifi_type; /* ARPHRD_* */ ++ int ifi_index; /* Link index */ ++ unsigned ifi_flags; /* IFF_* flags */ ++ unsigned ifi_change; /* IFF_* change mask */ ++}; ++ ++/******************************************************************** ++ * prefix information ++ ****/ ++ ++struct prefixmsg { ++ unsigned char prefix_family; ++ unsigned char prefix_pad1; ++ unsigned short prefix_pad2; ++ int prefix_ifindex; ++ unsigned char prefix_type; ++ unsigned char prefix_len; ++ unsigned char prefix_flags; ++ unsigned char prefix_pad3; ++}; ++ ++enum ++{ ++ PREFIX_UNSPEC, ++ PREFIX_ADDRESS, ++ PREFIX_CACHEINFO, ++ __PREFIX_MAX ++}; ++ ++#define PREFIX_MAX (__PREFIX_MAX - 1) ++ ++struct prefix_cacheinfo { ++ __u32 preferred_time; ++ __u32 valid_time; ++}; ++ ++ ++/***************************************************************** ++ * Traffic control messages. ++ ****/ ++ ++struct tcmsg { ++ unsigned char tcm_family; ++ unsigned char tcm__pad1; ++ unsigned short tcm__pad2; ++ int tcm_ifindex; ++ __u32 tcm_handle; ++ __u32 tcm_parent; ++ __u32 tcm_info; ++}; ++ ++enum { ++ TCA_UNSPEC, ++ TCA_KIND, ++ TCA_OPTIONS, ++ TCA_STATS, ++ TCA_XSTATS, ++ TCA_RATE, ++ TCA_FCNT, ++ TCA_STATS2, ++ TCA_STAB, ++ TCA_PAD, ++ TCA_DUMP_INVISIBLE, ++ TCA_CHAIN, ++ __TCA_MAX ++}; ++ ++#define TCA_MAX (__TCA_MAX - 1) ++ ++#define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) ++#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) ++ ++/******************************************************************** ++ * Neighbor Discovery userland options ++ ****/ ++ ++struct nduseroptmsg { ++ unsigned char nduseropt_family; ++ unsigned char nduseropt_pad1; ++ unsigned short nduseropt_opts_len; /* Total length of options */ ++ int nduseropt_ifindex; ++ __u8 nduseropt_icmp_type; ++ __u8 nduseropt_icmp_code; ++ unsigned short nduseropt_pad2; ++ unsigned int nduseropt_pad3; ++ /* Followed by one or more ND options */ ++}; ++ ++enum { ++ NDUSEROPT_UNSPEC, ++ NDUSEROPT_SRCADDR, ++ __NDUSEROPT_MAX ++}; ++ ++#define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1) ++ ++/* RTnetlink multicast groups - backwards compatibility for userspace */ ++#define RTMGRP_LINK 1 ++#define RTMGRP_NOTIFY 2 ++#define RTMGRP_NEIGH 4 ++#define RTMGRP_TC 8 ++ ++#define RTMGRP_IPV4_IFADDR 0x10 ++#define RTMGRP_IPV4_MROUTE 0x20 ++#define RTMGRP_IPV4_ROUTE 0x40 ++#define RTMGRP_IPV4_RULE 0x80 ++ ++#define RTMGRP_IPV6_IFADDR 0x100 ++#define RTMGRP_IPV6_MROUTE 0x200 ++#define RTMGRP_IPV6_ROUTE 0x400 ++#define RTMGRP_IPV6_IFINFO 0x800 ++ ++#define RTMGRP_DECnet_IFADDR 0x1000 ++#define RTMGRP_DECnet_ROUTE 0x4000 ++ ++#define RTMGRP_IPV6_PREFIX 0x20000 ++ ++/* RTnetlink multicast groups */ ++enum rtnetlink_groups { ++ RTNLGRP_NONE, ++#define RTNLGRP_NONE RTNLGRP_NONE ++ RTNLGRP_LINK, ++#define RTNLGRP_LINK RTNLGRP_LINK ++ RTNLGRP_NOTIFY, ++#define RTNLGRP_NOTIFY RTNLGRP_NOTIFY ++ RTNLGRP_NEIGH, ++#define RTNLGRP_NEIGH RTNLGRP_NEIGH ++ RTNLGRP_TC, ++#define RTNLGRP_TC RTNLGRP_TC ++ RTNLGRP_IPV4_IFADDR, ++#define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR ++ RTNLGRP_IPV4_MROUTE, ++#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE ++ RTNLGRP_IPV4_ROUTE, ++#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE ++ RTNLGRP_IPV4_RULE, ++#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE ++ RTNLGRP_IPV6_IFADDR, ++#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR ++ RTNLGRP_IPV6_MROUTE, ++#define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE ++ RTNLGRP_IPV6_ROUTE, ++#define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE ++ RTNLGRP_IPV6_IFINFO, ++#define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO ++ RTNLGRP_DECnet_IFADDR, ++#define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR ++ RTNLGRP_NOP2, ++ RTNLGRP_DECnet_ROUTE, ++#define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE ++ RTNLGRP_DECnet_RULE, ++#define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE ++ RTNLGRP_NOP4, ++ RTNLGRP_IPV6_PREFIX, ++#define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX ++ RTNLGRP_IPV6_RULE, ++#define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE ++ RTNLGRP_ND_USEROPT, ++#define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT ++ RTNLGRP_PHONET_IFADDR, ++#define RTNLGRP_PHONET_IFADDR RTNLGRP_PHONET_IFADDR ++ RTNLGRP_PHONET_ROUTE, ++#define RTNLGRP_PHONET_ROUTE RTNLGRP_PHONET_ROUTE ++ RTNLGRP_DCB, ++#define RTNLGRP_DCB RTNLGRP_DCB ++ RTNLGRP_IPV4_NETCONF, ++#define RTNLGRP_IPV4_NETCONF RTNLGRP_IPV4_NETCONF ++ RTNLGRP_IPV6_NETCONF, ++#define RTNLGRP_IPV6_NETCONF RTNLGRP_IPV6_NETCONF ++ RTNLGRP_MDB, ++#define RTNLGRP_MDB RTNLGRP_MDB ++ RTNLGRP_MPLS_ROUTE, ++#define RTNLGRP_MPLS_ROUTE RTNLGRP_MPLS_ROUTE ++ RTNLGRP_NSID, ++#define RTNLGRP_NSID RTNLGRP_NSID ++ RTNLGRP_MPLS_NETCONF, ++#define RTNLGRP_MPLS_NETCONF RTNLGRP_MPLS_NETCONF ++ RTNLGRP_IPV4_MROUTE_R, ++#define RTNLGRP_IPV4_MROUTE_R RTNLGRP_IPV4_MROUTE_R ++ RTNLGRP_IPV6_MROUTE_R, ++#define RTNLGRP_IPV6_MROUTE_R RTNLGRP_IPV6_MROUTE_R ++ __RTNLGRP_MAX ++}; ++#define RTNLGRP_MAX (__RTNLGRP_MAX - 1) ++ ++/* TC action piece */ ++struct tcamsg { ++ unsigned char tca_family; ++ unsigned char tca__pad1; ++ unsigned short tca__pad2; ++}; ++ ++enum { ++ TCA_ROOT_UNSPEC, ++ TCA_ROOT_TAB, ++#define TCA_ACT_TAB TCA_ROOT_TAB ++#define TCAA_MAX TCA_ROOT_TAB ++ TCA_ROOT_FLAGS, ++ TCA_ROOT_COUNT, ++ TCA_ROOT_TIME_DELTA, /* in msecs */ ++ __TCA_ROOT_MAX, ++#define TCA_ROOT_MAX (__TCA_ROOT_MAX - 1) ++}; ++ ++#define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg)))) ++#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg)) ++/* tcamsg flags stored in attribute TCA_ROOT_FLAGS ++ * ++ * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO ++ * actions in a dump. All dump responses will contain the number of actions ++ * being dumped stored in for user app's consumption in TCA_ROOT_COUNT ++ * ++ */ ++#define TCA_FLAG_LARGE_DUMP_ON (1 << 0) ++ ++/* New extended info filters for IFLA_EXT_MASK */ ++#define RTEXT_FILTER_VF (1 << 0) ++#define RTEXT_FILTER_BRVLAN (1 << 1) ++#define RTEXT_FILTER_BRVLAN_COMPRESSED (1 << 2) ++#define RTEXT_FILTER_SKIP_STATS (1 << 3) ++ ++/* End of information exported to user level */ ++ ++ ++ ++#endif /* __LINUX_RTNETLINK_H */ +diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h +new file mode 100644 +index 0000000..fec24c4 +--- /dev/null ++++ b/include/uapi/linux/sctp.h +@@ -0,0 +1,1085 @@ ++/* SCTP kernel implementation ++ * (C) Copyright IBM Corp. 2001, 2004 ++ * Copyright (c) 1999-2000 Cisco, Inc. ++ * Copyright (c) 1999-2001 Motorola, Inc. ++ * Copyright (c) 2002 Intel Corp. ++ * ++ * This file is part of the SCTP kernel implementation ++ * ++ * This header represents the structures and constants needed to support ++ * the SCTP Extension to the Sockets API. ++ * ++ * This SCTP implementation is free software; ++ * you can redistribute it and/or modify it under the terms of ++ * the GNU General Public License as published by ++ * the Free Software Foundation; either version 2, or (at your option) ++ * any later version. ++ * ++ * This SCTP implementation is distributed in the hope that it ++ * will be useful, but WITHOUT ANY WARRANTY; without even the implied ++ * ************************ ++ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ++ * See the GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with GNU CC; see the file COPYING. If not, see ++ * . ++ * ++ * Please send any bug reports or fixes you make to the ++ * email address(es): ++ * lksctp developers ++ * ++ * Or submit a bug report through the following website: ++ * http://www.sf.net/projects/lksctp ++ * ++ * Written or modified by: ++ * La Monte H.P. Yarroll ++ * R. Stewart ++ * K. Morneau ++ * Q. Xie ++ * Karl Knutson ++ * Jon Grimm ++ * Daisy Chang ++ * Ryan Layer ++ * Ardelle Fan ++ * Sridhar Samudrala ++ * Inaky Perez-Gonzalez ++ * Vlad Yasevich ++ * ++ * Any bugs reported given to us we will try to fix... any fixes shared will ++ * be incorporated into the next SCTP release. ++ */ ++ ++#ifndef _SCTP_H ++#define _SCTP_H ++ ++#include ++#include ++ ++typedef __s32 sctp_assoc_t; ++ ++/* The following symbols come from the Sockets API Extensions for ++ * SCTP . ++ */ ++#define SCTP_RTOINFO 0 ++#define SCTP_ASSOCINFO 1 ++#define SCTP_INITMSG 2 ++#define SCTP_NODELAY 3 /* Get/set nodelay option. */ ++#define SCTP_AUTOCLOSE 4 ++#define SCTP_SET_PEER_PRIMARY_ADDR 5 ++#define SCTP_PRIMARY_ADDR 6 ++#define SCTP_ADAPTATION_LAYER 7 ++#define SCTP_DISABLE_FRAGMENTS 8 ++#define SCTP_PEER_ADDR_PARAMS 9 ++#define SCTP_DEFAULT_SEND_PARAM 10 ++#define SCTP_EVENTS 11 ++#define SCTP_I_WANT_MAPPED_V4_ADDR 12 /* Turn on/off mapped v4 addresses */ ++#define SCTP_MAXSEG 13 /* Get/set maximum fragment. */ ++#define SCTP_STATUS 14 ++#define SCTP_GET_PEER_ADDR_INFO 15 ++#define SCTP_DELAYED_ACK_TIME 16 ++#define SCTP_DELAYED_ACK SCTP_DELAYED_ACK_TIME ++#define SCTP_DELAYED_SACK SCTP_DELAYED_ACK_TIME ++#define SCTP_CONTEXT 17 ++#define SCTP_FRAGMENT_INTERLEAVE 18 ++#define SCTP_PARTIAL_DELIVERY_POINT 19 /* Set/Get partial delivery point */ ++#define SCTP_MAX_BURST 20 /* Set/Get max burst */ ++#define SCTP_AUTH_CHUNK 21 /* Set only: add a chunk type to authenticate */ ++#define SCTP_HMAC_IDENT 22 ++#define SCTP_AUTH_KEY 23 ++#define SCTP_AUTH_ACTIVE_KEY 24 ++#define SCTP_AUTH_DELETE_KEY 25 ++#define SCTP_PEER_AUTH_CHUNKS 26 /* Read only */ ++#define SCTP_LOCAL_AUTH_CHUNKS 27 /* Read only */ ++#define SCTP_GET_ASSOC_NUMBER 28 /* Read only */ ++#define SCTP_GET_ASSOC_ID_LIST 29 /* Read only */ ++#define SCTP_AUTO_ASCONF 30 ++#define SCTP_PEER_ADDR_THLDS 31 ++#define SCTP_RECVRCVINFO 32 ++#define SCTP_RECVNXTINFO 33 ++#define SCTP_DEFAULT_SNDINFO 34 ++ ++/* Internal Socket Options. Some of the sctp library functions are ++ * implemented using these socket options. ++ */ ++#define SCTP_SOCKOPT_BINDX_ADD 100 /* BINDX requests for adding addrs */ ++#define SCTP_SOCKOPT_BINDX_REM 101 /* BINDX requests for removing addrs. */ ++#define SCTP_SOCKOPT_PEELOFF 102 /* peel off association. */ ++/* Options 104-106 are deprecated and removed. Do not use this space */ ++#define SCTP_SOCKOPT_CONNECTX_OLD 107 /* CONNECTX old requests. */ ++#define SCTP_GET_PEER_ADDRS 108 /* Get all peer address. */ ++#define SCTP_GET_LOCAL_ADDRS 109 /* Get all local address. */ ++#define SCTP_SOCKOPT_CONNECTX 110 /* CONNECTX requests. */ ++#define SCTP_SOCKOPT_CONNECTX3 111 /* CONNECTX requests (updated) */ ++#define SCTP_GET_ASSOC_STATS 112 /* Read only */ ++#define SCTP_PR_SUPPORTED 113 ++#define SCTP_DEFAULT_PRINFO 114 ++#define SCTP_PR_ASSOC_STATUS 115 ++#define SCTP_PR_STREAM_STATUS 116 ++#define SCTP_RECONFIG_SUPPORTED 117 ++#define SCTP_ENABLE_STREAM_RESET 118 ++#define SCTP_RESET_STREAMS 119 ++#define SCTP_RESET_ASSOC 120 ++#define SCTP_ADD_STREAMS 121 ++#define SCTP_SOCKOPT_PEELOFF_FLAGS 122 ++ ++/* PR-SCTP policies */ ++#define SCTP_PR_SCTP_NONE 0x0000 ++#define SCTP_PR_SCTP_TTL 0x0010 ++#define SCTP_PR_SCTP_RTX 0x0020 ++#define SCTP_PR_SCTP_PRIO 0x0030 ++#define SCTP_PR_SCTP_MAX SCTP_PR_SCTP_PRIO ++#define SCTP_PR_SCTP_MASK 0x0030 ++ ++#define __SCTP_PR_INDEX(x) ((x >> 4) - 1) ++#define SCTP_PR_INDEX(x) __SCTP_PR_INDEX(SCTP_PR_SCTP_ ## x) ++ ++#define SCTP_PR_POLICY(x) ((x) & SCTP_PR_SCTP_MASK) ++#define SCTP_PR_SET_POLICY(flags, x) \ ++ do { \ ++ flags &= ~SCTP_PR_SCTP_MASK; \ ++ flags |= x; \ ++ } while (0) ++ ++#define SCTP_PR_TTL_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_TTL) ++#define SCTP_PR_RTX_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_RTX) ++#define SCTP_PR_PRIO_ENABLED(x) (SCTP_PR_POLICY(x) == SCTP_PR_SCTP_PRIO) ++ ++/* For enable stream reset */ ++#define SCTP_ENABLE_RESET_STREAM_REQ 0x01 ++#define SCTP_ENABLE_RESET_ASSOC_REQ 0x02 ++#define SCTP_ENABLE_CHANGE_ASSOC_REQ 0x04 ++#define SCTP_ENABLE_STRRESET_MASK 0x07 ++ ++#define SCTP_STREAM_RESET_INCOMING 0x01 ++#define SCTP_STREAM_RESET_OUTGOING 0x02 ++ ++/* These are bit fields for msghdr->msg_flags. See section 5.1. */ ++/* On user space Linux, these live in as an enum. */ ++enum sctp_msg_flags { ++ MSG_NOTIFICATION = 0x8000, ++#define MSG_NOTIFICATION MSG_NOTIFICATION ++}; ++ ++/* 5.3.1 SCTP Initiation Structure (SCTP_INIT) ++ * ++ * This cmsghdr structure provides information for initializing new ++ * SCTP associations with sendmsg(). The SCTP_INITMSG socket option ++ * uses this same data structure. This structure is not used for ++ * recvmsg(). ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ---------------------- ++ * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg ++ */ ++struct sctp_initmsg { ++ __u16 sinit_num_ostreams; ++ __u16 sinit_max_instreams; ++ __u16 sinit_max_attempts; ++ __u16 sinit_max_init_timeo; ++}; ++ ++/* 5.3.2 SCTP Header Information Structure (SCTP_SNDRCV) ++ * ++ * This cmsghdr structure specifies SCTP options for sendmsg() and ++ * describes SCTP header information about a received message through ++ * recvmsg(). ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ---------------------- ++ * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo ++ */ ++struct sctp_sndrcvinfo { ++ __u16 sinfo_stream; ++ __u16 sinfo_ssn; ++ __u16 sinfo_flags; ++ __u32 sinfo_ppid; ++ __u32 sinfo_context; ++ __u32 sinfo_timetolive; ++ __u32 sinfo_tsn; ++ __u32 sinfo_cumtsn; ++ sctp_assoc_t sinfo_assoc_id; ++}; ++ ++/* 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO) ++ * ++ * This cmsghdr structure specifies SCTP options for sendmsg(). ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ------------------- ++ * IPPROTO_SCTP SCTP_SNDINFO struct sctp_sndinfo ++ */ ++struct sctp_sndinfo { ++ __u16 snd_sid; ++ __u16 snd_flags; ++ __u32 snd_ppid; ++ __u32 snd_context; ++ sctp_assoc_t snd_assoc_id; ++}; ++ ++/* 5.3.5 SCTP Receive Information Structure (SCTP_RCVINFO) ++ * ++ * This cmsghdr structure describes SCTP receive information ++ * about a received message through recvmsg(). ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ------------------- ++ * IPPROTO_SCTP SCTP_RCVINFO struct sctp_rcvinfo ++ */ ++struct sctp_rcvinfo { ++ __u16 rcv_sid; ++ __u16 rcv_ssn; ++ __u16 rcv_flags; ++ __u32 rcv_ppid; ++ __u32 rcv_tsn; ++ __u32 rcv_cumtsn; ++ __u32 rcv_context; ++ sctp_assoc_t rcv_assoc_id; ++}; ++ ++/* 5.3.6 SCTP Next Receive Information Structure (SCTP_NXTINFO) ++ * ++ * This cmsghdr structure describes SCTP receive information ++ * of the next message that will be delivered through recvmsg() ++ * if this information is already available when delivering ++ * the current message. ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ------------------- ++ * IPPROTO_SCTP SCTP_NXTINFO struct sctp_nxtinfo ++ */ ++struct sctp_nxtinfo { ++ __u16 nxt_sid; ++ __u16 nxt_flags; ++ __u32 nxt_ppid; ++ __u32 nxt_length; ++ sctp_assoc_t nxt_assoc_id; ++}; ++ ++/* ++ * sinfo_flags: 16 bits (unsigned integer) ++ * ++ * This field may contain any of the following flags and is composed of ++ * a bitwise OR of these values. ++ */ ++enum sctp_sinfo_flags { ++ SCTP_UNORDERED = (1 << 0), /* Send/receive message unordered. */ ++ SCTP_ADDR_OVER = (1 << 1), /* Override the primary destination. */ ++ SCTP_ABORT = (1 << 2), /* Send an ABORT message to the peer. */ ++ SCTP_SACK_IMMEDIATELY = (1 << 3), /* SACK should be sent without delay. */ ++ SCTP_NOTIFICATION = MSG_NOTIFICATION, /* Next message is not user msg but notification. */ ++ SCTP_EOF = MSG_FIN, /* Initiate graceful shutdown process. */ ++}; ++ ++typedef union { ++ __u8 raw; ++ struct sctp_initmsg init; ++ struct sctp_sndrcvinfo sndrcv; ++} sctp_cmsg_data_t; ++ ++/* These are cmsg_types. */ ++typedef enum sctp_cmsg_type { ++ SCTP_INIT, /* 5.2.1 SCTP Initiation Structure */ ++#define SCTP_INIT SCTP_INIT ++ SCTP_SNDRCV, /* 5.2.2 SCTP Header Information Structure */ ++#define SCTP_SNDRCV SCTP_SNDRCV ++ SCTP_SNDINFO, /* 5.3.4 SCTP Send Information Structure */ ++#define SCTP_SNDINFO SCTP_SNDINFO ++ SCTP_RCVINFO, /* 5.3.5 SCTP Receive Information Structure */ ++#define SCTP_RCVINFO SCTP_RCVINFO ++ SCTP_NXTINFO, /* 5.3.6 SCTP Next Receive Information Structure */ ++#define SCTP_NXTINFO SCTP_NXTINFO ++} sctp_cmsg_t; ++ ++/* ++ * 5.3.1.1 SCTP_ASSOC_CHANGE ++ * ++ * Communication notifications inform the ULP that an SCTP association ++ * has either begun or ended. The identifier for a new association is ++ * provided by this notificaion. The notification information has the ++ * following format: ++ * ++ */ ++struct sctp_assoc_change { ++ __u16 sac_type; ++ __u16 sac_flags; ++ __u32 sac_length; ++ __u16 sac_state; ++ __u16 sac_error; ++ __u16 sac_outbound_streams; ++ __u16 sac_inbound_streams; ++ sctp_assoc_t sac_assoc_id; ++ __u8 sac_info[0]; ++}; ++ ++/* ++ * sac_state: 32 bits (signed integer) ++ * ++ * This field holds one of a number of values that communicate the ++ * event that happened to the association. They include: ++ * ++ * Note: The following state names deviate from the API draft as ++ * the names clash too easily with other kernel symbols. ++ */ ++enum sctp_sac_state { ++ SCTP_COMM_UP, ++ SCTP_COMM_LOST, ++ SCTP_RESTART, ++ SCTP_SHUTDOWN_COMP, ++ SCTP_CANT_STR_ASSOC, ++}; ++ ++/* ++ * 5.3.1.2 SCTP_PEER_ADDR_CHANGE ++ * ++ * When a destination address on a multi-homed peer encounters a change ++ * an interface details event is sent. The information has the ++ * following structure: ++ */ ++struct sctp_paddr_change { ++ __u16 spc_type; ++ __u16 spc_flags; ++ __u32 spc_length; ++ struct sockaddr_storage spc_aaddr; ++ int spc_state; ++ int spc_error; ++ sctp_assoc_t spc_assoc_id; ++} __attribute__((packed, aligned(4))); ++ ++/* ++ * spc_state: 32 bits (signed integer) ++ * ++ * This field holds one of a number of values that communicate the ++ * event that happened to the address. They include: ++ */ ++enum sctp_spc_state { ++ SCTP_ADDR_AVAILABLE, ++ SCTP_ADDR_UNREACHABLE, ++ SCTP_ADDR_REMOVED, ++ SCTP_ADDR_ADDED, ++ SCTP_ADDR_MADE_PRIM, ++ SCTP_ADDR_CONFIRMED, ++}; ++ ++ ++/* ++ * 5.3.1.3 SCTP_REMOTE_ERROR ++ * ++ * A remote peer may send an Operational Error message to its peer. ++ * This message indicates a variety of error conditions on an ++ * association. The entire error TLV as it appears on the wire is ++ * included in a SCTP_REMOTE_ERROR event. Please refer to the SCTP ++ * specification [SCTP] and any extensions for a list of possible ++ * error formats. SCTP error TLVs have the format: ++ */ ++struct sctp_remote_error { ++ __u16 sre_type; ++ __u16 sre_flags; ++ __u32 sre_length; ++ __u16 sre_error; ++ sctp_assoc_t sre_assoc_id; ++ __u8 sre_data[0]; ++}; ++ ++ ++/* ++ * 5.3.1.4 SCTP_SEND_FAILED ++ * ++ * If SCTP cannot deliver a message it may return the message as a ++ * notification. ++ */ ++struct sctp_send_failed { ++ __u16 ssf_type; ++ __u16 ssf_flags; ++ __u32 ssf_length; ++ __u32 ssf_error; ++ struct sctp_sndrcvinfo ssf_info; ++ sctp_assoc_t ssf_assoc_id; ++ __u8 ssf_data[0]; ++}; ++ ++/* ++ * ssf_flags: 16 bits (unsigned integer) ++ * ++ * The flag value will take one of the following values ++ * ++ * SCTP_DATA_UNSENT - Indicates that the data was never put on ++ * the wire. ++ * ++ * SCTP_DATA_SENT - Indicates that the data was put on the wire. ++ * Note that this does not necessarily mean that the ++ * data was (or was not) successfully delivered. ++ */ ++enum sctp_ssf_flags { ++ SCTP_DATA_UNSENT, ++ SCTP_DATA_SENT, ++}; ++ ++/* ++ * 5.3.1.5 SCTP_SHUTDOWN_EVENT ++ * ++ * When a peer sends a SHUTDOWN, SCTP delivers this notification to ++ * inform the application that it should cease sending data. ++ */ ++struct sctp_shutdown_event { ++ __u16 sse_type; ++ __u16 sse_flags; ++ __u32 sse_length; ++ sctp_assoc_t sse_assoc_id; ++}; ++ ++/* ++ * 5.3.1.6 SCTP_ADAPTATION_INDICATION ++ * ++ * When a peer sends a Adaptation Layer Indication parameter , SCTP ++ * delivers this notification to inform the application ++ * that of the peers requested adaptation layer. ++ */ ++struct sctp_adaptation_event { ++ __u16 sai_type; ++ __u16 sai_flags; ++ __u32 sai_length; ++ __u32 sai_adaptation_ind; ++ sctp_assoc_t sai_assoc_id; ++}; ++ ++/* ++ * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT ++ * ++ * When a receiver is engaged in a partial delivery of a ++ * message this notification will be used to indicate ++ * various events. ++ */ ++struct sctp_pdapi_event { ++ __u16 pdapi_type; ++ __u16 pdapi_flags; ++ __u32 pdapi_length; ++ __u32 pdapi_indication; ++ sctp_assoc_t pdapi_assoc_id; ++}; ++ ++enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, }; ++ ++/* ++ * 5.3.1.8. SCTP_AUTHENTICATION_EVENT ++ * ++ * When a receiver is using authentication this message will provide ++ * notifications regarding new keys being made active as well as errors. ++ */ ++struct sctp_authkey_event { ++ __u16 auth_type; ++ __u16 auth_flags; ++ __u32 auth_length; ++ __u16 auth_keynumber; ++ __u16 auth_altkeynumber; ++ __u32 auth_indication; ++ sctp_assoc_t auth_assoc_id; ++}; ++ ++enum { SCTP_AUTH_NEWKEY = 0, }; ++ ++/* ++ * 6.1.9. SCTP_SENDER_DRY_EVENT ++ * ++ * When the SCTP stack has no more user data to send or retransmit, this ++ * notification is given to the user. Also, at the time when a user app ++ * subscribes to this event, if there is no data to be sent or ++ * retransmit, the stack will immediately send up this notification. ++ */ ++struct sctp_sender_dry_event { ++ __u16 sender_dry_type; ++ __u16 sender_dry_flags; ++ __u32 sender_dry_length; ++ sctp_assoc_t sender_dry_assoc_id; ++}; ++ ++#define SCTP_STREAM_RESET_INCOMING_SSN 0x0001 ++#define SCTP_STREAM_RESET_OUTGOING_SSN 0x0002 ++#define SCTP_STREAM_RESET_DENIED 0x0004 ++#define SCTP_STREAM_RESET_FAILED 0x0008 ++struct sctp_stream_reset_event { ++ __u16 strreset_type; ++ __u16 strreset_flags; ++ __u32 strreset_length; ++ sctp_assoc_t strreset_assoc_id; ++ __u16 strreset_stream_list[]; ++}; ++ ++#define SCTP_ASSOC_RESET_DENIED 0x0004 ++#define SCTP_ASSOC_RESET_FAILED 0x0008 ++struct sctp_assoc_reset_event { ++ __u16 assocreset_type; ++ __u16 assocreset_flags; ++ __u32 assocreset_length; ++ sctp_assoc_t assocreset_assoc_id; ++ __u32 assocreset_local_tsn; ++ __u32 assocreset_remote_tsn; ++}; ++ ++#define SCTP_ASSOC_CHANGE_DENIED 0x0004 ++#define SCTP_ASSOC_CHANGE_FAILED 0x0008 ++struct sctp_stream_change_event { ++ __u16 strchange_type; ++ __u16 strchange_flags; ++ __u32 strchange_length; ++ sctp_assoc_t strchange_assoc_id; ++ __u16 strchange_instrms; ++ __u16 strchange_outstrms; ++}; ++ ++/* ++ * Described in Section 7.3 ++ * Ancillary Data and Notification Interest Options ++ */ ++struct sctp_event_subscribe { ++ __u8 sctp_data_io_event; ++ __u8 sctp_association_event; ++ __u8 sctp_address_event; ++ __u8 sctp_send_failure_event; ++ __u8 sctp_peer_error_event; ++ __u8 sctp_shutdown_event; ++ __u8 sctp_partial_delivery_event; ++ __u8 sctp_adaptation_layer_event; ++ __u8 sctp_authentication_event; ++ __u8 sctp_sender_dry_event; ++ __u8 sctp_stream_reset_event; ++ __u8 sctp_assoc_reset_event; ++ __u8 sctp_stream_change_event; ++}; ++ ++/* ++ * 5.3.1 SCTP Notification Structure ++ * ++ * The notification structure is defined as the union of all ++ * notification types. ++ * ++ */ ++union sctp_notification { ++ struct { ++ __u16 sn_type; /* Notification type. */ ++ __u16 sn_flags; ++ __u32 sn_length; ++ } sn_header; ++ struct sctp_assoc_change sn_assoc_change; ++ struct sctp_paddr_change sn_paddr_change; ++ struct sctp_remote_error sn_remote_error; ++ struct sctp_send_failed sn_send_failed; ++ struct sctp_shutdown_event sn_shutdown_event; ++ struct sctp_adaptation_event sn_adaptation_event; ++ struct sctp_pdapi_event sn_pdapi_event; ++ struct sctp_authkey_event sn_authkey_event; ++ struct sctp_sender_dry_event sn_sender_dry_event; ++ struct sctp_stream_reset_event sn_strreset_event; ++ struct sctp_assoc_reset_event sn_assocreset_event; ++ struct sctp_stream_change_event sn_strchange_event; ++}; ++ ++/* Section 5.3.1 ++ * All standard values for sn_type flags are greater than 2^15. ++ * Values from 2^15 and down are reserved. ++ */ ++ ++enum sctp_sn_type { ++ SCTP_SN_TYPE_BASE = (1<<15), ++ SCTP_ASSOC_CHANGE, ++#define SCTP_ASSOC_CHANGE SCTP_ASSOC_CHANGE ++ SCTP_PEER_ADDR_CHANGE, ++#define SCTP_PEER_ADDR_CHANGE SCTP_PEER_ADDR_CHANGE ++ SCTP_SEND_FAILED, ++#define SCTP_SEND_FAILED SCTP_SEND_FAILED ++ SCTP_REMOTE_ERROR, ++#define SCTP_REMOTE_ERROR SCTP_REMOTE_ERROR ++ SCTP_SHUTDOWN_EVENT, ++#define SCTP_SHUTDOWN_EVENT SCTP_SHUTDOWN_EVENT ++ SCTP_PARTIAL_DELIVERY_EVENT, ++#define SCTP_PARTIAL_DELIVERY_EVENT SCTP_PARTIAL_DELIVERY_EVENT ++ SCTP_ADAPTATION_INDICATION, ++#define SCTP_ADAPTATION_INDICATION SCTP_ADAPTATION_INDICATION ++ SCTP_AUTHENTICATION_EVENT, ++#define SCTP_AUTHENTICATION_INDICATION SCTP_AUTHENTICATION_EVENT ++ SCTP_SENDER_DRY_EVENT, ++#define SCTP_SENDER_DRY_EVENT SCTP_SENDER_DRY_EVENT ++ SCTP_STREAM_RESET_EVENT, ++#define SCTP_STREAM_RESET_EVENT SCTP_STREAM_RESET_EVENT ++ SCTP_ASSOC_RESET_EVENT, ++#define SCTP_ASSOC_RESET_EVENT SCTP_ASSOC_RESET_EVENT ++ SCTP_STREAM_CHANGE_EVENT, ++#define SCTP_STREAM_CHANGE_EVENT SCTP_STREAM_CHANGE_EVENT ++}; ++ ++/* Notification error codes used to fill up the error fields in some ++ * notifications. ++ * SCTP_PEER_ADDRESS_CHAGE : spc_error ++ * SCTP_ASSOC_CHANGE : sac_error ++ * These names should be potentially included in the draft 04 of the SCTP ++ * sockets API specification. ++ */ ++typedef enum sctp_sn_error { ++ SCTP_FAILED_THRESHOLD, ++ SCTP_RECEIVED_SACK, ++ SCTP_HEARTBEAT_SUCCESS, ++ SCTP_RESPONSE_TO_USER_REQ, ++ SCTP_INTERNAL_ERROR, ++ SCTP_SHUTDOWN_GUARD_EXPIRES, ++ SCTP_PEER_FAULTY, ++} sctp_sn_error_t; ++ ++/* ++ * 7.1.1 Retransmission Timeout Parameters (SCTP_RTOINFO) ++ * ++ * The protocol parameters used to initialize and bound retransmission ++ * timeout (RTO) are tunable. See [SCTP] for more information on how ++ * these parameters are used in RTO calculation. ++ */ ++struct sctp_rtoinfo { ++ sctp_assoc_t srto_assoc_id; ++ __u32 srto_initial; ++ __u32 srto_max; ++ __u32 srto_min; ++}; ++ ++/* ++ * 7.1.2 Association Parameters (SCTP_ASSOCINFO) ++ * ++ * This option is used to both examine and set various association and ++ * endpoint parameters. ++ */ ++struct sctp_assocparams { ++ sctp_assoc_t sasoc_assoc_id; ++ __u16 sasoc_asocmaxrxt; ++ __u16 sasoc_number_peer_destinations; ++ __u32 sasoc_peer_rwnd; ++ __u32 sasoc_local_rwnd; ++ __u32 sasoc_cookie_life; ++}; ++ ++/* ++ * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) ++ * ++ * Requests that the peer mark the enclosed address as the association ++ * primary. The enclosed address must be one of the association's ++ * locally bound addresses. The following structure is used to make a ++ * set primary request: ++ */ ++struct sctp_setpeerprim { ++ sctp_assoc_t sspp_assoc_id; ++ struct sockaddr_storage sspp_addr; ++} __attribute__((packed, aligned(4))); ++ ++/* ++ * 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR) ++ * ++ * Requests that the local SCTP stack use the enclosed peer address as ++ * the association primary. The enclosed address must be one of the ++ * association peer's addresses. The following structure is used to ++ * make a set peer primary request: ++ */ ++struct sctp_prim { ++ sctp_assoc_t ssp_assoc_id; ++ struct sockaddr_storage ssp_addr; ++} __attribute__((packed, aligned(4))); ++ ++/* For backward compatibility use, define the old name too */ ++#define sctp_setprim sctp_prim ++ ++/* ++ * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER) ++ * ++ * Requests that the local endpoint set the specified Adaptation Layer ++ * Indication parameter for all future INIT and INIT-ACK exchanges. ++ */ ++struct sctp_setadaptation { ++ __u32 ssb_adaptation_ind; ++}; ++ ++/* ++ * 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS) ++ * ++ * Applications can enable or disable heartbeats for any peer address ++ * of an association, modify an address's heartbeat interval, force a ++ * heartbeat to be sent immediately, and adjust the address's maximum ++ * number of retransmissions sent before an address is considered ++ * unreachable. The following structure is used to access and modify an ++ * address's parameters: ++ */ ++enum sctp_spp_flags { ++ SPP_HB_ENABLE = 1<<0, /*Enable heartbeats*/ ++ SPP_HB_DISABLE = 1<<1, /*Disable heartbeats*/ ++ SPP_HB = SPP_HB_ENABLE | SPP_HB_DISABLE, ++ SPP_HB_DEMAND = 1<<2, /*Send heartbeat immediately*/ ++ SPP_PMTUD_ENABLE = 1<<3, /*Enable PMTU discovery*/ ++ SPP_PMTUD_DISABLE = 1<<4, /*Disable PMTU discovery*/ ++ SPP_PMTUD = SPP_PMTUD_ENABLE | SPP_PMTUD_DISABLE, ++ SPP_SACKDELAY_ENABLE = 1<<5, /*Enable SACK*/ ++ SPP_SACKDELAY_DISABLE = 1<<6, /*Disable SACK*/ ++ SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE, ++ SPP_HB_TIME_IS_ZERO = 1<<7, /* Set HB delay to 0 */ ++}; ++ ++struct sctp_paddrparams { ++ sctp_assoc_t spp_assoc_id; ++ struct sockaddr_storage spp_address; ++ __u32 spp_hbinterval; ++ __u16 spp_pathmaxrxt; ++ __u32 spp_pathmtu; ++ __u32 spp_sackdelay; ++ __u32 spp_flags; ++} __attribute__((packed, aligned(4))); ++ ++/* ++ * 7.1.18. Add a chunk that must be authenticated (SCTP_AUTH_CHUNK) ++ * ++ * This set option adds a chunk type that the user is requesting to be ++ * received only in an authenticated way. Changes to the list of chunks ++ * will only effect future associations on the socket. ++ */ ++struct sctp_authchunk { ++ __u8 sauth_chunk; ++}; ++ ++/* ++ * 7.1.19. Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT) ++ * ++ * This option gets or sets the list of HMAC algorithms that the local ++ * endpoint requires the peer to use. ++ */ ++/* This here is only used by user space as is. It might not be a good idea ++ * to export/reveal the whole structure with reserved fields etc. ++ */ ++enum { ++ SCTP_AUTH_HMAC_ID_SHA1 = 1, ++ SCTP_AUTH_HMAC_ID_SHA256 = 3, ++}; ++ ++struct sctp_hmacalgo { ++ __u32 shmac_num_idents; ++ __u16 shmac_idents[]; ++}; ++ ++/* Sadly, user and kernel space have different names for ++ * this structure member, so this is to not break anything. ++ */ ++#define shmac_number_of_idents shmac_num_idents ++ ++/* ++ * 7.1.20. Set a shared key (SCTP_AUTH_KEY) ++ * ++ * This option will set a shared secret key which is used to build an ++ * association shared key. ++ */ ++struct sctp_authkey { ++ sctp_assoc_t sca_assoc_id; ++ __u16 sca_keynumber; ++ __u16 sca_keylength; ++ __u8 sca_key[]; ++}; ++ ++/* ++ * 7.1.21. Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY) ++ * ++ * This option will get or set the active shared key to be used to build ++ * the association shared key. ++ */ ++ ++struct sctp_authkeyid { ++ sctp_assoc_t scact_assoc_id; ++ __u16 scact_keynumber; ++}; ++ ++ ++/* ++ * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK) ++ * ++ * This option will effect the way delayed acks are performed. This ++ * option allows you to get or set the delayed ack time, in ++ * milliseconds. It also allows changing the delayed ack frequency. ++ * Changing the frequency to 1 disables the delayed sack algorithm. If ++ * the assoc_id is 0, then this sets or gets the endpoints default ++ * values. If the assoc_id field is non-zero, then the set or get ++ * effects the specified association for the one to many model (the ++ * assoc_id field is ignored by the one to one model). Note that if ++ * sack_delay or sack_freq are 0 when setting this option, then the ++ * current values will remain unchanged. ++ */ ++struct sctp_sack_info { ++ sctp_assoc_t sack_assoc_id; ++ uint32_t sack_delay; ++ uint32_t sack_freq; ++}; ++ ++struct sctp_assoc_value { ++ sctp_assoc_t assoc_id; ++ uint32_t assoc_value; ++}; ++ ++/* ++ * 7.2.2 Peer Address Information ++ * ++ * Applications can retrieve information about a specific peer address ++ * of an association, including its reachability state, congestion ++ * window, and retransmission timer values. This information is ++ * read-only. The following structure is used to access this ++ * information: ++ */ ++struct sctp_paddrinfo { ++ sctp_assoc_t spinfo_assoc_id; ++ struct sockaddr_storage spinfo_address; ++ __s32 spinfo_state; ++ __u32 spinfo_cwnd; ++ __u32 spinfo_srtt; ++ __u32 spinfo_rto; ++ __u32 spinfo_mtu; ++} __attribute__((packed, aligned(4))); ++ ++/* Peer addresses's state. */ ++/* UNKNOWN: Peer address passed by the upper layer in sendmsg or connect[x] ++ * calls. ++ * UNCONFIRMED: Peer address received in INIT/INIT-ACK address parameters. ++ * Not yet confirmed by a heartbeat and not available for data ++ * transfers. ++ * ACTIVE : Peer address confirmed, active and available for data transfers. ++ * INACTIVE: Peer address inactive and not available for data transfers. ++ */ ++enum sctp_spinfo_state { ++ SCTP_INACTIVE, ++ SCTP_PF, ++ SCTP_ACTIVE, ++ SCTP_UNCONFIRMED, ++ SCTP_UNKNOWN = 0xffff /* Value used for transport state unknown */ ++}; ++ ++/* ++ * 7.2.1 Association Status (SCTP_STATUS) ++ * ++ * Applications can retrieve current status information about an ++ * association, including association state, peer receiver window size, ++ * number of unacked data chunks, and number of data chunks pending ++ * receipt. This information is read-only. The following structure is ++ * used to access this information: ++ */ ++struct sctp_status { ++ sctp_assoc_t sstat_assoc_id; ++ __s32 sstat_state; ++ __u32 sstat_rwnd; ++ __u16 sstat_unackdata; ++ __u16 sstat_penddata; ++ __u16 sstat_instrms; ++ __u16 sstat_outstrms; ++ __u32 sstat_fragmentation_point; ++ struct sctp_paddrinfo sstat_primary; ++}; ++ ++/* ++ * 7.2.3. Get the list of chunks the peer requires to be authenticated ++ * (SCTP_PEER_AUTH_CHUNKS) ++ * ++ * This option gets a list of chunks for a specified association that ++ * the peer requires to be received authenticated only. ++ */ ++struct sctp_authchunks { ++ sctp_assoc_t gauth_assoc_id; ++ __u32 gauth_number_of_chunks; ++ uint8_t gauth_chunks[]; ++}; ++ ++/* The broken spelling has been released already in lksctp-tools header, ++ * so don't break anyone, now that it's fixed. ++ */ ++#define guth_number_of_chunks gauth_number_of_chunks ++ ++/* Association states. */ ++enum sctp_sstat_state { ++ SCTP_EMPTY = 0, ++ SCTP_CLOSED = 1, ++ SCTP_COOKIE_WAIT = 2, ++ SCTP_COOKIE_ECHOED = 3, ++ SCTP_ESTABLISHED = 4, ++ SCTP_SHUTDOWN_PENDING = 5, ++ SCTP_SHUTDOWN_SENT = 6, ++ SCTP_SHUTDOWN_RECEIVED = 7, ++ SCTP_SHUTDOWN_ACK_SENT = 8, ++}; ++ ++/* ++ * 8.2.6. Get the Current Identifiers of Associations ++ * (SCTP_GET_ASSOC_ID_LIST) ++ * ++ * This option gets the current list of SCTP association identifiers of ++ * the SCTP associations handled by a one-to-many style socket. ++ */ ++struct sctp_assoc_ids { ++ __u32 gaids_number_of_ids; ++ sctp_assoc_t gaids_assoc_id[]; ++}; ++ ++/* ++ * 8.3, 8.5 get all peer/local addresses in an association. ++ * This parameter struct is used by SCTP_GET_PEER_ADDRS and ++ * SCTP_GET_LOCAL_ADDRS socket options used internally to implement ++ * sctp_getpaddrs() and sctp_getladdrs() API. ++ */ ++struct sctp_getaddrs_old { ++ sctp_assoc_t assoc_id; ++ int addr_num; ++ struct sockaddr *addrs; ++}; ++ ++struct sctp_getaddrs { ++ sctp_assoc_t assoc_id; /*input*/ ++ __u32 addr_num; /*output*/ ++ __u8 addrs[0]; /*output, variable size*/ ++}; ++ ++/* A socket user request obtained via SCTP_GET_ASSOC_STATS that retrieves ++ * association stats. All stats are counts except sas_maxrto and ++ * sas_obs_rto_ipaddr. maxrto is the max observed rto + transport since ++ * the last call. Will return 0 when RTO was not update since last call ++ */ ++struct sctp_assoc_stats { ++ sctp_assoc_t sas_assoc_id; /* Input */ ++ /* Transport of observed max RTO */ ++ struct sockaddr_storage sas_obs_rto_ipaddr; ++ __u64 sas_maxrto; /* Maximum Observed RTO for period */ ++ __u64 sas_isacks; /* SACKs received */ ++ __u64 sas_osacks; /* SACKs sent */ ++ __u64 sas_opackets; /* Packets sent */ ++ __u64 sas_ipackets; /* Packets received */ ++ __u64 sas_rtxchunks; /* Retransmitted Chunks */ ++ __u64 sas_outofseqtsns;/* TSN received > next expected */ ++ __u64 sas_idupchunks; /* Dups received (ordered+unordered) */ ++ __u64 sas_gapcnt; /* Gap Acknowledgements Received */ ++ __u64 sas_ouodchunks; /* Unordered data chunks sent */ ++ __u64 sas_iuodchunks; /* Unordered data chunks received */ ++ __u64 sas_oodchunks; /* Ordered data chunks sent */ ++ __u64 sas_iodchunks; /* Ordered data chunks received */ ++ __u64 sas_octrlchunks; /* Control chunks sent */ ++ __u64 sas_ictrlchunks; /* Control chunks received */ ++}; ++ ++/* ++ * 8.1 sctp_bindx() ++ * ++ * The flags parameter is formed from the bitwise OR of zero or more of the ++ * following currently defined flags: ++ */ ++#define SCTP_BINDX_ADD_ADDR 0x01 ++#define SCTP_BINDX_REM_ADDR 0x02 ++ ++/* This is the structure that is passed as an argument(optval) to ++ * getsockopt(SCTP_SOCKOPT_PEELOFF). ++ */ ++typedef struct { ++ sctp_assoc_t associd; ++ int sd; ++} sctp_peeloff_arg_t; ++ ++typedef struct { ++ sctp_peeloff_arg_t p_arg; ++ unsigned flags; ++} sctp_peeloff_flags_arg_t; ++ ++/* ++ * Peer Address Thresholds socket option ++ */ ++struct sctp_paddrthlds { ++ sctp_assoc_t spt_assoc_id; ++ struct sockaddr_storage spt_address; ++ __u16 spt_pathmaxrxt; ++ __u16 spt_pathpfthld; ++}; ++ ++/* ++ * Socket Option for Getting the Association/Stream-Specific PR-SCTP Status ++ */ ++struct sctp_prstatus { ++ sctp_assoc_t sprstat_assoc_id; ++ __u16 sprstat_sid; ++ __u16 sprstat_policy; ++ __u64 sprstat_abandoned_unsent; ++ __u64 sprstat_abandoned_sent; ++}; ++ ++struct sctp_default_prinfo { ++ sctp_assoc_t pr_assoc_id; ++ __u32 pr_value; ++ __u16 pr_policy; ++}; ++ ++struct sctp_info { ++ __u32 sctpi_tag; ++ __u32 sctpi_state; ++ __u32 sctpi_rwnd; ++ __u16 sctpi_unackdata; ++ __u16 sctpi_penddata; ++ __u16 sctpi_instrms; ++ __u16 sctpi_outstrms; ++ __u32 sctpi_fragmentation_point; ++ __u32 sctpi_inqueue; ++ __u32 sctpi_outqueue; ++ __u32 sctpi_overall_error; ++ __u32 sctpi_max_burst; ++ __u32 sctpi_maxseg; ++ __u32 sctpi_peer_rwnd; ++ __u32 sctpi_peer_tag; ++ __u8 sctpi_peer_capable; ++ __u8 sctpi_peer_sack; ++ __u16 __reserved1; ++ ++ /* assoc status info */ ++ __u64 sctpi_isacks; ++ __u64 sctpi_osacks; ++ __u64 sctpi_opackets; ++ __u64 sctpi_ipackets; ++ __u64 sctpi_rtxchunks; ++ __u64 sctpi_outofseqtsns; ++ __u64 sctpi_idupchunks; ++ __u64 sctpi_gapcnt; ++ __u64 sctpi_ouodchunks; ++ __u64 sctpi_iuodchunks; ++ __u64 sctpi_oodchunks; ++ __u64 sctpi_iodchunks; ++ __u64 sctpi_octrlchunks; ++ __u64 sctpi_ictrlchunks; ++ ++ /* primary transport info */ ++ struct sockaddr_storage sctpi_p_address; ++ __s32 sctpi_p_state; ++ __u32 sctpi_p_cwnd; ++ __u32 sctpi_p_srtt; ++ __u32 sctpi_p_rto; ++ __u32 sctpi_p_hbinterval; ++ __u32 sctpi_p_pathmaxrxt; ++ __u32 sctpi_p_sackdelay; ++ __u32 sctpi_p_sackfreq; ++ __u32 sctpi_p_ssthresh; ++ __u32 sctpi_p_partial_bytes_acked; ++ __u32 sctpi_p_flight_size; ++ __u16 sctpi_p_error; ++ __u16 __reserved2; ++ ++ /* sctp sock info */ ++ __u32 sctpi_s_autoclose; ++ __u32 sctpi_s_adaptation_ind; ++ __u32 sctpi_s_pd_point; ++ __u8 sctpi_s_nodelay; ++ __u8 sctpi_s_disable_fragments; ++ __u8 sctpi_s_v4mapped; ++ __u8 sctpi_s_frag_interleave; ++ __u32 sctpi_s_type; ++ __u32 __reserved3; ++}; ++ ++struct sctp_reset_streams { ++ sctp_assoc_t srs_assoc_id; ++ uint16_t srs_flags; ++ uint16_t srs_number_streams; /* 0 == ALL */ ++ uint16_t srs_stream_list[]; /* list if srs_num_streams is not 0 */ ++}; ++ ++struct sctp_add_streams { ++ sctp_assoc_t sas_assoc_id; ++ uint16_t sas_instrms; ++ uint16_t sas_outstrms; ++}; ++ ++#endif /* _SCTP_H */ +diff --git a/include/uapi/linux/seg6.h b/include/uapi/linux/seg6.h +new file mode 100644 +index 0000000..0715279 +--- /dev/null ++++ b/include/uapi/linux/seg6.h +@@ -0,0 +1,54 @@ ++/* ++ * SR-IPv6 implementation ++ * ++ * Author: ++ * David Lebrun ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_SEG6_H ++#define _LINUX_SEG6_H ++ ++#include ++#include /* For struct in6_addr. */ ++ ++/* ++ * SRH ++ */ ++struct ipv6_sr_hdr { ++ __u8 nexthdr; ++ __u8 hdrlen; ++ __u8 type; ++ __u8 segments_left; ++ __u8 first_segment; ++ __u8 flags; ++ __u16 reserved; ++ ++ struct in6_addr segments[0]; ++}; ++ ++#define SR6_FLAG1_PROTECTED (1 << 6) ++#define SR6_FLAG1_OAM (1 << 5) ++#define SR6_FLAG1_ALERT (1 << 4) ++#define SR6_FLAG1_HMAC (1 << 3) ++ ++#define SR6_TLV_INGRESS 1 ++#define SR6_TLV_EGRESS 2 ++#define SR6_TLV_OPAQUE 3 ++#define SR6_TLV_PADDING 4 ++#define SR6_TLV_HMAC 5 ++ ++#define sr_has_hmac(srh) ((srh)->flags & SR6_FLAG1_HMAC) ++ ++struct sr6_tlv { ++ __u8 type; ++ __u8 len; ++ __u8 data[0]; ++}; ++ ++#endif +diff --git a/include/uapi/linux/seg6_genl.h b/include/uapi/linux/seg6_genl.h +new file mode 100644 +index 0000000..99382f9 +--- /dev/null ++++ b/include/uapi/linux/seg6_genl.h +@@ -0,0 +1,32 @@ ++#ifndef _LINUX_SEG6_GENL_H ++#define _LINUX_SEG6_GENL_H ++ ++#define SEG6_GENL_NAME "SEG6" ++#define SEG6_GENL_VERSION 0x1 ++ ++enum { ++ SEG6_ATTR_UNSPEC, ++ SEG6_ATTR_DST, ++ SEG6_ATTR_DSTLEN, ++ SEG6_ATTR_HMACKEYID, ++ SEG6_ATTR_SECRET, ++ SEG6_ATTR_SECRETLEN, ++ SEG6_ATTR_ALGID, ++ SEG6_ATTR_HMACINFO, ++ __SEG6_ATTR_MAX, ++}; ++ ++#define SEG6_ATTR_MAX (__SEG6_ATTR_MAX - 1) ++ ++enum { ++ SEG6_CMD_UNSPEC, ++ SEG6_CMD_SETHMAC, ++ SEG6_CMD_DUMPHMAC, ++ SEG6_CMD_SET_TUNSRC, ++ SEG6_CMD_GET_TUNSRC, ++ __SEG6_CMD_MAX, ++}; ++ ++#define SEG6_CMD_MAX (__SEG6_CMD_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/seg6_hmac.h b/include/uapi/linux/seg6_hmac.h +new file mode 100644 +index 0000000..704f93e +--- /dev/null ++++ b/include/uapi/linux/seg6_hmac.h +@@ -0,0 +1,22 @@ ++#ifndef _LINUX_SEG6_HMAC_H ++#define _LINUX_SEG6_HMAC_H ++ ++#include ++#include ++ ++#define SEG6_HMAC_SECRET_LEN 64 ++#define SEG6_HMAC_FIELD_LEN 32 ++ ++struct sr6_tlv_hmac { ++ struct sr6_tlv tlvhdr; ++ __u16 reserved; ++ __be32 hmackeyid; ++ __u8 hmac[SEG6_HMAC_FIELD_LEN]; ++}; ++ ++enum { ++ SEG6_HMAC_ALGO_SHA1 = 1, ++ SEG6_HMAC_ALGO_SHA256 = 2, ++}; ++ ++#endif +diff --git a/include/uapi/linux/seg6_iptunnel.h b/include/uapi/linux/seg6_iptunnel.h +new file mode 100644 +index 0000000..a5dc05a +--- /dev/null ++++ b/include/uapi/linux/seg6_iptunnel.h +@@ -0,0 +1,40 @@ ++/* ++ * SR-IPv6 implementation ++ * ++ * Author: ++ * David Lebrun ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_SEG6_IPTUNNEL_H ++#define _LINUX_SEG6_IPTUNNEL_H ++ ++#include /* For struct ipv6_sr_hdr. */ ++ ++enum { ++ SEG6_IPTUNNEL_UNSPEC, ++ SEG6_IPTUNNEL_SRH, ++ __SEG6_IPTUNNEL_MAX, ++}; ++#define SEG6_IPTUNNEL_MAX (__SEG6_IPTUNNEL_MAX - 1) ++ ++struct seg6_iptunnel_encap { ++ int mode; ++ struct ipv6_sr_hdr srh[0]; ++}; ++ ++#define SEG6_IPTUN_ENCAP_SIZE(x) ((sizeof(*x)) + (((x)->srh->hdrlen + 1) << 3)) ++ ++enum { ++ SEG6_IPTUN_MODE_INLINE, ++ SEG6_IPTUN_MODE_ENCAP, ++ SEG6_IPTUN_MODE_L2ENCAP, ++}; ++ ++ ++#endif +diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h +new file mode 100644 +index 0000000..76b90d6 +--- /dev/null ++++ b/include/uapi/linux/seg6_local.h +@@ -0,0 +1,68 @@ ++/* ++ * SR-IPv6 implementation ++ * ++ * Author: ++ * David Lebrun ++ * ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef _LINUX_SEG6_LOCAL_H ++#define _LINUX_SEG6_LOCAL_H ++ ++#include ++ ++enum { ++ SEG6_LOCAL_UNSPEC, ++ SEG6_LOCAL_ACTION, ++ SEG6_LOCAL_SRH, ++ SEG6_LOCAL_TABLE, ++ SEG6_LOCAL_NH4, ++ SEG6_LOCAL_NH6, ++ SEG6_LOCAL_IIF, ++ SEG6_LOCAL_OIF, ++ __SEG6_LOCAL_MAX, ++}; ++#define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1) ++ ++enum { ++ SEG6_LOCAL_ACTION_UNSPEC = 0, ++ /* node segment */ ++ SEG6_LOCAL_ACTION_END = 1, ++ /* adjacency segment (IPv6 cross-connect) */ ++ SEG6_LOCAL_ACTION_END_X = 2, ++ /* lookup of next seg NH in table */ ++ SEG6_LOCAL_ACTION_END_T = 3, ++ /* decap and L2 cross-connect */ ++ SEG6_LOCAL_ACTION_END_DX2 = 4, ++ /* decap and IPv6 cross-connect */ ++ SEG6_LOCAL_ACTION_END_DX6 = 5, ++ /* decap and IPv4 cross-connect */ ++ SEG6_LOCAL_ACTION_END_DX4 = 6, ++ /* decap and lookup of DA in v6 table */ ++ SEG6_LOCAL_ACTION_END_DT6 = 7, ++ /* decap and lookup of DA in v4 table */ ++ SEG6_LOCAL_ACTION_END_DT4 = 8, ++ /* binding segment with insertion */ ++ SEG6_LOCAL_ACTION_END_B6 = 9, ++ /* binding segment with encapsulation */ ++ SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, ++ /* binding segment with MPLS encap */ ++ SEG6_LOCAL_ACTION_END_BM = 11, ++ /* lookup last seg in table */ ++ SEG6_LOCAL_ACTION_END_S = 12, ++ /* forward to SR-unaware VNF with static proxy */ ++ SEG6_LOCAL_ACTION_END_AS = 13, ++ /* forward to SR-unaware VNF with masquerading */ ++ SEG6_LOCAL_ACTION_END_AM = 14, ++ ++ __SEG6_LOCAL_ACTION_MAX, ++}; ++ ++#define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/sock_diag.h b/include/uapi/linux/sock_diag.h +new file mode 100644 +index 0000000..901231e +--- /dev/null ++++ b/include/uapi/linux/sock_diag.h +@@ -0,0 +1,38 @@ ++#ifndef __SOCK_DIAG_H__ ++#define __SOCK_DIAG_H__ ++ ++#include ++ ++#define SOCK_DIAG_BY_FAMILY 20 ++#define SOCK_DESTROY 21 ++ ++struct sock_diag_req { ++ __u8 sdiag_family; ++ __u8 sdiag_protocol; ++}; ++ ++enum { ++ SK_MEMINFO_RMEM_ALLOC, ++ SK_MEMINFO_RCVBUF, ++ SK_MEMINFO_WMEM_ALLOC, ++ SK_MEMINFO_SNDBUF, ++ SK_MEMINFO_FWD_ALLOC, ++ SK_MEMINFO_WMEM_QUEUED, ++ SK_MEMINFO_OPTMEM, ++ SK_MEMINFO_BACKLOG, ++ SK_MEMINFO_DROPS, ++ ++ SK_MEMINFO_VARS, ++}; ++ ++enum sknetlink_groups { ++ SKNLGRP_NONE, ++ SKNLGRP_INET_TCP_DESTROY, ++ SKNLGRP_INET_UDP_DESTROY, ++ SKNLGRP_INET6_TCP_DESTROY, ++ SKNLGRP_INET6_UDP_DESTROY, ++ __SKNLGRP_MAX, ++}; ++#define SKNLGRP_MAX (__SKNLGRP_MAX - 1) ++ ++#endif /* __SOCK_DIAG_H__ */ +diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h +new file mode 100644 +index 0000000..8c1e501 +--- /dev/null ++++ b/include/uapi/linux/socket.h +@@ -0,0 +1,21 @@ ++#ifndef _LINUX_SOCKET_H ++#define _LINUX_SOCKET_H ++ ++/* ++ * Desired design of maximum size and alignment (see RFC2553) ++ */ ++#define _K_SS_MAXSIZE 128 /* Implementation specific max size */ ++#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *)) ++ /* Implementation specific desired alignment */ ++ ++typedef unsigned short __kernel_sa_family_t; ++ ++struct __kernel_sockaddr_storage { ++ __kernel_sa_family_t ss_family; /* address family */ ++ /* Following field(s) are implementation specific */ ++ char __data[_K_SS_MAXSIZE - sizeof(unsigned short)]; ++ /* space to achieve desired size, */ ++ /* _SS_MAXSIZE value minus size of ss_family */ ++} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */ ++ ++#endif /* _LINUX_SOCKET_H */ +diff --git a/include/uapi/linux/sockios.h b/include/uapi/linux/sockios.h +new file mode 100644 +index 0000000..79d029d +--- /dev/null ++++ b/include/uapi/linux/sockios.h +@@ -0,0 +1,152 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Definitions of the socket-level I/O control calls. ++ * ++ * Version: @(#)sockios.h 1.0.2 03/09/93 ++ * ++ * Authors: Ross Biro ++ * Fred N. van Kempen, ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++#ifndef _LINUX_SOCKIOS_H ++#define _LINUX_SOCKIOS_H ++ ++#include ++ ++/* Linux-specific socket ioctls */ ++#define SIOCINQ FIONREAD ++#define SIOCOUTQ TIOCOUTQ /* output queue size (not sent + not acked) */ ++ ++#define SOCK_IOC_TYPE 0x89 ++ ++/* Routing table calls. */ ++#define SIOCADDRT 0x890B /* add routing table entry */ ++#define SIOCDELRT 0x890C /* delete routing table entry */ ++#define SIOCRTMSG 0x890D /* unused */ ++ ++/* Socket configuration controls. */ ++#define SIOCGIFNAME 0x8910 /* get iface name */ ++#define SIOCSIFLINK 0x8911 /* set iface channel */ ++#define SIOCGIFCONF 0x8912 /* get iface list */ ++#define SIOCGIFFLAGS 0x8913 /* get flags */ ++#define SIOCSIFFLAGS 0x8914 /* set flags */ ++#define SIOCGIFADDR 0x8915 /* get PA address */ ++#define SIOCSIFADDR 0x8916 /* set PA address */ ++#define SIOCGIFDSTADDR 0x8917 /* get remote PA address */ ++#define SIOCSIFDSTADDR 0x8918 /* set remote PA address */ ++#define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ ++#define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ ++#define SIOCGIFNETMASK 0x891b /* get network PA mask */ ++#define SIOCSIFNETMASK 0x891c /* set network PA mask */ ++#define SIOCGIFMETRIC 0x891d /* get metric */ ++#define SIOCSIFMETRIC 0x891e /* set metric */ ++#define SIOCGIFMEM 0x891f /* get memory address (BSD) */ ++#define SIOCSIFMEM 0x8920 /* set memory address (BSD) */ ++#define SIOCGIFMTU 0x8921 /* get MTU size */ ++#define SIOCSIFMTU 0x8922 /* set MTU size */ ++#define SIOCSIFNAME 0x8923 /* set interface name */ ++#define SIOCSIFHWADDR 0x8924 /* set hardware address */ ++#define SIOCGIFENCAP 0x8925 /* get/set encapsulations */ ++#define SIOCSIFENCAP 0x8926 ++#define SIOCGIFHWADDR 0x8927 /* Get hardware address */ ++#define SIOCGIFSLAVE 0x8929 /* Driver slaving support */ ++#define SIOCSIFSLAVE 0x8930 ++#define SIOCADDMULTI 0x8931 /* Multicast address lists */ ++#define SIOCDELMULTI 0x8932 ++#define SIOCGIFINDEX 0x8933 /* name -> if_index mapping */ ++#define SIOGIFINDEX SIOCGIFINDEX /* misprint compatibility :-) */ ++#define SIOCSIFPFLAGS 0x8934 /* set/get extended flags set */ ++#define SIOCGIFPFLAGS 0x8935 ++#define SIOCDIFADDR 0x8936 /* delete PA address */ ++#define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */ ++#define SIOCGIFCOUNT 0x8938 /* get number of devices */ ++ ++#define SIOCGIFBR 0x8940 /* Bridging support */ ++#define SIOCSIFBR 0x8941 /* Set bridging options */ ++ ++#define SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */ ++#define SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */ ++ ++/* SIOCGIFDIVERT was: 0x8944 Frame diversion support */ ++/* SIOCSIFDIVERT was: 0x8945 Set frame diversion options */ ++ ++#define SIOCETHTOOL 0x8946 /* Ethtool interface */ ++ ++#define SIOCGMIIPHY 0x8947 /* Get address of MII PHY in use. */ ++#define SIOCGMIIREG 0x8948 /* Read MII PHY register. */ ++#define SIOCSMIIREG 0x8949 /* Write MII PHY register. */ ++ ++#define SIOCWANDEV 0x894A /* get/set netdev parameters */ ++ ++#define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */ ++#define SIOCGSKNS 0x894C /* get socket network namespace */ ++ ++/* ARP cache control calls. */ ++ /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ ++#define SIOCDARP 0x8953 /* delete ARP table entry */ ++#define SIOCGARP 0x8954 /* get ARP table entry */ ++#define SIOCSARP 0x8955 /* set ARP table entry */ ++ ++/* RARP cache control calls. */ ++#define SIOCDRARP 0x8960 /* delete RARP table entry */ ++#define SIOCGRARP 0x8961 /* get RARP table entry */ ++#define SIOCSRARP 0x8962 /* set RARP table entry */ ++ ++/* Driver configuration calls */ ++ ++#define SIOCGIFMAP 0x8970 /* Get device parameters */ ++#define SIOCSIFMAP 0x8971 /* Set device parameters */ ++ ++/* DLCI configuration calls */ ++ ++#define SIOCADDDLCI 0x8980 /* Create new DLCI device */ ++#define SIOCDELDLCI 0x8981 /* Delete DLCI device */ ++ ++#define SIOCGIFVLAN 0x8982 /* 802.1Q VLAN support */ ++#define SIOCSIFVLAN 0x8983 /* Set 802.1Q VLAN options */ ++ ++/* bonding calls */ ++ ++#define SIOCBONDENSLAVE 0x8990 /* enslave a device to the bond */ ++#define SIOCBONDRELEASE 0x8991 /* release a slave from the bond*/ ++#define SIOCBONDSETHWADDR 0x8992 /* set the hw addr of the bond */ ++#define SIOCBONDSLAVEINFOQUERY 0x8993 /* rtn info about slave state */ ++#define SIOCBONDINFOQUERY 0x8994 /* rtn info about bond state */ ++#define SIOCBONDCHANGEACTIVE 0x8995 /* update to a new active slave */ ++ ++/* bridge calls */ ++#define SIOCBRADDBR 0x89a0 /* create new bridge device */ ++#define SIOCBRDELBR 0x89a1 /* remove bridge device */ ++#define SIOCBRADDIF 0x89a2 /* add interface to bridge */ ++#define SIOCBRDELIF 0x89a3 /* remove interface from bridge */ ++ ++/* hardware time stamping: parameters in linux/net_tstamp.h */ ++#define SIOCSHWTSTAMP 0x89b0 /* set and get config */ ++#define SIOCGHWTSTAMP 0x89b1 /* get config */ ++ ++/* Device private ioctl calls */ ++ ++/* ++ * These 16 ioctls are available to devices via the do_ioctl() device ++ * vector. Each device should include this file and redefine these names ++ * as their own. Because these are device dependent it is a good idea ++ * _NOT_ to issue them to random objects and hope. ++ * ++ * THESE IOCTLS ARE _DEPRECATED_ AND WILL DISAPPEAR IN 2.5.X -DaveM ++ */ ++ ++#define SIOCDEVPRIVATE 0x89F0 /* to 89FF */ ++ ++/* ++ * These 16 ioctl calls are protocol private ++ */ ++ ++#define SIOCPROTOPRIVATE 0x89E0 /* to 89EF */ ++#endif /* _LINUX_SOCKIOS_H */ +diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h +new file mode 100644 +index 0000000..4bb69de +--- /dev/null ++++ b/include/uapi/linux/stddef.h +@@ -0,0 +1,5 @@ ++ ++ ++#ifndef __always_inline ++#define __always_inline __inline__ ++#endif +diff --git a/include/uapi/linux/sysinfo.h b/include/uapi/linux/sysinfo.h +new file mode 100644 +index 0000000..934335a +--- /dev/null ++++ b/include/uapi/linux/sysinfo.h +@@ -0,0 +1,24 @@ ++#ifndef _LINUX_SYSINFO_H ++#define _LINUX_SYSINFO_H ++ ++#include ++ ++#define SI_LOAD_SHIFT 16 ++struct sysinfo { ++ __kernel_long_t uptime; /* Seconds since boot */ ++ __kernel_ulong_t loads[3]; /* 1, 5, and 15 minute load averages */ ++ __kernel_ulong_t totalram; /* Total usable main memory size */ ++ __kernel_ulong_t freeram; /* Available memory size */ ++ __kernel_ulong_t sharedram; /* Amount of shared memory */ ++ __kernel_ulong_t bufferram; /* Memory used by buffers */ ++ __kernel_ulong_t totalswap; /* Total swap space size */ ++ __kernel_ulong_t freeswap; /* swap space still available */ ++ __u16 procs; /* Number of current processes */ ++ __u16 pad; /* Explicit padding for m68k */ ++ __kernel_ulong_t totalhigh; /* Total high memory size */ ++ __kernel_ulong_t freehigh; /* Available high memory size */ ++ __u32 mem_unit; /* Memory unit size in bytes */ ++ char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)]; /* Padding: libc5 uses this.. */ ++}; ++ ++#endif /* _LINUX_SYSINFO_H */ +diff --git a/include/uapi/linux/tc_act/tc_bpf.h b/include/uapi/linux/tc_act/tc_bpf.h +new file mode 100644 +index 0000000..8dc2ac0 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_bpf.h +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 2015 Jiri Pirko ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef __LINUX_TC_BPF_H ++#define __LINUX_TC_BPF_H ++ ++#include ++ ++#define TCA_ACT_BPF 13 ++ ++struct tc_act_bpf { ++ tc_gen; ++}; ++ ++enum { ++ TCA_ACT_BPF_UNSPEC, ++ TCA_ACT_BPF_TM, ++ TCA_ACT_BPF_PARMS, ++ TCA_ACT_BPF_OPS_LEN, ++ TCA_ACT_BPF_OPS, ++ TCA_ACT_BPF_FD, ++ TCA_ACT_BPF_NAME, ++ TCA_ACT_BPF_PAD, ++ TCA_ACT_BPF_TAG, ++ TCA_ACT_BPF_ID, ++ __TCA_ACT_BPF_MAX, ++}; ++#define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_connmark.h b/include/uapi/linux/tc_act/tc_connmark.h +new file mode 100644 +index 0000000..62a5e94 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_connmark.h +@@ -0,0 +1,23 @@ ++#ifndef __UAPI_TC_CONNMARK_H ++#define __UAPI_TC_CONNMARK_H ++ ++#include ++#include ++ ++#define TCA_ACT_CONNMARK 14 ++ ++struct tc_connmark { ++ tc_gen; ++ __u16 zone; ++}; ++ ++enum { ++ TCA_CONNMARK_UNSPEC, ++ TCA_CONNMARK_PARMS, ++ TCA_CONNMARK_TM, ++ TCA_CONNMARK_PAD, ++ __TCA_CONNMARK_MAX ++}; ++#define TCA_CONNMARK_MAX (__TCA_CONNMARK_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_csum.h b/include/uapi/linux/tc_act/tc_csum.h +new file mode 100644 +index 0000000..a11bb35 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_csum.h +@@ -0,0 +1,34 @@ ++#ifndef __LINUX_TC_CSUM_H ++#define __LINUX_TC_CSUM_H ++ ++#include ++#include ++ ++#define TCA_ACT_CSUM 16 ++ ++enum { ++ TCA_CSUM_UNSPEC, ++ TCA_CSUM_PARMS, ++ TCA_CSUM_TM, ++ TCA_CSUM_PAD, ++ __TCA_CSUM_MAX ++}; ++#define TCA_CSUM_MAX (__TCA_CSUM_MAX - 1) ++ ++enum { ++ TCA_CSUM_UPDATE_FLAG_IPV4HDR = 1, ++ TCA_CSUM_UPDATE_FLAG_ICMP = 2, ++ TCA_CSUM_UPDATE_FLAG_IGMP = 4, ++ TCA_CSUM_UPDATE_FLAG_TCP = 8, ++ TCA_CSUM_UPDATE_FLAG_UDP = 16, ++ TCA_CSUM_UPDATE_FLAG_UDPLITE = 32, ++ TCA_CSUM_UPDATE_FLAG_SCTP = 64, ++}; ++ ++struct tc_csum { ++ tc_gen; ++ ++ __u32 update_flags; ++}; ++ ++#endif /* __LINUX_TC_CSUM_H */ +diff --git a/include/uapi/linux/tc_act/tc_defact.h b/include/uapi/linux/tc_act/tc_defact.h +new file mode 100644 +index 0000000..d2a3abb +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_defact.h +@@ -0,0 +1,20 @@ ++#ifndef __LINUX_TC_DEF_H ++#define __LINUX_TC_DEF_H ++ ++#include ++ ++struct tc_defact { ++ tc_gen; ++}; ++ ++enum { ++ TCA_DEF_UNSPEC, ++ TCA_DEF_TM, ++ TCA_DEF_PARMS, ++ TCA_DEF_DATA, ++ TCA_DEF_PAD, ++ __TCA_DEF_MAX ++}; ++#define TCA_DEF_MAX (__TCA_DEF_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_gact.h b/include/uapi/linux/tc_act/tc_gact.h +new file mode 100644 +index 0000000..70b536a +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_gact.h +@@ -0,0 +1,33 @@ ++#ifndef __LINUX_TC_GACT_H ++#define __LINUX_TC_GACT_H ++ ++#include ++#include ++ ++#define TCA_ACT_GACT 5 ++struct tc_gact { ++ tc_gen; ++ ++}; ++ ++struct tc_gact_p { ++#define PGACT_NONE 0 ++#define PGACT_NETRAND 1 ++#define PGACT_DETERM 2 ++#define MAX_RAND (PGACT_DETERM + 1 ) ++ __u16 ptype; ++ __u16 pval; ++ int paction; ++}; ++ ++enum { ++ TCA_GACT_UNSPEC, ++ TCA_GACT_TM, ++ TCA_GACT_PARMS, ++ TCA_GACT_PROB, ++ TCA_GACT_PAD, ++ __TCA_GACT_MAX ++}; ++#define TCA_GACT_MAX (__TCA_GACT_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_ife.h b/include/uapi/linux/tc_act/tc_ife.h +new file mode 100644 +index 0000000..7c28178 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_ife.h +@@ -0,0 +1,32 @@ ++#ifndef __UAPI_TC_IFE_H ++#define __UAPI_TC_IFE_H ++ ++#include ++#include ++#include ++ ++#define TCA_ACT_IFE 25 ++/* Flag bits for now just encoding/decoding; mutually exclusive */ ++#define IFE_ENCODE 1 ++#define IFE_DECODE 0 ++ ++struct tc_ife { ++ tc_gen; ++ __u16 flags; ++}; ++ ++/*XXX: We need to encode the total number of bytes consumed */ ++enum { ++ TCA_IFE_UNSPEC, ++ TCA_IFE_PARMS, ++ TCA_IFE_TM, ++ TCA_IFE_DMAC, ++ TCA_IFE_SMAC, ++ TCA_IFE_TYPE, ++ TCA_IFE_METALST, ++ TCA_IFE_PAD, ++ __TCA_IFE_MAX ++}; ++#define TCA_IFE_MAX (__TCA_IFE_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_ipt.h b/include/uapi/linux/tc_act/tc_ipt.h +new file mode 100644 +index 0000000..7c6e155 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_ipt.h +@@ -0,0 +1,22 @@ ++#ifndef __LINUX_TC_IPT_H ++#define __LINUX_TC_IPT_H ++ ++#include ++ ++#define TCA_ACT_IPT 6 ++#define TCA_ACT_XT 10 ++ ++enum { ++ TCA_IPT_UNSPEC, ++ TCA_IPT_TABLE, ++ TCA_IPT_HOOK, ++ TCA_IPT_INDEX, ++ TCA_IPT_CNT, ++ TCA_IPT_TM, ++ TCA_IPT_TARG, ++ TCA_IPT_PAD, ++ __TCA_IPT_MAX ++}; ++#define TCA_IPT_MAX (__TCA_IPT_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_mirred.h b/include/uapi/linux/tc_act/tc_mirred.h +new file mode 100644 +index 0000000..3d7a2b3 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_mirred.h +@@ -0,0 +1,28 @@ ++#ifndef __LINUX_TC_MIR_H ++#define __LINUX_TC_MIR_H ++ ++#include ++#include ++ ++#define TCA_ACT_MIRRED 8 ++#define TCA_EGRESS_REDIR 1 /* packet redirect to EGRESS*/ ++#define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */ ++#define TCA_INGRESS_REDIR 3 /* packet redirect to INGRESS*/ ++#define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */ ++ ++struct tc_mirred { ++ tc_gen; ++ int eaction; /* one of IN/EGRESS_MIRROR/REDIR */ ++ __u32 ifindex; /* ifindex of egress port */ ++}; ++ ++enum { ++ TCA_MIRRED_UNSPEC, ++ TCA_MIRRED_TM, ++ TCA_MIRRED_PARMS, ++ TCA_MIRRED_PAD, ++ __TCA_MIRRED_MAX ++}; ++#define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_nat.h b/include/uapi/linux/tc_act/tc_nat.h +new file mode 100644 +index 0000000..923457c +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_nat.h +@@ -0,0 +1,28 @@ ++#ifndef __LINUX_TC_NAT_H ++#define __LINUX_TC_NAT_H ++ ++#include ++#include ++ ++#define TCA_ACT_NAT 9 ++ ++enum { ++ TCA_NAT_UNSPEC, ++ TCA_NAT_PARMS, ++ TCA_NAT_TM, ++ TCA_NAT_PAD, ++ __TCA_NAT_MAX ++}; ++#define TCA_NAT_MAX (__TCA_NAT_MAX - 1) ++ ++#define TCA_NAT_FLAG_EGRESS 1 ++ ++struct tc_nat { ++ tc_gen; ++ __be32 old_addr; ++ __be32 new_addr; ++ __be32 mask; ++ __u32 flags; ++}; ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_pedit.h b/include/uapi/linux/tc_act/tc_pedit.h +new file mode 100644 +index 0000000..143d2b3 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_pedit.h +@@ -0,0 +1,66 @@ ++#ifndef __LINUX_TC_PED_H ++#define __LINUX_TC_PED_H ++ ++#include ++#include ++ ++#define TCA_ACT_PEDIT 7 ++ ++enum { ++ TCA_PEDIT_UNSPEC, ++ TCA_PEDIT_TM, ++ TCA_PEDIT_PARMS, ++ TCA_PEDIT_PAD, ++ TCA_PEDIT_PARMS_EX, ++ TCA_PEDIT_KEYS_EX, ++ TCA_PEDIT_KEY_EX, ++ __TCA_PEDIT_MAX ++}; ++#define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1) ++ ++enum { ++ TCA_PEDIT_KEY_EX_HTYPE = 1, ++ TCA_PEDIT_KEY_EX_CMD = 2, ++ __TCA_PEDIT_KEY_EX_MAX ++}; ++#define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1) ++ ++ /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It ++ * means no specific header type - offset is relative to the network layer ++ */ ++enum pedit_header_type { ++ TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, ++ TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, ++ TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, ++ TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, ++ TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, ++ TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, ++ __PEDIT_HDR_TYPE_MAX, ++}; ++#define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1) ++ ++enum pedit_cmd { ++ TCA_PEDIT_KEY_EX_CMD_SET = 0, ++ TCA_PEDIT_KEY_EX_CMD_ADD = 1, ++ __PEDIT_CMD_MAX, ++}; ++#define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1) ++ ++struct tc_pedit_key { ++ __u32 mask; /* AND */ ++ __u32 val; /*XOR */ ++ __u32 off; /*offset */ ++ __u32 at; ++ __u32 offmask; ++ __u32 shift; ++}; ++ ++struct tc_pedit_sel { ++ tc_gen; ++ unsigned char nkeys; ++ unsigned char flags; ++ struct tc_pedit_key keys[0]; ++}; ++#define tc_pedit tc_pedit_sel ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_sample.h b/include/uapi/linux/tc_act/tc_sample.h +new file mode 100644 +index 0000000..edc9058 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_sample.h +@@ -0,0 +1,26 @@ ++#ifndef __LINUX_TC_SAMPLE_H ++#define __LINUX_TC_SAMPLE_H ++ ++#include ++#include ++#include ++ ++#define TCA_ACT_SAMPLE 26 ++ ++struct tc_sample { ++ tc_gen; ++}; ++ ++enum { ++ TCA_SAMPLE_UNSPEC, ++ TCA_SAMPLE_TM, ++ TCA_SAMPLE_PARMS, ++ TCA_SAMPLE_RATE, ++ TCA_SAMPLE_TRUNC_SIZE, ++ TCA_SAMPLE_PSAMPLE_GROUP, ++ TCA_SAMPLE_PAD, ++ __TCA_SAMPLE_MAX ++}; ++#define TCA_SAMPLE_MAX (__TCA_SAMPLE_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_skbedit.h b/include/uapi/linux/tc_act/tc_skbedit.h +new file mode 100644 +index 0000000..2884425 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_skbedit.h +@@ -0,0 +1,51 @@ ++/* ++ * Copyright (c) 2008, Intel Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple ++ * Place - Suite 330, Boston, MA 02111-1307 USA. ++ * ++ * Author: Alexander Duyck ++ */ ++ ++#ifndef __LINUX_TC_SKBEDIT_H ++#define __LINUX_TC_SKBEDIT_H ++ ++#include ++ ++#define TCA_ACT_SKBEDIT 11 ++ ++#define SKBEDIT_F_PRIORITY 0x1 ++#define SKBEDIT_F_QUEUE_MAPPING 0x2 ++#define SKBEDIT_F_MARK 0x4 ++#define SKBEDIT_F_PTYPE 0x8 ++#define SKBEDIT_F_MASK 0x10 ++ ++struct tc_skbedit { ++ tc_gen; ++}; ++ ++enum { ++ TCA_SKBEDIT_UNSPEC, ++ TCA_SKBEDIT_TM, ++ TCA_SKBEDIT_PARMS, ++ TCA_SKBEDIT_PRIORITY, ++ TCA_SKBEDIT_QUEUE_MAPPING, ++ TCA_SKBEDIT_MARK, ++ TCA_SKBEDIT_PAD, ++ TCA_SKBEDIT_PTYPE, ++ TCA_SKBEDIT_MASK, ++ __TCA_SKBEDIT_MAX ++}; ++#define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_skbmod.h b/include/uapi/linux/tc_act/tc_skbmod.h +new file mode 100644 +index 0000000..10fc07d +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_skbmod.h +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2016, Jamal Hadi Salim ++ * ++ * This program is free software; you can redistribute 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. ++*/ ++ ++#ifndef __LINUX_TC_SKBMOD_H ++#define __LINUX_TC_SKBMOD_H ++ ++#include ++ ++#define TCA_ACT_SKBMOD 15 ++ ++#define SKBMOD_F_DMAC 0x1 ++#define SKBMOD_F_SMAC 0x2 ++#define SKBMOD_F_ETYPE 0x4 ++#define SKBMOD_F_SWAPMAC 0x8 ++ ++struct tc_skbmod { ++ tc_gen; ++ __u64 flags; ++}; ++ ++enum { ++ TCA_SKBMOD_UNSPEC, ++ TCA_SKBMOD_TM, ++ TCA_SKBMOD_PARMS, ++ TCA_SKBMOD_DMAC, ++ TCA_SKBMOD_SMAC, ++ TCA_SKBMOD_ETYPE, ++ TCA_SKBMOD_PAD, ++ __TCA_SKBMOD_MAX ++}; ++#define TCA_SKBMOD_MAX (__TCA_SKBMOD_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_tunnel_key.h b/include/uapi/linux/tc_act/tc_tunnel_key.h +new file mode 100644 +index 0000000..afcd4be +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_tunnel_key.h +@@ -0,0 +1,43 @@ ++/* ++ * Copyright (c) 2016, Amir Vadai ++ * Copyright (c) 2016, Mellanox Technologies. All rights reserved. ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef __LINUX_TC_TUNNEL_KEY_H ++#define __LINUX_TC_TUNNEL_KEY_H ++ ++#include ++ ++#define TCA_ACT_TUNNEL_KEY 17 ++ ++#define TCA_TUNNEL_KEY_ACT_SET 1 ++#define TCA_TUNNEL_KEY_ACT_RELEASE 2 ++ ++struct tc_tunnel_key { ++ tc_gen; ++ int t_action; ++}; ++ ++enum { ++ TCA_TUNNEL_KEY_UNSPEC, ++ TCA_TUNNEL_KEY_TM, ++ TCA_TUNNEL_KEY_PARMS, ++ TCA_TUNNEL_KEY_ENC_IPV4_SRC, /* be32 */ ++ TCA_TUNNEL_KEY_ENC_IPV4_DST, /* be32 */ ++ TCA_TUNNEL_KEY_ENC_IPV6_SRC, /* struct in6_addr */ ++ TCA_TUNNEL_KEY_ENC_IPV6_DST, /* struct in6_addr */ ++ TCA_TUNNEL_KEY_ENC_KEY_ID, /* be64 */ ++ TCA_TUNNEL_KEY_PAD, ++ TCA_TUNNEL_KEY_ENC_DST_PORT, /* be16 */ ++ TCA_TUNNEL_KEY_NO_CSUM, /* u8 */ ++ __TCA_TUNNEL_KEY_MAX, ++}; ++ ++#define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_act/tc_vlan.h b/include/uapi/linux/tc_act/tc_vlan.h +new file mode 100644 +index 0000000..bddb272 +--- /dev/null ++++ b/include/uapi/linux/tc_act/tc_vlan.h +@@ -0,0 +1,38 @@ ++/* ++ * Copyright (c) 2014 Jiri Pirko ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++ ++#ifndef __LINUX_TC_VLAN_H ++#define __LINUX_TC_VLAN_H ++ ++#include ++ ++#define TCA_ACT_VLAN 12 ++ ++#define TCA_VLAN_ACT_POP 1 ++#define TCA_VLAN_ACT_PUSH 2 ++#define TCA_VLAN_ACT_MODIFY 3 ++ ++struct tc_vlan { ++ tc_gen; ++ int v_action; ++}; ++ ++enum { ++ TCA_VLAN_UNSPEC, ++ TCA_VLAN_TM, ++ TCA_VLAN_PARMS, ++ TCA_VLAN_PUSH_VLAN_ID, ++ TCA_VLAN_PUSH_VLAN_PROTOCOL, ++ TCA_VLAN_PAD, ++ TCA_VLAN_PUSH_VLAN_PRIORITY, ++ __TCA_VLAN_MAX, ++}; ++#define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_ematch/tc_em_cmp.h b/include/uapi/linux/tc_ematch/tc_em_cmp.h +new file mode 100644 +index 0000000..f34bb1b +--- /dev/null ++++ b/include/uapi/linux/tc_ematch/tc_em_cmp.h +@@ -0,0 +1,25 @@ ++#ifndef __LINUX_TC_EM_CMP_H ++#define __LINUX_TC_EM_CMP_H ++ ++#include ++#include ++ ++struct tcf_em_cmp { ++ __u32 val; ++ __u32 mask; ++ __u16 off; ++ __u8 align:4; ++ __u8 flags:4; ++ __u8 layer:4; ++ __u8 opnd:4; ++}; ++ ++enum { ++ TCF_EM_ALIGN_U8 = 1, ++ TCF_EM_ALIGN_U16 = 2, ++ TCF_EM_ALIGN_U32 = 4 ++}; ++ ++#define TCF_EM_CMP_TRANS 1 ++ ++#endif +diff --git a/include/uapi/linux/tc_ematch/tc_em_meta.h b/include/uapi/linux/tc_ematch/tc_em_meta.h +new file mode 100644 +index 0000000..b11f8ce +--- /dev/null ++++ b/include/uapi/linux/tc_ematch/tc_em_meta.h +@@ -0,0 +1,92 @@ ++#ifndef __LINUX_TC_EM_META_H ++#define __LINUX_TC_EM_META_H ++ ++#include ++#include ++ ++enum { ++ TCA_EM_META_UNSPEC, ++ TCA_EM_META_HDR, ++ TCA_EM_META_LVALUE, ++ TCA_EM_META_RVALUE, ++ __TCA_EM_META_MAX ++}; ++#define TCA_EM_META_MAX (__TCA_EM_META_MAX - 1) ++ ++struct tcf_meta_val { ++ __u16 kind; ++ __u8 shift; ++ __u8 op; ++}; ++ ++#define TCF_META_TYPE_MASK (0xf << 12) ++#define TCF_META_TYPE(kind) (((kind) & TCF_META_TYPE_MASK) >> 12) ++#define TCF_META_ID_MASK 0x7ff ++#define TCF_META_ID(kind) ((kind) & TCF_META_ID_MASK) ++ ++enum { ++ TCF_META_TYPE_VAR, ++ TCF_META_TYPE_INT, ++ __TCF_META_TYPE_MAX ++}; ++#define TCF_META_TYPE_MAX (__TCF_META_TYPE_MAX - 1) ++ ++enum { ++ TCF_META_ID_VALUE, ++ TCF_META_ID_RANDOM, ++ TCF_META_ID_LOADAVG_0, ++ TCF_META_ID_LOADAVG_1, ++ TCF_META_ID_LOADAVG_2, ++ TCF_META_ID_DEV, ++ TCF_META_ID_PRIORITY, ++ TCF_META_ID_PROTOCOL, ++ TCF_META_ID_PKTTYPE, ++ TCF_META_ID_PKTLEN, ++ TCF_META_ID_DATALEN, ++ TCF_META_ID_MACLEN, ++ TCF_META_ID_NFMARK, ++ TCF_META_ID_TCINDEX, ++ TCF_META_ID_RTCLASSID, ++ TCF_META_ID_RTIIF, ++ TCF_META_ID_SK_FAMILY, ++ TCF_META_ID_SK_STATE, ++ TCF_META_ID_SK_REUSE, ++ TCF_META_ID_SK_BOUND_IF, ++ TCF_META_ID_SK_REFCNT, ++ TCF_META_ID_SK_SHUTDOWN, ++ TCF_META_ID_SK_PROTO, ++ TCF_META_ID_SK_TYPE, ++ TCF_META_ID_SK_RCVBUF, ++ TCF_META_ID_SK_RMEM_ALLOC, ++ TCF_META_ID_SK_WMEM_ALLOC, ++ TCF_META_ID_SK_OMEM_ALLOC, ++ TCF_META_ID_SK_WMEM_QUEUED, ++ TCF_META_ID_SK_RCV_QLEN, ++ TCF_META_ID_SK_SND_QLEN, ++ TCF_META_ID_SK_ERR_QLEN, ++ TCF_META_ID_SK_FORWARD_ALLOCS, ++ TCF_META_ID_SK_SNDBUF, ++ TCF_META_ID_SK_ALLOCS, ++ __TCF_META_ID_SK_ROUTE_CAPS, /* unimplemented but in ABI already */ ++ TCF_META_ID_SK_HASH, ++ TCF_META_ID_SK_LINGERTIME, ++ TCF_META_ID_SK_ACK_BACKLOG, ++ TCF_META_ID_SK_MAX_ACK_BACKLOG, ++ TCF_META_ID_SK_PRIO, ++ TCF_META_ID_SK_RCVLOWAT, ++ TCF_META_ID_SK_RCVTIMEO, ++ TCF_META_ID_SK_SNDTIMEO, ++ TCF_META_ID_SK_SENDMSG_OFF, ++ TCF_META_ID_SK_WRITE_PENDING, ++ TCF_META_ID_VLAN_TAG, ++ TCF_META_ID_RXHASH, ++ __TCF_META_ID_MAX ++}; ++#define TCF_META_ID_MAX (__TCF_META_ID_MAX - 1) ++ ++struct tcf_meta_hdr { ++ struct tcf_meta_val left; ++ struct tcf_meta_val right; ++}; ++ ++#endif +diff --git a/include/uapi/linux/tc_ematch/tc_em_nbyte.h b/include/uapi/linux/tc_ematch/tc_em_nbyte.h +new file mode 100644 +index 0000000..7172cfb +--- /dev/null ++++ b/include/uapi/linux/tc_ematch/tc_em_nbyte.h +@@ -0,0 +1,13 @@ ++#ifndef __LINUX_TC_EM_NBYTE_H ++#define __LINUX_TC_EM_NBYTE_H ++ ++#include ++#include ++ ++struct tcf_em_nbyte { ++ __u16 off; ++ __u16 len:12; ++ __u8 layer:4; ++}; ++ ++#endif +diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h +new file mode 100644 +index 0000000..8edad3f +--- /dev/null ++++ b/include/uapi/linux/tcp.h +@@ -0,0 +1,268 @@ ++/* ++ * INET An implementation of the TCP/IP protocol suite for the LINUX ++ * operating system. INET is implemented using the BSD Socket ++ * interface as the means of communication with the user level. ++ * ++ * Definitions for the TCP protocol. ++ * ++ * Version: @(#)tcp.h 1.0.2 04/28/93 ++ * ++ * Author: Fred N. van Kempen, ++ * ++ * This program is free software; you can redistribute 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. ++ */ ++#ifndef _LINUX_TCP_H ++#define _LINUX_TCP_H ++ ++#include ++#include ++#include ++ ++struct tcphdr { ++ __be16 source; ++ __be16 dest; ++ __be32 seq; ++ __be32 ack_seq; ++#if defined(__LITTLE_ENDIAN_BITFIELD) ++ __u16 res1:4, ++ doff:4, ++ fin:1, ++ syn:1, ++ rst:1, ++ psh:1, ++ ack:1, ++ urg:1, ++ ece:1, ++ cwr:1; ++#elif defined(__BIG_ENDIAN_BITFIELD) ++ __u16 doff:4, ++ res1:4, ++ cwr:1, ++ ece:1, ++ urg:1, ++ ack:1, ++ psh:1, ++ rst:1, ++ syn:1, ++ fin:1; ++#else ++#error "Adjust your defines" ++#endif ++ __be16 window; ++ __sum16 check; ++ __be16 urg_ptr; ++}; ++ ++/* ++ * The union cast uses a gcc extension to avoid aliasing problems ++ * (union is compatible to any of its members) ++ * This means this part of the code is -fstrict-aliasing safe now. ++ */ ++union tcp_word_hdr { ++ struct tcphdr hdr; ++ __be32 words[5]; ++}; ++ ++#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) ++ ++enum { ++ TCP_FLAG_CWR = __constant_cpu_to_be32(0x00800000), ++ TCP_FLAG_ECE = __constant_cpu_to_be32(0x00400000), ++ TCP_FLAG_URG = __constant_cpu_to_be32(0x00200000), ++ TCP_FLAG_ACK = __constant_cpu_to_be32(0x00100000), ++ TCP_FLAG_PSH = __constant_cpu_to_be32(0x00080000), ++ TCP_FLAG_RST = __constant_cpu_to_be32(0x00040000), ++ TCP_FLAG_SYN = __constant_cpu_to_be32(0x00020000), ++ TCP_FLAG_FIN = __constant_cpu_to_be32(0x00010000), ++ TCP_RESERVED_BITS = __constant_cpu_to_be32(0x0F000000), ++ TCP_DATA_OFFSET = __constant_cpu_to_be32(0xF0000000) ++}; ++ ++/* ++ * TCP general constants ++ */ ++#define TCP_MSS_DEFAULT 536U /* IPv4 (RFC1122, RFC2581) */ ++#define TCP_MSS_DESIRED 1220U /* IPv6 (tunneled), EDNS0 (RFC3226) */ ++ ++/* TCP socket options */ ++#define TCP_NODELAY 1 /* Turn off Nagle's algorithm. */ ++#define TCP_MAXSEG 2 /* Limit MSS */ ++#define TCP_CORK 3 /* Never send partially complete segments */ ++#define TCP_KEEPIDLE 4 /* Start keeplives after this period */ ++#define TCP_KEEPINTVL 5 /* Interval between keepalives */ ++#define TCP_KEEPCNT 6 /* Number of keepalives before death */ ++#define TCP_SYNCNT 7 /* Number of SYN retransmits */ ++#define TCP_LINGER2 8 /* Life time of orphaned FIN-WAIT-2 state */ ++#define TCP_DEFER_ACCEPT 9 /* Wake up listener only when data arrive */ ++#define TCP_WINDOW_CLAMP 10 /* Bound advertised window */ ++#define TCP_INFO 11 /* Information about this connection. */ ++#define TCP_QUICKACK 12 /* Block/reenable quick acks */ ++#define TCP_CONGESTION 13 /* Congestion control algorithm */ ++#define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ ++#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ ++#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ ++#define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ ++#define TCP_REPAIR 19 /* TCP sock is under repair right now */ ++#define TCP_REPAIR_QUEUE 20 ++#define TCP_QUEUE_SEQ 21 ++#define TCP_REPAIR_OPTIONS 22 ++#define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */ ++#define TCP_TIMESTAMP 24 ++#define TCP_NOTSENT_LOWAT 25 /* limit number of unsent bytes in write queue */ ++#define TCP_CC_INFO 26 /* Get Congestion Control (optional) info */ ++#define TCP_SAVE_SYN 27 /* Record SYN headers for new connections */ ++#define TCP_SAVED_SYN 28 /* Get SYN headers recorded for connection */ ++#define TCP_REPAIR_WINDOW 29 /* Get/set window parameters */ ++#define TCP_FASTOPEN_CONNECT 30 /* Attempt FastOpen with connect */ ++#define TCP_ULP 31 /* Attach a ULP to a TCP connection */ ++#define TCP_MD5SIG_EXT 32 /* TCP MD5 Signature with extensions */ ++ ++struct tcp_repair_opt { ++ __u32 opt_code; ++ __u32 opt_val; ++}; ++ ++struct tcp_repair_window { ++ __u32 snd_wl1; ++ __u32 snd_wnd; ++ __u32 max_window; ++ ++ __u32 rcv_wnd; ++ __u32 rcv_wup; ++}; ++ ++enum { ++ TCP_NO_QUEUE, ++ TCP_RECV_QUEUE, ++ TCP_SEND_QUEUE, ++ TCP_QUEUES_NR, ++}; ++ ++/* for TCP_INFO socket option */ ++#define TCPI_OPT_TIMESTAMPS 1 ++#define TCPI_OPT_SACK 2 ++#define TCPI_OPT_WSCALE 4 ++#define TCPI_OPT_ECN 8 /* ECN was negociated at TCP session init */ ++#define TCPI_OPT_ECN_SEEN 16 /* we received at least one packet with ECT */ ++#define TCPI_OPT_SYN_DATA 32 /* SYN-ACK acked data in SYN sent or rcvd */ ++ ++enum tcp_ca_state { ++ TCP_CA_Open = 0, ++#define TCPF_CA_Open (1< ++ ++/* NETLINK_GENERIC related info ++ */ ++#define TCP_METRICS_GENL_NAME "tcp_metrics" ++#define TCP_METRICS_GENL_VERSION 0x1 ++ ++enum tcp_metric_index { ++ TCP_METRIC_RTT, /* in ms units */ ++ TCP_METRIC_RTTVAR, /* in ms units */ ++ TCP_METRIC_SSTHRESH, ++ TCP_METRIC_CWND, ++ TCP_METRIC_REORDERING, ++ ++ TCP_METRIC_RTT_US, /* in usec units */ ++ TCP_METRIC_RTTVAR_US, /* in usec units */ ++ ++ /* Always last. */ ++ __TCP_METRIC_MAX, ++}; ++ ++#define TCP_METRIC_MAX (__TCP_METRIC_MAX - 1) ++ ++enum { ++ TCP_METRICS_ATTR_UNSPEC, ++ TCP_METRICS_ATTR_ADDR_IPV4, /* u32 */ ++ TCP_METRICS_ATTR_ADDR_IPV6, /* binary */ ++ TCP_METRICS_ATTR_AGE, /* msecs */ ++ TCP_METRICS_ATTR_TW_TSVAL, /* u32, raw, rcv tsval */ ++ TCP_METRICS_ATTR_TW_TS_STAMP, /* s32, sec age */ ++ TCP_METRICS_ATTR_VALS, /* nested +1, u32 */ ++ TCP_METRICS_ATTR_FOPEN_MSS, /* u16 */ ++ TCP_METRICS_ATTR_FOPEN_SYN_DROPS, /* u16, count of drops */ ++ TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS, /* msecs age */ ++ TCP_METRICS_ATTR_FOPEN_COOKIE, /* binary */ ++ TCP_METRICS_ATTR_SADDR_IPV4, /* u32 */ ++ TCP_METRICS_ATTR_SADDR_IPV6, /* binary */ ++ TCP_METRICS_ATTR_PAD, ++ ++ __TCP_METRICS_ATTR_MAX, ++}; ++ ++#define TCP_METRICS_ATTR_MAX (__TCP_METRICS_ATTR_MAX - 1) ++ ++enum { ++ TCP_METRICS_CMD_UNSPEC, ++ TCP_METRICS_CMD_GET, ++ TCP_METRICS_CMD_DEL, ++ ++ __TCP_METRICS_CMD_MAX, ++}; ++ ++#define TCP_METRICS_CMD_MAX (__TCP_METRICS_CMD_MAX - 1) ++ ++#endif /* _LINUX_TCP_METRICS_H */ +diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h +new file mode 100644 +index 0000000..924fb5c +--- /dev/null ++++ b/include/uapi/linux/tipc.h +@@ -0,0 +1,256 @@ ++/* ++ * include/uapi/linux/tipc.h: Header for TIPC socket interface ++ * ++ * Copyright (c) 2003-2006, 2015-2016 Ericsson AB ++ * Copyright (c) 2005, 2010-2011, Wind River Systems ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the names of the copyright holders nor the names of its ++ * contributors may be used to endorse or promote products derived from ++ * this software without specific prior written permission. ++ * ++ * Alternatively, this software may be distributed under the terms of the ++ * GNU General Public License ("GPL") version 2 as published by the Free ++ * Software Foundation. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ++ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ++ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ++ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ++ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ++ * POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#ifndef _LINUX_TIPC_H_ ++#define _LINUX_TIPC_H_ ++ ++#include ++#include ++ ++/* ++ * TIPC addressing primitives ++ */ ++ ++struct tipc_portid { ++ __u32 ref; ++ __u32 node; ++}; ++ ++struct tipc_name { ++ __u32 type; ++ __u32 instance; ++}; ++ ++struct tipc_name_seq { ++ __u32 type; ++ __u32 lower; ++ __u32 upper; ++}; ++ ++/* TIPC Address Size, Offset, Mask specification for Z.C.N ++ */ ++#define TIPC_NODE_BITS 12 ++#define TIPC_CLUSTER_BITS 12 ++#define TIPC_ZONE_BITS 8 ++ ++#define TIPC_NODE_OFFSET 0 ++#define TIPC_CLUSTER_OFFSET TIPC_NODE_BITS ++#define TIPC_ZONE_OFFSET (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS) ++ ++#define TIPC_NODE_SIZE ((1UL << TIPC_NODE_BITS) - 1) ++#define TIPC_CLUSTER_SIZE ((1UL << TIPC_CLUSTER_BITS) - 1) ++#define TIPC_ZONE_SIZE ((1UL << TIPC_ZONE_BITS) - 1) ++ ++#define TIPC_NODE_MASK (TIPC_NODE_SIZE << TIPC_NODE_OFFSET) ++#define TIPC_CLUSTER_MASK (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET) ++#define TIPC_ZONE_MASK (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET) ++ ++#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK) ++ ++static __inline__ __u32 tipc_addr(unsigned int zone, ++ unsigned int cluster, ++ unsigned int node) ++{ ++ return (zone << TIPC_ZONE_OFFSET) | ++ (cluster << TIPC_CLUSTER_OFFSET) | ++ node; ++} ++ ++static __inline__ unsigned int tipc_zone(__u32 addr) ++{ ++ return addr >> TIPC_ZONE_OFFSET; ++} ++ ++static __inline__ unsigned int tipc_cluster(__u32 addr) ++{ ++ return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET; ++} ++ ++static __inline__ unsigned int tipc_node(__u32 addr) ++{ ++ return addr & TIPC_NODE_MASK; ++} ++ ++/* ++ * Application-accessible port name types ++ */ ++ ++#define TIPC_CFG_SRV 0 /* configuration service name type */ ++#define TIPC_TOP_SRV 1 /* topology service name type */ ++#define TIPC_LINK_STATE 2 /* link state name type */ ++#define TIPC_RESERVED_TYPES 64 /* lowest user-publishable name type */ ++ ++/* ++ * Publication scopes when binding port names and port name sequences ++ */ ++ ++#define TIPC_ZONE_SCOPE 1 ++#define TIPC_CLUSTER_SCOPE 2 ++#define TIPC_NODE_SCOPE 3 ++ ++/* ++ * Limiting values for messages ++ */ ++ ++#define TIPC_MAX_USER_MSG_SIZE 66000U ++ ++/* ++ * Message importance levels ++ */ ++ ++#define TIPC_LOW_IMPORTANCE 0 ++#define TIPC_MEDIUM_IMPORTANCE 1 ++#define TIPC_HIGH_IMPORTANCE 2 ++#define TIPC_CRITICAL_IMPORTANCE 3 ++ ++/* ++ * Msg rejection/connection shutdown reasons ++ */ ++ ++#define TIPC_OK 0 ++#define TIPC_ERR_NO_NAME 1 ++#define TIPC_ERR_NO_PORT 2 ++#define TIPC_ERR_NO_NODE 3 ++#define TIPC_ERR_OVERLOAD 4 ++#define TIPC_CONN_SHUTDOWN 5 ++ ++/* ++ * TIPC topology subscription service definitions ++ */ ++ ++#define TIPC_SUB_PORTS 0x01 /* filter for port availability */ ++#define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ ++#define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ ++ ++#define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */ ++ ++struct tipc_subscr { ++ struct tipc_name_seq seq; /* name sequence of interest */ ++ __u32 timeout; /* subscription duration (in ms) */ ++ __u32 filter; /* bitmask of filter options */ ++ char usr_handle[8]; /* available for subscriber use */ ++}; ++ ++#define TIPC_PUBLISHED 1 /* publication event */ ++#define TIPC_WITHDRAWN 2 /* withdraw event */ ++#define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ ++ ++struct tipc_event { ++ __u32 event; /* event type */ ++ __u32 found_lower; /* matching name seq instances */ ++ __u32 found_upper; /* " " " " */ ++ struct tipc_portid port; /* associated port */ ++ struct tipc_subscr s; /* associated subscription */ ++}; ++ ++/* ++ * Socket API ++ */ ++ ++#ifndef AF_TIPC ++#define AF_TIPC 30 ++#endif ++ ++#ifndef PF_TIPC ++#define PF_TIPC AF_TIPC ++#endif ++ ++#ifndef SOL_TIPC ++#define SOL_TIPC 271 ++#endif ++ ++#define TIPC_ADDR_NAMESEQ 1 ++#define TIPC_ADDR_MCAST 1 ++#define TIPC_ADDR_NAME 2 ++#define TIPC_ADDR_ID 3 ++ ++struct sockaddr_tipc { ++ unsigned short family; ++ unsigned char addrtype; ++ signed char scope; ++ union { ++ struct tipc_portid id; ++ struct tipc_name_seq nameseq; ++ struct { ++ struct tipc_name name; ++ __u32 domain; ++ } name; ++ } addr; ++}; ++ ++/* ++ * Ancillary data objects supported by recvmsg() ++ */ ++ ++#define TIPC_ERRINFO 1 /* error info */ ++#define TIPC_RETDATA 2 /* returned data */ ++#define TIPC_DESTNAME 3 /* destination name */ ++ ++/* ++ * TIPC-specific socket option names ++ */ ++ ++#define TIPC_IMPORTANCE 127 /* Default: TIPC_LOW_IMPORTANCE */ ++#define TIPC_SRC_DROPPABLE 128 /* Default: based on socket type */ ++#define TIPC_DEST_DROPPABLE 129 /* Default: based on socket type */ ++#define TIPC_CONN_TIMEOUT 130 /* Default: 8000 (ms) */ ++#define TIPC_NODE_RECVQ_DEPTH 131 /* Default: none (read only) */ ++#define TIPC_SOCK_RECVQ_DEPTH 132 /* Default: none (read only) */ ++#define TIPC_MCAST_BROADCAST 133 /* Default: TIPC selects. No arg */ ++#define TIPC_MCAST_REPLICAST 134 /* Default: TIPC selects. No arg */ ++ ++/* ++ * Maximum sizes of TIPC bearer-related names (including terminating NULL) ++ * The string formatting for each name element is: ++ * media: media ++ * interface: media:interface name ++ * link: Z.C.N:interface-Z.C.N:interface ++ * ++ */ ++ ++#define TIPC_MAX_MEDIA_NAME 16 ++#define TIPC_MAX_IF_NAME 16 ++#define TIPC_MAX_BEARER_NAME 32 ++#define TIPC_MAX_LINK_NAME 60 ++ ++#define SIOCGETLINKNAME SIOCPROTOPRIVATE ++ ++struct tipc_sioc_ln_req { ++ __u32 peer; ++ __u32 bearer_id; ++ char linkname[TIPC_MAX_LINK_NAME]; ++}; ++#endif +diff --git a/include/uapi/linux/tipc_netlink.h b/include/uapi/linux/tipc_netlink.h +new file mode 100644 +index 0000000..f9edd20 +--- /dev/null ++++ b/include/uapi/linux/tipc_netlink.h +@@ -0,0 +1,294 @@ ++/* ++ * Copyright (c) 2014, Ericsson AB ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the names of the copyright holders nor the names of its ++ * contributors may be used to endorse or promote products derived from ++ * this software without specific prior written permission. ++ * ++ * Alternatively, this software may be distributed under the terms of the ++ * GNU General Public License ("GPL") version 2 as published by the Free ++ * Software Foundation. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ++ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ++ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ++ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ++ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ++ * POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#ifndef _LINUX_TIPC_NETLINK_H_ ++#define _LINUX_TIPC_NETLINK_H_ ++ ++#define TIPC_GENL_V2_NAME "TIPCv2" ++#define TIPC_GENL_V2_VERSION 0x1 ++ ++/* Netlink commands */ ++enum { ++ TIPC_NL_UNSPEC, ++ TIPC_NL_LEGACY, ++ TIPC_NL_BEARER_DISABLE, ++ TIPC_NL_BEARER_ENABLE, ++ TIPC_NL_BEARER_GET, ++ TIPC_NL_BEARER_SET, ++ TIPC_NL_SOCK_GET, ++ TIPC_NL_PUBL_GET, ++ TIPC_NL_LINK_GET, ++ TIPC_NL_LINK_SET, ++ TIPC_NL_LINK_RESET_STATS, ++ TIPC_NL_MEDIA_GET, ++ TIPC_NL_MEDIA_SET, ++ TIPC_NL_NODE_GET, ++ TIPC_NL_NET_GET, ++ TIPC_NL_NET_SET, ++ TIPC_NL_NAME_TABLE_GET, ++ TIPC_NL_MON_SET, ++ TIPC_NL_MON_GET, ++ TIPC_NL_MON_PEER_GET, ++ TIPC_NL_PEER_REMOVE, ++ TIPC_NL_BEARER_ADD, ++ TIPC_NL_UDP_GET_REMOTEIP, ++ ++ __TIPC_NL_CMD_MAX, ++ TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1 ++}; ++ ++/* Top level netlink attributes */ ++enum { ++ TIPC_NLA_UNSPEC, ++ TIPC_NLA_BEARER, /* nest */ ++ TIPC_NLA_SOCK, /* nest */ ++ TIPC_NLA_PUBL, /* nest */ ++ TIPC_NLA_LINK, /* nest */ ++ TIPC_NLA_MEDIA, /* nest */ ++ TIPC_NLA_NODE, /* nest */ ++ TIPC_NLA_NET, /* nest */ ++ TIPC_NLA_NAME_TABLE, /* nest */ ++ TIPC_NLA_MON, /* nest */ ++ TIPC_NLA_MON_PEER, /* nest */ ++ ++ __TIPC_NLA_MAX, ++ TIPC_NLA_MAX = __TIPC_NLA_MAX - 1 ++}; ++ ++/* Bearer info */ ++enum { ++ TIPC_NLA_BEARER_UNSPEC, ++ TIPC_NLA_BEARER_NAME, /* string */ ++ TIPC_NLA_BEARER_PROP, /* nest */ ++ TIPC_NLA_BEARER_DOMAIN, /* u32 */ ++ TIPC_NLA_BEARER_UDP_OPTS, /* nest */ ++ ++ __TIPC_NLA_BEARER_MAX, ++ TIPC_NLA_BEARER_MAX = __TIPC_NLA_BEARER_MAX - 1 ++}; ++ ++enum { ++ TIPC_NLA_UDP_UNSPEC, ++ TIPC_NLA_UDP_LOCAL, /* sockaddr_storage */ ++ TIPC_NLA_UDP_REMOTE, /* sockaddr_storage */ ++ TIPC_NLA_UDP_MULTI_REMOTEIP, /* flag */ ++ ++ __TIPC_NLA_UDP_MAX, ++ TIPC_NLA_UDP_MAX = __TIPC_NLA_UDP_MAX - 1 ++}; ++/* Socket info */ ++enum { ++ TIPC_NLA_SOCK_UNSPEC, ++ TIPC_NLA_SOCK_ADDR, /* u32 */ ++ TIPC_NLA_SOCK_REF, /* u32 */ ++ TIPC_NLA_SOCK_CON, /* nest */ ++ TIPC_NLA_SOCK_HAS_PUBL, /* flag */ ++ ++ __TIPC_NLA_SOCK_MAX, ++ TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1 ++}; ++ ++/* Link info */ ++enum { ++ TIPC_NLA_LINK_UNSPEC, ++ TIPC_NLA_LINK_NAME, /* string */ ++ TIPC_NLA_LINK_DEST, /* u32 */ ++ TIPC_NLA_LINK_MTU, /* u32 */ ++ TIPC_NLA_LINK_BROADCAST, /* flag */ ++ TIPC_NLA_LINK_UP, /* flag */ ++ TIPC_NLA_LINK_ACTIVE, /* flag */ ++ TIPC_NLA_LINK_PROP, /* nest */ ++ TIPC_NLA_LINK_STATS, /* nest */ ++ TIPC_NLA_LINK_RX, /* u32 */ ++ TIPC_NLA_LINK_TX, /* u32 */ ++ ++ __TIPC_NLA_LINK_MAX, ++ TIPC_NLA_LINK_MAX = __TIPC_NLA_LINK_MAX - 1 ++}; ++ ++/* Media info */ ++enum { ++ TIPC_NLA_MEDIA_UNSPEC, ++ TIPC_NLA_MEDIA_NAME, /* string */ ++ TIPC_NLA_MEDIA_PROP, /* nest */ ++ ++ __TIPC_NLA_MEDIA_MAX, ++ TIPC_NLA_MEDIA_MAX = __TIPC_NLA_MEDIA_MAX - 1 ++}; ++ ++/* Node info */ ++enum { ++ TIPC_NLA_NODE_UNSPEC, ++ TIPC_NLA_NODE_ADDR, /* u32 */ ++ TIPC_NLA_NODE_UP, /* flag */ ++ ++ __TIPC_NLA_NODE_MAX, ++ TIPC_NLA_NODE_MAX = __TIPC_NLA_NODE_MAX - 1 ++}; ++ ++/* Net info */ ++enum { ++ TIPC_NLA_NET_UNSPEC, ++ TIPC_NLA_NET_ID, /* u32 */ ++ TIPC_NLA_NET_ADDR, /* u32 */ ++ ++ __TIPC_NLA_NET_MAX, ++ TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1 ++}; ++ ++/* Name table info */ ++enum { ++ TIPC_NLA_NAME_TABLE_UNSPEC, ++ TIPC_NLA_NAME_TABLE_PUBL, /* nest */ ++ ++ __TIPC_NLA_NAME_TABLE_MAX, ++ TIPC_NLA_NAME_TABLE_MAX = __TIPC_NLA_NAME_TABLE_MAX - 1 ++}; ++ ++/* Monitor info */ ++enum { ++ TIPC_NLA_MON_UNSPEC, ++ TIPC_NLA_MON_ACTIVATION_THRESHOLD, /* u32 */ ++ TIPC_NLA_MON_REF, /* u32 */ ++ TIPC_NLA_MON_ACTIVE, /* flag */ ++ TIPC_NLA_MON_BEARER_NAME, /* string */ ++ TIPC_NLA_MON_PEERCNT, /* u32 */ ++ TIPC_NLA_MON_LISTGEN, /* u32 */ ++ ++ __TIPC_NLA_MON_MAX, ++ TIPC_NLA_MON_MAX = __TIPC_NLA_MON_MAX - 1 ++}; ++ ++/* Publication info */ ++enum { ++ TIPC_NLA_PUBL_UNSPEC, ++ ++ TIPC_NLA_PUBL_TYPE, /* u32 */ ++ TIPC_NLA_PUBL_LOWER, /* u32 */ ++ TIPC_NLA_PUBL_UPPER, /* u32 */ ++ TIPC_NLA_PUBL_SCOPE, /* u32 */ ++ TIPC_NLA_PUBL_NODE, /* u32 */ ++ TIPC_NLA_PUBL_REF, /* u32 */ ++ TIPC_NLA_PUBL_KEY, /* u32 */ ++ ++ __TIPC_NLA_PUBL_MAX, ++ TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1 ++}; ++ ++/* Monitor peer info */ ++enum { ++ TIPC_NLA_MON_PEER_UNSPEC, ++ ++ TIPC_NLA_MON_PEER_ADDR, /* u32 */ ++ TIPC_NLA_MON_PEER_DOMGEN, /* u32 */ ++ TIPC_NLA_MON_PEER_APPLIED, /* u32 */ ++ TIPC_NLA_MON_PEER_UPMAP, /* u64 */ ++ TIPC_NLA_MON_PEER_MEMBERS, /* tlv */ ++ TIPC_NLA_MON_PEER_UP, /* flag */ ++ TIPC_NLA_MON_PEER_HEAD, /* flag */ ++ TIPC_NLA_MON_PEER_LOCAL, /* flag */ ++ TIPC_NLA_MON_PEER_PAD, /* flag */ ++ ++ __TIPC_NLA_MON_PEER_MAX, ++ TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1 ++}; ++ ++/* Nest, connection info */ ++enum { ++ TIPC_NLA_CON_UNSPEC, ++ ++ TIPC_NLA_CON_FLAG, /* flag */ ++ TIPC_NLA_CON_NODE, /* u32 */ ++ TIPC_NLA_CON_SOCK, /* u32 */ ++ TIPC_NLA_CON_TYPE, /* u32 */ ++ TIPC_NLA_CON_INST, /* u32 */ ++ ++ __TIPC_NLA_CON_MAX, ++ TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1 ++}; ++ ++/* Nest, link propreties. Valid for link, media and bearer */ ++enum { ++ TIPC_NLA_PROP_UNSPEC, ++ ++ TIPC_NLA_PROP_PRIO, /* u32 */ ++ TIPC_NLA_PROP_TOL, /* u32 */ ++ TIPC_NLA_PROP_WIN, /* u32 */ ++ ++ __TIPC_NLA_PROP_MAX, ++ TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1 ++}; ++ ++/* Nest, statistics info */ ++enum { ++ TIPC_NLA_STATS_UNSPEC, ++ ++ TIPC_NLA_STATS_RX_INFO, /* u32 */ ++ TIPC_NLA_STATS_RX_FRAGMENTS, /* u32 */ ++ TIPC_NLA_STATS_RX_FRAGMENTED, /* u32 */ ++ TIPC_NLA_STATS_RX_BUNDLES, /* u32 */ ++ TIPC_NLA_STATS_RX_BUNDLED, /* u32 */ ++ TIPC_NLA_STATS_TX_INFO, /* u32 */ ++ TIPC_NLA_STATS_TX_FRAGMENTS, /* u32 */ ++ TIPC_NLA_STATS_TX_FRAGMENTED, /* u32 */ ++ TIPC_NLA_STATS_TX_BUNDLES, /* u32 */ ++ TIPC_NLA_STATS_TX_BUNDLED, /* u32 */ ++ TIPC_NLA_STATS_MSG_PROF_TOT, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_CNT, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_TOT, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P0, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P1, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P2, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P3, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P4, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P5, /* u32 */ ++ TIPC_NLA_STATS_MSG_LEN_P6, /* u32 */ ++ TIPC_NLA_STATS_RX_STATES, /* u32 */ ++ TIPC_NLA_STATS_RX_PROBES, /* u32 */ ++ TIPC_NLA_STATS_RX_NACKS, /* u32 */ ++ TIPC_NLA_STATS_RX_DEFERRED, /* u32 */ ++ TIPC_NLA_STATS_TX_STATES, /* u32 */ ++ TIPC_NLA_STATS_TX_PROBES, /* u32 */ ++ TIPC_NLA_STATS_TX_NACKS, /* u32 */ ++ TIPC_NLA_STATS_TX_ACKS, /* u32 */ ++ TIPC_NLA_STATS_RETRANSMITTED, /* u32 */ ++ TIPC_NLA_STATS_DUPLICATES, /* u32 */ ++ TIPC_NLA_STATS_LINK_CONGS, /* u32 */ ++ TIPC_NLA_STATS_MAX_QUEUE, /* u32 */ ++ TIPC_NLA_STATS_AVG_QUEUE, /* u32 */ ++ ++ __TIPC_NLA_STATS_MAX, ++ TIPC_NLA_STATS_MAX = __TIPC_NLA_STATS_MAX - 1 ++}; ++ ++#endif +diff --git a/include/uapi/linux/types.h b/include/uapi/linux/types.h +new file mode 100644 +index 0000000..c640657 +--- /dev/null ++++ b/include/uapi/linux/types.h +@@ -0,0 +1,47 @@ ++#ifndef _LINUX_TYPES_H ++#define _LINUX_TYPES_H ++ ++#include ++ ++#ifndef __ASSEMBLY__ ++ ++#include ++ ++ ++/* ++ * Below are truly Linux-specific types that should never collide with ++ * any application/library that wants linux/types.h. ++ */ ++ ++#ifdef __CHECKER__ ++#define __bitwise__ __attribute__((bitwise)) ++#else ++#define __bitwise__ ++#endif ++#define __bitwise __bitwise__ ++ ++typedef __u16 __bitwise __le16; ++typedef __u16 __bitwise __be16; ++typedef __u32 __bitwise __le32; ++typedef __u32 __bitwise __be32; ++typedef __u64 __bitwise __le64; ++typedef __u64 __bitwise __be64; ++ ++typedef __u16 __bitwise __sum16; ++typedef __u32 __bitwise __wsum; ++ ++/* ++ * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid ++ * common 32/64-bit compat problems. ++ * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other ++ * architectures) and to 8-byte boundaries on 64-bit architectures. The new ++ * aligned_64 type enforces 8-byte alignment so that structs containing ++ * aligned_64 values have the same alignment on 32-bit and 64-bit architectures. ++ * No conversions are necessary between 32-bit user-space and a 64-bit kernel. ++ */ ++#define __aligned_u64 __u64 __attribute__((aligned(8))) ++#define __aligned_be64 __be64 __attribute__((aligned(8))) ++#define __aligned_le64 __le64 __attribute__((aligned(8))) ++ ++#endif /* __ASSEMBLY__ */ ++#endif /* _LINUX_TYPES_H */ +diff --git a/include/uapi/linux/unix_diag.h b/include/uapi/linux/unix_diag.h +new file mode 100644 +index 0000000..1eb0b8d +--- /dev/null ++++ b/include/uapi/linux/unix_diag.h +@@ -0,0 +1,58 @@ ++#ifndef __UNIX_DIAG_H__ ++#define __UNIX_DIAG_H__ ++ ++#include ++ ++struct unix_diag_req { ++ __u8 sdiag_family; ++ __u8 sdiag_protocol; ++ __u16 pad; ++ __u32 udiag_states; ++ __u32 udiag_ino; ++ __u32 udiag_show; ++ __u32 udiag_cookie[2]; ++}; ++ ++#define UDIAG_SHOW_NAME 0x00000001 /* show name (not path) */ ++#define UDIAG_SHOW_VFS 0x00000002 /* show VFS inode info */ ++#define UDIAG_SHOW_PEER 0x00000004 /* show peer socket info */ ++#define UDIAG_SHOW_ICONS 0x00000008 /* show pending connections */ ++#define UDIAG_SHOW_RQLEN 0x00000010 /* show skb receive queue len */ ++#define UDIAG_SHOW_MEMINFO 0x00000020 /* show memory info of a socket */ ++ ++struct unix_diag_msg { ++ __u8 udiag_family; ++ __u8 udiag_type; ++ __u8 udiag_state; ++ __u8 pad; ++ ++ __u32 udiag_ino; ++ __u32 udiag_cookie[2]; ++}; ++ ++enum { ++ /* UNIX_DIAG_NONE, standard nl API requires this attribute! */ ++ UNIX_DIAG_NAME, ++ UNIX_DIAG_VFS, ++ UNIX_DIAG_PEER, ++ UNIX_DIAG_ICONS, ++ UNIX_DIAG_RQLEN, ++ UNIX_DIAG_MEMINFO, ++ UNIX_DIAG_SHUTDOWN, ++ ++ __UNIX_DIAG_MAX, ++}; ++ ++#define UNIX_DIAG_MAX (__UNIX_DIAG_MAX - 1) ++ ++struct unix_diag_vfs { ++ __u32 udiag_vfs_ino; ++ __u32 udiag_vfs_dev; ++}; ++ ++struct unix_diag_rqlen { ++ __u32 udiag_rqueue; ++ __u32 udiag_wqueue; ++}; ++ ++#endif +diff --git a/include/uapi/linux/veth.h b/include/uapi/linux/veth.h +new file mode 100644 +index 0000000..3354c1e +--- /dev/null ++++ b/include/uapi/linux/veth.h +@@ -0,0 +1,12 @@ ++#ifndef __NET_VETH_H_ ++#define __NET_VETH_H_ ++ ++enum { ++ VETH_INFO_UNSPEC, ++ VETH_INFO_PEER, ++ ++ __VETH_INFO_MAX ++#define VETH_INFO_MAX (__VETH_INFO_MAX - 1) ++}; ++ ++#endif +diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h +new file mode 100644 +index 0000000..5790293 +--- /dev/null ++++ b/include/uapi/linux/xfrm.h +@@ -0,0 +1,536 @@ ++#ifndef _LINUX_XFRM_H ++#define _LINUX_XFRM_H ++ ++#include ++#include ++ ++/* All of the structures in this file may not change size as they are ++ * passed into the kernel from userspace via netlink sockets. ++ */ ++ ++/* Structure to encapsulate addresses. I do not want to use ++ * "standard" structure. My apologies. ++ */ ++typedef union { ++ __be32 a4; ++ __be32 a6[4]; ++ struct in6_addr in6; ++} xfrm_address_t; ++ ++/* Ident of a specific xfrm_state. It is used on input to lookup ++ * the state by (spi,daddr,ah/esp) or to store information about ++ * spi, protocol and tunnel address on output. ++ */ ++struct xfrm_id { ++ xfrm_address_t daddr; ++ __be32 spi; ++ __u8 proto; ++}; ++ ++struct xfrm_sec_ctx { ++ __u8 ctx_doi; ++ __u8 ctx_alg; ++ __u16 ctx_len; ++ __u32 ctx_sid; ++ char ctx_str[0]; ++}; ++ ++/* Security Context Domains of Interpretation */ ++#define XFRM_SC_DOI_RESERVED 0 ++#define XFRM_SC_DOI_LSM 1 ++ ++/* Security Context Algorithms */ ++#define XFRM_SC_ALG_RESERVED 0 ++#define XFRM_SC_ALG_SELINUX 1 ++ ++/* Selector, used as selector both on policy rules (SPD) and SAs. */ ++ ++struct xfrm_selector { ++ xfrm_address_t daddr; ++ xfrm_address_t saddr; ++ __be16 dport; ++ __be16 dport_mask; ++ __be16 sport; ++ __be16 sport_mask; ++ __u16 family; ++ __u8 prefixlen_d; ++ __u8 prefixlen_s; ++ __u8 proto; ++ int ifindex; ++ __kernel_uid32_t user; ++}; ++ ++#define XFRM_INF (~(__u64)0) ++ ++struct xfrm_lifetime_cfg { ++ __u64 soft_byte_limit; ++ __u64 hard_byte_limit; ++ __u64 soft_packet_limit; ++ __u64 hard_packet_limit; ++ __u64 soft_add_expires_seconds; ++ __u64 hard_add_expires_seconds; ++ __u64 soft_use_expires_seconds; ++ __u64 hard_use_expires_seconds; ++}; ++ ++struct xfrm_lifetime_cur { ++ __u64 bytes; ++ __u64 packets; ++ __u64 add_time; ++ __u64 use_time; ++}; ++ ++struct xfrm_replay_state { ++ __u32 oseq; ++ __u32 seq; ++ __u32 bitmap; ++}; ++ ++#define XFRMA_REPLAY_ESN_MAX 4096 ++ ++struct xfrm_replay_state_esn { ++ unsigned int bmp_len; ++ __u32 oseq; ++ __u32 seq; ++ __u32 oseq_hi; ++ __u32 seq_hi; ++ __u32 replay_window; ++ __u32 bmp[0]; ++}; ++ ++struct xfrm_algo { ++ char alg_name[64]; ++ unsigned int alg_key_len; /* in bits */ ++ char alg_key[0]; ++}; ++ ++struct xfrm_algo_auth { ++ char alg_name[64]; ++ unsigned int alg_key_len; /* in bits */ ++ unsigned int alg_trunc_len; /* in bits */ ++ char alg_key[0]; ++}; ++ ++struct xfrm_algo_aead { ++ char alg_name[64]; ++ unsigned int alg_key_len; /* in bits */ ++ unsigned int alg_icv_len; /* in bits */ ++ char alg_key[0]; ++}; ++ ++struct xfrm_stats { ++ __u32 replay_window; ++ __u32 replay; ++ __u32 integrity_failed; ++}; ++ ++enum { ++ XFRM_POLICY_TYPE_MAIN = 0, ++ XFRM_POLICY_TYPE_SUB = 1, ++ XFRM_POLICY_TYPE_MAX = 2, ++ XFRM_POLICY_TYPE_ANY = 255 ++}; ++ ++enum { ++ XFRM_POLICY_IN = 0, ++ XFRM_POLICY_OUT = 1, ++ XFRM_POLICY_FWD = 2, ++ XFRM_POLICY_MASK = 3, ++ XFRM_POLICY_MAX = 3 ++}; ++ ++enum { ++ XFRM_SHARE_ANY, /* No limitations */ ++ XFRM_SHARE_SESSION, /* For this session only */ ++ XFRM_SHARE_USER, /* For this user only */ ++ XFRM_SHARE_UNIQUE /* Use once */ ++}; ++ ++#define XFRM_MODE_TRANSPORT 0 ++#define XFRM_MODE_TUNNEL 1 ++#define XFRM_MODE_ROUTEOPTIMIZATION 2 ++#define XFRM_MODE_IN_TRIGGER 3 ++#define XFRM_MODE_BEET 4 ++#define XFRM_MODE_MAX 5 ++ ++/* Netlink configuration messages. */ ++enum { ++ XFRM_MSG_BASE = 0x10, ++ ++ XFRM_MSG_NEWSA = 0x10, ++#define XFRM_MSG_NEWSA XFRM_MSG_NEWSA ++ XFRM_MSG_DELSA, ++#define XFRM_MSG_DELSA XFRM_MSG_DELSA ++ XFRM_MSG_GETSA, ++#define XFRM_MSG_GETSA XFRM_MSG_GETSA ++ ++ XFRM_MSG_NEWPOLICY, ++#define XFRM_MSG_NEWPOLICY XFRM_MSG_NEWPOLICY ++ XFRM_MSG_DELPOLICY, ++#define XFRM_MSG_DELPOLICY XFRM_MSG_DELPOLICY ++ XFRM_MSG_GETPOLICY, ++#define XFRM_MSG_GETPOLICY XFRM_MSG_GETPOLICY ++ ++ XFRM_MSG_ALLOCSPI, ++#define XFRM_MSG_ALLOCSPI XFRM_MSG_ALLOCSPI ++ XFRM_MSG_ACQUIRE, ++#define XFRM_MSG_ACQUIRE XFRM_MSG_ACQUIRE ++ XFRM_MSG_EXPIRE, ++#define XFRM_MSG_EXPIRE XFRM_MSG_EXPIRE ++ ++ XFRM_MSG_UPDPOLICY, ++#define XFRM_MSG_UPDPOLICY XFRM_MSG_UPDPOLICY ++ XFRM_MSG_UPDSA, ++#define XFRM_MSG_UPDSA XFRM_MSG_UPDSA ++ ++ XFRM_MSG_POLEXPIRE, ++#define XFRM_MSG_POLEXPIRE XFRM_MSG_POLEXPIRE ++ ++ XFRM_MSG_FLUSHSA, ++#define XFRM_MSG_FLUSHSA XFRM_MSG_FLUSHSA ++ XFRM_MSG_FLUSHPOLICY, ++#define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY ++ ++ XFRM_MSG_NEWAE, ++#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE ++ XFRM_MSG_GETAE, ++#define XFRM_MSG_GETAE XFRM_MSG_GETAE ++ ++ XFRM_MSG_REPORT, ++#define XFRM_MSG_REPORT XFRM_MSG_REPORT ++ ++ XFRM_MSG_MIGRATE, ++#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE ++ ++ XFRM_MSG_NEWSADINFO, ++#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO ++ XFRM_MSG_GETSADINFO, ++#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO ++ ++ XFRM_MSG_NEWSPDINFO, ++#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO ++ XFRM_MSG_GETSPDINFO, ++#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO ++ ++ XFRM_MSG_MAPPING, ++#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING ++ __XFRM_MSG_MAX ++}; ++#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1) ++ ++#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE) ++ ++/* ++ * Generic LSM security context for comunicating to user space ++ * NOTE: Same format as sadb_x_sec_ctx ++ */ ++struct xfrm_user_sec_ctx { ++ __u16 len; ++ __u16 exttype; ++ __u8 ctx_alg; /* LSMs: e.g., selinux == 1 */ ++ __u8 ctx_doi; ++ __u16 ctx_len; ++}; ++ ++struct xfrm_user_tmpl { ++ struct xfrm_id id; ++ __u16 family; ++ xfrm_address_t saddr; ++ __u32 reqid; ++ __u8 mode; ++ __u8 share; ++ __u8 optional; ++ __u32 aalgos; ++ __u32 ealgos; ++ __u32 calgos; ++}; ++ ++struct xfrm_encap_tmpl { ++ __u16 encap_type; ++ __be16 encap_sport; ++ __be16 encap_dport; ++ xfrm_address_t encap_oa; ++}; ++ ++/* AEVENT flags */ ++enum xfrm_ae_ftype_t { ++ XFRM_AE_UNSPEC, ++ XFRM_AE_RTHR=1, /* replay threshold*/ ++ XFRM_AE_RVAL=2, /* replay value */ ++ XFRM_AE_LVAL=4, /* lifetime value */ ++ XFRM_AE_ETHR=8, /* expiry timer threshold */ ++ XFRM_AE_CR=16, /* Event cause is replay update */ ++ XFRM_AE_CE=32, /* Event cause is timer expiry */ ++ XFRM_AE_CU=64, /* Event cause is policy update */ ++ __XFRM_AE_MAX ++ ++#define XFRM_AE_MAX (__XFRM_AE_MAX - 1) ++}; ++ ++struct xfrm_userpolicy_type { ++ __u8 type; ++ __u16 reserved1; ++ __u8 reserved2; ++}; ++ ++/* Netlink message attributes. */ ++enum xfrm_attr_type_t { ++ XFRMA_UNSPEC, ++ XFRMA_ALG_AUTH, /* struct xfrm_algo */ ++ XFRMA_ALG_CRYPT, /* struct xfrm_algo */ ++ XFRMA_ALG_COMP, /* struct xfrm_algo */ ++ XFRMA_ENCAP, /* struct xfrm_algo + struct xfrm_encap_tmpl */ ++ XFRMA_TMPL, /* 1 or more struct xfrm_user_tmpl */ ++ XFRMA_SA, /* struct xfrm_usersa_info */ ++ XFRMA_POLICY, /*struct xfrm_userpolicy_info */ ++ XFRMA_SEC_CTX, /* struct xfrm_sec_ctx */ ++ XFRMA_LTIME_VAL, ++ XFRMA_REPLAY_VAL, ++ XFRMA_REPLAY_THRESH, ++ XFRMA_ETIMER_THRESH, ++ XFRMA_SRCADDR, /* xfrm_address_t */ ++ XFRMA_COADDR, /* xfrm_address_t */ ++ XFRMA_LASTUSED, /* unsigned long */ ++ XFRMA_POLICY_TYPE, /* struct xfrm_userpolicy_type */ ++ XFRMA_MIGRATE, ++ XFRMA_ALG_AEAD, /* struct xfrm_algo_aead */ ++ XFRMA_KMADDRESS, /* struct xfrm_user_kmaddress */ ++ XFRMA_ALG_AUTH_TRUNC, /* struct xfrm_algo_auth */ ++ XFRMA_MARK, /* struct xfrm_mark */ ++ XFRMA_TFCPAD, /* __u32 */ ++ XFRMA_REPLAY_ESN_VAL, /* struct xfrm_replay_state_esn */ ++ XFRMA_SA_EXTRA_FLAGS, /* __u32 */ ++ XFRMA_PROTO, /* __u8 */ ++ XFRMA_ADDRESS_FILTER, /* struct xfrm_address_filter */ ++ XFRMA_PAD, ++ XFRMA_OFFLOAD_DEV, /* struct xfrm_state_offload */ ++ XFRMA_OUTPUT_MARK, /* __u32 */ ++ __XFRMA_MAX ++ ++#define XFRMA_MAX (__XFRMA_MAX - 1) ++}; ++ ++struct xfrm_mark { ++ __u32 v; /* value */ ++ __u32 m; /* mask */ ++}; ++ ++enum xfrm_sadattr_type_t { ++ XFRMA_SAD_UNSPEC, ++ XFRMA_SAD_CNT, ++ XFRMA_SAD_HINFO, ++ __XFRMA_SAD_MAX ++ ++#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1) ++}; ++ ++struct xfrmu_sadhinfo { ++ __u32 sadhcnt; /* current hash bkts */ ++ __u32 sadhmcnt; /* max allowed hash bkts */ ++}; ++ ++enum xfrm_spdattr_type_t { ++ XFRMA_SPD_UNSPEC, ++ XFRMA_SPD_INFO, ++ XFRMA_SPD_HINFO, ++ XFRMA_SPD_IPV4_HTHRESH, ++ XFRMA_SPD_IPV6_HTHRESH, ++ __XFRMA_SPD_MAX ++ ++#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1) ++}; ++ ++struct xfrmu_spdinfo { ++ __u32 incnt; ++ __u32 outcnt; ++ __u32 fwdcnt; ++ __u32 inscnt; ++ __u32 outscnt; ++ __u32 fwdscnt; ++}; ++ ++struct xfrmu_spdhinfo { ++ __u32 spdhcnt; ++ __u32 spdhmcnt; ++}; ++ ++struct xfrmu_spdhthresh { ++ __u8 lbits; ++ __u8 rbits; ++}; ++ ++struct xfrm_usersa_info { ++ struct xfrm_selector sel; ++ struct xfrm_id id; ++ xfrm_address_t saddr; ++ struct xfrm_lifetime_cfg lft; ++ struct xfrm_lifetime_cur curlft; ++ struct xfrm_stats stats; ++ __u32 seq; ++ __u32 reqid; ++ __u16 family; ++ __u8 mode; /* XFRM_MODE_xxx */ ++ __u8 replay_window; ++ __u8 flags; ++#define XFRM_STATE_NOECN 1 ++#define XFRM_STATE_DECAP_DSCP 2 ++#define XFRM_STATE_NOPMTUDISC 4 ++#define XFRM_STATE_WILDRECV 8 ++#define XFRM_STATE_ICMP 16 ++#define XFRM_STATE_AF_UNSPEC 32 ++#define XFRM_STATE_ALIGN4 64 ++#define XFRM_STATE_ESN 128 ++}; ++ ++#define XFRM_SA_XFLAG_DONT_ENCAP_DSCP 1 ++ ++struct xfrm_usersa_id { ++ xfrm_address_t daddr; ++ __be32 spi; ++ __u16 family; ++ __u8 proto; ++}; ++ ++struct xfrm_aevent_id { ++ struct xfrm_usersa_id sa_id; ++ xfrm_address_t saddr; ++ __u32 flags; ++ __u32 reqid; ++}; ++ ++struct xfrm_userspi_info { ++ struct xfrm_usersa_info info; ++ __u32 min; ++ __u32 max; ++}; ++ ++struct xfrm_userpolicy_info { ++ struct xfrm_selector sel; ++ struct xfrm_lifetime_cfg lft; ++ struct xfrm_lifetime_cur curlft; ++ __u32 priority; ++ __u32 index; ++ __u8 dir; ++ __u8 action; ++#define XFRM_POLICY_ALLOW 0 ++#define XFRM_POLICY_BLOCK 1 ++ __u8 flags; ++#define XFRM_POLICY_LOCALOK 1 /* Allow user to override global policy */ ++ /* Automatically expand selector to include matching ICMP payloads. */ ++#define XFRM_POLICY_ICMP 2 ++ __u8 share; ++}; ++ ++struct xfrm_userpolicy_id { ++ struct xfrm_selector sel; ++ __u32 index; ++ __u8 dir; ++}; ++ ++struct xfrm_user_acquire { ++ struct xfrm_id id; ++ xfrm_address_t saddr; ++ struct xfrm_selector sel; ++ struct xfrm_userpolicy_info policy; ++ __u32 aalgos; ++ __u32 ealgos; ++ __u32 calgos; ++ __u32 seq; ++}; ++ ++struct xfrm_user_expire { ++ struct xfrm_usersa_info state; ++ __u8 hard; ++}; ++ ++struct xfrm_user_polexpire { ++ struct xfrm_userpolicy_info pol; ++ __u8 hard; ++}; ++ ++struct xfrm_usersa_flush { ++ __u8 proto; ++}; ++ ++struct xfrm_user_report { ++ __u8 proto; ++ struct xfrm_selector sel; ++}; ++ ++/* Used by MIGRATE to pass addresses IKE should use to perform ++ * SA negotiation with the peer */ ++struct xfrm_user_kmaddress { ++ xfrm_address_t local; ++ xfrm_address_t remote; ++ __u32 reserved; ++ __u16 family; ++}; ++ ++struct xfrm_user_migrate { ++ xfrm_address_t old_daddr; ++ xfrm_address_t old_saddr; ++ xfrm_address_t new_daddr; ++ xfrm_address_t new_saddr; ++ __u8 proto; ++ __u8 mode; ++ __u16 reserved; ++ __u32 reqid; ++ __u16 old_family; ++ __u16 new_family; ++}; ++ ++struct xfrm_user_mapping { ++ struct xfrm_usersa_id id; ++ __u32 reqid; ++ xfrm_address_t old_saddr; ++ xfrm_address_t new_saddr; ++ __be16 old_sport; ++ __be16 new_sport; ++}; ++ ++struct xfrm_address_filter { ++ xfrm_address_t saddr; ++ xfrm_address_t daddr; ++ __u16 family; ++ __u8 splen; ++ __u8 dplen; ++}; ++ ++struct xfrm_user_offload { ++ int ifindex; ++ __u8 flags; ++}; ++#define XFRM_OFFLOAD_IPV6 1 ++#define XFRM_OFFLOAD_INBOUND 2 ++ ++/* backwards compatibility for userspace */ ++#define XFRMGRP_ACQUIRE 1 ++#define XFRMGRP_EXPIRE 2 ++#define XFRMGRP_SA 4 ++#define XFRMGRP_POLICY 8 ++#define XFRMGRP_REPORT 0x20 ++ ++enum xfrm_nlgroups { ++ XFRMNLGRP_NONE, ++#define XFRMNLGRP_NONE XFRMNLGRP_NONE ++ XFRMNLGRP_ACQUIRE, ++#define XFRMNLGRP_ACQUIRE XFRMNLGRP_ACQUIRE ++ XFRMNLGRP_EXPIRE, ++#define XFRMNLGRP_EXPIRE XFRMNLGRP_EXPIRE ++ XFRMNLGRP_SA, ++#define XFRMNLGRP_SA XFRMNLGRP_SA ++ XFRMNLGRP_POLICY, ++#define XFRMNLGRP_POLICY XFRMNLGRP_POLICY ++ XFRMNLGRP_AEVENTS, ++#define XFRMNLGRP_AEVENTS XFRMNLGRP_AEVENTS ++ XFRMNLGRP_REPORT, ++#define XFRMNLGRP_REPORT XFRMNLGRP_REPORT ++ XFRMNLGRP_MIGRATE, ++#define XFRMNLGRP_MIGRATE XFRMNLGRP_MIGRATE ++ XFRMNLGRP_MAPPING, ++#define XFRMNLGRP_MAPPING XFRMNLGRP_MAPPING ++ __XFRMNLGRP_MAX ++}; ++#define XFRMNLGRP_MAX (__XFRMNLGRP_MAX - 1) ++ ++#endif /* _LINUX_XFRM_H */ +-- +1.8.3.1 + diff --git a/SOURCES/0037-uapi-add-include-linux-vm_sockets_diag.h.patch b/SOURCES/0037-uapi-add-include-linux-vm_sockets_diag.h.patch new file mode 100644 index 0000000..46d589f --- /dev/null +++ b/SOURCES/0037-uapi-add-include-linux-vm_sockets_diag.h.patch @@ -0,0 +1,64 @@ +From 74e00895532b878a902f9b0477e1b00d1be9df59 Mon Sep 17 00:00:00 2001 +From: Stefano Brivio +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 +Date: Wed Oct 11 10:49:25 2017 -0700 + + uapi: add include linux/vm_sockets_diag.h + + Signed-off-by: Stephen Hemminger + +Signed-off-by: Stefano Brivio +--- + 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 ++ ++/* 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 + diff --git a/SOURCES/0038-ss-allow-AF_FAMILY-constants-32.patch b/SOURCES/0038-ss-allow-AF_FAMILY-constants-32.patch new file mode 100644 index 0000000..2c0fbfd --- /dev/null +++ b/SOURCES/0038-ss-allow-AF_FAMILY-constants-32.patch @@ -0,0 +1,213 @@ +From f59533eb3cb188a23456444aeb19ac3634eddd8c Mon Sep 17 00:00:00 2001 +From: Stefano Brivio +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 +Date: Fri Oct 6 11:48:39 2017 -0400 + + ss: allow AF_FAMILY constants >32 + + Linux has more than 32 address families defined in . 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 + +Signed-off-by: Stefano Brivio +--- + 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<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<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<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<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<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<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 + diff --git a/SOURCES/0039-ss-add-AF_VSOCK-support.patch b/SOURCES/0039-ss-add-AF_VSOCK-support.patch new file mode 100644 index 0000000..ce5b7fb --- /dev/null +++ b/SOURCES/0039-ss-add-AF_VSOCK-support.patch @@ -0,0 +1,398 @@ +From fe898bd10be2bc527f81421f06afff77e8ba42eb Mon Sep 17 00:00:00 2001 +From: Stefano Brivio +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 +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 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 + +Signed-off-by: Stefano Brivio +--- + 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 + #include + #include ++#include + + #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<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< +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 +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 +--- + 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 + diff --git a/SOURCES/0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch b/SOURCES/0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch new file mode 100644 index 0000000..ddd8d95 --- /dev/null +++ b/SOURCES/0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch @@ -0,0 +1,42 @@ +From f08752c12351c79145e3a6caf346e3d971370a9c Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0042-tc-fix-command-tc-actions-del-hang-issue.patch b/SOURCES/0042-tc-fix-command-tc-actions-del-hang-issue.patch new file mode 100644 index 0000000..54d524e --- /dev/null +++ b/SOURCES/0042-tc-fix-command-tc-actions-del-hang-issue.patch @@ -0,0 +1,42 @@ +From dbc597c9d1e0e65cc9d989d8057f9a083c2f5779 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 + Signed-off-by: Chris Mi + Signed-off-by: Stephen Hemminger +--- + 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 + diff --git a/SOURCES/0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch b/SOURCES/0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch new file mode 100644 index 0000000..2eda52a --- /dev/null +++ b/SOURCES/0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch @@ -0,0 +1,43 @@ +From dcafeb49b2538cc7118cb64f62c685980c106b48 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +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 +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 +--- + 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 + diff --git a/SOURCES/0044-tc-m_tunnel_key-reformat-the-usage-text.patch b/SOURCES/0044-tc-m_tunnel_key-reformat-the-usage-text.patch new file mode 100644 index 0000000..5530aaf --- /dev/null +++ b/SOURCES/0044-tc-m_tunnel_key-reformat-the-usage-text.patch @@ -0,0 +1,44 @@ +From 04ecd76fa66c7745529b3b007ad04a307d2b7518 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 6 Feb 2019 14:31:10 +0100 +Subject: [PATCH] tc: m_tunnel_key: reformat the usage text + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1658506 +Upstream Status: iproute2.git commit 50907a8245ea3 + +commit 50907a8245ea37875fb877d6f21f51a1f247b167 +Author: Jiri Benc +Date: Wed Jun 14 21:29:49 2017 +0200 + + tc: m_tunnel_key: reformat the usage text + + Adding new tunnel key fields would cause the usage line overflow 80 chars. + Make the usage text similar to other commands. + + Signed-off-by: Jiri Benc +--- + tc/m_tunnel_key.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index 3ceec1c..5222c25 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -22,7 +22,13 @@ + static void explain(void) + { + fprintf(stderr, "Usage: tunnel_key unset\n"); +- fprintf(stderr, " tunnel_key set id TUNNELID src_ip IP dst_ip IP dst_port UDP_PORT\n"); ++ fprintf(stderr, " tunnel_key set \n"); ++ fprintf(stderr, ++ "Where TUNNEL_KEY is a combination of:\n" ++ "id (mandatory)\n" ++ "src_ip (mandatory)\n" ++ "dst_ip (mandatory)\n" ++ "dst_port \n"); + } + + static void usage(void) +-- +1.8.3.1 + diff --git a/SOURCES/0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch b/SOURCES/0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch new file mode 100644 index 0000000..76c2a4f --- /dev/null +++ b/SOURCES/0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch @@ -0,0 +1,88 @@ +From f43f500151a6261e24d89674b0a44f2d84c9e207 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 6 Feb 2019 14:21:09 +0100 +Subject: [PATCH] tc: m_tunnel_key: Allow key-less tunnels + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1658506 +Upstream Status: iproute2.git commit dc0332b1e8e4a +Conflicts: Context change due to missing commit 59eb271d1d259 + ("tc: m_tunnel_key: add csum/nocsum option"). + +commit dc0332b1e8e4ab8771562128993d512986f856e2 +Author: Adi Nissim +Date: Thu Jan 10 15:03:50 2019 +0200 + + tc: m_tunnel_key: Allow key-less tunnels + + Change the id parameter of the tunnel_key set action from mandatory to + optional. + + Some tunneling protocols (e.g. GRE) specify the id as an optional field. + + Signed-off-by: Adi Nissim + Signed-off-by: Stephen Hemminger +--- + man/man8/tc-tunnel_key.8 | 4 ++-- + tc/m_tunnel_key.c | 6 ++---- + 2 files changed, 4 insertions(+), 6 deletions(-) + +diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8 +index 2e56973..52fa585 100644 +--- a/man/man8/tc-tunnel_key.8 ++++ b/man/man8/tc-tunnel_key.8 +@@ -56,12 +56,12 @@ above). + .TP + .B set + Set tunnel metadata to be used by the IP tunnel device. Requires +-.B id +-, + .B src_ip + and + .B dst_ip + options. ++.B id ++, + .B dst_port + is optional. + .RS +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index 5222c25..acbcfc1 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -25,7 +25,7 @@ static void explain(void) + fprintf(stderr, " tunnel_key set \n"); + fprintf(stderr, + "Where TUNNEL_KEY is a combination of:\n" +- "id (mandatory)\n" ++ "id \n" + "src_ip (mandatory)\n" + "dst_ip (mandatory)\n" + "dst_port \n"); +@@ -91,7 +91,6 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + int ret; + int has_src_ip = 0; + int has_dst_ip = 0; +- int has_key_id = 0; + + if (matches(*argv, "tunnel_key") != 0) + return -1; +@@ -147,7 +146,6 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + fprintf(stderr, "Illegal \"id\"\n"); + return -1; + } +- has_key_id = 1; + } else if (matches(*argv, "dst_port") == 0) { + NEXT_ARG(); + ret = tunnel_key_parse_dst_port(*argv, +@@ -180,7 +178,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + } + + if (action == TCA_TUNNEL_KEY_ACT_SET && +- (!has_src_ip || !has_dst_ip || !has_key_id)) { ++ (!has_src_ip || !has_dst_ip)) { + fprintf(stderr, "set needs tunnel_key parameters\n"); + explain(); + return -1; +-- +1.8.3.1 + diff --git a/SOURCES/0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch b/SOURCES/0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch new file mode 100644 index 0000000..ed0d248 --- /dev/null +++ b/SOURCES/0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch @@ -0,0 +1,39 @@ +From 7a77e4df94a48c35f9a4bf1fc3f8e9d1f72a77b7 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 6 Feb 2019 14:50:24 +0100 +Subject: [PATCH] tc: include stdint.h explicitly for UINT16_MAX + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909 +Upstream Status: iproute2.git commit ae717baf15fb4 + +commit ae717baf15fb4d30749ada3948d9445892bac239 +Author: Khem Raj +Date: Sat May 20 14:28:46 2017 -0700 + + tc: include stdint.h explicitly for UINT16_MAX + + Fixes + | tc_core.c:190:29: error: 'UINT16_MAX' undeclared (first use in this function); did you mean '__INT16_MAX__'? + | if ((sz >> s->size_log) > UINT16_MAX) { + | ^~~~~~~~~~ + + Signed-off-by: Khem Raj +--- + tc/tc_core.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tc/tc_core.c b/tc/tc_core.c +index 7bbe0d7..821b741 100644 +--- a/tc/tc_core.c ++++ b/tc/tc_core.c +@@ -12,6 +12,7 @@ + + #include + #include ++#include + #include + #include + #include +-- +1.8.3.1 + diff --git a/SOURCES/0047-Update-kernel-headers.patch b/SOURCES/0047-Update-kernel-headers.patch new file mode 100644 index 0000000..916d932 --- /dev/null +++ b/SOURCES/0047-Update-kernel-headers.patch @@ -0,0 +1,5651 @@ +From 007c76937f34c11c4c827373f081a9c4eebf1fc3 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 6 Feb 2019 14:50:24 +0100 +Subject: [PATCH] Update kernel headers + +This updates kernel headers to upstream commit +761ec9e29ff867452057f59dc6ca430688b409ea. Update was done via: + +| git checkout 761ec9e29ff867452057f59dc6ca430688b409ea -- include/uapi + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909 +Upstream Status: RHEL-only +--- + include/uapi/linux/atm.h | 1 + + include/uapi/linux/atmapi.h | 1 + + include/uapi/linux/atmarp.h | 1 + + include/uapi/linux/atmdev.h | 1 + + include/uapi/linux/atmioc.h | 1 + + include/uapi/linux/atmsap.h | 1 + + include/uapi/linux/bpf.h | 2481 ++++++++++++++++++++---- + include/uapi/linux/bpf_common.h | 8 +- + include/uapi/linux/btf.h | 113 ++ + include/uapi/linux/can.h | 1 + + include/uapi/linux/can/netlink.h | 2 + + include/uapi/linux/can/vxcan.h | 1 + + include/uapi/linux/devlink.h | 82 + + include/uapi/linux/elf-em.h | 1 + + include/uapi/linux/fib_rules.h | 12 +- + include/uapi/linux/filter.h | 1 + + include/uapi/linux/fou.h | 1 + + include/uapi/linux/gen_stats.h | 1 + + include/uapi/linux/genetlink.h | 1 + + include/uapi/linux/hdlc/ioctl.h | 1 + + include/uapi/linux/icmpv6.h | 1 + + include/uapi/linux/if.h | 1 + + include/uapi/linux/if_addr.h | 2 + + include/uapi/linux/if_addrlabel.h | 1 + + include/uapi/linux/if_alg.h | 1 + + include/uapi/linux/if_arp.h | 1 + + include/uapi/linux/if_bonding.h | 1 + + include/uapi/linux/if_bridge.h | 1 + + include/uapi/linux/if_ether.h | 11 + + include/uapi/linux/if_link.h | 59 + + include/uapi/linux/if_macsec.h | 10 +- + include/uapi/linux/if_packet.h | 1 + + include/uapi/linux/if_tun.h | 5 + + include/uapi/linux/if_tunnel.h | 5 + + include/uapi/linux/if_vlan.h | 1 + + include/uapi/linux/ife.h | 1 + + include/uapi/linux/ila.h | 23 + + include/uapi/linux/in.h | 1 + + include/uapi/linux/in6.h | 2 + + include/uapi/linux/in_route.h | 1 + + include/uapi/linux/inet_diag.h | 3 + + include/uapi/linux/ip.h | 1 + + include/uapi/linux/ip6_tunnel.h | 3 + + include/uapi/linux/ipsec.h | 1 + + include/uapi/linux/kernel.h | 1 + + include/uapi/linux/l2tp.h | 7 +- + include/uapi/linux/libc-compat.h | 56 +- + include/uapi/linux/limits.h | 1 + + include/uapi/linux/lwtunnel.h | 1 + + include/uapi/linux/magic.h | 2 + + include/uapi/linux/mpls.h | 1 + + include/uapi/linux/mpls_iptunnel.h | 1 + + include/uapi/linux/neighbour.h | 1 + + include/uapi/linux/net_namespace.h | 1 + + include/uapi/linux/netconf.h | 1 + + include/uapi/linux/netdevice.h | 1 + + include/uapi/linux/netfilter.h | 1 + + include/uapi/linux/netfilter/ipset/ip_set.h | 1 + + include/uapi/linux/netfilter/x_tables.h | 1 + + include/uapi/linux/netfilter/xt_set.h | 1 + + include/uapi/linux/netfilter/xt_tcpudp.h | 1 + + include/uapi/linux/netfilter_ipv4.h | 2 + + include/uapi/linux/netfilter_ipv4/ip_tables.h | 1 + + include/uapi/linux/netfilter_ipv6.h | 2 + + include/uapi/linux/netfilter_ipv6/ip6_tables.h | 1 + + include/uapi/linux/netlink.h | 1 + + include/uapi/linux/netlink_diag.h | 1 + + include/uapi/linux/packet_diag.h | 1 + + include/uapi/linux/param.h | 1 + + include/uapi/linux/pfkeyv2.h | 1 + + include/uapi/linux/pkt_cls.h | 15 +- + include/uapi/linux/pkt_sched.h | 198 ++ + include/uapi/linux/posix_types.h | 1 + + include/uapi/linux/rtnetlink.h | 24 + + include/uapi/linux/sctp.h | 71 +- + include/uapi/linux/seg6.h | 5 +- + include/uapi/linux/seg6_genl.h | 1 + + include/uapi/linux/seg6_hmac.h | 1 + + include/uapi/linux/seg6_iptunnel.h | 1 + + include/uapi/linux/seg6_local.h | 12 + + include/uapi/linux/sock_diag.h | 1 + + include/uapi/linux/socket.h | 1 + + include/uapi/linux/sockios.h | 1 + + include/uapi/linux/stddef.h | 1 + + include/uapi/linux/sysinfo.h | 1 + + include/uapi/linux/tc_act/tc_bpf.h | 1 + + include/uapi/linux/tc_act/tc_connmark.h | 1 + + include/uapi/linux/tc_act/tc_csum.h | 1 + + include/uapi/linux/tc_act/tc_defact.h | 1 + + include/uapi/linux/tc_act/tc_gact.h | 1 + + include/uapi/linux/tc_act/tc_ife.h | 1 + + include/uapi/linux/tc_act/tc_ipt.h | 1 + + include/uapi/linux/tc_act/tc_mirred.h | 7 +- + include/uapi/linux/tc_act/tc_nat.h | 1 + + include/uapi/linux/tc_act/tc_pedit.h | 10 +- + include/uapi/linux/tc_act/tc_sample.h | 1 + + include/uapi/linux/tc_act/tc_skbedit.h | 3 + + include/uapi/linux/tc_act/tc_skbmod.h | 1 + + include/uapi/linux/tc_act/tc_tunnel_key.h | 29 + + include/uapi/linux/tc_act/tc_vlan.h | 1 + + include/uapi/linux/tc_ematch/tc_em_cmp.h | 1 + + include/uapi/linux/tc_ematch/tc_em_ipt.h | 20 + + include/uapi/linux/tc_ematch/tc_em_meta.h | 1 + + include/uapi/linux/tc_ematch/tc_em_nbyte.h | 1 + + include/uapi/linux/tcp.h | 22 + + include/uapi/linux/tcp_metrics.h | 1 + + include/uapi/linux/tipc.h | 188 +- + include/uapi/linux/tipc_netlink.h | 37 + + include/uapi/linux/tipc_sockets_diag.h | 17 + + include/uapi/linux/types.h | 3 + + include/uapi/linux/unix_diag.h | 1 + + include/uapi/linux/veth.h | 1 + + include/uapi/linux/vm_sockets_diag.h | 1 + + include/uapi/linux/xfrm.h | 1 + + 114 files changed, 3201 insertions(+), 427 deletions(-) + create mode 100644 include/uapi/linux/btf.h + create mode 100644 include/uapi/linux/tc_ematch/tc_em_ipt.h + create mode 100644 include/uapi/linux/tipc_sockets_diag.h + +diff --git a/include/uapi/linux/atm.h b/include/uapi/linux/atm.h +index 08e27be..e33ff6b 100644 +--- a/include/uapi/linux/atm.h ++++ b/include/uapi/linux/atm.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* atm.h - general ATM declarations */ + + /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ +diff --git a/include/uapi/linux/atmapi.h b/include/uapi/linux/atmapi.h +index 8fe54d9..c9bf5c2 100644 +--- a/include/uapi/linux/atmapi.h ++++ b/include/uapi/linux/atmapi.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* atmapi.h - ATM API user space/kernel compatibility */ + + /* Written 1999,2000 by Werner Almesberger, EPFL ICA */ +diff --git a/include/uapi/linux/atmarp.h b/include/uapi/linux/atmarp.h +index 231f4bd..8e44d12 100644 +--- a/include/uapi/linux/atmarp.h ++++ b/include/uapi/linux/atmarp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */ + + /* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ +diff --git a/include/uapi/linux/atmdev.h b/include/uapi/linux/atmdev.h +index 8faa8b9..9bdb96a 100644 +--- a/include/uapi/linux/atmdev.h ++++ b/include/uapi/linux/atmdev.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* atmdev.h - ATM device driver declarations and various related items */ + + /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ +diff --git a/include/uapi/linux/atmioc.h b/include/uapi/linux/atmioc.h +index 37f67aa..cd7655e 100644 +--- a/include/uapi/linux/atmioc.h ++++ b/include/uapi/linux/atmioc.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* atmioc.h - ranges for ATM-related ioctl numbers */ + + /* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ +diff --git a/include/uapi/linux/atmsap.h b/include/uapi/linux/atmsap.h +index 799b104..fc05248 100644 +--- a/include/uapi/linux/atmsap.h ++++ b/include/uapi/linux/atmsap.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* atmsap.h - ATM Service Access Point addressing definitions */ + + /* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ +diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h +index 0895a52..b9a6367 100644 +--- a/include/uapi/linux/bpf.h ++++ b/include/uapi/linux/bpf.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com + * + * This program is free software; you can redistribute it and/or +@@ -16,7 +17,7 @@ + #define BPF_ALU64 0x07 /* alu mode in double word width */ + + /* ld/ldx fields */ +-#define BPF_DW 0x18 /* double word */ ++#define BPF_DW 0x18 /* double word (64-bit) */ + #define BPF_XADD 0xc0 /* exclusive add */ + + /* alu/jmp fields */ +@@ -92,6 +93,11 @@ enum bpf_cmd { + BPF_PROG_GET_FD_BY_ID, + BPF_MAP_GET_FD_BY_ID, + BPF_OBJ_GET_INFO_BY_FD, ++ BPF_PROG_QUERY, ++ BPF_RAW_TRACEPOINT_OPEN, ++ BPF_BTF_LOAD, ++ BPF_BTF_GET_FD_BY_ID, ++ BPF_TASK_FD_QUERY, + }; + + enum bpf_map_type { +@@ -111,6 +117,9 @@ enum bpf_map_type { + BPF_MAP_TYPE_HASH_OF_MAPS, + BPF_MAP_TYPE_DEVMAP, + BPF_MAP_TYPE_SOCKMAP, ++ BPF_MAP_TYPE_CPUMAP, ++ BPF_MAP_TYPE_XSKMAP, ++ BPF_MAP_TYPE_SOCKHASH, + }; + + enum bpf_prog_type { +@@ -129,6 +138,12 @@ enum bpf_prog_type { + BPF_PROG_TYPE_LWT_XMIT, + BPF_PROG_TYPE_SOCK_OPS, + BPF_PROG_TYPE_SK_SKB, ++ BPF_PROG_TYPE_CGROUP_DEVICE, ++ BPF_PROG_TYPE_SK_MSG, ++ BPF_PROG_TYPE_RAW_TRACEPOINT, ++ BPF_PROG_TYPE_CGROUP_SOCK_ADDR, ++ BPF_PROG_TYPE_LWT_SEG6LOCAL, ++ BPF_PROG_TYPE_LIRC_MODE2, + }; + + enum bpf_attach_type { +@@ -138,16 +153,63 @@ enum bpf_attach_type { + BPF_CGROUP_SOCK_OPS, + BPF_SK_SKB_STREAM_PARSER, + BPF_SK_SKB_STREAM_VERDICT, ++ BPF_CGROUP_DEVICE, ++ BPF_SK_MSG_VERDICT, ++ BPF_CGROUP_INET4_BIND, ++ BPF_CGROUP_INET6_BIND, ++ BPF_CGROUP_INET4_CONNECT, ++ BPF_CGROUP_INET6_CONNECT, ++ BPF_CGROUP_INET4_POST_BIND, ++ BPF_CGROUP_INET6_POST_BIND, ++ BPF_CGROUP_UDP4_SENDMSG, ++ BPF_CGROUP_UDP6_SENDMSG, ++ BPF_LIRC_MODE2, + __MAX_BPF_ATTACH_TYPE + }; + + #define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE + +-/* If BPF_F_ALLOW_OVERRIDE flag is used in BPF_PROG_ATTACH command +- * to the given target_fd cgroup the descendent cgroup will be able to +- * override effective bpf program that was inherited from this cgroup ++/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command ++ * ++ * NONE(default): No further bpf programs allowed in the subtree. ++ * ++ * BPF_F_ALLOW_OVERRIDE: If a sub-cgroup installs some bpf program, ++ * the program in this cgroup yields to sub-cgroup program. ++ * ++ * BPF_F_ALLOW_MULTI: If a sub-cgroup installs some bpf program, ++ * that cgroup program gets run in addition to the program in this cgroup. ++ * ++ * Only one program is allowed to be attached to a cgroup with ++ * NONE or BPF_F_ALLOW_OVERRIDE flag. ++ * Attaching another program on top of NONE or BPF_F_ALLOW_OVERRIDE will ++ * release old program and attach the new one. Attach flags has to match. ++ * ++ * Multiple programs are allowed to be attached to a cgroup with ++ * BPF_F_ALLOW_MULTI flag. They are executed in FIFO order ++ * (those that were attached first, run first) ++ * The programs of sub-cgroup are executed first, then programs of ++ * this cgroup and then programs of parent cgroup. ++ * When children program makes decision (like picking TCP CA or sock bind) ++ * parent program has a chance to override it. ++ * ++ * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups. ++ * A cgroup with NONE doesn't allow any programs in sub-cgroups. ++ * Ex1: ++ * cgrp1 (MULTI progs A, B) -> ++ * cgrp2 (OVERRIDE prog C) -> ++ * cgrp3 (MULTI prog D) -> ++ * cgrp4 (OVERRIDE prog E) -> ++ * cgrp5 (NONE prog F) ++ * the event in cgrp5 triggers execution of F,D,A,B in that order. ++ * if prog F is detached, the execution is E,D,A,B ++ * if prog F and D are detached, the execution is E,A,B ++ * if prog F, E and D are detached, the execution is C,A,B ++ * ++ * All eligible programs are executed regardless of return code from ++ * earlier programs. + */ + #define BPF_F_ALLOW_OVERRIDE (1U << 0) ++#define BPF_F_ALLOW_MULTI (1U << 1) + + /* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the + * verifier will perform strict alignment checking as if the kernel +@@ -156,8 +218,14 @@ enum bpf_attach_type { + */ + #define BPF_F_STRICT_ALIGNMENT (1U << 0) + ++/* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */ + #define BPF_PSEUDO_MAP_FD 1 + ++/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative ++ * offset to another bpf function ++ */ ++#define BPF_PSEUDO_CALL 1 ++ + /* flags for BPF_MAP_UPDATE_ELEM command */ + #define BPF_ANY 0 /* create new element or update existing */ + #define BPF_NOEXIST 1 /* create new element if it didn't exist */ +@@ -175,6 +243,37 @@ enum bpf_attach_type { + /* Specify numa node during map creation */ + #define BPF_F_NUMA_NODE (1U << 2) + ++/* flags for BPF_PROG_QUERY */ ++#define BPF_F_QUERY_EFFECTIVE (1U << 0) ++ ++#define BPF_OBJ_NAME_LEN 16U ++ ++/* Flags for accessing BPF object */ ++#define BPF_F_RDONLY (1U << 3) ++#define BPF_F_WRONLY (1U << 4) ++ ++/* Flag for stack_map, store build_id+offset instead of pointer */ ++#define BPF_F_STACK_BUILD_ID (1U << 5) ++ ++enum bpf_stack_build_id_status { ++ /* user space need an empty entry to identify end of a trace */ ++ BPF_STACK_BUILD_ID_EMPTY = 0, ++ /* with valid build_id and offset */ ++ BPF_STACK_BUILD_ID_VALID = 1, ++ /* couldn't get build_id, fallback to ip */ ++ BPF_STACK_BUILD_ID_IP = 2, ++}; ++ ++#define BPF_BUILD_ID_SIZE 20 ++struct bpf_stack_build_id { ++ __s32 status; ++ unsigned char build_id[BPF_BUILD_ID_SIZE]; ++ union { ++ __u64 offset; ++ __u64 ip; ++ }; ++}; ++ + union bpf_attr { + struct { /* anonymous struct used by BPF_MAP_CREATE command */ + __u32 map_type; /* one of enum bpf_map_type */ +@@ -188,6 +287,11 @@ union bpf_attr { + __u32 numa_node; /* numa node (effective only if + * BPF_F_NUMA_NODE is set). + */ ++ char map_name[BPF_OBJ_NAME_LEN]; ++ __u32 map_ifindex; /* ifindex of netdev to create on */ ++ __u32 btf_fd; /* fd pointing to a BTF type data */ ++ __u32 btf_key_type_id; /* BTF type_id of the key */ ++ __u32 btf_value_type_id; /* BTF type_id of the value */ + }; + + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ +@@ -210,11 +314,19 @@ union bpf_attr { + __aligned_u64 log_buf; /* user supplied buffer */ + __u32 kern_version; /* checked when prog_type=kprobe */ + __u32 prog_flags; ++ char prog_name[BPF_OBJ_NAME_LEN]; ++ __u32 prog_ifindex; /* ifindex of netdev to prep for */ ++ /* For some prog types expected attach type must be known at ++ * load time to verify attach type specific parts of prog ++ * (context accesses, allowed helpers, etc). ++ */ ++ __u32 expected_attach_type; + }; + + struct { /* anonymous struct used by BPF_OBJ_* commands */ + __aligned_u64 pathname; + __u32 bpf_fd; ++ __u32 file_flags; + }; + + struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ +@@ -240,8 +352,10 @@ union bpf_attr { + __u32 start_id; + __u32 prog_id; + __u32 map_id; ++ __u32 btf_id; + }; + __u32 next_id; ++ __u32 open_flags; + }; + + struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ +@@ -249,339 +363,1718 @@ union bpf_attr { + __u32 info_len; + __aligned_u64 info; + } info; ++ ++ struct { /* anonymous struct used by BPF_PROG_QUERY command */ ++ __u32 target_fd; /* container object to query */ ++ __u32 attach_type; ++ __u32 query_flags; ++ __u32 attach_flags; ++ __aligned_u64 prog_ids; ++ __u32 prog_cnt; ++ } query; ++ ++ struct { ++ __u64 name; ++ __u32 prog_fd; ++ } raw_tracepoint; ++ ++ struct { /* anonymous struct for BPF_BTF_LOAD */ ++ __aligned_u64 btf; ++ __aligned_u64 btf_log_buf; ++ __u32 btf_size; ++ __u32 btf_log_size; ++ __u32 btf_log_level; ++ }; ++ ++ struct { ++ __u32 pid; /* input: pid */ ++ __u32 fd; /* input: fd */ ++ __u32 flags; /* input: flags */ ++ __u32 buf_len; /* input/output: buf len */ ++ __aligned_u64 buf; /* input/output: ++ * tp_name for tracepoint ++ * symbol for kprobe ++ * filename for uprobe ++ */ ++ __u32 prog_id; /* output: prod_id */ ++ __u32 fd_type; /* output: BPF_FD_TYPE_* */ ++ __u64 probe_offset; /* output: probe_offset */ ++ __u64 probe_addr; /* output: probe_addr */ ++ } task_fd_query; + } __attribute__((aligned(8))); + +-/* BPF helper function descriptions: ++/* The description below is an attempt at providing documentation to eBPF ++ * developers about the multiple available eBPF helper functions. It can be ++ * parsed and used to produce a manual page. The workflow is the following, ++ * and requires the rst2man utility: ++ * ++ * $ ./scripts/bpf_helpers_doc.py \ ++ * --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst ++ * $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7 ++ * $ man /tmp/bpf-helpers.7 ++ * ++ * Note that in order to produce this external documentation, some RST ++ * formatting is used in the descriptions to get "bold" and "italics" in ++ * manual pages. Also note that the few trailing white spaces are ++ * intentional, removing them would break paragraphs for rst2man. ++ * ++ * Start of BPF helper function descriptions: ++ * ++ * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key) ++ * Description ++ * Perform a lookup in *map* for an entry associated to *key*. ++ * Return ++ * Map value associated to *key*, or **NULL** if no entry was ++ * found. + * +- * void *bpf_map_lookup_elem(&map, &key) +- * Return: Map value or NULL ++ * int bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags) ++ * Description ++ * Add or update the value of the entry associated to *key* in ++ * *map* with *value*. *flags* is one of: + * +- * int bpf_map_update_elem(&map, &key, &value, flags) +- * Return: 0 on success or negative error ++ * **BPF_NOEXIST** ++ * The entry for *key* must not exist in the map. ++ * **BPF_EXIST** ++ * The entry for *key* must already exist in the map. ++ * **BPF_ANY** ++ * No condition on the existence of the entry for *key*. + * +- * int bpf_map_delete_elem(&map, &key) +- * Return: 0 on success or negative error ++ * Flag value **BPF_NOEXIST** cannot be used for maps of types ++ * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all ++ * elements always exist), the helper would return an error. ++ * Return ++ * 0 on success, or a negative error in case of failure. + * +- * int bpf_probe_read(void *dst, int size, void *src) +- * Return: 0 on success or negative error ++ * int bpf_map_delete_elem(struct bpf_map *map, const void *key) ++ * Description ++ * Delete entry with *key* from *map*. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_probe_read(void *dst, u32 size, const void *src) ++ * Description ++ * For tracing programs, safely attempt to read *size* bytes from ++ * address *src* and store the data in *dst*. ++ * Return ++ * 0 on success, or a negative error in case of failure. + * + * u64 bpf_ktime_get_ns(void) +- * Return: current ktime +- * +- * int bpf_trace_printk(const char *fmt, int fmt_size, ...) +- * Return: length of buffer written or negative error +- * +- * u32 bpf_prandom_u32(void) +- * Return: random value +- * +- * u32 bpf_raw_smp_processor_id(void) +- * Return: SMP processor ID +- * +- * int bpf_skb_store_bytes(skb, offset, from, len, flags) +- * store bytes into packet +- * @skb: pointer to skb +- * @offset: offset within packet from skb->mac_header +- * @from: pointer where to copy bytes from +- * @len: number of bytes to store into packet +- * @flags: bit 0 - if true, recompute skb->csum +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * int bpf_l3_csum_replace(skb, offset, from, to, flags) +- * recompute IP checksum +- * @skb: pointer to skb +- * @offset: offset within packet where IP checksum is located +- * @from: old value of header field +- * @to: new value of header field +- * @flags: bits 0-3 - size of header field +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * int bpf_l4_csum_replace(skb, offset, from, to, flags) +- * recompute TCP/UDP checksum +- * @skb: pointer to skb +- * @offset: offset within packet where TCP/UDP checksum is located +- * @from: old value of header field +- * @to: new value of header field +- * @flags: bits 0-3 - size of header field +- * bit 4 - is pseudo header +- * other bits - reserved +- * Return: 0 on success or negative error +- * +- * int bpf_tail_call(ctx, prog_array_map, index) +- * jump into another BPF program +- * @ctx: context pointer passed to next program +- * @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY +- * @index: index inside array that selects specific program to run +- * Return: 0 on success or negative error +- * +- * int bpf_clone_redirect(skb, ifindex, flags) +- * redirect to another netdev +- * @skb: pointer to skb +- * @ifindex: ifindex of the net device +- * @flags: bit 0 - if set, redirect to ingress instead of egress +- * other bits - reserved +- * Return: 0 on success or negative error ++ * Description ++ * Return the time elapsed since system boot, in nanoseconds. ++ * Return ++ * Current *ktime*. ++ * ++ * int bpf_trace_printk(const char *fmt, u32 fmt_size, ...) ++ * Description ++ * This helper is a "printk()-like" facility for debugging. It ++ * prints a message defined by format *fmt* (of size *fmt_size*) ++ * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if ++ * available. It can take up to three additional **u64** ++ * arguments (as an eBPF helpers, the total number of arguments is ++ * limited to five). ++ * ++ * Each time the helper is called, it appends a line to the trace. ++ * The format of the trace is customizable, and the exact output ++ * one will get depends on the options set in ++ * *\/sys/kernel/debug/tracing/trace_options* (see also the ++ * *README* file under the same directory). However, it usually ++ * defaults to something like: ++ * ++ * :: ++ * ++ * telnet-470 [001] .N.. 419421.045894: 0x00000001: ++ * ++ * In the above: ++ * ++ * * ``telnet`` is the name of the current task. ++ * * ``470`` is the PID of the current task. ++ * * ``001`` is the CPU number on which the task is ++ * running. ++ * * In ``.N..``, each character refers to a set of ++ * options (whether irqs are enabled, scheduling ++ * options, whether hard/softirqs are running, level of ++ * preempt_disabled respectively). **N** means that ++ * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** ++ * are set. ++ * * ``419421.045894`` is a timestamp. ++ * * ``0x00000001`` is a fake value used by BPF for the ++ * instruction pointer register. ++ * * ```` is the message formatted with ++ * *fmt*. ++ * ++ * The conversion specifiers supported by *fmt* are similar, but ++ * more limited than for printk(). They are **%d**, **%i**, ++ * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, ++ * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size ++ * of field, padding with zeroes, etc.) is available, and the ++ * helper will return **-EINVAL** (but print nothing) if it ++ * encounters an unknown specifier. ++ * ++ * Also, note that **bpf_trace_printk**\ () is slow, and should ++ * only be used for debugging purposes. For this reason, a notice ++ * bloc (spanning several lines) is printed to kernel logs and ++ * states that the helper should not be used "for production use" ++ * the first time this helper is used (or more precisely, when ++ * **trace_printk**\ () buffers are allocated). For passing values ++ * to user space, perf events should be preferred. ++ * Return ++ * The number of bytes written to the buffer, or a negative error ++ * in case of failure. ++ * ++ * u32 bpf_get_prandom_u32(void) ++ * Description ++ * Get a pseudo-random number. ++ * ++ * From a security point of view, this helper uses its own ++ * pseudo-random internal state, and cannot be used to infer the ++ * seed of other random functions in the kernel. However, it is ++ * essential to note that the generator used by the helper is not ++ * cryptographically secure. ++ * Return ++ * A random 32-bit unsigned value. ++ * ++ * u32 bpf_get_smp_processor_id(void) ++ * Description ++ * Get the SMP (symmetric multiprocessing) processor id. Note that ++ * all programs run with preemption disabled, which means that the ++ * SMP processor id is stable during all the execution of the ++ * program. ++ * Return ++ * The SMP id of the processor running the program. ++ * ++ * int bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags) ++ * Description ++ * Store *len* bytes from address *from* into the packet ++ * associated to *skb*, at *offset*. *flags* are a combination of ++ * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the ++ * checksum for the packet after storing the bytes) and ++ * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ ++ * **->swhash** and *skb*\ **->l4hash** to 0). ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size) ++ * Description ++ * Recompute the layer 3 (e.g. IP) checksum for the packet ++ * associated to *skb*. Computation is incremental, so the helper ++ * must know the former value of the header field that was ++ * modified (*from*), the new value of this field (*to*), and the ++ * number of bytes (2 or 4) for this field, stored in *size*. ++ * Alternatively, it is possible to store the difference between ++ * the previous and the new values of the header field in *to*, by ++ * setting *from* and *size* to 0. For both methods, *offset* ++ * indicates the location of the IP checksum within the packet. ++ * ++ * This helper works in combination with **bpf_csum_diff**\ (), ++ * which does not update the checksum in-place, but offers more ++ * flexibility and can handle sizes larger than 2 or 4 for the ++ * checksum to update. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags) ++ * Description ++ * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the ++ * packet associated to *skb*. Computation is incremental, so the ++ * helper must know the former value of the header field that was ++ * modified (*from*), the new value of this field (*to*), and the ++ * number of bytes (2 or 4) for this field, stored on the lowest ++ * four bits of *flags*. Alternatively, it is possible to store ++ * the difference between the previous and the new values of the ++ * header field in *to*, by setting *from* and the four lowest ++ * bits of *flags* to 0. For both methods, *offset* indicates the ++ * location of the IP checksum within the packet. In addition to ++ * the size of the field, *flags* can be added (bitwise OR) actual ++ * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left ++ * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and ++ * for updates resulting in a null checksum the value is set to ++ * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates ++ * the checksum is to be computed against a pseudo-header. ++ * ++ * This helper works in combination with **bpf_csum_diff**\ (), ++ * which does not update the checksum in-place, but offers more ++ * flexibility and can handle sizes larger than 2 or 4 for the ++ * checksum to update. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index) ++ * Description ++ * This special helper is used to trigger a "tail call", or in ++ * other words, to jump into another eBPF program. The same stack ++ * frame is used (but values on stack and in registers for the ++ * caller are not accessible to the callee). This mechanism allows ++ * for program chaining, either for raising the maximum number of ++ * available eBPF instructions, or to execute given programs in ++ * conditional blocks. For security reasons, there is an upper ++ * limit to the number of successive tail calls that can be ++ * performed. ++ * ++ * Upon call of this helper, the program attempts to jump into a ++ * program referenced at index *index* in *prog_array_map*, a ++ * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes ++ * *ctx*, a pointer to the context. ++ * ++ * If the call succeeds, the kernel immediately runs the first ++ * instruction of the new program. This is not a function call, ++ * and it never returns to the previous program. If the call ++ * fails, then the helper has no effect, and the caller continues ++ * to run its subsequent instructions. A call can fail if the ++ * destination program for the jump does not exist (i.e. *index* ++ * is superior to the number of entries in *prog_array_map*), or ++ * if the maximum number of tail calls has been reached for this ++ * chain of programs. This limit is defined in the kernel by the ++ * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), ++ * which is currently set to 32. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags) ++ * Description ++ * Clone and redirect the packet associated to *skb* to another ++ * net device of index *ifindex*. Both ingress and egress ++ * interfaces can be used for redirection. The **BPF_F_INGRESS** ++ * value in *flags* is used to make the distinction (ingress path ++ * is selected if the flag is present, egress path otherwise). ++ * This is the only flag supported for now. ++ * ++ * In comparison with **bpf_redirect**\ () helper, ++ * **bpf_clone_redirect**\ () has the associated cost of ++ * duplicating the packet buffer, but this can be executed out of ++ * the eBPF program. Conversely, **bpf_redirect**\ () is more ++ * efficient, but it is handled through an action code where the ++ * redirection happens only after the eBPF program has returned. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_current_pid_tgid(void) +- * Return: current->tgid << 32 | current->pid ++ * Return ++ * A 64-bit integer containing the current tgid and pid, and ++ * created as such: ++ * *current_task*\ **->tgid << 32 \|** ++ * *current_task*\ **->pid**. + * + * u64 bpf_get_current_uid_gid(void) +- * Return: current_gid << 32 | current_uid +- * +- * int bpf_get_current_comm(char *buf, int size_of_buf) +- * stores current->comm into buf +- * Return: 0 on success or negative error +- * +- * u32 bpf_get_cgroup_classid(skb) +- * retrieve a proc's classid +- * @skb: pointer to skb +- * Return: classid if != 0 +- * +- * int bpf_skb_vlan_push(skb, vlan_proto, vlan_tci) +- * Return: 0 on success or negative error +- * +- * int bpf_skb_vlan_pop(skb) +- * Return: 0 on success or negative error +- * +- * int bpf_skb_get_tunnel_key(skb, key, size, flags) +- * int bpf_skb_set_tunnel_key(skb, key, size, flags) +- * retrieve or populate tunnel metadata +- * @skb: pointer to skb +- * @key: pointer to 'struct bpf_tunnel_key' +- * @size: size of 'struct bpf_tunnel_key' +- * @flags: room for future extensions +- * Return: 0 on success or negative error +- * +- * u64 bpf_perf_event_read(map, flags) +- * read perf event counter value +- * @map: pointer to perf_event_array map +- * @flags: index of event in the map or bitmask flags +- * Return: value of perf event counter read or error code +- * +- * int bpf_redirect(ifindex, flags) +- * redirect to another netdev +- * @ifindex: ifindex of the net device +- * @flags: +- * cls_bpf: +- * bit 0 - if set, redirect to ingress instead of egress +- * other bits - reserved +- * xdp_bpf: +- * all bits - reserved +- * Return: cls_bpf: TC_ACT_REDIRECT on success or TC_ACT_SHOT on error +- * xdp_bfp: XDP_REDIRECT on success or XDP_ABORT on error +- * int bpf_redirect_map(map, key, flags) +- * redirect to endpoint in map +- * @map: pointer to dev map +- * @key: index in map to lookup +- * @flags: -- +- * Return: XDP_REDIRECT on success or XDP_ABORT on error +- * +- * u32 bpf_get_route_realm(skb) +- * retrieve a dst's tclassid +- * @skb: pointer to skb +- * Return: realm if != 0 +- * +- * int bpf_perf_event_output(ctx, map, flags, data, size) +- * output perf raw sample +- * @ctx: struct pt_regs* +- * @map: pointer to perf_event_array map +- * @flags: index of event in the map or bitmask flags +- * @data: data on stack to be output as raw data +- * @size: size of data +- * Return: 0 on success or negative error +- * +- * int bpf_get_stackid(ctx, map, flags) +- * walk user or kernel stack and return id +- * @ctx: struct pt_regs* +- * @map: pointer to stack_trace map +- * @flags: bits 0-7 - numer of stack frames to skip +- * bit 8 - collect user stack instead of kernel +- * bit 9 - compare stacks by hash only +- * bit 10 - if two different stacks hash into the same stackid +- * discard old +- * other bits - reserved +- * Return: >= 0 stackid on success or negative error +- * +- * s64 bpf_csum_diff(from, from_size, to, to_size, seed) +- * calculate csum diff +- * @from: raw from buffer +- * @from_size: length of from buffer +- * @to: raw to buffer +- * @to_size: length of to buffer +- * @seed: optional seed +- * Return: csum result or negative error code +- * +- * int bpf_skb_get_tunnel_opt(skb, opt, size) +- * retrieve tunnel options metadata +- * @skb: pointer to skb +- * @opt: pointer to raw tunnel option data +- * @size: size of @opt +- * Return: option size +- * +- * int bpf_skb_set_tunnel_opt(skb, opt, size) +- * populate tunnel options metadata +- * @skb: pointer to skb +- * @opt: pointer to raw tunnel option data +- * @size: size of @opt +- * Return: 0 on success or negative error +- * +- * int bpf_skb_change_proto(skb, proto, flags) +- * Change protocol of the skb. Currently supported is v4 -> v6, +- * v6 -> v4 transitions. The helper will also resize the skb. eBPF +- * program is expected to fill the new headers via skb_store_bytes +- * and lX_csum_replace. +- * @skb: pointer to skb +- * @proto: new skb->protocol type +- * @flags: reserved +- * Return: 0 on success or negative error +- * +- * int bpf_skb_change_type(skb, type) +- * Change packet type of skb. +- * @skb: pointer to skb +- * @type: new skb->pkt_type type +- * Return: 0 on success or negative error +- * +- * int bpf_skb_under_cgroup(skb, map, index) +- * Check cgroup2 membership of skb +- * @skb: pointer to skb +- * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type +- * @index: index of the cgroup in the bpf_map +- * Return: +- * == 0 skb failed the cgroup2 descendant test +- * == 1 skb succeeded the cgroup2 descendant test +- * < 0 error +- * +- * u32 bpf_get_hash_recalc(skb) +- * Retrieve and possibly recalculate skb->hash. +- * @skb: pointer to skb +- * Return: hash ++ * Return ++ * A 64-bit integer containing the current GID and UID, and ++ * created as such: *current_gid* **<< 32 \|** *current_uid*. ++ * ++ * int bpf_get_current_comm(char *buf, u32 size_of_buf) ++ * Description ++ * Copy the **comm** attribute of the current task into *buf* of ++ * *size_of_buf*. The **comm** attribute contains the name of ++ * the executable (excluding the path) for the current task. The ++ * *size_of_buf* must be strictly positive. On success, the ++ * helper makes sure that the *buf* is NUL-terminated. On failure, ++ * it is filled with zeroes. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * u32 bpf_get_cgroup_classid(struct sk_buff *skb) ++ * Description ++ * Retrieve the classid for the current task, i.e. for the net_cls ++ * cgroup to which *skb* belongs. ++ * ++ * This helper can be used on TC egress path, but not on ingress. ++ * ++ * The net_cls cgroup provides an interface to tag network packets ++ * based on a user-provided identifier for all traffic coming from ++ * the tasks belonging to the related cgroup. See also the related ++ * kernel documentation, available from the Linux sources in file ++ * *Documentation/cgroup-v1/net_cls.txt*. ++ * ++ * The Linux kernel has two versions for cgroups: there are ++ * cgroups v1 and cgroups v2. Both are available to users, who can ++ * use a mixture of them, but note that the net_cls cgroup is for ++ * cgroup v1 only. This makes it incompatible with BPF programs ++ * run on cgroups, which is a cgroup-v2-only feature (a socket can ++ * only hold data for one version of cgroups at a time). ++ * ++ * This helper is only available is the kernel was compiled with ++ * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to ++ * "**y**" or to "**m**". ++ * Return ++ * The classid, or 0 for the default unconfigured classid. ++ * ++ * int bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) ++ * Description ++ * Push a *vlan_tci* (VLAN tag control information) of protocol ++ * *vlan_proto* to the packet associated to *skb*, then update ++ * the checksum. Note that if *vlan_proto* is different from ++ * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to ++ * be **ETH_P_8021Q**. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_vlan_pop(struct sk_buff *skb) ++ * Description ++ * Pop a VLAN header from the packet associated to *skb*. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) ++ * Description ++ * Get tunnel metadata. This helper takes a pointer *key* to an ++ * empty **struct bpf_tunnel_key** of **size**, that will be ++ * filled with tunnel metadata for the packet associated to *skb*. ++ * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which ++ * indicates that the tunnel is based on IPv6 protocol instead of ++ * IPv4. ++ * ++ * The **struct bpf_tunnel_key** is an object that generalizes the ++ * principal parameters used by various tunneling protocols into a ++ * single struct. This way, it can be used to easily make a ++ * decision based on the contents of the encapsulation header, ++ * "summarized" in this struct. In particular, it holds the IP ++ * address of the remote end (IPv4 or IPv6, depending on the case) ++ * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, ++ * this struct exposes the *key*\ **->tunnel_id**, which is ++ * generally mapped to a VNI (Virtual Network Identifier), making ++ * it programmable together with the **bpf_skb_set_tunnel_key**\ ++ * () helper. ++ * ++ * Let's imagine that the following code is part of a program ++ * attached to the TC ingress interface, on one end of a GRE ++ * tunnel, and is supposed to filter out all messages coming from ++ * remote ends with IPv4 address other than 10.0.0.1: ++ * ++ * :: ++ * ++ * int ret; ++ * struct bpf_tunnel_key key = {}; ++ * ++ * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); ++ * if (ret < 0) ++ * return TC_ACT_SHOT; // drop packet ++ * ++ * if (key.remote_ipv4 != 0x0a000001) ++ * return TC_ACT_SHOT; // drop packet ++ * ++ * return TC_ACT_OK; // accept packet ++ * ++ * This interface can also be used with all encapsulation devices ++ * that can operate in "collect metadata" mode: instead of having ++ * one network device per specific configuration, the "collect ++ * metadata" mode only requires a single device where the ++ * configuration can be extracted from this helper. ++ * ++ * This can be used together with various tunnels such as VXLan, ++ * Geneve, GRE or IP in IP (IPIP). ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) ++ * Description ++ * Populate tunnel metadata for packet associated to *skb.* The ++ * tunnel metadata is set to the contents of *key*, of *size*. The ++ * *flags* can be set to a combination of the following values: ++ * ++ * **BPF_F_TUNINFO_IPV6** ++ * Indicate that the tunnel is based on IPv6 protocol ++ * instead of IPv4. ++ * **BPF_F_ZERO_CSUM_TX** ++ * For IPv4 packets, add a flag to tunnel metadata ++ * indicating that checksum computation should be skipped ++ * and checksum set to zeroes. ++ * **BPF_F_DONT_FRAGMENT** ++ * Add a flag to tunnel metadata indicating that the ++ * packet should not be fragmented. ++ * **BPF_F_SEQ_NUMBER** ++ * Add a flag to tunnel metadata indicating that a ++ * sequence number should be added to tunnel header before ++ * sending the packet. This flag was added for GRE ++ * encapsulation, but might be used with other protocols ++ * as well in the future. ++ * ++ * Here is a typical usage on the transmit path: ++ * ++ * :: ++ * ++ * struct bpf_tunnel_key key; ++ * populate key ... ++ * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); ++ * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); ++ * ++ * See also the description of the **bpf_skb_get_tunnel_key**\ () ++ * helper for additional information. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags) ++ * Description ++ * Read the value of a perf event counter. This helper relies on a ++ * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of ++ * the perf event counter is selected when *map* is updated with ++ * perf event file descriptors. The *map* is an array whose size ++ * is the number of available CPUs, and each cell contains a value ++ * relative to one CPU. The value to retrieve is indicated by ++ * *flags*, that contains the index of the CPU to look up, masked ++ * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to ++ * **BPF_F_CURRENT_CPU** to indicate that the value for the ++ * current CPU should be retrieved. ++ * ++ * Note that before Linux 4.13, only hardware perf event can be ++ * retrieved. ++ * ++ * Also, be aware that the newer helper ++ * **bpf_perf_event_read_value**\ () is recommended over ++ * **bpf_perf_event_read**\ () in general. The latter has some ABI ++ * quirks where error and counter value are used as a return code ++ * (which is wrong to do since ranges may overlap). This issue is ++ * fixed with **bpf_perf_event_read_value**\ (), which at the same ++ * time provides more features over the **bpf_perf_event_read**\ ++ * () interface. Please refer to the description of ++ * **bpf_perf_event_read_value**\ () for details. ++ * Return ++ * The value of the perf event counter read from the map, or a ++ * negative error code in case of failure. ++ * ++ * int bpf_redirect(u32 ifindex, u64 flags) ++ * Description ++ * Redirect the packet to another net device of index *ifindex*. ++ * This helper is somewhat similar to **bpf_clone_redirect**\ ++ * (), except that the packet is not cloned, which provides ++ * increased performance. ++ * ++ * Except for XDP, both ingress and egress interfaces can be used ++ * for redirection. The **BPF_F_INGRESS** value in *flags* is used ++ * to make the distinction (ingress path is selected if the flag ++ * is present, egress path otherwise). Currently, XDP only ++ * supports redirection to the egress interface, and accepts no ++ * flag at all. ++ * ++ * The same effect can be attained with the more generic ++ * **bpf_redirect_map**\ (), which requires specific maps to be ++ * used but offers better performance. ++ * Return ++ * For XDP, the helper returns **XDP_REDIRECT** on success or ++ * **XDP_ABORTED** on error. For other program types, the values ++ * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on ++ * error. ++ * ++ * u32 bpf_get_route_realm(struct sk_buff *skb) ++ * Description ++ * Retrieve the realm or the route, that is to say the ++ * **tclassid** field of the destination for the *skb*. The ++ * indentifier retrieved is a user-provided tag, similar to the ++ * one used with the net_cls cgroup (see description for ++ * **bpf_get_cgroup_classid**\ () helper), but here this tag is ++ * held by a route (a destination entry), not by a task. ++ * ++ * Retrieving this identifier works with the clsact TC egress hook ++ * (see also **tc-bpf(8)**), or alternatively on conventional ++ * classful egress qdiscs, but not on TC ingress path. In case of ++ * clsact TC egress hook, this has the advantage that, internally, ++ * the destination entry has not been dropped yet in the transmit ++ * path. Therefore, the destination entry does not need to be ++ * artificially held via **netif_keep_dst**\ () for a classful ++ * qdisc until the *skb* is freed. ++ * ++ * This helper is available only if the kernel was compiled with ++ * **CONFIG_IP_ROUTE_CLASSID** configuration option. ++ * Return ++ * The realm of the route for the packet associated to *skb*, or 0 ++ * if none was found. ++ * ++ * int bpf_perf_event_output(struct pt_reg *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) ++ * Description ++ * Write raw *data* blob into a special BPF perf event held by ++ * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf ++ * event must have the following attributes: **PERF_SAMPLE_RAW** ++ * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and ++ * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. ++ * ++ * The *flags* are used to indicate the index in *map* for which ++ * the value must be put, masked with **BPF_F_INDEX_MASK**. ++ * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** ++ * to indicate that the index of the current CPU core should be ++ * used. ++ * ++ * The value to write, of *size*, is passed through eBPF stack and ++ * pointed by *data*. ++ * ++ * The context of the program *ctx* needs also be passed to the ++ * helper. ++ * ++ * On user space, a program willing to read the values needs to ++ * call **perf_event_open**\ () on the perf event (either for ++ * one or for all CPUs) and to store the file descriptor into the ++ * *map*. This must be done before the eBPF program can send data ++ * into it. An example is available in file ++ * *samples/bpf/trace_output_user.c* in the Linux kernel source ++ * tree (the eBPF program counterpart is in ++ * *samples/bpf/trace_output_kern.c*). ++ * ++ * **bpf_perf_event_output**\ () achieves better performance ++ * than **bpf_trace_printk**\ () for sharing data with user ++ * space, and is much better suitable for streaming data from eBPF ++ * programs. ++ * ++ * Note that this helper is not restricted to tracing use cases ++ * and can be used with programs attached to TC or XDP as well, ++ * where it allows for passing data to user space listeners. Data ++ * can be: ++ * ++ * * Only custom structs, ++ * * Only the packet payload, or ++ * * A combination of both. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_load_bytes(const struct sk_buff *skb, u32 offset, void *to, u32 len) ++ * Description ++ * This helper was provided as an easy way to load data from a ++ * packet. It can be used to load *len* bytes from *offset* from ++ * the packet associated to *skb*, into the buffer pointed by ++ * *to*. ++ * ++ * Since Linux 4.7, usage of this helper has mostly been replaced ++ * by "direct packet access", enabling packet data to be ++ * manipulated with *skb*\ **->data** and *skb*\ **->data_end** ++ * pointing respectively to the first byte of packet data and to ++ * the byte after the last byte of packet data. However, it ++ * remains useful if one wishes to read large quantities of data ++ * at once from a packet into the eBPF stack. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_get_stackid(struct pt_reg *ctx, struct bpf_map *map, u64 flags) ++ * Description ++ * Walk a user or a kernel stack and return its id. To achieve ++ * this, the helper needs *ctx*, which is a pointer to the context ++ * on which the tracing program is executed, and a pointer to a ++ * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. ++ * ++ * The last argument, *flags*, holds the number of stack frames to ++ * skip (from 0 to 255), masked with ++ * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set ++ * a combination of the following flags: ++ * ++ * **BPF_F_USER_STACK** ++ * Collect a user space stack instead of a kernel stack. ++ * **BPF_F_FAST_STACK_CMP** ++ * Compare stacks by hash only. ++ * **BPF_F_REUSE_STACKID** ++ * If two different stacks hash into the same *stackid*, ++ * discard the old one. ++ * ++ * The stack id retrieved is a 32 bit long integer handle which ++ * can be further combined with other data (including other stack ++ * ids) and used as a key into maps. This can be useful for ++ * generating a variety of graphs (such as flame graphs or off-cpu ++ * graphs). ++ * ++ * For walking a stack, this helper is an improvement over ++ * **bpf_probe_read**\ (), which can be used with unrolled loops ++ * but is not efficient and consumes a lot of eBPF instructions. ++ * Instead, **bpf_get_stackid**\ () can collect up to ++ * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that ++ * this limit can be controlled with the **sysctl** program, and ++ * that it should be manually increased in order to profile long ++ * user stacks (such as stacks for Java programs). To do so, use: ++ * ++ * :: ++ * ++ * # sysctl kernel.perf_event_max_stack= ++ * Return ++ * The positive or null stack id on success, or a negative error ++ * in case of failure. ++ * ++ * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed) ++ * Description ++ * Compute a checksum difference, from the raw buffer pointed by ++ * *from*, of length *from_size* (that must be a multiple of 4), ++ * towards the raw buffer pointed by *to*, of size *to_size* ++ * (same remark). An optional *seed* can be added to the value ++ * (this can be cascaded, the seed may come from a previous call ++ * to the helper). ++ * ++ * This is flexible enough to be used in several ways: ++ * ++ * * With *from_size* == 0, *to_size* > 0 and *seed* set to ++ * checksum, it can be used when pushing new data. ++ * * With *from_size* > 0, *to_size* == 0 and *seed* set to ++ * checksum, it can be used when removing data from a packet. ++ * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it ++ * can be used to compute a diff. Note that *from_size* and ++ * *to_size* do not need to be equal. ++ * ++ * This helper can be used in combination with ++ * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to ++ * which one can feed in the difference computed with ++ * **bpf_csum_diff**\ (). ++ * Return ++ * The checksum result, or a negative error code in case of ++ * failure. ++ * ++ * int bpf_skb_get_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size) ++ * Description ++ * Retrieve tunnel options metadata for the packet associated to ++ * *skb*, and store the raw tunnel option data to the buffer *opt* ++ * of *size*. ++ * ++ * This helper can be used with encapsulation devices that can ++ * operate in "collect metadata" mode (please refer to the related ++ * note in the description of **bpf_skb_get_tunnel_key**\ () for ++ * more details). A particular example where this can be used is ++ * in combination with the Geneve encapsulation protocol, where it ++ * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) ++ * and retrieving arbitrary TLVs (Type-Length-Value headers) from ++ * the eBPF program. This allows for full customization of these ++ * headers. ++ * Return ++ * The size of the option data retrieved. ++ * ++ * int bpf_skb_set_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size) ++ * Description ++ * Set tunnel options metadata for the packet associated to *skb* ++ * to the option data contained in the raw buffer *opt* of *size*. ++ * ++ * See also the description of the **bpf_skb_get_tunnel_opt**\ () ++ * helper for additional information. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags) ++ * Description ++ * Change the protocol of the *skb* to *proto*. Currently ++ * supported are transition from IPv4 to IPv6, and from IPv6 to ++ * IPv4. The helper takes care of the groundwork for the ++ * transition, including resizing the socket buffer. The eBPF ++ * program is expected to fill the new headers, if any, via ++ * **skb_store_bytes**\ () and to recompute the checksums with ++ * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ ++ * (). The main case for this helper is to perform NAT64 ++ * operations out of an eBPF program. ++ * ++ * Internally, the GSO type is marked as dodgy so that headers are ++ * checked and segments are recalculated by the GSO/GRO engine. ++ * The size for GSO target is adapted as well. ++ * ++ * All values for *flags* are reserved for future usage, and must ++ * be left at zero. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_change_type(struct sk_buff *skb, u32 type) ++ * Description ++ * Change the packet type for the packet associated to *skb*. This ++ * comes down to setting *skb*\ **->pkt_type** to *type*, except ++ * the eBPF program does not have a write access to *skb*\ ++ * **->pkt_type** beside this helper. Using a helper here allows ++ * for graceful handling of errors. ++ * ++ * The major use case is to change incoming *skb*s to ++ * **PACKET_HOST** in a programmatic way instead of having to ++ * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for ++ * example. ++ * ++ * Note that *type* only allows certain values. At this time, they ++ * are: ++ * ++ * **PACKET_HOST** ++ * Packet is for us. ++ * **PACKET_BROADCAST** ++ * Send packet to all. ++ * **PACKET_MULTICAST** ++ * Send packet to group. ++ * **PACKET_OTHERHOST** ++ * Send packet to someone else. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index) ++ * Description ++ * Check whether *skb* is a descendant of the cgroup2 held by ++ * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. ++ * Return ++ * The return value depends on the result of the test, and can be: ++ * ++ * * 0, if the *skb* failed the cgroup2 descendant test. ++ * * 1, if the *skb* succeeded the cgroup2 descendant test. ++ * * A negative error code, if an error occurred. ++ * ++ * u32 bpf_get_hash_recalc(struct sk_buff *skb) ++ * Description ++ * Retrieve the hash of the packet, *skb*\ **->hash**. If it is ++ * not set, in particular if the hash was cleared due to mangling, ++ * recompute this hash. Later accesses to the hash can be done ++ * directly with *skb*\ **->hash**. ++ * ++ * Calling **bpf_set_hash_invalid**\ (), changing a packet ++ * prototype with **bpf_skb_change_proto**\ (), or calling ++ * **bpf_skb_store_bytes**\ () with the ++ * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear ++ * the hash and to trigger a new computation for the next call to ++ * **bpf_get_hash_recalc**\ (). ++ * Return ++ * The 32-bit hash. + * + * u64 bpf_get_current_task(void) +- * Returns current task_struct +- * Return: current +- * +- * int bpf_probe_write_user(void *dst, void *src, int len) +- * safely attempt to write to a location +- * @dst: destination address in userspace +- * @src: source address on stack +- * @len: number of bytes to copy +- * Return: 0 on success or negative error +- * +- * int bpf_current_task_under_cgroup(map, index) +- * Check cgroup2 membership of current task +- * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type +- * @index: index of the cgroup in the bpf_map +- * Return: +- * == 0 current failed the cgroup2 descendant test +- * == 1 current succeeded the cgroup2 descendant test +- * < 0 error +- * +- * int bpf_skb_change_tail(skb, len, flags) +- * The helper will resize the skb to the given new size, to be used f.e. +- * with control messages. +- * @skb: pointer to skb +- * @len: new skb length +- * @flags: reserved +- * Return: 0 on success or negative error +- * +- * int bpf_skb_pull_data(skb, len) +- * The helper will pull in non-linear data in case the skb is non-linear +- * and not all of len are part of the linear section. Only needed for +- * read/write with direct packet access. +- * @skb: pointer to skb +- * @len: len to make read/writeable +- * Return: 0 on success or negative error +- * +- * s64 bpf_csum_update(skb, csum) +- * Adds csum into skb->csum in case of CHECKSUM_COMPLETE. +- * @skb: pointer to skb +- * @csum: csum to add +- * Return: csum on success or negative error +- * +- * void bpf_set_hash_invalid(skb) +- * Invalidate current skb->hash. +- * @skb: pointer to skb +- * +- * int bpf_get_numa_node_id() +- * Return: Id of current NUMA node. +- * +- * int bpf_skb_change_head() +- * Grows headroom of skb and adjusts MAC header offset accordingly. +- * Will extends/reallocae as required automatically. +- * May change skb data pointer and will thus invalidate any check +- * performed for direct packet access. +- * @skb: pointer to skb +- * @len: length of header to be pushed in front +- * @flags: Flags (unused for now) +- * Return: 0 on success or negative error +- * +- * int bpf_xdp_adjust_head(xdp_md, delta) +- * Adjust the xdp_md.data by delta +- * @xdp_md: pointer to xdp_md +- * @delta: An positive/negative integer to be added to xdp_md.data +- * Return: 0 on success or negative on error ++ * Return ++ * A pointer to the current task struct. ++ * ++ * int bpf_probe_write_user(void *dst, const void *src, u32 len) ++ * Description ++ * Attempt in a safe way to write *len* bytes from the buffer ++ * *src* to *dst* in memory. It only works for threads that are in ++ * user context, and *dst* must be a valid user space address. ++ * ++ * This helper should not be used to implement any kind of ++ * security mechanism because of TOC-TOU attacks, but rather to ++ * debug, divert, and manipulate execution of semi-cooperative ++ * processes. ++ * ++ * Keep in mind that this feature is meant for experiments, and it ++ * has a risk of crashing the system and running programs. ++ * Therefore, when an eBPF program using this helper is attached, ++ * a warning including PID and process name is printed to kernel ++ * logs. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_current_task_under_cgroup(struct bpf_map *map, u32 index) ++ * Description ++ * Check whether the probe is being run is the context of a given ++ * subset of the cgroup2 hierarchy. The cgroup2 to test is held by ++ * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. ++ * Return ++ * The return value depends on the result of the test, and can be: ++ * ++ * * 0, if the *skb* task belongs to the cgroup2. ++ * * 1, if the *skb* task does not belong to the cgroup2. ++ * * A negative error code, if an error occurred. ++ * ++ * int bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags) ++ * Description ++ * Resize (trim or grow) the packet associated to *skb* to the ++ * new *len*. The *flags* are reserved for future usage, and must ++ * be left at zero. ++ * ++ * The basic idea is that the helper performs the needed work to ++ * change the size of the packet, then the eBPF program rewrites ++ * the rest via helpers like **bpf_skb_store_bytes**\ (), ++ * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () ++ * and others. This helper is a slow path utility intended for ++ * replies with control messages. And because it is targeted for ++ * slow path, the helper itself can afford to be slow: it ++ * implicitly linearizes, unclones and drops offloads from the ++ * *skb*. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_pull_data(struct sk_buff *skb, u32 len) ++ * Description ++ * Pull in non-linear data in case the *skb* is non-linear and not ++ * all of *len* are part of the linear section. Make *len* bytes ++ * from *skb* readable and writable. If a zero value is passed for ++ * *len*, then the whole length of the *skb* is pulled. ++ * ++ * This helper is only needed for reading and writing with direct ++ * packet access. ++ * ++ * For direct packet access, testing that offsets to access ++ * are within packet boundaries (test on *skb*\ **->data_end**) is ++ * susceptible to fail if offsets are invalid, or if the requested ++ * data is in non-linear parts of the *skb*. On failure the ++ * program can just bail out, or in the case of a non-linear ++ * buffer, use a helper to make the data available. The ++ * **bpf_skb_load_bytes**\ () helper is a first solution to access ++ * the data. Another one consists in using **bpf_skb_pull_data** ++ * to pull in once the non-linear parts, then retesting and ++ * eventually access the data. ++ * ++ * At the same time, this also makes sure the *skb* is uncloned, ++ * which is a necessary condition for direct write. As this needs ++ * to be an invariant for the write part only, the verifier ++ * detects writes and adds a prologue that is calling ++ * **bpf_skb_pull_data()** to effectively unclone the *skb* from ++ * the very beginning in case it is indeed cloned. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum) ++ * Description ++ * Add the checksum *csum* into *skb*\ **->csum** in case the ++ * driver has supplied a checksum for the entire packet into that ++ * field. Return an error otherwise. This helper is intended to be ++ * used in combination with **bpf_csum_diff**\ (), in particular ++ * when the checksum needs to be updated after data has been ++ * written into the packet through direct packet access. ++ * Return ++ * The checksum on success, or a negative error code in case of ++ * failure. ++ * ++ * void bpf_set_hash_invalid(struct sk_buff *skb) ++ * Description ++ * Invalidate the current *skb*\ **->hash**. It can be used after ++ * mangling on headers through direct packet access, in order to ++ * indicate that the hash is outdated and to trigger a ++ * recalculation the next time the kernel tries to access this ++ * hash or when the **bpf_get_hash_recalc**\ () helper is called. ++ * ++ * int bpf_get_numa_node_id(void) ++ * Description ++ * Return the id of the current NUMA node. The primary use case ++ * for this helper is the selection of sockets for the local NUMA ++ * node, when the program is attached to sockets using the ++ * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), ++ * but the helper is also available to other eBPF program types, ++ * similarly to **bpf_get_smp_processor_id**\ (). ++ * Return ++ * The id of current NUMA node. ++ * ++ * int bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags) ++ * Description ++ * Grows headroom of packet associated to *skb* and adjusts the ++ * offset of the MAC header accordingly, adding *len* bytes of ++ * space. It automatically extends and reallocates memory as ++ * required. ++ * ++ * This helper can be used on a layer 3 *skb* to push a MAC header ++ * for redirection into a layer 2 device. ++ * ++ * All values for *flags* are reserved for future usage, and must ++ * be left at zero. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta) ++ * Description ++ * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that ++ * it is possible to use a negative value for *delta*. This helper ++ * can be used to prepare the packet for pushing or popping ++ * headers. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. + * + * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr) +- * Copy a NUL terminated string from unsafe address. In case the string +- * length is smaller than size, the target is not padded with further NUL +- * bytes. In case the string length is larger than size, just count-1 +- * bytes are copied and the last byte is set to NUL. +- * @dst: destination address +- * @size: maximum number of bytes to copy, including the trailing NUL +- * @unsafe_ptr: unsafe address +- * Return: +- * > 0 length of the string including the trailing NUL on success +- * < 0 error +- * +- * u64 bpf_get_socket_cookie(skb) +- * Get the cookie for the socket stored inside sk_buff. +- * @skb: pointer to skb +- * Return: 8 Bytes non-decreasing number on success or 0 if the socket +- * field is missing inside sk_buff +- * +- * u32 bpf_get_socket_uid(skb) +- * Get the owner uid of the socket stored inside sk_buff. +- * @skb: pointer to skb +- * Return: uid of the socket owner on success or overflowuid if failed. +- * +- * u32 bpf_set_hash(skb, hash) +- * Set full skb->hash. +- * @skb: pointer to skb +- * @hash: hash to set +- * +- * int bpf_setsockopt(bpf_socket, level, optname, optval, optlen) +- * Calls setsockopt. Not all opts are available, only those with +- * integer optvals plus TCP_CONGESTION. +- * Supported levels: SOL_SOCKET and IPROTO_TCP +- * @bpf_socket: pointer to bpf_socket +- * @level: SOL_SOCKET or IPROTO_TCP +- * @optname: option name +- * @optval: pointer to option value +- * @optlen: length of optval in byes +- * Return: 0 or negative error +- * +- * int bpf_skb_adjust_room(skb, len_diff, mode, flags) +- * Grow or shrink room in sk_buff. +- * @skb: pointer to skb +- * @len_diff: (signed) amount of room to grow/shrink +- * @mode: operation mode (enum bpf_adj_room_mode) +- * @flags: reserved for future use +- * Return: 0 on success or negative error code +- * +- * int bpf_sk_redirect_map(map, key, flags) +- * Redirect skb to a sock in map using key as a lookup key for the +- * sock in map. +- * @map: pointer to sockmap +- * @key: key to lookup sock in map +- * @flags: reserved for future use +- * Return: SK_REDIRECT +- * +- * int bpf_sock_map_update(skops, map, key, flags) +- * @skops: pointer to bpf_sock_ops +- * @map: pointer to sockmap to update +- * @key: key to insert/update sock in map +- * @flags: same flags as map update elem ++ * Description ++ * Copy a NUL terminated string from an unsafe address ++ * *unsafe_ptr* to *dst*. The *size* should include the ++ * terminating NUL byte. In case the string length is smaller than ++ * *size*, the target is not padded with further NUL bytes. If the ++ * string length is larger than *size*, just *size*-1 bytes are ++ * copied and the last byte is set to NUL. ++ * ++ * On success, the length of the copied string is returned. This ++ * makes this helper useful in tracing programs for reading ++ * strings, and more importantly to get its length at runtime. See ++ * the following snippet: ++ * ++ * :: ++ * ++ * SEC("kprobe/sys_open") ++ * void bpf_sys_open(struct pt_regs *ctx) ++ * { ++ * char buf[PATHLEN]; // PATHLEN is defined to 256 ++ * int res = bpf_probe_read_str(buf, sizeof(buf), ++ * ctx->di); ++ * ++ * // Consume buf, for example push it to ++ * // userspace via bpf_perf_event_output(); we ++ * // can use res (the string length) as event ++ * // size, after checking its boundaries. ++ * } ++ * ++ * In comparison, using **bpf_probe_read()** helper here instead ++ * to read the string would require to estimate the length at ++ * compile time, and would often result in copying more memory ++ * than necessary. ++ * ++ * Another useful use case is when parsing individual process ++ * arguments or individual environment variables navigating ++ * *current*\ **->mm->arg_start** and *current*\ ++ * **->mm->env_start**: using this helper and the return value, ++ * one can quickly iterate at the right offset of the memory area. ++ * Return ++ * On success, the strictly positive length of the string, ++ * including the trailing NUL character. On error, a negative ++ * value. ++ * ++ * u64 bpf_get_socket_cookie(struct sk_buff *skb) ++ * Description ++ * If the **struct sk_buff** pointed by *skb* has a known socket, ++ * retrieve the cookie (generated by the kernel) of this socket. ++ * If no cookie has been set yet, generate a new cookie. Once ++ * generated, the socket cookie remains stable for the life of the ++ * socket. This helper can be useful for monitoring per socket ++ * networking traffic statistics as it provides a unique socket ++ * identifier per namespace. ++ * Return ++ * A 8-byte long non-decreasing number on success, or 0 if the ++ * socket field is missing inside *skb*. ++ * ++ * u32 bpf_get_socket_uid(struct sk_buff *skb) ++ * Return ++ * The owner UID of the socket associated to *skb*. If the socket ++ * is **NULL**, or if it is not a full socket (i.e. if it is a ++ * time-wait or a request socket instead), **overflowuid** value ++ * is returned (note that **overflowuid** might also be the actual ++ * UID value for the socket). ++ * ++ * u32 bpf_set_hash(struct sk_buff *skb, u32 hash) ++ * Description ++ * Set the full hash for *skb* (set the field *skb*\ **->hash**) ++ * to value *hash*. ++ * Return ++ * 0 ++ * ++ * int bpf_setsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen) ++ * Description ++ * Emulate a call to **setsockopt()** on the socket associated to ++ * *bpf_socket*, which must be a full socket. The *level* at ++ * which the option resides and the name *optname* of the option ++ * must be specified, see **setsockopt(2)** for more information. ++ * The option value of length *optlen* is pointed by *optval*. ++ * ++ * This helper actually implements a subset of **setsockopt()**. ++ * It supports the following *level*\ s: ++ * ++ * * **SOL_SOCKET**, which supports the following *optname*\ s: ++ * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, ++ * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**. ++ * * **IPPROTO_TCP**, which supports the following *optname*\ s: ++ * **TCP_CONGESTION**, **TCP_BPF_IW**, ++ * **TCP_BPF_SNDCWND_CLAMP**. ++ * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. ++ * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_adjust_room(struct sk_buff *skb, u32 len_diff, u32 mode, u64 flags) ++ * Description ++ * Grow or shrink the room for data in the packet associated to ++ * *skb* by *len_diff*, and according to the selected *mode*. ++ * ++ * There is a single supported mode at this time: ++ * ++ * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer ++ * (room space is added or removed below the layer 3 header). ++ * ++ * All values for *flags* are reserved for future usage, and must ++ * be left at zero. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags) ++ * Description ++ * Redirect the packet to the endpoint referenced by *map* at ++ * index *key*. Depending on its type, this *map* can contain ++ * references to net devices (for forwarding packets through other ++ * ports), or to CPUs (for redirecting XDP frames to another CPU; ++ * but this is only implemented for native XDP (with driver ++ * support) as of this writing). ++ * ++ * All values for *flags* are reserved for future usage, and must ++ * be left at zero. ++ * ++ * When used to redirect packets to net devices, this helper ++ * provides a high performance increase over **bpf_redirect**\ (). ++ * This is due to various implementation details of the underlying ++ * mechanisms, one of which is the fact that **bpf_redirect_map**\ ++ * () tries to send packet as a "bulk" to the device. ++ * Return ++ * **XDP_REDIRECT** on success, or **XDP_ABORTED** on error. ++ * ++ * int bpf_sk_redirect_map(struct bpf_map *map, u32 key, u64 flags) ++ * Description ++ * Redirect the packet to the socket referenced by *map* (of type ++ * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and ++ * egress interfaces can be used for redirection. The ++ * **BPF_F_INGRESS** value in *flags* is used to make the ++ * distinction (ingress path is selected if the flag is present, ++ * egress path otherwise). This is the only flag supported for now. ++ * Return ++ * **SK_PASS** on success, or **SK_DROP** on error. ++ * ++ * int bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) ++ * Description ++ * Add an entry to, or update a *map* referencing sockets. The ++ * *skops* is used as a new value for the entry associated to ++ * *key*. *flags* is one of: ++ * ++ * **BPF_NOEXIST** ++ * The entry for *key* must not exist in the map. ++ * **BPF_EXIST** ++ * The entry for *key* must already exist in the map. ++ * **BPF_ANY** ++ * No condition on the existence of the entry for *key*. ++ * ++ * If the *map* has eBPF programs (parser and verdict), those will ++ * be inherited by the socket being added. If the socket is ++ * already attached to eBPF programs, this results in an error. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta) ++ * Description ++ * Adjust the address pointed by *xdp_md*\ **->data_meta** by ++ * *delta* (which can be positive or negative). Note that this ++ * operation modifies the address stored in *xdp_md*\ **->data**, ++ * so the latter must be loaded only after the helper has been ++ * called. ++ * ++ * The use of *xdp_md*\ **->data_meta** is optional and programs ++ * are not required to use it. The rationale is that when the ++ * packet is processed with XDP (e.g. as DoS filter), it is ++ * possible to push further meta data along with it before passing ++ * to the stack, and to give the guarantee that an ingress eBPF ++ * program attached as a TC classifier on the same device can pick ++ * this up for further post-processing. Since TC works with socket ++ * buffers, it remains possible to set from XDP the **mark** or ++ * **priority** pointers, or other pointers for the socket buffer. ++ * Having this scratch space generic and programmable allows for ++ * more flexibility as the user is free to store whatever meta ++ * data they need. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size) ++ * Description ++ * Read the value of a perf event counter, and store it into *buf* ++ * of size *buf_size*. This helper relies on a *map* of type ++ * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event ++ * counter is selected when *map* is updated with perf event file ++ * descriptors. The *map* is an array whose size is the number of ++ * available CPUs, and each cell contains a value relative to one ++ * CPU. The value to retrieve is indicated by *flags*, that ++ * contains the index of the CPU to look up, masked with ++ * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to ++ * **BPF_F_CURRENT_CPU** to indicate that the value for the ++ * current CPU should be retrieved. ++ * ++ * This helper behaves in a way close to ++ * **bpf_perf_event_read**\ () helper, save that instead of ++ * just returning the value observed, it fills the *buf* ++ * structure. This allows for additional data to be retrieved: in ++ * particular, the enabled and running times (in *buf*\ ++ * **->enabled** and *buf*\ **->running**, respectively) are ++ * copied. In general, **bpf_perf_event_read_value**\ () is ++ * recommended over **bpf_perf_event_read**\ (), which has some ++ * ABI issues and provides fewer functionalities. ++ * ++ * These values are interesting, because hardware PMU (Performance ++ * Monitoring Unit) counters are limited resources. When there are ++ * more PMU based perf events opened than available counters, ++ * kernel will multiplex these events so each event gets certain ++ * percentage (but not all) of the PMU time. In case that ++ * multiplexing happens, the number of samples or counter value ++ * will not reflect the case compared to when no multiplexing ++ * occurs. This makes comparison between different runs difficult. ++ * Typically, the counter value should be normalized before ++ * comparing to other experiments. The usual normalization is done ++ * as follows. ++ * ++ * :: ++ * ++ * normalized_counter = counter * t_enabled / t_running ++ * ++ * Where t_enabled is the time enabled for event and t_running is ++ * the time running for event since last normalization. The ++ * enabled and running times are accumulated since the perf event ++ * open. To achieve scaling factor between two invocations of an ++ * eBPF program, users can can use CPU id as the key (which is ++ * typical for perf array usage model) to remember the previous ++ * value and do the calculation inside the eBPF program. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size) ++ * Description ++ * For en eBPF program attached to a perf event, retrieve the ++ * value of the event counter associated to *ctx* and store it in ++ * the structure pointed by *buf* and of size *buf_size*. Enabled ++ * and running times are also stored in the structure (see ++ * description of helper **bpf_perf_event_read_value**\ () for ++ * more details). ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_getsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen) ++ * Description ++ * Emulate a call to **getsockopt()** on the socket associated to ++ * *bpf_socket*, which must be a full socket. The *level* at ++ * which the option resides and the name *optname* of the option ++ * must be specified, see **getsockopt(2)** for more information. ++ * The retrieved value is stored in the structure pointed by ++ * *opval* and of length *optlen*. ++ * ++ * This helper actually implements a subset of **getsockopt()**. ++ * It supports the following *level*\ s: ++ * ++ * * **IPPROTO_TCP**, which supports *optname* ++ * **TCP_CONGESTION**. ++ * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. ++ * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_override_return(struct pt_reg *regs, u64 rc) ++ * Description ++ * Used for error injection, this helper uses kprobes to override ++ * the return value of the probed function, and to set it to *rc*. ++ * The first argument is the context *regs* on which the kprobe ++ * works. ++ * ++ * This helper works by setting setting the PC (program counter) ++ * to an override function which is run in place of the original ++ * probed function. This means the probed function is not run at ++ * all. The replacement function just returns with the required ++ * value. ++ * ++ * This helper has security implications, and thus is subject to ++ * restrictions. It is only available if the kernel was compiled ++ * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration ++ * option, and in this case it only works on functions tagged with ++ * **ALLOW_ERROR_INJECTION** in the kernel code. ++ * ++ * Also, the helper is only available for the architectures having ++ * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, ++ * x86 architecture is the only one to support this feature. ++ * Return ++ * 0 ++ * ++ * int bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval) ++ * Description ++ * Attempt to set the value of the **bpf_sock_ops_cb_flags** field ++ * for the full TCP socket associated to *bpf_sock_ops* to ++ * *argval*. ++ * ++ * The primary use of this field is to determine if there should ++ * be calls to eBPF programs of type ++ * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP ++ * code. A program of the same type can change its value, per ++ * connection and as necessary, when the connection is ++ * established. This field is directly accessible for reading, but ++ * this helper must be used for updates in order to return an ++ * error if an eBPF program tries to set a callback that is not ++ * supported in the current kernel. ++ * ++ * The supported callback values that *argval* can combine are: ++ * ++ * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) ++ * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) ++ * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) ++ * ++ * Here are some examples of where one could call such eBPF ++ * program: ++ * ++ * * When RTO fires. ++ * * When a packet is retransmitted. ++ * * When the connection terminates. ++ * * When a packet is sent. ++ * * When a packet is received. ++ * Return ++ * Code **-EINVAL** if the socket is not a full TCP socket; ++ * otherwise, a positive number containing the bits that could not ++ * be set is returned (which comes down to 0 if all bits were set ++ * as required). ++ * ++ * int bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags) ++ * Description ++ * This helper is used in programs implementing policies at the ++ * socket level. If the message *msg* is allowed to pass (i.e. if ++ * the verdict eBPF program returns **SK_PASS**), redirect it to ++ * the socket referenced by *map* (of type ++ * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and ++ * egress interfaces can be used for redirection. The ++ * **BPF_F_INGRESS** value in *flags* is used to make the ++ * distinction (ingress path is selected if the flag is present, ++ * egress path otherwise). This is the only flag supported for now. ++ * Return ++ * **SK_PASS** on success, or **SK_DROP** on error. ++ * ++ * int bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes) ++ * Description ++ * For socket policies, apply the verdict of the eBPF program to ++ * the next *bytes* (number of bytes) of message *msg*. ++ * ++ * For example, this helper can be used in the following cases: ++ * ++ * * A single **sendmsg**\ () or **sendfile**\ () system call ++ * contains multiple logical messages that the eBPF program is ++ * supposed to read and for which it should apply a verdict. ++ * * An eBPF program only cares to read the first *bytes* of a ++ * *msg*. If the message has a large payload, then setting up ++ * and calling the eBPF program repeatedly for all bytes, even ++ * though the verdict is already known, would create unnecessary ++ * overhead. ++ * ++ * When called from within an eBPF program, the helper sets a ++ * counter internal to the BPF infrastructure, that is used to ++ * apply the last verdict to the next *bytes*. If *bytes* is ++ * smaller than the current data being processed from a ++ * **sendmsg**\ () or **sendfile**\ () system call, the first ++ * *bytes* will be sent and the eBPF program will be re-run with ++ * the pointer for start of data pointing to byte number *bytes* ++ * **+ 1**. If *bytes* is larger than the current data being ++ * processed, then the eBPF verdict will be applied to multiple ++ * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are ++ * consumed. ++ * ++ * Note that if a socket closes with the internal counter holding ++ * a non-zero value, this is not a problem because data is not ++ * being buffered for *bytes* and is sent as it is received. ++ * Return ++ * 0 ++ * ++ * int bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes) ++ * Description ++ * For socket policies, prevent the execution of the verdict eBPF ++ * program for message *msg* until *bytes* (byte number) have been ++ * accumulated. ++ * ++ * This can be used when one needs a specific number of bytes ++ * before a verdict can be assigned, even if the data spans ++ * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme ++ * case would be a user calling **sendmsg**\ () repeatedly with ++ * 1-byte long message segments. Obviously, this is bad for ++ * performance, but it is still valid. If the eBPF program needs ++ * *bytes* bytes to validate a header, this helper can be used to ++ * prevent the eBPF program to be called again until *bytes* have ++ * been accumulated. ++ * Return ++ * 0 ++ * ++ * int bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags) ++ * Description ++ * For socket policies, pull in non-linear data from user space ++ * for *msg* and set pointers *msg*\ **->data** and *msg*\ ++ * **->data_end** to *start* and *end* bytes offsets into *msg*, ++ * respectively. ++ * ++ * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a ++ * *msg* it can only parse data that the (**data**, **data_end**) ++ * pointers have already consumed. For **sendmsg**\ () hooks this ++ * is likely the first scatterlist element. But for calls relying ++ * on the **sendpage** handler (e.g. **sendfile**\ ()) this will ++ * be the range (**0**, **0**) because the data is shared with ++ * user space and by default the objective is to avoid allowing ++ * user space to modify data while (or after) eBPF verdict is ++ * being decided. This helper can be used to pull in data and to ++ * set the start and end pointer to given values. Data will be ++ * copied if necessary (i.e. if data was not linear and if start ++ * and end pointers do not point to the same chunk). ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * ++ * All values for *flags* are reserved for future usage, and must ++ * be left at zero. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) ++ * Description ++ * Bind the socket associated to *ctx* to the address pointed by ++ * *addr*, of length *addr_len*. This allows for making outgoing ++ * connection from the desired IP address, which can be useful for ++ * example when all processes inside a cgroup should use one ++ * single IP address on a host that has multiple IP configured. ++ * ++ * This helper works for IPv4 and IPv6, TCP and UDP sockets. The ++ * domain (*addr*\ **->sa_family**) must be **AF_INET** (or ++ * **AF_INET6**). Looking for a free port to bind to can be ++ * expensive, therefore binding to port is not permitted by the ++ * helper: *addr*\ **->sin_port** (or **sin6_port**, respectively) ++ * must be set to zero. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta) ++ * Description ++ * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is ++ * only possible to shrink the packet as of this writing, ++ * therefore *delta* must be a negative integer. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags) ++ * Description ++ * Retrieve the XFRM state (IP transform framework, see also ++ * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. ++ * ++ * The retrieved value is stored in the **struct bpf_xfrm_state** ++ * pointed by *xfrm_state* and of length *size*. ++ * ++ * All values for *flags* are reserved for future usage, and must ++ * be left at zero. ++ * ++ * This helper is available only if the kernel was compiled with ++ * **CONFIG_XFRM** configuration option. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_get_stack(struct pt_regs *regs, void *buf, u32 size, u64 flags) ++ * Description ++ * Return a user or a kernel stack in bpf program provided buffer. ++ * To achieve this, the helper needs *ctx*, which is a pointer ++ * to the context on which the tracing program is executed. ++ * To store the stacktrace, the bpf program provides *buf* with ++ * a nonnegative *size*. ++ * ++ * The last argument, *flags*, holds the number of stack frames to ++ * skip (from 0 to 255), masked with ++ * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set ++ * the following flags: ++ * ++ * **BPF_F_USER_STACK** ++ * Collect a user space stack instead of a kernel stack. ++ * **BPF_F_USER_BUILD_ID** ++ * Collect buildid+offset instead of ips for user stack, ++ * only valid if **BPF_F_USER_STACK** is also specified. ++ * ++ * **bpf_get_stack**\ () can collect up to ++ * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject ++ * to sufficient large buffer size. Note that ++ * this limit can be controlled with the **sysctl** program, and ++ * that it should be manually increased in order to profile long ++ * user stacks (such as stacks for Java programs). To do so, use: ++ * ++ * :: ++ * ++ * # sysctl kernel.perf_event_max_stack= ++ * Return ++ * A non-negative value equal to or less than *size* on success, ++ * or a negative error in case of failure. ++ * ++ * int bpf_skb_load_bytes_relative(const struct sk_buff *skb, u32 offset, void *to, u32 len, u32 start_header) ++ * Description ++ * This helper is similar to **bpf_skb_load_bytes**\ () in that ++ * it provides an easy way to load *len* bytes from *offset* ++ * from the packet associated to *skb*, into the buffer pointed ++ * by *to*. The difference to **bpf_skb_load_bytes**\ () is that ++ * a fifth argument *start_header* exists in order to select a ++ * base offset to start from. *start_header* can be one of: ++ * ++ * **BPF_HDR_START_MAC** ++ * Base offset to load data from is *skb*'s mac header. ++ * **BPF_HDR_START_NET** ++ * Base offset to load data from is *skb*'s network header. ++ * ++ * In general, "direct packet access" is the preferred method to ++ * access packet data, however, this helper is in particular useful ++ * in socket filters where *skb*\ **->data** does not always point ++ * to the start of the mac header and where "direct packet access" ++ * is not available. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags) ++ * Description ++ * Do FIB lookup in kernel tables using parameters in *params*. ++ * If lookup is successful and result shows packet is to be ++ * forwarded, the neighbor tables are searched for the nexthop. ++ * If successful (ie., FIB lookup shows forwarding and nexthop ++ * is resolved), the nexthop address is returned in ipv4_dst ++ * or ipv6_dst based on family, smac is set to mac address of ++ * egress device, dmac is set to nexthop mac address, rt_metric ++ * is set to metric from route (IPv4/IPv6 only), and ifindex ++ * is set to the device index of the nexthop from the FIB lookup. ++ * ++ * *plen* argument is the size of the passed in struct. ++ * *flags* argument can be a combination of one or more of the ++ * following values: ++ * ++ * **BPF_FIB_LOOKUP_DIRECT** ++ * Do a direct table lookup vs full lookup using FIB ++ * rules. ++ * **BPF_FIB_LOOKUP_OUTPUT** ++ * Perform lookup from an egress perspective (default is ++ * ingress). ++ * ++ * *ctx* is either **struct xdp_md** for XDP programs or ++ * **struct sk_buff** tc cls_act programs. ++ * Return ++ * * < 0 if any input argument is invalid ++ * * 0 on success (packet is forwarded, nexthop neighbor exists) ++ * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the ++ * packet is not forwarded or needs assist from full stack ++ * ++ * int bpf_sock_hash_update(struct bpf_sock_ops_kern *skops, struct bpf_map *map, void *key, u64 flags) ++ * Description ++ * Add an entry to, or update a sockhash *map* referencing sockets. ++ * The *skops* is used as a new value for the entry associated to ++ * *key*. *flags* is one of: ++ * ++ * **BPF_NOEXIST** ++ * The entry for *key* must not exist in the map. ++ * **BPF_EXIST** ++ * The entry for *key* must already exist in the map. ++ * **BPF_ANY** ++ * No condition on the existence of the entry for *key*. ++ * ++ * If the *map* has eBPF programs (parser and verdict), those will ++ * be inherited by the socket being added. If the socket is ++ * already attached to eBPF programs, this results in an error. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags) ++ * Description ++ * This helper is used in programs implementing policies at the ++ * socket level. If the message *msg* is allowed to pass (i.e. if ++ * the verdict eBPF program returns **SK_PASS**), redirect it to ++ * the socket referenced by *map* (of type ++ * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and ++ * egress interfaces can be used for redirection. The ++ * **BPF_F_INGRESS** value in *flags* is used to make the ++ * distinction (ingress path is selected if the flag is present, ++ * egress path otherwise). This is the only flag supported for now. ++ * Return ++ * **SK_PASS** on success, or **SK_DROP** on error. ++ * ++ * int bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags) ++ * Description ++ * This helper is used in programs implementing policies at the ++ * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. ++ * if the verdeict eBPF program returns **SK_PASS**), redirect it ++ * to the socket referenced by *map* (of type ++ * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and ++ * egress interfaces can be used for redirection. The ++ * **BPF_F_INGRESS** value in *flags* is used to make the ++ * distinction (ingress path is selected if the flag is present, ++ * egress otherwise). This is the only flag supported for now. ++ * Return ++ * **SK_PASS** on success, or **SK_DROP** on error. ++ * ++ * int bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len) ++ * Description ++ * Encapsulate the packet associated to *skb* within a Layer 3 ++ * protocol header. This header is provided in the buffer at ++ * address *hdr*, with *len* its size in bytes. *type* indicates ++ * the protocol of the header and can be one of: ++ * ++ * **BPF_LWT_ENCAP_SEG6** ++ * IPv6 encapsulation with Segment Routing Header ++ * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, ++ * the IPv6 header is computed by the kernel. ++ * **BPF_LWT_ENCAP_SEG6_INLINE** ++ * Only works if *skb* contains an IPv6 packet. Insert a ++ * Segment Routing Header (**struct ipv6_sr_hdr**) inside ++ * the IPv6 header. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len) ++ * Description ++ * Store *len* bytes from address *from* into the packet ++ * associated to *skb*, at *offset*. Only the flags, tag and TLVs ++ * inside the outermost IPv6 Segment Routing Header can be ++ * modified through this helper. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta) ++ * Description ++ * Adjust the size allocated to TLVs in the outermost IPv6 ++ * Segment Routing Header contained in the packet associated to ++ * *skb*, at position *offset* by *delta* bytes. Only offsets ++ * after the segments are accepted. *delta* can be as well ++ * positive (growing) as negative (shrinking). ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len) ++ * Description ++ * Apply an IPv6 Segment Routing action of type *action* to the ++ * packet associated to *skb*. Each action takes a parameter ++ * contained at address *param*, and of length *param_len* bytes. ++ * *action* can be one of: ++ * ++ * **SEG6_LOCAL_ACTION_END_X** ++ * End.X action: Endpoint with Layer-3 cross-connect. ++ * Type of *param*: **struct in6_addr**. ++ * **SEG6_LOCAL_ACTION_END_T** ++ * End.T action: Endpoint with specific IPv6 table lookup. ++ * Type of *param*: **int**. ++ * **SEG6_LOCAL_ACTION_END_B6** ++ * End.B6 action: Endpoint bound to an SRv6 policy. ++ * Type of param: **struct ipv6_sr_hdr**. ++ * **SEG6_LOCAL_ACTION_END_B6_ENCAP** ++ * End.B6.Encap action: Endpoint bound to an SRv6 ++ * encapsulation policy. ++ * Type of param: **struct ipv6_sr_hdr**. ++ * ++ * A call to this helper is susceptible to change the underlaying ++ * packet buffer. Therefore, at load time, all checks on pointers ++ * previously done by the verifier are invalidated and must be ++ * performed again, if the helper is used in combination with ++ * direct packet access. ++ * Return ++ * 0 on success, or a negative error in case of failure. ++ * ++ * int bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle) ++ * Description ++ * This helper is used in programs implementing IR decoding, to ++ * report a successfully decoded key press with *scancode*, ++ * *toggle* value in the given *protocol*. The scancode will be ++ * translated to a keycode using the rc keymap, and reported as ++ * an input key down event. After a period a key up event is ++ * generated. This period can be extended by calling either ++ * **bpf_rc_keydown** () again with the same values, or calling ++ * **bpf_rc_repeat** (). ++ * ++ * Some protocols include a toggle bit, in case the button was ++ * released and pressed again between consecutive scancodes. ++ * ++ * The *ctx* should point to the lirc sample as passed into ++ * the program. ++ * ++ * The *protocol* is the decoded protocol number (see ++ * **enum rc_proto** for some predefined values). ++ * ++ * This helper is only available is the kernel was compiled with ++ * the **CONFIG_BPF_LIRC_MODE2** configuration option set to ++ * "**y**". ++ * Return ++ * 0 ++ * ++ * int bpf_rc_repeat(void *ctx) ++ * Description ++ * This helper is used in programs implementing IR decoding, to ++ * report a successfully decoded repeat key message. This delays ++ * the generation of a key up event for previously generated ++ * key down event. ++ * ++ * Some IR protocols like NEC have a special IR message for ++ * repeating last button, for when a button is held down. ++ * ++ * The *ctx* should point to the lirc sample as passed into ++ * the program. ++ * ++ * This helper is only available is the kernel was compiled with ++ * the **CONFIG_BPF_LIRC_MODE2** configuration option set to ++ * "**y**". ++ * Return ++ * 0 ++ * ++ * uint64_t bpf_skb_cgroup_id(struct sk_buff *skb) ++ * Description ++ * Return the cgroup v2 id of the socket associated with the *skb*. ++ * This is roughly similar to the **bpf_get_cgroup_classid**\ () ++ * helper for cgroup v1 by providing a tag resp. identifier that ++ * can be matched on or used for map lookups e.g. to implement ++ * policy. The cgroup v2 id of a given path in the hierarchy is ++ * exposed in user space through the f_handle API in order to get ++ * to the same 64-bit id. ++ * ++ * This helper can be used on TC egress path, but not on ingress, ++ * and is available only if the kernel was compiled with the ++ * **CONFIG_SOCK_CGROUP_DATA** configuration option. ++ * Return ++ * The id is returned or 0 in case the id could not be retrieved. ++ * ++ * u64 bpf_get_current_cgroup_id(void) ++ * Return ++ * A 64-bit integer containing the current cgroup id based ++ * on the cgroup within which the current task is running. + */ + #define __BPF_FUNC_MAPPER(FN) \ + FN(unspec), \ +@@ -638,6 +2131,33 @@ union bpf_attr { + FN(redirect_map), \ + FN(sk_redirect_map), \ + FN(sock_map_update), \ ++ FN(xdp_adjust_meta), \ ++ FN(perf_event_read_value), \ ++ FN(perf_prog_read_value), \ ++ FN(getsockopt), \ ++ FN(override_return), \ ++ FN(sock_ops_cb_flags_set), \ ++ FN(msg_redirect_map), \ ++ FN(msg_apply_bytes), \ ++ FN(msg_cork_bytes), \ ++ FN(msg_pull_data), \ ++ FN(bind), \ ++ FN(xdp_adjust_tail), \ ++ FN(skb_get_xfrm_state), \ ++ FN(get_stack), \ ++ FN(skb_load_bytes_relative), \ ++ FN(fib_lookup), \ ++ FN(sock_hash_update), \ ++ FN(msg_redirect_hash), \ ++ FN(sk_redirect_hash), \ ++ FN(lwt_push_encap), \ ++ FN(lwt_seg6_store_bytes), \ ++ FN(lwt_seg6_adjust_srh), \ ++ FN(lwt_seg6_action), \ ++ FN(rc_repeat), \ ++ FN(rc_keydown), \ ++ FN(skb_cgroup_id), \ ++ FN(get_current_cgroup_id), + + /* integer value in 'imm' field of BPF_CALL instruction selects which helper + * function eBPF program intends to call +@@ -671,17 +2191,23 @@ enum bpf_func_id { + /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ + #define BPF_F_TUNINFO_IPV6 (1ULL << 0) + +-/* BPF_FUNC_get_stackid flags. */ ++/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */ + #define BPF_F_SKIP_FIELD_MASK 0xffULL + #define BPF_F_USER_STACK (1ULL << 8) ++/* flags used by BPF_FUNC_get_stackid only. */ + #define BPF_F_FAST_STACK_CMP (1ULL << 9) + #define BPF_F_REUSE_STACKID (1ULL << 10) ++/* flags used by BPF_FUNC_get_stack only. */ ++#define BPF_F_USER_BUILD_ID (1ULL << 11) + + /* BPF_FUNC_skb_set_tunnel_key flags. */ + #define BPF_F_ZERO_CSUM_TX (1ULL << 1) + #define BPF_F_DONT_FRAGMENT (1ULL << 2) ++#define BPF_F_SEQ_NUMBER (1ULL << 3) + +-/* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */ ++/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and ++ * BPF_FUNC_perf_event_read_value flags. ++ */ + #define BPF_F_INDEX_MASK 0xffffffffULL + #define BPF_F_CURRENT_CPU BPF_F_INDEX_MASK + /* BPF_FUNC_perf_event_output for sk_buff input context. */ +@@ -692,6 +2218,18 @@ enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET, + }; + ++/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */ ++enum bpf_hdr_start_off { ++ BPF_HDR_START_MAC, ++ BPF_HDR_START_NET, ++}; ++ ++/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */ ++enum bpf_lwt_encap_mode { ++ BPF_LWT_ENCAP_SEG6, ++ BPF_LWT_ENCAP_SEG6_INLINE ++}; ++ + /* user accessible mirror of in-kernel sk_buff. + * new fields can only be added to the end of this structure + */ +@@ -715,7 +2253,7 @@ struct __sk_buff { + __u32 data_end; + __u32 napi_id; + +- /* accessed by BPF_PROG_TYPE_sk_skb types */ ++ /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ +@@ -723,6 +2261,9 @@ struct __sk_buff { + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ ++ /* ... here. */ ++ ++ __u32 data_meta; + }; + + struct bpf_tunnel_key { +@@ -733,10 +2274,24 @@ struct bpf_tunnel_key { + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; +- __u16 tunnel_ext; ++ __u16 tunnel_ext; /* Padding, future use. */ + __u32 tunnel_label; + }; + ++/* user accessible mirror of in-kernel xfrm_state. ++ * new fields can only be added to the end of this structure ++ */ ++struct bpf_xfrm_state { ++ __u32 reqid; ++ __u32 spi; /* Stored in network byte order */ ++ __u16 family; ++ __u16 ext; /* Padding, future use. */ ++ union { ++ __u32 remote_ipv4; /* Stored in network byte order */ ++ __u32 remote_ipv6[4]; /* Stored in network byte order */ ++ }; ++}; ++ + /* Generic BPF return codes which all BPF program types may support. + * The values are binary compatible with their TC_ACT_* counter-part to + * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT +@@ -760,6 +2315,15 @@ struct bpf_sock { + __u32 protocol; + __u32 mark; + __u32 priority; ++ __u32 src_ip4; /* Allows 1,2,4-byte read. ++ * Stored in network byte order. ++ */ ++ __u32 src_ip6[4]; /* Allows 1,2,4-byte read. ++ * Stored in network byte order. ++ */ ++ __u32 src_port; /* Allows 4-byte read. ++ * Stored in host byte order ++ */ + }; + + #define XDP_PACKET_HEADROOM 256 +@@ -783,12 +2347,31 @@ enum xdp_action { + struct xdp_md { + __u32 data; + __u32 data_end; ++ __u32 data_meta; ++ /* Below access go through struct xdp_rxq_info */ ++ __u32 ingress_ifindex; /* rxq->dev->ifindex */ ++ __u32 rx_queue_index; /* rxq->queue_index */ + }; + + enum sk_action { +- SK_ABORTED = 0, +- SK_DROP, +- SK_REDIRECT, ++ SK_DROP = 0, ++ SK_PASS, ++}; ++ ++/* user accessible metadata for SK_MSG packet hook, new fields must ++ * be added to the end of this structure ++ */ ++struct sk_msg_md { ++ void *data; ++ void *data_end; ++ ++ __u32 family; ++ __u32 remote_ip4; /* Stored in network byte order */ ++ __u32 local_ip4; /* Stored in network byte order */ ++ __u32 remote_ip6[4]; /* Stored in network byte order */ ++ __u32 local_ip6[4]; /* Stored in network byte order */ ++ __u32 remote_port; /* Stored in network byte order */ ++ __u32 local_port; /* stored in host byte order */ + }; + + #define BPF_TAG_SIZE 8 +@@ -801,6 +2384,19 @@ struct bpf_prog_info { + __u32 xlated_prog_len; + __aligned_u64 jited_prog_insns; + __aligned_u64 xlated_prog_insns; ++ __u64 load_time; /* ns since boottime */ ++ __u32 created_by_uid; ++ __u32 nr_map_ids; ++ __aligned_u64 map_ids; ++ char name[BPF_OBJ_NAME_LEN]; ++ __u32 ifindex; ++ __u32 gpl_compatible:1; ++ __u64 netns_dev; ++ __u64 netns_ino; ++ __u32 nr_jited_ksyms; ++ __u32 nr_jited_func_lens; ++ __aligned_u64 jited_ksyms; ++ __aligned_u64 jited_func_lens; + } __attribute__((aligned(8))); + + struct bpf_map_info { +@@ -810,8 +2406,48 @@ struct bpf_map_info { + __u32 value_size; + __u32 max_entries; + __u32 map_flags; ++ char name[BPF_OBJ_NAME_LEN]; ++ __u32 ifindex; ++ __u32 :32; ++ __u64 netns_dev; ++ __u64 netns_ino; ++ __u32 btf_id; ++ __u32 btf_key_type_id; ++ __u32 btf_value_type_id; ++} __attribute__((aligned(8))); ++ ++struct bpf_btf_info { ++ __aligned_u64 btf; ++ __u32 btf_size; ++ __u32 id; + } __attribute__((aligned(8))); + ++/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed ++ * by user and intended to be used by socket (e.g. to bind to, depends on ++ * attach attach type). ++ */ ++struct bpf_sock_addr { ++ __u32 user_family; /* Allows 4-byte read, but no write. */ ++ __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. ++ * Stored in network byte order. ++ */ ++ __u32 user_ip6[4]; /* Allows 1,2,4-byte read an 4-byte write. ++ * Stored in network byte order. ++ */ ++ __u32 user_port; /* Allows 4-byte read and write. ++ * Stored in network byte order ++ */ ++ __u32 family; /* Allows 4-byte read, but no write */ ++ __u32 type; /* Allows 4-byte read, but no write */ ++ __u32 protocol; /* Allows 4-byte read, but no write */ ++ __u32 msg_src_ip4; /* Allows 1,2,4-byte read an 4-byte write. ++ * Stored in network byte order. ++ */ ++ __u32 msg_src_ip6[4]; /* Allows 1,2,4-byte read an 4-byte write. ++ * Stored in network byte order. ++ */ ++}; ++ + /* User bpf_sock_ops struct to access socket values and specify request ops + * and their replies. + * Some of this fields are in network (bigendian) byte order and may need +@@ -821,8 +2457,9 @@ struct bpf_map_info { + struct bpf_sock_ops { + __u32 op; + union { +- __u32 reply; +- __u32 replylong[4]; ++ __u32 args[4]; /* Optionally passed to bpf program */ ++ __u32 reply; /* Returned by bpf program */ ++ __u32 replylong[4]; /* Optionally returned by bpf prog */ + }; + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ +@@ -831,8 +2468,45 @@ struct bpf_sock_ops { + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ ++ __u32 is_fullsock; /* Some TCP fields are only valid if ++ * there is a full socket. If not, the ++ * fields read as zero. ++ */ ++ __u32 snd_cwnd; ++ __u32 srtt_us; /* Averaged RTT << 3 in usecs */ ++ __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ ++ __u32 state; ++ __u32 rtt_min; ++ __u32 snd_ssthresh; ++ __u32 rcv_nxt; ++ __u32 snd_nxt; ++ __u32 snd_una; ++ __u32 mss_cache; ++ __u32 ecn_flags; ++ __u32 rate_delivered; ++ __u32 rate_interval_us; ++ __u32 packets_out; ++ __u32 retrans_out; ++ __u32 total_retrans; ++ __u32 segs_in; ++ __u32 data_segs_in; ++ __u32 segs_out; ++ __u32 data_segs_out; ++ __u32 lost_out; ++ __u32 sacked_out; ++ __u32 sk_txhash; ++ __u64 bytes_received; ++ __u64 bytes_acked; + }; + ++/* Definitions for bpf_sock_ops_cb_flags */ ++#define BPF_SOCK_OPS_RTO_CB_FLAG (1<<0) ++#define BPF_SOCK_OPS_RETRANS_CB_FLAG (1<<1) ++#define BPF_SOCK_OPS_STATE_CB_FLAG (1<<2) ++#define BPF_SOCK_OPS_ALL_CB_FLAGS 0x7 /* Mask of all currently ++ * supported cb flags ++ */ ++ + /* List of known BPF sock_ops operators. + * New entries can only be added at the end + */ +@@ -859,9 +2533,156 @@ enum { + BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control + * needs ECN + */ ++ BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is ++ * based on the path and may be ++ * dependent on the congestion control ++ * algorithm. In general it indicates ++ * a congestion threshold. RTTs above ++ * this indicate congestion ++ */ ++ BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. ++ * Arg1: value of icsk_retransmits ++ * Arg2: value of icsk_rto ++ * Arg3: whether RTO has expired ++ */ ++ BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. ++ * Arg1: sequence number of 1st byte ++ * Arg2: # segments ++ * Arg3: return value of ++ * tcp_transmit_skb (0 => success) ++ */ ++ BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. ++ * Arg1: old_state ++ * Arg2: new_state ++ */ ++ BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after ++ * socket transition to LISTEN state. ++ */ ++}; ++ ++/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect ++ * changes between the TCP and BPF versions. Ideally this should never happen. ++ * If it does, we need to add code to convert them before calling ++ * the BPF sock_ops function. ++ */ ++enum { ++ BPF_TCP_ESTABLISHED = 1, ++ BPF_TCP_SYN_SENT, ++ BPF_TCP_SYN_RECV, ++ BPF_TCP_FIN_WAIT1, ++ BPF_TCP_FIN_WAIT2, ++ BPF_TCP_TIME_WAIT, ++ BPF_TCP_CLOSE, ++ BPF_TCP_CLOSE_WAIT, ++ BPF_TCP_LAST_ACK, ++ BPF_TCP_LISTEN, ++ BPF_TCP_CLOSING, /* Now a valid state */ ++ BPF_TCP_NEW_SYN_RECV, ++ ++ BPF_TCP_MAX_STATES /* Leave at the end! */ + }; + + #define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ + #define TCP_BPF_SNDCWND_CLAMP 1002 /* Set sndcwnd_clamp */ + ++struct bpf_perf_event_value { ++ __u64 counter; ++ __u64 enabled; ++ __u64 running; ++}; ++ ++#define BPF_DEVCG_ACC_MKNOD (1ULL << 0) ++#define BPF_DEVCG_ACC_READ (1ULL << 1) ++#define BPF_DEVCG_ACC_WRITE (1ULL << 2) ++ ++#define BPF_DEVCG_DEV_BLOCK (1ULL << 0) ++#define BPF_DEVCG_DEV_CHAR (1ULL << 1) ++ ++struct bpf_cgroup_dev_ctx { ++ /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ ++ __u32 access_type; ++ __u32 major; ++ __u32 minor; ++}; ++ ++struct bpf_raw_tracepoint_args { ++ __u64 args[0]; ++}; ++ ++/* DIRECT: Skip the FIB rules and go to FIB table associated with device ++ * OUTPUT: Do lookup from egress perspective; default is ingress ++ */ ++#define BPF_FIB_LOOKUP_DIRECT BIT(0) ++#define BPF_FIB_LOOKUP_OUTPUT BIT(1) ++ ++enum { ++ BPF_FIB_LKUP_RET_SUCCESS, /* lookup successful */ ++ BPF_FIB_LKUP_RET_BLACKHOLE, /* dest is blackholed; can be dropped */ ++ BPF_FIB_LKUP_RET_UNREACHABLE, /* dest is unreachable; can be dropped */ ++ BPF_FIB_LKUP_RET_PROHIBIT, /* dest not allowed; can be dropped */ ++ BPF_FIB_LKUP_RET_NOT_FWDED, /* packet is not forwarded */ ++ BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */ ++ BPF_FIB_LKUP_RET_UNSUPP_LWT, /* fwd requires encapsulation */ ++ BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */ ++ BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */ ++}; ++ ++struct bpf_fib_lookup { ++ /* input: network family for lookup (AF_INET, AF_INET6) ++ * output: network family of egress nexthop ++ */ ++ __u8 family; ++ ++ /* set if lookup is to consider L4 data - e.g., FIB rules */ ++ __u8 l4_protocol; ++ __be16 sport; ++ __be16 dport; ++ ++ /* total length of packet from network header - used for MTU check */ ++ __u16 tot_len; ++ ++ /* input: L3 device index for lookup ++ * output: device index from FIB lookup ++ */ ++ __u32 ifindex; ++ ++ union { ++ /* inputs to lookup */ ++ __u8 tos; /* AF_INET */ ++ __be32 flowinfo; /* AF_INET6, flow_label + priority */ ++ ++ /* output: metric of fib result (IPv4/IPv6 only) */ ++ __u32 rt_metric; ++ }; ++ ++ union { ++ __be32 ipv4_src; ++ __u32 ipv6_src[4]; /* in6_addr; network order */ ++ }; ++ ++ /* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in ++ * network header. output: bpf_fib_lookup sets to gateway address ++ * if FIB lookup returns gateway route ++ */ ++ union { ++ __be32 ipv4_dst; ++ __u32 ipv6_dst[4]; /* in6_addr; network order */ ++ }; ++ ++ /* output */ ++ __be16 h_vlan_proto; ++ __be16 h_vlan_TCI; ++ __u8 smac[6]; /* ETH_ALEN */ ++ __u8 dmac[6]; /* ETH_ALEN */ ++}; ++ ++enum bpf_task_fd_type { ++ BPF_FD_TYPE_RAW_TRACEPOINT, /* tp name */ ++ BPF_FD_TYPE_TRACEPOINT, /* tp name */ ++ BPF_FD_TYPE_KPROBE, /* (symbol + offset) or addr */ ++ BPF_FD_TYPE_KRETPROBE, /* (symbol + offset) or addr */ ++ BPF_FD_TYPE_UPROBE, /* filename + offset */ ++ BPF_FD_TYPE_URETPROBE, /* filename + offset */ ++}; ++ + #endif /* __LINUX_BPF_H__ */ +diff --git a/include/uapi/linux/bpf_common.h b/include/uapi/linux/bpf_common.h +index afe7433..f0fe139 100644 +--- a/include/uapi/linux/bpf_common.h ++++ b/include/uapi/linux/bpf_common.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_BPF_COMMON_H__ + #define __LINUX_BPF_COMMON_H__ + +@@ -14,9 +15,10 @@ + + /* ld/ldx fields */ + #define BPF_SIZE(code) ((code) & 0x18) +-#define BPF_W 0x00 +-#define BPF_H 0x08 +-#define BPF_B 0x10 ++#define BPF_W 0x00 /* 32-bit */ ++#define BPF_H 0x08 /* 16-bit */ ++#define BPF_B 0x10 /* 8-bit */ ++/* eBPF BPF_DW 0x18 64-bit */ + #define BPF_MODE(code) ((code) & 0xe0) + #define BPF_IMM 0x00 + #define BPF_ABS 0x20 +diff --git a/include/uapi/linux/btf.h b/include/uapi/linux/btf.h +new file mode 100644 +index 0000000..5dd580a +--- /dev/null ++++ b/include/uapi/linux/btf.h +@@ -0,0 +1,113 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++/* Copyright (c) 2018 Facebook */ ++#ifndef __LINUX_BTF_H__ ++#define __LINUX_BTF_H__ ++ ++#include ++ ++#define BTF_MAGIC 0xeB9F ++#define BTF_VERSION 1 ++ ++struct btf_header { ++ __u16 magic; ++ __u8 version; ++ __u8 flags; ++ __u32 hdr_len; ++ ++ /* All offsets are in bytes relative to the end of this header */ ++ __u32 type_off; /* offset of type section */ ++ __u32 type_len; /* length of type section */ ++ __u32 str_off; /* offset of string section */ ++ __u32 str_len; /* length of string section */ ++}; ++ ++/* Max # of type identifier */ ++#define BTF_MAX_TYPE 0x0000ffff ++/* Max offset into the string section */ ++#define BTF_MAX_NAME_OFFSET 0x0000ffff ++/* Max # of struct/union/enum members or func args */ ++#define BTF_MAX_VLEN 0xffff ++ ++struct btf_type { ++ __u32 name_off; ++ /* "info" bits arrangement ++ * bits 0-15: vlen (e.g. # of struct's members) ++ * bits 16-23: unused ++ * bits 24-27: kind (e.g. int, ptr, array...etc) ++ * bits 28-31: unused ++ */ ++ __u32 info; ++ /* "size" is used by INT, ENUM, STRUCT and UNION. ++ * "size" tells the size of the type it is describing. ++ * ++ * "type" is used by PTR, TYPEDEF, VOLATILE, CONST and RESTRICT. ++ * "type" is a type_id referring to another type. ++ */ ++ union { ++ __u32 size; ++ __u32 type; ++ }; ++}; ++ ++#define BTF_INFO_KIND(info) (((info) >> 24) & 0x0f) ++#define BTF_INFO_VLEN(info) ((info) & 0xffff) ++ ++#define BTF_KIND_UNKN 0 /* Unknown */ ++#define BTF_KIND_INT 1 /* Integer */ ++#define BTF_KIND_PTR 2 /* Pointer */ ++#define BTF_KIND_ARRAY 3 /* Array */ ++#define BTF_KIND_STRUCT 4 /* Struct */ ++#define BTF_KIND_UNION 5 /* Union */ ++#define BTF_KIND_ENUM 6 /* Enumeration */ ++#define BTF_KIND_FWD 7 /* Forward */ ++#define BTF_KIND_TYPEDEF 8 /* Typedef */ ++#define BTF_KIND_VOLATILE 9 /* Volatile */ ++#define BTF_KIND_CONST 10 /* Const */ ++#define BTF_KIND_RESTRICT 11 /* Restrict */ ++#define BTF_KIND_MAX 11 ++#define NR_BTF_KINDS 12 ++ ++/* For some specific BTF_KIND, "struct btf_type" is immediately ++ * followed by extra data. ++ */ ++ ++/* BTF_KIND_INT is followed by a u32 and the following ++ * is the 32 bits arrangement: ++ */ ++#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) ++#define BTF_INT_OFFSET(VAL) (((VAL & 0x00ff0000)) >> 16) ++#define BTF_INT_BITS(VAL) ((VAL) & 0x0000ffff) ++ ++/* Attributes stored in the BTF_INT_ENCODING */ ++#define BTF_INT_SIGNED (1 << 0) ++#define BTF_INT_CHAR (1 << 1) ++#define BTF_INT_BOOL (1 << 2) ++ ++/* BTF_KIND_ENUM is followed by multiple "struct btf_enum". ++ * The exact number of btf_enum is stored in the vlen (of the ++ * info in "struct btf_type"). ++ */ ++struct btf_enum { ++ __u32 name_off; ++ __s32 val; ++}; ++ ++/* BTF_KIND_ARRAY is followed by one "struct btf_array" */ ++struct btf_array { ++ __u32 type; ++ __u32 index_type; ++ __u32 nelems; ++}; ++ ++/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed ++ * by multiple "struct btf_member". The exact number ++ * of btf_member is stored in the vlen (of the info in ++ * "struct btf_type"). ++ */ ++struct btf_member { ++ __u32 name_off; ++ __u32 type; ++ __u32 offset; /* offset in bits */ ++}; ++ ++#endif /* __LINUX_BTF_H__ */ +diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h +index f7a810d..4d1ab8e 100644 +--- a/include/uapi/linux/can.h ++++ b/include/uapi/linux/can.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ + /* + * linux/can.h + * +diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h +index b9214bd..f0c5e58 100644 +--- a/include/uapi/linux/can/netlink.h ++++ b/include/uapi/linux/can/netlink.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * linux/can/netlink.h + * +@@ -131,6 +132,7 @@ enum { + IFLA_CAN_TERMINATION_CONST, + IFLA_CAN_BITRATE_CONST, + IFLA_CAN_DATA_BITRATE_CONST, ++ IFLA_CAN_BITRATE_MAX, + __IFLA_CAN_MAX + }; + +diff --git a/include/uapi/linux/can/vxcan.h b/include/uapi/linux/can/vxcan.h +index 5b29e8a..b364d77 100644 +--- a/include/uapi/linux/can/vxcan.h ++++ b/include/uapi/linux/can/vxcan.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _CAN_VXCAN_H + #define _CAN_VXCAN_H + +diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h +index a62695e..5ee0e73 100644 +--- a/include/uapi/linux/devlink.h ++++ b/include/uapi/linux/devlink.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * include/uapi/linux/devlink.h - Network physical device Netlink interface + * Copyright (c) 2016 Mellanox Technologies. All rights reserved. +@@ -69,6 +70,24 @@ enum devlink_command { + DEVLINK_CMD_DPIPE_ENTRIES_GET, + DEVLINK_CMD_DPIPE_HEADERS_GET, + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, ++ DEVLINK_CMD_RESOURCE_SET, ++ DEVLINK_CMD_RESOURCE_DUMP, ++ ++ /* Hot driver reload, makes configuration changes take place. The ++ * devlink instance is not released during the process. ++ */ ++ DEVLINK_CMD_RELOAD, ++ ++ DEVLINK_CMD_PARAM_GET, /* can dump */ ++ DEVLINK_CMD_PARAM_SET, ++ DEVLINK_CMD_PARAM_NEW, ++ DEVLINK_CMD_PARAM_DEL, ++ ++ DEVLINK_CMD_REGION_GET, ++ DEVLINK_CMD_REGION_SET, ++ DEVLINK_CMD_REGION_NEW, ++ DEVLINK_CMD_REGION_DEL, ++ DEVLINK_CMD_REGION_READ, + + /* add new commands above here */ + __DEVLINK_CMD_MAX, +@@ -124,6 +143,26 @@ enum devlink_eswitch_encap_mode { + DEVLINK_ESWITCH_ENCAP_MODE_BASIC, + }; + ++enum devlink_port_flavour { ++ DEVLINK_PORT_FLAVOUR_PHYSICAL, /* Any kind of a port physically ++ * facing the user. ++ */ ++ DEVLINK_PORT_FLAVOUR_CPU, /* CPU port */ ++ DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture ++ * interconnect port. ++ */ ++}; ++ ++enum devlink_param_cmode { ++ DEVLINK_PARAM_CMODE_RUNTIME, ++ DEVLINK_PARAM_CMODE_DRIVERINIT, ++ DEVLINK_PARAM_CMODE_PERMANENT, ++ ++ /* Add new configuration modes above */ ++ __DEVLINK_PARAM_CMODE_MAX, ++ DEVLINK_PARAM_CMODE_MAX = __DEVLINK_PARAM_CMODE_MAX - 1 ++}; ++ + enum devlink_attr { + /* don't change the order or add anything between, this is ABI! */ + DEVLINK_ATTR_UNSPEC, +@@ -201,6 +240,45 @@ enum devlink_attr { + DEVLINK_ATTR_PAD, + + DEVLINK_ATTR_ESWITCH_ENCAP_MODE, /* u8 */ ++ DEVLINK_ATTR_RESOURCE_LIST, /* nested */ ++ DEVLINK_ATTR_RESOURCE, /* nested */ ++ DEVLINK_ATTR_RESOURCE_NAME, /* string */ ++ DEVLINK_ATTR_RESOURCE_ID, /* u64 */ ++ DEVLINK_ATTR_RESOURCE_SIZE, /* u64 */ ++ DEVLINK_ATTR_RESOURCE_SIZE_NEW, /* u64 */ ++ DEVLINK_ATTR_RESOURCE_SIZE_VALID, /* u8 */ ++ DEVLINK_ATTR_RESOURCE_SIZE_MIN, /* u64 */ ++ DEVLINK_ATTR_RESOURCE_SIZE_MAX, /* u64 */ ++ DEVLINK_ATTR_RESOURCE_SIZE_GRAN, /* u64 */ ++ DEVLINK_ATTR_RESOURCE_UNIT, /* u8 */ ++ DEVLINK_ATTR_RESOURCE_OCC, /* u64 */ ++ DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */ ++ DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */ ++ ++ DEVLINK_ATTR_PORT_FLAVOUR, /* u16 */ ++ DEVLINK_ATTR_PORT_NUMBER, /* u32 */ ++ DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */ ++ ++ DEVLINK_ATTR_PARAM, /* nested */ ++ DEVLINK_ATTR_PARAM_NAME, /* string */ ++ DEVLINK_ATTR_PARAM_GENERIC, /* flag */ ++ DEVLINK_ATTR_PARAM_TYPE, /* u8 */ ++ DEVLINK_ATTR_PARAM_VALUES_LIST, /* nested */ ++ DEVLINK_ATTR_PARAM_VALUE, /* nested */ ++ DEVLINK_ATTR_PARAM_VALUE_DATA, /* dynamic */ ++ DEVLINK_ATTR_PARAM_VALUE_CMODE, /* u8 */ ++ ++ DEVLINK_ATTR_REGION_NAME, /* string */ ++ DEVLINK_ATTR_REGION_SIZE, /* u64 */ ++ DEVLINK_ATTR_REGION_SNAPSHOTS, /* nested */ ++ DEVLINK_ATTR_REGION_SNAPSHOT, /* nested */ ++ DEVLINK_ATTR_REGION_SNAPSHOT_ID, /* u32 */ ++ ++ DEVLINK_ATTR_REGION_CHUNKS, /* nested */ ++ DEVLINK_ATTR_REGION_CHUNK, /* nested */ ++ DEVLINK_ATTR_REGION_CHUNK_DATA, /* binary */ ++ DEVLINK_ATTR_REGION_CHUNK_ADDR, /* u64 */ ++ DEVLINK_ATTR_REGION_CHUNK_LEN, /* u64 */ + + /* add new attributes above here, update the policy in devlink.c */ + +@@ -244,4 +322,8 @@ enum devlink_dpipe_header_id { + DEVLINK_DPIPE_HEADER_IPV6, + }; + ++enum devlink_resource_unit { ++ DEVLINK_RESOURCE_UNIT_ENTRY, ++}; ++ + #endif /* _LINUX_DEVLINK_H_ */ +diff --git a/include/uapi/linux/elf-em.h b/include/uapi/linux/elf-em.h +index 9cd1de9..31aa101 100644 +--- a/include/uapi/linux/elf-em.h ++++ b/include/uapi/linux/elf-em.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_ELF_EM_H + #define _LINUX_ELF_EM_H + +diff --git a/include/uapi/linux/fib_rules.h b/include/uapi/linux/fib_rules.h +index bbf02a6..232df14 100644 +--- a/include/uapi/linux/fib_rules.h ++++ b/include/uapi/linux/fib_rules.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_FIB_RULES_H + #define __LINUX_FIB_RULES_H + +@@ -22,7 +23,7 @@ struct fib_rule_hdr { + __u8 tos; + + __u8 table; +- __u8 res1; /* reserved */ ++ __u8 res1; /* reserved */ + __u8 res2; /* reserved */ + __u8 action; + +@@ -34,6 +35,11 @@ struct fib_rule_uid_range { + __u32 end; + }; + ++struct fib_rule_port_range { ++ __u16 start; ++ __u16 end; ++}; ++ + enum { + FRA_UNSPEC, + FRA_DST, /* destination address */ +@@ -57,6 +63,10 @@ enum { + FRA_PAD, + FRA_L3MDEV, /* iif or oif is l3mdev goto its table */ + FRA_UID_RANGE, /* UID range */ ++ FRA_PROTOCOL, /* Originator of the rule */ ++ FRA_IP_PROTO, /* ip proto */ ++ FRA_SPORT_RANGE, /* sport */ ++ FRA_DPORT_RANGE, /* dport */ + __FRA_MAX + }; + +diff --git a/include/uapi/linux/filter.h b/include/uapi/linux/filter.h +index e4f2f74..eaef459 100644 +--- a/include/uapi/linux/filter.h ++++ b/include/uapi/linux/filter.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * Linux Socket Filter Data Structures + */ +diff --git a/include/uapi/linux/fou.h b/include/uapi/linux/fou.h +index 744c323..bf022c6 100644 +--- a/include/uapi/linux/fou.h ++++ b/include/uapi/linux/fou.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* fou.h - FOU Interface */ + + #ifndef _LINUX_FOU_H +diff --git a/include/uapi/linux/gen_stats.h b/include/uapi/linux/gen_stats.h +index 52deccc..24a861c 100644 +--- a/include/uapi/linux/gen_stats.h ++++ b/include/uapi/linux/gen_stats.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_GEN_STATS_H + #define __LINUX_GEN_STATS_H + +diff --git a/include/uapi/linux/genetlink.h b/include/uapi/linux/genetlink.h +index 08239d8..1317119 100644 +--- a/include/uapi/linux/genetlink.h ++++ b/include/uapi/linux/genetlink.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_GENERIC_NETLINK_H + #define __LINUX_GENERIC_NETLINK_H + +diff --git a/include/uapi/linux/hdlc/ioctl.h b/include/uapi/linux/hdlc/ioctl.h +index 04bc027..0fe4238 100644 +--- a/include/uapi/linux/hdlc/ioctl.h ++++ b/include/uapi/linux/hdlc/ioctl.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __HDLC_IOCTL_H__ + #define __HDLC_IOCTL_H__ + +diff --git a/include/uapi/linux/icmpv6.h b/include/uapi/linux/icmpv6.h +index a2e839e..cb247a5 100644 +--- a/include/uapi/linux/icmpv6.h ++++ b/include/uapi/linux/icmpv6.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_ICMPV6_H + #define _LINUX_ICMPV6_H + +diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h +index b4ba020..495cdd2 100644 +--- a/include/uapi/linux/if.h ++++ b/include/uapi/linux/if.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +diff --git a/include/uapi/linux/if_addr.h b/include/uapi/linux/if_addr.h +index 26f0ecf..a924606 100644 +--- a/include/uapi/linux/if_addr.h ++++ b/include/uapi/linux/if_addr.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_IF_ADDR_H + #define __LINUX_IF_ADDR_H + +@@ -32,6 +33,7 @@ enum { + IFA_CACHEINFO, + IFA_MULTICAST, + IFA_FLAGS, ++ IFA_RT_PRIORITY, /* u32, priority/metric for prefix route */ + __IFA_MAX, + }; + +diff --git a/include/uapi/linux/if_addrlabel.h b/include/uapi/linux/if_addrlabel.h +index 54580c2..d1f5974 100644 +--- a/include/uapi/linux/if_addrlabel.h ++++ b/include/uapi/linux/if_addrlabel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * if_addrlabel.h - netlink interface for address labels + * +diff --git a/include/uapi/linux/if_alg.h b/include/uapi/linux/if_alg.h +index f2acd2f..bc2bcde 100644 +--- a/include/uapi/linux/if_alg.h ++++ b/include/uapi/linux/if_alg.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * if_alg: User-space algorithm interface + * +diff --git a/include/uapi/linux/if_arp.h b/include/uapi/linux/if_arp.h +index 199f253..cd136a6 100644 +--- a/include/uapi/linux/if_arp.h ++++ b/include/uapi/linux/if_arp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +diff --git a/include/uapi/linux/if_bonding.h b/include/uapi/linux/if_bonding.h +index 9635a62..61a1bf6 100644 +--- a/include/uapi/linux/if_bonding.h ++++ b/include/uapi/linux/if_bonding.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-1.0+ WITH Linux-syscall-note */ + /* + * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'. + * +diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h +index 156f443..bdfecf9 100644 +--- a/include/uapi/linux/if_bridge.h ++++ b/include/uapi/linux/if_bridge.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Linux ethernet bridge + * +diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h +index 7dde037..8c36f63 100644 +--- a/include/uapi/linux/if_ether.h ++++ b/include/uapi/linux/if_ether.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +@@ -29,6 +30,7 @@ + */ + + #define ETH_ALEN 6 /* Octets in one ethernet addr */ ++#define ETH_TLEN 2 /* Octets in ethernet type field */ + #define ETH_HLEN 14 /* Total octets in header. */ + #define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ + #define ETH_DATA_LEN 1500 /* Max. octets in payload */ +@@ -46,6 +48,7 @@ + #define ETH_P_PUP 0x0200 /* Xerox PUP packet */ + #define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ + #define ETH_P_TSN 0x22F0 /* TSN (IEEE 1722) packet */ ++#define ETH_P_ERSPAN2 0x22EB /* ERSPAN version 2 (type III) */ + #define ETH_P_IP 0x0800 /* Internet Protocol packet */ + #define ETH_P_X25 0x0805 /* CCITT X.25 */ + #define ETH_P_ARP 0x0806 /* Address Resolution packet */ +@@ -86,6 +89,7 @@ + #define ETH_P_AOE 0x88A2 /* ATA over Ethernet */ + #define ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */ + #define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */ ++#define ETH_P_PREAUTH 0x88C7 /* 802.11 Preauthentication */ + #define ETH_P_TIPC 0x88CA /* TIPC */ + #define ETH_P_MACSEC 0x88E5 /* 802.1ae MACsec */ + #define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */ +@@ -148,11 +152,18 @@ + * This is an Ethernet frame header. + */ + ++/* allow libcs like musl to deactivate this, glibc does not implement this. */ ++#ifndef __UAPI_DEF_ETHHDR ++#define __UAPI_DEF_ETHHDR 1 ++#endif ++ ++#if __UAPI_DEF_ETHHDR + struct ethhdr { + unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ + unsigned char h_source[ETH_ALEN]; /* source ether addr */ + __be16 h_proto; /* packet type ID field */ + } __attribute__((packed)); ++#endif + + + #endif /* _LINUX_IF_ETHER_H */ +diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h +index 1f97d05..1c64ed4 100644 +--- a/include/uapi/linux/if_link.h ++++ b/include/uapi/linux/if_link.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_IF_LINK_H + #define _LINUX_IF_LINK_H + +@@ -158,6 +159,11 @@ enum { + IFLA_PAD, + IFLA_XDP, + IFLA_EVENT, ++ IFLA_NEW_NETNSID, ++ IFLA_IF_NETNSID, ++ IFLA_CARRIER_UP_COUNT, ++ IFLA_CARRIER_DOWN_COUNT, ++ IFLA_NEW_IFINDEX, + __IFLA_MAX + }; + +@@ -323,6 +329,9 @@ enum { + IFLA_BRPORT_MCAST_TO_UCAST, + IFLA_BRPORT_VLAN_TUNNEL, + IFLA_BRPORT_BCAST_FLOOD, ++ IFLA_BRPORT_GROUP_FWD_MASK, ++ IFLA_BRPORT_NEIGH_SUPPRESS, ++ IFLA_BRPORT_ISOLATED, + __IFLA_BRPORT_MAX + }; + #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) +@@ -460,6 +469,7 @@ enum macsec_validation_type { + enum { + IFLA_IPVLAN_UNSPEC, + IFLA_IPVLAN_MODE, ++ IFLA_IPVLAN_FLAGS, + __IFLA_IPVLAN_MAX + }; + +@@ -472,6 +482,9 @@ enum ipvlan_mode { + IPVLAN_MODE_MAX + }; + ++#define IPVLAN_F_PRIVATE 0x01 ++#define IPVLAN_F_VEPA 0x02 ++ + /* VXLAN section */ + enum { + IFLA_VXLAN_UNSPEC, +@@ -502,6 +515,7 @@ enum { + IFLA_VXLAN_COLLECT_METADATA, + IFLA_VXLAN_LABEL, + IFLA_VXLAN_GPE, ++ IFLA_VXLAN_TTL_INHERIT, + __IFLA_VXLAN_MAX + }; + #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) +@@ -721,6 +735,8 @@ enum { + IFLA_VF_STATS_BROADCAST, + IFLA_VF_STATS_MULTICAST, + IFLA_VF_STATS_PAD, ++ IFLA_VF_STATS_RX_DROPPED, ++ IFLA_VF_STATS_TX_DROPPED, + __IFLA_VF_STATS_MAX, + }; + +@@ -902,6 +918,7 @@ enum { + XDP_ATTACHED_DRV, + XDP_ATTACHED_SKB, + XDP_ATTACHED_HW, ++ XDP_ATTACHED_MULTI, + }; + + enum { +@@ -910,6 +927,9 @@ enum { + IFLA_XDP_ATTACHED, + IFLA_XDP_FLAGS, + IFLA_XDP_PROG_ID, ++ IFLA_XDP_DRV_PROG_ID, ++ IFLA_XDP_SKB_PROG_ID, ++ IFLA_XDP_HW_PROG_ID, + __IFLA_XDP_MAX, + }; + +@@ -925,4 +945,43 @@ enum { + IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ + }; + ++/* tun section */ ++ ++enum { ++ IFLA_TUN_UNSPEC, ++ IFLA_TUN_OWNER, ++ IFLA_TUN_GROUP, ++ IFLA_TUN_TYPE, ++ IFLA_TUN_PI, ++ IFLA_TUN_VNET_HDR, ++ IFLA_TUN_PERSIST, ++ IFLA_TUN_MULTI_QUEUE, ++ IFLA_TUN_NUM_QUEUES, ++ IFLA_TUN_NUM_DISABLED_QUEUES, ++ __IFLA_TUN_MAX, ++}; ++ ++#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) ++ ++/* rmnet section */ ++ ++#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) ++#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) ++#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) ++#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) ++ ++enum { ++ IFLA_RMNET_UNSPEC, ++ IFLA_RMNET_MUX_ID, ++ IFLA_RMNET_FLAGS, ++ __IFLA_RMNET_MAX, ++}; ++ ++#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) ++ ++struct ifla_rmnet_flags { ++ __u32 flags; ++ __u32 mask; ++}; ++ + #endif /* _LINUX_IF_LINK_H */ +diff --git a/include/uapi/linux/if_macsec.h b/include/uapi/linux/if_macsec.h +index 22939a3..7743993 100644 +--- a/include/uapi/linux/if_macsec.h ++++ b/include/uapi/linux/if_macsec.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * include/uapi/linux/if_macsec.h - MACsec device + * +@@ -21,8 +22,13 @@ + + #define MACSEC_KEYID_LEN 16 + +-#define MACSEC_DEFAULT_CIPHER_ID 0x0080020001000001ULL +-#define MACSEC_DEFAULT_CIPHER_ALT 0x0080C20001000001ULL ++/* cipher IDs as per IEEE802.1AEbn-2011 */ ++#define MACSEC_CIPHER_ID_GCM_AES_128 0x0080C20001000001ULL ++#define MACSEC_CIPHER_ID_GCM_AES_256 0x0080C20001000002ULL ++ ++/* deprecated cipher ID for GCM-AES-128 */ ++#define MACSEC_DEFAULT_CIPHER_ID 0x0080020001000001ULL ++#define MACSEC_DEFAULT_CIPHER_ALT MACSEC_CIPHER_ID_GCM_AES_128 + + #define MACSEC_MIN_ICV_LEN 8 + #define MACSEC_MAX_ICV_LEN 32 +diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h +index 4df96a7..67b61d9 100644 +--- a/include/uapi/linux/if_packet.h ++++ b/include/uapi/linux/if_packet.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_IF_PACKET_H + #define __LINUX_IF_PACKET_H + +diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h +index d5ecb42..be9b744 100644 +--- a/include/uapi/linux/if_tun.h ++++ b/include/uapi/linux/if_tun.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Universal TUN/TAP device driver. + * Copyright (C) 1999-2000 Maxim Krasnyansky +@@ -56,10 +57,14 @@ + */ + #define TUNSETVNETBE _IOW('T', 222, int) + #define TUNGETVNETBE _IOR('T', 223, int) ++#define TUNSETSTEERINGEBPF _IOR('T', 224, int) ++#define TUNSETFILTEREBPF _IOR('T', 225, int) + + /* TUNSETIFF ifr flags */ + #define IFF_TUN 0x0001 + #define IFF_TAP 0x0002 ++#define IFF_NAPI 0x0010 ++#define IFF_NAPI_FRAGS 0x0020 + #define IFF_NO_PI 0x1000 + /* This flag has no real effect */ + #define IFF_ONE_QUEUE 0x2000 +diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h +index 21834ca..ecdc766 100644 +--- a/include/uapi/linux/if_tunnel.h ++++ b/include/uapi/linux/if_tunnel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _IF_TUNNEL_H_ + #define _IF_TUNNEL_H_ + +@@ -84,6 +85,7 @@ enum tunnel_encap_types { + TUNNEL_ENCAP_NONE, + TUNNEL_ENCAP_FOU, + TUNNEL_ENCAP_GUE, ++ TUNNEL_ENCAP_MPLS, + }; + + #define TUNNEL_ENCAP_FLAG_CSUM (1<<0) +@@ -135,6 +137,9 @@ enum { + IFLA_GRE_IGNORE_DF, + IFLA_GRE_FWMARK, + IFLA_GRE_ERSPAN_INDEX, ++ IFLA_GRE_ERSPAN_VER, ++ IFLA_GRE_ERSPAN_DIR, ++ IFLA_GRE_ERSPAN_HWID, + __IFLA_GRE_MAX, + }; + +diff --git a/include/uapi/linux/if_vlan.h b/include/uapi/linux/if_vlan.h +index 24ae007..18a15da 100644 +--- a/include/uapi/linux/if_vlan.h ++++ b/include/uapi/linux/if_vlan.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * VLAN An implementation of 802.1Q VLAN tagging. + * +diff --git a/include/uapi/linux/ife.h b/include/uapi/linux/ife.h +index 2954da3..bdd953c 100644 +--- a/include/uapi/linux/ife.h ++++ b/include/uapi/linux/ife.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __UAPI_IFE_H + #define __UAPI_IFE_H + +diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h +index 7e328d7..6a6c97c 100644 +--- a/include/uapi/linux/ila.h ++++ b/include/uapi/linux/ila.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* ila.h - ILA Interface */ + + #ifndef _LINUX_ILA_H +@@ -16,6 +17,8 @@ enum { + ILA_ATTR_DIR, /* u32 */ + ILA_ATTR_PAD, + ILA_ATTR_CSUM_MODE, /* u8 */ ++ ILA_ATTR_IDENT_TYPE, /* u8 */ ++ ILA_ATTR_HOOK_TYPE, /* u8 */ + + __ILA_ATTR_MAX, + }; +@@ -27,6 +30,7 @@ enum { + ILA_CMD_ADD, + ILA_CMD_DEL, + ILA_CMD_GET, ++ ILA_CMD_FLUSH, + + __ILA_CMD_MAX, + }; +@@ -40,6 +44,25 @@ enum { + ILA_CSUM_ADJUST_TRANSPORT, + ILA_CSUM_NEUTRAL_MAP, + ILA_CSUM_NO_ACTION, ++ ILA_CSUM_NEUTRAL_MAP_AUTO, ++}; ++ ++enum { ++ ILA_ATYPE_IID = 0, ++ ILA_ATYPE_LUID, ++ ILA_ATYPE_VIRT_V4, ++ ILA_ATYPE_VIRT_UNI_V6, ++ ILA_ATYPE_VIRT_MULTI_V6, ++ ILA_ATYPE_NONLOCAL_ADDR, ++ ILA_ATYPE_RSVD_1, ++ ILA_ATYPE_RSVD_2, ++ ++ ILA_ATYPE_USE_FORMAT = 32, /* Get type from type field in identifier */ ++}; ++ ++enum { ++ ILA_HOOK_ROUTE_OUTPUT, ++ ILA_HOOK_ROUTE_INPUT, + }; + + #endif /* _LINUX_ILA_H */ +diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h +index 9439efa..a4f143b 100644 +--- a/include/uapi/linux/in.h ++++ b/include/uapi/linux/in.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +diff --git a/include/uapi/linux/in6.h b/include/uapi/linux/in6.h +index 6f3bdee..409bb3f 100644 +--- a/include/uapi/linux/in6.h ++++ b/include/uapi/linux/in6.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Types and definitions for AF_INET6 + * Linux INET6 implementation +@@ -284,6 +285,7 @@ struct in6_flowlabel_req { + #define IPV6_TRANSPARENT 75 + #define IPV6_UNICAST_IF 76 + #define IPV6_RECVFRAGSIZE 77 ++#define IPV6_FREEBIND 78 + + /* + * Multicast Routing: +diff --git a/include/uapi/linux/in_route.h b/include/uapi/linux/in_route.h +index b261b8c..0cc2c23 100644 +--- a/include/uapi/linux/in_route.h ++++ b/include/uapi/linux/in_route.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_IN_ROUTE_H + #define _LINUX_IN_ROUTE_H + +diff --git a/include/uapi/linux/inet_diag.h b/include/uapi/linux/inet_diag.h +index bada4d7..f98d82d 100644 +--- a/include/uapi/linux/inet_diag.h ++++ b/include/uapi/linux/inet_diag.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _INET_DIAG_H_ + #define _INET_DIAG_H_ + +@@ -91,6 +92,8 @@ enum { + INET_DIAG_BC_D_COND, + INET_DIAG_BC_DEV_COND, /* u32 ifindex */ + INET_DIAG_BC_MARK_COND, ++ INET_DIAG_BC_S_EQ, ++ INET_DIAG_BC_D_EQ, + }; + + struct inet_diag_hostcond { +diff --git a/include/uapi/linux/ip.h b/include/uapi/linux/ip.h +index 1907284..883fd33 100644 +--- a/include/uapi/linux/ip.h ++++ b/include/uapi/linux/ip.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +diff --git a/include/uapi/linux/ip6_tunnel.h b/include/uapi/linux/ip6_tunnel.h +index 425926c..0245269 100644 +--- a/include/uapi/linux/ip6_tunnel.h ++++ b/include/uapi/linux/ip6_tunnel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _IP6_TUNNEL_H + #define _IP6_TUNNEL_H + +@@ -20,6 +21,8 @@ + #define IP6_TNL_F_RCV_DSCP_COPY 0x10 + /* copy fwmark from inner packet */ + #define IP6_TNL_F_USE_ORIG_FWMARK 0x20 ++/* allow remote endpoint on the local node */ ++#define IP6_TNL_F_ALLOW_LOCAL_REMOTE 0x40 + + struct ip6_tnl_parm { + char name[IFNAMSIZ]; /* name of tunnel device */ +diff --git a/include/uapi/linux/ipsec.h b/include/uapi/linux/ipsec.h +index d17a630..50d8ee1 100644 +--- a/include/uapi/linux/ipsec.h ++++ b/include/uapi/linux/ipsec.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_IPSEC_H + #define _LINUX_IPSEC_H + +diff --git a/include/uapi/linux/kernel.h b/include/uapi/linux/kernel.h +index 527549f..d99ffa1 100644 +--- a/include/uapi/linux/kernel.h ++++ b/include/uapi/linux/kernel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_KERNEL_H + #define _LINUX_KERNEL_H + +diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h +index 8a80007..1fe52a7 100644 +--- a/include/uapi/linux/l2tp.h ++++ b/include/uapi/linux/l2tp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * L2TP-over-IP socket for L2TPv3. + * +@@ -64,7 +65,7 @@ struct sockaddr_l2tpip6 { + * TUNNEL_MODIFY - CONN_ID, udpcsum + * TUNNEL_GETSTATS - CONN_ID, (stats) + * TUNNEL_GET - CONN_ID, (...) +- * SESSION_CREATE - SESSION_ID, PW_TYPE, offset, data_seq, cookie, peer_cookie, offset, l2spec ++ * SESSION_CREATE - SESSION_ID, PW_TYPE, data_seq, cookie, peer_cookie, l2spec + * SESSION_DELETE - SESSION_ID + * SESSION_MODIFY - SESSION_ID, data_seq + * SESSION_GET - SESSION_ID, (...) +@@ -93,10 +94,10 @@ enum { + L2TP_ATTR_NONE, /* no data */ + L2TP_ATTR_PW_TYPE, /* u16, enum l2tp_pwtype */ + L2TP_ATTR_ENCAP_TYPE, /* u16, enum l2tp_encap_type */ +- L2TP_ATTR_OFFSET, /* u16 */ ++ L2TP_ATTR_OFFSET, /* u16 (not used) */ + L2TP_ATTR_DATA_SEQ, /* u16 */ + L2TP_ATTR_L2SPEC_TYPE, /* u8, enum l2tp_l2spec_type */ +- L2TP_ATTR_L2SPEC_LEN, /* u8, enum l2tp_l2spec_type */ ++ L2TP_ATTR_L2SPEC_LEN, /* u8 (not used) */ + L2TP_ATTR_PROTO_VERSION, /* u8 */ + L2TP_ATTR_IFNAME, /* string */ + L2TP_ATTR_CONN_ID, /* u32 */ +diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h +index f38571d..a159991 100644 +--- a/include/uapi/linux/libc-compat.h ++++ b/include/uapi/linux/libc-compat.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * Compatibility interface for userspace libc header coordination: + * +@@ -167,46 +168,99 @@ + + /* If we did not see any headers from any supported C libraries, + * or we are being included in the kernel, then define everything +- * that we need. */ ++ * that we need. Check for previous __UAPI_* definitions to give ++ * unsupported C libraries a way to opt out of any kernel definition. */ + #else /* !defined(__GLIBC__) */ + + /* Definitions for if.h */ ++#ifndef __UAPI_DEF_IF_IFCONF + #define __UAPI_DEF_IF_IFCONF 1 ++#endif ++#ifndef __UAPI_DEF_IF_IFMAP + #define __UAPI_DEF_IF_IFMAP 1 ++#endif ++#ifndef __UAPI_DEF_IF_IFNAMSIZ + #define __UAPI_DEF_IF_IFNAMSIZ 1 ++#endif ++#ifndef __UAPI_DEF_IF_IFREQ + #define __UAPI_DEF_IF_IFREQ 1 ++#endif + /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ ++#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS + #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 ++#endif + /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ ++#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO + #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 ++#endif + + /* Definitions for in.h */ ++#ifndef __UAPI_DEF_IN_ADDR + #define __UAPI_DEF_IN_ADDR 1 ++#endif ++#ifndef __UAPI_DEF_IN_IPPROTO + #define __UAPI_DEF_IN_IPPROTO 1 ++#endif ++#ifndef __UAPI_DEF_IN_PKTINFO + #define __UAPI_DEF_IN_PKTINFO 1 ++#endif ++#ifndef __UAPI_DEF_IP_MREQ + #define __UAPI_DEF_IP_MREQ 1 ++#endif ++#ifndef __UAPI_DEF_SOCKADDR_IN + #define __UAPI_DEF_SOCKADDR_IN 1 ++#endif ++#ifndef __UAPI_DEF_IN_CLASS + #define __UAPI_DEF_IN_CLASS 1 ++#endif + + /* Definitions for in6.h */ ++#ifndef __UAPI_DEF_IN6_ADDR + #define __UAPI_DEF_IN6_ADDR 1 ++#endif ++#ifndef __UAPI_DEF_IN6_ADDR_ALT + #define __UAPI_DEF_IN6_ADDR_ALT 1 ++#endif ++#ifndef __UAPI_DEF_SOCKADDR_IN6 + #define __UAPI_DEF_SOCKADDR_IN6 1 ++#endif ++#ifndef __UAPI_DEF_IPV6_MREQ + #define __UAPI_DEF_IPV6_MREQ 1 ++#endif ++#ifndef __UAPI_DEF_IPPROTO_V6 + #define __UAPI_DEF_IPPROTO_V6 1 ++#endif ++#ifndef __UAPI_DEF_IPV6_OPTIONS + #define __UAPI_DEF_IPV6_OPTIONS 1 ++#endif ++#ifndef __UAPI_DEF_IN6_PKTINFO + #define __UAPI_DEF_IN6_PKTINFO 1 ++#endif ++#ifndef __UAPI_DEF_IP6_MTUINFO + #define __UAPI_DEF_IP6_MTUINFO 1 ++#endif + + /* Definitions for ipx.h */ ++#ifndef __UAPI_DEF_SOCKADDR_IPX + #define __UAPI_DEF_SOCKADDR_IPX 1 ++#endif ++#ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION + #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 ++#endif ++#ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION + #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 ++#endif ++#ifndef __UAPI_DEF_IPX_CONFIG_DATA + #define __UAPI_DEF_IPX_CONFIG_DATA 1 ++#endif ++#ifndef __UAPI_DEF_IPX_ROUTE_DEF + #define __UAPI_DEF_IPX_ROUTE_DEF 1 ++#endif + + /* Definitions for xattr.h */ ++#ifndef __UAPI_DEF_XATTR + #define __UAPI_DEF_XATTR 1 ++#endif + + #endif /* __GLIBC__ */ + +diff --git a/include/uapi/linux/limits.h b/include/uapi/linux/limits.h +index 2d0f941..c3547f0 100644 +--- a/include/uapi/linux/limits.h ++++ b/include/uapi/linux/limits.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_LIMITS_H + #define _LINUX_LIMITS_H + +diff --git a/include/uapi/linux/lwtunnel.h b/include/uapi/linux/lwtunnel.h +index 3298426..3f3fe6f 100644 +--- a/include/uapi/linux/lwtunnel.h ++++ b/include/uapi/linux/lwtunnel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LWTUNNEL_H_ + #define _LWTUNNEL_H_ + +diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h +index e439565..1a6fee9 100644 +--- a/include/uapi/linux/magic.h ++++ b/include/uapi/linux/magic.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_MAGIC_H__ + #define __LINUX_MAGIC_H__ + +@@ -46,6 +47,7 @@ + #define OPENPROM_SUPER_MAGIC 0x9fa1 + #define QNX4_SUPER_MAGIC 0x002f /* qnx4 fs detection */ + #define QNX6_SUPER_MAGIC 0x68191122 /* qnx6 fs detection */ ++#define AFS_FS_MAGIC 0x6B414653 + + #define REISERFS_SUPER_MAGIC 0x52654973 /* used by gcc */ + /* used by file system utilities that +diff --git a/include/uapi/linux/mpls.h b/include/uapi/linux/mpls.h +index bf5b625..9effbf9 100644 +--- a/include/uapi/linux/mpls.h ++++ b/include/uapi/linux/mpls.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _MPLS_H + #define _MPLS_H + +diff --git a/include/uapi/linux/mpls_iptunnel.h b/include/uapi/linux/mpls_iptunnel.h +index 1a0e57b..2c69b7d 100644 +--- a/include/uapi/linux/mpls_iptunnel.h ++++ b/include/uapi/linux/mpls_iptunnel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * mpls tunnel api + * +diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h +index 3199d28..904db61 100644 +--- a/include/uapi/linux/neighbour.h ++++ b/include/uapi/linux/neighbour.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_NEIGHBOUR_H + #define __LINUX_NEIGHBOUR_H + +diff --git a/include/uapi/linux/net_namespace.h b/include/uapi/linux/net_namespace.h +index 9a92b7e..6d64d07 100644 +--- a/include/uapi/linux/net_namespace.h ++++ b/include/uapi/linux/net_namespace.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* Copyright (c) 2015 6WIND S.A. + * Author: Nicolas Dichtel + * +diff --git a/include/uapi/linux/netconf.h b/include/uapi/linux/netconf.h +index 4afbd7d..86ac1eb 100644 +--- a/include/uapi/linux/netconf.h ++++ b/include/uapi/linux/netconf.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_NETCONF_H_ + #define _LINUX_NETCONF_H_ + +diff --git a/include/uapi/linux/netdevice.h b/include/uapi/linux/netdevice.h +index 66fceb4..86d961c 100644 +--- a/include/uapi/linux/netdevice.h ++++ b/include/uapi/linux/netdevice.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +diff --git a/include/uapi/linux/netfilter.h b/include/uapi/linux/netfilter.h +index ff4a4a5..36378a0 100644 +--- a/include/uapi/linux/netfilter.h ++++ b/include/uapi/linux/netfilter.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_NETFILTER_H + #define __LINUX_NETFILTER_H + +diff --git a/include/uapi/linux/netfilter/ipset/ip_set.h b/include/uapi/linux/netfilter/ipset/ip_set.h +index a6c96b0..13eeada 100644 +--- a/include/uapi/linux/netfilter/ipset/ip_set.h ++++ b/include/uapi/linux/netfilter/ipset/ip_set.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* Copyright (C) 2000-2002 Joakim Axelsson + * Patrick Schaaf + * Martin Josefsson +diff --git a/include/uapi/linux/netfilter/x_tables.h b/include/uapi/linux/netfilter/x_tables.h +index 4120970..ae2fd12 100644 +--- a/include/uapi/linux/netfilter/x_tables.h ++++ b/include/uapi/linux/netfilter/x_tables.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _X_TABLES_H + #define _X_TABLES_H + #include +diff --git a/include/uapi/linux/netfilter/xt_set.h b/include/uapi/linux/netfilter/xt_set.h +index d4e0234..8c1ca66 100644 +--- a/include/uapi/linux/netfilter/xt_set.h ++++ b/include/uapi/linux/netfilter/xt_set.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _XT_SET_H + #define _XT_SET_H + +diff --git a/include/uapi/linux/netfilter/xt_tcpudp.h b/include/uapi/linux/netfilter/xt_tcpudp.h +index 38aa7b3..658c169 100644 +--- a/include/uapi/linux/netfilter/xt_tcpudp.h ++++ b/include/uapi/linux/netfilter/xt_tcpudp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _XT_TCPUDP_H + #define _XT_TCPUDP_H + +diff --git a/include/uapi/linux/netfilter_ipv4.h b/include/uapi/linux/netfilter_ipv4.h +index a5f4dc7..074e2c8 100644 +--- a/include/uapi/linux/netfilter_ipv4.h ++++ b/include/uapi/linux/netfilter_ipv4.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* IPv4-specific defines for netfilter. + * (C)1998 Rusty Russell -- This code is GPL. + */ +@@ -54,6 +55,7 @@ + + enum nf_ip_hook_priorities { + NF_IP_PRI_FIRST = INT_MIN, ++ NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP_PRI_CONNTRACK_DEFRAG = -400, + NF_IP_PRI_RAW = -300, + NF_IP_PRI_SELINUX_FIRST = -225, +diff --git a/include/uapi/linux/netfilter_ipv4/ip_tables.h b/include/uapi/linux/netfilter_ipv4/ip_tables.h +index 456fb86..409cff7 100644 +--- a/include/uapi/linux/netfilter_ipv4/ip_tables.h ++++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * 25-Jul-1998 Major changes to allow for ip chain table + * +diff --git a/include/uapi/linux/netfilter_ipv6.h b/include/uapi/linux/netfilter_ipv6.h +index 8483d1d..92701fe 100644 +--- a/include/uapi/linux/netfilter_ipv6.h ++++ b/include/uapi/linux/netfilter_ipv6.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* IPv6-specific defines for netfilter. + * (C)1998 Rusty Russell -- This code is GPL. + * (C)1999 David Jeffery +@@ -59,6 +60,7 @@ + + enum nf_ip6_hook_priorities { + NF_IP6_PRI_FIRST = INT_MIN, ++ NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP6_PRI_CONNTRACK_DEFRAG = -400, + NF_IP6_PRI_RAW = -300, + NF_IP6_PRI_SELINUX_FIRST = -225, +diff --git a/include/uapi/linux/netfilter_ipv6/ip6_tables.h b/include/uapi/linux/netfilter_ipv6/ip6_tables.h +index fcc8cca..7ae314b 100644 +--- a/include/uapi/linux/netfilter_ipv6/ip6_tables.h ++++ b/include/uapi/linux/netfilter_ipv6/ip6_tables.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * 25-Jul-1998 Major changes to allow for ip chain table + * +diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h +index ec0690b..0b2c29b 100644 +--- a/include/uapi/linux/netlink.h ++++ b/include/uapi/linux/netlink.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_NETLINK_H + #define __LINUX_NETLINK_H + +diff --git a/include/uapi/linux/netlink_diag.h b/include/uapi/linux/netlink_diag.h +index c8c8c7d..4cd0657 100644 +--- a/include/uapi/linux/netlink_diag.h ++++ b/include/uapi/linux/netlink_diag.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __NETLINK_DIAG_H__ + #define __NETLINK_DIAG_H__ + +diff --git a/include/uapi/linux/packet_diag.h b/include/uapi/linux/packet_diag.h +index 0c5d5dd..349ddf0 100644 +--- a/include/uapi/linux/packet_diag.h ++++ b/include/uapi/linux/packet_diag.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __PACKET_DIAG_H__ + #define __PACKET_DIAG_H__ + +diff --git a/include/uapi/linux/param.h b/include/uapi/linux/param.h +index 092e92f..94e0c57 100644 +--- a/include/uapi/linux/param.h ++++ b/include/uapi/linux/param.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_PARAM_H + #define _LINUX_PARAM_H + +diff --git a/include/uapi/linux/pfkeyv2.h b/include/uapi/linux/pfkeyv2.h +index ada7f01..d65b117 100644 +--- a/include/uapi/linux/pfkeyv2.h ++++ b/include/uapi/linux/pfkeyv2.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* PF_KEY user interface, this is defined by rfc2367 so + * do not make arbitrary modifications or else this header + * file will not be compliant. +diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h +index d5e2bf6..b451225 100644 +--- a/include/uapi/linux/pkt_cls.h ++++ b/include/uapi/linux/pkt_cls.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_PKT_CLS_H + #define __LINUX_PKT_CLS_H + +@@ -128,6 +129,7 @@ enum { + #define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ + #define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ + #define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ ++#define TCA_CLS_FLAGS_VERBOSE (1 << 4) /* verbose logging */ + + /* U32 filters */ + +@@ -467,6 +469,15 @@ enum { + TCA_FLOWER_KEY_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ + ++ TCA_FLOWER_KEY_CVLAN_ID, /* be16 */ ++ TCA_FLOWER_KEY_CVLAN_PRIO, /* u8 */ ++ TCA_FLOWER_KEY_CVLAN_ETH_TYPE, /* be16 */ ++ ++ TCA_FLOWER_KEY_ENC_IP_TOS, /* u8 */ ++ TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */ ++ TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */ ++ TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */ ++ + __TCA_FLOWER_MAX, + }; + +@@ -474,6 +485,7 @@ enum { + + enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), ++ TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), + }; + + /* Match-all classifier */ +@@ -554,7 +566,8 @@ enum { + #define TCF_EM_VLAN 6 + #define TCF_EM_CANID 7 + #define TCF_EM_IPSET 8 +-#define TCF_EM_MAX 8 ++#define TCF_EM_IPT 9 ++#define TCF_EM_MAX 9 + + enum { + TCF_EM_PROG_TC +diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h +index 099bf55..d9cc9dc 100644 +--- a/include/uapi/linux/pkt_sched.h ++++ b/include/uapi/linux/pkt_sched.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_PKT_SCHED_H + #define __LINUX_PKT_SCHED_H + +@@ -74,6 +75,7 @@ struct tc_estimator { + #define TC_H_INGRESS (0xFFFFFFF1U) + #define TC_H_CLSACT TC_H_INGRESS + ++#define TC_H_MIN_PRIORITY 0xFFE0U + #define TC_H_MIN_INGRESS 0xFFF2U + #define TC_H_MIN_EGRESS 0xFFF3U + +@@ -534,6 +536,10 @@ enum { + TCA_NETEM_ECN, + TCA_NETEM_RATE64, + TCA_NETEM_PAD, ++ TCA_NETEM_LATENCY64, ++ TCA_NETEM_JITTER64, ++ TCA_NETEM_SLOT, ++ TCA_NETEM_SLOT_DIST, + __TCA_NETEM_MAX, + }; + +@@ -571,6 +577,15 @@ struct tc_netem_rate { + __s32 cell_overhead; + }; + ++struct tc_netem_slot { ++ __s64 min_delay; /* nsec */ ++ __s64 max_delay; ++ __s32 max_packets; ++ __s32 max_bytes; ++ __s64 dist_delay; /* nsec */ ++ __s64 dist_jitter; /* nsec */ ++}; ++ + enum { + NETEM_LOSS_UNSPEC, + NETEM_LOSS_GI, /* General Intuitive - 4 state model */ +@@ -625,6 +640,22 @@ enum { + + #define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) + ++enum { ++ TC_MQPRIO_MODE_DCB, ++ TC_MQPRIO_MODE_CHANNEL, ++ __TC_MQPRIO_MODE_MAX ++}; ++ ++#define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1) ++ ++enum { ++ TC_MQPRIO_SHAPER_DCB, ++ TC_MQPRIO_SHAPER_BW_RATE, /* Add new shapers below */ ++ __TC_MQPRIO_SHAPER_MAX ++}; ++ ++#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1) ++ + struct tc_mqprio_qopt { + __u8 num_tc; + __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; +@@ -633,6 +664,22 @@ struct tc_mqprio_qopt { + __u16 offset[TC_QOPT_MAX_QUEUE]; + }; + ++#define TC_MQPRIO_F_MODE 0x1 ++#define TC_MQPRIO_F_SHAPER 0x2 ++#define TC_MQPRIO_F_MIN_RATE 0x4 ++#define TC_MQPRIO_F_MAX_RATE 0x8 ++ ++enum { ++ TCA_MQPRIO_UNSPEC, ++ TCA_MQPRIO_MODE, ++ TCA_MQPRIO_SHAPER, ++ TCA_MQPRIO_MIN_RATE64, ++ TCA_MQPRIO_MAX_RATE64, ++ __TCA_MQPRIO_MAX, ++}; ++ ++#define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1) ++ + /* SFB */ + + enum { +@@ -871,4 +918,155 @@ struct tc_pie_xstats { + __u32 maxq; /* maximum queue size */ + __u32 ecn_mark; /* packets marked with ecn*/ + }; ++ ++/* CBS */ ++struct tc_cbs_qopt { ++ __u8 offload; ++ __u8 _pad[3]; ++ __s32 hicredit; ++ __s32 locredit; ++ __s32 idleslope; ++ __s32 sendslope; ++}; ++ ++enum { ++ TCA_CBS_UNSPEC, ++ TCA_CBS_PARMS, ++ __TCA_CBS_MAX, ++}; ++ ++#define TCA_CBS_MAX (__TCA_CBS_MAX - 1) ++ ++ ++/* ETF */ ++struct tc_etf_qopt { ++ __s32 delta; ++ __s32 clockid; ++ __u32 flags; ++#define TC_ETF_DEADLINE_MODE_ON BIT(0) ++#define TC_ETF_OFFLOAD_ON BIT(1) ++}; ++ ++enum { ++ TCA_ETF_UNSPEC, ++ TCA_ETF_PARMS, ++ __TCA_ETF_MAX, ++}; ++ ++#define TCA_ETF_MAX (__TCA_ETF_MAX - 1) ++ ++ ++/* CAKE */ ++enum { ++ TCA_CAKE_UNSPEC, ++ TCA_CAKE_PAD, ++ TCA_CAKE_BASE_RATE64, ++ TCA_CAKE_DIFFSERV_MODE, ++ TCA_CAKE_ATM, ++ TCA_CAKE_FLOW_MODE, ++ TCA_CAKE_OVERHEAD, ++ TCA_CAKE_RTT, ++ TCA_CAKE_TARGET, ++ TCA_CAKE_AUTORATE, ++ TCA_CAKE_MEMORY, ++ TCA_CAKE_NAT, ++ TCA_CAKE_RAW, ++ TCA_CAKE_WASH, ++ TCA_CAKE_MPU, ++ TCA_CAKE_INGRESS, ++ TCA_CAKE_ACK_FILTER, ++ TCA_CAKE_SPLIT_GSO, ++ __TCA_CAKE_MAX ++}; ++#define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) ++ ++enum { ++ __TCA_CAKE_STATS_INVALID, ++ TCA_CAKE_STATS_PAD, ++ TCA_CAKE_STATS_CAPACITY_ESTIMATE64, ++ TCA_CAKE_STATS_MEMORY_LIMIT, ++ TCA_CAKE_STATS_MEMORY_USED, ++ TCA_CAKE_STATS_AVG_NETOFF, ++ TCA_CAKE_STATS_MIN_NETLEN, ++ TCA_CAKE_STATS_MAX_NETLEN, ++ TCA_CAKE_STATS_MIN_ADJLEN, ++ TCA_CAKE_STATS_MAX_ADJLEN, ++ TCA_CAKE_STATS_TIN_STATS, ++ TCA_CAKE_STATS_DEFICIT, ++ TCA_CAKE_STATS_COBALT_COUNT, ++ TCA_CAKE_STATS_DROPPING, ++ TCA_CAKE_STATS_DROP_NEXT_US, ++ TCA_CAKE_STATS_P_DROP, ++ TCA_CAKE_STATS_BLUE_TIMER_US, ++ __TCA_CAKE_STATS_MAX ++}; ++#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1) ++ ++enum { ++ __TCA_CAKE_TIN_STATS_INVALID, ++ TCA_CAKE_TIN_STATS_PAD, ++ TCA_CAKE_TIN_STATS_SENT_PACKETS, ++ TCA_CAKE_TIN_STATS_SENT_BYTES64, ++ TCA_CAKE_TIN_STATS_DROPPED_PACKETS, ++ TCA_CAKE_TIN_STATS_DROPPED_BYTES64, ++ TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS, ++ TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64, ++ TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS, ++ TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64, ++ TCA_CAKE_TIN_STATS_BACKLOG_PACKETS, ++ TCA_CAKE_TIN_STATS_BACKLOG_BYTES, ++ TCA_CAKE_TIN_STATS_THRESHOLD_RATE64, ++ TCA_CAKE_TIN_STATS_TARGET_US, ++ TCA_CAKE_TIN_STATS_INTERVAL_US, ++ TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS, ++ TCA_CAKE_TIN_STATS_WAY_MISSES, ++ TCA_CAKE_TIN_STATS_WAY_COLLISIONS, ++ TCA_CAKE_TIN_STATS_PEAK_DELAY_US, ++ TCA_CAKE_TIN_STATS_AVG_DELAY_US, ++ TCA_CAKE_TIN_STATS_BASE_DELAY_US, ++ TCA_CAKE_TIN_STATS_SPARSE_FLOWS, ++ TCA_CAKE_TIN_STATS_BULK_FLOWS, ++ TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS, ++ TCA_CAKE_TIN_STATS_MAX_SKBLEN, ++ TCA_CAKE_TIN_STATS_FLOW_QUANTUM, ++ __TCA_CAKE_TIN_STATS_MAX ++}; ++#define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1) ++#define TC_CAKE_MAX_TINS (8) ++ ++enum { ++ CAKE_FLOW_NONE = 0, ++ CAKE_FLOW_SRC_IP, ++ CAKE_FLOW_DST_IP, ++ CAKE_FLOW_HOSTS, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */ ++ CAKE_FLOW_FLOWS, ++ CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */ ++ CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */ ++ CAKE_FLOW_TRIPLE, /* = CAKE_FLOW_HOSTS | CAKE_FLOW_FLOWS */ ++ CAKE_FLOW_MAX, ++}; ++ ++enum { ++ CAKE_DIFFSERV_DIFFSERV3 = 0, ++ CAKE_DIFFSERV_DIFFSERV4, ++ CAKE_DIFFSERV_DIFFSERV8, ++ CAKE_DIFFSERV_BESTEFFORT, ++ CAKE_DIFFSERV_PRECEDENCE, ++ CAKE_DIFFSERV_MAX ++}; ++ ++enum { ++ CAKE_ACK_NONE = 0, ++ CAKE_ACK_FILTER, ++ CAKE_ACK_AGGRESSIVE, ++ CAKE_ACK_MAX ++}; ++ ++enum { ++ CAKE_ATM_NONE = 0, ++ CAKE_ATM_ATM, ++ CAKE_ATM_PTM, ++ CAKE_ATM_MAX ++}; ++ + #endif +diff --git a/include/uapi/linux/posix_types.h b/include/uapi/linux/posix_types.h +index 988f76e..9a7a740 100644 +--- a/include/uapi/linux/posix_types.h ++++ b/include/uapi/linux/posix_types.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_POSIX_TYPES_H + #define _LINUX_POSIX_TYPES_H + +diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h +index 813e9e0..c3a7d8e 100644 +--- a/include/uapi/linux/rtnetlink.h ++++ b/include/uapi/linux/rtnetlink.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_RTNETLINK_H + #define __LINUX_RTNETLINK_H + +@@ -253,6 +254,11 @@ enum { + #define RTPROT_DHCP 16 /* DHCP client */ + #define RTPROT_MROUTED 17 /* Multicast daemon */ + #define RTPROT_BABEL 42 /* Babel daemon */ ++#define RTPROT_BGP 186 /* BGP Routes */ ++#define RTPROT_ISIS 187 /* ISIS Routes */ ++#define RTPROT_OSPF 188 /* OSPF Routes */ ++#define RTPROT_RIP 189 /* RIP Routes */ ++#define RTPROT_EIGRP 192 /* EIGRP Routes */ + + /* rtm_scope + +@@ -326,6 +332,9 @@ enum rtattr_type_t { + RTA_PAD, + RTA_UID, + RTA_TTL_PROPAGATE, ++ RTA_IP_PROTO, ++ RTA_SPORT, ++ RTA_DPORT, + __RTA_MAX + }; + +@@ -430,6 +439,8 @@ enum { + #define RTAX_QUICKACK RTAX_QUICKACK + RTAX_CC_ALGO, + #define RTAX_CC_ALGO RTAX_CC_ALGO ++ RTAX_FASTOPEN_NO_COOKIE, ++#define RTAX_FASTOPEN_NO_COOKIE RTAX_FASTOPEN_NO_COOKIE + __RTAX_MAX + }; + +@@ -538,9 +549,19 @@ struct tcmsg { + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; ++/* tcm_block_index is used instead of tcm_parent ++ * in case tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK ++ */ ++#define tcm_block_index tcm_parent + __u32 tcm_info; + }; + ++/* For manipulation of filters in shared block, tcm_ifindex is set to ++ * TCM_IFINDEX_MAGIC_BLOCK, and tcm_parent is aliased to tcm_block_index ++ * which is the block index. ++ */ ++#define TCM_IFINDEX_MAGIC_BLOCK (0xFFFFFFFFU) ++ + enum { + TCA_UNSPEC, + TCA_KIND, +@@ -554,6 +575,9 @@ enum { + TCA_PAD, + TCA_DUMP_INVISIBLE, + TCA_CHAIN, ++ TCA_HW_OFFLOAD, ++ TCA_INGRESS_BLOCK, ++ TCA_EGRESS_BLOCK, + __TCA_MAX + }; + +diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h +index fec24c4..dd164d7 100644 +--- a/include/uapi/linux/sctp.h ++++ b/include/uapi/linux/sctp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* SCTP kernel implementation + * (C) Copyright IBM Corp. 2001, 2004 + * Copyright (c) 1999-2000 Cisco, Inc. +@@ -98,6 +99,8 @@ typedef __s32 sctp_assoc_t; + #define SCTP_RECVRCVINFO 32 + #define SCTP_RECVNXTINFO 33 + #define SCTP_DEFAULT_SNDINFO 34 ++#define SCTP_AUTH_DEACTIVATE_KEY 35 ++#define SCTP_REUSE_PORT 36 + + /* Internal Socket Options. Some of the sctp library functions are + * implemented using these socket options. +@@ -122,6 +125,10 @@ typedef __s32 sctp_assoc_t; + #define SCTP_RESET_ASSOC 120 + #define SCTP_ADD_STREAMS 121 + #define SCTP_SOCKOPT_PEELOFF_FLAGS 122 ++#define SCTP_STREAM_SCHEDULER 123 ++#define SCTP_STREAM_SCHEDULER_VALUE 124 ++#define SCTP_INTERLEAVING_SUPPORTED 125 ++#define SCTP_SENDMSG_CONNECT 126 + + /* PR-SCTP policies */ + #define SCTP_PR_SCTP_NONE 0x0000 +@@ -256,6 +263,31 @@ struct sctp_nxtinfo { + sctp_assoc_t nxt_assoc_id; + }; + ++/* 5.3.7 SCTP PR-SCTP Information Structure (SCTP_PRINFO) ++ * ++ * This cmsghdr structure specifies SCTP options for sendmsg(). ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ------------------- ++ * IPPROTO_SCTP SCTP_PRINFO struct sctp_prinfo ++ */ ++struct sctp_prinfo { ++ __u16 pr_policy; ++ __u32 pr_value; ++}; ++ ++/* 5.3.8 SCTP AUTH Information Structure (SCTP_AUTHINFO) ++ * ++ * This cmsghdr structure specifies SCTP options for sendmsg(). ++ * ++ * cmsg_level cmsg_type cmsg_data[] ++ * ------------ ------------ ------------------- ++ * IPPROTO_SCTP SCTP_AUTHINFO struct sctp_authinfo ++ */ ++struct sctp_authinfo { ++ __u16 auth_keynumber; ++}; ++ + /* + * sinfo_flags: 16 bits (unsigned integer) + * +@@ -267,6 +299,8 @@ enum sctp_sinfo_flags { + SCTP_ADDR_OVER = (1 << 1), /* Override the primary destination. */ + SCTP_ABORT = (1 << 2), /* Send an ABORT message to the peer. */ + SCTP_SACK_IMMEDIATELY = (1 << 3), /* SACK should be sent without delay. */ ++ /* 2 bits here have been used by SCTP_PR_SCTP_MASK */ ++ SCTP_SENDALL = (1 << 6), + SCTP_NOTIFICATION = MSG_NOTIFICATION, /* Next message is not user msg but notification. */ + SCTP_EOF = MSG_FIN, /* Initiate graceful shutdown process. */ + }; +@@ -289,6 +323,14 @@ typedef enum sctp_cmsg_type { + #define SCTP_RCVINFO SCTP_RCVINFO + SCTP_NXTINFO, /* 5.3.6 SCTP Next Receive Information Structure */ + #define SCTP_NXTINFO SCTP_NXTINFO ++ SCTP_PRINFO, /* 5.3.7 SCTP PR-SCTP Information Structure */ ++#define SCTP_PRINFO SCTP_PRINFO ++ SCTP_AUTHINFO, /* 5.3.8 SCTP AUTH Information Structure */ ++#define SCTP_AUTHINFO SCTP_AUTHINFO ++ SCTP_DSTADDRV4, /* 5.3.9 SCTP Destination IPv4 Address Structure */ ++#define SCTP_DSTADDRV4 SCTP_DSTADDRV4 ++ SCTP_DSTADDRV6, /* 5.3.10 SCTP Destination IPv6 Address Structure */ ++#define SCTP_DSTADDRV6 SCTP_DSTADDRV6 + } sctp_cmsg_t; + + /* +@@ -376,7 +418,7 @@ struct sctp_remote_error { + __u16 sre_type; + __u16 sre_flags; + __u32 sre_length; +- __u16 sre_error; ++ __be16 sre_error; + sctp_assoc_t sre_assoc_id; + __u8 sre_data[0]; + }; +@@ -456,6 +498,8 @@ struct sctp_pdapi_event { + __u32 pdapi_length; + __u32 pdapi_indication; + sctp_assoc_t pdapi_assoc_id; ++ __u32 pdapi_stream; ++ __u32 pdapi_seq; + }; + + enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, }; +@@ -476,7 +520,12 @@ struct sctp_authkey_event { + sctp_assoc_t auth_assoc_id; + }; + +-enum { SCTP_AUTH_NEWKEY = 0, }; ++enum { ++ SCTP_AUTH_NEW_KEY, ++#define SCTP_AUTH_NEWKEY SCTP_AUTH_NEW_KEY /* compatible with before */ ++ SCTP_AUTH_FREE_KEY, ++ SCTP_AUTH_NO_AUTH, ++}; + + /* + * 6.1.9. SCTP_SENDER_DRY_EVENT +@@ -714,6 +763,8 @@ enum sctp_spp_flags { + SPP_SACKDELAY_DISABLE = 1<<6, /*Disable SACK*/ + SPP_SACKDELAY = SPP_SACKDELAY_ENABLE | SPP_SACKDELAY_DISABLE, + SPP_HB_TIME_IS_ZERO = 1<<7, /* Set HB delay to 0 */ ++ SPP_IPV6_FLOWLABEL = 1<<8, ++ SPP_DSCP = 1<<9, + }; + + struct sctp_paddrparams { +@@ -724,6 +775,8 @@ struct sctp_paddrparams { + __u32 spp_pathmtu; + __u32 spp_sackdelay; + __u32 spp_flags; ++ __u32 spp_ipv6_flowlabel; ++ __u8 spp_dscp; + } __attribute__((packed, aligned(4))); + + /* +@@ -812,6 +865,12 @@ struct sctp_assoc_value { + uint32_t assoc_value; + }; + ++struct sctp_stream_value { ++ sctp_assoc_t assoc_id; ++ uint16_t stream_id; ++ uint16_t stream_value; ++}; ++ + /* + * 7.2.2 Peer Address Information + * +@@ -1082,4 +1141,12 @@ struct sctp_add_streams { + uint16_t sas_outstrms; + }; + ++/* SCTP Stream schedulers */ ++enum sctp_sched_type { ++ SCTP_SS_FCFS, ++ SCTP_SS_PRIO, ++ SCTP_SS_RR, ++ SCTP_SS_MAX = SCTP_SS_RR ++}; ++ + #endif /* _SCTP_H */ +diff --git a/include/uapi/linux/seg6.h b/include/uapi/linux/seg6.h +index 0715279..329163e 100644 +--- a/include/uapi/linux/seg6.h ++++ b/include/uapi/linux/seg6.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * SR-IPv6 implementation + * +@@ -25,9 +26,9 @@ struct ipv6_sr_hdr { + __u8 hdrlen; + __u8 type; + __u8 segments_left; +- __u8 first_segment; ++ __u8 first_segment; /* Represents the last_entry field of SRH */ + __u8 flags; +- __u16 reserved; ++ __u16 tag; + + struct in6_addr segments[0]; + }; +diff --git a/include/uapi/linux/seg6_genl.h b/include/uapi/linux/seg6_genl.h +index 99382f9..0c23052 100644 +--- a/include/uapi/linux/seg6_genl.h ++++ b/include/uapi/linux/seg6_genl.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_SEG6_GENL_H + #define _LINUX_SEG6_GENL_H + +diff --git a/include/uapi/linux/seg6_hmac.h b/include/uapi/linux/seg6_hmac.h +index 704f93e..3fb3412 100644 +--- a/include/uapi/linux/seg6_hmac.h ++++ b/include/uapi/linux/seg6_hmac.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_SEG6_HMAC_H + #define _LINUX_SEG6_HMAC_H + +diff --git a/include/uapi/linux/seg6_iptunnel.h b/include/uapi/linux/seg6_iptunnel.h +index a5dc05a..3004e98 100644 +--- a/include/uapi/linux/seg6_iptunnel.h ++++ b/include/uapi/linux/seg6_iptunnel.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * SR-IPv6 implementation + * +diff --git a/include/uapi/linux/seg6_local.h b/include/uapi/linux/seg6_local.h +index 76b90d6..5312de8 100644 +--- a/include/uapi/linux/seg6_local.h ++++ b/include/uapi/linux/seg6_local.h +@@ -25,6 +25,7 @@ enum { + SEG6_LOCAL_NH6, + SEG6_LOCAL_IIF, + SEG6_LOCAL_OIF, ++ SEG6_LOCAL_BPF, + __SEG6_LOCAL_MAX, + }; + #define SEG6_LOCAL_MAX (__SEG6_LOCAL_MAX - 1) +@@ -59,10 +60,21 @@ enum { + SEG6_LOCAL_ACTION_END_AS = 13, + /* forward to SR-unaware VNF with masquerading */ + SEG6_LOCAL_ACTION_END_AM = 14, ++ /* custom BPF action */ ++ SEG6_LOCAL_ACTION_END_BPF = 15, + + __SEG6_LOCAL_ACTION_MAX, + }; + + #define SEG6_LOCAL_ACTION_MAX (__SEG6_LOCAL_ACTION_MAX - 1) + ++enum { ++ SEG6_LOCAL_BPF_PROG_UNSPEC, ++ SEG6_LOCAL_BPF_PROG, ++ SEG6_LOCAL_BPF_PROG_NAME, ++ __SEG6_LOCAL_BPF_PROG_MAX, ++}; ++ ++#define SEG6_LOCAL_BPF_PROG_MAX (__SEG6_LOCAL_BPF_PROG_MAX - 1) ++ + #endif +diff --git a/include/uapi/linux/sock_diag.h b/include/uapi/linux/sock_diag.h +index 901231e..a69cf20 100644 +--- a/include/uapi/linux/sock_diag.h ++++ b/include/uapi/linux/sock_diag.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __SOCK_DIAG_H__ + #define __SOCK_DIAG_H__ + +diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h +index 8c1e501..268b948 100644 +--- a/include/uapi/linux/socket.h ++++ b/include/uapi/linux/socket.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_SOCKET_H + #define _LINUX_SOCKET_H + +diff --git a/include/uapi/linux/sockios.h b/include/uapi/linux/sockios.h +index 79d029d..d393e9e 100644 +--- a/include/uapi/linux/sockios.h ++++ b/include/uapi/linux/sockios.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h +index 4bb69de..23e025f 100644 +--- a/include/uapi/linux/stddef.h ++++ b/include/uapi/linux/stddef.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + + + #ifndef __always_inline +diff --git a/include/uapi/linux/sysinfo.h b/include/uapi/linux/sysinfo.h +index 934335a..435d5c2 100644 +--- a/include/uapi/linux/sysinfo.h ++++ b/include/uapi/linux/sysinfo.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_SYSINFO_H + #define _LINUX_SYSINFO_H + +diff --git a/include/uapi/linux/tc_act/tc_bpf.h b/include/uapi/linux/tc_act/tc_bpf.h +index 8dc2ac0..6e89a5d 100644 +--- a/include/uapi/linux/tc_act/tc_bpf.h ++++ b/include/uapi/linux/tc_act/tc_bpf.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Copyright (c) 2015 Jiri Pirko + * +diff --git a/include/uapi/linux/tc_act/tc_connmark.h b/include/uapi/linux/tc_act/tc_connmark.h +index 62a5e94..80caa47 100644 +--- a/include/uapi/linux/tc_act/tc_connmark.h ++++ b/include/uapi/linux/tc_act/tc_connmark.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __UAPI_TC_CONNMARK_H + #define __UAPI_TC_CONNMARK_H + +diff --git a/include/uapi/linux/tc_act/tc_csum.h b/include/uapi/linux/tc_act/tc_csum.h +index a11bb35..0ecf4d2 100644 +--- a/include/uapi/linux/tc_act/tc_csum.h ++++ b/include/uapi/linux/tc_act/tc_csum.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_CSUM_H + #define __LINUX_TC_CSUM_H + +diff --git a/include/uapi/linux/tc_act/tc_defact.h b/include/uapi/linux/tc_act/tc_defact.h +index d2a3abb..e3ecd8b 100644 +--- a/include/uapi/linux/tc_act/tc_defact.h ++++ b/include/uapi/linux/tc_act/tc_defact.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_DEF_H + #define __LINUX_TC_DEF_H + +diff --git a/include/uapi/linux/tc_act/tc_gact.h b/include/uapi/linux/tc_act/tc_gact.h +index 70b536a..94273c3 100644 +--- a/include/uapi/linux/tc_act/tc_gact.h ++++ b/include/uapi/linux/tc_act/tc_gact.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_GACT_H + #define __LINUX_TC_GACT_H + +diff --git a/include/uapi/linux/tc_act/tc_ife.h b/include/uapi/linux/tc_act/tc_ife.h +index 7c28178..2f48490 100644 +--- a/include/uapi/linux/tc_act/tc_ife.h ++++ b/include/uapi/linux/tc_act/tc_ife.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __UAPI_TC_IFE_H + #define __UAPI_TC_IFE_H + +diff --git a/include/uapi/linux/tc_act/tc_ipt.h b/include/uapi/linux/tc_act/tc_ipt.h +index 7c6e155..b743c8b 100644 +--- a/include/uapi/linux/tc_act/tc_ipt.h ++++ b/include/uapi/linux/tc_act/tc_ipt.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_IPT_H + #define __LINUX_TC_IPT_H + +diff --git a/include/uapi/linux/tc_act/tc_mirred.h b/include/uapi/linux/tc_act/tc_mirred.h +index 3d7a2b3..5dd671c 100644 +--- a/include/uapi/linux/tc_act/tc_mirred.h ++++ b/include/uapi/linux/tc_act/tc_mirred.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_MIR_H + #define __LINUX_TC_MIR_H + +@@ -9,13 +10,13 @@ + #define TCA_EGRESS_MIRROR 2 /* mirror packet to EGRESS */ + #define TCA_INGRESS_REDIR 3 /* packet redirect to INGRESS*/ + #define TCA_INGRESS_MIRROR 4 /* mirror packet to INGRESS */ +- ++ + struct tc_mirred { + tc_gen; + int eaction; /* one of IN/EGRESS_MIRROR/REDIR */ + __u32 ifindex; /* ifindex of egress port */ + }; +- ++ + enum { + TCA_MIRRED_UNSPEC, + TCA_MIRRED_TM, +@@ -24,5 +25,5 @@ enum { + __TCA_MIRRED_MAX + }; + #define TCA_MIRRED_MAX (__TCA_MIRRED_MAX - 1) +- ++ + #endif +diff --git a/include/uapi/linux/tc_act/tc_nat.h b/include/uapi/linux/tc_act/tc_nat.h +index 923457c..086be84 100644 +--- a/include/uapi/linux/tc_act/tc_nat.h ++++ b/include/uapi/linux/tc_act/tc_nat.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_NAT_H + #define __LINUX_TC_NAT_H + +diff --git a/include/uapi/linux/tc_act/tc_pedit.h b/include/uapi/linux/tc_act/tc_pedit.h +index 143d2b3..24ec792 100644 +--- a/include/uapi/linux/tc_act/tc_pedit.h ++++ b/include/uapi/linux/tc_act/tc_pedit.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_PED_H + #define __LINUX_TC_PED_H + +@@ -16,13 +17,15 @@ enum { + TCA_PEDIT_KEY_EX, + __TCA_PEDIT_MAX + }; ++ + #define TCA_PEDIT_MAX (__TCA_PEDIT_MAX - 1) +- ++ + enum { + TCA_PEDIT_KEY_EX_HTYPE = 1, + TCA_PEDIT_KEY_EX_CMD = 2, + __TCA_PEDIT_KEY_EX_MAX + }; ++ + #define TCA_PEDIT_KEY_EX_MAX (__TCA_PEDIT_KEY_EX_MAX - 1) + + /* TCA_PEDIT_KEY_EX_HDR_TYPE_NETWROK is a special case for legacy users. It +@@ -37,6 +40,7 @@ enum pedit_header_type { + TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, + __PEDIT_HDR_TYPE_MAX, + }; ++ + #define TCA_PEDIT_HDR_TYPE_MAX (__PEDIT_HDR_TYPE_MAX - 1) + + enum pedit_cmd { +@@ -44,6 +48,7 @@ enum pedit_cmd { + TCA_PEDIT_KEY_EX_CMD_ADD = 1, + __PEDIT_CMD_MAX, + }; ++ + #define TCA_PEDIT_CMD_MAX (__PEDIT_CMD_MAX - 1) + + struct tc_pedit_key { +@@ -54,13 +59,14 @@ struct tc_pedit_key { + __u32 offmask; + __u32 shift; + }; +- ++ + struct tc_pedit_sel { + tc_gen; + unsigned char nkeys; + unsigned char flags; + struct tc_pedit_key keys[0]; + }; ++ + #define tc_pedit tc_pedit_sel + + #endif +diff --git a/include/uapi/linux/tc_act/tc_sample.h b/include/uapi/linux/tc_act/tc_sample.h +index edc9058..bd7e9f0 100644 +--- a/include/uapi/linux/tc_act/tc_sample.h ++++ b/include/uapi/linux/tc_act/tc_sample.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_SAMPLE_H + #define __LINUX_TC_SAMPLE_H + +diff --git a/include/uapi/linux/tc_act/tc_skbedit.h b/include/uapi/linux/tc_act/tc_skbedit.h +index 2884425..6de6071 100644 +--- a/include/uapi/linux/tc_act/tc_skbedit.h ++++ b/include/uapi/linux/tc_act/tc_skbedit.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* + * Copyright (c) 2008, Intel Corporation. + * +@@ -29,6 +30,7 @@ + #define SKBEDIT_F_MARK 0x4 + #define SKBEDIT_F_PTYPE 0x8 + #define SKBEDIT_F_MASK 0x10 ++#define SKBEDIT_F_INHERITDSFIELD 0x20 + + struct tc_skbedit { + tc_gen; +@@ -44,6 +46,7 @@ enum { + TCA_SKBEDIT_PAD, + TCA_SKBEDIT_PTYPE, + TCA_SKBEDIT_MASK, ++ TCA_SKBEDIT_FLAGS, + __TCA_SKBEDIT_MAX + }; + #define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1) +diff --git a/include/uapi/linux/tc_act/tc_skbmod.h b/include/uapi/linux/tc_act/tc_skbmod.h +index 10fc07d..38c072f 100644 +--- a/include/uapi/linux/tc_act/tc_skbmod.h ++++ b/include/uapi/linux/tc_act/tc_skbmod.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Copyright (c) 2016, Jamal Hadi Salim + * +diff --git a/include/uapi/linux/tc_act/tc_tunnel_key.h b/include/uapi/linux/tc_act/tc_tunnel_key.h +index afcd4be..be384d6 100644 +--- a/include/uapi/linux/tc_act/tc_tunnel_key.h ++++ b/include/uapi/linux/tc_act/tc_tunnel_key.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Copyright (c) 2016, Amir Vadai + * Copyright (c) 2016, Mellanox Technologies. All rights reserved. +@@ -35,9 +36,37 @@ enum { + TCA_TUNNEL_KEY_PAD, + TCA_TUNNEL_KEY_ENC_DST_PORT, /* be16 */ + TCA_TUNNEL_KEY_NO_CSUM, /* u8 */ ++ TCA_TUNNEL_KEY_ENC_OPTS, /* Nested TCA_TUNNEL_KEY_ENC_OPTS_ ++ * attributes ++ */ ++ TCA_TUNNEL_KEY_ENC_TOS, /* u8 */ ++ TCA_TUNNEL_KEY_ENC_TTL, /* u8 */ + __TCA_TUNNEL_KEY_MAX, + }; + + #define TCA_TUNNEL_KEY_MAX (__TCA_TUNNEL_KEY_MAX - 1) + ++enum { ++ TCA_TUNNEL_KEY_ENC_OPTS_UNSPEC, ++ TCA_TUNNEL_KEY_ENC_OPTS_GENEVE, /* Nested ++ * TCA_TUNNEL_KEY_ENC_OPTS_ ++ * attributes ++ */ ++ __TCA_TUNNEL_KEY_ENC_OPTS_MAX, ++}; ++ ++#define TCA_TUNNEL_KEY_ENC_OPTS_MAX (__TCA_TUNNEL_KEY_ENC_OPTS_MAX - 1) ++ ++enum { ++ TCA_TUNNEL_KEY_ENC_OPT_GENEVE_UNSPEC, ++ TCA_TUNNEL_KEY_ENC_OPT_GENEVE_CLASS, /* be16 */ ++ TCA_TUNNEL_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */ ++ TCA_TUNNEL_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */ ++ ++ __TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX, ++}; ++ ++#define TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX \ ++ (__TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX - 1) ++ + #endif +diff --git a/include/uapi/linux/tc_act/tc_vlan.h b/include/uapi/linux/tc_act/tc_vlan.h +index bddb272..0d7b5fd 100644 +--- a/include/uapi/linux/tc_act/tc_vlan.h ++++ b/include/uapi/linux/tc_act/tc_vlan.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * Copyright (c) 2014 Jiri Pirko + * +diff --git a/include/uapi/linux/tc_ematch/tc_em_cmp.h b/include/uapi/linux/tc_ematch/tc_em_cmp.h +index f34bb1b..2549d9d 100644 +--- a/include/uapi/linux/tc_ematch/tc_em_cmp.h ++++ b/include/uapi/linux/tc_ematch/tc_em_cmp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_EM_CMP_H + #define __LINUX_TC_EM_CMP_H + +diff --git a/include/uapi/linux/tc_ematch/tc_em_ipt.h b/include/uapi/linux/tc_ematch/tc_em_ipt.h +new file mode 100644 +index 0000000..49a6553 +--- /dev/null ++++ b/include/uapi/linux/tc_ematch/tc_em_ipt.h +@@ -0,0 +1,20 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++#ifndef __LINUX_TC_EM_IPT_H ++#define __LINUX_TC_EM_IPT_H ++ ++#include ++#include ++ ++enum { ++ TCA_EM_IPT_UNSPEC, ++ TCA_EM_IPT_HOOK, ++ TCA_EM_IPT_MATCH_NAME, ++ TCA_EM_IPT_MATCH_REVISION, ++ TCA_EM_IPT_NFPROTO, ++ TCA_EM_IPT_MATCH_DATA, ++ __TCA_EM_IPT_MAX ++}; ++ ++#define TCA_EM_IPT_MAX (__TCA_EM_IPT_MAX - 1) ++ ++#endif +diff --git a/include/uapi/linux/tc_ematch/tc_em_meta.h b/include/uapi/linux/tc_ematch/tc_em_meta.h +index b11f8ce..cf30b5b 100644 +--- a/include/uapi/linux/tc_ematch/tc_em_meta.h ++++ b/include/uapi/linux/tc_ematch/tc_em_meta.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_EM_META_H + #define __LINUX_TC_EM_META_H + +diff --git a/include/uapi/linux/tc_ematch/tc_em_nbyte.h b/include/uapi/linux/tc_ematch/tc_em_nbyte.h +index 7172cfb..c76333f 100644 +--- a/include/uapi/linux/tc_ematch/tc_em_nbyte.h ++++ b/include/uapi/linux/tc_ematch/tc_em_nbyte.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __LINUX_TC_EM_NBYTE_H + #define __LINUX_TC_EM_NBYTE_H + +diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h +index 8edad3f..2e766cf 100644 +--- a/include/uapi/linux/tcp.h ++++ b/include/uapi/linux/tcp.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + /* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket +@@ -119,6 +120,12 @@ enum { + #define TCP_FASTOPEN_CONNECT 30 /* Attempt FastOpen with connect */ + #define TCP_ULP 31 /* Attach a ULP to a TCP connection */ + #define TCP_MD5SIG_EXT 32 /* TCP MD5 Signature with extensions */ ++#define TCP_FASTOPEN_KEY 33 /* Set the key for Fast Open (cookie) */ ++#define TCP_FASTOPEN_NO_COOKIE 34 /* Enable TFO without a TFO cookie */ ++#define TCP_ZEROCOPY_RECEIVE 35 ++#define TCP_INQ 36 /* Notify bytes available to read as a cmsg on read */ ++ ++#define TCP_CM_INQ TCP_INQ + + struct tcp_repair_opt { + __u32 opt_code; +@@ -221,6 +228,9 @@ struct tcp_info { + __u64 tcpi_busy_time; /* Time (usec) busy sending data */ + __u64 tcpi_rwnd_limited; /* Time (usec) limited by receive window */ + __u64 tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */ ++ ++ __u32 tcpi_delivered; ++ __u32 tcpi_delivered_ce; + }; + + /* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */ +@@ -238,6 +248,11 @@ enum { + TCP_NLA_MIN_RTT, /* minimum RTT */ + TCP_NLA_RECUR_RETRANS, /* Recurring retransmits for the current pkt */ + TCP_NLA_DELIVERY_RATE_APP_LMT, /* delivery rate application limited ? */ ++ TCP_NLA_SNDQ_SIZE, /* Data (bytes) pending in send queue */ ++ TCP_NLA_CA_STATE, /* ca_state of socket */ ++ TCP_NLA_SND_SSTHRESH, /* Slow start size threshold */ ++ TCP_NLA_DELIVERED, /* Data pkts delivered incl. out-of-order */ ++ TCP_NLA_DELIVERED_CE, /* Like above but only ones w/ CE marks */ + + }; + +@@ -265,4 +280,11 @@ struct tcp_diag_md5sig { + __u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN]; + }; + ++/* setsockopt(fd, IPPROTO_TCP, TCP_ZEROCOPY_RECEIVE, ...) */ ++ ++struct tcp_zerocopy_receive { ++ __u64 address; /* in: address of mapping */ ++ __u32 length; /* in/out: number of bytes to map/mapped */ ++ __u32 recv_skip_hint; /* out: amount of bytes to skip */ ++}; + #endif /* _LINUX_TCP_H */ +diff --git a/include/uapi/linux/tcp_metrics.h b/include/uapi/linux/tcp_metrics.h +index 80ad90d..7cb4a17 100644 +--- a/include/uapi/linux/tcp_metrics.h ++++ b/include/uapi/linux/tcp_metrics.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* tcp_metrics.h - TCP Metrics Interface */ + + #ifndef _LINUX_TCP_METRICS_H +diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h +index 924fb5c..7a166a0 100644 +--- a/include/uapi/linux/tipc.h ++++ b/include/uapi/linux/tipc.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ + /* + * include/uapi/linux/tipc.h: Header for TIPC socket interface + * +@@ -44,82 +45,38 @@ + * TIPC addressing primitives + */ + +-struct tipc_portid { ++struct tipc_socket_addr { + __u32 ref; + __u32 node; + }; + +-struct tipc_name { ++struct tipc_service_addr { + __u32 type; + __u32 instance; + }; + +-struct tipc_name_seq { ++struct tipc_service_range { + __u32 type; + __u32 lower; + __u32 upper; + }; + +-/* TIPC Address Size, Offset, Mask specification for Z.C.N +- */ +-#define TIPC_NODE_BITS 12 +-#define TIPC_CLUSTER_BITS 12 +-#define TIPC_ZONE_BITS 8 +- +-#define TIPC_NODE_OFFSET 0 +-#define TIPC_CLUSTER_OFFSET TIPC_NODE_BITS +-#define TIPC_ZONE_OFFSET (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS) +- +-#define TIPC_NODE_SIZE ((1UL << TIPC_NODE_BITS) - 1) +-#define TIPC_CLUSTER_SIZE ((1UL << TIPC_CLUSTER_BITS) - 1) +-#define TIPC_ZONE_SIZE ((1UL << TIPC_ZONE_BITS) - 1) +- +-#define TIPC_NODE_MASK (TIPC_NODE_SIZE << TIPC_NODE_OFFSET) +-#define TIPC_CLUSTER_MASK (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET) +-#define TIPC_ZONE_MASK (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET) +- +-#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK) +- +-static __inline__ __u32 tipc_addr(unsigned int zone, +- unsigned int cluster, +- unsigned int node) +-{ +- return (zone << TIPC_ZONE_OFFSET) | +- (cluster << TIPC_CLUSTER_OFFSET) | +- node; +-} +- +-static __inline__ unsigned int tipc_zone(__u32 addr) +-{ +- return addr >> TIPC_ZONE_OFFSET; +-} +- +-static __inline__ unsigned int tipc_cluster(__u32 addr) +-{ +- return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET; +-} +- +-static __inline__ unsigned int tipc_node(__u32 addr) +-{ +- return addr & TIPC_NODE_MASK; +-} +- + /* +- * Application-accessible port name types ++ * Application-accessible service types + */ + +-#define TIPC_CFG_SRV 0 /* configuration service name type */ +-#define TIPC_TOP_SRV 1 /* topology service name type */ +-#define TIPC_LINK_STATE 2 /* link state name type */ +-#define TIPC_RESERVED_TYPES 64 /* lowest user-publishable name type */ ++#define TIPC_NODE_STATE 0 /* node state service type */ ++#define TIPC_TOP_SRV 1 /* topology server service type */ ++#define TIPC_LINK_STATE 2 /* link state service type */ ++#define TIPC_RESERVED_TYPES 64 /* lowest user-allowed service type */ + + /* +- * Publication scopes when binding port names and port name sequences ++ * Publication scopes when binding service / service range + */ +- +-#define TIPC_ZONE_SCOPE 1 +-#define TIPC_CLUSTER_SCOPE 2 +-#define TIPC_NODE_SCOPE 3 ++enum tipc_scope { ++ TIPC_CLUSTER_SCOPE = 2, /* 0 can also be used */ ++ TIPC_NODE_SCOPE = 3 ++}; + + /* + * Limiting values for messages +@@ -151,28 +108,28 @@ static __inline__ unsigned int tipc_node(__u32 addr) + * TIPC topology subscription service definitions + */ + +-#define TIPC_SUB_PORTS 0x01 /* filter for port availability */ +-#define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ +-#define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ ++#define TIPC_SUB_PORTS 0x01 /* filter: evt at each match */ ++#define TIPC_SUB_SERVICE 0x02 /* filter: evt at first up/last down */ ++#define TIPC_SUB_CANCEL 0x04 /* filter: cancel a subscription */ + + #define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */ + + struct tipc_subscr { +- struct tipc_name_seq seq; /* name sequence of interest */ ++ struct tipc_service_range seq; /* range of interest */ + __u32 timeout; /* subscription duration (in ms) */ + __u32 filter; /* bitmask of filter options */ + char usr_handle[8]; /* available for subscriber use */ + }; + + #define TIPC_PUBLISHED 1 /* publication event */ +-#define TIPC_WITHDRAWN 2 /* withdraw event */ ++#define TIPC_WITHDRAWN 2 /* withdrawal event */ + #define TIPC_SUBSCR_TIMEOUT 3 /* subscription timeout event */ + + struct tipc_event { + __u32 event; /* event type */ +- __u32 found_lower; /* matching name seq instances */ +- __u32 found_upper; /* " " " " */ +- struct tipc_portid port; /* associated port */ ++ __u32 found_lower; /* matching range */ ++ __u32 found_upper; /* " " */ ++ struct tipc_socket_addr port; /* associated socket */ + struct tipc_subscr s; /* associated subscription */ + }; + +@@ -192,20 +149,20 @@ struct tipc_event { + #define SOL_TIPC 271 + #endif + +-#define TIPC_ADDR_NAMESEQ 1 +-#define TIPC_ADDR_MCAST 1 +-#define TIPC_ADDR_NAME 2 +-#define TIPC_ADDR_ID 3 ++#define TIPC_ADDR_MCAST 1 ++#define TIPC_SERVICE_RANGE 1 ++#define TIPC_SERVICE_ADDR 2 ++#define TIPC_SOCKET_ADDR 3 + + struct sockaddr_tipc { + unsigned short family; + unsigned char addrtype; + signed char scope; + union { +- struct tipc_portid id; +- struct tipc_name_seq nameseq; ++ struct tipc_socket_addr id; ++ struct tipc_service_range nameseq; + struct { +- struct tipc_name name; ++ struct tipc_service_addr name; + __u32 domain; + } name; + } addr; +@@ -231,26 +188,103 @@ struct sockaddr_tipc { + #define TIPC_SOCK_RECVQ_DEPTH 132 /* Default: none (read only) */ + #define TIPC_MCAST_BROADCAST 133 /* Default: TIPC selects. No arg */ + #define TIPC_MCAST_REPLICAST 134 /* Default: TIPC selects. No arg */ ++#define TIPC_GROUP_JOIN 135 /* Takes struct tipc_group_req* */ ++#define TIPC_GROUP_LEAVE 136 /* No argument */ ++ ++/* ++ * Flag values ++ */ ++#define TIPC_GROUP_LOOPBACK 0x1 /* Receive copy of sent msg when match */ ++#define TIPC_GROUP_MEMBER_EVTS 0x2 /* Receive membership events in socket */ ++ ++struct tipc_group_req { ++ __u32 type; /* group id */ ++ __u32 instance; /* member id */ ++ __u32 scope; /* cluster/node */ ++ __u32 flags; ++}; + + /* + * Maximum sizes of TIPC bearer-related names (including terminating NULL) + * The string formatting for each name element is: + * media: media + * interface: media:interface name +- * link: Z.C.N:interface-Z.C.N:interface +- * ++ * link: node:interface-node:interface + */ +- ++#define TIPC_NODEID_LEN 16 + #define TIPC_MAX_MEDIA_NAME 16 + #define TIPC_MAX_IF_NAME 16 + #define TIPC_MAX_BEARER_NAME 32 +-#define TIPC_MAX_LINK_NAME 60 ++#define TIPC_MAX_LINK_NAME 68 + +-#define SIOCGETLINKNAME SIOCPROTOPRIVATE ++#define SIOCGETLINKNAME SIOCPROTOPRIVATE ++#define SIOCGETNODEID (SIOCPROTOPRIVATE + 1) + + struct tipc_sioc_ln_req { + __u32 peer; + __u32 bearer_id; + char linkname[TIPC_MAX_LINK_NAME]; + }; ++ ++struct tipc_sioc_nodeid_req { ++ __u32 peer; ++ char node_id[TIPC_NODEID_LEN]; ++}; ++ ++/* The macros and functions below are deprecated: ++ */ ++ ++#define TIPC_CFG_SRV 0 ++#define TIPC_ZONE_SCOPE 1 ++ ++#define TIPC_ADDR_NAMESEQ 1 ++#define TIPC_ADDR_NAME 2 ++#define TIPC_ADDR_ID 3 ++ ++#define TIPC_NODE_BITS 12 ++#define TIPC_CLUSTER_BITS 12 ++#define TIPC_ZONE_BITS 8 ++ ++#define TIPC_NODE_OFFSET 0 ++#define TIPC_CLUSTER_OFFSET TIPC_NODE_BITS ++#define TIPC_ZONE_OFFSET (TIPC_CLUSTER_OFFSET + TIPC_CLUSTER_BITS) ++ ++#define TIPC_NODE_SIZE ((1UL << TIPC_NODE_BITS) - 1) ++#define TIPC_CLUSTER_SIZE ((1UL << TIPC_CLUSTER_BITS) - 1) ++#define TIPC_ZONE_SIZE ((1UL << TIPC_ZONE_BITS) - 1) ++ ++#define TIPC_NODE_MASK (TIPC_NODE_SIZE << TIPC_NODE_OFFSET) ++#define TIPC_CLUSTER_MASK (TIPC_CLUSTER_SIZE << TIPC_CLUSTER_OFFSET) ++#define TIPC_ZONE_MASK (TIPC_ZONE_SIZE << TIPC_ZONE_OFFSET) ++ ++#define TIPC_ZONE_CLUSTER_MASK (TIPC_ZONE_MASK | TIPC_CLUSTER_MASK) ++ ++#define tipc_portid tipc_socket_addr ++#define tipc_name tipc_service_addr ++#define tipc_name_seq tipc_service_range ++ ++static __inline__ __u32 tipc_addr(unsigned int zone, ++ unsigned int cluster, ++ unsigned int node) ++{ ++ return (zone << TIPC_ZONE_OFFSET) | ++ (cluster << TIPC_CLUSTER_OFFSET) | ++ node; ++} ++ ++static __inline__ unsigned int tipc_zone(__u32 addr) ++{ ++ return addr >> TIPC_ZONE_OFFSET; ++} ++ ++static __inline__ unsigned int tipc_cluster(__u32 addr) ++{ ++ return (addr & TIPC_CLUSTER_MASK) >> TIPC_CLUSTER_OFFSET; ++} ++ ++static __inline__ unsigned int tipc_node(__u32 addr) ++{ ++ return addr & TIPC_NODE_MASK; ++} ++ + #endif +diff --git a/include/uapi/linux/tipc_netlink.h b/include/uapi/linux/tipc_netlink.h +index f9edd20..0ebe02e 100644 +--- a/include/uapi/linux/tipc_netlink.h ++++ b/include/uapi/linux/tipc_netlink.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ + /* + * Copyright (c) 2014, Ericsson AB + * All rights reserved. +@@ -113,6 +114,14 @@ enum { + TIPC_NLA_SOCK_REF, /* u32 */ + TIPC_NLA_SOCK_CON, /* nest */ + TIPC_NLA_SOCK_HAS_PUBL, /* flag */ ++ TIPC_NLA_SOCK_STAT, /* nest */ ++ TIPC_NLA_SOCK_TYPE, /* u32 */ ++ TIPC_NLA_SOCK_INO, /* u32 */ ++ TIPC_NLA_SOCK_UID, /* u32 */ ++ TIPC_NLA_SOCK_TIPC_STATE, /* u32 */ ++ TIPC_NLA_SOCK_COOKIE, /* u64 */ ++ TIPC_NLA_SOCK_PAD, /* flag */ ++ TIPC_NLA_SOCK_GROUP, /* nest */ + + __TIPC_NLA_SOCK_MAX, + TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1 +@@ -161,6 +170,8 @@ enum { + TIPC_NLA_NET_UNSPEC, + TIPC_NLA_NET_ID, /* u32 */ + TIPC_NLA_NET_ADDR, /* u32 */ ++ TIPC_NLA_NET_NODEID, /* u64 */ ++ TIPC_NLA_NET_NODEID_W1, /* u64 */ + + __TIPC_NLA_NET_MAX, + TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1 +@@ -223,6 +234,19 @@ enum { + TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1 + }; + ++/* Nest, socket group info */ ++enum { ++ TIPC_NLA_SOCK_GROUP_ID, /* u32 */ ++ TIPC_NLA_SOCK_GROUP_OPEN, /* flag */ ++ TIPC_NLA_SOCK_GROUP_NODE_SCOPE, /* flag */ ++ TIPC_NLA_SOCK_GROUP_CLUSTER_SCOPE, /* flag */ ++ TIPC_NLA_SOCK_GROUP_INSTANCE, /* u32 */ ++ TIPC_NLA_SOCK_GROUP_BC_SEND_NEXT, /* u32 */ ++ ++ __TIPC_NLA_SOCK_GROUP_MAX, ++ TIPC_NLA_SOCK_GROUP_MAX = __TIPC_NLA_SOCK_GROUP_MAX - 1 ++}; ++ + /* Nest, connection info */ + enum { + TIPC_NLA_CON_UNSPEC, +@@ -237,6 +261,18 @@ enum { + TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1 + }; + ++/* Nest, socket statistics info */ ++enum { ++ TIPC_NLA_SOCK_STAT_RCVQ, /* u32 */ ++ TIPC_NLA_SOCK_STAT_SENDQ, /* u32 */ ++ TIPC_NLA_SOCK_STAT_LINK_CONG, /* flag */ ++ TIPC_NLA_SOCK_STAT_CONN_CONG, /* flag */ ++ TIPC_NLA_SOCK_STAT_DROP, /* u32 */ ++ ++ __TIPC_NLA_SOCK_STAT_MAX, ++ TIPC_NLA_SOCK_STAT_MAX = __TIPC_NLA_SOCK_STAT_MAX - 1 ++}; ++ + /* Nest, link propreties. Valid for link, media and bearer */ + enum { + TIPC_NLA_PROP_UNSPEC, +@@ -244,6 +280,7 @@ enum { + TIPC_NLA_PROP_PRIO, /* u32 */ + TIPC_NLA_PROP_TOL, /* u32 */ + TIPC_NLA_PROP_WIN, /* u32 */ ++ TIPC_NLA_PROP_MTU, /* u32 */ + + __TIPC_NLA_PROP_MAX, + TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1 +diff --git a/include/uapi/linux/tipc_sockets_diag.h b/include/uapi/linux/tipc_sockets_diag.h +new file mode 100644 +index 0000000..21b766e +--- /dev/null ++++ b/include/uapi/linux/tipc_sockets_diag.h +@@ -0,0 +1,17 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++/* AF_TIPC sock_diag interface for querying open sockets */ ++ ++#ifndef __TIPC_SOCKETS_DIAG_H__ ++#define __TIPC_SOCKETS_DIAG_H__ ++ ++#include ++#include ++ ++/* Request */ ++struct tipc_sock_diag_req { ++ __u8 sdiag_family; /* must be AF_TIPC */ ++ __u8 sdiag_protocol; /* must be 0 */ ++ __u16 pad; /* must be 0 */ ++ __u32 tidiag_states; /* query*/ ++}; ++#endif /* __TIPC_SOCKETS_DIAG_H__ */ +diff --git a/include/uapi/linux/types.h b/include/uapi/linux/types.h +index c640657..999cb0f 100644 +--- a/include/uapi/linux/types.h ++++ b/include/uapi/linux/types.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_TYPES_H + #define _LINUX_TYPES_H + +@@ -43,5 +44,7 @@ typedef __u32 __bitwise __wsum; + #define __aligned_be64 __be64 __attribute__((aligned(8))) + #define __aligned_le64 __le64 __attribute__((aligned(8))) + ++typedef unsigned __bitwise __poll_t; ++ + #endif /* __ASSEMBLY__ */ + #endif /* _LINUX_TYPES_H */ +diff --git a/include/uapi/linux/unix_diag.h b/include/uapi/linux/unix_diag.h +index 1eb0b8d..5c502fd 100644 +--- a/include/uapi/linux/unix_diag.h ++++ b/include/uapi/linux/unix_diag.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __UNIX_DIAG_H__ + #define __UNIX_DIAG_H__ + +diff --git a/include/uapi/linux/veth.h b/include/uapi/linux/veth.h +index 3354c1e..52b58e5 100644 +--- a/include/uapi/linux/veth.h ++++ b/include/uapi/linux/veth.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef __NET_VETH_H_ + #define __NET_VETH_H_ + +diff --git a/include/uapi/linux/vm_sockets_diag.h b/include/uapi/linux/vm_sockets_diag.h +index a732a6f..6da42f9 100644 +--- a/include/uapi/linux/vm_sockets_diag.h ++++ b/include/uapi/linux/vm_sockets_diag.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + /* AF_VSOCK sock_diag(7) interface for querying open sockets */ + + #ifndef __VM_SOCKETS_DIAG_H__ +diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h +index 5790293..93fb192 100644 +--- a/include/uapi/linux/xfrm.h ++++ b/include/uapi/linux/xfrm.h +@@ -1,3 +1,4 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + #ifndef _LINUX_XFRM_H + #define _LINUX_XFRM_H + +-- +1.8.3.1 + diff --git a/SOURCES/0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch b/SOURCES/0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch new file mode 100644 index 0000000..7c608ff --- /dev/null +++ b/SOURCES/0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch @@ -0,0 +1,129 @@ +From 738c49477eb843b37cb799115e5b562303bfcd9e Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 6 Feb 2019 14:51:12 +0100 +Subject: [PATCH] tc/flower: Add match on encapsulating tos/ttl + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909 +Upstream Status: iproute2.git commit 761ec9e29ff86 +Conflicts: Adjusted code to missing commit e28b88a464c49 + ("tc: jsonify flower filter"). + +commit 761ec9e29ff867452057f59dc6ca430688b409ea +Author: Or Gerlitz +Date: Thu Jul 19 14:02:15 2018 +0300 + + tc/flower: Add match on encapsulating tos/ttl + + Add matching on tos/ttl of the IP tunnel headers. + + For example, here's decap rule that matches on the tunnel tos: + + tc filter add dev vxlan_sys_4789 protocol ip parent ffff: prio 10 flower \ + enc_src_ip 192.168.10.2 enc_dst_ip 192.168.10.1 enc_key_id 100 enc_dst_port 4789 enc_tos 0x30 \ + src_mac e4:11:22:33:44:70 dst_mac e4:11:22:33:44:50 \ + action tunnel_key unset \ + action mirred egress redirect dev eth0_0 + + Signed-off-by: Or Gerlitz + Reviewed-by: Roi Dayan + Acked-by: Jiri Pirko + Signed-off-by: David Ahern +--- + man/man8/tc-flower.8 | 14 +++++++++++++- + tc/f_flower.c | 27 +++++++++++++++++++++++++++ + 2 files changed, 40 insertions(+), 1 deletion(-) + +diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8 +index be46f02..af19708 100644 +--- a/man/man8/tc-flower.8 ++++ b/man/man8/tc-flower.8 +@@ -57,6 +57,10 @@ flower \- flow based traffic control filter + .IR ipv4_address " | " ipv6_address " } | " + .B enc_dst_port + .IR port_number " | " ++.B enc_tos ++.IR TOS " | " ++.B enc_ttl ++.IR TTL " | " + .BR ip_flags + .IR IP_FLAGS + .SH DESCRIPTION +@@ -207,6 +211,10 @@ bits is assumed. + .BI enc_src_ip " PREFIX" + .TQ + .BI enc_dst_port " NUMBER" ++.TQ ++.BI enc_tos " NUMBER" ++.TQ ++.BI enc_ttl " NUMBER" + Match on IP tunnel metadata. Key id + .I NUMBER + is a 32 bit tunnel key id (e.g. VNI for VXLAN tunnel). +@@ -215,7 +223,11 @@ must be a valid IPv4 or IPv6 address optionally followed by a slash and the + prefix length. If the prefix is missing, \fBtc\fR assumes a full-length + host match. Dst port + .I NUMBER +-is a 16 bit UDP dst port. ++is a 16 bit UDP dst port. Tos ++.I NUMBER ++is an 8 bit tos (dscp+ecn) value, ttl ++.I NUMBER ++is an 8 bit time-to-live value. + .TP + .BI ip_flags " IP_FLAGS" + .I IP_FLAGS +diff --git a/tc/f_flower.c b/tc/f_flower.c +index 5be693a..5f5236c 100644 +--- a/tc/f_flower.c ++++ b/tc/f_flower.c +@@ -70,6 +70,8 @@ static void explain(void) + " enc_dst_ip [ IPV4-ADDR | IPV6-ADDR ] |\n" + " enc_src_ip [ IPV4-ADDR | IPV6-ADDR ] |\n" + " enc_key_id [ KEY-ID ] |\n" ++ " enc_tos MASKED-IP_TOS |\n" ++ " enc_ttl MASKED-IP_TTL |\n" + " ip_flags IP-FLAGS | \n" + " enc_dst_port [ port_number ] }\n" + " FILTERID := X:Y:Z\n" +@@ -883,6 +885,26 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + fprintf(stderr, "Illegal \"enc_dst_port\"\n"); + return -1; + } ++ } else if (matches(*argv, "enc_tos") == 0) { ++ NEXT_ARG(); ++ ret = flower_parse_ip_tos_ttl(*argv, ++ TCA_FLOWER_KEY_ENC_IP_TOS, ++ TCA_FLOWER_KEY_ENC_IP_TOS_MASK, ++ n); ++ if (ret < 0) { ++ fprintf(stderr, "Illegal \"enc_tos\"\n"); ++ return -1; ++ } ++ } else if (matches(*argv, "enc_ttl") == 0) { ++ NEXT_ARG(); ++ ret = flower_parse_ip_tos_ttl(*argv, ++ TCA_FLOWER_KEY_ENC_IP_TTL, ++ TCA_FLOWER_KEY_ENC_IP_TTL_MASK, ++ n); ++ if (ret < 0) { ++ fprintf(stderr, "Illegal \"enc_ttl\"\n"); ++ return -1; ++ } + } else if (matches(*argv, "action") == 0) { + NEXT_ARG(); + ret = parse_action(&argc, &argv, TCA_FLOWER_ACT, n); +@@ -1296,6 +1318,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f, + flower_print_port(f, "enc_dst_port", + tb[TCA_FLOWER_KEY_ENC_UDP_DST_PORT]); + ++ flower_print_ip_attr(f, "enc_tos", tb[TCA_FLOWER_KEY_ENC_IP_TOS], ++ tb[TCA_FLOWER_KEY_ENC_IP_TOS_MASK]); ++ flower_print_ip_attr(f, "enc_ttl", tb[TCA_FLOWER_KEY_ENC_IP_TTL], ++ tb[TCA_FLOWER_KEY_ENC_IP_TTL_MASK]); ++ + flower_print_matching_flags(f, "ip_flags", + FLOWER_IP_FLAGS, + tb[TCA_FLOWER_KEY_FLAGS], +-- +1.8.3.1 + diff --git a/SOURCES/0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch b/SOURCES/0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch new file mode 100644 index 0000000..c3a3eca --- /dev/null +++ b/SOURCES/0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch @@ -0,0 +1,148 @@ +From 7521695ca299ceb723dc6b17f304b91300b3b16c Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Wed, 6 Feb 2019 14:51:57 +0100 +Subject: [PATCH] tc/act_tunnel_key: Enable setup of tos and ttl + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641909 +Upstream Status: iproute2.git commit 9f89b0cc0eda2 +Conflicts: +* Context change due to missing commits + 59eb271d1d259 ("tc: m_tunnel_key: add csum/nocsum option") and + 6217917a38268 ("tc: m_tunnel_key: Add tunnel option support to act_tunnel_key"). +* Adjusted tunnel_key_print_tos_ttl() to missing commit 8feb516bfcdd9 + ("tc: jsonify tunnel_key action"). + +commit 9f89b0cc0eda2ef52d8850b0610f3e2e09fd7c1c +Author: Or Gerlitz +Date: Thu Jul 19 14:02:14 2018 +0300 + + tc/act_tunnel_key: Enable setup of tos and ttl + + Allow to set tos and ttl for the tunnel. + + For example, here's encap rule that sets tos to the tunnel: + + tc filter add dev eth0_0 protocol ip parent ffff: prio 10 flower \ + src_mac e4:11:22:33:44:50 dst_mac e4:11:22:33:44:70 \ + action tunnel_key set src_ip 192.168.10.1 dst_ip 192.168.10.2 id 100 dst_port 4789 tos 0x30 \ + action mirred egress redirect dev vxlan_sys_4789 + + Signed-off-by: Or Gerlitz + Reviewed-by: Roi Dayan + Acked-by: Jiri Pirko + Signed-off-by: David Ahern +--- + man/man8/tc-tunnel_key.8 | 8 ++++++++ + tc/m_tunnel_key.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 57 insertions(+) + +diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8 +index 52fa585..5e93c59 100644 +--- a/man/man8/tc-tunnel_key.8 ++++ b/man/man8/tc-tunnel_key.8 +@@ -16,6 +16,8 @@ tunnel_key - Tunnel metadata manipulation + .IR ADDRESS + .BI id " KEY_ID" + .BI dst_port " UDP_PORT" ++.BI tos " TOS" ++.BI ttl " TTL" + + .SH DESCRIPTION + The +@@ -77,6 +79,12 @@ Outer header destination IP address (IPv4 or IPv6) + .TP + .B dst_port + Outer header destination UDP port ++.TP ++.B tos ++Outer header TOS ++.TP ++.B ttl ++Outer header TTL + .RE + .SH EXAMPLES + The following example encapsulates incoming ICMP packets on eth0 into a vxlan +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index acbcfc1..60fd1c4 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -80,6 +80,22 @@ static int tunnel_key_parse_dst_port(char *str, int type, struct nlmsghdr *n) + return 0; + } + ++static int tunnel_key_parse_tos_ttl(char *str, int type, struct nlmsghdr *n) ++{ ++ int ret; ++ __u8 val; ++ ++ ret = get_u8(&val, str, 10); ++ if (ret) ++ ret = get_u8(&val, str, 16); ++ if (ret) ++ return -1; ++ ++ addattr8(n, MAX_MSG, type, val); ++ ++ return 0; ++} ++ + static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + int tca_id, struct nlmsghdr *n) + { +@@ -154,6 +170,22 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + fprintf(stderr, "Illegal \"dst port\"\n"); + return -1; + } ++ } else if (matches(*argv, "tos") == 0) { ++ NEXT_ARG(); ++ ret = tunnel_key_parse_tos_ttl(*argv, ++ TCA_TUNNEL_KEY_ENC_TOS, n); ++ if (ret < 0) { ++ fprintf(stderr, "Illegal \"tos\"\n"); ++ return -1; ++ } ++ } else if (matches(*argv, "ttl") == 0) { ++ NEXT_ARG(); ++ ret = tunnel_key_parse_tos_ttl(*argv, ++ TCA_TUNNEL_KEY_ENC_TTL, n); ++ if (ret < 0) { ++ fprintf(stderr, "Illegal \"ttl\"\n"); ++ return -1; ++ } + } else if (matches(*argv, "help") == 0) { + usage(); + } else { +@@ -231,6 +263,19 @@ static void tunnel_key_print_dst_port(FILE *f, char *name, + fprintf(f, "\n\t%s %d", name, rta_getattr_be16(attr)); + } + ++static void tunnel_key_print_tos_ttl(FILE *f, char *name, ++ struct rtattr *attr) ++{ ++ if (!attr) ++ return; ++ ++ if (matches(name, "tos") == 0 && rta_getattr_u8(attr) != 0) { ++ fprintf(f, "\n\t%s 0x%x", name, rta_getattr_u8(attr)); ++ } else if (matches(name, "ttl") == 0 && rta_getattr_u8(attr) != 0) { ++ fprintf(f, "\n\t%s %u", name, rta_getattr_u8(attr)); ++ } ++} ++ + static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg) + { + struct rtattr *tb[TCA_TUNNEL_KEY_MAX + 1]; +@@ -267,6 +312,10 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg) + tb[TCA_TUNNEL_KEY_ENC_KEY_ID]); + tunnel_key_print_dst_port(f, "dst_port", + tb[TCA_TUNNEL_KEY_ENC_DST_PORT]); ++ tunnel_key_print_tos_ttl(f, "tos", ++ tb[TCA_TUNNEL_KEY_ENC_TOS]); ++ tunnel_key_print_tos_ttl(f, "ttl", ++ tb[TCA_TUNNEL_KEY_ENC_TTL]); + break; + } + fprintf(f, " %s", action_n2a(parm->action)); +-- +1.8.3.1 + diff --git a/SOURCES/0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch b/SOURCES/0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch new file mode 100644 index 0000000..14774b6 --- /dev/null +++ b/SOURCES/0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch @@ -0,0 +1,52 @@ +From d80837df37cb8897769f87f7a2034a9653168221 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Thu, 21 Feb 2019 14:38:57 +0100 +Subject: [PATCH] iproute: Abort if nexthop cannot be parsed + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656 +Upstream Status: iproute2.git commit ee53b42fd8b0b + +commit ee53b42fd8b0b0cdb857d0f5bf7467e22a3457d9 +Author: Jakub Sitnicki +Date: Wed Apr 11 11:43:11 2018 +0200 + + iproute: Abort if nexthop cannot be parsed + + Attempt to add a multipath route where a nexthop definition refers to a + non-existent device causes 'ip' to crash and burn due to stack buffer + overflow: + + # ip -6 route add fd00::1/64 nexthop dev fake1 + Cannot find device "fake1" + Cannot find device "fake1" + Cannot find device "fake1" + ... + Segmentation fault (core dumped) + + Don't ignore errors from the helper routine that parses the nexthop + definition, and abort immediately if parsing fails. + + Signed-off-by: Jakub Sitnicki +--- + ip/iproute.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/ip/iproute.c b/ip/iproute.c +index 35fdce8..759032d 100644 +--- a/ip/iproute.c ++++ b/ip/iproute.c +@@ -817,7 +817,10 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r, + memset(rtnh, 0, sizeof(*rtnh)); + rtnh->rtnh_len = sizeof(*rtnh); + rta->rta_len += rtnh->rtnh_len; +- parse_one_nh(n, r, rta, rtnh, &argc, &argv); ++ if (parse_one_nh(n, r, rta, rtnh, &argc, &argv)) { ++ fprintf(stderr, "Error: cannot parse nexthop\n"); ++ exit(-1); ++ } + rtnh = RTNH_NEXT(rtnh); + } + +-- +1.8.3.1 + diff --git a/SOURCES/0051-ip-route-Fix-segfault-with-many-nexthops.patch b/SOURCES/0051-ip-route-Fix-segfault-with-many-nexthops.patch new file mode 100644 index 0000000..07109f0 --- /dev/null +++ b/SOURCES/0051-ip-route-Fix-segfault-with-many-nexthops.patch @@ -0,0 +1,388 @@ +From 5845a145808162560293cf4f7c55bbb5afc8dce7 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Thu, 21 Feb 2019 14:38:57 +0100 +Subject: [PATCH] ip-route: Fix segfault with many nexthops + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656 +Upstream Status: iproute2.git commit bd59e5b1517b0 +Conflicts: Context changes due to missing other commits. + +commit bd59e5b1517b09b6f26d59f38fe6077d953c2396 +Author: Phil Sutter +Date: Thu Sep 6 15:31:51 2018 +0200 + + ip-route: Fix segfault with many nexthops + + It was possible to crash ip-route by adding an IPv6 route with 37 + nexthop statements. A simple reproducer is: + + | for i in `seq 37`; do + | nhs="nexthop via 1111::$i "$nhs + | done + | ip -6 route add 3333::/64 $nhs + + The related code was broken in multiple ways: + + * parse_one_nh() assumed that rta points to 4kB of storage but caller + provided just 1kB. Fixed by passing 'len' parameter with the correct + value. + + * Error checking of rta_addattr*() calls in parse_one_nh() and called + functions was completely absent, so with above fix in place output + flood would occur due to parser looping forever. + + While being at it, increase message buffer sizes to 4k. This allows for + at most 144 nexthops. + + Signed-off-by: Phil Sutter + Signed-off-by: Stephen Hemminger +--- + ip/iproute.c | 43 +++++++++++++++++++++-------------- + ip/iproute_lwtunnel.c | 63 ++++++++++++++++++++++++++++++++------------------- + 2 files changed, 66 insertions(+), 40 deletions(-) + +diff --git a/ip/iproute.c b/ip/iproute.c +index 759032d..d4db035 100644 +--- a/ip/iproute.c ++++ b/ip/iproute.c +@@ -721,7 +721,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) + } + + static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r, +- struct rtattr *rta, struct rtnexthop *rtnh, ++ struct rtattr *rta, size_t len, struct rtnexthop *rtnh, + int *argcp, char ***argvp) + { + int argc = *argcp; +@@ -742,11 +742,16 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r, + if (r->rtm_family == AF_UNSPEC) + r->rtm_family = addr.family; + if (addr.family == r->rtm_family) { +- rta_addattr_l(rta, 4096, RTA_GATEWAY, &addr.data, addr.bytelen); +- rtnh->rtnh_len += sizeof(struct rtattr) + addr.bytelen; ++ if (rta_addattr_l(rta, len, RTA_GATEWAY, ++ &addr.data, addr.bytelen)) ++ return -1; ++ rtnh->rtnh_len += sizeof(struct rtattr) ++ + addr.bytelen; + } else { +- rta_addattr_l(rta, 4096, RTA_VIA, &addr.family, addr.bytelen+2); +- rtnh->rtnh_len += RTA_SPACE(addr.bytelen+2); ++ if (rta_addattr_l(rta, len, RTA_VIA, ++ &addr.family, addr.bytelen + 2)) ++ return -1; ++ rtnh->rtnh_len += RTA_SPACE(addr.bytelen + 2); + } + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +@@ -769,13 +774,15 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r, + NEXT_ARG(); + if (get_rt_realms_or_raw(&realm, *argv)) + invarg("\"realm\" value is invalid\n", *argv); +- rta_addattr32(rta, 4096, RTA_FLOW, realm); ++ if (rta_addattr32(rta, len, RTA_FLOW, realm)) ++ return -1; + rtnh->rtnh_len += sizeof(struct rtattr) + 4; + } else if (strcmp(*argv, "encap") == 0) { +- int len = rta->rta_len; ++ int old_len = rta->rta_len; + +- lwt_parse_encap(rta, 4096, &argc, &argv); +- rtnh->rtnh_len += rta->rta_len - len; ++ if (lwt_parse_encap(rta, len, &argc, &argv)) ++ return -1; ++ rtnh->rtnh_len += rta->rta_len - old_len; + } else if (strcmp(*argv, "as") == 0) { + inet_prefix addr; + +@@ -783,8 +790,9 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r, + if (strcmp(*argv, "to") == 0) + NEXT_ARG(); + get_addr(&addr, *argv, r->rtm_family); +- rta_addattr_l(rta, 4096, RTA_NEWDST, &addr.data, +- addr.bytelen); ++ if (rta_addattr_l(rta, len, RTA_NEWDST, ++ &addr.data, addr.bytelen)) ++ return -1; + rtnh->rtnh_len += sizeof(struct rtattr) + addr.bytelen; + } else + break; +@@ -797,7 +805,7 @@ static int parse_one_nh(struct nlmsghdr *n, struct rtmsg *r, + static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r, + int argc, char **argv) + { +- char buf[1024]; ++ char buf[4096]; + struct rtattr *rta = (void *)buf; + struct rtnexthop *rtnh; + +@@ -817,7 +825,7 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r, + memset(rtnh, 0, sizeof(*rtnh)); + rtnh->rtnh_len = sizeof(*rtnh); + rta->rta_len += rtnh->rtnh_len; +- if (parse_one_nh(n, r, rta, rtnh, &argc, &argv)) { ++ if (parse_one_nh(n, r, rta, 4096, rtnh, &argc, &argv)) { + fprintf(stderr, "Error: cannot parse nexthop\n"); + exit(-1); + } +@@ -825,7 +833,8 @@ static int parse_nexthops(struct nlmsghdr *n, struct rtmsg *r, + } + + if (rta->rta_len > RTA_LENGTH(0)) +- addattr_l(n, 1024, RTA_MULTIPATH, RTA_DATA(rta), RTA_PAYLOAD(rta)); ++ return addattr_l(n, 4096, RTA_MULTIPATH, ++ RTA_DATA(rta), RTA_PAYLOAD(rta)); + return 0; + } + +@@ -834,7 +843,7 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv) + struct { + struct nlmsghdr n; + struct rtmsg r; +- char buf[1024]; ++ char buf[4096]; + } req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)), + .n.nlmsg_flags = NLM_F_REQUEST | flags, +@@ -1238,8 +1247,8 @@ static int iproute_modify(int cmd, unsigned int flags, int argc, char **argv) + addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta)); + } + +- if (nhs_ok) +- parse_nexthops(&req.n, &req.r, argc, argv); ++ if (nhs_ok && parse_nexthops(&req.n, &req.r, argc, argv)) ++ return -1; + + if (req.r.rtm_family == AF_UNSPEC) + req.r.rtm_family = AF_INET; +diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c +index 0fa1cab..1a68912 100644 +--- a/ip/iproute_lwtunnel.c ++++ b/ip/iproute_lwtunnel.c +@@ -255,8 +255,9 @@ static int parse_encap_mpls(struct rtattr *rta, size_t len, + exit(1); + } + +- rta_addattr_l(rta, len, MPLS_IPTUNNEL_DST, &addr.data, +- addr.bytelen); ++ if (rta_addattr_l(rta, len, MPLS_IPTUNNEL_DST, ++ &addr.data, addr.bytelen)) ++ return -1; + + *argcp = argc; + *argvp = argv; +@@ -270,6 +271,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, + int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0; + char **argv = *argvp; + int argc = *argcp; ++ int ret = 0; + + while (argc > 0) { + if (strcmp(*argv, "id") == 0) { +@@ -280,7 +282,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, + duparg2("id", *argv); + if (get_be64(&id, *argv, 0)) + invarg("\"id\" value is invalid\n", *argv); +- rta_addattr64(rta, len, LWTUNNEL_IP_ID, id); ++ ret = rta_addattr64(rta, len, LWTUNNEL_IP_ID, id); + } else if (strcmp(*argv, "dst") == 0) { + inet_prefix addr; + +@@ -288,8 +290,8 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, + if (dst_ok++) + duparg2("dst", *argv); + get_addr(&addr, *argv, AF_INET); +- rta_addattr_l(rta, len, LWTUNNEL_IP_DST, +- &addr.data, addr.bytelen); ++ ret = rta_addattr_l(rta, len, LWTUNNEL_IP_DST, ++ &addr.data, addr.bytelen); + } else if (strcmp(*argv, "tos") == 0) { + __u32 tos; + +@@ -298,7 +300,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, + duparg2("tos", *argv); + if (rtnl_dsfield_a2n(&tos, *argv)) + invarg("\"tos\" value is invalid\n", *argv); +- rta_addattr8(rta, len, LWTUNNEL_IP_TOS, tos); ++ ret = rta_addattr8(rta, len, LWTUNNEL_IP_TOS, tos); + } else if (strcmp(*argv, "ttl") == 0) { + __u8 ttl; + +@@ -307,10 +309,12 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, + duparg2("ttl", *argv); + if (get_u8(&ttl, *argv, 0)) + invarg("\"ttl\" value is invalid\n", *argv); +- rta_addattr8(rta, len, LWTUNNEL_IP_TTL, ttl); ++ ret = rta_addattr8(rta, len, LWTUNNEL_IP_TTL, ttl); + } else { + break; + } ++ if (ret) ++ break; + argc--; argv++; + } + +@@ -321,7 +325,7 @@ static int parse_encap_ip(struct rtattr *rta, size_t len, + *argcp = argc + 1; + *argvp = argv - 1; + +- return 0; ++ return ret; + } + + static int parse_encap_ila(struct rtattr *rta, size_t len, +@@ -330,6 +334,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + __u64 locator; + int argc = *argcp; + char **argv = *argvp; ++ int ret = 0; + + if (get_addr64(&locator, *argv) < 0) { + fprintf(stderr, "Bad locator: %s\n", *argv); +@@ -338,7 +343,8 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + + argc--; argv++; + +- rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator); ++ if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator)) ++ return -1; + + while (argc > 0) { + if (strcmp(*argv, "csum-mode") == 0) { +@@ -351,12 +357,15 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + invarg("\"csum-mode\" value is invalid\n", + *argv); + +- rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, csum_mode); ++ ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, ++ (__u8)csum_mode); + + argc--; argv++; + } else { + break; + } ++ if (ret) ++ break; + } + + /* argv is currently the first unparsed argument, +@@ -366,7 +375,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + *argcp = argc + 1; + *argvp = argv - 1; + +- return 0; ++ return ret; + } + + static int parse_encap_ip6(struct rtattr *rta, size_t len, +@@ -375,6 +384,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, + int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0; + char **argv = *argvp; + int argc = *argcp; ++ int ret = 0; + + while (argc > 0) { + if (strcmp(*argv, "id") == 0) { +@@ -385,7 +395,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, + duparg2("id", *argv); + if (get_be64(&id, *argv, 0)) + invarg("\"id\" value is invalid\n", *argv); +- rta_addattr64(rta, len, LWTUNNEL_IP6_ID, id); ++ ret = rta_addattr64(rta, len, LWTUNNEL_IP6_ID, id); + } else if (strcmp(*argv, "dst") == 0) { + inet_prefix addr; + +@@ -393,8 +403,8 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, + if (dst_ok++) + duparg2("dst", *argv); + get_addr(&addr, *argv, AF_INET6); +- rta_addattr_l(rta, len, LWTUNNEL_IP6_DST, +- &addr.data, addr.bytelen); ++ ret = rta_addattr_l(rta, len, LWTUNNEL_IP6_DST, ++ &addr.data, addr.bytelen); + } else if (strcmp(*argv, "tc") == 0) { + __u32 tc; + +@@ -403,7 +413,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, + duparg2("tc", *argv); + if (rtnl_dsfield_a2n(&tc, *argv)) + invarg("\"tc\" value is invalid\n", *argv); +- rta_addattr8(rta, len, LWTUNNEL_IP6_TC, tc); ++ ret = rta_addattr8(rta, len, LWTUNNEL_IP6_TC, tc); + } else if (strcmp(*argv, "hoplimit") == 0) { + __u8 hoplimit; + +@@ -413,10 +423,13 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, + if (get_u8(&hoplimit, *argv, 0)) + invarg("\"hoplimit\" value is invalid\n", + *argv); +- rta_addattr8(rta, len, LWTUNNEL_IP6_HOPLIMIT, hoplimit); ++ ret = rta_addattr8(rta, len, LWTUNNEL_IP6_HOPLIMIT, ++ hoplimit); + } else { + break; + } ++ if (ret) ++ break; + argc--; argv++; + } + +@@ -427,7 +440,7 @@ static int parse_encap_ip6(struct rtattr *rta, size_t len, + *argcp = argc + 1; + *argvp = argv - 1; + +- return 0; ++ return ret; + } + + struct lwt_x { +@@ -542,6 +555,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) + int argc = *argcp; + char **argv = *argvp; + __u16 type; ++ int ret = 0; + + NEXT_ARG(); + type = read_encap_type(*argv); +@@ -558,16 +572,16 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) + nest = rta_nest(rta, 1024, RTA_ENCAP); + switch (type) { + case LWTUNNEL_ENCAP_MPLS: +- parse_encap_mpls(rta, len, &argc, &argv); ++ ret = parse_encap_mpls(rta, len, &argc, &argv); + break; + case LWTUNNEL_ENCAP_IP: +- parse_encap_ip(rta, len, &argc, &argv); ++ ret = parse_encap_ip(rta, len, &argc, &argv); + break; + case LWTUNNEL_ENCAP_ILA: +- parse_encap_ila(rta, len, &argc, &argv); ++ ret = parse_encap_ila(rta, len, &argc, &argv); + break; + case LWTUNNEL_ENCAP_IP6: +- parse_encap_ip6(rta, len, &argc, &argv); ++ ret = parse_encap_ip6(rta, len, &argc, &argv); + break; + case LWTUNNEL_ENCAP_BPF: + if (parse_encap_bpf(rta, len, &argc, &argv) < 0) +@@ -577,12 +591,15 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) + fprintf(stderr, "Error: unsupported encap type\n"); + break; + } ++ if (ret) ++ return ret; ++ + rta_nest_end(rta, nest); + +- rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type); ++ ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type); + + *argcp = argc; + *argvp = argv; + +- return 0; ++ return ret; + } +-- +1.8.3.1 + diff --git a/SOURCES/0052-man-ip-route.8-Document-nexthop-limit.patch b/SOURCES/0052-man-ip-route.8-Document-nexthop-limit.patch new file mode 100644 index 0000000..cc483b9 --- /dev/null +++ b/SOURCES/0052-man-ip-route.8-Document-nexthop-limit.patch @@ -0,0 +1,46 @@ +From d511d7e60866060e260ec3f96b51a61c98c2c06f Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Thu, 21 Feb 2019 14:39:46 +0100 +Subject: [PATCH] man: ip-route.8: Document nexthop limit + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656 +Upstream Status: iproute2.git commit 6cd959bb125c5 + +commit 6cd959bb125c50a04ab6671645fa38c5b07426f4 +Author: Phil Sutter +Date: Tue Nov 13 16:55:13 2018 +0100 + + man: ip-route.8: Document nexthop limit + + Add a note to 'nexthop' description stating the maximum number of + nexthops per command and pointing at 'append' command as a workaround. + + Signed-off-by: Phil Sutter + Signed-off-by: Stephen Hemminger +--- + man/man8/ip-route.8.in | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in +index d6e0664..d9a5477 100644 +--- a/man/man8/ip-route.8.in ++++ b/man/man8/ip-route.8.in +@@ -548,6 +548,15 @@ argument lists: + route reflecting its relative bandwidth or quality. + .in -8 + ++The internal buffer used in iproute2 limits the maximum number of nexthops that ++may be specified in one go. If only ++.I ADDRESS ++is given, the current buffer size allows for 144 IPv6 nexthops and 253 IPv4 ++ones. For IPv4, this effectively limits the number of nexthops possible per ++route. With IPv6, further nexthops may be appended to the same route via ++.B "ip route append" ++command. ++ + .TP + .BI scope " SCOPE_VAL" + the scope of the destinations covered by the route prefix. +-- +1.8.3.1 + diff --git a/SOURCES/0053-ip-route-Fix-nexthop-encap-parsing.patch b/SOURCES/0053-ip-route-Fix-nexthop-encap-parsing.patch new file mode 100644 index 0000000..ff535eb --- /dev/null +++ b/SOURCES/0053-ip-route-Fix-nexthop-encap-parsing.patch @@ -0,0 +1,85 @@ +From b83b0767eccfb386406ccb24130b975f1c2b0ee4 Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Thu, 21 Feb 2019 14:39:47 +0100 +Subject: [PATCH] ip-route: Fix nexthop encap parsing + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656 +Upstream Status: iproute2.git commit 05d978e0850a6 +Conflicts: Some chunks dropped due to missing support for + ident-type and hook-type. + +commit 05d978e0850a6a3bae1e6c5392d82f7b1496f86a +Author: Phil Sutter +Date: Tue Nov 13 13:39:04 2018 +0100 + + ip-route: Fix nexthop encap parsing + + When parsing nexthop parameters, a buffer of 4k bytes is provided. Yet, + in lwt_parse_encap() and some functions called by it, buffer size was + assumed to be 1k despite the actual size was provided. This led to + spurious buffer size errors if the buffer was filled by previous nexthop + parameters to exceed that 1k boundary. + + Fixes: 1e5293056a02c ("lwtunnel: Add encapsulation support to ip route") + Fixes: 5866bddd9aa9e ("ila: Add support for ILA lwtunnels") + Fixes: ed67f83806538 ("ila: Support for checksum neutral translation") + Fixes: 86905c8f057c0 ("ila: support for configuring identifier and hook types") + Fixes: b15f440e78373 ("lwt: BPF support for LWT") + Signed-off-by: Phil Sutter + Signed-off-by: Stephen Hemminger +--- + ip/iproute_lwtunnel.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c +index 1a68912..b6f08f0 100644 +--- a/ip/iproute_lwtunnel.c ++++ b/ip/iproute_lwtunnel.c +@@ -343,7 +343,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + + argc--; argv++; + +- if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator)) ++ if (rta_addattr64(rta, len, ILA_ATTR_LOCATOR, locator)) + return -1; + + while (argc > 0) { +@@ -357,7 +357,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + invarg("\"csum-mode\" value is invalid\n", + *argv); + +- ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, ++ ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE, + (__u8)csum_mode); + + argc--; argv++; +@@ -528,7 +528,7 @@ static int parse_encap_bpf(struct rtattr *rta, size_t len, int *argcp, + if (get_unsigned(&headroom, *argv, 0) || headroom == 0) + invarg("headroom is invalid\n", *argv); + if (!headroom_set) +- rta_addattr32(rta, 1024, LWT_BPF_XMIT_HEADROOM, ++ rta_addattr32(rta, len, LWT_BPF_XMIT_HEADROOM, + headroom); + headroom_set = 1; + } else if (strcmp(*argv, "help") == 0) { +@@ -569,7 +569,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) + exit(-1); + } + +- nest = rta_nest(rta, 1024, RTA_ENCAP); ++ nest = rta_nest(rta, len, RTA_ENCAP); + switch (type) { + case LWTUNNEL_ENCAP_MPLS: + ret = parse_encap_mpls(rta, len, &argc, &argv); +@@ -596,7 +596,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) + + rta_nest_end(rta, nest); + +- ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type); ++ ret = rta_addattr16(rta, len, RTA_ENCAP_TYPE, type); + + *argcp = argc; + *argvp = argv; +-- +1.8.3.1 + diff --git a/SOURCES/0054-ip-link-Fix-listing-of-alias-interfaces.patch b/SOURCES/0054-ip-link-Fix-listing-of-alias-interfaces.patch new file mode 100644 index 0000000..534b391 --- /dev/null +++ b/SOURCES/0054-ip-link-Fix-listing-of-alias-interfaces.patch @@ -0,0 +1,57 @@ +From eb3be709aece2325f7eafc113120cf5ef8f077de Mon Sep 17 00:00:00 2001 +From: Phil Sutter +Date: Mon, 11 Mar 2019 16:28:41 +0100 +Subject: [PATCH] ip-link: Fix listing of alias interfaces + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1673226 +Upstream Status: RHEL-only +Conflicts: Context change due to missing commit 260137e24d3b7 + ("iplink: Remove flags argument from iplink_get") + +Upstream rejected this patch as the alias notation is neither required +nor wanted by iproute2[1]. With iproute rebase in RHEL7.5 though, we +changed existing behaviour by accident. Therefore we will carry this +patch for RHEL7 lifetime. + +[1] https://marc.info/?l=linux-netdev&m=154964861913609&w=2 + +commit a1259acb3c2037f464e31fad1f21556f8bf58c91 +Author: Phil Sutter +Date: Thu Feb 7 10:18:16 2019 +0100 + + ip-link: Fix listing of alias interfaces + + Commit 50b9950dd9011 ("link dump filter") accidentally broke listing of + links in the old alias interface notation: + + | % ip link show eth0:1 + | RTNETLINK answers: No such device + | Cannot send link get request: No such device + + Prior to the above commit, link lookup was performed via ifindex + returned by if_nametoindex(). The latter uses SIOCGIFINDEX ioctl call + which on kernel side causes the colon-suffix to be dropped before doing + the interface lookup. Netlink API though doesn't care about that at all. + To keep things backward compatible, mimick ioctl API behaviour and drop + the colon-suffix prior to sending the RTM_GETLINK request. + + Fixes: 50b9950dd9011 ("link dump filter") +--- + ip/ipaddress.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/ip/ipaddress.c b/ip/ipaddress.c +index 7492075..14e9e22 100644 +--- a/ip/ipaddress.c ++++ b/ip/ipaddress.c +@@ -1707,6 +1707,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action) + * the link device + */ + if (filter_dev && filter.group == -1 && do_link == 1) { ++ *strchrnul(filter_dev, ':') = '\0'; + if (iplink_get(0, filter_dev, RTEXT_FILTER_VF) < 0) { + perror("Cannot send link get request"); + exit(1); +-- +1.8.3.1 + diff --git a/SOURCES/0055-ip-Add-violation-counters-to-VF-statisctics.patch b/SOURCES/0055-ip-Add-violation-counters-to-VF-statisctics.patch new file mode 100644 index 0000000..72fd54f --- /dev/null +++ b/SOURCES/0055-ip-Add-violation-counters-to-VF-statisctics.patch @@ -0,0 +1,78 @@ +From 1e22b512374d25b547212bdbe1530ac8de1defdf Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 18 Mar 2019 11:23:40 +0100 +Subject: [PATCH] ip: Add violation counters to VF statisctics + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1471680 +Upstream Status: unknown commit 8c7acf3a +Conflicts: manually applied due to JSON support + +commit 8c7acf3a7ac265badc287f064614d60119a8072d +Author: Eran Ben Elisha +Date: Sun Jul 22 13:31:12 2018 +0300 + + ip: Add violation counters to VF statisctics + + Extend VFs statistics by receive and transmit violation counters. + + Example: "ip -s link show dev enp5s0f0" + + 6: enp5s0f0: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 + link/ether 24:8a:07:a5:28:f0 brd ff:ff:ff:ff:ff:ff + RX: bytes packets errors dropped overrun mcast + 0 0 0 0 0 2 + TX: bytes packets errors dropped carrier collsns + 1406 17 0 0 0 0 + vf 0 MAC 00:00:ca:fe:ca:fe, vlan 5, spoof checking off, link-state auto, trust off, query_rss off + RX: bytes packets mcast bcast dropped + 1666 29 14 32 0 + TX: bytes packets dropped + 2880 44 2412 + + Signed-off-by: Eran Ben Elisha + Signed-off-by: David Ahern +--- + ip/ipaddress.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/ip/ipaddress.c b/ip/ipaddress.c +index 14e9e22..44111a2 100644 +--- a/ip/ipaddress.c ++++ b/ip/ipaddress.c +@@ -471,21 +471,31 @@ static void print_vf_stats64(FILE *fp, struct rtattr *vfstats) + + /* RX stats */ + fprintf(fp, "%s", _SL_); +- fprintf(fp, " RX: bytes packets mcast bcast %s", _SL_); ++ fprintf(fp, " RX: bytes packets mcast bcast "); ++ if (vf[IFLA_VF_STATS_RX_DROPPED]) ++ fprintf(fp, " dropped "); ++ fprintf(fp, "%s", _SL_); + fprintf(fp, " "); + + print_num(fp, 10, rta_getattr_u64(vf[IFLA_VF_STATS_RX_BYTES])); + print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_RX_PACKETS])); + print_num(fp, 7, rta_getattr_u64(vf[IFLA_VF_STATS_MULTICAST])); + print_num(fp, 7, rta_getattr_u64(vf[IFLA_VF_STATS_BROADCAST])); ++ if (vf[IFLA_VF_STATS_RX_DROPPED]) ++ print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_RX_DROPPED])); + + /* TX stats */ + fprintf(fp, "%s", _SL_); +- fprintf(fp, " TX: bytes packets %s", _SL_); ++ fprintf(fp, " TX: bytes packets "); ++ if (vf[IFLA_VF_STATS_TX_DROPPED]) ++ fprintf(fp, " dropped "); ++ fprintf(fp, "%s", _SL_); + fprintf(fp, " "); + + print_num(fp, 10, rta_getattr_u64(vf[IFLA_VF_STATS_TX_BYTES])); + print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_TX_PACKETS])); ++ if (vf[IFLA_VF_STATS_TX_DROPPED]) ++ print_num(fp, 8, rta_getattr_u64(vf[IFLA_VF_STATS_TX_DROPPED])); + } + + static void print_link_stats64(FILE *fp, const struct rtnl_link_stats64 *s, +-- +2.20.1 + diff --git a/SOURCES/0056-devlink-Add-support-for-devlink-resource-abstraction.patch b/SOURCES/0056-devlink-Add-support-for-devlink-resource-abstraction.patch new file mode 100644 index 0000000..7f3c3c4 --- /dev/null +++ b/SOURCES/0056-devlink-Add-support-for-devlink-resource-abstraction.patch @@ -0,0 +1,633 @@ +From 5190aa430d198420679e53163604f7b6860bcd0f Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 11:40:10 +0100 +Subject: [PATCH] devlink: Add support for devlink resource abstraction + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731 +Upstream Status: iproute2.git commit 8cd644095842a +Conflicts: adjusted help printout due to missing commit + 3e897912cbff9 ("devlink: add batch command support") + +commit 8cd644095842af3107320e86eeb01be6af6c77bb +Author: Arkadi Sharshevsky +Date: Wed Feb 14 10:55:18 2018 +0200 + + devlink: Add support for devlink resource abstraction + + Add support for devlink resource abstraction. The resources are + represented by a tree based structure and are identified by a name and + a size. Some resources can present their real time occupancy. + + First the resources exposed by the driver can be observed, for example: + + $devlink resource show pci/0000:03:00.0 + pci/0000:03:00.0: + name kvd size 245760 unit entry + resources: + name linear size 98304 occ 0 unit entry size_min 0 size_max 147456 size_gran 128 + name hash_double size 60416 unit entry size_min 32768 size_max 180224 size_gran 128 + name hash_single size 87040 unit entry size_min 65536 size_max 212992 size_gran 128 + + Some resource's size can be changed. Examples: + + $devlink resource set pci/0000:03:00.0 path /kvd/hash_single size 73088 + $devlink resource set pci/0000:03:00.0 path /kvd/hash_double size 74368 + + The changes do not apply immediately, this can be validate by the 'size_new' + attribute, which represents the pending changed size. For example + + $devlink resource show pci/0000:03:00.0 + pci/0000:03:00.0: + name kvd size 245760 unit entry size_valid false + resources: + name linear size 98304 size_new 147456 occ 0 unit entry size_min 0 size_max 147456 size_gran 128 + name hash_double size 60416 unit entry size_min 32768 size_max 180224 size_gran 128 + name hash_single size 87040 unit entry size_min 65536 size_max 212992 size_gran 128 + + In case of a pending change the nested resources present an indication + for a valid configuration of its children (sum of its children sizes + doesn't exceed the parent's size). + + In order for the changes to take place hot reload is needed. The hot + reload through devlink will be introduced in the following patch. + + Signed-off-by: Arkadi Sharshevsky + Acked-by: Jiri Pirko + Signed-off-by: Stephen Hemminger +--- + devlink/devlink.c | 490 +++++++++++++++++++++++++++++++++++++++++++++- + include/list.h | 5 + + 2 files changed, 494 insertions(+), 1 deletion(-) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index f9bc16c350c40..7f47b79450094 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -177,6 +177,8 @@ static void ifname_map_free(struct ifname_map *ifname_map) + #define DL_OPT_DPIPE_TABLE_NAME BIT(13) + #define DL_OPT_DPIPE_TABLE_COUNTERS BIT(14) + #define DL_OPT_ESWITCH_ENCAP_MODE BIT(15) ++#define DL_OPT_RESOURCE_PATH BIT(16) ++#define DL_OPT_RESOURCE_SIZE BIT(17) + + struct dl_opts { + uint32_t present; /* flags of present items */ +@@ -197,6 +199,10 @@ struct dl_opts { + const char *dpipe_table_name; + bool dpipe_counters_enable; + bool eswitch_encap_mode; ++ const char *resource_path; ++ uint32_t resource_size; ++ uint32_t resource_id; ++ bool resource_id_valid; + }; + + struct dl { +@@ -937,6 +943,20 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, + if (err) + return err; + o_found |= DL_OPT_ESWITCH_ENCAP_MODE; ++ } else if (dl_argv_match(dl, "path") && ++ (o_all & DL_OPT_RESOURCE_PATH)) { ++ dl_arg_inc(dl); ++ err = dl_argv_str(dl, &opts->resource_path); ++ if (err) ++ return err; ++ o_found |= DL_OPT_RESOURCE_PATH; ++ } else if (dl_argv_match(dl, "size") && ++ (o_all & DL_OPT_RESOURCE_SIZE)) { ++ dl_arg_inc(dl); ++ err = dl_argv_uint32_t(dl, &opts->resource_size); ++ if (err) ++ return err; ++ o_found |= DL_OPT_RESOURCE_SIZE; + } else { + pr_err("Unknown option \"%s\"\n", dl_argv(dl)); + return -EINVAL; +@@ -1079,6 +1099,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl) + if (opts->present & DL_OPT_ESWITCH_ENCAP_MODE) + mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, + opts->eswitch_encap_mode); ++ if ((opts->present & DL_OPT_RESOURCE_PATH) && opts->resource_id_valid) ++ mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_ID, ++ opts->resource_id); ++ if (opts->present & DL_OPT_RESOURCE_SIZE) ++ mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE, ++ opts->resource_size); + } + + static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl, +@@ -2666,6 +2692,91 @@ struct dpipe_header { + unsigned int fields_count; + }; + ++struct resource { ++ char *name; ++ uint64_t size; ++ uint64_t size_new; ++ uint64_t size_min; ++ uint64_t size_max; ++ uint64_t size_gran; ++ enum devlink_resource_unit unit; ++ bool size_valid; ++ uint64_t size_occ; ++ bool occ_valid; ++ uint64_t id; ++ struct list_head list; ++ struct list_head resource_list; ++ struct resource *parent; ++}; ++ ++struct resources { ++ struct list_head resource_list; ++}; ++ ++struct resource_ctx { ++ struct dl *dl; ++ int err; ++ struct resources *resources; ++ bool print_resources; ++ bool pending_change; ++}; ++ ++static struct resource *resource_alloc(void) ++{ ++ struct resource *resource; ++ ++ resource = calloc(1, sizeof(struct resource)); ++ if (!resource) ++ return NULL; ++ INIT_LIST_HEAD(&resource->resource_list); ++ return resource; ++} ++ ++static void resource_free(struct resource *resource) ++{ ++ struct resource *child_resource, *tmp; ++ ++ list_for_each_entry_safe(child_resource, tmp, &resource->resource_list, ++ list) { ++ free(child_resource->name); ++ resource_free(child_resource); ++ } ++ free(resource); ++} ++ ++static struct resources *resources_alloc(void) ++{ ++ struct resources *resources; ++ ++ resources = calloc(1, sizeof(struct resources)); ++ if (!resources) ++ return NULL; ++ INIT_LIST_HEAD(&resources->resource_list); ++ return resources; ++} ++ ++static void resources_free(struct resources *resources) ++{ ++ struct resource *resource, *tmp; ++ ++ list_for_each_entry_safe(resource, tmp, &resources->resource_list, list) ++ resource_free(resource); ++} ++ ++static int resource_ctx_init(struct resource_ctx *ctx, struct dl *dl) ++{ ++ ctx->resources = resources_alloc(); ++ if (!ctx->resources) ++ return -ENOMEM; ++ ctx->dl = dl; ++ return 0; ++} ++ ++static void resource_ctx_fini(struct resource_ctx *ctx) ++{ ++ resources_free(ctx->resources); ++} ++ + struct dpipe_ctx { + struct dl *dl; + int err; +@@ -3203,6 +3314,66 @@ err_match_show: + return -EINVAL; + } + ++static struct resource * ++resource_find(struct resources *resources, struct resource *resource, ++ uint64_t resource_id) ++{ ++ struct list_head *list_head; ++ ++ if (!resource) ++ list_head = &resources->resource_list; ++ else ++ list_head = &resource->resource_list; ++ ++ list_for_each_entry(resource, list_head, list) { ++ struct resource *child_resource; ++ ++ if (resource->id == resource_id) ++ return resource; ++ ++ child_resource = resource_find(resources, resource, ++ resource_id); ++ if (child_resource) ++ return child_resource; ++ } ++ return NULL; ++} ++ ++static void ++resource_path_print(struct dl *dl, struct resources *resources, ++ uint64_t resource_id) ++{ ++ struct resource *resource, *parent_resource; ++ const char del[] = "/"; ++ int path_len = 0; ++ char *path; ++ ++ resource = resource_find(resources, NULL, resource_id); ++ if (!resource) ++ return; ++ ++ for (parent_resource = resource; parent_resource; ++ parent_resource = parent_resource->parent) ++ path_len += strlen(parent_resource->name) + 1; ++ ++ path_len++; ++ path = calloc(1, path_len); ++ if (!path) ++ return; ++ ++ path += path_len - 1; ++ for (parent_resource = resource; parent_resource; ++ parent_resource = parent_resource->parent) { ++ path -= strlen(parent_resource->name); ++ memcpy(path, parent_resource->name, ++ strlen(parent_resource->name)); ++ path -= strlen(del); ++ memcpy(path, del, strlen(del)); ++ } ++ pr_out_str(dl, "resource_path", path); ++ free(path); ++} ++ + static int dpipe_table_show(struct dpipe_ctx *ctx, struct nlattr *nl) + { + struct nlattr *nla_table[DEVLINK_ATTR_MAX + 1] = {}; +@@ -3617,10 +3788,324 @@ static int cmd_dpipe(struct dl *dl) + return -ENOENT; + } + ++static int ++resource_parse(struct resource_ctx *ctx, struct resource *resource, ++ struct nlattr **nla_resource) ++{ ++ if (!nla_resource[DEVLINK_ATTR_RESOURCE_NAME] || ++ !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE] || ++ !nla_resource[DEVLINK_ATTR_RESOURCE_ID] || ++ !nla_resource[DEVLINK_ATTR_RESOURCE_UNIT] || ++ !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MIN] || ++ !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MAX] || ++ !nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_GRAN]) { ++ return -EINVAL; ++ } ++ ++ resource->name = strdup(mnl_attr_get_str(nla_resource[DEVLINK_ATTR_RESOURCE_NAME])); ++ resource->size = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE]); ++ resource->id = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_ID]); ++ resource->unit = mnl_attr_get_u8(nla_resource[DEVLINK_ATTR_RESOURCE_UNIT]); ++ resource->size_min = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MIN]); ++ resource->size_max = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_MAX]); ++ resource->size_gran = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_GRAN]); ++ ++ if (nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_NEW]) ++ resource->size_new = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_NEW]); ++ else ++ resource->size_new = resource->size; ++ ++ if (nla_resource[DEVLINK_ATTR_RESOURCE_OCC]) { ++ resource->size_occ = mnl_attr_get_u64(nla_resource[DEVLINK_ATTR_RESOURCE_OCC]); ++ resource->occ_valid = true; ++ } ++ ++ if (resource->size_new != resource->size) ++ ctx->pending_change = true; ++ ++ return 0; ++} ++ ++static int ++resource_get(struct resource_ctx *ctx, struct resource *resource, ++ struct resource *parent_resource, struct nlattr *nl) ++{ ++ struct nlattr *nla_resource[DEVLINK_ATTR_MAX + 1] = {}; ++ struct nlattr *nla_child_resource; ++ struct nlattr *nla_resources; ++ bool top = false; ++ int err; ++ ++ if (!resource) { ++ nla_resources = nl; ++ top = true; ++ goto out; ++ } ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_resource); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ err = resource_parse(ctx, resource, nla_resource); ++ if (err) ++ return err; ++ ++ resource->parent = parent_resource; ++ if (!nla_resource[DEVLINK_ATTR_RESOURCE_LIST]) ++ return 0; ++ ++ resource->size_valid = !!mnl_attr_get_u8(nla_resource[DEVLINK_ATTR_RESOURCE_SIZE_VALID]); ++ nla_resources = nla_resource[DEVLINK_ATTR_RESOURCE_LIST]; ++out: ++ mnl_attr_for_each_nested(nla_child_resource, nla_resources) { ++ struct resource *child_resource; ++ struct list_head *list; ++ ++ child_resource = resource_alloc(); ++ if (!child_resource) ++ return -ENOMEM; ++ ++ if (top) ++ list = &ctx->resources->resource_list; ++ else ++ list = &resource->resource_list; ++ ++ list_add_tail(&child_resource->list, list); ++ err = resource_get(ctx, child_resource, resource, ++ nla_child_resource); ++ if (err) ++ return err; ++ } ++ ++ return 0; ++} ++ ++static const char *resource_unit_str_get(enum devlink_resource_unit unit) ++{ ++ switch (unit) { ++ case DEVLINK_RESOURCE_UNIT_ENTRY: return "entry"; ++ default: return ""; ++ } ++} ++ ++static void resource_show(struct resource *resource, ++ struct resource_ctx *ctx) ++{ ++ struct resource *child_resource; ++ struct dl *dl = ctx->dl; ++ ++ pr_out_str(dl, "name", resource->name); ++ if (dl->verbose) ++ resource_path_print(dl, ctx->resources, resource->id); ++ pr_out_uint(dl, "size", resource->size); ++ if (resource->size != resource->size_new) ++ pr_out_uint(dl, "size_new", resource->size_new); ++ if (resource->occ_valid) ++ pr_out_uint(dl, "occ", resource->size_occ); ++ pr_out_str(dl, "unit", resource_unit_str_get(resource->unit)); ++ ++ if (resource->size_min != resource->size_max) { ++ pr_out_uint(dl, "size_min", resource->size_min); ++ pr_out_uint(dl, "size_max", resource->size_max); ++ pr_out_uint(dl, "size_gran", resource->size_gran); ++ } ++ ++ if (list_empty(&resource->resource_list)) ++ return; ++ ++ if (ctx->pending_change) ++ pr_out_str(dl, "size_valid", resource->size_valid ? ++ "true" : "false"); ++ pr_out_array_start(dl, "resources"); ++ list_for_each_entry(child_resource, &resource->resource_list, list) { ++ pr_out_entry_start(dl); ++ resource_show(child_resource, ctx); ++ pr_out_entry_end(dl); ++ } ++ pr_out_array_end(dl); ++} ++ ++static void ++resources_show(struct resource_ctx *ctx, struct nlattr **tb) ++{ ++ struct resources *resources = ctx->resources; ++ struct resource *resource; ++ ++ list_for_each_entry(resource, &resources->resource_list, list) { ++ pr_out_handle_start_arr(ctx->dl, tb); ++ resource_show(resource, ctx); ++ pr_out_handle_end(ctx->dl); ++ } ++} ++ ++static int resources_get(struct resource_ctx *ctx, struct nlattr **tb) ++{ ++ return resource_get(ctx, NULL, NULL, tb[DEVLINK_ATTR_RESOURCE_LIST]); ++} ++ ++static int cmd_resource_dump_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct resource_ctx *ctx = data; ++ struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; ++ struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); ++ int err; ++ ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_RESOURCE_LIST]) ++ return MNL_CB_ERROR; ++ ++ err = resources_get(ctx, tb); ++ if (err) { ++ ctx->err = err; ++ return MNL_CB_ERROR; ++ } ++ ++ if (ctx->print_resources) ++ resources_show(ctx, tb); ++ ++ return MNL_CB_OK; ++} ++ ++static int cmd_resource_show(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ struct resource_ctx ctx = {}; ++ int err; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RESOURCE_DUMP, ++ NLM_F_REQUEST | NLM_F_ACK); ++ ++ err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0); ++ if (err) ++ return err; ++ ++ err = resource_ctx_init(&ctx, dl); ++ if (err) ++ return err; ++ ++ ctx.print_resources = true; ++ pr_out_section_start(dl, "resources"); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_resource_dump_cb, &ctx); ++ pr_out_section_end(dl); ++ resource_ctx_fini(&ctx); ++ return err; ++} ++ ++static void cmd_resource_help(void) ++{ ++ pr_err("Usage: devlink resource show DEV\n" ++ " devlink resource set DEV path PATH size SIZE\n"); ++} ++ ++static struct resource * ++resource_find_by_name(struct list_head *list, char *name) ++{ ++ struct resource *resource; ++ ++ list_for_each_entry(resource, list, list) { ++ if (!strcmp(resource->name, name)) ++ return resource; ++ } ++ return NULL; ++} ++ ++static int ++resource_path_parse(struct resource_ctx *ctx, const char *resource_path, ++ uint32_t *p_resource_id, bool *p_resource_valid) ++{ ++ struct resource *resource; ++ uint32_t resource_id = 0; ++ char *resource_path_dup; ++ struct list_head *list; ++ const char del[] = "/"; ++ char *resource_name; ++ ++ resource_path_dup = strdup(resource_path); ++ list = &ctx->resources->resource_list; ++ resource_name = strtok(resource_path_dup, del); ++ while (resource_name != NULL) { ++ resource = resource_find_by_name(list, resource_name); ++ if (!resource) ++ goto err_resource_lookup; ++ ++ list = &resource->resource_list; ++ resource_name = strtok(NULL, del); ++ resource_id = resource->id; ++ } ++ free(resource_path_dup); ++ *p_resource_valid = true; ++ *p_resource_id = resource_id; ++ return 0; ++ ++err_resource_lookup: ++ free(resource_path_dup); ++ return -EINVAL; ++} ++ ++static int cmd_resource_set(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ struct resource_ctx ctx = {}; ++ int err; ++ ++ err = resource_ctx_init(&ctx, dl); ++ if (err) ++ return err; ++ ++ ctx.print_resources = false; ++ err = dl_argv_parse(dl, DL_OPT_HANDLE | DL_OPT_RESOURCE_PATH | ++ DL_OPT_RESOURCE_SIZE, 0); ++ if (err) ++ goto out; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RESOURCE_DUMP, ++ NLM_F_REQUEST); ++ dl_opts_put(nlh, dl); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_resource_dump_cb, &ctx); ++ if (err) { ++ pr_err("error getting resources %s\n", strerror(ctx.err)); ++ goto out; ++ } ++ ++ err = resource_path_parse(&ctx, dl->opts.resource_path, ++ &dl->opts.resource_id, ++ &dl->opts.resource_id_valid); ++ if (err) { ++ pr_err("error parsing resource path %s\n", strerror(err)); ++ goto out; ++ } ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RESOURCE_SET, ++ NLM_F_REQUEST | NLM_F_ACK); ++ ++ dl_opts_put(nlh, dl); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL); ++out: ++ resource_ctx_fini(&ctx); ++ return err; ++} ++ ++static int cmd_resource(struct dl *dl) ++{ ++ if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { ++ cmd_resource_help(); ++ return 0; ++ } else if (dl_argv_match(dl, "show")) { ++ dl_arg_inc(dl); ++ return cmd_resource_show(dl); ++ } else if (dl_argv_match(dl, "set")) { ++ dl_arg_inc(dl); ++ return cmd_resource_set(dl); ++ } ++ pr_err("Command \"%s\" not found\n", dl_argv(dl)); ++ return -ENOENT; ++} ++ + static void help(void) + { + pr_err("Usage: devlink [ OPTIONS ] OBJECT { COMMAND | help }\n" +- "where OBJECT := { dev | port | sb | monitor | dpipe }\n" ++ "where OBJECT := { dev | port | sb | monitor | dpipe | resource }\n" + " OPTIONS := { -V[ersion] | -n[no-nice-names] | -j[json] | -p[pretty] | -v[verbose] }\n"); + } + +@@ -3644,6 +4129,9 @@ static int dl_cmd(struct dl *dl) + } else if (dl_argv_match(dl, "dpipe")) { + dl_arg_inc(dl); + return cmd_dpipe(dl); ++ } else if (dl_argv_match(dl, "resource")) { ++ dl_arg_inc(dl); ++ return cmd_resource(dl); + } + pr_err("Object \"%s\" not found\n", dl_argv(dl)); + return -ENOENT; +diff --git a/include/list.h b/include/list.h +index 5b529dc6e5211..b2adf55578449 100644 +--- a/include/list.h ++++ b/include/list.h +@@ -107,6 +107,11 @@ static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) + n->pprev = &h->first; + } + ++static inline int list_empty(const struct list_head *head) ++{ ++ return head->next == head; ++} ++ + #define hlist_for_each(pos, head) \ + for (pos = (head)->first; pos ; pos = pos->next) + +-- +2.20.1 + diff --git a/SOURCES/0057-devlink-Add-support-for-hot-reload.patch b/SOURCES/0057-devlink-Add-support-for-hot-reload.patch new file mode 100644 index 0000000..9c804b6 --- /dev/null +++ b/SOURCES/0057-devlink-Add-support-for-hot-reload.patch @@ -0,0 +1,81 @@ +From ceaa3a5ecffe0c558c990be6c4ba682be5ce85e8 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 11:40:57 +0100 +Subject: [PATCH] devlink: Add support for hot reload + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731 +Upstream Status: iproute2.git commit 06dd94f952e50 + +commit 06dd94f952e50edeffe5ea8b7b95b5cd562b9365 +Author: Arkadi Sharshevsky +Date: Wed Feb 14 10:55:19 2018 +0200 + + devlink: Add support for hot reload + + Add support for hot reload. It should be used in order for resource + updates to take place. + + Signed-off-by: Arkadi Sharshevsky + Acked-by: Jiri Pirko + Signed-off-by: Stephen Hemminger +--- + devlink/devlink.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index 7f47b79450094..fc3939e564bc8 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -1163,6 +1163,7 @@ static void cmd_dev_help(void) + pr_err(" [ inline-mode { none | link | network | transport } ]\n"); + pr_err(" [ encap { disable | enable } ]\n"); + pr_err(" devlink dev eswitch show DEV\n"); ++ pr_err(" devlink dev reload DEV\n"); + } + + static bool cmp_arr_last_handle(struct dl *dl, const char *bus_name, +@@ -1602,6 +1603,31 @@ static int cmd_dev_show(struct dl *dl) + return err; + } + ++static void cmd_dev_reload_help(void) ++{ ++ pr_err("Usage: devlink dev reload [ DEV ]\n"); ++} ++ ++static int cmd_dev_reload(struct dl *dl) ++{ ++ struct nlmsghdr *nlh; ++ int err; ++ ++ if (dl_argv_match(dl, "help") || dl_no_arg(dl)) { ++ cmd_dev_reload_help(); ++ return 0; ++ } ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RELOAD, ++ NLM_F_REQUEST | NLM_F_ACK); ++ ++ err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0); ++ if (err) ++ return err; ++ ++ return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL); ++} ++ + static int cmd_dev(struct dl *dl) + { + if (dl_argv_match(dl, "help")) { +@@ -1614,6 +1640,9 @@ static int cmd_dev(struct dl *dl) + } else if (dl_argv_match(dl, "eswitch")) { + dl_arg_inc(dl); + return cmd_dev_eswitch(dl); ++ } else if (dl_argv_match(dl, "reload")) { ++ dl_arg_inc(dl); ++ return cmd_dev_reload(dl); + } + pr_err("Command \"%s\" not found\n", dl_argv(dl)); + return -ENOENT; +-- +2.20.1 + diff --git a/SOURCES/0058-devlink-Update-man-pages-and-add-resource-man.patch b/SOURCES/0058-devlink-Update-man-pages-and-add-resource-man.patch new file mode 100644 index 0000000..4fe2d73 --- /dev/null +++ b/SOURCES/0058-devlink-Update-man-pages-and-add-resource-man.patch @@ -0,0 +1,165 @@ +From edf1a3765c440bdd6a15ca7dd4d52a2264a67f69 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 11:40:57 +0100 +Subject: [PATCH] devlink: Update man pages and add resource man + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731 +Upstream Status: iproute2.git commit 58b48c5d75e29 + +commit 58b48c5d75e2960dfcd947975911a170ae765975 +Author: Arkadi Sharshevsky +Date: Wed Feb 14 10:55:22 2018 +0200 + + devlink: Update man pages and add resource man + + Add resource man, and update dev manual for reload command. + + Signed-off-by: Arkadi Sharshevsky + Acked-by: Jiri Pirko + Signed-off-by: Stephen Hemminger +--- + man/man8/devlink-dev.8 | 15 +++++++ + man/man8/devlink-resource.8 | 78 +++++++++++++++++++++++++++++++++++++ + man/man8/devlink.8 | 1 + + 3 files changed, 94 insertions(+) + create mode 100644 man/man8/devlink-resource.8 + +diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8 +index b074d57a19369..7c749ddabaeeb 100644 +--- a/man/man8/devlink-dev.8 ++++ b/man/man8/devlink-dev.8 +@@ -42,6 +42,10 @@ devlink-dev \- devlink device configuration + .BR "devlink dev eswitch show" + .IR DEV + ++.ti -8 ++.BR "devlink dev reload" ++.IR DEV ++ + .SH "DESCRIPTION" + .SS devlink dev show - display devlink device attributes + +@@ -94,6 +98,12 @@ Set eswitch encapsulation support + .I enable + - Enable encapsulation support + ++.SS devlink dev reload - perform hot reload of the driver. ++ ++.PP ++.I "DEV" ++- Specifies the devlink device to reload. ++ + .SH "EXAMPLES" + .PP + devlink dev show +@@ -114,6 +124,11 @@ Shows the eswitch mode of specified devlink device. + devlink dev eswitch set pci/0000:01:00.0 mode switchdev + .RS 4 + Sets the eswitch mode of specified devlink device to switchdev. ++.RE ++.PP ++devlink dev reload pci/0000:01:00.0 ++.RS 4 ++Performs hot reload of specified devlink device. + + .SH SEE ALSO + .BR devlink (8), +diff --git a/man/man8/devlink-resource.8 b/man/man8/devlink-resource.8 +new file mode 100644 +index 0000000000000..b8f788060427b +--- /dev/null ++++ b/man/man8/devlink-resource.8 +@@ -0,0 +1,78 @@ ++.TH DEVLINK\-RESOURCE 8 "11 Feb 2018" "iproute2" "Linux" ++.SH NAME ++devlink-resource \- devlink device resource configuration ++.SH SYNOPSIS ++.sp ++.ad l ++.in +8 ++.ti -8 ++.B devlink ++.RI "[ " OPTIONS " ]" ++.B resource ++.RI " { " COMMAND " | " ++.BR help " }" ++.sp ++ ++.ti -8 ++.IR OPTIONS " := { " ++\fB\-v\fR[\fIerbose\fR] } ++ ++.ti -8 ++.B devlink resource show ++.IR DEV ++ ++.ti -8 ++.B devlink resource help ++ ++.ti -8 ++.BR "devlink resource set" ++.IR DEV ++.BI path " RESOURCE_PATH" ++.BI size " RESOURCE_SIZE" ++ ++.SH "DESCRIPTION" ++.SS devlink resource show - display devlink device's resosources ++ ++.PP ++.I "DEV" ++- specifies the devlink device to show. ++ ++.in +4 ++Format is: ++.in +2 ++BUS_NAME/BUS_ADDRESS ++ ++.SS devlink resource set - sets resource size of specific resource ++ ++.PP ++.I "DEV" ++- specifies the devlink device. ++ ++.TP ++.BI path " RESOURCE_PATH" ++Resource's path. ++ ++.TP ++.BI size " RESOURCE_SIZE" ++The new resource's size. ++ ++.SH "EXAMPLES" ++.PP ++devlink resource show pci/0000:01:00.0 ++.RS 4 ++Shows the resources of the specified devlink device. ++.RE ++.PP ++devlink resource set pci/0000:01:00.0 /kvd/linear 98304 ++.RS 4 ++Sets the size of the specified resource for the specified devlink device. ++ ++.SH SEE ALSO ++.BR devlink (8), ++.BR devlink-port (8), ++.BR devlink-sb (8), ++.BR devlink-monitor (8), ++.br ++ ++.SH AUTHOR ++Arkadi Sharshevsky +diff --git a/man/man8/devlink.8 b/man/man8/devlink.8 +index a480766cbbdbe..6bf398274a612 100644 +--- a/man/man8/devlink.8 ++++ b/man/man8/devlink.8 +@@ -87,6 +87,7 @@ Exit status is 0 if command was successful or a positive integer upon failure. + .BR devlink-port (8), + .BR devlink-monitor (8), + .BR devlink-sb (8), ++.BR devlink-resource (8), + .br + + .SH REPORTING BUGS +-- +2.20.1 + diff --git a/SOURCES/0059-devlink-Add-param-command-support.patch b/SOURCES/0059-devlink-Add-param-command-support.patch new file mode 100644 index 0000000..e9a174d --- /dev/null +++ b/SOURCES/0059-devlink-Add-param-command-support.patch @@ -0,0 +1,704 @@ +From 8bd31b6df5fd1da612accbb4d131b3c3bcded079 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 11:40:58 +0100 +Subject: [PATCH] devlink: Add param command support + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1644731 +Upstream Status: iproute2.git commit 13925ae9eb38b +Conflicts: context change due to missing commit 844646a52837f + ("devlink: Change empty line indication with indentations") + +commit 13925ae9eb38b99107be1d3fe21a1b73cf40bd97 +Author: Moshe Shemesh +Date: Wed Jul 4 17:12:06 2018 +0300 + + devlink: Add param command support + + Add support for configuration parameters set and show. + Each parameter can be either generic or driver-specific. + The user can retrieve data on these configuration parameters by devlink + param show command and can set new value to a configuration parameter + by devlink param set command. + The configuration parameters can be set in different configuration + modes: + runtime - set while driver is running, no reset required. + driverinit - applied while driver initializes, requires restart + driver by devlink reload command. + permanent - written to device's non-volatile memory, hard reset + required to apply. + + New commands added: + devlink dev param show [DEV name PARAMETER] + devlink dev param set DEV name PARAMETER value VALUE + cmode { permanent | driverinit | runtime } + + Signed-off-by: Moshe Shemesh + Signed-off-by: Jiri Pirko + Signed-off-by: David Ahern +--- + devlink/devlink.c | 454 +++++++++++++++++++++++++++++++++++++++++ + man/man8/devlink-dev.8 | 57 ++++++ + 2 files changed, 511 insertions(+) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index fc3939e564bc8..92e78c9c8d9f6 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -33,6 +33,10 @@ + #define ESWITCH_INLINE_MODE_NETWORK "network" + #define ESWITCH_INLINE_MODE_TRANSPORT "transport" + ++#define PARAM_CMODE_RUNTIME_STR "runtime" ++#define PARAM_CMODE_DRIVERINIT_STR "driverinit" ++#define PARAM_CMODE_PERMANENT_STR "permanent" ++ + #define pr_err(args...) fprintf(stderr, ##args) + #define pr_out(args...) \ + do { \ +@@ -179,6 +183,9 @@ static void ifname_map_free(struct ifname_map *ifname_map) + #define DL_OPT_ESWITCH_ENCAP_MODE BIT(15) + #define DL_OPT_RESOURCE_PATH BIT(16) + #define DL_OPT_RESOURCE_SIZE BIT(17) ++#define DL_OPT_PARAM_NAME BIT(18) ++#define DL_OPT_PARAM_VALUE BIT(19) ++#define DL_OPT_PARAM_CMODE BIT(20) + + struct dl_opts { + uint32_t present; /* flags of present items */ +@@ -203,6 +210,9 @@ struct dl_opts { + uint32_t resource_size; + uint32_t resource_id; + bool resource_id_valid; ++ const char *param_name; ++ const char *param_value; ++ enum devlink_param_cmode cmode; + }; + + struct dl { +@@ -340,6 +350,12 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = { + [DEVLINK_ATTR_DPIPE_FIELD_ID] = MNL_TYPE_U32, + [DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = MNL_TYPE_U32, + [DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = MNL_TYPE_U32, ++ [DEVLINK_ATTR_PARAM] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_PARAM_NAME] = MNL_TYPE_STRING, ++ [DEVLINK_ATTR_PARAM_TYPE] = MNL_TYPE_U8, ++ [DEVLINK_ATTR_PARAM_VALUES_LIST] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_PARAM_VALUE] = MNL_TYPE_NESTED, ++ [DEVLINK_ATTR_PARAM_VALUE_CMODE] = MNL_TYPE_U8, + }; + + static int attr_cb(const struct nlattr *attr, void *data) +@@ -506,6 +522,34 @@ static int strtouint16_t(const char *str, uint16_t *p_val) + return 0; + } + ++static int strtouint8_t(const char *str, uint8_t *p_val) ++{ ++ char *endptr; ++ unsigned long int val; ++ ++ val = strtoul(str, &endptr, 10); ++ if (endptr == str || *endptr != '\0') ++ return -EINVAL; ++ if (val > UCHAR_MAX) ++ return -ERANGE; ++ *p_val = val; ++ return 0; ++} ++ ++static int strtobool(const char *str, bool *p_val) ++{ ++ bool val; ++ ++ if (!strcmp(str, "true") || !strcmp(str, "1")) ++ val = true; ++ else if (!strcmp(str, "false") || !strcmp(str, "0")) ++ val = false; ++ else ++ return -EINVAL; ++ *p_val = val; ++ return 0; ++} ++ + static int __dl_argv_handle(char *str, char **p_bus_name, char **p_dev_name) + { + strslashrsplit(str, p_bus_name, p_dev_name); +@@ -776,6 +820,22 @@ static int eswitch_encap_mode_get(const char *typestr, bool *p_mode) + return 0; + } + ++static int param_cmode_get(const char *cmodestr, ++ enum devlink_param_cmode *cmode) ++{ ++ if (strcmp(cmodestr, PARAM_CMODE_RUNTIME_STR) == 0) { ++ *cmode = DEVLINK_PARAM_CMODE_RUNTIME; ++ } else if (strcmp(cmodestr, PARAM_CMODE_DRIVERINIT_STR) == 0) { ++ *cmode = DEVLINK_PARAM_CMODE_DRIVERINIT; ++ } else if (strcmp(cmodestr, PARAM_CMODE_PERMANENT_STR) == 0) { ++ *cmode = DEVLINK_PARAM_CMODE_PERMANENT; ++ } else { ++ pr_err("Unknown configuration mode \"%s\"\n", cmodestr); ++ return -EINVAL; ++ } ++ return 0; ++} ++ + static int dl_argv_parse(struct dl *dl, uint32_t o_required, + uint32_t o_optional) + { +@@ -957,6 +1017,32 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, + if (err) + return err; + o_found |= DL_OPT_RESOURCE_SIZE; ++ } else if (dl_argv_match(dl, "name") && ++ (o_all & DL_OPT_PARAM_NAME)) { ++ dl_arg_inc(dl); ++ err = dl_argv_str(dl, &opts->param_name); ++ if (err) ++ return err; ++ o_found |= DL_OPT_PARAM_NAME; ++ } else if (dl_argv_match(dl, "value") && ++ (o_all & DL_OPT_PARAM_VALUE)) { ++ dl_arg_inc(dl); ++ err = dl_argv_str(dl, &opts->param_value); ++ if (err) ++ return err; ++ o_found |= DL_OPT_PARAM_VALUE; ++ } else if (dl_argv_match(dl, "cmode") && ++ (o_all & DL_OPT_PARAM_CMODE)) { ++ const char *cmodestr; ++ ++ dl_arg_inc(dl); ++ err = dl_argv_str(dl, &cmodestr); ++ if (err) ++ return err; ++ err = param_cmode_get(cmodestr, &opts->cmode); ++ if (err) ++ return err; ++ o_found |= DL_OPT_PARAM_CMODE; + } else { + pr_err("Unknown option \"%s\"\n", dl_argv(dl)); + return -EINVAL; +@@ -1041,6 +1127,24 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, + return -EINVAL; + } + ++ if ((o_required & DL_OPT_PARAM_NAME) && ++ !(o_found & DL_OPT_PARAM_NAME)) { ++ pr_err("Parameter name expected.\n"); ++ return -EINVAL; ++ } ++ ++ if ((o_required & DL_OPT_PARAM_VALUE) && ++ !(o_found & DL_OPT_PARAM_VALUE)) { ++ pr_err("Value to set expected.\n"); ++ return -EINVAL; ++ } ++ ++ if ((o_required & DL_OPT_PARAM_CMODE) && ++ !(o_found & DL_OPT_PARAM_CMODE)) { ++ pr_err("Configuration mode expected.\n"); ++ return -EINVAL; ++ } ++ + return 0; + } + +@@ -1105,6 +1209,12 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl) + if (opts->present & DL_OPT_RESOURCE_SIZE) + mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE, + opts->resource_size); ++ if (opts->present & DL_OPT_PARAM_NAME) ++ mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_NAME, ++ opts->param_name); ++ if (opts->present & DL_OPT_PARAM_CMODE) ++ mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_CMODE, ++ opts->cmode); + } + + static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl, +@@ -1163,6 +1273,8 @@ static void cmd_dev_help(void) + pr_err(" [ inline-mode { none | link | network | transport } ]\n"); + pr_err(" [ encap { disable | enable } ]\n"); + pr_err(" devlink dev eswitch show DEV\n"); ++ pr_err(" devlink dev param set DEV name PARAMETER value VALUE cmode { permanent | driverinit | runtime }\n"); ++ pr_err(" devlink dev param show [DEV name PARAMETER]\n"); + pr_err(" devlink dev reload DEV\n"); + } + +@@ -1377,6 +1489,14 @@ static void pr_out_str(struct dl *dl, const char *name, const char *val) + } + } + ++static void pr_out_bool(struct dl *dl, const char *name, bool val) ++{ ++ if (val) ++ pr_out_str(dl, name, "true"); ++ else ++ pr_out_str(dl, name, "false"); ++} ++ + static void pr_out_uint(struct dl *dl, const char *name, unsigned int val) + { + if (dl->json_output) { +@@ -1449,6 +1569,19 @@ static void pr_out_entry_end(struct dl *dl) + __pr_out_newline(); + } + ++static const char *param_cmode_name(uint8_t cmode) ++{ ++ switch (cmode) { ++ case DEVLINK_PARAM_CMODE_RUNTIME: ++ return PARAM_CMODE_RUNTIME_STR; ++ case DEVLINK_PARAM_CMODE_DRIVERINIT: ++ return PARAM_CMODE_DRIVERINIT_STR; ++ case DEVLINK_PARAM_CMODE_PERMANENT: ++ return PARAM_CMODE_PERMANENT_STR; ++ default: return ""; ++ } ++} ++ + static const char *eswitch_mode_name(uint32_t mode) + { + switch (mode) { +@@ -1567,6 +1700,304 @@ static int cmd_dev_eswitch(struct dl *dl) + return -ENOENT; + } + ++static void pr_out_param_value(struct dl *dl, int nla_type, struct nlattr *nl) ++{ ++ struct nlattr *nla_value[DEVLINK_ATTR_MAX + 1] = {}; ++ struct nlattr *val_attr; ++ int err; ++ ++ err = mnl_attr_parse_nested(nl, attr_cb, nla_value); ++ if (err != MNL_CB_OK) ++ return; ++ ++ if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] || ++ (nla_type != MNL_TYPE_FLAG && ++ !nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA])) ++ return; ++ ++ pr_out_str(dl, "cmode", ++ param_cmode_name(mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE]))); ++ val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]; ++ ++ switch (nla_type) { ++ case MNL_TYPE_U8: ++ pr_out_uint(dl, "value", mnl_attr_get_u8(val_attr)); ++ break; ++ case MNL_TYPE_U16: ++ pr_out_uint(dl, "value", mnl_attr_get_u16(val_attr)); ++ break; ++ case MNL_TYPE_U32: ++ pr_out_uint(dl, "value", mnl_attr_get_u32(val_attr)); ++ break; ++ case MNL_TYPE_STRING: ++ pr_out_str(dl, "value", mnl_attr_get_str(val_attr)); ++ break; ++ case MNL_TYPE_FLAG: ++ pr_out_bool(dl, "value", val_attr ? true : false); ++ break; ++ } ++} ++ ++static void pr_out_param(struct dl *dl, struct nlattr **tb, bool array) ++{ ++ struct nlattr *nla_param[DEVLINK_ATTR_MAX + 1] = {}; ++ struct nlattr *param_value_attr; ++ int nla_type; ++ int err; ++ ++ err = mnl_attr_parse_nested(tb[DEVLINK_ATTR_PARAM], attr_cb, nla_param); ++ if (err != MNL_CB_OK) ++ return; ++ if (!nla_param[DEVLINK_ATTR_PARAM_NAME] || ++ !nla_param[DEVLINK_ATTR_PARAM_TYPE] || ++ !nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) ++ return; ++ ++ if (array) ++ pr_out_handle_start_arr(dl, tb); ++ else ++ __pr_out_handle_start(dl, tb, true, false); ++ ++ nla_type = mnl_attr_get_u8(nla_param[DEVLINK_ATTR_PARAM_TYPE]); ++ ++ pr_out_str(dl, "name", ++ mnl_attr_get_str(nla_param[DEVLINK_ATTR_PARAM_NAME])); ++ ++ if (!nla_param[DEVLINK_ATTR_PARAM_GENERIC]) ++ pr_out_str(dl, "type", "driver-specific"); ++ else ++ pr_out_str(dl, "type", "generic"); ++ ++ pr_out_array_start(dl, "values"); ++ mnl_attr_for_each_nested(param_value_attr, ++ nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) { ++ pr_out_entry_start(dl); ++ pr_out_param_value(dl, nla_type, param_value_attr); ++ pr_out_entry_end(dl); ++ } ++ pr_out_array_end(dl); ++ pr_out_handle_end(dl); ++} ++ ++static int cmd_dev_param_show_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); ++ struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; ++ struct dl *dl = data; ++ ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_PARAM]) ++ return MNL_CB_ERROR; ++ pr_out_param(dl, tb, true); ++ return MNL_CB_OK; ++} ++ ++struct param_ctx { ++ struct dl *dl; ++ int nla_type; ++ union { ++ uint8_t vu8; ++ uint16_t vu16; ++ uint32_t vu32; ++ const char *vstr; ++ bool vbool; ++ } value; ++}; ++ ++static int cmd_dev_param_set_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh); ++ struct nlattr *nla_param[DEVLINK_ATTR_MAX + 1] = {}; ++ struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; ++ struct nlattr *param_value_attr; ++ enum devlink_param_cmode cmode; ++ struct param_ctx *ctx = data; ++ struct dl *dl = ctx->dl; ++ int nla_type; ++ int err; ++ ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_PARAM]) ++ return MNL_CB_ERROR; ++ ++ err = mnl_attr_parse_nested(tb[DEVLINK_ATTR_PARAM], attr_cb, nla_param); ++ if (err != MNL_CB_OK) ++ return MNL_CB_ERROR; ++ ++ if (!nla_param[DEVLINK_ATTR_PARAM_TYPE] || ++ !nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) ++ return MNL_CB_ERROR; ++ ++ nla_type = mnl_attr_get_u8(nla_param[DEVLINK_ATTR_PARAM_TYPE]); ++ mnl_attr_for_each_nested(param_value_attr, ++ nla_param[DEVLINK_ATTR_PARAM_VALUES_LIST]) { ++ struct nlattr *nla_value[DEVLINK_ATTR_MAX + 1] = {}; ++ struct nlattr *val_attr; ++ ++ err = mnl_attr_parse_nested(param_value_attr, ++ attr_cb, nla_value); ++ if (err != MNL_CB_OK) ++ return MNL_CB_ERROR; ++ ++ if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] || ++ (nla_type != MNL_TYPE_FLAG && ++ !nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA])) ++ return MNL_CB_ERROR; ++ ++ cmode = mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE]); ++ if (cmode == dl->opts.cmode) { ++ val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]; ++ switch (nla_type) { ++ case MNL_TYPE_U8: ++ ctx->value.vu8 = mnl_attr_get_u8(val_attr); ++ break; ++ case MNL_TYPE_U16: ++ ctx->value.vu16 = mnl_attr_get_u16(val_attr); ++ break; ++ case MNL_TYPE_U32: ++ ctx->value.vu32 = mnl_attr_get_u32(val_attr); ++ break; ++ case MNL_TYPE_STRING: ++ ctx->value.vstr = mnl_attr_get_str(val_attr); ++ break; ++ case MNL_TYPE_FLAG: ++ ctx->value.vbool = val_attr ? true : false; ++ break; ++ } ++ break; ++ } ++ } ++ ctx->nla_type = nla_type; ++ return MNL_CB_OK; ++} ++ ++static int cmd_dev_param_set(struct dl *dl) ++{ ++ struct param_ctx ctx = {}; ++ struct nlmsghdr *nlh; ++ uint32_t val_u32; ++ uint16_t val_u16; ++ uint8_t val_u8; ++ bool val_bool; ++ int err; ++ ++ err = dl_argv_parse(dl, DL_OPT_HANDLE | ++ DL_OPT_PARAM_NAME | ++ DL_OPT_PARAM_VALUE | ++ DL_OPT_PARAM_CMODE, 0); ++ if (err) ++ return err; ++ ++ /* Get value type */ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_PARAM_GET, ++ NLM_F_REQUEST | NLM_F_ACK); ++ dl_opts_put(nlh, dl); ++ ++ ctx.dl = dl; ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dev_param_set_cb, &ctx); ++ if (err) ++ return err; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_PARAM_SET, ++ NLM_F_REQUEST | NLM_F_ACK); ++ dl_opts_put(nlh, dl); ++ ++ mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, ctx.nla_type); ++ switch (ctx.nla_type) { ++ case MNL_TYPE_U8: ++ err = strtouint8_t(dl->opts.param_value, &val_u8); ++ if (err) ++ goto err_param_value_parse; ++ if (val_u8 == ctx.value.vu8) ++ return 0; ++ mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u8); ++ break; ++ case MNL_TYPE_U16: ++ err = strtouint16_t(dl->opts.param_value, &val_u16); ++ if (err) ++ goto err_param_value_parse; ++ if (val_u16 == ctx.value.vu16) ++ return 0; ++ mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u16); ++ break; ++ case MNL_TYPE_U32: ++ err = strtouint32_t(dl->opts.param_value, &val_u32); ++ if (err) ++ goto err_param_value_parse; ++ if (val_u32 == ctx.value.vu32) ++ return 0; ++ mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u32); ++ break; ++ case MNL_TYPE_FLAG: ++ err = strtobool(dl->opts.param_value, &val_bool); ++ if (err) ++ goto err_param_value_parse; ++ if (val_bool == ctx.value.vbool) ++ return 0; ++ if (val_bool) ++ mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, ++ 0, NULL); ++ break; ++ case MNL_TYPE_STRING: ++ mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, ++ dl->opts.param_value); ++ if (!strcmp(dl->opts.param_value, ctx.value.vstr)) ++ return 0; ++ break; ++ default: ++ printf("Value type not supported\n"); ++ return -ENOTSUP; ++ } ++ return _mnlg_socket_sndrcv(dl->nlg, nlh, NULL, NULL); ++ ++err_param_value_parse: ++ pr_err("Value \"%s\" is not a number or not within range\n", ++ dl->opts.param_value); ++ return err; ++} ++ ++static int cmd_dev_param_show(struct dl *dl) ++{ ++ uint16_t flags = NLM_F_REQUEST | NLM_F_ACK; ++ struct nlmsghdr *nlh; ++ int err; ++ ++ if (dl_argc(dl) == 0) ++ flags |= NLM_F_DUMP; ++ ++ nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_PARAM_GET, flags); ++ ++ if (dl_argc(dl) > 0) { ++ err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE | ++ DL_OPT_PARAM_NAME, 0); ++ if (err) ++ return err; ++ } ++ ++ pr_out_section_start(dl, "param"); ++ err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_dev_param_show_cb, dl); ++ pr_out_section_end(dl); ++ return err; ++} ++ ++static int cmd_dev_param(struct dl *dl) ++{ ++ if (dl_argv_match(dl, "help")) { ++ cmd_dev_help(); ++ return 0; ++ } else if (dl_argv_match(dl, "show") || ++ dl_argv_match(dl, "list") || dl_no_arg(dl)) { ++ dl_arg_inc(dl); ++ return cmd_dev_param_show(dl); ++ } else if (dl_argv_match(dl, "set")) { ++ dl_arg_inc(dl); ++ return cmd_dev_param_set(dl); ++ } ++ pr_err("Command \"%s\" not found\n", dl_argv(dl)); ++ return -ENOENT; ++} + static int cmd_dev_show_cb(const struct nlmsghdr *nlh, void *data) + { + struct dl *dl = data; +@@ -1643,6 +2074,9 @@ static int cmd_dev(struct dl *dl) + } else if (dl_argv_match(dl, "reload")) { + dl_arg_inc(dl); + return cmd_dev_reload(dl); ++ } else if (dl_argv_match(dl, "param")) { ++ dl_arg_inc(dl); ++ return cmd_dev_param(dl); + } + pr_err("Command \"%s\" not found\n", dl_argv(dl)); + return -ENOENT; +@@ -2586,6 +3020,10 @@ static const char *cmd_name(uint8_t cmd) + case DEVLINK_CMD_PORT_SET: return "set"; + case DEVLINK_CMD_PORT_NEW: return "net"; + case DEVLINK_CMD_PORT_DEL: return "del"; ++ case DEVLINK_CMD_PARAM_GET: return "get"; ++ case DEVLINK_CMD_PARAM_SET: return "set"; ++ case DEVLINK_CMD_PARAM_NEW: return "new"; ++ case DEVLINK_CMD_PARAM_DEL: return "del"; + default: return ""; + } + } +@@ -2604,6 +3042,11 @@ static const char *cmd_obj(uint8_t cmd) + case DEVLINK_CMD_PORT_NEW: + case DEVLINK_CMD_PORT_DEL: + return "port"; ++ case DEVLINK_CMD_PARAM_GET: ++ case DEVLINK_CMD_PARAM_SET: ++ case DEVLINK_CMD_PARAM_NEW: ++ case DEVLINK_CMD_PARAM_DEL: ++ return "param"; + default: return ""; + } + } +@@ -2660,6 +3103,17 @@ static int cmd_mon_show_cb(const struct nlmsghdr *nlh, void *data) + pr_out_mon_header(genl->cmd); + pr_out_port(dl, tb); + break; ++ case DEVLINK_CMD_PARAM_GET: /* fall through */ ++ case DEVLINK_CMD_PARAM_SET: /* fall through */ ++ case DEVLINK_CMD_PARAM_NEW: /* fall through */ ++ case DEVLINK_CMD_PARAM_DEL: ++ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb); ++ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] || ++ !tb[DEVLINK_ATTR_PARAM]) ++ return MNL_CB_ERROR; ++ pr_out_mon_header(genl->cmd); ++ pr_out_param(dl, tb, false); ++ break; + } + return MNL_CB_OK; + } +diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8 +index 7c749ddabaeeb..d985da172aa05 100644 +--- a/man/man8/devlink-dev.8 ++++ b/man/man8/devlink-dev.8 +@@ -42,6 +42,23 @@ devlink-dev \- devlink device configuration + .BR "devlink dev eswitch show" + .IR DEV + ++.ti -8 ++.BR "devlink dev param set" ++.IR DEV ++.BR name ++.IR PARAMETER ++.BR value ++.IR VALUE ++.BR cmode " { " runtime " | " driverinit " | " permanent " } " ++ ++.ti -8 ++.BR "devlink dev param show" ++.RI "[ " ++.IR DEV ++.BR name ++.IR PARAMETER ++.RI "]" ++ + .ti -8 + .BR "devlink dev reload" + .IR DEV +@@ -98,6 +115,36 @@ Set eswitch encapsulation support + .I enable + - Enable encapsulation support + ++.SS devlink dev param set - set new value to devlink device configuration parameter ++ ++.TP ++.BI name " PARAMETER" ++Specify parameter name to set. ++ ++.TP ++.BI value " VALUE" ++New value to set. ++ ++.TP ++.BR cmode " { " runtime " | " driverinit " | " permanent " } " ++Configuration mode in which the new value is set. ++ ++.I runtime ++- Set new value while driver is running. This configuration mode doesn't require any reset to apply the new value. ++ ++.I driverinit ++- Set new value which will be applied during driver initialization. This configuration mode requires restart driver by devlink reload command to apply the new value. ++ ++.I permanent ++- New value is written to device's non-volatile memory. This configuration mode requires hard reset to apply the new value. ++ ++.SS devlink dev param show - display devlink device supported configuration parameters attributes ++ ++.BR name ++.IR PARAMETER ++Specify parameter name to show. ++If this argument is omitted all parameters supported by devlink devices are listed. ++ + .SS devlink dev reload - perform hot reload of the driver. + + .PP +@@ -126,6 +173,16 @@ devlink dev eswitch set pci/0000:01:00.0 mode switchdev + Sets the eswitch mode of specified devlink device to switchdev. + .RE + .PP ++devlink dev param show pci/0000:01:00.0 name max_macs ++.RS 4 ++Shows the parameter max_macs attributes. ++.RE ++.PP ++devlink dev param set pci/0000:01:00.0 name internal_error_reset value true cmode runtime ++.RS 4 ++Sets the parameter internal_error_reset of specified devlink device to true. ++.RE ++.PP + devlink dev reload pci/0000:01:00.0 + .RS 4 + Performs hot reload of specified devlink device. +-- +2.20.1 + diff --git a/SOURCES/0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch b/SOURCES/0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch new file mode 100644 index 0000000..e1bbaf3 --- /dev/null +++ b/SOURCES/0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch @@ -0,0 +1,38 @@ +From b6de96b49af2751003d67ed4edbf91fd25cee19c Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 11:52:31 +0100 +Subject: [PATCH] man: ip-route.8: ssthresh parameter is NUMBER + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1593628 +Upstream Status: iproute2.git commit 79f49f58aaefe + +commit 79f49f58aaefe11f677c8e072557b834a19f47f3 +Author: Phil Sutter +Date: Thu Mar 22 15:00:38 2018 +0100 + + man: ip-route.8: ssthresh parameter is NUMBER + + Synopsis section was inconsistent with regards to help text and later + description of ssthresh parameter. + + Signed-off-by: Phil Sutter +--- + man/man8/ip-route.8.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in +index d9a547748c017..0616cf01740f3 100644 +--- a/man/man8/ip-route.8.in ++++ b/man/man8/ip-route.8.in +@@ -120,7 +120,7 @@ replace " } " + .B cwnd + .IR NUMBER " ] [ " + .B ssthresh +-.IR REALM " ] [ " ++.IR NUMBER " ] [ " + .B realms + .IR REALM " ] [ " + .B rto_min +-- +2.20.1 + diff --git a/SOURCES/0061-man-tc-vlan.8-Fix-for-incorrect-example.patch b/SOURCES/0061-man-tc-vlan.8-Fix-for-incorrect-example.patch new file mode 100644 index 0000000..b299549 --- /dev/null +++ b/SOURCES/0061-man-tc-vlan.8-Fix-for-incorrect-example.patch @@ -0,0 +1,39 @@ +From 58fe50b2e23c1b77ed93d242545d0f274f819681 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 11:57:41 +0100 +Subject: [PATCH] man: tc-vlan.8: Fix for incorrect example + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1593630 +Upstream Status: iproute2.git commit 8ee38d833ccb1 + +commit 8ee38d833ccb1863f06634e12c5236b0ef7c2d76 +Author: Phil Sutter +Date: Fri Mar 23 21:18:56 2018 +0100 + + man: tc-vlan.8: Fix for incorrect example + + This has to be a second match statement to the same u32 filter, not a + second one (which tc-filter doesn't support at all). + + Signed-off-by: Phil Sutter + Signed-off-by: Stephen Hemminger +--- + man/man8/tc-vlan.8 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/man/man8/tc-vlan.8 b/man/man8/tc-vlan.8 +index af3de1c54e343..a526f66b60b4c 100644 +--- a/man/man8/tc-vlan.8 ++++ b/man/man8/tc-vlan.8 +@@ -103,7 +103,7 @@ into VLAN ID 123: + #tc qdisc add dev eth0 handle ffff: ingress + #tc filter add dev eth0 parent ffff: pref 11 protocol ip \\ + u32 match ip protocol 1 0xff flowid 1:1 \\ +- u32 match ip src 10.0.0.2 flowid 1:1 \\ ++ match ip src 10.0.0.2 flowid 1:1 \\ + action vlan push id 123 + .EE + .RE +-- +2.20.1 + diff --git a/SOURCES/0062-tc-flower-Add-support-for-QinQ.patch b/SOURCES/0062-tc-flower-Add-support-for-QinQ.patch new file mode 100644 index 0000000..f17a40b --- /dev/null +++ b/SOURCES/0062-tc-flower-Add-support-for-QinQ.patch @@ -0,0 +1,271 @@ +From dfbec1b67fc02a5af0d5cc30328b918902f20717 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 12:19:05 +0100 +Subject: [PATCH] tc: flower: Add support for QinQ + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642347 +Upstream Status: iproute2.git commit 1f0a5dfd388cd +Conflicts: context change due to missing commits + 7638ee13c1586 ("tc: flower: support for matching MPLS labels") + e28b88a464c49 ("tc: jsonify flower filter") + also adjust code to use fprintf instead of print_string due to + missing commit d0e720111aad2 ("ip: ipaddress.c: add support for json output") + +commit 1f0a5dfd388cd5c25f6a24247667e04b2346e568 +Author: Jianbo Liu +Date: Sat Jun 30 10:01:33 2018 +0000 + + tc: flower: Add support for QinQ + + To support matching on both outer and inner vlan headers, + we add new cvlan_id/cvlan_prio/cvlan_ethtype for inner vlan header. + + Example: + # tc filter add dev eth0 protocol 802.1ad parent ffff: \ + flower vlan_id 1000 vlan_ethtype 802.1q \ + cvlan_id 100 cvlan_ethtype ipv4 \ + action vlan pop \ + action vlan pop \ + action mirred egress redirect dev eth1 + + # tc filter show dev eth0 ingress + filter protocol 802.1ad pref 1 flower chain 0 + filter protocol 802.1ad pref 1 flower chain 0 handle 0x1 +   vlan_id 1000 +   vlan_ethtype 802.1Q +   cvlan_id 100 +   cvlan_ethtype ip +   eth_type ipv4 +   in_hw + + Signed-off-by: Jianbo Liu + Acked-by: Jiri Pirko + Signed-off-by: David Ahern +--- + man/man8/tc-flower.8 | 23 ++++++++++ + tc/f_flower.c | 99 ++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 110 insertions(+), 12 deletions(-) + +diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8 +index af19708d9649e..387f73f5cd2e9 100644 +--- a/man/man8/tc-flower.8 ++++ b/man/man8/tc-flower.8 +@@ -29,6 +29,12 @@ flower \- flow based traffic control filter + .IR PRIORITY " | " + .BR vlan_ethtype " { " ipv4 " | " ipv6 " | " + .IR ETH_TYPE " } | " ++.B cvlan_id ++.IR VID " | " ++.B cvlan_prio ++.IR PRIORITY " | " ++.BR cvlan_ethtype " { " ipv4 " | " ipv6 " | " ++.IR ETH_TYPE " } | " + .BR ip_proto " { " tcp " | " udp " | " sctp " | " icmp " | " icmpv6 " | " + .IR IP_PROTO " } | " + .B ip_tos +@@ -121,6 +127,23 @@ Match on layer three protocol. + .I VLAN_ETH_TYPE + may be either + .BR ipv4 ", " ipv6 ++or an unsigned 16bit value in hexadecimal format. To match on QinQ packet, it must be 802.1Q or 802.1AD. ++.TP ++.BI cvlan_id " VID" ++Match on QinQ inner vlan tag id. ++.I VID ++is an unsigned 12bit value in decimal format. ++.TP ++.BI cvlan_prio " PRIORITY" ++Match on QinQ inner vlan tag priority. ++.I PRIORITY ++is an unsigned 3bit value in decimal format. ++.TP ++.BI cvlan_ethtype " VLAN_ETH_TYPE" ++Match on QinQ layer three protocol. ++.I VLAN_ETH_TYPE ++may be either ++.BR ipv4 ", " ipv6 + or an unsigned 16bit value in hexadecimal format. + .TP + .BI ip_proto " IP_PROTO" +diff --git a/tc/f_flower.c b/tc/f_flower.c +index 5f5236ca523f8..40dcfbd687a20 100644 +--- a/tc/f_flower.c ++++ b/tc/f_flower.c +@@ -50,6 +50,9 @@ static void explain(void) + " vlan_id VID |\n" + " vlan_prio PRIORITY |\n" + " vlan_ethtype [ ipv4 | ipv6 | ETH-TYPE ] |\n" ++ " cvlan_id VID |\n" ++ " cvlan_prio PRIORITY |\n" ++ " cvlan_ethtype [ ipv4 | ipv6 | ETH-TYPE ] |\n" + " dst_mac MASKED-LLADDR |\n" + " src_mac MASKED-LLADDR |\n" + " ip_proto [tcp | udp | sctp | icmp | icmpv6 | IP-PROTO ] |\n" +@@ -126,15 +129,21 @@ err: + return err; + } + ++static bool eth_type_vlan(__be16 ethertype) ++{ ++ return ethertype == htons(ETH_P_8021Q) || ++ ethertype == htons(ETH_P_8021AD); ++} ++ + static int flower_parse_vlan_eth_type(char *str, __be16 eth_type, int type, + __be16 *p_vlan_eth_type, + struct nlmsghdr *n) + { + __be16 vlan_eth_type; + +- if (eth_type != htons(ETH_P_8021Q)) { +- fprintf(stderr, +- "Can't set \"vlan_ethtype\" if ethertype isn't 802.1Q\n"); ++ if (!eth_type_vlan(eth_type)) { ++ fprintf(stderr, "Can't set \"%s\" if ethertype isn't 802.1Q or 802.1AD\n", ++ type == TCA_FLOWER_KEY_VLAN_ETH_TYPE ? "vlan_ethtype" : "cvlan_ethtype"); + return -1; + } + +@@ -583,6 +592,7 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + struct rtattr *tail; + __be16 eth_type = TC_H_MIN(t->tcm_info); + __be16 vlan_ethtype = 0; ++ __be16 cvlan_ethtype = 0; + __u8 ip_proto = 0xff; + __u32 flags = 0; + __u32 mtf = 0; +@@ -640,9 +650,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + __u16 vid; + + NEXT_ARG(); +- if (eth_type != htons(ETH_P_8021Q)) { +- fprintf(stderr, +- "Can't set \"vlan_id\" if ethertype isn't 802.1Q\n"); ++ if (!eth_type_vlan(eth_type)) { ++ fprintf(stderr, "Can't set \"vlan_id\" if ethertype isn't 802.1Q or 802.1AD\n"); + return -1; + } + ret = get_u16(&vid, *argv, 10); +@@ -655,9 +664,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + __u8 vlan_prio; + + NEXT_ARG(); +- if (eth_type != htons(ETH_P_8021Q)) { +- fprintf(stderr, +- "Can't set \"vlan_prio\" if ethertype isn't 802.1Q\n"); ++ if (!eth_type_vlan(eth_type)) { ++ fprintf(stderr, "Can't set \"vlan_prio\" if ethertype isn't 802.1Q or 802.1AD\n"); + return -1; + } + ret = get_u8(&vlan_prio, *argv, 10); +@@ -674,6 +682,42 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + &vlan_ethtype, n); + if (ret < 0) + return -1; ++ } else if (matches(*argv, "cvlan_id") == 0) { ++ __u16 vid; ++ ++ NEXT_ARG(); ++ if (!eth_type_vlan(vlan_ethtype)) { ++ fprintf(stderr, "Can't set \"cvlan_id\" if inner vlan ethertype isn't 802.1Q or 802.1AD\n"); ++ return -1; ++ } ++ ret = get_u16(&vid, *argv, 10); ++ if (ret < 0 || vid & ~0xfff) { ++ fprintf(stderr, "Illegal \"cvlan_id\"\n"); ++ return -1; ++ } ++ addattr16(n, MAX_MSG, TCA_FLOWER_KEY_CVLAN_ID, vid); ++ } else if (matches(*argv, "cvlan_prio") == 0) { ++ __u8 cvlan_prio; ++ ++ NEXT_ARG(); ++ if (!eth_type_vlan(vlan_ethtype)) { ++ fprintf(stderr, "Can't set \"cvlan_prio\" if inner vlan ethertype isn't 802.1Q or 802.1AD\n"); ++ return -1; ++ } ++ ret = get_u8(&cvlan_prio, *argv, 10); ++ if (ret < 0 || cvlan_prio & ~0x7) { ++ fprintf(stderr, "Illegal \"cvlan_prio\"\n"); ++ return -1; ++ } ++ addattr8(n, MAX_MSG, ++ TCA_FLOWER_KEY_CVLAN_PRIO, cvlan_prio); ++ } else if (matches(*argv, "cvlan_ethtype") == 0) { ++ NEXT_ARG(); ++ ret = flower_parse_vlan_eth_type(*argv, vlan_ethtype, ++ TCA_FLOWER_KEY_CVLAN_ETH_TYPE, ++ &cvlan_ethtype, n); ++ if (ret < 0) ++ return -1; + } else if (matches(*argv, "dst_mac") == 0) { + NEXT_ARG(); + ret = flower_parse_eth_addr(*argv, +@@ -696,7 +740,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + } + } else if (matches(*argv, "ip_proto") == 0) { + NEXT_ARG(); +- ret = flower_parse_ip_proto(*argv, vlan_ethtype ? ++ ret = flower_parse_ip_proto(*argv, cvlan_ethtype ? ++ cvlan_ethtype : vlan_ethtype ? + vlan_ethtype : eth_type, + TCA_FLOWER_KEY_IP_PROTO, + &ip_proto, n); +@@ -726,7 +771,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + } + } else if (matches(*argv, "dst_ip") == 0) { + NEXT_ARG(); +- ret = flower_parse_ip_addr(*argv, vlan_ethtype ? ++ ret = flower_parse_ip_addr(*argv, cvlan_ethtype ? ++ cvlan_ethtype : vlan_ethtype ? + vlan_ethtype : eth_type, + TCA_FLOWER_KEY_IPV4_DST, + TCA_FLOWER_KEY_IPV4_DST_MASK, +@@ -739,7 +785,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + } + } else if (matches(*argv, "src_ip") == 0) { + NEXT_ARG(); +- ret = flower_parse_ip_addr(*argv, vlan_ethtype ? ++ ret = flower_parse_ip_addr(*argv, cvlan_ethtype ? ++ cvlan_ethtype : vlan_ethtype ? + vlan_ethtype : eth_type, + TCA_FLOWER_KEY_IPV4_SRC, + TCA_FLOWER_KEY_IPV4_SRC_MASK, +@@ -1234,6 +1281,34 @@ static int flower_print_opt(struct filter_util *qu, FILE *f, + fprintf(f, "\n vlan_prio %d", rta_getattr_u8(attr)); + } + ++ if (tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE]) { ++ SPRINT_BUF(buf); ++ struct rtattr *attr = tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE]; ++ ++ fprintf(f, "\n vlan_ethtype %s", ++ ll_proto_n2a(rta_getattr_u16(attr), buf, sizeof(buf))); ++ } ++ ++ if (tb[TCA_FLOWER_KEY_CVLAN_ID]) { ++ struct rtattr *attr = tb[TCA_FLOWER_KEY_CVLAN_ID]; ++ ++ fprintf(f, "\n cvlan_id %u", rta_getattr_u16(attr)); ++ } ++ ++ if (tb[TCA_FLOWER_KEY_CVLAN_PRIO]) { ++ struct rtattr *attr = tb[TCA_FLOWER_KEY_CVLAN_PRIO]; ++ ++ fprintf(f, "\n cvlan_prio %d", rta_getattr_u8(attr)); ++ } ++ ++ if (tb[TCA_FLOWER_KEY_CVLAN_ETH_TYPE]) { ++ SPRINT_BUF(buf); ++ struct rtattr *attr = tb[TCA_FLOWER_KEY_CVLAN_ETH_TYPE]; ++ ++ fprintf(f, "\n cvlan_ethtype %s", ++ ll_proto_n2a(rta_getattr_u16(attr), buf, sizeof(buf))); ++ } ++ + flower_print_eth_addr(f, "dst_mac", tb[TCA_FLOWER_KEY_ETH_DST], + tb[TCA_FLOWER_KEY_ETH_DST_MASK]); + flower_print_eth_addr(f, "src_mac", tb[TCA_FLOWER_KEY_ETH_SRC], +-- +2.20.1 + diff --git a/SOURCES/0063-utils-Move-BIT-macro-to-common-header.patch b/SOURCES/0063-utils-Move-BIT-macro-to-common-header.patch new file mode 100644 index 0000000..6bfee1c --- /dev/null +++ b/SOURCES/0063-utils-Move-BIT-macro-to-common-header.patch @@ -0,0 +1,61 @@ +From 42a457a97118379936cdeb20eef1d116e858d4c1 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 13:30:09 +0100 +Subject: [PATCH] utils: Move BIT macro to common header + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914 +Upstream Status: iproute2.git commit afdc119410efe + +commit afdc119410efe2a5e826c660446b1e4e1a72793d +Author: Leon Romanovsky +Date: Sun Aug 20 12:58:21 2017 +0300 + + utils: Move BIT macro to common header + + BIT() macro was implemented and used by devlink for now, but following + patches of rdmatool will reuse the same macro, so put it in common + header file. + + Signed-off-by: Leon Romanovsky +--- + devlink/devlink.c | 2 +- + include/utils.h | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index 92e78c9c8d9f6..2000db81aabb0 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -25,6 +25,7 @@ + #include "list.h" + #include "mnlg.h" + #include "json_writer.h" ++#include "utils.h" + + #define ESWITCH_MODE_LEGACY "legacy" + #define ESWITCH_MODE_SWITCHDEV "switchdev" +@@ -164,7 +165,6 @@ static void ifname_map_free(struct ifname_map *ifname_map) + free(ifname_map); + } + +-#define BIT(nr) (1UL << (nr)) + #define DL_OPT_HANDLE BIT(0) + #define DL_OPT_HANDLEP BIT(1) + #define DL_OPT_PORT_TYPE BIT(2) +diff --git a/include/utils.h b/include/utils.h +index 8c12e1e2a60c2..d707a9dacdb85 100644 +--- a/include/utils.h ++++ b/include/utils.h +@@ -208,6 +208,8 @@ static inline void __jiffies_to_tv(struct timeval *tv, unsigned long jiffies) + int print_timestamp(FILE *fp); + void print_nlmsg_timestamp(FILE *fp, const struct nlmsghdr *n); + ++#define BIT(nr) (1UL << (nr)) ++ + #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + + #define BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)])) +-- +2.20.1 + diff --git a/SOURCES/0064-lib-make-resolve_hosts-variable-common.patch b/SOURCES/0064-lib-make-resolve_hosts-variable-common.patch new file mode 100644 index 0000000..529ffcb --- /dev/null +++ b/SOURCES/0064-lib-make-resolve_hosts-variable-common.patch @@ -0,0 +1,137 @@ +From c74a0bcb2e9c88b2ee166afc08574141a6a288b8 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 13:30:43 +0100 +Subject: [PATCH] lib: make resolve_hosts variable common + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914 +Upstream Status: iproute2.git commit 6648853975332 + +commit 6648853975332e5f34d03a1e2a6e09f5e1742099 +Author: Ivan Vecera +Date: Fri Nov 10 07:20:13 2017 +0100 + + lib: make resolve_hosts variable common + + Any iproute utility that uses any function from lib/utils.c needs + to declare its own resolve_hosts variable instance although it does + not need/use hostname resolving functionality (currently only 'ip' + and 'ss' commands uses this). + The patch declares single common instance of resolve_hosts directly + in utils.c so the existing ones can be removed (the same approach + that is used for timestamp_short). + + Cc: Jiri Pirko + Cc: Arkadi Sharshevsky + Signed-off-by: Ivan Vecera +--- + bridge/bridge.c | 1 - + genl/genl.c | 1 - + ip/ip.c | 1 - + ip/rtmon.c | 1 - + lib/utils.c | 1 + + misc/arpd.c | 2 -- + misc/ss.c | 1 - + tc/tc.c | 1 - + 8 files changed, 1 insertion(+), 8 deletions(-) + +diff --git a/bridge/bridge.c b/bridge/bridge.c +index 5ff038d672ad2..6658cb8fd801d 100644 +--- a/bridge/bridge.c ++++ b/bridge/bridge.c +@@ -18,7 +18,6 @@ + + struct rtnl_handle rth = { .fd = -1 }; + int preferred_family = AF_UNSPEC; +-int resolve_hosts; + int oneline; + int show_stats; + int show_details; +diff --git a/genl/genl.c b/genl/genl.c +index 747074b029a7b..7e4a208d449f2 100644 +--- a/genl/genl.c ++++ b/genl/genl.c +@@ -30,7 +30,6 @@ + int show_stats = 0; + int show_details = 0; + int show_raw = 0; +-int resolve_hosts = 0; + + static void *BODY; + static struct genl_util * genl_list; +diff --git a/ip/ip.c b/ip/ip.c +index 07050b07592ac..0c0ad1bde7cb6 100644 +--- a/ip/ip.c ++++ b/ip/ip.c +@@ -30,7 +30,6 @@ int human_readable; + int use_iec; + int show_stats; + int show_details; +-int resolve_hosts; + int oneline; + int brief; + int timestamp; +diff --git a/ip/rtmon.c b/ip/rtmon.c +index 1c2981f79d3d1..94baa38e3b7cb 100644 +--- a/ip/rtmon.c ++++ b/ip/rtmon.c +@@ -25,7 +25,6 @@ + #include "utils.h" + #include "libnetlink.h" + +-int resolve_hosts; + static int init_phase = 1; + + static void write_stamp(FILE *fp) +diff --git a/lib/utils.c b/lib/utils.c +index 9f55391d3c1ea..fc9c575ba0c7d 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -35,6 +35,7 @@ + #include "utils.h" + #include "namespace.h" + ++int resolve_hosts; + int timestamp_short; + + int get_hex(char c) +diff --git a/misc/arpd.c b/misc/arpd.c +index bfab44544ee1d..c9d86475e5995 100644 +--- a/misc/arpd.c ++++ b/misc/arpd.c +@@ -38,8 +38,6 @@ + #include "utils.h" + #include "rt_names.h" + +-int resolve_hosts; +- + DB *dbase; + char *dbname = "/var/lib/arpd/arpd.db"; + +diff --git a/misc/ss.c b/misc/ss.c +index e92266539e6b5..c0cb33e96d9ec 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -89,7 +89,6 @@ static int security_get_initial_context(char *name, char **context) + } + #endif + +-int resolve_hosts; + int resolve_services = 1; + int preferred_family = AF_UNSPEC; + int show_options; +diff --git a/tc/tc.c b/tc/tc.c +index 360c9f11c235b..11a364fabbbea 100644 +--- a/tc/tc.c ++++ b/tc/tc.c +@@ -39,7 +39,6 @@ int show_graph; + int timestamp; + + int batch_mode; +-int resolve_hosts; + int use_iec; + int force; + int ok; +-- +2.20.1 + diff --git a/SOURCES/0065-json_writer-add-new-json-handlers-null-float-with-fo.patch b/SOURCES/0065-json_writer-add-new-json-handlers-null-float-with-fo.patch new file mode 100644 index 0000000..cb5f307 --- /dev/null +++ b/SOURCES/0065-json_writer-add-new-json-handlers-null-float-with-fo.patch @@ -0,0 +1,161 @@ +From b4b11394d071810d694b66962e8d48cb866af473 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 13:30:53 +0100 +Subject: [PATCH] json_writer: add new json handlers (null, float with format, + lluint, hu) + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914 +Upstream Status: iproute2.git commit 7252f16b2d191 + +commit 7252f16b2d1919b31f0a2ec094dd3516b1e33a55 +Author: Julien Fortin +Date: Thu Aug 17 10:35:50 2017 -0700 + + json_writer: add new json handlers (null, float with format, lluint, hu) + + Signed-off-by: Julien Fortin +--- + include/json_writer.h | 9 +++++++++ + lib/json_writer.c | 44 +++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 49 insertions(+), 4 deletions(-) + +diff --git a/include/json_writer.h b/include/json_writer.h +index ab9a008a67994..1516aafba59df 100644 +--- a/include/json_writer.h ++++ b/include/json_writer.h +@@ -33,20 +33,29 @@ void jsonw_pretty(json_writer_t *self, bool on); + void jsonw_name(json_writer_t *self, const char *name); + + /* Add value */ ++void jsonw_printf(json_writer_t *self, const char *fmt, ...); + void jsonw_string(json_writer_t *self, const char *value); + void jsonw_bool(json_writer_t *self, bool value); + void jsonw_float(json_writer_t *self, double number); ++void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num); + void jsonw_uint(json_writer_t *self, uint64_t number); ++void jsonw_hu(json_writer_t *self, unsigned short number); + void jsonw_int(json_writer_t *self, int64_t number); + void jsonw_null(json_writer_t *self); ++void jsonw_lluint(json_writer_t *self, unsigned long long int num); + + /* Useful Combinations of name and value */ + void jsonw_string_field(json_writer_t *self, const char *prop, const char *val); + void jsonw_bool_field(json_writer_t *self, const char *prop, bool value); + void jsonw_float_field(json_writer_t *self, const char *prop, double num); + void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num); ++void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num); + void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num); + void jsonw_null_field(json_writer_t *self, const char *prop); ++void jsonw_lluint_field(json_writer_t *self, const char *prop, ++ unsigned long long int num); ++void jsonw_float_field_fmt(json_writer_t *self, const char *prop, ++ const char *fmt, double val); + + /* Collections */ + void jsonw_start_object(json_writer_t *self); +diff --git a/lib/json_writer.c b/lib/json_writer.c +index 9fc05e96b605f..6b77d288cce2b 100644 +--- a/lib/json_writer.c ++++ b/lib/json_writer.c +@@ -156,7 +156,7 @@ void jsonw_name(json_writer_t *self, const char *name) + putc(' ', self->out); + } + +-static void jsonw_printf(json_writer_t *self, const char *fmt, ...) ++void jsonw_printf(json_writer_t *self, const char *fmt, ...) + { + va_list ap; + +@@ -199,23 +199,38 @@ void jsonw_bool(json_writer_t *self, bool val) + jsonw_printf(self, "%s", val ? "true" : "false"); + } + +-#ifdef notused + void jsonw_null(json_writer_t *self) + { + jsonw_printf(self, "null"); + } + ++void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num) ++{ ++ jsonw_printf(self, fmt, num); ++} ++ ++#ifdef notused + void jsonw_float(json_writer_t *self, double num) + { + jsonw_printf(self, "%g", num); + } + #endif + ++void jsonw_hu(json_writer_t *self, unsigned short num) ++{ ++ jsonw_printf(self, "%hu", num); ++} ++ + void jsonw_uint(json_writer_t *self, uint64_t num) + { + jsonw_printf(self, "%"PRIu64, num); + } + ++void jsonw_lluint(json_writer_t *self, unsigned long long int num) ++{ ++ jsonw_printf(self, "%llu", num); ++} ++ + void jsonw_int(json_writer_t *self, int64_t num) + { + jsonw_printf(self, "%"PRId64, num); +@@ -242,25 +257,46 @@ void jsonw_float_field(json_writer_t *self, const char *prop, double val) + } + #endif + ++void jsonw_float_field_fmt(json_writer_t *self, ++ const char *prop, ++ const char *fmt, ++ double val) ++{ ++ jsonw_name(self, prop); ++ jsonw_float_fmt(self, fmt, val); ++} ++ + void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num) + { + jsonw_name(self, prop); + jsonw_uint(self, num); + } + ++void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num) ++{ ++ jsonw_name(self, prop); ++ jsonw_hu(self, num); ++} ++ ++void jsonw_lluint_field(json_writer_t *self, ++ const char *prop, ++ unsigned long long int num) ++{ ++ jsonw_name(self, prop); ++ jsonw_lluint(self, num); ++} ++ + void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num) + { + jsonw_name(self, prop); + jsonw_int(self, num); + } + +-#ifdef notused + void jsonw_null_field(json_writer_t *self, const char *prop) + { + jsonw_name(self, prop); + jsonw_null(self); + } +-#endif + + #ifdef TEST + int main(int argc, char **argv) +-- +2.20.1 + diff --git a/SOURCES/0066-rdma-Add-MR-resource-tracking-information.patch b/SOURCES/0066-rdma-Add-MR-resource-tracking-information.patch new file mode 100644 index 0000000..76c39d0 --- /dev/null +++ b/SOURCES/0066-rdma-Add-MR-resource-tracking-information.patch @@ -0,0 +1,90 @@ +From a7f1b85b6838bdab705aef188bb0c86626bc3391 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 13:31:02 +0100 +Subject: [PATCH] rdma: Add MR resource tracking information + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914 +Upstream Status: iproute2.git commit 8958a15c040e0 +Conflicts: remove rdma chunks due to missing files + +commit 8958a15c040e05f4f2c6f3946322202fdb875348 +Author: Steve Wise +Date: Thu Mar 29 09:10:41 2018 -0700 + + rdma: Add MR resource tracking information + + Sample output: + + Without CAP_NET_ADMIN: + + $ rdma resource show mr mrlen 65536 + dev mlx4_0 mrlen 65536 pid 0 comm [nvme_rdma] + dev cxgb4_0 mrlen 65536 pid 0 comm [nvme_rdma] + + With CAP_NET_ADMIN: + + # rdma resource show mr mrlen 65536 + dev mlx4_0 rkey 0x12702 lkey 0x12702 iova 0x85724a000 mrlen 65536 pid 0 comm [nvme_rdma] + dev cxgb4_0 rkey 0x68fe4e9 lkey 0x68fe4e9 iova 0x835b91000 mrlen 65536 pid 0 comm [nvme_rdma] + + Signed-off-by: Steve Wise + Reviewed-by: Leon Romanovsky + Signed-off-by: David Ahern +--- + include/json_writer.h | 2 ++ + lib/json_writer.c | 11 +++++++++++ + 2 files changed, 13 insertions(+) + +diff --git a/include/json_writer.h b/include/json_writer.h +index 1516aafba59df..34f2ccc2f5423 100644 +--- a/include/json_writer.h ++++ b/include/json_writer.h +@@ -39,6 +39,7 @@ void jsonw_bool(json_writer_t *self, bool value); + void jsonw_float(json_writer_t *self, double number); + void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num); + void jsonw_uint(json_writer_t *self, uint64_t number); ++void jsonw_xint(json_writer_t *self, uint64_t number); + void jsonw_hu(json_writer_t *self, unsigned short number); + void jsonw_int(json_writer_t *self, int64_t number); + void jsonw_null(json_writer_t *self); +@@ -49,6 +50,7 @@ void jsonw_string_field(json_writer_t *self, const char *prop, const char *val); + void jsonw_bool_field(json_writer_t *self, const char *prop, bool value); + void jsonw_float_field(json_writer_t *self, const char *prop, double num); + void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num); ++void jsonw_xint_field(json_writer_t *self, const char *prop, uint64_t num); + void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num); + void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num); + void jsonw_null_field(json_writer_t *self, const char *prop); +diff --git a/lib/json_writer.c b/lib/json_writer.c +index 6b77d288cce2b..6aaa6b4170711 100644 +--- a/lib/json_writer.c ++++ b/lib/json_writer.c +@@ -226,6 +226,11 @@ void jsonw_uint(json_writer_t *self, uint64_t num) + jsonw_printf(self, "%"PRIu64, num); + } + ++void jsonw_xint(json_writer_t *self, uint64_t num) ++{ ++ jsonw_printf(self, "%"PRIx64, num); ++} ++ + void jsonw_lluint(json_writer_t *self, unsigned long long int num) + { + jsonw_printf(self, "%llu", num); +@@ -272,6 +277,12 @@ void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num) + jsonw_uint(self, num); + } + ++void jsonw_xint_field(json_writer_t *self, const char *prop, uint64_t num) ++{ ++ jsonw_name(self, prop); ++ jsonw_xint(self, num); ++} ++ + void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num) + { + jsonw_name(self, prop); +-- +2.20.1 + diff --git a/SOURCES/0067-rdma-add-infrastructure-for-RDMA-tool.patch b/SOURCES/0067-rdma-add-infrastructure-for-RDMA-tool.patch new file mode 100644 index 0000000..e30744c --- /dev/null +++ b/SOURCES/0067-rdma-add-infrastructure-for-RDMA-tool.patch @@ -0,0 +1,5287 @@ +From 6ca04b58fcbaeaa5c8848e77ae0cfcf8b5f4c9ab Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 13:31:34 +0100 +Subject: [PATCH] rdma: add infrastructure for RDMA tool + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479 +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1641914 +Upstream Status: RHEL-only + +commit de87313c8cd0399fd803fcaa8dfaa4aa27912f79 +Author: Andrea Claudi +Date: Thu Mar 21 17:24:12 2019 +0100 + + rdma: add infrastructure for RDMA tool + + Checkout to the v5.0.0 upstream tag. + + Conflicts: + - add rdma on base Makefile + - fix config path and libmnl cflags and libs on rdma/Makefile + + Signed-off-by: Andrea Claudi +--- + Makefile | 2 +- + rdma/.gitignore | 1 + + rdma/Makefile | 27 + + rdma/dev.c | 312 ++++++ + rdma/include/uapi/rdma/ib_user_sa.h | 77 ++ + rdma/include/uapi/rdma/ib_user_verbs.h | 1302 ++++++++++++++++++++++++ + rdma/include/uapi/rdma/rdma_netlink.h | 438 ++++++++ + rdma/include/uapi/rdma/rdma_user_cm.h | 324 ++++++ + rdma/link.c | 355 +++++++ + rdma/rdma.c | 203 ++++ + rdma/rdma.h | 131 +++ + rdma/res.c | 1111 ++++++++++++++++++++ + rdma/utils.c | 868 ++++++++++++++++ + 13 files changed, 5150 insertions(+), 1 deletion(-) + create mode 100644 rdma/.gitignore + create mode 100644 rdma/Makefile + create mode 100644 rdma/dev.c + create mode 100644 rdma/include/uapi/rdma/ib_user_sa.h + create mode 100644 rdma/include/uapi/rdma/ib_user_verbs.h + create mode 100644 rdma/include/uapi/rdma/rdma_netlink.h + create mode 100644 rdma/include/uapi/rdma/rdma_user_cm.h + create mode 100644 rdma/link.c + create mode 100644 rdma/rdma.c + create mode 100644 rdma/rdma.h + create mode 100644 rdma/res.c + create mode 100644 rdma/utils.c + +diff --git a/Makefile b/Makefile +index df2fa33630e65..aea12423166cd 100644 +--- a/Makefile ++++ b/Makefile +@@ -52,7 +52,7 @@ WFLAGS += -Wmissing-declarations -Wold-style-definition -Wformat=2 + CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS) + YACCFLAGS = -d -t -v + +-SUBDIRS=lib ip tc bridge misc netem genl tipc devlink man ++SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma man + + LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a + LDLIBS += $(LIBNETLINK) +diff --git a/rdma/.gitignore b/rdma/.gitignore +new file mode 100644 +index 0000000000000..51fb172baa216 +--- /dev/null ++++ b/rdma/.gitignore +@@ -0,0 +1 @@ ++rdma +diff --git a/rdma/Makefile b/rdma/Makefile +new file mode 100644 +index 0000000000000..0830c82f77edb +--- /dev/null ++++ b/rdma/Makefile +@@ -0,0 +1,27 @@ ++# SPDX-License-Identifier: GPL-2.0 ++include ../Config ++ ++TARGETS := ++ ++ifeq ($(HAVE_MNL),y) ++CFLAGS += -I./include/uapi/ ++CFLAGS += $(shell $(PKG_CONFIG) libmnl --cflags) ++LDLIBS += $(shell $(PKG_CONFIG) libmnl --libs) ++ ++RDMA_OBJ = rdma.o utils.o dev.o link.o res.o ++ ++TARGETS += rdma ++endif ++ ++all: $(TARGETS) $(LIBS) ++ ++rdma: $(RDMA_OBJ) $(LIBS) ++ $(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@ ++ ++install: all ++ for i in $(TARGETS); \ ++ do install -m 0755 $$i $(DESTDIR)$(SBINDIR); \ ++ done ++ ++clean: ++ rm -f $(RDMA_OBJ) $(TARGETS) +diff --git a/rdma/dev.c b/rdma/dev.c +new file mode 100644 +index 0000000000000..60ff4b31e3204 +--- /dev/null ++++ b/rdma/dev.c +@@ -0,0 +1,312 @@ ++/* ++ * dev.c RDMA tool ++ * ++ * This program is free software; you can redistribute 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: Leon Romanovsky ++ */ ++ ++#include "rdma.h" ++ ++static int dev_help(struct rd *rd) ++{ ++ pr_out("Usage: %s dev show [DEV]\n", rd->filename); ++ pr_out(" %s dev set [DEV] name DEVNAME\n", rd->filename); ++ return 0; ++} ++ ++static const char *dev_caps_to_str(uint32_t idx) ++{ ++#define RDMA_DEV_FLAGS_LOW(x) \ ++ x(RESIZE_MAX_WR, 0) \ ++ x(BAD_PKEY_CNTR, 1) \ ++ x(BAD_QKEY_CNTR, 2) \ ++ x(RAW_MULTI, 3) \ ++ x(AUTO_PATH_MIG, 4) \ ++ x(CHANGE_PHY_PORT, 5) \ ++ x(UD_AV_PORT_ENFORCE_PORT_ENFORCE, 6) \ ++ x(CURR_QP_STATE_MOD, 7) \ ++ x(SHUTDOWN_PORT, 8) \ ++ x(INIT_TYPE, 9) \ ++ x(PORT_ACTIVE_EVENT, 10) \ ++ x(SYS_IMAGE_GUID, 11) \ ++ x(RC_RNR_NAK_GEN, 12) \ ++ x(SRQ_RESIZE, 13) \ ++ x(N_NOTIFY_CQ, 14) \ ++ x(LOCAL_DMA_LKEY, 15) \ ++ x(MEM_WINDOW, 17) \ ++ x(UD_IP_CSUM, 18) \ ++ x(UD_TSO, 19) \ ++ x(XRC, 20) \ ++ x(MEM_MGT_EXTENSIONS, 21) \ ++ x(BLOCK_MULTICAST_LOOPBACK, 22) \ ++ x(MEM_WINDOW_TYPE_2A, 23) \ ++ x(MEM_WINDOW_TYPE_2B, 24) \ ++ x(RC_IP_CSUM, 25) \ ++ x(RAW_IP_CSUM, 26) \ ++ x(CROSS_CHANNEL, 27) \ ++ x(MANAGED_FLOW_STEERING, 29) \ ++ x(SIGNATURE_HANDOVER, 30) \ ++ x(ON_DEMAND_PAGING, 31) ++ ++#define RDMA_DEV_FLAGS_HIGH(x) \ ++ x(SG_GAPS_REG, 0) \ ++ x(VIRTUAL_FUNCTION, 1) \ ++ x(RAW_SCATTER_FCS, 2) \ ++ x(RDMA_NETDEV_OPA_VNIC, 3) \ ++ x(PCI_WRITE_END_PADDING, 4) ++ ++ /* ++ * Separation below is needed to allow compilation of rdmatool ++ * on 32bits systems. On such systems, C-enum is limited to be ++ * int and can't hold more than 32 bits. ++ */ ++ enum { RDMA_DEV_FLAGS_LOW(RDMA_BITMAP_ENUM) }; ++ enum { RDMA_DEV_FLAGS_HIGH(RDMA_BITMAP_ENUM) }; ++ ++ static const char * const ++ rdma_dev_names_low[] = { RDMA_DEV_FLAGS_LOW(RDMA_BITMAP_NAMES) }; ++ static const char * const ++ rdma_dev_names_high[] = { RDMA_DEV_FLAGS_HIGH(RDMA_BITMAP_NAMES) }; ++ uint32_t high_idx; ++ #undef RDMA_DEV_FLAGS_LOW ++ #undef RDMA_DEV_FLAGS_HIGH ++ ++ if (idx < ARRAY_SIZE(rdma_dev_names_low) && rdma_dev_names_low[idx]) ++ return rdma_dev_names_low[idx]; ++ ++ high_idx = idx - ARRAY_SIZE(rdma_dev_names_low); ++ if (high_idx < ARRAY_SIZE(rdma_dev_names_high) && ++ rdma_dev_names_high[high_idx]) ++ return rdma_dev_names_high[high_idx]; ++ ++ return "UNKNOWN"; ++} ++ ++static void dev_print_caps(struct rd *rd, struct nlattr **tb) ++{ ++ uint64_t caps; ++ uint32_t idx; ++ ++ if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS]) ++ return; ++ ++ caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]); ++ ++ if (rd->json_output) { ++ jsonw_name(rd->jw, "caps"); ++ jsonw_start_array(rd->jw); ++ } else { ++ pr_out("\n caps: <"); ++ } ++ for (idx = 0; caps; idx++) { ++ if (caps & 0x1) { ++ if (rd->json_output) { ++ jsonw_string(rd->jw, dev_caps_to_str(idx)); ++ } else { ++ pr_out("%s", dev_caps_to_str(idx)); ++ if (caps >> 0x1) ++ pr_out(", "); ++ } ++ } ++ caps >>= 0x1; ++ } ++ ++ if (rd->json_output) ++ jsonw_end_array(rd->jw); ++ else ++ pr_out(">"); ++} ++ ++static void dev_print_fw(struct rd *rd, struct nlattr **tb) ++{ ++ const char *str; ++ if (!tb[RDMA_NLDEV_ATTR_FW_VERSION]) ++ return; ++ ++ str = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_FW_VERSION]); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "fw", str); ++ else ++ pr_out("fw %s ", str); ++} ++ ++static void dev_print_node_guid(struct rd *rd, struct nlattr **tb) ++{ ++ uint64_t node_guid; ++ uint16_t vp[4]; ++ char str[32]; ++ ++ if (!tb[RDMA_NLDEV_ATTR_NODE_GUID]) ++ return; ++ ++ node_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_NODE_GUID]); ++ memcpy(vp, &node_guid, sizeof(uint64_t)); ++ snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "node_guid", str); ++ else ++ pr_out("node_guid %s ", str); ++} ++ ++static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb) ++{ ++ uint64_t sys_image_guid; ++ uint16_t vp[4]; ++ char str[32]; ++ ++ if (!tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID]) ++ return; ++ ++ sys_image_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID]); ++ memcpy(vp, &sys_image_guid, sizeof(uint64_t)); ++ snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "sys_image_guid", str); ++ else ++ pr_out("sys_image_guid %s ", str); ++} ++ ++static const char *node_type_to_str(uint8_t node_type) ++{ ++ static const char * const node_type_str[] = { "unknown", "ca", ++ "switch", "router", ++ "rnic", "usnic", ++ "usnic_dp" }; ++ if (node_type < ARRAY_SIZE(node_type_str)) ++ return node_type_str[node_type]; ++ return "unknown"; ++} ++ ++static void dev_print_node_type(struct rd *rd, struct nlattr **tb) ++{ ++ const char *node_str; ++ uint8_t node_type; ++ ++ if (!tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE]) ++ return; ++ ++ node_type = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE]); ++ node_str = node_type_to_str(node_type); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "node_type", node_str); ++ else ++ pr_out("node_type %s ", node_str); ++} ++ ++static int dev_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct rd *rd = data; ++ const char *name; ++ uint32_t idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) ++ return MNL_CB_ERROR; ++ ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ if (rd->json_output) { ++ jsonw_uint_field(rd->jw, "ifindex", idx); ++ jsonw_string_field(rd->jw, "ifname", name); ++ } else { ++ pr_out("%u: %s: ", idx, name); ++ } ++ ++ dev_print_node_type(rd, tb); ++ dev_print_fw(rd, tb); ++ dev_print_node_guid(rd, tb); ++ dev_print_sys_image_guid(rd, tb); ++ if (rd->show_details) ++ dev_print_caps(rd, tb); ++ ++ if (!rd->json_output) ++ pr_out("\n"); ++ return MNL_CB_OK; ++} ++ ++static int dev_no_args(struct rd *rd) ++{ ++ uint32_t seq; ++ int ret; ++ ++ rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET, ++ &seq, (NLM_F_REQUEST | NLM_F_ACK)); ++ mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); ++ ret = rd_send_msg(rd); ++ if (ret) ++ return ret; ++ ++ if (rd->json_output) ++ jsonw_start_object(rd->jw); ++ ret = rd_recv_msg(rd, dev_parse_cb, rd, seq); ++ if (rd->json_output) ++ jsonw_end_object(rd->jw); ++ return ret; ++} ++ ++static int dev_one_show(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, dev_no_args}, ++ { 0 } ++ }; ++ ++ return rd_exec_cmd(rd, cmds, "parameter"); ++} ++ ++static int dev_set_name(struct rd *rd) ++{ ++ uint32_t seq; ++ ++ if (rd_no_arg(rd)) { ++ pr_err("Please provide device new name.\n"); ++ return -EINVAL; ++ } ++ ++ rd_prepare_msg(rd, RDMA_NLDEV_CMD_SET, ++ &seq, (NLM_F_REQUEST | NLM_F_ACK)); ++ mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); ++ mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_DEV_NAME, rd_argv(rd)); ++ ++ return rd_send_msg(rd); ++} ++ ++static int dev_one_set(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, dev_help}, ++ { "name", dev_set_name}, ++ { 0 } ++ }; ++ ++ return rd_exec_cmd(rd, cmds, "parameter"); ++} ++ ++static int dev_show(struct rd *rd) ++{ ++ return rd_exec_dev(rd, dev_one_show); ++} ++ ++static int dev_set(struct rd *rd) ++{ ++ return rd_exec_require_dev(rd, dev_one_set); ++} ++ ++int cmd_dev(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, dev_show }, ++ { "show", dev_show }, ++ { "list", dev_show }, ++ { "set", dev_set }, ++ { "help", dev_help }, ++ { 0 } ++ }; ++ ++ return rd_exec_cmd(rd, cmds, "dev command"); ++} +diff --git a/rdma/include/uapi/rdma/ib_user_sa.h b/rdma/include/uapi/rdma/ib_user_sa.h +new file mode 100644 +index 0000000000000..435155d6e1c6a +--- /dev/null ++++ b/rdma/include/uapi/rdma/ib_user_sa.h +@@ -0,0 +1,77 @@ ++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ ++/* ++ * Copyright (c) 2005 Intel Corporation. All rights reserved. ++ * ++ * This software is available to you under a choice of one of two ++ * licenses. You may choose to be licensed under the terms of the GNU ++ * General Public License (GPL) Version 2, available from the file ++ * COPYING in the main directory of this source tree, or the ++ * OpenIB.org BSD license below: ++ * ++ * Redistribution and use in source and binary forms, with or ++ * without modification, are permitted provided that the following ++ * conditions are met: ++ * ++ * - Redistributions of source code must retain the above ++ * copyright notice, this list of conditions and the following ++ * disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above ++ * copyright notice, this list of conditions and the following ++ * disclaimer in the documentation and/or other materials ++ * provided with the distribution. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. ++ */ ++ ++#ifndef IB_USER_SA_H ++#define IB_USER_SA_H ++ ++#include ++ ++enum { ++ IB_PATH_GMP = 1, ++ IB_PATH_PRIMARY = (1<<1), ++ IB_PATH_ALTERNATE = (1<<2), ++ IB_PATH_OUTBOUND = (1<<3), ++ IB_PATH_INBOUND = (1<<4), ++ IB_PATH_INBOUND_REVERSE = (1<<5), ++ IB_PATH_BIDIRECTIONAL = IB_PATH_OUTBOUND | IB_PATH_INBOUND_REVERSE ++}; ++ ++struct ib_path_rec_data { ++ __u32 flags; ++ __u32 reserved; ++ __u32 path_rec[16]; ++}; ++ ++struct ib_user_path_rec { ++ __u8 dgid[16]; ++ __u8 sgid[16]; ++ __be16 dlid; ++ __be16 slid; ++ __u32 raw_traffic; ++ __be32 flow_label; ++ __u32 reversible; ++ __u32 mtu; ++ __be16 pkey; ++ __u8 hop_limit; ++ __u8 traffic_class; ++ __u8 numb_path; ++ __u8 sl; ++ __u8 mtu_selector; ++ __u8 rate_selector; ++ __u8 rate; ++ __u8 packet_life_time_selector; ++ __u8 packet_life_time; ++ __u8 preference; ++}; ++ ++#endif /* IB_USER_SA_H */ +diff --git a/rdma/include/uapi/rdma/ib_user_verbs.h b/rdma/include/uapi/rdma/ib_user_verbs.h +new file mode 100644 +index 0000000000000..480d9a60b68e4 +--- /dev/null ++++ b/rdma/include/uapi/rdma/ib_user_verbs.h +@@ -0,0 +1,1302 @@ ++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ ++/* ++ * Copyright (c) 2005 Topspin Communications. All rights reserved. ++ * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. ++ * Copyright (c) 2005 PathScale, Inc. All rights reserved. ++ * Copyright (c) 2006 Mellanox Technologies. All rights reserved. ++ * ++ * This software is available to you under a choice of one of two ++ * licenses. You may choose to be licensed under the terms of the GNU ++ * General Public License (GPL) Version 2, available from the file ++ * COPYING in the main directory of this source tree, or the ++ * OpenIB.org BSD license below: ++ * ++ * Redistribution and use in source and binary forms, with or ++ * without modification, are permitted provided that the following ++ * conditions are met: ++ * ++ * - Redistributions of source code must retain the above ++ * copyright notice, this list of conditions and the following ++ * disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above ++ * copyright notice, this list of conditions and the following ++ * disclaimer in the documentation and/or other materials ++ * provided with the distribution. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. ++ */ ++ ++#ifndef IB_USER_VERBS_H ++#define IB_USER_VERBS_H ++ ++#include ++ ++/* ++ * Increment this value if any changes that break userspace ABI ++ * compatibility are made. ++ */ ++#define IB_USER_VERBS_ABI_VERSION 6 ++#define IB_USER_VERBS_CMD_THRESHOLD 50 ++ ++enum ib_uverbs_write_cmds { ++ IB_USER_VERBS_CMD_GET_CONTEXT, ++ IB_USER_VERBS_CMD_QUERY_DEVICE, ++ IB_USER_VERBS_CMD_QUERY_PORT, ++ IB_USER_VERBS_CMD_ALLOC_PD, ++ IB_USER_VERBS_CMD_DEALLOC_PD, ++ IB_USER_VERBS_CMD_CREATE_AH, ++ IB_USER_VERBS_CMD_MODIFY_AH, ++ IB_USER_VERBS_CMD_QUERY_AH, ++ IB_USER_VERBS_CMD_DESTROY_AH, ++ IB_USER_VERBS_CMD_REG_MR, ++ IB_USER_VERBS_CMD_REG_SMR, ++ IB_USER_VERBS_CMD_REREG_MR, ++ IB_USER_VERBS_CMD_QUERY_MR, ++ IB_USER_VERBS_CMD_DEREG_MR, ++ IB_USER_VERBS_CMD_ALLOC_MW, ++ IB_USER_VERBS_CMD_BIND_MW, ++ IB_USER_VERBS_CMD_DEALLOC_MW, ++ IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL, ++ IB_USER_VERBS_CMD_CREATE_CQ, ++ IB_USER_VERBS_CMD_RESIZE_CQ, ++ IB_USER_VERBS_CMD_DESTROY_CQ, ++ IB_USER_VERBS_CMD_POLL_CQ, ++ IB_USER_VERBS_CMD_PEEK_CQ, ++ IB_USER_VERBS_CMD_REQ_NOTIFY_CQ, ++ IB_USER_VERBS_CMD_CREATE_QP, ++ IB_USER_VERBS_CMD_QUERY_QP, ++ IB_USER_VERBS_CMD_MODIFY_QP, ++ IB_USER_VERBS_CMD_DESTROY_QP, ++ IB_USER_VERBS_CMD_POST_SEND, ++ IB_USER_VERBS_CMD_POST_RECV, ++ IB_USER_VERBS_CMD_ATTACH_MCAST, ++ IB_USER_VERBS_CMD_DETACH_MCAST, ++ IB_USER_VERBS_CMD_CREATE_SRQ, ++ IB_USER_VERBS_CMD_MODIFY_SRQ, ++ IB_USER_VERBS_CMD_QUERY_SRQ, ++ IB_USER_VERBS_CMD_DESTROY_SRQ, ++ IB_USER_VERBS_CMD_POST_SRQ_RECV, ++ IB_USER_VERBS_CMD_OPEN_XRCD, ++ IB_USER_VERBS_CMD_CLOSE_XRCD, ++ IB_USER_VERBS_CMD_CREATE_XSRQ, ++ IB_USER_VERBS_CMD_OPEN_QP, ++}; ++ ++enum { ++ IB_USER_VERBS_EX_CMD_QUERY_DEVICE = IB_USER_VERBS_CMD_QUERY_DEVICE, ++ IB_USER_VERBS_EX_CMD_CREATE_CQ = IB_USER_VERBS_CMD_CREATE_CQ, ++ IB_USER_VERBS_EX_CMD_CREATE_QP = IB_USER_VERBS_CMD_CREATE_QP, ++ IB_USER_VERBS_EX_CMD_MODIFY_QP = IB_USER_VERBS_CMD_MODIFY_QP, ++ IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD, ++ IB_USER_VERBS_EX_CMD_DESTROY_FLOW, ++ IB_USER_VERBS_EX_CMD_CREATE_WQ, ++ IB_USER_VERBS_EX_CMD_MODIFY_WQ, ++ IB_USER_VERBS_EX_CMD_DESTROY_WQ, ++ IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL, ++ IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL, ++ IB_USER_VERBS_EX_CMD_MODIFY_CQ ++}; ++ ++/* ++ * Make sure that all structs defined in this file remain laid out so ++ * that they pack the same way on 32-bit and 64-bit architectures (to ++ * avoid incompatibility between 32-bit userspace and 64-bit kernels). ++ * Specifically: ++ * - Do not use pointer types -- pass pointers in __u64 instead. ++ * - Make sure that any structure larger than 4 bytes is padded to a ++ * multiple of 8 bytes. Otherwise the structure size will be ++ * different between 32-bit and 64-bit architectures. ++ */ ++ ++struct ib_uverbs_async_event_desc { ++ __aligned_u64 element; ++ __u32 event_type; /* enum ib_event_type */ ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_comp_event_desc { ++ __aligned_u64 cq_handle; ++}; ++ ++struct ib_uverbs_cq_moderation_caps { ++ __u16 max_cq_moderation_count; ++ __u16 max_cq_moderation_period; ++ __u32 reserved; ++}; ++ ++/* ++ * All commands from userspace should start with a __u32 command field ++ * followed by __u16 in_words and out_words fields (which give the ++ * length of the command block and response buffer if any in 32-bit ++ * words). The kernel driver will read these fields first and read ++ * the rest of the command struct based on these value. ++ */ ++ ++#define IB_USER_VERBS_CMD_COMMAND_MASK 0xff ++#define IB_USER_VERBS_CMD_FLAG_EXTENDED 0x80000000u ++ ++struct ib_uverbs_cmd_hdr { ++ __u32 command; ++ __u16 in_words; ++ __u16 out_words; ++}; ++ ++struct ib_uverbs_ex_cmd_hdr { ++ __aligned_u64 response; ++ __u16 provider_in_words; ++ __u16 provider_out_words; ++ __u32 cmd_hdr_reserved; ++}; ++ ++struct ib_uverbs_get_context { ++ __aligned_u64 response; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_get_context_resp { ++ __u32 async_fd; ++ __u32 num_comp_vectors; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_query_device { ++ __aligned_u64 response; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_query_device_resp { ++ __aligned_u64 fw_ver; ++ __be64 node_guid; ++ __be64 sys_image_guid; ++ __aligned_u64 max_mr_size; ++ __aligned_u64 page_size_cap; ++ __u32 vendor_id; ++ __u32 vendor_part_id; ++ __u32 hw_ver; ++ __u32 max_qp; ++ __u32 max_qp_wr; ++ __u32 device_cap_flags; ++ __u32 max_sge; ++ __u32 max_sge_rd; ++ __u32 max_cq; ++ __u32 max_cqe; ++ __u32 max_mr; ++ __u32 max_pd; ++ __u32 max_qp_rd_atom; ++ __u32 max_ee_rd_atom; ++ __u32 max_res_rd_atom; ++ __u32 max_qp_init_rd_atom; ++ __u32 max_ee_init_rd_atom; ++ __u32 atomic_cap; ++ __u32 max_ee; ++ __u32 max_rdd; ++ __u32 max_mw; ++ __u32 max_raw_ipv6_qp; ++ __u32 max_raw_ethy_qp; ++ __u32 max_mcast_grp; ++ __u32 max_mcast_qp_attach; ++ __u32 max_total_mcast_qp_attach; ++ __u32 max_ah; ++ __u32 max_fmr; ++ __u32 max_map_per_fmr; ++ __u32 max_srq; ++ __u32 max_srq_wr; ++ __u32 max_srq_sge; ++ __u16 max_pkeys; ++ __u8 local_ca_ack_delay; ++ __u8 phys_port_cnt; ++ __u8 reserved[4]; ++}; ++ ++struct ib_uverbs_ex_query_device { ++ __u32 comp_mask; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_odp_caps { ++ __aligned_u64 general_caps; ++ struct { ++ __u32 rc_odp_caps; ++ __u32 uc_odp_caps; ++ __u32 ud_odp_caps; ++ } per_transport_caps; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_rss_caps { ++ /* Corresponding bit will be set if qp type from ++ * 'enum ib_qp_type' is supported, e.g. ++ * supported_qpts |= 1 << IB_QPT_UD ++ */ ++ __u32 supported_qpts; ++ __u32 max_rwq_indirection_tables; ++ __u32 max_rwq_indirection_table_size; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_tm_caps { ++ /* Max size of rendezvous request message */ ++ __u32 max_rndv_hdr_size; ++ /* Max number of entries in tag matching list */ ++ __u32 max_num_tags; ++ /* TM flags */ ++ __u32 flags; ++ /* Max number of outstanding list operations */ ++ __u32 max_ops; ++ /* Max number of SGE in tag matching entry */ ++ __u32 max_sge; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_ex_query_device_resp { ++ struct ib_uverbs_query_device_resp base; ++ __u32 comp_mask; ++ __u32 response_length; ++ struct ib_uverbs_odp_caps odp_caps; ++ __aligned_u64 timestamp_mask; ++ __aligned_u64 hca_core_clock; /* in KHZ */ ++ __aligned_u64 device_cap_flags_ex; ++ struct ib_uverbs_rss_caps rss_caps; ++ __u32 max_wq_type_rq; ++ __u32 raw_packet_caps; ++ struct ib_uverbs_tm_caps tm_caps; ++ struct ib_uverbs_cq_moderation_caps cq_moderation_caps; ++ __aligned_u64 max_dm_size; ++}; ++ ++struct ib_uverbs_query_port { ++ __aligned_u64 response; ++ __u8 port_num; ++ __u8 reserved[7]; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_query_port_resp { ++ __u32 port_cap_flags; /* see ib_uverbs_query_port_cap_flags */ ++ __u32 max_msg_sz; ++ __u32 bad_pkey_cntr; ++ __u32 qkey_viol_cntr; ++ __u32 gid_tbl_len; ++ __u16 pkey_tbl_len; ++ __u16 lid; ++ __u16 sm_lid; ++ __u8 state; ++ __u8 max_mtu; ++ __u8 active_mtu; ++ __u8 lmc; ++ __u8 max_vl_num; ++ __u8 sm_sl; ++ __u8 subnet_timeout; ++ __u8 init_type_reply; ++ __u8 active_width; ++ __u8 active_speed; ++ __u8 phys_state; ++ __u8 link_layer; ++ __u8 flags; /* see ib_uverbs_query_port_flags */ ++ __u8 reserved; ++}; ++ ++struct ib_uverbs_alloc_pd { ++ __aligned_u64 response; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_alloc_pd_resp { ++ __u32 pd_handle; ++ __u32 driver_data[0]; ++}; ++ ++struct ib_uverbs_dealloc_pd { ++ __u32 pd_handle; ++}; ++ ++struct ib_uverbs_open_xrcd { ++ __aligned_u64 response; ++ __u32 fd; ++ __u32 oflags; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_open_xrcd_resp { ++ __u32 xrcd_handle; ++ __u32 driver_data[0]; ++}; ++ ++struct ib_uverbs_close_xrcd { ++ __u32 xrcd_handle; ++}; ++ ++struct ib_uverbs_reg_mr { ++ __aligned_u64 response; ++ __aligned_u64 start; ++ __aligned_u64 length; ++ __aligned_u64 hca_va; ++ __u32 pd_handle; ++ __u32 access_flags; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_reg_mr_resp { ++ __u32 mr_handle; ++ __u32 lkey; ++ __u32 rkey; ++ __u32 driver_data[0]; ++}; ++ ++struct ib_uverbs_rereg_mr { ++ __aligned_u64 response; ++ __u32 mr_handle; ++ __u32 flags; ++ __aligned_u64 start; ++ __aligned_u64 length; ++ __aligned_u64 hca_va; ++ __u32 pd_handle; ++ __u32 access_flags; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_rereg_mr_resp { ++ __u32 lkey; ++ __u32 rkey; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_dereg_mr { ++ __u32 mr_handle; ++}; ++ ++struct ib_uverbs_alloc_mw { ++ __aligned_u64 response; ++ __u32 pd_handle; ++ __u8 mw_type; ++ __u8 reserved[3]; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_alloc_mw_resp { ++ __u32 mw_handle; ++ __u32 rkey; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_dealloc_mw { ++ __u32 mw_handle; ++}; ++ ++struct ib_uverbs_create_comp_channel { ++ __aligned_u64 response; ++}; ++ ++struct ib_uverbs_create_comp_channel_resp { ++ __u32 fd; ++}; ++ ++struct ib_uverbs_create_cq { ++ __aligned_u64 response; ++ __aligned_u64 user_handle; ++ __u32 cqe; ++ __u32 comp_vector; ++ __s32 comp_channel; ++ __u32 reserved; ++ __aligned_u64 driver_data[0]; ++}; ++ ++enum ib_uverbs_ex_create_cq_flags { ++ IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION = 1 << 0, ++ IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN = 1 << 1, ++}; ++ ++struct ib_uverbs_ex_create_cq { ++ __aligned_u64 user_handle; ++ __u32 cqe; ++ __u32 comp_vector; ++ __s32 comp_channel; ++ __u32 comp_mask; ++ __u32 flags; /* bitmask of ib_uverbs_ex_create_cq_flags */ ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_create_cq_resp { ++ __u32 cq_handle; ++ __u32 cqe; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_ex_create_cq_resp { ++ struct ib_uverbs_create_cq_resp base; ++ __u32 comp_mask; ++ __u32 response_length; ++}; ++ ++struct ib_uverbs_resize_cq { ++ __aligned_u64 response; ++ __u32 cq_handle; ++ __u32 cqe; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_resize_cq_resp { ++ __u32 cqe; ++ __u32 reserved; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_poll_cq { ++ __aligned_u64 response; ++ __u32 cq_handle; ++ __u32 ne; ++}; ++ ++struct ib_uverbs_wc { ++ __aligned_u64 wr_id; ++ __u32 status; ++ __u32 opcode; ++ __u32 vendor_err; ++ __u32 byte_len; ++ union { ++ __be32 imm_data; ++ __u32 invalidate_rkey; ++ } ex; ++ __u32 qp_num; ++ __u32 src_qp; ++ __u32 wc_flags; ++ __u16 pkey_index; ++ __u16 slid; ++ __u8 sl; ++ __u8 dlid_path_bits; ++ __u8 port_num; ++ __u8 reserved; ++}; ++ ++struct ib_uverbs_poll_cq_resp { ++ __u32 count; ++ __u32 reserved; ++ struct ib_uverbs_wc wc[0]; ++}; ++ ++struct ib_uverbs_req_notify_cq { ++ __u32 cq_handle; ++ __u32 solicited_only; ++}; ++ ++struct ib_uverbs_destroy_cq { ++ __aligned_u64 response; ++ __u32 cq_handle; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_destroy_cq_resp { ++ __u32 comp_events_reported; ++ __u32 async_events_reported; ++}; ++ ++struct ib_uverbs_global_route { ++ __u8 dgid[16]; ++ __u32 flow_label; ++ __u8 sgid_index; ++ __u8 hop_limit; ++ __u8 traffic_class; ++ __u8 reserved; ++}; ++ ++struct ib_uverbs_ah_attr { ++ struct ib_uverbs_global_route grh; ++ __u16 dlid; ++ __u8 sl; ++ __u8 src_path_bits; ++ __u8 static_rate; ++ __u8 is_global; ++ __u8 port_num; ++ __u8 reserved; ++}; ++ ++struct ib_uverbs_qp_attr { ++ __u32 qp_attr_mask; ++ __u32 qp_state; ++ __u32 cur_qp_state; ++ __u32 path_mtu; ++ __u32 path_mig_state; ++ __u32 qkey; ++ __u32 rq_psn; ++ __u32 sq_psn; ++ __u32 dest_qp_num; ++ __u32 qp_access_flags; ++ ++ struct ib_uverbs_ah_attr ah_attr; ++ struct ib_uverbs_ah_attr alt_ah_attr; ++ ++ /* ib_qp_cap */ ++ __u32 max_send_wr; ++ __u32 max_recv_wr; ++ __u32 max_send_sge; ++ __u32 max_recv_sge; ++ __u32 max_inline_data; ++ ++ __u16 pkey_index; ++ __u16 alt_pkey_index; ++ __u8 en_sqd_async_notify; ++ __u8 sq_draining; ++ __u8 max_rd_atomic; ++ __u8 max_dest_rd_atomic; ++ __u8 min_rnr_timer; ++ __u8 port_num; ++ __u8 timeout; ++ __u8 retry_cnt; ++ __u8 rnr_retry; ++ __u8 alt_port_num; ++ __u8 alt_timeout; ++ __u8 reserved[5]; ++}; ++ ++struct ib_uverbs_create_qp { ++ __aligned_u64 response; ++ __aligned_u64 user_handle; ++ __u32 pd_handle; ++ __u32 send_cq_handle; ++ __u32 recv_cq_handle; ++ __u32 srq_handle; ++ __u32 max_send_wr; ++ __u32 max_recv_wr; ++ __u32 max_send_sge; ++ __u32 max_recv_sge; ++ __u32 max_inline_data; ++ __u8 sq_sig_all; ++ __u8 qp_type; ++ __u8 is_srq; ++ __u8 reserved; ++ __aligned_u64 driver_data[0]; ++}; ++ ++enum ib_uverbs_create_qp_mask { ++ IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1UL << 0, ++}; ++ ++enum { ++ IB_UVERBS_CREATE_QP_SUP_COMP_MASK = IB_UVERBS_CREATE_QP_MASK_IND_TABLE, ++}; ++ ++enum { ++ /* ++ * This value is equal to IB_QP_DEST_QPN. ++ */ ++ IB_USER_LEGACY_LAST_QP_ATTR_MASK = 1ULL << 20, ++}; ++ ++enum { ++ /* ++ * This value is equal to IB_QP_RATE_LIMIT. ++ */ ++ IB_USER_LAST_QP_ATTR_MASK = 1ULL << 25, ++}; ++ ++struct ib_uverbs_ex_create_qp { ++ __aligned_u64 user_handle; ++ __u32 pd_handle; ++ __u32 send_cq_handle; ++ __u32 recv_cq_handle; ++ __u32 srq_handle; ++ __u32 max_send_wr; ++ __u32 max_recv_wr; ++ __u32 max_send_sge; ++ __u32 max_recv_sge; ++ __u32 max_inline_data; ++ __u8 sq_sig_all; ++ __u8 qp_type; ++ __u8 is_srq; ++ __u8 reserved; ++ __u32 comp_mask; ++ __u32 create_flags; ++ __u32 rwq_ind_tbl_handle; ++ __u32 source_qpn; ++}; ++ ++struct ib_uverbs_open_qp { ++ __aligned_u64 response; ++ __aligned_u64 user_handle; ++ __u32 pd_handle; ++ __u32 qpn; ++ __u8 qp_type; ++ __u8 reserved[7]; ++ __aligned_u64 driver_data[0]; ++}; ++ ++/* also used for open response */ ++struct ib_uverbs_create_qp_resp { ++ __u32 qp_handle; ++ __u32 qpn; ++ __u32 max_send_wr; ++ __u32 max_recv_wr; ++ __u32 max_send_sge; ++ __u32 max_recv_sge; ++ __u32 max_inline_data; ++ __u32 reserved; ++ __u32 driver_data[0]; ++}; ++ ++struct ib_uverbs_ex_create_qp_resp { ++ struct ib_uverbs_create_qp_resp base; ++ __u32 comp_mask; ++ __u32 response_length; ++}; ++ ++/* ++ * This struct needs to remain a multiple of 8 bytes to keep the ++ * alignment of the modify QP parameters. ++ */ ++struct ib_uverbs_qp_dest { ++ __u8 dgid[16]; ++ __u32 flow_label; ++ __u16 dlid; ++ __u16 reserved; ++ __u8 sgid_index; ++ __u8 hop_limit; ++ __u8 traffic_class; ++ __u8 sl; ++ __u8 src_path_bits; ++ __u8 static_rate; ++ __u8 is_global; ++ __u8 port_num; ++}; ++ ++struct ib_uverbs_query_qp { ++ __aligned_u64 response; ++ __u32 qp_handle; ++ __u32 attr_mask; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_query_qp_resp { ++ struct ib_uverbs_qp_dest dest; ++ struct ib_uverbs_qp_dest alt_dest; ++ __u32 max_send_wr; ++ __u32 max_recv_wr; ++ __u32 max_send_sge; ++ __u32 max_recv_sge; ++ __u32 max_inline_data; ++ __u32 qkey; ++ __u32 rq_psn; ++ __u32 sq_psn; ++ __u32 dest_qp_num; ++ __u32 qp_access_flags; ++ __u16 pkey_index; ++ __u16 alt_pkey_index; ++ __u8 qp_state; ++ __u8 cur_qp_state; ++ __u8 path_mtu; ++ __u8 path_mig_state; ++ __u8 sq_draining; ++ __u8 max_rd_atomic; ++ __u8 max_dest_rd_atomic; ++ __u8 min_rnr_timer; ++ __u8 port_num; ++ __u8 timeout; ++ __u8 retry_cnt; ++ __u8 rnr_retry; ++ __u8 alt_port_num; ++ __u8 alt_timeout; ++ __u8 sq_sig_all; ++ __u8 reserved[5]; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_modify_qp { ++ struct ib_uverbs_qp_dest dest; ++ struct ib_uverbs_qp_dest alt_dest; ++ __u32 qp_handle; ++ __u32 attr_mask; ++ __u32 qkey; ++ __u32 rq_psn; ++ __u32 sq_psn; ++ __u32 dest_qp_num; ++ __u32 qp_access_flags; ++ __u16 pkey_index; ++ __u16 alt_pkey_index; ++ __u8 qp_state; ++ __u8 cur_qp_state; ++ __u8 path_mtu; ++ __u8 path_mig_state; ++ __u8 en_sqd_async_notify; ++ __u8 max_rd_atomic; ++ __u8 max_dest_rd_atomic; ++ __u8 min_rnr_timer; ++ __u8 port_num; ++ __u8 timeout; ++ __u8 retry_cnt; ++ __u8 rnr_retry; ++ __u8 alt_port_num; ++ __u8 alt_timeout; ++ __u8 reserved[2]; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_ex_modify_qp { ++ struct ib_uverbs_modify_qp base; ++ __u32 rate_limit; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_ex_modify_qp_resp { ++ __u32 comp_mask; ++ __u32 response_length; ++}; ++ ++struct ib_uverbs_destroy_qp { ++ __aligned_u64 response; ++ __u32 qp_handle; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_destroy_qp_resp { ++ __u32 events_reported; ++}; ++ ++/* ++ * The ib_uverbs_sge structure isn't used anywhere, since we assume ++ * the ib_sge structure is packed the same way on 32-bit and 64-bit ++ * architectures in both kernel and user space. It's just here to ++ * document the ABI. ++ */ ++struct ib_uverbs_sge { ++ __aligned_u64 addr; ++ __u32 length; ++ __u32 lkey; ++}; ++ ++enum ib_uverbs_wr_opcode { ++ IB_UVERBS_WR_RDMA_WRITE = 0, ++ IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1, ++ IB_UVERBS_WR_SEND = 2, ++ IB_UVERBS_WR_SEND_WITH_IMM = 3, ++ IB_UVERBS_WR_RDMA_READ = 4, ++ IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5, ++ IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6, ++ IB_UVERBS_WR_LOCAL_INV = 7, ++ IB_UVERBS_WR_BIND_MW = 8, ++ IB_UVERBS_WR_SEND_WITH_INV = 9, ++ IB_UVERBS_WR_TSO = 10, ++ IB_UVERBS_WR_RDMA_READ_WITH_INV = 11, ++ IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, ++ IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, ++ /* Review enum ib_wr_opcode before modifying this */ ++}; ++ ++struct ib_uverbs_send_wr { ++ __aligned_u64 wr_id; ++ __u32 num_sge; ++ __u32 opcode; /* see enum ib_uverbs_wr_opcode */ ++ __u32 send_flags; ++ union { ++ __be32 imm_data; ++ __u32 invalidate_rkey; ++ } ex; ++ union { ++ struct { ++ __aligned_u64 remote_addr; ++ __u32 rkey; ++ __u32 reserved; ++ } rdma; ++ struct { ++ __aligned_u64 remote_addr; ++ __aligned_u64 compare_add; ++ __aligned_u64 swap; ++ __u32 rkey; ++ __u32 reserved; ++ } atomic; ++ struct { ++ __u32 ah; ++ __u32 remote_qpn; ++ __u32 remote_qkey; ++ __u32 reserved; ++ } ud; ++ } wr; ++}; ++ ++struct ib_uverbs_post_send { ++ __aligned_u64 response; ++ __u32 qp_handle; ++ __u32 wr_count; ++ __u32 sge_count; ++ __u32 wqe_size; ++ struct ib_uverbs_send_wr send_wr[0]; ++}; ++ ++struct ib_uverbs_post_send_resp { ++ __u32 bad_wr; ++}; ++ ++struct ib_uverbs_recv_wr { ++ __aligned_u64 wr_id; ++ __u32 num_sge; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_post_recv { ++ __aligned_u64 response; ++ __u32 qp_handle; ++ __u32 wr_count; ++ __u32 sge_count; ++ __u32 wqe_size; ++ struct ib_uverbs_recv_wr recv_wr[0]; ++}; ++ ++struct ib_uverbs_post_recv_resp { ++ __u32 bad_wr; ++}; ++ ++struct ib_uverbs_post_srq_recv { ++ __aligned_u64 response; ++ __u32 srq_handle; ++ __u32 wr_count; ++ __u32 sge_count; ++ __u32 wqe_size; ++ struct ib_uverbs_recv_wr recv[0]; ++}; ++ ++struct ib_uverbs_post_srq_recv_resp { ++ __u32 bad_wr; ++}; ++ ++struct ib_uverbs_create_ah { ++ __aligned_u64 response; ++ __aligned_u64 user_handle; ++ __u32 pd_handle; ++ __u32 reserved; ++ struct ib_uverbs_ah_attr attr; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_create_ah_resp { ++ __u32 ah_handle; ++ __u32 driver_data[0]; ++}; ++ ++struct ib_uverbs_destroy_ah { ++ __u32 ah_handle; ++}; ++ ++struct ib_uverbs_attach_mcast { ++ __u8 gid[16]; ++ __u32 qp_handle; ++ __u16 mlid; ++ __u16 reserved; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_detach_mcast { ++ __u8 gid[16]; ++ __u32 qp_handle; ++ __u16 mlid; ++ __u16 reserved; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_flow_spec_hdr { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ /* followed by flow_spec */ ++ __aligned_u64 flow_spec_data[0]; ++}; ++ ++struct ib_uverbs_flow_eth_filter { ++ __u8 dst_mac[6]; ++ __u8 src_mac[6]; ++ __be16 ether_type; ++ __be16 vlan_tag; ++}; ++ ++struct ib_uverbs_flow_spec_eth { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_eth_filter val; ++ struct ib_uverbs_flow_eth_filter mask; ++}; ++ ++struct ib_uverbs_flow_ipv4_filter { ++ __be32 src_ip; ++ __be32 dst_ip; ++ __u8 proto; ++ __u8 tos; ++ __u8 ttl; ++ __u8 flags; ++}; ++ ++struct ib_uverbs_flow_spec_ipv4 { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_ipv4_filter val; ++ struct ib_uverbs_flow_ipv4_filter mask; ++}; ++ ++struct ib_uverbs_flow_tcp_udp_filter { ++ __be16 dst_port; ++ __be16 src_port; ++}; ++ ++struct ib_uverbs_flow_spec_tcp_udp { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_tcp_udp_filter val; ++ struct ib_uverbs_flow_tcp_udp_filter mask; ++}; ++ ++struct ib_uverbs_flow_ipv6_filter { ++ __u8 src_ip[16]; ++ __u8 dst_ip[16]; ++ __be32 flow_label; ++ __u8 next_hdr; ++ __u8 traffic_class; ++ __u8 hop_limit; ++ __u8 reserved; ++}; ++ ++struct ib_uverbs_flow_spec_ipv6 { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_ipv6_filter val; ++ struct ib_uverbs_flow_ipv6_filter mask; ++}; ++ ++struct ib_uverbs_flow_spec_action_tag { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ __u32 tag_id; ++ __u32 reserved1; ++}; ++ ++struct ib_uverbs_flow_spec_action_drop { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++}; ++ ++struct ib_uverbs_flow_spec_action_handle { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ __u32 handle; ++ __u32 reserved1; ++}; ++ ++struct ib_uverbs_flow_spec_action_count { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ __u32 handle; ++ __u32 reserved1; ++}; ++ ++struct ib_uverbs_flow_tunnel_filter { ++ __be32 tunnel_id; ++}; ++ ++struct ib_uverbs_flow_spec_tunnel { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_tunnel_filter val; ++ struct ib_uverbs_flow_tunnel_filter mask; ++}; ++ ++struct ib_uverbs_flow_spec_esp_filter { ++ __u32 spi; ++ __u32 seq; ++}; ++ ++struct ib_uverbs_flow_spec_esp { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_spec_esp_filter val; ++ struct ib_uverbs_flow_spec_esp_filter mask; ++}; ++ ++struct ib_uverbs_flow_gre_filter { ++ /* c_ks_res0_ver field is bits 0-15 in offset 0 of a standard GRE header: ++ * bit 0 - C - checksum bit. ++ * bit 1 - reserved. set to 0. ++ * bit 2 - key bit. ++ * bit 3 - sequence number bit. ++ * bits 4:12 - reserved. set to 0. ++ * bits 13:15 - GRE version. ++ */ ++ __be16 c_ks_res0_ver; ++ __be16 protocol; ++ __be32 key; ++}; ++ ++struct ib_uverbs_flow_spec_gre { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_gre_filter val; ++ struct ib_uverbs_flow_gre_filter mask; ++}; ++ ++struct ib_uverbs_flow_mpls_filter { ++ /* The field includes the entire MPLS label: ++ * bits 0:19 - label field. ++ * bits 20:22 - traffic class field. ++ * bits 23 - bottom of stack bit. ++ * bits 24:31 - ttl field. ++ */ ++ __be32 label; ++}; ++ ++struct ib_uverbs_flow_spec_mpls { ++ union { ++ struct ib_uverbs_flow_spec_hdr hdr; ++ struct { ++ __u32 type; ++ __u16 size; ++ __u16 reserved; ++ }; ++ }; ++ struct ib_uverbs_flow_mpls_filter val; ++ struct ib_uverbs_flow_mpls_filter mask; ++}; ++ ++struct ib_uverbs_flow_attr { ++ __u32 type; ++ __u16 size; ++ __u16 priority; ++ __u8 num_of_specs; ++ __u8 reserved[2]; ++ __u8 port; ++ __u32 flags; ++ /* Following are the optional layers according to user request ++ * struct ib_flow_spec_xxx ++ * struct ib_flow_spec_yyy ++ */ ++ struct ib_uverbs_flow_spec_hdr flow_specs[0]; ++}; ++ ++struct ib_uverbs_create_flow { ++ __u32 comp_mask; ++ __u32 qp_handle; ++ struct ib_uverbs_flow_attr flow_attr; ++}; ++ ++struct ib_uverbs_create_flow_resp { ++ __u32 comp_mask; ++ __u32 flow_handle; ++}; ++ ++struct ib_uverbs_destroy_flow { ++ __u32 comp_mask; ++ __u32 flow_handle; ++}; ++ ++struct ib_uverbs_create_srq { ++ __aligned_u64 response; ++ __aligned_u64 user_handle; ++ __u32 pd_handle; ++ __u32 max_wr; ++ __u32 max_sge; ++ __u32 srq_limit; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_create_xsrq { ++ __aligned_u64 response; ++ __aligned_u64 user_handle; ++ __u32 srq_type; ++ __u32 pd_handle; ++ __u32 max_wr; ++ __u32 max_sge; ++ __u32 srq_limit; ++ __u32 max_num_tags; ++ __u32 xrcd_handle; ++ __u32 cq_handle; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_create_srq_resp { ++ __u32 srq_handle; ++ __u32 max_wr; ++ __u32 max_sge; ++ __u32 srqn; ++ __u32 driver_data[0]; ++}; ++ ++struct ib_uverbs_modify_srq { ++ __u32 srq_handle; ++ __u32 attr_mask; ++ __u32 max_wr; ++ __u32 srq_limit; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_query_srq { ++ __aligned_u64 response; ++ __u32 srq_handle; ++ __u32 reserved; ++ __aligned_u64 driver_data[0]; ++}; ++ ++struct ib_uverbs_query_srq_resp { ++ __u32 max_wr; ++ __u32 max_sge; ++ __u32 srq_limit; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_destroy_srq { ++ __aligned_u64 response; ++ __u32 srq_handle; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_destroy_srq_resp { ++ __u32 events_reported; ++}; ++ ++struct ib_uverbs_ex_create_wq { ++ __u32 comp_mask; ++ __u32 wq_type; ++ __aligned_u64 user_handle; ++ __u32 pd_handle; ++ __u32 cq_handle; ++ __u32 max_wr; ++ __u32 max_sge; ++ __u32 create_flags; /* Use enum ib_wq_flags */ ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_ex_create_wq_resp { ++ __u32 comp_mask; ++ __u32 response_length; ++ __u32 wq_handle; ++ __u32 max_wr; ++ __u32 max_sge; ++ __u32 wqn; ++}; ++ ++struct ib_uverbs_ex_destroy_wq { ++ __u32 comp_mask; ++ __u32 wq_handle; ++}; ++ ++struct ib_uverbs_ex_destroy_wq_resp { ++ __u32 comp_mask; ++ __u32 response_length; ++ __u32 events_reported; ++ __u32 reserved; ++}; ++ ++struct ib_uverbs_ex_modify_wq { ++ __u32 attr_mask; ++ __u32 wq_handle; ++ __u32 wq_state; ++ __u32 curr_wq_state; ++ __u32 flags; /* Use enum ib_wq_flags */ ++ __u32 flags_mask; /* Use enum ib_wq_flags */ ++}; ++ ++/* Prevent memory allocation rather than max expected size */ ++#define IB_USER_VERBS_MAX_LOG_IND_TBL_SIZE 0x0d ++struct ib_uverbs_ex_create_rwq_ind_table { ++ __u32 comp_mask; ++ __u32 log_ind_tbl_size; ++ /* Following are the wq handles according to log_ind_tbl_size ++ * wq_handle1 ++ * wq_handle2 ++ */ ++ __u32 wq_handles[0]; ++}; ++ ++struct ib_uverbs_ex_create_rwq_ind_table_resp { ++ __u32 comp_mask; ++ __u32 response_length; ++ __u32 ind_tbl_handle; ++ __u32 ind_tbl_num; ++}; ++ ++struct ib_uverbs_ex_destroy_rwq_ind_table { ++ __u32 comp_mask; ++ __u32 ind_tbl_handle; ++}; ++ ++struct ib_uverbs_cq_moderation { ++ __u16 cq_count; ++ __u16 cq_period; ++}; ++ ++struct ib_uverbs_ex_modify_cq { ++ __u32 cq_handle; ++ __u32 attr_mask; ++ struct ib_uverbs_cq_moderation attr; ++ __u32 reserved; ++}; ++ ++#define IB_DEVICE_NAME_MAX 64 ++ ++#endif /* IB_USER_VERBS_H */ +diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h +new file mode 100644 +index 0000000000000..04c80cebef49f +--- /dev/null ++++ b/rdma/include/uapi/rdma/rdma_netlink.h +@@ -0,0 +1,438 @@ ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ ++#ifndef _RDMA_NETLINK_H ++#define _RDMA_NETLINK_H ++ ++#include ++ ++enum { ++ RDMA_NL_RDMA_CM = 1, ++ RDMA_NL_IWCM, ++ RDMA_NL_RSVD, ++ RDMA_NL_LS, /* RDMA Local Services */ ++ RDMA_NL_NLDEV, /* RDMA device interface */ ++ RDMA_NL_NUM_CLIENTS ++}; ++ ++enum { ++ RDMA_NL_GROUP_CM = 1, ++ RDMA_NL_GROUP_IWPM, ++ RDMA_NL_GROUP_LS, ++ RDMA_NL_NUM_GROUPS ++}; ++ ++#define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10) ++#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1)) ++#define RDMA_NL_GET_TYPE(client, op) ((client << 10) + op) ++ ++enum { ++ RDMA_NL_RDMA_CM_ID_STATS = 0, ++ RDMA_NL_RDMA_CM_NUM_OPS ++}; ++ ++enum { ++ RDMA_NL_RDMA_CM_ATTR_SRC_ADDR = 1, ++ RDMA_NL_RDMA_CM_ATTR_DST_ADDR, ++ RDMA_NL_RDMA_CM_NUM_ATTR, ++}; ++ ++/* iwarp port mapper op-codes */ ++enum { ++ RDMA_NL_IWPM_REG_PID = 0, ++ RDMA_NL_IWPM_ADD_MAPPING, ++ RDMA_NL_IWPM_QUERY_MAPPING, ++ RDMA_NL_IWPM_REMOVE_MAPPING, ++ RDMA_NL_IWPM_REMOTE_INFO, ++ RDMA_NL_IWPM_HANDLE_ERR, ++ RDMA_NL_IWPM_MAPINFO, ++ RDMA_NL_IWPM_MAPINFO_NUM, ++ RDMA_NL_IWPM_NUM_OPS ++}; ++ ++struct rdma_cm_id_stats { ++ __u32 qp_num; ++ __u32 bound_dev_if; ++ __u32 port_space; ++ __s32 pid; ++ __u8 cm_state; ++ __u8 node_type; ++ __u8 port_num; ++ __u8 qp_type; ++}; ++ ++enum { ++ IWPM_NLA_REG_PID_UNSPEC = 0, ++ IWPM_NLA_REG_PID_SEQ, ++ IWPM_NLA_REG_IF_NAME, ++ IWPM_NLA_REG_IBDEV_NAME, ++ IWPM_NLA_REG_ULIB_NAME, ++ IWPM_NLA_REG_PID_MAX ++}; ++ ++enum { ++ IWPM_NLA_RREG_PID_UNSPEC = 0, ++ IWPM_NLA_RREG_PID_SEQ, ++ IWPM_NLA_RREG_IBDEV_NAME, ++ IWPM_NLA_RREG_ULIB_NAME, ++ IWPM_NLA_RREG_ULIB_VER, ++ IWPM_NLA_RREG_PID_ERR, ++ IWPM_NLA_RREG_PID_MAX ++ ++}; ++ ++enum { ++ IWPM_NLA_MANAGE_MAPPING_UNSPEC = 0, ++ IWPM_NLA_MANAGE_MAPPING_SEQ, ++ IWPM_NLA_MANAGE_ADDR, ++ IWPM_NLA_MANAGE_MAPPED_LOC_ADDR, ++ IWPM_NLA_RMANAGE_MAPPING_ERR, ++ IWPM_NLA_RMANAGE_MAPPING_MAX ++}; ++ ++#define IWPM_NLA_MANAGE_MAPPING_MAX 3 ++#define IWPM_NLA_QUERY_MAPPING_MAX 4 ++#define IWPM_NLA_MAPINFO_SEND_MAX 3 ++ ++enum { ++ IWPM_NLA_QUERY_MAPPING_UNSPEC = 0, ++ IWPM_NLA_QUERY_MAPPING_SEQ, ++ IWPM_NLA_QUERY_LOCAL_ADDR, ++ IWPM_NLA_QUERY_REMOTE_ADDR, ++ IWPM_NLA_RQUERY_MAPPED_LOC_ADDR, ++ IWPM_NLA_RQUERY_MAPPED_REM_ADDR, ++ IWPM_NLA_RQUERY_MAPPING_ERR, ++ IWPM_NLA_RQUERY_MAPPING_MAX ++}; ++ ++enum { ++ IWPM_NLA_MAPINFO_REQ_UNSPEC = 0, ++ IWPM_NLA_MAPINFO_ULIB_NAME, ++ IWPM_NLA_MAPINFO_ULIB_VER, ++ IWPM_NLA_MAPINFO_REQ_MAX ++}; ++ ++enum { ++ IWPM_NLA_MAPINFO_UNSPEC = 0, ++ IWPM_NLA_MAPINFO_LOCAL_ADDR, ++ IWPM_NLA_MAPINFO_MAPPED_ADDR, ++ IWPM_NLA_MAPINFO_MAX ++}; ++ ++enum { ++ IWPM_NLA_MAPINFO_NUM_UNSPEC = 0, ++ IWPM_NLA_MAPINFO_SEQ, ++ IWPM_NLA_MAPINFO_SEND_NUM, ++ IWPM_NLA_MAPINFO_ACK_NUM, ++ IWPM_NLA_MAPINFO_NUM_MAX ++}; ++ ++enum { ++ IWPM_NLA_ERR_UNSPEC = 0, ++ IWPM_NLA_ERR_SEQ, ++ IWPM_NLA_ERR_CODE, ++ IWPM_NLA_ERR_MAX ++}; ++ ++/* ++ * Local service operations: ++ * RESOLVE - The client requests the local service to resolve a path. ++ * SET_TIMEOUT - The local service requests the client to set the timeout. ++ * IP_RESOLVE - The client requests the local service to resolve an IP to GID. ++ */ ++enum { ++ RDMA_NL_LS_OP_RESOLVE = 0, ++ RDMA_NL_LS_OP_SET_TIMEOUT, ++ RDMA_NL_LS_OP_IP_RESOLVE, ++ RDMA_NL_LS_NUM_OPS ++}; ++ ++/* Local service netlink message flags */ ++#define RDMA_NL_LS_F_ERR 0x0100 /* Failed response */ ++ ++/* ++ * Local service resolve operation family header. ++ * The layout for the resolve operation: ++ * nlmsg header ++ * family header ++ * attributes ++ */ ++ ++/* ++ * Local service path use: ++ * Specify how the path(s) will be used. ++ * ALL - For connected CM operation (6 pathrecords) ++ * UNIDIRECTIONAL - For unidirectional UD (1 pathrecord) ++ * GMP - For miscellaneous GMP like operation (at least 1 reversible ++ * pathrecord) ++ */ ++enum { ++ LS_RESOLVE_PATH_USE_ALL = 0, ++ LS_RESOLVE_PATH_USE_UNIDIRECTIONAL, ++ LS_RESOLVE_PATH_USE_GMP, ++ LS_RESOLVE_PATH_USE_MAX ++}; ++ ++#define LS_DEVICE_NAME_MAX 64 ++ ++struct rdma_ls_resolve_header { ++ __u8 device_name[LS_DEVICE_NAME_MAX]; ++ __u8 port_num; ++ __u8 path_use; ++}; ++ ++struct rdma_ls_ip_resolve_header { ++ __u32 ifindex; ++}; ++ ++/* Local service attribute type */ ++#define RDMA_NLA_F_MANDATORY (1 << 13) ++#define RDMA_NLA_TYPE_MASK (~(NLA_F_NESTED | NLA_F_NET_BYTEORDER | \ ++ RDMA_NLA_F_MANDATORY)) ++ ++/* ++ * Local service attributes: ++ * Attr Name Size Byte order ++ * ----------------------------------------------------- ++ * PATH_RECORD struct ib_path_rec_data ++ * TIMEOUT u32 cpu ++ * SERVICE_ID u64 cpu ++ * DGID u8[16] BE ++ * SGID u8[16] BE ++ * TCLASS u8 ++ * PKEY u16 cpu ++ * QOS_CLASS u16 cpu ++ * IPV4 u32 BE ++ * IPV6 u8[16] BE ++ */ ++enum { ++ LS_NLA_TYPE_UNSPEC = 0, ++ LS_NLA_TYPE_PATH_RECORD, ++ LS_NLA_TYPE_TIMEOUT, ++ LS_NLA_TYPE_SERVICE_ID, ++ LS_NLA_TYPE_DGID, ++ LS_NLA_TYPE_SGID, ++ LS_NLA_TYPE_TCLASS, ++ LS_NLA_TYPE_PKEY, ++ LS_NLA_TYPE_QOS_CLASS, ++ LS_NLA_TYPE_IPV4, ++ LS_NLA_TYPE_IPV6, ++ LS_NLA_TYPE_MAX ++}; ++ ++/* Local service DGID/SGID attribute: big endian */ ++struct rdma_nla_ls_gid { ++ __u8 gid[16]; ++}; ++ ++enum rdma_nldev_command { ++ RDMA_NLDEV_CMD_UNSPEC, ++ ++ RDMA_NLDEV_CMD_GET, /* can dump */ ++ RDMA_NLDEV_CMD_SET, ++ ++ /* 3 - 4 are free to use */ ++ ++ RDMA_NLDEV_CMD_PORT_GET = 5, /* can dump */ ++ ++ /* 6 - 8 are free to use */ ++ ++ RDMA_NLDEV_CMD_RES_GET = 9, /* can dump */ ++ ++ RDMA_NLDEV_CMD_RES_QP_GET, /* can dump */ ++ ++ RDMA_NLDEV_CMD_RES_CM_ID_GET, /* can dump */ ++ ++ RDMA_NLDEV_CMD_RES_CQ_GET, /* can dump */ ++ ++ RDMA_NLDEV_CMD_RES_MR_GET, /* can dump */ ++ ++ RDMA_NLDEV_CMD_RES_PD_GET, /* can dump */ ++ ++ RDMA_NLDEV_NUM_OPS ++}; ++ ++enum { ++ RDMA_NLDEV_ATTR_ENTRY_STRLEN = 16, ++}; ++ ++enum rdma_nldev_print_type { ++ RDMA_NLDEV_PRINT_TYPE_UNSPEC, ++ RDMA_NLDEV_PRINT_TYPE_HEX, ++}; ++ ++enum rdma_nldev_attr { ++ /* don't change the order or add anything between, this is ABI! */ ++ RDMA_NLDEV_ATTR_UNSPEC, ++ ++ /* Pad attribute for 64b alignment */ ++ RDMA_NLDEV_ATTR_PAD = RDMA_NLDEV_ATTR_UNSPEC, ++ ++ /* Identifier for ib_device */ ++ RDMA_NLDEV_ATTR_DEV_INDEX, /* u32 */ ++ ++ RDMA_NLDEV_ATTR_DEV_NAME, /* string */ ++ /* ++ * Device index together with port index are identifiers ++ * for port/link properties. ++ * ++ * For RDMA_NLDEV_CMD_GET commamnd, port index will return number ++ * of available ports in ib_device, while for port specific operations, ++ * it will be real port index as it appears in sysfs. Port index follows ++ * sysfs notation and starts from 1 for the first port. ++ */ ++ RDMA_NLDEV_ATTR_PORT_INDEX, /* u32 */ ++ ++ /* ++ * Device and port capabilities ++ * ++ * When used for port info, first 32-bits are CapabilityMask followed by ++ * 16-bit CapabilityMask2. ++ */ ++ RDMA_NLDEV_ATTR_CAP_FLAGS, /* u64 */ ++ ++ /* ++ * FW version ++ */ ++ RDMA_NLDEV_ATTR_FW_VERSION, /* string */ ++ ++ /* ++ * Node GUID (in host byte order) associated with the RDMA device. ++ */ ++ RDMA_NLDEV_ATTR_NODE_GUID, /* u64 */ ++ ++ /* ++ * System image GUID (in host byte order) associated with ++ * this RDMA device and other devices which are part of a ++ * single system. ++ */ ++ RDMA_NLDEV_ATTR_SYS_IMAGE_GUID, /* u64 */ ++ ++ /* ++ * Subnet prefix (in host byte order) ++ */ ++ RDMA_NLDEV_ATTR_SUBNET_PREFIX, /* u64 */ ++ ++ /* ++ * Local Identifier (LID), ++ * According to IB specification, It is 16-bit address assigned ++ * by the Subnet Manager. Extended to be 32-bit for OmniPath users. ++ */ ++ RDMA_NLDEV_ATTR_LID, /* u32 */ ++ RDMA_NLDEV_ATTR_SM_LID, /* u32 */ ++ ++ /* ++ * LID mask control (LMC) ++ */ ++ RDMA_NLDEV_ATTR_LMC, /* u8 */ ++ ++ RDMA_NLDEV_ATTR_PORT_STATE, /* u8 */ ++ RDMA_NLDEV_ATTR_PORT_PHYS_STATE, /* u8 */ ++ ++ RDMA_NLDEV_ATTR_DEV_NODE_TYPE, /* u8 */ ++ ++ RDMA_NLDEV_ATTR_RES_SUMMARY, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME, /* string */ ++ RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR, /* u64 */ ++ ++ RDMA_NLDEV_ATTR_RES_QP, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_QP_ENTRY, /* nested table */ ++ /* ++ * Local QPN ++ */ ++ RDMA_NLDEV_ATTR_RES_LQPN, /* u32 */ ++ /* ++ * Remote QPN, ++ * Applicable for RC and UC only IBTA 11.2.5.3 QUERY QUEUE PAIR ++ */ ++ RDMA_NLDEV_ATTR_RES_RQPN, /* u32 */ ++ /* ++ * Receive Queue PSN, ++ * Applicable for RC and UC only 11.2.5.3 QUERY QUEUE PAIR ++ */ ++ RDMA_NLDEV_ATTR_RES_RQ_PSN, /* u32 */ ++ /* ++ * Send Queue PSN ++ */ ++ RDMA_NLDEV_ATTR_RES_SQ_PSN, /* u32 */ ++ RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE, /* u8 */ ++ /* ++ * QP types as visible to RDMA/core, the reserved QPT ++ * are not exported through this interface. ++ */ ++ RDMA_NLDEV_ATTR_RES_TYPE, /* u8 */ ++ RDMA_NLDEV_ATTR_RES_STATE, /* u8 */ ++ /* ++ * Process ID which created object, ++ * in case of kernel origin, PID won't exist. ++ */ ++ RDMA_NLDEV_ATTR_RES_PID, /* u32 */ ++ /* ++ * The name of process created following resource. ++ * It will exist only for kernel objects. ++ * For user created objects, the user is supposed ++ * to read /proc/PID/comm file. ++ */ ++ RDMA_NLDEV_ATTR_RES_KERN_NAME, /* string */ ++ ++ RDMA_NLDEV_ATTR_RES_CM_ID, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_CM_ID_ENTRY, /* nested table */ ++ /* ++ * rdma_cm_id port space. ++ */ ++ RDMA_NLDEV_ATTR_RES_PS, /* u32 */ ++ /* ++ * Source and destination socket addresses ++ */ ++ RDMA_NLDEV_ATTR_RES_SRC_ADDR, /* __kernel_sockaddr_storage */ ++ RDMA_NLDEV_ATTR_RES_DST_ADDR, /* __kernel_sockaddr_storage */ ++ ++ RDMA_NLDEV_ATTR_RES_CQ, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_CQ_ENTRY, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_CQE, /* u32 */ ++ RDMA_NLDEV_ATTR_RES_USECNT, /* u64 */ ++ RDMA_NLDEV_ATTR_RES_POLL_CTX, /* u8 */ ++ ++ RDMA_NLDEV_ATTR_RES_MR, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_MR_ENTRY, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_RKEY, /* u32 */ ++ RDMA_NLDEV_ATTR_RES_LKEY, /* u32 */ ++ RDMA_NLDEV_ATTR_RES_IOVA, /* u64 */ ++ RDMA_NLDEV_ATTR_RES_MRLEN, /* u64 */ ++ ++ RDMA_NLDEV_ATTR_RES_PD, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_PD_ENTRY, /* nested table */ ++ RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY, /* u32 */ ++ RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY, /* u32 */ ++ /* ++ * Provides logical name and index of netdevice which is ++ * connected to physical port. This information is relevant ++ * for RoCE and iWARP. ++ * ++ * The netdevices which are associated with containers are ++ * supposed to be exported together with GID table once it ++ * will be exposed through the netlink. Because the ++ * associated netdevices are properties of GIDs. ++ */ ++ RDMA_NLDEV_ATTR_NDEV_INDEX, /* u32 */ ++ RDMA_NLDEV_ATTR_NDEV_NAME, /* string */ ++ /* ++ * driver-specific attributes. ++ */ ++ RDMA_NLDEV_ATTR_DRIVER, /* nested table */ ++ RDMA_NLDEV_ATTR_DRIVER_ENTRY, /* nested table */ ++ RDMA_NLDEV_ATTR_DRIVER_STRING, /* string */ ++ /* ++ * u8 values from enum rdma_nldev_print_type ++ */ ++ RDMA_NLDEV_ATTR_DRIVER_PRINT_TYPE, /* u8 */ ++ RDMA_NLDEV_ATTR_DRIVER_S32, /* s32 */ ++ RDMA_NLDEV_ATTR_DRIVER_U32, /* u32 */ ++ RDMA_NLDEV_ATTR_DRIVER_S64, /* s64 */ ++ RDMA_NLDEV_ATTR_DRIVER_U64, /* u64 */ ++ ++ /* ++ * Always the end ++ */ ++ RDMA_NLDEV_ATTR_MAX ++}; ++#endif /* _RDMA_NETLINK_H */ +diff --git a/rdma/include/uapi/rdma/rdma_user_cm.h b/rdma/include/uapi/rdma/rdma_user_cm.h +new file mode 100644 +index 0000000000000..0d1e78ebad051 +--- /dev/null ++++ b/rdma/include/uapi/rdma/rdma_user_cm.h +@@ -0,0 +1,324 @@ ++/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ ++/* ++ * Copyright (c) 2005-2006 Intel Corporation. All rights reserved. ++ * ++ * This software is available to you under a choice of one of two ++ * licenses. You may choose to be licensed under the terms of the GNU ++ * General Public License (GPL) Version 2, available from the file ++ * COPYING in the main directory of this source tree, or the ++ * OpenIB.org BSD license below: ++ * ++ * Redistribution and use in source and binary forms, with or ++ * without modification, are permitted provided that the following ++ * conditions are met: ++ * ++ * - Redistributions of source code must retain the above ++ * copyright notice, this list of conditions and the following ++ * disclaimer. ++ * ++ * - Redistributions in binary form must reproduce the above ++ * copyright notice, this list of conditions and the following ++ * disclaimer in the documentation and/or other materials ++ * provided with the distribution. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. ++ */ ++ ++#ifndef RDMA_USER_CM_H ++#define RDMA_USER_CM_H ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define RDMA_USER_CM_ABI_VERSION 4 ++ ++#define RDMA_MAX_PRIVATE_DATA 256 ++ ++enum { ++ RDMA_USER_CM_CMD_CREATE_ID, ++ RDMA_USER_CM_CMD_DESTROY_ID, ++ RDMA_USER_CM_CMD_BIND_IP, ++ RDMA_USER_CM_CMD_RESOLVE_IP, ++ RDMA_USER_CM_CMD_RESOLVE_ROUTE, ++ RDMA_USER_CM_CMD_QUERY_ROUTE, ++ RDMA_USER_CM_CMD_CONNECT, ++ RDMA_USER_CM_CMD_LISTEN, ++ RDMA_USER_CM_CMD_ACCEPT, ++ RDMA_USER_CM_CMD_REJECT, ++ RDMA_USER_CM_CMD_DISCONNECT, ++ RDMA_USER_CM_CMD_INIT_QP_ATTR, ++ RDMA_USER_CM_CMD_GET_EVENT, ++ RDMA_USER_CM_CMD_GET_OPTION, ++ RDMA_USER_CM_CMD_SET_OPTION, ++ RDMA_USER_CM_CMD_NOTIFY, ++ RDMA_USER_CM_CMD_JOIN_IP_MCAST, ++ RDMA_USER_CM_CMD_LEAVE_MCAST, ++ RDMA_USER_CM_CMD_MIGRATE_ID, ++ RDMA_USER_CM_CMD_QUERY, ++ RDMA_USER_CM_CMD_BIND, ++ RDMA_USER_CM_CMD_RESOLVE_ADDR, ++ RDMA_USER_CM_CMD_JOIN_MCAST ++}; ++ ++/* See IBTA Annex A11, servies ID bytes 4 & 5 */ ++enum rdma_ucm_port_space { ++ RDMA_PS_IPOIB = 0x0002, ++ RDMA_PS_IB = 0x013F, ++ RDMA_PS_TCP = 0x0106, ++ RDMA_PS_UDP = 0x0111, ++}; ++ ++/* ++ * command ABI structures. ++ */ ++struct rdma_ucm_cmd_hdr { ++ __u32 cmd; ++ __u16 in; ++ __u16 out; ++}; ++ ++struct rdma_ucm_create_id { ++ __aligned_u64 uid; ++ __aligned_u64 response; ++ __u16 ps; /* use enum rdma_ucm_port_space */ ++ __u8 qp_type; ++ __u8 reserved[5]; ++}; ++ ++struct rdma_ucm_create_id_resp { ++ __u32 id; ++}; ++ ++struct rdma_ucm_destroy_id { ++ __aligned_u64 response; ++ __u32 id; ++ __u32 reserved; ++}; ++ ++struct rdma_ucm_destroy_id_resp { ++ __u32 events_reported; ++}; ++ ++struct rdma_ucm_bind_ip { ++ __aligned_u64 response; ++ struct sockaddr_in6 addr; ++ __u32 id; ++}; ++ ++struct rdma_ucm_bind { ++ __u32 id; ++ __u16 addr_size; ++ __u16 reserved; ++ struct __kernel_sockaddr_storage addr; ++}; ++ ++struct rdma_ucm_resolve_ip { ++ struct sockaddr_in6 src_addr; ++ struct sockaddr_in6 dst_addr; ++ __u32 id; ++ __u32 timeout_ms; ++}; ++ ++struct rdma_ucm_resolve_addr { ++ __u32 id; ++ __u32 timeout_ms; ++ __u16 src_size; ++ __u16 dst_size; ++ __u32 reserved; ++ struct __kernel_sockaddr_storage src_addr; ++ struct __kernel_sockaddr_storage dst_addr; ++}; ++ ++struct rdma_ucm_resolve_route { ++ __u32 id; ++ __u32 timeout_ms; ++}; ++ ++enum { ++ RDMA_USER_CM_QUERY_ADDR, ++ RDMA_USER_CM_QUERY_PATH, ++ RDMA_USER_CM_QUERY_GID ++}; ++ ++struct rdma_ucm_query { ++ __aligned_u64 response; ++ __u32 id; ++ __u32 option; ++}; ++ ++struct rdma_ucm_query_route_resp { ++ __aligned_u64 node_guid; ++ struct ib_user_path_rec ib_route[2]; ++ struct sockaddr_in6 src_addr; ++ struct sockaddr_in6 dst_addr; ++ __u32 num_paths; ++ __u8 port_num; ++ __u8 reserved[3]; ++}; ++ ++struct rdma_ucm_query_addr_resp { ++ __aligned_u64 node_guid; ++ __u8 port_num; ++ __u8 reserved; ++ __u16 pkey; ++ __u16 src_size; ++ __u16 dst_size; ++ struct __kernel_sockaddr_storage src_addr; ++ struct __kernel_sockaddr_storage dst_addr; ++}; ++ ++struct rdma_ucm_query_path_resp { ++ __u32 num_paths; ++ __u32 reserved; ++ struct ib_path_rec_data path_data[0]; ++}; ++ ++struct rdma_ucm_conn_param { ++ __u32 qp_num; ++ __u32 qkey; ++ __u8 private_data[RDMA_MAX_PRIVATE_DATA]; ++ __u8 private_data_len; ++ __u8 srq; ++ __u8 responder_resources; ++ __u8 initiator_depth; ++ __u8 flow_control; ++ __u8 retry_count; ++ __u8 rnr_retry_count; ++ __u8 valid; ++}; ++ ++struct rdma_ucm_ud_param { ++ __u32 qp_num; ++ __u32 qkey; ++ struct ib_uverbs_ah_attr ah_attr; ++ __u8 private_data[RDMA_MAX_PRIVATE_DATA]; ++ __u8 private_data_len; ++ __u8 reserved[7]; ++}; ++ ++struct rdma_ucm_connect { ++ struct rdma_ucm_conn_param conn_param; ++ __u32 id; ++ __u32 reserved; ++}; ++ ++struct rdma_ucm_listen { ++ __u32 id; ++ __u32 backlog; ++}; ++ ++struct rdma_ucm_accept { ++ __aligned_u64 uid; ++ struct rdma_ucm_conn_param conn_param; ++ __u32 id; ++ __u32 reserved; ++}; ++ ++struct rdma_ucm_reject { ++ __u32 id; ++ __u8 private_data_len; ++ __u8 reserved[3]; ++ __u8 private_data[RDMA_MAX_PRIVATE_DATA]; ++}; ++ ++struct rdma_ucm_disconnect { ++ __u32 id; ++}; ++ ++struct rdma_ucm_init_qp_attr { ++ __aligned_u64 response; ++ __u32 id; ++ __u32 qp_state; ++}; ++ ++struct rdma_ucm_notify { ++ __u32 id; ++ __u32 event; ++}; ++ ++struct rdma_ucm_join_ip_mcast { ++ __aligned_u64 response; /* rdma_ucm_create_id_resp */ ++ __aligned_u64 uid; ++ struct sockaddr_in6 addr; ++ __u32 id; ++}; ++ ++/* Multicast join flags */ ++enum { ++ RDMA_MC_JOIN_FLAG_FULLMEMBER, ++ RDMA_MC_JOIN_FLAG_SENDONLY_FULLMEMBER, ++ RDMA_MC_JOIN_FLAG_RESERVED, ++}; ++ ++struct rdma_ucm_join_mcast { ++ __aligned_u64 response; /* rdma_ucma_create_id_resp */ ++ __aligned_u64 uid; ++ __u32 id; ++ __u16 addr_size; ++ __u16 join_flags; ++ struct __kernel_sockaddr_storage addr; ++}; ++ ++struct rdma_ucm_get_event { ++ __aligned_u64 response; ++}; ++ ++struct rdma_ucm_event_resp { ++ __aligned_u64 uid; ++ __u32 id; ++ __u32 event; ++ __u32 status; ++ /* ++ * NOTE: This union is not aligned to 8 bytes so none of the union ++ * members may contain a u64 or anything with higher alignment than 4. ++ */ ++ union { ++ struct rdma_ucm_conn_param conn; ++ struct rdma_ucm_ud_param ud; ++ } param; ++ __u32 reserved; ++}; ++ ++/* Option levels */ ++enum { ++ RDMA_OPTION_ID = 0, ++ RDMA_OPTION_IB = 1 ++}; ++ ++/* Option details */ ++enum { ++ RDMA_OPTION_ID_TOS = 0, ++ RDMA_OPTION_ID_REUSEADDR = 1, ++ RDMA_OPTION_ID_AFONLY = 2, ++ RDMA_OPTION_IB_PATH = 1 ++}; ++ ++struct rdma_ucm_set_option { ++ __aligned_u64 optval; ++ __u32 id; ++ __u32 level; ++ __u32 optname; ++ __u32 optlen; ++}; ++ ++struct rdma_ucm_migrate_id { ++ __aligned_u64 response; ++ __u32 id; ++ __u32 fd; ++}; ++ ++struct rdma_ucm_migrate_resp { ++ __u32 events_reported; ++}; ++ ++#endif /* RDMA_USER_CM_H */ +diff --git a/rdma/link.c b/rdma/link.c +new file mode 100644 +index 0000000000000..c064be627be2c +--- /dev/null ++++ b/rdma/link.c +@@ -0,0 +1,355 @@ ++/* ++ * link.c RDMA tool ++ * ++ * This program is free software; you can redistribute 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: Leon Romanovsky ++ */ ++ ++#include "rdma.h" ++ ++static int link_help(struct rd *rd) ++{ ++ pr_out("Usage: %s link show [DEV/PORT_INDEX]\n", rd->filename); ++ return 0; ++} ++ ++static const char *caps_to_str(uint32_t idx) ++{ ++#define RDMA_PORT_FLAGS_LOW(x) \ ++ x(RESERVED, 0) \ ++ x(SM, 1) \ ++ x(NOTICE, 2) \ ++ x(TRAP, 3) \ ++ x(OPT_IPD, 4) \ ++ x(AUTO_MIGR, 5) \ ++ x(SL_MAP, 6) \ ++ x(MKEY_NVRAM, 7) \ ++ x(PKEY_NVRAM, 8) \ ++ x(LED_INFO, 9) \ ++ x(SM_DISABLED, 10) \ ++ x(SYS_IMAGE_GUID, 11) \ ++ x(PKEY_SW_EXT_PORT_TRAP, 12) \ ++ x(CABLE_INFO, 13) \ ++ x(EXTENDED_SPEEDS, 14) \ ++ x(CAP_MASK2, 15) \ ++ x(CM, 16) \ ++ x(SNMP_TUNNEL, 17) \ ++ x(REINIT, 18) \ ++ x(DEVICE_MGMT, 19) \ ++ x(VENDOR_CLASS, 20) \ ++ x(DR_NOTICE, 21) \ ++ x(CAP_MASK_NOTICE, 22) \ ++ x(BOOT_MGMT, 23) \ ++ x(LINK_LATENCY, 24) \ ++ x(CLIENT_REG, 25) \ ++ x(OTHER_LOCAL_CHANGES, 26) \ ++ x(LINK_SPPED_WIDTH, 27) \ ++ x(VENDOR_SPECIFIC_MADS, 28) \ ++ x(MULT_PKER_TRAP, 29) \ ++ x(MULT_FDB, 30) \ ++ x(HIERARCHY_INFO, 31) ++ ++#define RDMA_PORT_FLAGS_HIGH(x) \ ++ x(SET_NODE_DESC, 0) \ ++ x(EXT_INFO, 1) \ ++ x(VIRT, 2) \ ++ x(SWITCH_POR_STATE_TABLE, 3) \ ++ x(LINK_WIDTH_2X, 4) \ ++ x(LINK_SPEED_HDR, 5) ++ ++ /* ++ * Separation below is needed to allow compilation of rdmatool ++ * on 32bits systems. On such systems, C-enum is limited to be ++ * int and can't hold more than 32 bits. ++ */ ++ enum { RDMA_PORT_FLAGS_LOW(RDMA_BITMAP_ENUM) }; ++ enum { RDMA_PORT_FLAGS_HIGH(RDMA_BITMAP_ENUM) }; ++ ++ static const char * const ++ rdma_port_names_low[] = { RDMA_PORT_FLAGS_LOW(RDMA_BITMAP_NAMES) }; ++ static const char * const ++ rdma_port_names_high[] = { RDMA_PORT_FLAGS_HIGH(RDMA_BITMAP_NAMES) }; ++ uint32_t high_idx; ++ #undef RDMA_PORT_FLAGS_LOW ++ #undef RDMA_PORT_FLAGS_HIGH ++ ++ if (idx < ARRAY_SIZE(rdma_port_names_low) && rdma_port_names_low[idx]) ++ return rdma_port_names_low[idx]; ++ ++ high_idx = idx - ARRAY_SIZE(rdma_port_names_low); ++ if (high_idx < ARRAY_SIZE(rdma_port_names_high) && ++ rdma_port_names_high[high_idx]) ++ return rdma_port_names_high[high_idx]; ++ ++ return "UNKNOWN"; ++} ++ ++static void link_print_caps(struct rd *rd, struct nlattr **tb) ++{ ++ uint64_t caps; ++ uint32_t idx; ++ ++ if (!tb[RDMA_NLDEV_ATTR_CAP_FLAGS]) ++ return; ++ ++ caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]); ++ ++ if (rd->json_output) { ++ jsonw_name(rd->jw, "caps"); ++ jsonw_start_array(rd->jw); ++ } else { ++ pr_out("\n caps: <"); ++ } ++ for (idx = 0; caps; idx++) { ++ if (caps & 0x1) { ++ if (rd->json_output) { ++ jsonw_string(rd->jw, caps_to_str(idx)); ++ } else { ++ pr_out("%s", caps_to_str(idx)); ++ if (caps >> 0x1) ++ pr_out(", "); ++ } ++ } ++ caps >>= 0x1; ++ } ++ ++ if (rd->json_output) ++ jsonw_end_array(rd->jw); ++ else ++ pr_out(">"); ++} ++ ++static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb) ++{ ++ uint64_t subnet_prefix; ++ uint16_t vp[4]; ++ char str[32]; ++ ++ if (!tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]) ++ return; ++ ++ subnet_prefix = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]); ++ memcpy(vp, &subnet_prefix, sizeof(uint64_t)); ++ snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "subnet_prefix", str); ++ else ++ pr_out("subnet_prefix %s ", str); ++} ++ ++static void link_print_lid(struct rd *rd, struct nlattr **tb) ++{ ++ uint32_t lid; ++ ++ if (!tb[RDMA_NLDEV_ATTR_LID]) ++ return; ++ ++ lid = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_LID]); ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "lid", lid); ++ else ++ pr_out("lid %u ", lid); ++} ++ ++static void link_print_sm_lid(struct rd *rd, struct nlattr **tb) ++{ ++ uint32_t sm_lid; ++ ++ if (!tb[RDMA_NLDEV_ATTR_SM_LID]) ++ return; ++ ++ sm_lid = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_SM_LID]); ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "sm_lid", sm_lid); ++ else ++ pr_out("sm_lid %u ", sm_lid); ++} ++ ++static void link_print_lmc(struct rd *rd, struct nlattr **tb) ++{ ++ uint8_t lmc; ++ ++ if (!tb[RDMA_NLDEV_ATTR_LMC]) ++ return; ++ ++ lmc = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_LMC]); ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "lmc", lmc); ++ else ++ pr_out("lmc %u ", lmc); ++} ++ ++static const char *link_state_to_str(uint8_t link_state) ++{ ++ static const char * const link_state_str[] = { "NOP", "DOWN", ++ "INIT", "ARMED", ++ "ACTIVE", ++ "ACTIVE_DEFER" }; ++ if (link_state < ARRAY_SIZE(link_state_str)) ++ return link_state_str[link_state]; ++ return "UNKNOWN"; ++} ++ ++static void link_print_state(struct rd *rd, struct nlattr **tb) ++{ ++ uint8_t state; ++ ++ if (!tb[RDMA_NLDEV_ATTR_PORT_STATE]) ++ return; ++ ++ state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_STATE]); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "state", link_state_to_str(state)); ++ else ++ pr_out("state %s ", link_state_to_str(state)); ++} ++ ++static const char *phys_state_to_str(uint8_t phys_state) ++{ ++ static const char * const phys_state_str[] = { "NOP", "SLEEP", ++ "POLLING", "DISABLED", ++ "ARMED", "LINK_UP", ++ "LINK_ERROR_RECOVER", ++ "PHY_TEST", "UNKNOWN", ++ "OPA_OFFLINE", ++ "UNKNOWN", "OPA_TEST" }; ++ if (phys_state < ARRAY_SIZE(phys_state_str)) ++ return phys_state_str[phys_state]; ++ return "UNKNOWN"; ++}; ++ ++static void link_print_phys_state(struct rd *rd, struct nlattr **tb) ++{ ++ uint8_t phys_state; ++ ++ if (!tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]) ++ return; ++ ++ phys_state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]); ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "physical_state", ++ phys_state_to_str(phys_state)); ++ else ++ pr_out("physical_state %s ", phys_state_to_str(phys_state)); ++} ++ ++static void link_print_netdev(struct rd *rd, struct nlattr **tb) ++{ ++ const char *netdev_name; ++ uint32_t idx; ++ ++ if (!tb[RDMA_NLDEV_ATTR_NDEV_NAME] || !tb[RDMA_NLDEV_ATTR_NDEV_INDEX]) ++ return; ++ ++ netdev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_NDEV_NAME]); ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_NDEV_INDEX]); ++ if (rd->json_output) { ++ jsonw_string_field(rd->jw, "netdev", netdev_name); ++ jsonw_uint_field(rd->jw, "netdev_index", idx); ++ } else { ++ pr_out("netdev %s ", netdev_name); ++ if (rd->show_details) ++ pr_out("netdev_index %u ", idx); ++ } ++} ++ ++static int link_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct rd *rd = data; ++ uint32_t port, idx; ++ char name[32]; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) ++ return MNL_CB_ERROR; ++ ++ if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) { ++ pr_err("This tool doesn't support switches yet\n"); ++ return MNL_CB_ERROR; ++ } ++ ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ port = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); ++ snprintf(name, 32, "%s/%u", ++ mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]), port); ++ ++ if (rd->json_output) { ++ jsonw_uint_field(rd->jw, "ifindex", idx); ++ jsonw_uint_field(rd->jw, "port", port); ++ jsonw_string_field(rd->jw, "ifname", name); ++ ++ } else { ++ pr_out("%u/%u: %s: ", idx, port, name); ++ } ++ ++ link_print_subnet_prefix(rd, tb); ++ link_print_lid(rd, tb); ++ link_print_sm_lid(rd, tb); ++ link_print_lmc(rd, tb); ++ link_print_state(rd, tb); ++ link_print_phys_state(rd, tb); ++ link_print_netdev(rd, tb); ++ if (rd->show_details) ++ link_print_caps(rd, tb); ++ ++ if (!rd->json_output) ++ pr_out("\n"); ++ return MNL_CB_OK; ++} ++ ++static int link_no_args(struct rd *rd) ++{ ++ uint32_t seq; ++ int ret; ++ ++ rd_prepare_msg(rd, RDMA_NLDEV_CMD_PORT_GET, &seq, ++ (NLM_F_REQUEST | NLM_F_ACK)); ++ mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); ++ mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); ++ ret = rd_send_msg(rd); ++ if (ret) ++ return ret; ++ ++ if (rd->json_output) ++ jsonw_start_object(rd->jw); ++ ret = rd_recv_msg(rd, link_parse_cb, rd, seq); ++ if (rd->json_output) ++ jsonw_end_object(rd->jw); ++ return ret; ++} ++ ++static int link_one_show(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, link_no_args}, ++ { 0 } ++ }; ++ ++ if (!rd->port_idx) ++ return 0; ++ ++ return rd_exec_cmd(rd, cmds, "parameter"); ++} ++ ++static int link_show(struct rd *rd) ++{ ++ return rd_exec_link(rd, link_one_show, true); ++} ++ ++int cmd_link(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, link_show }, ++ { "show", link_show }, ++ { "list", link_show }, ++ { "help", link_help }, ++ { 0 } ++ }; ++ ++ return rd_exec_cmd(rd, cmds, "link command"); ++} +diff --git a/rdma/rdma.c b/rdma/rdma.c +new file mode 100644 +index 0000000000000..010e98371ef09 +--- /dev/null ++++ b/rdma/rdma.c +@@ -0,0 +1,203 @@ ++/* ++ * rdma.c RDMA tool ++ * ++ * This program is free software; you can redistribute 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: Leon Romanovsky ++ */ ++ ++#include "rdma.h" ++#include "SNAPSHOT.h" ++ ++static void help(char *name) ++{ ++ pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n" ++ " %s [ -f[orce] ] -b[atch] filename\n" ++ "where OBJECT := { dev | link | resource | help }\n" ++ " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty]}\n", name, name); ++} ++ ++static int cmd_help(struct rd *rd) ++{ ++ help(rd->filename); ++ return 0; ++} ++ ++static int rd_cmd(struct rd *rd, int argc, char **argv) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, cmd_help }, ++ { "help", cmd_help }, ++ { "dev", cmd_dev }, ++ { "link", cmd_link }, ++ { "resource", cmd_res }, ++ { 0 } ++ }; ++ ++ rd->argc = argc; ++ rd->argv = argv; ++ ++ return rd_exec_cmd(rd, cmds, "object"); ++} ++ ++static int rd_batch(struct rd *rd, const char *name, bool force) ++{ ++ char *line = NULL; ++ size_t len = 0; ++ int ret = 0; ++ ++ if (name && strcmp(name, "-") != 0) { ++ if (!freopen(name, "r", stdin)) { ++ pr_err("Cannot open file \"%s\" for reading: %s\n", ++ name, strerror(errno)); ++ return errno; ++ } ++ } ++ ++ cmdlineno = 0; ++ while (getcmdline(&line, &len, stdin) != -1) { ++ char *largv[512]; ++ int largc; ++ ++ largc = makeargs(line, largv, ARRAY_SIZE(largv)); ++ if (!largc) ++ continue; /* blank line */ ++ ++ ret = rd_cmd(rd, largc, largv); ++ if (ret) { ++ pr_err("Command failed %s:%d\n", name, cmdlineno); ++ if (!force) ++ break; ++ } ++ } ++ ++ free(line); ++ ++ return ret; ++} ++ ++static int rd_init(struct rd *rd, char *filename) ++{ ++ uint32_t seq; ++ int ret; ++ ++ rd->filename = filename; ++ INIT_LIST_HEAD(&rd->dev_map_list); ++ INIT_LIST_HEAD(&rd->filter_list); ++ ++ if (rd->json_output) { ++ rd->jw = jsonw_new(stdout); ++ if (!rd->jw) { ++ pr_err("Failed to create JSON writer\n"); ++ return -ENOMEM; ++ } ++ jsonw_pretty(rd->jw, rd->pretty_output); ++ } ++ ++ rd->buff = malloc(MNL_SOCKET_BUFFER_SIZE); ++ if (!rd->buff) ++ return -ENOMEM; ++ ++ rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET, ++ &seq, (NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP)); ++ ret = rd_send_msg(rd); ++ if (ret) ++ return ret; ++ ++ return rd_recv_msg(rd, rd_dev_init_cb, rd, seq); ++} ++ ++static void rd_cleanup(struct rd *rd) ++{ ++ if (rd->json_output) ++ jsonw_destroy(&rd->jw); ++ rd_free(rd); ++} ++ ++int main(int argc, char **argv) ++{ ++ static const struct option long_options[] = { ++ { "version", no_argument, NULL, 'V' }, ++ { "help", no_argument, NULL, 'h' }, ++ { "json", no_argument, NULL, 'j' }, ++ { "pretty", no_argument, NULL, 'p' }, ++ { "details", no_argument, NULL, 'd' }, ++ { "force", no_argument, NULL, 'f' }, ++ { "batch", required_argument, NULL, 'b' }, ++ { NULL, 0, NULL, 0 } ++ }; ++ bool show_driver_details = false; ++ const char *batch_file = NULL; ++ bool pretty_output = false; ++ bool show_details = false; ++ bool json_output = false; ++ bool force = false; ++ struct rd rd = {}; ++ char *filename; ++ int opt; ++ int err; ++ ++ filename = basename(argv[0]); ++ ++ while ((opt = getopt_long(argc, argv, ":Vhdpjfb:", ++ long_options, NULL)) >= 0) { ++ switch (opt) { ++ case 'V': ++ printf("%s utility, iproute2-ss%s\n", ++ filename, SNAPSHOT); ++ return EXIT_SUCCESS; ++ case 'p': ++ pretty_output = true; ++ break; ++ case 'd': ++ if (show_details) ++ show_driver_details = true; ++ else ++ show_details = true; ++ break; ++ case 'j': ++ json_output = true; ++ break; ++ case 'f': ++ force = true; ++ break; ++ case 'b': ++ batch_file = optarg; ++ break; ++ case 'h': ++ help(filename); ++ return EXIT_SUCCESS; ++ case ':': ++ pr_err("-%c option requires an argument\n", optopt); ++ return EXIT_FAILURE; ++ default: ++ pr_err("Unknown option.\n"); ++ help(filename); ++ return EXIT_FAILURE; ++ } ++ } ++ ++ argc -= optind; ++ argv += optind; ++ ++ rd.show_details = show_details; ++ rd.show_driver_details = show_driver_details; ++ rd.json_output = json_output; ++ rd.pretty_output = pretty_output; ++ ++ err = rd_init(&rd, filename); ++ if (err) ++ goto out; ++ ++ if (batch_file) ++ err = rd_batch(&rd, batch_file, force); ++ else ++ err = rd_cmd(&rd, argc, argv); ++out: ++ /* Always cleanup */ ++ rd_cleanup(&rd); ++ return err ? EXIT_FAILURE : EXIT_SUCCESS; ++} +diff --git a/rdma/rdma.h b/rdma/rdma.h +new file mode 100644 +index 0000000000000..547bb5749a39f +--- /dev/null ++++ b/rdma/rdma.h +@@ -0,0 +1,131 @@ ++/* ++ * rdma.c RDMA tool ++ * ++ * This program is free software; you can redistribute 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: Leon Romanovsky ++ */ ++#ifndef _RDMA_TOOL_H_ ++#define _RDMA_TOOL_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "list.h" ++#include "utils.h" ++#include "json_writer.h" ++ ++#define pr_err(args...) fprintf(stderr, ##args) ++#define pr_out(args...) fprintf(stdout, ##args) ++ ++#define RDMA_BITMAP_ENUM(name, bit_no) RDMA_BITMAP_##name = BIT(bit_no), ++#define RDMA_BITMAP_NAMES(name, bit_no) [bit_no] = #name, ++ ++#define MAX_NUMBER_OF_FILTERS 64 ++struct filters { ++ const char *name; ++ bool is_number; ++}; ++ ++struct filter_entry { ++ struct list_head list; ++ char *key; ++ char *value; ++}; ++ ++struct dev_map { ++ struct list_head list; ++ char *dev_name; ++ uint32_t num_ports; ++ uint32_t idx; ++}; ++ ++struct rd { ++ int argc; ++ char **argv; ++ char *filename; ++ bool show_details; ++ bool show_driver_details; ++ struct list_head dev_map_list; ++ uint32_t dev_idx; ++ uint32_t port_idx; ++ struct mnl_socket *nl; ++ struct nlmsghdr *nlh; ++ char *buff; ++ json_writer_t *jw; ++ bool json_output; ++ bool pretty_output; ++ struct list_head filter_list; ++}; ++ ++struct rd_cmd { ++ const char *cmd; ++ int (*func)(struct rd *rd); ++}; ++ ++/* ++ * Parser interface ++ */ ++bool rd_no_arg(struct rd *rd); ++void rd_arg_inc(struct rd *rd); ++ ++char *rd_argv(struct rd *rd); ++ ++/* ++ * Commands interface ++ */ ++int cmd_dev(struct rd *rd); ++int cmd_link(struct rd *rd); ++int cmd_res(struct rd *rd); ++int rd_exec_cmd(struct rd *rd, const struct rd_cmd *c, const char *str); ++int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd)); ++int rd_exec_require_dev(struct rd *rd, int (*cb)(struct rd *rd)); ++int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port); ++void rd_free(struct rd *rd); ++int rd_set_arg_to_devname(struct rd *rd); ++int rd_argc(struct rd *rd); ++ ++int strcmpx(const char *str1, const char *str2); ++ ++/* ++ * Device manipulation ++ */ ++struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index); ++ ++/* ++ * Filter manipulation ++ */ ++int rd_build_filter(struct rd *rd, const struct filters valid_filters[]); ++bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val); ++bool rd_check_is_string_filtered(struct rd *rd, const char *key, const char *val); ++bool rd_check_is_key_exist(struct rd *rd, const char *key); ++/* ++ * Netlink ++ */ ++int rd_send_msg(struct rd *rd); ++int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, uint32_t seq); ++void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags); ++int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data); ++int rd_attr_cb(const struct nlattr *attr, void *data); ++int rd_attr_check(const struct nlattr *attr, int *typep); ++ ++/* ++ * Print helpers ++ */ ++void print_driver_table(struct rd *rd, struct nlattr *tb); ++void newline(struct rd *rd); ++void newline_indent(struct rd *rd); ++#define MAX_LINE_LENGTH 80 ++ ++#endif /* _RDMA_TOOL_H_ */ +diff --git a/rdma/res.c b/rdma/res.c +new file mode 100644 +index 0000000000000..cbb2efe6c7235 +--- /dev/null ++++ b/rdma/res.c +@@ -0,0 +1,1111 @@ ++/* ++ * res.c RDMA tool ++ * ++ * This program is free software; you can redistribute 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: Leon Romanovsky ++ */ ++ ++#include "rdma.h" ++#include ++ ++static int res_help(struct rd *rd) ++{ ++ pr_out("Usage: %s resource\n", rd->filename); ++ pr_out(" resource show [DEV]\n"); ++ pr_out(" resource show [qp|cm_id|pd|mr|cq]\n"); ++ pr_out(" resource show qp link [DEV/PORT]\n"); ++ pr_out(" resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n"); ++ pr_out(" resource show cm_id link [DEV/PORT]\n"); ++ pr_out(" resource show cm_id link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n"); ++ pr_out(" resource show cq link [DEV/PORT]\n"); ++ pr_out(" resource show cq link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n"); ++ pr_out(" resource show pd dev [DEV]\n"); ++ pr_out(" resource show pd dev [DEV] [FILTER-NAME FILTER-VALUE]\n"); ++ pr_out(" resource show mr dev [DEV]\n"); ++ pr_out(" resource show mr dev [DEV] [FILTER-NAME FILTER-VALUE]\n"); ++ return 0; ++} ++ ++static int res_print_summary(struct rd *rd, struct nlattr **tb) ++{ ++ struct nlattr *nla_table = tb[RDMA_NLDEV_ATTR_RES_SUMMARY]; ++ struct nlattr *nla_entry; ++ const char *name; ++ uint64_t curr; ++ int err; ++ ++ mnl_attr_for_each_nested(nla_entry, nla_table) { ++ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; ++ char json_name[32]; ++ ++ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] || ++ !nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]) { ++ return -EINVAL; ++ } ++ ++ name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]); ++ curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); ++ if (rd->json_output) { ++ snprintf(json_name, 32, "%s", name); ++ jsonw_lluint_field(rd->jw, json_name, curr); ++ } else { ++ pr_out("%s %"PRId64 " ", name, curr); ++ } ++ } ++ return 0; ++} ++ ++static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct rd *rd = data; ++ const char *name; ++ uint32_t idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || ++ !tb[RDMA_NLDEV_ATTR_DEV_NAME] || ++ !tb[RDMA_NLDEV_ATTR_RES_SUMMARY]) ++ return MNL_CB_ERROR; ++ ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ if (rd->json_output) { ++ jsonw_uint_field(rd->jw, "ifindex", idx); ++ jsonw_string_field(rd->jw, "ifname", name); ++ } else { ++ pr_out("%u: %s: ", idx, name); ++ } ++ ++ res_print_summary(rd, tb); ++ ++ if (!rd->json_output) ++ pr_out("\n"); ++ return MNL_CB_OK; ++} ++ ++static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) ++{ ++ uint32_t flags = NLM_F_REQUEST | NLM_F_ACK; ++ uint32_t seq; ++ int ret; ++ ++ if (command != RDMA_NLDEV_CMD_RES_GET) ++ flags |= NLM_F_DUMP; ++ ++ rd_prepare_msg(rd, command, &seq, flags); ++ mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx); ++ if (rd->port_idx) ++ mnl_attr_put_u32(rd->nlh, ++ RDMA_NLDEV_ATTR_PORT_INDEX, rd->port_idx); ++ ++ ret = rd_send_msg(rd); ++ if (ret) ++ return ret; ++ ++ if (rd->json_output) ++ jsonw_start_object(rd->jw); ++ ret = rd_recv_msg(rd, callback, rd, seq); ++ if (rd->json_output) ++ jsonw_end_object(rd->jw); ++ return ret; ++} ++ ++#define RES_FUNC(name, command, valid_filters, strict_port) \ ++ static int _##name(struct rd *rd)\ ++ { \ ++ return _res_send_msg(rd, command, name##_parse_cb); \ ++ } \ ++ static int name(struct rd *rd) \ ++ {\ ++ int ret = rd_build_filter(rd, valid_filters); \ ++ if (ret) \ ++ return ret; \ ++ if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \ ++ ret = rd_set_arg_to_devname(rd); \ ++ if (ret) \ ++ return ret;\ ++ } \ ++ if (strict_port) \ ++ return rd_exec_dev(rd, _##name); \ ++ else \ ++ return rd_exec_link(rd, _##name, strict_port); \ ++ } ++ ++static const char *path_mig_to_str(uint8_t idx) ++{ ++ static const char * const path_mig_str[] = { "MIGRATED", ++ "REARM", "ARMED" }; ++ ++ if (idx < ARRAY_SIZE(path_mig_str)) ++ return path_mig_str[idx]; ++ return "UNKNOWN"; ++} ++ ++static const char *qp_states_to_str(uint8_t idx) ++{ ++ static const char * const qp_states_str[] = { "RESET", "INIT", ++ "RTR", "RTS", "SQD", ++ "SQE", "ERR" }; ++ ++ if (idx < ARRAY_SIZE(qp_states_str)) ++ return qp_states_str[idx]; ++ return "UNKNOWN"; ++} ++ ++static const char *qp_types_to_str(uint8_t idx) ++{ ++ static const char * const qp_types_str[] = { "SMI", "GSI", "RC", ++ "UC", "UD", "RAW_IPV6", ++ "RAW_ETHERTYPE", ++ "UNKNOWN", "RAW_PACKET", ++ "XRC_INI", "XRC_TGT" }; ++ ++ if (idx < ARRAY_SIZE(qp_types_str)) ++ return qp_types_str[idx]; ++ return "UNKNOWN"; ++} ++ ++static void print_lqpn(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "lqpn", val); ++ else ++ pr_out("lqpn %u ", val); ++} ++ ++static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line) ++{ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) ++ return; ++ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "rqpn", val); ++ else ++ pr_out("rqpn %u ", val); ++} ++ ++static void print_type(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "type", ++ qp_types_to_str(val)); ++ else ++ pr_out("type %s ", qp_types_to_str(val)); ++} ++ ++static void print_state(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "state", ++ qp_states_to_str(val)); ++ else ++ pr_out("state %s ", qp_states_to_str(val)); ++} ++ ++static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line) ++{ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) ++ return; ++ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "rq-psn", val); ++ else ++ pr_out("rq-psn %u ", val); ++} ++ ++static void print_sqpsn(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "sq-psn", val); ++ else ++ pr_out("sq-psn %u ", val); ++} ++ ++static void print_pathmig(struct rd *rd, uint32_t val, ++ struct nlattr **nla_line) ++{ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) ++ return; ++ ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, ++ "path-mig-state", ++ path_mig_to_str(val)); ++ else ++ pr_out("path-mig-state %s ", path_mig_to_str(val)); ++} ++ ++static void print_pid(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "pid", val); ++ else ++ pr_out("pid %u ", val); ++} ++ ++static void print_comm(struct rd *rd, const char *str, ++ struct nlattr **nla_line) ++{ ++ char tmp[18]; ++ ++ if (rd->json_output) { ++ /* Don't beatify output in JSON format */ ++ jsonw_string_field(rd->jw, "comm", str); ++ return; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) ++ snprintf(tmp, sizeof(tmp), "%s", str); ++ else ++ snprintf(tmp, sizeof(tmp), "[%s]", str); ++ ++ pr_out("comm %s ", tmp); ++} ++ ++static void print_dev(struct rd *rd, uint32_t idx, const char *name) ++{ ++ if (rd->json_output) { ++ jsonw_uint_field(rd->jw, "ifindex", idx); ++ jsonw_string_field(rd->jw, "ifname", name); ++ } else { ++ pr_out("dev %s ", name); ++ } ++} ++ ++static void print_link(struct rd *rd, uint32_t idx, const char *name, ++ uint32_t port, struct nlattr **nla_line) ++{ ++ if (rd->json_output) { ++ jsonw_uint_field(rd->jw, "ifindex", idx); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) ++ jsonw_uint_field(rd->jw, "port", port); ++ ++ jsonw_string_field(rd->jw, "ifname", name); ++ } else { ++ if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) ++ pr_out("link %s/%u ", name, port); ++ else ++ pr_out("link %s/- ", name); ++ } ++} ++ ++static char *get_task_name(uint32_t pid) ++{ ++ char *comm; ++ FILE *f; ++ ++ if (asprintf(&comm, "/proc/%d/comm", pid) < 0) ++ return NULL; ++ ++ f = fopen(comm, "r"); ++ free(comm); ++ if (!f) ++ return NULL; ++ ++ if (fscanf(f, "%ms\n", &comm) != 1) ++ comm = NULL; ++ ++ fclose(f); ++ ++ return comm; ++} ++ ++static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct nlattr *nla_table, *nla_entry; ++ struct rd *rd = data; ++ const char *name; ++ uint32_t idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || ++ !tb[RDMA_NLDEV_ATTR_DEV_NAME] || ++ !tb[RDMA_NLDEV_ATTR_RES_QP]) ++ return MNL_CB_ERROR; ++ ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ nla_table = tb[RDMA_NLDEV_ATTR_RES_QP]; ++ ++ mnl_attr_for_each_nested(nla_entry, nla_table) { ++ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; ++ uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; ++ uint8_t type, state, path_mig_state = 0; ++ uint32_t port = 0, pid = 0; ++ char *comm = NULL; ++ int err; ++ ++ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); ++ if (err != MNL_CB_OK) ++ return MNL_CB_ERROR; ++ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || ++ !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || ++ !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] || ++ !nla_line[RDMA_NLDEV_ATTR_RES_STATE] || ++ (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && ++ !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { ++ return MNL_CB_ERROR; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) ++ port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); ++ ++ if (port != rd->port_idx) ++ continue; ++ ++ lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); ++ if (rd_check_is_filtered(rd, "lqpn", lqpn)) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { ++ rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); ++ if (rd_check_is_filtered(rd, "rqpn", rqpn)) ++ continue; ++ } else { ++ if (rd_check_is_key_exist(rd, "rqpn")) ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) { ++ rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]); ++ if (rd_check_is_filtered(rd, "rq-psn", rq_psn)) ++ continue; ++ } else { ++ if (rd_check_is_key_exist(rd, "rq-psn")) ++ continue; ++ } ++ ++ sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); ++ if (rd_check_is_filtered(rd, "sq-psn", sq_psn)) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) { ++ path_mig_state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]); ++ if (rd_check_is_string_filtered(rd, "path-mig-state", path_mig_to_str(path_mig_state))) ++ continue; ++ } else { ++ if (rd_check_is_key_exist(rd, "path-mig-state")) ++ continue; ++ } ++ ++ type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); ++ if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type))) ++ continue; ++ ++ state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); ++ if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state))) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { ++ pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); ++ comm = get_task_name(pid); ++ } ++ ++ if (rd_check_is_filtered(rd, "pid", pid)) { ++ free(comm); ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) ++ /* discard const from mnl_attr_get_str */ ++ comm = (char *)mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ ++ print_link(rd, idx, name, port, nla_line); ++ ++ print_lqpn(rd, lqpn); ++ print_rqpn(rd, rqpn, nla_line); ++ ++ print_type(rd, type); ++ print_state(rd, state); ++ ++ print_rqpsn(rd, rq_psn, nla_line); ++ print_sqpsn(rd, sq_psn); ++ ++ print_pathmig(rd, path_mig_state, nla_line); ++ print_pid(rd, pid); ++ print_comm(rd, comm, nla_line); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) ++ free(comm); ++ ++ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); ++ newline(rd); ++ } ++ return MNL_CB_OK; ++} ++ ++static void print_qp_type(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_string_field(rd->jw, "qp-type", ++ qp_types_to_str(val)); ++ else ++ pr_out("qp-type %s ", qp_types_to_str(val)); ++} ++ ++static const char *cm_id_state_to_str(uint8_t idx) ++{ ++ static const char * const cm_id_states_str[] = { ++ "IDLE", "ADDR_QUERY", "ADDR_RESOLVED", "ROUTE_QUERY", ++ "ROUTE_RESOLVED", "CONNECT", "DISCONNECT", "ADDR_BOUND", ++ "LISTEN", "DEVICE_REMOVAL", "DESTROYING" }; ++ ++ if (idx < ARRAY_SIZE(cm_id_states_str)) ++ return cm_id_states_str[idx]; ++ return "UNKNOWN"; ++} ++ ++static const char *cm_id_ps_to_str(uint32_t ps) ++{ ++ switch (ps) { ++ case RDMA_PS_IPOIB: ++ return "IPoIB"; ++ case RDMA_PS_IB: ++ return "IPoIB"; ++ case RDMA_PS_TCP: ++ return "TCP"; ++ case RDMA_PS_UDP: ++ return "UDP"; ++ default: ++ return "---"; ++ } ++} ++ ++static void print_cm_id_state(struct rd *rd, uint8_t state) ++{ ++ if (rd->json_output) { ++ jsonw_string_field(rd->jw, "state", cm_id_state_to_str(state)); ++ return; ++ } ++ pr_out("state %s ", cm_id_state_to_str(state)); ++} ++ ++static void print_ps(struct rd *rd, uint32_t ps) ++{ ++ if (rd->json_output) { ++ jsonw_string_field(rd->jw, "ps", cm_id_ps_to_str(ps)); ++ return; ++ } ++ pr_out("ps %s ", cm_id_ps_to_str(ps)); ++} ++ ++static void print_ipaddr(struct rd *rd, const char *key, char *addrstr, ++ uint16_t port) ++{ ++ if (rd->json_output) { ++ int name_size = INET6_ADDRSTRLEN+strlen(":65535"); ++ char json_name[name_size]; ++ ++ snprintf(json_name, name_size, "%s:%u", addrstr, port); ++ jsonw_string_field(rd->jw, key, json_name); ++ return; ++ } ++ pr_out("%s %s:%u ", key, addrstr, port); ++} ++ ++static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) ++{ ++ struct __kernel_sockaddr_storage *addr; ++ ++ addr = (struct __kernel_sockaddr_storage *) ++ mnl_attr_get_payload(nla_line); ++ switch (addr->ss_family) { ++ case AF_INET: { ++ struct sockaddr_in *sin = (struct sockaddr_in *)addr; ++ ++ if (!inet_ntop(AF_INET, (const void *)&sin->sin_addr, addr_str, ++ INET6_ADDRSTRLEN)) ++ return -EINVAL; ++ *port = ntohs(sin->sin_port); ++ break; ++ } ++ case AF_INET6: { ++ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; ++ ++ if (!inet_ntop(AF_INET6, (const void *)&sin6->sin6_addr, ++ addr_str, INET6_ADDRSTRLEN)) ++ return -EINVAL; ++ *port = ntohs(sin6->sin6_port); ++ break; ++ } ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct nlattr *nla_table, *nla_entry; ++ struct rd *rd = data; ++ const char *name; ++ int idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || ++ !tb[RDMA_NLDEV_ATTR_DEV_NAME] || ++ !tb[RDMA_NLDEV_ATTR_RES_CM_ID]) ++ return MNL_CB_ERROR; ++ ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ nla_table = tb[RDMA_NLDEV_ATTR_RES_CM_ID]; ++ mnl_attr_for_each_nested(nla_entry, nla_table) { ++ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; ++ char src_addr_str[INET6_ADDRSTRLEN]; ++ char dst_addr_str[INET6_ADDRSTRLEN]; ++ uint16_t src_port, dst_port; ++ uint32_t port = 0, pid = 0; ++ uint8_t type = 0, state; ++ uint32_t lqpn = 0, ps; ++ char *comm = NULL; ++ int err; ++ ++ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); ++ if (err != MNL_CB_OK) ++ return -EINVAL; ++ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || ++ !nla_line[RDMA_NLDEV_ATTR_RES_PS] || ++ (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && ++ !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { ++ return MNL_CB_ERROR; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) ++ port = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]); ++ ++ if (port && port != rd->port_idx) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) { ++ lqpn = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); ++ if (rd_check_is_filtered(rd, "lqpn", lqpn)) ++ continue; ++ } ++ if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) { ++ type = mnl_attr_get_u8( ++ nla_line[RDMA_NLDEV_ATTR_RES_TYPE]); ++ if (rd_check_is_string_filtered(rd, "qp-type", ++ qp_types_to_str(type))) ++ continue; ++ } ++ ++ ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]); ++ if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps))) ++ continue; ++ ++ state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]); ++ if (rd_check_is_string_filtered(rd, "state", ++ cm_id_state_to_str(state))) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) { ++ if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR], ++ src_addr_str, &src_port)) ++ continue; ++ if (rd_check_is_string_filtered(rd, "src-addr", ++ src_addr_str)) ++ continue; ++ if (rd_check_is_filtered(rd, "src-port", src_port)) ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { ++ if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR], ++ dst_addr_str, &dst_port)) ++ continue; ++ if (rd_check_is_string_filtered(rd, "dst-addr", ++ dst_addr_str)) ++ continue; ++ if (rd_check_is_filtered(rd, "dst-port", dst_port)) ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { ++ pid = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_PID]); ++ comm = get_task_name(pid); ++ } ++ ++ if (rd_check_is_filtered(rd, "pid", pid)) { ++ free(comm); ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { ++ /* discard const from mnl_attr_get_str */ ++ comm = (char *)mnl_attr_get_str( ++ nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); ++ } ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ ++ print_link(rd, idx, name, port, nla_line); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) ++ print_lqpn(rd, lqpn); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) ++ print_qp_type(rd, type); ++ print_cm_id_state(rd, state); ++ print_ps(rd, ps); ++ print_pid(rd, pid); ++ print_comm(rd, comm, nla_line); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) ++ print_ipaddr(rd, "src-addr", src_addr_str, src_port); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) ++ print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) ++ free(comm); ++ ++ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); ++ newline(rd); ++ } ++ return MNL_CB_OK; ++} ++ ++static void print_cqe(struct rd *rd, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "cqe", val); ++ else ++ pr_out("cqe %u ", val); ++} ++ ++static void print_users(struct rd *rd, uint64_t val) ++{ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "users", val); ++ else ++ pr_out("users %" PRIu64 " ", val); ++} ++ ++static const char *poll_ctx_to_str(uint8_t idx) ++{ ++ static const char * const cm_id_states_str[] = { ++ "DIRECT", "SOFTIRQ", "WORKQUEUE"}; ++ ++ if (idx < ARRAY_SIZE(cm_id_states_str)) ++ return cm_id_states_str[idx]; ++ return "UNKNOWN"; ++} ++ ++static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx) ++{ ++ if (rd->json_output) { ++ jsonw_string_field(rd->jw, "poll-ctx", ++ poll_ctx_to_str(poll_ctx)); ++ return; ++ } ++ pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx)); ++} ++ ++static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct nlattr *nla_table, *nla_entry; ++ struct rd *rd = data; ++ const char *name; ++ uint32_t idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || ++ !tb[RDMA_NLDEV_ATTR_DEV_NAME] || ++ !tb[RDMA_NLDEV_ATTR_RES_CQ]) ++ return MNL_CB_ERROR; ++ ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ]; ++ ++ mnl_attr_for_each_nested(nla_entry, nla_table) { ++ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; ++ char *comm = NULL; ++ uint32_t pid = 0; ++ uint8_t poll_ctx = 0; ++ uint64_t users; ++ uint32_t cqe; ++ int err; ++ ++ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); ++ if (err != MNL_CB_OK) ++ return MNL_CB_ERROR; ++ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || ++ !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || ++ (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && ++ !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { ++ return MNL_CB_ERROR; ++ } ++ ++ cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); ++ ++ users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); ++ if (rd_check_is_filtered(rd, "users", users)) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { ++ poll_ctx = mnl_attr_get_u8( ++ nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); ++ if (rd_check_is_string_filtered(rd, "poll-ctx", ++ poll_ctx_to_str(poll_ctx))) ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { ++ pid = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_PID]); ++ comm = get_task_name(pid); ++ } ++ ++ if (rd_check_is_filtered(rd, "pid", pid)) { ++ free(comm); ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) ++ /* discard const from mnl_attr_get_str */ ++ comm = (char *)mnl_attr_get_str( ++ nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ ++ print_dev(rd, idx, name); ++ print_cqe(rd, cqe); ++ print_users(rd, users); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) ++ print_poll_ctx(rd, poll_ctx); ++ print_pid(rd, pid); ++ print_comm(rd, comm, nla_line); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) ++ free(comm); ++ ++ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); ++ newline(rd); ++ } ++ return MNL_CB_OK; ++} ++ ++static void print_key(struct rd *rd, const char *name, uint32_t val) ++{ ++ if (rd->json_output) ++ jsonw_xint_field(rd->jw, name, val); ++ else ++ pr_out("%s 0x%x ", name, val); ++} ++ ++static void print_iova(struct rd *rd, uint64_t val) ++{ ++ if (rd->json_output) ++ jsonw_xint_field(rd->jw, "iova", val); ++ else ++ pr_out("iova 0x%" PRIx64 " ", val); ++} ++ ++static void print_mrlen(struct rd *rd, uint64_t val) ++{ ++ if (rd->json_output) ++ jsonw_uint_field(rd->jw, "mrlen", val); ++ else ++ pr_out("mrlen %" PRIu64 " ", val); ++} ++ ++static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct nlattr *nla_table, *nla_entry; ++ struct rd *rd = data; ++ const char *name; ++ uint32_t idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || ++ !tb[RDMA_NLDEV_ATTR_DEV_NAME] || ++ !tb[RDMA_NLDEV_ATTR_RES_MR]) ++ return MNL_CB_ERROR; ++ ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ nla_table = tb[RDMA_NLDEV_ATTR_RES_MR]; ++ ++ mnl_attr_for_each_nested(nla_entry, nla_table) { ++ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; ++ uint32_t rkey = 0, lkey = 0; ++ uint64_t iova = 0, mrlen; ++ char *comm = NULL; ++ uint32_t pid = 0; ++ int err; ++ ++ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); ++ if (err != MNL_CB_OK) ++ return MNL_CB_ERROR; ++ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || ++ (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && ++ !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { ++ return MNL_CB_ERROR; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) ++ rkey = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) ++ lkey = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) ++ iova = mnl_attr_get_u64( ++ nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); ++ ++ mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); ++ if (rd_check_is_filtered(rd, "mrlen", mrlen)) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { ++ pid = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_PID]); ++ comm = get_task_name(pid); ++ } ++ ++ if (rd_check_is_filtered(rd, "pid", pid)) { ++ free(comm); ++ continue; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) ++ /* discard const from mnl_attr_get_str */ ++ comm = (char *)mnl_attr_get_str( ++ nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ ++ print_dev(rd, idx, name); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) ++ print_key(rd, "rkey", rkey); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) ++ print_key(rd, "lkey", lkey); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) ++ print_iova(rd, iova); ++ print_mrlen(rd, mrlen); ++ print_pid(rd, pid); ++ print_comm(rd, comm, nla_line); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) ++ free(comm); ++ ++ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); ++ newline(rd); ++ } ++ return MNL_CB_OK; ++} ++ ++static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct nlattr *nla_table, *nla_entry; ++ struct rd *rd = data; ++ const char *name; ++ uint32_t idx; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || ++ !tb[RDMA_NLDEV_ATTR_DEV_NAME] || ++ !tb[RDMA_NLDEV_ATTR_RES_PD]) ++ return MNL_CB_ERROR; ++ ++ name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ nla_table = tb[RDMA_NLDEV_ATTR_RES_PD]; ++ ++ mnl_attr_for_each_nested(nla_entry, nla_table) { ++ uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; ++ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; ++ char *comm = NULL; ++ uint32_t pid = 0; ++ uint64_t users; ++ int err; ++ ++ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); ++ if (err != MNL_CB_OK) ++ return MNL_CB_ERROR; ++ ++ if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || ++ (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && ++ !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { ++ return MNL_CB_ERROR; ++ } ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) ++ local_dma_lkey = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); ++ ++ users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); ++ if (rd_check_is_filtered(rd, "users", users)) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) ++ unsafe_global_rkey = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { ++ pid = mnl_attr_get_u32( ++ nla_line[RDMA_NLDEV_ATTR_RES_PID]); ++ comm = get_task_name(pid); ++ } ++ ++ if (rd_check_is_filtered(rd, "pid", pid)) ++ continue; ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) ++ /* discard const from mnl_attr_get_str */ ++ comm = (char *)mnl_attr_get_str( ++ nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ ++ print_dev(rd, idx, name); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) ++ print_key(rd, "local_dma_lkey", local_dma_lkey); ++ print_users(rd, users); ++ if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) ++ print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); ++ print_pid(rd, pid); ++ print_comm(rd, comm, nla_line); ++ ++ if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) ++ free(comm); ++ ++ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); ++ newline(rd); ++ } ++ return MNL_CB_OK; ++} ++ ++RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); ++ ++static const struct ++filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {{ .name = "link", ++ .is_number = false }, ++ { .name = "lqpn", ++ .is_number = true }, ++ { .name = "rqpn", ++ .is_number = true }, ++ { .name = "pid", ++ .is_number = true }, ++ { .name = "sq-psn", ++ .is_number = true }, ++ { .name = "rq-psn", ++ .is_number = true }, ++ { .name = "type", ++ .is_number = false }, ++ { .name = "path-mig-state", ++ .is_number = false }, ++ { .name = "state", ++ .is_number = false } }; ++ ++RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); ++ ++static const ++struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { ++ { .name = "link", .is_number = false }, ++ { .name = "lqpn", .is_number = true }, ++ { .name = "qp-type", .is_number = false }, ++ { .name = "state", .is_number = false }, ++ { .name = "ps", .is_number = false }, ++ { .name = "dev-type", .is_number = false }, ++ { .name = "transport-type", .is_number = false }, ++ { .name = "pid", .is_number = true }, ++ { .name = "src-addr", .is_number = false }, ++ { .name = "src-port", .is_number = true }, ++ { .name = "dst-addr", .is_number = false }, ++ { .name = "dst-port", .is_number = true } ++}; ++ ++RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); ++ ++static const ++struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { ++ { .name = "dev", .is_number = false }, ++ { .name = "users", .is_number = true }, ++ { .name = "poll-ctx", .is_number = false }, ++ { .name = "pid", .is_number = true } ++}; ++ ++RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); ++ ++static const ++struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { ++ { .name = "dev", .is_number = false }, ++ { .name = "rkey", .is_number = true }, ++ { .name = "lkey", .is_number = true }, ++ { .name = "mrlen", .is_number = true }, ++ { .name = "pid", .is_number = true } ++}; ++ ++RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); ++ ++static const ++struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { ++ { .name = "dev", .is_number = false }, ++ { .name = "users", .is_number = true }, ++ { .name = "pid", .is_number = true } ++}; ++ ++RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); ++ ++static int res_show(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, res_no_args }, ++ { "qp", res_qp }, ++ { "cm_id", res_cm_id }, ++ { "cq", res_cq }, ++ { "mr", res_mr }, ++ { "pd", res_pd }, ++ { 0 } ++ }; ++ ++ /* ++ * Special case to support "rdma res show DEV_NAME" ++ */ ++ if (rd_argc(rd) == 1 && dev_map_lookup(rd, false)) ++ return rd_exec_dev(rd, _res_no_args); ++ ++ return rd_exec_cmd(rd, cmds, "parameter"); ++} ++ ++int cmd_res(struct rd *rd) ++{ ++ const struct rd_cmd cmds[] = { ++ { NULL, res_show }, ++ { "show", res_show }, ++ { "list", res_show }, ++ { "help", res_help }, ++ { 0 } ++ }; ++ ++ return rd_exec_cmd(rd, cmds, "resource command"); ++} +diff --git a/rdma/utils.c b/rdma/utils.c +new file mode 100644 +index 0000000000000..069d44fece101 +--- /dev/null ++++ b/rdma/utils.c +@@ -0,0 +1,868 @@ ++/* ++ * utils.c RDMA tool ++ * ++ * This program is free software; you can redistribute 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: Leon Romanovsky ++ */ ++ ++#include "rdma.h" ++#include ++#include ++ ++int rd_argc(struct rd *rd) ++{ ++ return rd->argc; ++} ++ ++char *rd_argv(struct rd *rd) ++{ ++ if (!rd_argc(rd)) ++ return NULL; ++ return *rd->argv; ++} ++ ++int strcmpx(const char *str1, const char *str2) ++{ ++ if (strlen(str1) > strlen(str2)) ++ return -1; ++ return strncmp(str1, str2, strlen(str1)); ++} ++ ++static bool rd_argv_match(struct rd *rd, const char *pattern) ++{ ++ if (!rd_argc(rd)) ++ return false; ++ return strcmpx(rd_argv(rd), pattern) == 0; ++} ++ ++void rd_arg_inc(struct rd *rd) ++{ ++ if (!rd_argc(rd)) ++ return; ++ rd->argc--; ++ rd->argv++; ++} ++ ++bool rd_no_arg(struct rd *rd) ++{ ++ return rd_argc(rd) == 0; ++} ++ ++/* ++ * Possible input:output ++ * dev/port | first port | is_dump_all ++ * mlx5_1 | 0 | true ++ * mlx5_1/ | 0 | true ++ * mlx5_1/0 | 0 | false ++ * mlx5_1/1 | 1 | false ++ * mlx5_1/- | 0 | false ++ * ++ * In strict mode, /- will return error. ++ */ ++static int get_port_from_argv(struct rd *rd, uint32_t *port, ++ bool *is_dump_all, bool strict_port) ++{ ++ char *slash; ++ ++ *port = 0; ++ *is_dump_all = true; ++ ++ slash = strchr(rd_argv(rd), '/'); ++ /* if no port found, return 0 */ ++ if (slash++) { ++ if (*slash == '-') { ++ if (strict_port) ++ return -EINVAL; ++ *is_dump_all = false; ++ return 0; ++ } ++ ++ if (isdigit(*slash)) { ++ *is_dump_all = false; ++ *port = atoi(slash); ++ } ++ if (!*port && strlen(slash)) ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static struct dev_map *dev_map_alloc(const char *dev_name) ++{ ++ struct dev_map *dev_map; ++ ++ dev_map = calloc(1, sizeof(*dev_map)); ++ if (!dev_map) ++ return NULL; ++ dev_map->dev_name = strdup(dev_name); ++ if (!dev_map->dev_name) { ++ free(dev_map); ++ return NULL; ++ } ++ ++ return dev_map; ++} ++ ++static void dev_map_cleanup(struct rd *rd) ++{ ++ struct dev_map *dev_map, *tmp; ++ ++ list_for_each_entry_safe(dev_map, tmp, ++ &rd->dev_map_list, list) { ++ list_del(&dev_map->list); ++ free(dev_map->dev_name); ++ free(dev_map); ++ } ++} ++ ++static int add_filter(struct rd *rd, char *key, char *value, ++ const struct filters valid_filters[]) ++{ ++ char cset[] = "1234567890,-"; ++ struct filter_entry *fe; ++ bool key_found = false; ++ int idx = 0; ++ int ret; ++ ++ fe = calloc(1, sizeof(*fe)); ++ if (!fe) ++ return -ENOMEM; ++ ++ while (idx < MAX_NUMBER_OF_FILTERS && valid_filters[idx].name) { ++ if (!strcmpx(key, valid_filters[idx].name)) { ++ key_found = true; ++ break; ++ } ++ idx++; ++ } ++ if (!key_found) { ++ pr_err("Unsupported filter option: %s\n", key); ++ ret = -EINVAL; ++ goto err; ++ } ++ ++ /* ++ * Check the filter validity, not optimal, but works ++ * ++ * Actually, there are three types of filters ++ * numeric - for example PID or QPN ++ * string - for example states ++ * link - user requested to filter on specific link ++ * e.g. mlx5_1/1, mlx5_1/-, mlx5_1 ... ++ */ ++ if (valid_filters[idx].is_number && ++ strspn(value, cset) != strlen(value)) { ++ pr_err("%s filter accepts \"%s\" characters only\n", key, cset); ++ ret = -EINVAL; ++ goto err; ++ } ++ ++ fe->key = strdup(key); ++ fe->value = strdup(value); ++ if (!fe->key || !fe->value) { ++ ret = -ENOMEM; ++ goto err_alloc; ++ } ++ ++ for (idx = 0; idx < strlen(fe->value); idx++) ++ fe->value[idx] = tolower(fe->value[idx]); ++ ++ list_add_tail(&fe->list, &rd->filter_list); ++ return 0; ++ ++err_alloc: ++ free(fe->value); ++ free(fe->key); ++err: ++ free(fe); ++ return ret; ++} ++ ++int rd_build_filter(struct rd *rd, const struct filters valid_filters[]) ++{ ++ int ret = 0; ++ int idx = 0; ++ ++ if (!valid_filters || !rd_argc(rd)) ++ goto out; ++ ++ if (rd_argc(rd) == 1) { ++ pr_err("No filter data was supplied to filter option %s\n", rd_argv(rd)); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ if (rd_argc(rd) % 2) { ++ pr_err("There is filter option without data\n"); ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ while (idx != rd_argc(rd)) { ++ /* ++ * We can do micro-optimization and skip "dev" ++ * and "link" filters, but it is not worth of it. ++ */ ++ ret = add_filter(rd, *(rd->argv + idx), ++ *(rd->argv + idx + 1), valid_filters); ++ if (ret) ++ goto out; ++ idx += 2; ++ } ++ ++out: ++ return ret; ++} ++ ++bool rd_check_is_key_exist(struct rd *rd, const char *key) ++{ ++ struct filter_entry *fe; ++ ++ list_for_each_entry(fe, &rd->filter_list, list) { ++ if (!strcmpx(fe->key, key)) ++ return true; ++ } ++ ++ return false; ++} ++ ++/* ++ * Check if string entry is filtered: ++ * * key doesn't exist -> user didn't request -> not filtered ++ */ ++bool rd_check_is_string_filtered(struct rd *rd, ++ const char *key, const char *val) ++{ ++ bool key_is_filtered = false; ++ struct filter_entry *fe; ++ char *p = NULL; ++ char *str; ++ ++ list_for_each_entry(fe, &rd->filter_list, list) { ++ if (!strcmpx(fe->key, key)) { ++ /* We found the key */ ++ p = strdup(fe->value); ++ key_is_filtered = true; ++ if (!p) { ++ /* ++ * Something extremely wrong if we fail ++ * to allocate small amount of bytes. ++ */ ++ pr_err("Found key, but failed to allocate memory to store value\n"); ++ return key_is_filtered; ++ } ++ ++ /* ++ * Need to check if value in range ++ * It can come in the following formats ++ * and their permutations: ++ * str ++ * str1,str2 ++ */ ++ str = strtok(p, ","); ++ while (str) { ++ if (strlen(str) == strlen(val) && ++ !strcasecmp(str, val)) { ++ key_is_filtered = false; ++ goto out; ++ } ++ str = strtok(NULL, ","); ++ } ++ goto out; ++ } ++ } ++ ++out: ++ free(p); ++ return key_is_filtered; ++} ++ ++/* ++ * Check if key is filtered: ++ * key doesn't exist -> user didn't request -> not filtered ++ */ ++bool rd_check_is_filtered(struct rd *rd, const char *key, uint32_t val) ++{ ++ bool key_is_filtered = false; ++ struct filter_entry *fe; ++ ++ list_for_each_entry(fe, &rd->filter_list, list) { ++ uint32_t left_val = 0, fe_value = 0; ++ bool range_check = false; ++ char *p = fe->value; ++ ++ if (!strcmpx(fe->key, key)) { ++ /* We found the key */ ++ key_is_filtered = true; ++ /* ++ * Need to check if value in range ++ * It can come in the following formats ++ * (and their permutations): ++ * numb ++ * numb1,numb2 ++ * ,numb1,numb2 ++ * numb1-numb2 ++ * numb1,numb2-numb3,numb4-numb5 ++ */ ++ while (*p) { ++ if (isdigit(*p)) { ++ fe_value = strtol(p, &p, 10); ++ if (fe_value == val || ++ (range_check && left_val < val && ++ val < fe_value)) { ++ key_is_filtered = false; ++ goto out; ++ } ++ range_check = false; ++ } else { ++ if (*p == '-') { ++ left_val = fe_value; ++ range_check = true; ++ } ++ p++; ++ } ++ } ++ goto out; ++ } ++ } ++ ++out: ++ return key_is_filtered; ++} ++ ++static void filters_cleanup(struct rd *rd) ++{ ++ struct filter_entry *fe, *tmp; ++ ++ list_for_each_entry_safe(fe, tmp, ++ &rd->filter_list, list) { ++ list_del(&fe->list); ++ free(fe->key); ++ free(fe->value); ++ free(fe); ++ } ++} ++ ++static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = { ++ [RDMA_NLDEV_ATTR_DEV_INDEX] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING, ++ [RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_CAP_FLAGS] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_FW_VERSION] = MNL_TYPE_NUL_STRING, ++ [RDMA_NLDEV_ATTR_NODE_GUID] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_SYS_IMAGE_GUID] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_LID] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_SM_LID] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_LMC] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_PORT_STATE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_PORT_PHYS_STATE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_DEV_NODE_TYPE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_RES_SUMMARY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME] = MNL_TYPE_NUL_STRING, ++ [RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_RES_QP] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_QP_ENTRY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_LQPN] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_RQPN] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_RQ_PSN] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_SQ_PSN] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_RES_TYPE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_RES_STATE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_RES_PID] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_KERN_NAME] = MNL_TYPE_NUL_STRING, ++ [RDMA_NLDEV_ATTR_RES_CM_ID] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_CM_ID_ENTRY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_PS] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_SRC_ADDR] = MNL_TYPE_UNSPEC, ++ [RDMA_NLDEV_ATTR_RES_DST_ADDR] = MNL_TYPE_UNSPEC, ++ [RDMA_NLDEV_ATTR_RES_CQ] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_CQ_ENTRY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_CQE] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_USECNT] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_RES_POLL_CTX] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_RES_MR] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_MR_ENTRY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_RES_RKEY] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_LKEY] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_RES_IOVA] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_RES_MRLEN] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_NDEV_INDEX] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_NDEV_NAME] = MNL_TYPE_NUL_STRING, ++ [RDMA_NLDEV_ATTR_DRIVER] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_DRIVER_ENTRY] = MNL_TYPE_NESTED, ++ [RDMA_NLDEV_ATTR_DRIVER_STRING] = MNL_TYPE_NUL_STRING, ++ [RDMA_NLDEV_ATTR_DRIVER_PRINT_TYPE] = MNL_TYPE_U8, ++ [RDMA_NLDEV_ATTR_DRIVER_S32] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_DRIVER_U32] = MNL_TYPE_U32, ++ [RDMA_NLDEV_ATTR_DRIVER_S64] = MNL_TYPE_U64, ++ [RDMA_NLDEV_ATTR_DRIVER_U64] = MNL_TYPE_U64, ++}; ++ ++int rd_attr_check(const struct nlattr *attr, int *typep) ++{ ++ int type; ++ ++ if (mnl_attr_type_valid(attr, RDMA_NLDEV_ATTR_MAX) < 0) ++ return MNL_CB_ERROR; ++ ++ type = mnl_attr_get_type(attr); ++ ++ if (mnl_attr_validate(attr, nldev_policy[type]) < 0) ++ return MNL_CB_ERROR; ++ ++ *typep = nldev_policy[type]; ++ return MNL_CB_OK; ++} ++ ++int rd_attr_cb(const struct nlattr *attr, void *data) ++{ ++ const struct nlattr **tb = data; ++ int type; ++ ++ if (mnl_attr_type_valid(attr, RDMA_NLDEV_ATTR_MAX - 1) < 0) ++ /* We received unknown attribute */ ++ return MNL_CB_OK; ++ ++ type = mnl_attr_get_type(attr); ++ ++ if (mnl_attr_validate(attr, nldev_policy[type]) < 0) ++ return MNL_CB_ERROR; ++ ++ tb[type] = attr; ++ return MNL_CB_OK; ++} ++ ++int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data) ++{ ++ struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; ++ struct dev_map *dev_map; ++ struct rd *rd = data; ++ const char *dev_name; ++ ++ mnl_attr_parse(nlh, 0, rd_attr_cb, tb); ++ if (!tb[RDMA_NLDEV_ATTR_DEV_NAME] || !tb[RDMA_NLDEV_ATTR_DEV_INDEX]) ++ return MNL_CB_ERROR; ++ if (!tb[RDMA_NLDEV_ATTR_PORT_INDEX]) { ++ pr_err("This tool doesn't support switches yet\n"); ++ return MNL_CB_ERROR; ++ } ++ ++ dev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); ++ ++ dev_map = dev_map_alloc(dev_name); ++ if (!dev_map) ++ /* The main function will cleanup the allocations */ ++ return MNL_CB_ERROR; ++ list_add_tail(&dev_map->list, &rd->dev_map_list); ++ ++ dev_map->num_ports = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); ++ dev_map->idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); ++ return MNL_CB_OK; ++} ++ ++void rd_free(struct rd *rd) ++{ ++ if (!rd) ++ return; ++ free(rd->buff); ++ dev_map_cleanup(rd); ++ filters_cleanup(rd); ++} ++ ++int rd_set_arg_to_devname(struct rd *rd) ++{ ++ int ret = 0; ++ ++ while (!rd_no_arg(rd)) { ++ if (rd_argv_match(rd, "dev") || rd_argv_match(rd, "link")) { ++ rd_arg_inc(rd); ++ if (rd_no_arg(rd)) { ++ pr_err("No device name was supplied\n"); ++ ret = -EINVAL; ++ } ++ goto out; ++ } ++ rd_arg_inc(rd); ++ } ++out: ++ return ret; ++} ++ ++int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port) ++{ ++ struct dev_map *dev_map; ++ uint32_t port; ++ int ret = 0; ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ if (rd_no_arg(rd)) { ++ list_for_each_entry(dev_map, &rd->dev_map_list, list) { ++ rd->dev_idx = dev_map->idx; ++ port = (strict_port) ? 1 : 0; ++ for (; port < dev_map->num_ports + 1; port++) { ++ rd->port_idx = port; ++ ret = cb(rd); ++ if (ret) ++ goto out; ++ } ++ } ++ ++ } else { ++ bool is_dump_all; ++ ++ dev_map = dev_map_lookup(rd, true); ++ ret = get_port_from_argv(rd, &port, &is_dump_all, strict_port); ++ if (!dev_map || port > dev_map->num_ports || (!port && ret)) { ++ pr_err("Wrong device name\n"); ++ ret = -ENOENT; ++ goto out; ++ } ++ rd_arg_inc(rd); ++ rd->dev_idx = dev_map->idx; ++ rd->port_idx = port; ++ for (; rd->port_idx < dev_map->num_ports + 1; rd->port_idx++) { ++ ret = cb(rd); ++ if (ret) ++ goto out; ++ if (!is_dump_all) ++ /* ++ * We got request to show link for devname ++ * with port index. ++ */ ++ break; ++ } ++ } ++ ++out: ++ if (rd->json_output) ++ jsonw_end_array(rd->jw); ++ return ret; ++} ++ ++int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd)) ++{ ++ struct dev_map *dev_map; ++ int ret = 0; ++ ++ if (rd->json_output) ++ jsonw_start_array(rd->jw); ++ if (rd_no_arg(rd)) { ++ list_for_each_entry(dev_map, &rd->dev_map_list, list) { ++ rd->dev_idx = dev_map->idx; ++ ret = cb(rd); ++ if (ret) ++ goto out; ++ } ++ } else { ++ dev_map = dev_map_lookup(rd, false); ++ if (!dev_map) { ++ pr_err("Wrong device name - %s\n", rd_argv(rd)); ++ ret = -ENOENT; ++ goto out; ++ } ++ rd_arg_inc(rd); ++ rd->dev_idx = dev_map->idx; ++ ret = cb(rd); ++ } ++out: ++ if (rd->json_output) ++ jsonw_end_array(rd->jw); ++ return ret; ++} ++ ++int rd_exec_require_dev(struct rd *rd, int (*cb)(struct rd *rd)) ++{ ++ if (rd_no_arg(rd)) { ++ pr_err("Please provide device name.\n"); ++ return -EINVAL; ++ } ++ ++ return rd_exec_dev(rd, cb); ++} ++ ++int rd_exec_cmd(struct rd *rd, const struct rd_cmd *cmds, const char *str) ++{ ++ const struct rd_cmd *c; ++ ++ /* First argument in objs table is default variant */ ++ if (rd_no_arg(rd)) ++ return cmds->func(rd); ++ ++ for (c = cmds + 1; c->cmd; ++c) { ++ if (rd_argv_match(rd, c->cmd)) { ++ /* Move to next argument */ ++ rd_arg_inc(rd); ++ return c->func(rd); ++ } ++ } ++ ++ pr_err("Unknown %s '%s'.\n", str, rd_argv(rd)); ++ return 0; ++} ++ ++void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags) ++{ ++ *seq = time(NULL); ++ ++ rd->nlh = mnl_nlmsg_put_header(rd->buff); ++ rd->nlh->nlmsg_type = RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, cmd); ++ rd->nlh->nlmsg_seq = *seq; ++ rd->nlh->nlmsg_flags = flags; ++} ++ ++int rd_send_msg(struct rd *rd) ++{ ++ int ret; ++ ++ rd->nl = mnl_socket_open(NETLINK_RDMA); ++ if (!rd->nl) { ++ pr_err("Failed to open NETLINK_RDMA socket\n"); ++ return -ENODEV; ++ } ++ ++ ret = mnl_socket_bind(rd->nl, 0, MNL_SOCKET_AUTOPID); ++ if (ret < 0) { ++ pr_err("Failed to bind socket with err %d\n", ret); ++ goto err; ++ } ++ ++ ret = mnl_socket_sendto(rd->nl, rd->nlh, rd->nlh->nlmsg_len); ++ if (ret < 0) { ++ pr_err("Failed to send to socket with err %d\n", ret); ++ goto err; ++ } ++ return 0; ++ ++err: ++ mnl_socket_close(rd->nl); ++ return ret; ++} ++ ++int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, unsigned int seq) ++{ ++ int ret; ++ unsigned int portid; ++ char buf[MNL_SOCKET_BUFFER_SIZE]; ++ ++ portid = mnl_socket_get_portid(rd->nl); ++ do { ++ ret = mnl_socket_recvfrom(rd->nl, buf, sizeof(buf)); ++ if (ret <= 0) ++ break; ++ ++ ret = mnl_cb_run(buf, ret, seq, portid, callback, data); ++ } while (ret > 0); ++ ++ mnl_socket_close(rd->nl); ++ return ret; ++} ++ ++static struct dev_map *_dev_map_lookup(struct rd *rd, const char *dev_name) ++{ ++ struct dev_map *dev_map; ++ ++ list_for_each_entry(dev_map, &rd->dev_map_list, list) ++ if (strcmp(dev_name, dev_map->dev_name) == 0) ++ return dev_map; ++ ++ return NULL; ++} ++ ++struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index) ++{ ++ struct dev_map *dev_map; ++ char *dev_name; ++ char *slash; ++ ++ if (rd_no_arg(rd)) ++ return NULL; ++ ++ dev_name = strdup(rd_argv(rd)); ++ if (allow_port_index) { ++ slash = strrchr(dev_name, '/'); ++ if (slash) ++ *slash = '\0'; ++ } ++ ++ dev_map = _dev_map_lookup(rd, dev_name); ++ free(dev_name); ++ return dev_map; ++} ++ ++#define nla_type(attr) ((attr)->nla_type & NLA_TYPE_MASK) ++ ++void newline(struct rd *rd) ++{ ++ if (rd->json_output) ++ jsonw_end_array(rd->jw); ++ else ++ pr_out("\n"); ++} ++ ++void newline_indent(struct rd *rd) ++{ ++ newline(rd); ++ if (!rd->json_output) ++ pr_out(" "); ++} ++ ++static int print_driver_string(struct rd *rd, const char *key_str, ++ const char *val_str) ++{ ++ if (rd->json_output) { ++ jsonw_string_field(rd->jw, key_str, val_str); ++ return 0; ++ } else { ++ return pr_out("%s %s ", key_str, val_str); ++ } ++} ++ ++static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val, ++ enum rdma_nldev_print_type print_type) ++{ ++ if (rd->json_output) { ++ jsonw_int_field(rd->jw, key_str, val); ++ return 0; ++ } ++ switch (print_type) { ++ case RDMA_NLDEV_PRINT_TYPE_UNSPEC: ++ return pr_out("%s %d ", key_str, val); ++ case RDMA_NLDEV_PRINT_TYPE_HEX: ++ return pr_out("%s 0x%x ", key_str, val); ++ default: ++ return -EINVAL; ++ } ++} ++ ++static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val, ++ enum rdma_nldev_print_type print_type) ++{ ++ if (rd->json_output) { ++ jsonw_int_field(rd->jw, key_str, val); ++ return 0; ++ } ++ switch (print_type) { ++ case RDMA_NLDEV_PRINT_TYPE_UNSPEC: ++ return pr_out("%s %u ", key_str, val); ++ case RDMA_NLDEV_PRINT_TYPE_HEX: ++ return pr_out("%s 0x%x ", key_str, val); ++ default: ++ return -EINVAL; ++ } ++} ++ ++static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val, ++ enum rdma_nldev_print_type print_type) ++{ ++ if (rd->json_output) { ++ jsonw_int_field(rd->jw, key_str, val); ++ return 0; ++ } ++ switch (print_type) { ++ case RDMA_NLDEV_PRINT_TYPE_UNSPEC: ++ return pr_out("%s %" PRId64 " ", key_str, val); ++ case RDMA_NLDEV_PRINT_TYPE_HEX: ++ return pr_out("%s 0x%" PRIx64 " ", key_str, val); ++ default: ++ return -EINVAL; ++ } ++} ++ ++static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val, ++ enum rdma_nldev_print_type print_type) ++{ ++ if (rd->json_output) { ++ jsonw_int_field(rd->jw, key_str, val); ++ return 0; ++ } ++ switch (print_type) { ++ case RDMA_NLDEV_PRINT_TYPE_UNSPEC: ++ return pr_out("%s %" PRIu64 " ", key_str, val); ++ case RDMA_NLDEV_PRINT_TYPE_HEX: ++ return pr_out("%s 0x%" PRIx64 " ", key_str, val); ++ default: ++ return -EINVAL; ++ } ++} ++ ++static int print_driver_entry(struct rd *rd, struct nlattr *key_attr, ++ struct nlattr *val_attr, ++ enum rdma_nldev_print_type print_type) ++{ ++ const char *key_str = mnl_attr_get_str(key_attr); ++ int attr_type = nla_type(val_attr); ++ ++ switch (attr_type) { ++ case RDMA_NLDEV_ATTR_DRIVER_STRING: ++ return print_driver_string(rd, key_str, ++ mnl_attr_get_str(val_attr)); ++ case RDMA_NLDEV_ATTR_DRIVER_S32: ++ return print_driver_s32(rd, key_str, ++ mnl_attr_get_u32(val_attr), print_type); ++ case RDMA_NLDEV_ATTR_DRIVER_U32: ++ return print_driver_u32(rd, key_str, ++ mnl_attr_get_u32(val_attr), print_type); ++ case RDMA_NLDEV_ATTR_DRIVER_S64: ++ return print_driver_s64(rd, key_str, ++ mnl_attr_get_u64(val_attr), print_type); ++ case RDMA_NLDEV_ATTR_DRIVER_U64: ++ return print_driver_u64(rd, key_str, ++ mnl_attr_get_u64(val_attr), print_type); ++ } ++ return -EINVAL; ++} ++ ++void print_driver_table(struct rd *rd, struct nlattr *tb) ++{ ++ int print_type = RDMA_NLDEV_PRINT_TYPE_UNSPEC; ++ struct nlattr *tb_entry, *key = NULL, *val; ++ int type, cc = 0; ++ int ret; ++ ++ if (!rd->show_driver_details || !tb) ++ return; ++ ++ if (rd->pretty_output) ++ newline_indent(rd); ++ ++ /* ++ * Driver attrs are tuples of {key, [print-type], value}. ++ * The key must be a string. If print-type is present, it ++ * defines an alternate printf format type vs the native format ++ * for the attribute. And the value can be any available ++ * driver type. ++ */ ++ mnl_attr_for_each_nested(tb_entry, tb) { ++ ++ if (cc > MAX_LINE_LENGTH) { ++ if (rd->pretty_output) ++ newline_indent(rd); ++ cc = 0; ++ } ++ if (rd_attr_check(tb_entry, &type) != MNL_CB_OK) ++ return; ++ if (!key) { ++ if (type != MNL_TYPE_NUL_STRING) ++ return; ++ key = tb_entry; ++ } else if (type == MNL_TYPE_U8) { ++ print_type = mnl_attr_get_u8(tb_entry); ++ } else { ++ val = tb_entry; ++ ret = print_driver_entry(rd, key, val, print_type); ++ if (ret < 0) ++ return; ++ cc += ret; ++ print_type = RDMA_NLDEV_PRINT_TYPE_UNSPEC; ++ key = NULL; ++ } ++ } ++ return; ++} +-- +2.20.1 + diff --git a/SOURCES/0068-rdma-add-man-pages-for-RDMA-tool.patch b/SOURCES/0068-rdma-add-man-pages-for-RDMA-tool.patch new file mode 100644 index 0000000..ec21dae --- /dev/null +++ b/SOURCES/0068-rdma-add-man-pages-for-RDMA-tool.patch @@ -0,0 +1,422 @@ +From 4bee4617fa17405a52e11ed47e21feb20a277cc2 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Thu, 28 Mar 2019 15:00:33 +0100 +Subject: [PATCH] rdma: add man pages for RDMA tool + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1642479 +Upstream Status: RHEL-only + +commit 379afb6274462dee196d5909f6988b1ce5466c0b +Author: Andrea Claudi +Date: Thu Mar 28 13:02:20 2019 +0100 + + rdma: add man pages for RDMA tool + + Checkout to the v5.0.0 upstream tag and update man8 Makefile + + Signed-off-by: Andrea Claudi +--- + man/man8/Makefile | 2 +- + man/man8/rdma-dev.8 | 69 +++++++++++++++++++++++ + man/man8/rdma-link.8 | 56 ++++++++++++++++++ + man/man8/rdma-resource.8 | 109 +++++++++++++++++++++++++++++++++++ + man/man8/rdma.8 | 119 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 354 insertions(+), 1 deletion(-) + create mode 100644 man/man8/rdma-dev.8 + create mode 100644 man/man8/rdma-link.8 + create mode 100644 man/man8/rdma-resource.8 + create mode 100644 man/man8/rdma.8 + +diff --git a/man/man8/Makefile b/man/man8/Makefile +index f33186446819e..416443f3f5361 100644 +--- a/man/man8/Makefile ++++ b/man/man8/Makefile +@@ -19,7 +19,7 @@ MAN8PAGES = $(TARGETS) ip.8 arpd.8 lnstat.8 routel.8 rtacct.8 rtmon.8 rtpr.8 ss. + tc-simple.8 tc-skbedit.8 tc-vlan.8 tc-xt.8 tc-skbmod.8 tc-ife.8 \ + tc-tunnel_key.8 tc-sample.8 \ + devlink.8 devlink-dev.8 devlink-monitor.8 devlink-port.8 devlink-sb.8 \ +- ifstat.8 ++ ifstat.8 rdma.8 rdma-dev.8 rdma-link.8 rdma-resource.8 + + all: $(TARGETS) + +diff --git a/man/man8/rdma-dev.8 b/man/man8/rdma-dev.8 +new file mode 100644 +index 0000000000000..069f471791904 +--- /dev/null ++++ b/man/man8/rdma-dev.8 +@@ -0,0 +1,69 @@ ++.TH RDMA\-DEV 8 "06 Jul 2017" "iproute2" "Linux" ++.SH NAME ++rdma-dev \- RDMA device configuration ++.SH SYNOPSIS ++.sp ++.ad l ++.in +8 ++.ti -8 ++.B rdma ++.RI "[ " OPTIONS " ]" ++.B dev ++.RI " { " COMMAND " | " ++.BR help " }" ++.sp ++ ++.ti -8 ++.IR OPTIONS " := { " ++\fB\-V\fR[\fIersion\fR] | ++\fB\-d\fR[\fIetails\fR] } ++ ++.ti -8 ++.B rdma dev show ++.RI "[ " DEV " ]" ++ ++.ti -8 ++.B rdma dev set ++.RI "[ " DEV " ]" ++.BR name ++.BR NEWNAME ++ ++.ti -8 ++.B rdma dev help ++ ++.SH "DESCRIPTION" ++.SS rdma dev set - rename rdma device ++ ++.SS rdma dev show - display rdma device attributes ++ ++.PP ++.I "DEV" ++- specifies the RDMA device to show. ++If this argument is omitted all devices are listed. ++ ++.SH "EXAMPLES" ++.PP ++rdma dev ++.RS 4 ++Shows the state of all RDMA devices on the system. ++.RE ++.PP ++rdma dev show mlx5_3 ++.RS 4 ++Shows the state of specified RDMA device. ++.RE ++.PP ++rdma dev set mlx5_3 name rdma_0 ++.RS 4 ++Renames the mlx5_3 device to rdma_0. ++.RE ++.PP ++ ++.SH SEE ALSO ++.BR rdma (8), ++.BR rdma-link (8), ++.BR rdma-resource (8), ++.br ++ ++.SH AUTHOR ++Leon Romanovsky +diff --git a/man/man8/rdma-link.8 b/man/man8/rdma-link.8 +new file mode 100644 +index 0000000000000..bddf34746e8b2 +--- /dev/null ++++ b/man/man8/rdma-link.8 +@@ -0,0 +1,56 @@ ++.TH RDMA\-LINK 8 "06 Jul 2017" "iproute2" "Linux" ++.SH NAME ++rdma-link \- rdma link configuration ++.SH SYNOPSIS ++.sp ++.ad l ++.in +8 ++.ti -8 ++.B devlink ++.RI "[ " OPTIONS " ]" ++.B link ++.RI " { " COMMAND " | " ++.BR help " }" ++.sp ++ ++.ti -8 ++.IR OPTIONS " := { " ++\fB\-V\fR[\fIersion\fR] | ++\fB\-d\fR[\fIetails\fR] } ++ ++.ti -8 ++.B rdma link show ++.RI "[ " DEV/PORT_INDEX " ]" ++ ++.ti -8 ++.B rdma link help ++ ++.SH "DESCRIPTION" ++.SS rdma link show - display rdma link attributes ++ ++.PP ++.I "DEV/PORT_INDEX" ++- specifies the RDMA link to show. ++If this argument is omitted all links are listed. ++ ++.SH "EXAMPLES" ++.PP ++rdma link show ++.RS 4 ++Shows the state of all rdma links on the system. ++.RE ++.PP ++rdma link show mlx5_2/1 ++.RS 4 ++Shows the state of specified rdma link. ++.RE ++.PP ++ ++.SH SEE ALSO ++.BR rdma (8), ++.BR rdma-dev (8), ++.BR rdma-resource (8), ++.br ++ ++.SH AUTHOR ++Leon Romanovsky +diff --git a/man/man8/rdma-resource.8 b/man/man8/rdma-resource.8 +new file mode 100644 +index 0000000000000..40b073dbfcf24 +--- /dev/null ++++ b/man/man8/rdma-resource.8 +@@ -0,0 +1,109 @@ ++.TH RDMA\-RESOURCE 8 "26 Dec 2017" "iproute2" "Linux" ++.SH NAME ++rdma-resource \- rdma resource configuration ++.SH SYNOPSIS ++.sp ++.ad l ++.in +8 ++.ti -8 ++.B rdma ++.RI "[ " OPTIONS " ] " RESOURCE " { " COMMAND " | " ++.BR help " }" ++.sp ++ ++.ti -8 ++.IR RESOURCE " := { " ++.BR cm_id " | " cq " | " mr " | " pd " | " qp " }" ++.sp ++ ++.ti -8 ++.IR OPTIONS " := { " ++\fB\-j\fR[\fIson\fR] | ++\fB\-d\fR[\fIetails\fR] } ++ ++.ti -8 ++.B rdma resource show ++.RI "[ " DEV/PORT_INDEX " ]" ++ ++.ti -8 ++.B rdma resource help ++ ++.SH "DESCRIPTION" ++.SS rdma resource show - display rdma resource tracking information ++ ++.PP ++.I "DEV/PORT_INDEX" ++- specifies the RDMA link to show. ++If this argument is omitted all links are listed. ++ ++.SH "EXAMPLES" ++.PP ++rdma resource show ++.RS 4 ++Shows summary for all devices on the system. ++.RE ++.PP ++rdma resource show mlx5_2 ++.RS 4 ++Shows the state of specified rdma device. ++.RE ++.PP ++rdma res show qp link mlx5_4 ++.RS 4 ++Get all QPs for the specific device. ++.RE ++.PP ++rdma res show qp link mlx5_4/1 ++.RS 4 ++Get QPs of specific port. ++.RE ++.PP ++rdma res show qp link mlx5_4/0 ++.RS 4 ++Provide illegal port number (0 is illegal). ++.RE ++.PP ++rdma res show qp link mlx5_4/- ++.RS 4 ++Get QPs which have not assigned port yet. ++.RE ++.PP ++rdma res show qp link mlx5_4/- -d ++.RS 4 ++Detailed view. ++.RE ++.PP ++rdma res show qp link mlx5_4/- -dd ++.RS 4 ++Detailed view including driver-specific details. ++.RE ++.PP ++rdma res show qp link mlx5_4/1 lqpn 0-6 ++.RS 4 ++Limit to specific Local QPNs. ++.RE ++.PP ++rdma resource show cm_id dst-port 7174 ++.RS 4 ++Show CM_IDs with destination ip port of 7174. ++.RE ++.PP ++rdma resource show cm_id src-addr 172.16.0.100 ++.RS 4 ++Show CM_IDs bound to local ip address 172.16.0.100 ++.RE ++.PP ++rdma resource show cq pid 30489 ++.RS 4 ++Show CQs belonging to pid 30489 ++.RE ++.PP ++ ++.SH SEE ALSO ++.BR rdma (8), ++.BR rdma-dev (8), ++.BR rdma-link (8), ++.br ++ ++.SH AUTHOR ++Leon Romanovsky +diff --git a/man/man8/rdma.8 b/man/man8/rdma.8 +new file mode 100644 +index 0000000000000..b2b5aef866ab0 +--- /dev/null ++++ b/man/man8/rdma.8 +@@ -0,0 +1,119 @@ ++.TH RDMA 8 "28 Mar 2017" "iproute2" "Linux" ++.SH NAME ++rdma \- RDMA tool ++.SH SYNOPSIS ++.sp ++.ad l ++.in +8 ++.ti -8 ++.B rdma ++.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | " ++.BR help " }" ++.sp ++ ++.ti -8 ++.B rdma ++.RB "[ " -force " ] " ++.BI "-batch " filename ++.sp ++ ++.ti -8 ++.IR OBJECT " := { " ++.BR dev " | " link " }" ++.sp ++ ++.ti -8 ++.IR OPTIONS " := { " ++\fB\-V\fR[\fIersion\fR] | ++\fB\-d\fR[\fIetails\fR] } ++\fB\-j\fR[\fIson\fR] } ++\fB\-p\fR[\fIretty\fR] } ++ ++.SH OPTIONS ++ ++.TP ++.BR "\-V" , " -Version" ++Print the version of the ++.B rdma ++tool and exit. ++ ++.TP ++.BR "\-b", " \-batch " ++Read commands from provided file or standard input and invoke them. ++First failure will cause termination of rdma. ++ ++.TP ++.BR "\-force" ++Don't terminate rdma 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 "\-d" , " --details" ++Output detailed information. Adding a second \-d includes driver-specific details. ++ ++.TP ++.BR "\-p" , " --pretty" ++When combined with -j generate a pretty JSON output. ++ ++.TP ++.BR "\-j" , " --json" ++Generate JSON output. ++ ++.SS ++.I OBJECT ++ ++.TP ++.B dev ++- RDMA device. ++ ++.TP ++.B link ++- RDMA port related. ++ ++.PP ++The names of all objects may be written in full or ++abbreviated form, for example ++.B stats ++can be abbreviated as ++.B stat ++or just ++.B s. ++ ++.SS ++.I COMMAND ++ ++Specifies the action to perform on the object. ++The set of possible actions depends on the object type. ++As a rule, it is possible to ++.B show ++(or ++.B list ++) objects, but some objects do not allow all of these operations ++or have some additional commands. The ++.B help ++command is available for all objects. It prints ++out a list of available commands and argument syntax conventions. ++.sp ++If no command is given, some default command is assumed. ++Usually it is ++.B list ++or, if the objects of this class cannot be listed, ++.BR "help" . ++ ++.SH EXIT STATUS ++Exit status is 0 if command was successful or a positive integer upon failure. ++ ++.SH SEE ALSO ++.BR rdma-dev (8), ++.BR rdma-link (8), ++.BR rdma-resource (8), ++.br ++ ++.SH REPORTING BUGS ++Report any bugs to the Linux RDMA mailing list ++.B ++where the development and maintenance is primarily done. ++You do not have to be subscribed to the list to send a message there. ++ ++.SH AUTHOR ++Leon Romanovsky +-- +2.20.1 + diff --git a/SOURCES/0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch b/SOURCES/0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch new file mode 100644 index 0000000..5c83a04 --- /dev/null +++ b/SOURCES/0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch @@ -0,0 +1,72 @@ +From 69685a7aa7fb408cce256e469430e10e99a43e2d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 25 Mar 2019 16:54:31 +0100 +Subject: [PATCH] tc: f_flower: Add support for matching first frag packets + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1559814 +Upstream Status: iproute2.git commit fb4e6abfca2c4 + +commit fb4e6abfca2c48380210d48c1e7f3685f8bb58fd +Author: Pieter Jansen van Vuuren +Date: Fri Mar 9 11:07:22 2018 +0100 + + tc: f_flower: Add support for matching first frag packets + + Add matching support for distinguishing between first and later fragmented + packets. + + # tc filter add dev eth0 protocol ip parent ffff: \ + flower indev eth0 \ + ip_flags firstfrag \ + ip_proto udp \ + action mirred egress redirect dev eth1 + + # tc filter add dev eth0 protocol ip parent ffff: \ + flower indev eth0 \ + ip_flags nofirstfrag \ + ip_proto udp \ + action mirred egress redirect dev eth1 + + Signed-off-by: Pieter Jansen van Vuuren + Reviewed-by: Jakub Kicinski + Signed-off-by: Simon Horman + Signed-off-by: David Ahern +--- + man/man8/tc-flower.8 | 8 ++++++-- + tc/f_flower.c | 1 + + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8 +index 387f73f5cd2e9..661f42200bdfb 100644 +--- a/man/man8/tc-flower.8 ++++ b/man/man8/tc-flower.8 +@@ -255,8 +255,12 @@ is an 8 bit time-to-live value. + .BI ip_flags " IP_FLAGS" + .I IP_FLAGS + may be either +-.BR frag " or " nofrag +-to match on fragmented packets or not respectively. ++.BR frag ", " nofrag ", " firstfrag " or " nofirstfrag ++where frag and nofrag could be used to match on fragmented packets or not, ++respectively. firstfrag and nofirstfrag can be used to further distinguish ++fragmented packet. firstfrag can be used to indicate the first fragmented ++packet. nofirstfrag can be used to indicates subsequent fragmented packets ++or non-fragmented packets. + .SH NOTES + As stated above where applicable, matches of a certain layer implicitly depend + on the matches of the next lower layer. Precisely, layer one and two matches +diff --git a/tc/f_flower.c b/tc/f_flower.c +index 40dcfbd687a20..e2c7daa0b8e03 100644 +--- a/tc/f_flower.c ++++ b/tc/f_flower.c +@@ -162,6 +162,7 @@ struct flag_to_string { + + static struct flag_to_string flags_str[] = { + { TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT, FLOWER_IP_FLAGS, "frag" }, ++ { TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST, FLOWER_IP_FLAGS, "firstfrag" }, + }; + + static int flower_parse_matching_flags(char *str, +-- +2.20.1 + diff --git a/SOURCES/0070-ss-enclose-IPv6-address-in-brackets.patch b/SOURCES/0070-ss-enclose-IPv6-address-in-brackets.patch new file mode 100644 index 0000000..6c82bd1 --- /dev/null +++ b/SOURCES/0070-ss-enclose-IPv6-address-in-brackets.patch @@ -0,0 +1,62 @@ +From 765baea7751f7140571dfb0285b1fca974b3450b Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 18:03:01 +0200 +Subject: [PATCH] ss: enclose IPv6 address in brackets + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1588122 +Upstream Status: iproute2.git commit aba9c23a6e1cb + +commit aba9c23a6e1cb134840c998df14888dca469a485 +Author: Stephen Hemminger +Date: Fri Aug 4 12:02:41 2017 -0700 + + ss: enclose IPv6 address in brackets + + Based on patch by Lehner Florian + + Adds support for RFC2732 IPv6 address format with brackets. + + Signed-off-by: Stephen Hemminger +--- + misc/ss.c | 25 +++++++++++++++++++------ + 1 file changed, 19 insertions(+), 6 deletions(-) + +diff --git a/misc/ss.c b/misc/ss.c +index c0cb33e96d9ec..86defc71fabc4 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -1093,12 +1093,25 @@ static void inet_addr_print(const inet_prefix *a, int port, unsigned int ifindex + ap = format_host(AF_INET, 4, a->data); + } + } else { +- ap = format_host(a->family, 16, a->data); +- est_len = strlen(ap); +- if (est_len <= addr_width) +- est_len = addr_width; +- else +- est_len = addr_width + ((est_len-addr_width+3)/4)*4; ++ if (!memcmp(a->data, &in6addr_any, sizeof(in6addr_any))) { ++ buf[0] = '*'; ++ buf[1] = 0; ++ } else { ++ ap = format_host(a->family, 16, a->data); ++ ++ /* Numeric IPv6 addresses should be bracketed */ ++ if (strchr(ap, ':')) { ++ snprintf(buf, sizeof(buf), ++ "[%s]", ap); ++ ap = buf; ++ } ++ ++ est_len = strlen(ap); ++ if (est_len <= addr_width) ++ est_len = addr_width; ++ else ++ est_len = addr_width + ((est_len-addr_width+3)/4)*4; ++ } + } + + if (ifindex) { +-- +2.20.1 + diff --git a/SOURCES/0071-ip-address-Use-correct-max-attribute-value-in-print_.patch b/SOURCES/0071-ip-address-Use-correct-max-attribute-value-in-print_.patch new file mode 100644 index 0000000..111178e --- /dev/null +++ b/SOURCES/0071-ip-address-Use-correct-max-attribute-value-in-print_.patch @@ -0,0 +1,40 @@ +From 861fe3293afa0907f9883df005e7a09a5f4b710b Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 18:14:04 +0200 +Subject: [PATCH] ip-address: Use correct max attribute value in + print_vf_stats64() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1679749 +Upstream Status: iproute2.git commit d7cf2416fc3a0 + +commit d7cf2416fc3a08b411beffb93a9e118f6593892d +Author: Phil Sutter +Date: Thu Feb 21 19:37:51 2019 +0100 + + ip-address: Use correct max attribute value in print_vf_stats64() + + IFLA_VF_MAX is larger than the highest valid index in vf array. + + Fixes: a1b99717c7cd7 ("Add displaying VF traffic statistics") + Signed-off-by: Phil Sutter + Signed-off-by: Stephen Hemminger +--- + ip/ipaddress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ip/ipaddress.c b/ip/ipaddress.c +index 44111a27501a9..bed2d3801809b 100644 +--- a/ip/ipaddress.c ++++ b/ip/ipaddress.c +@@ -467,7 +467,7 @@ static void print_vf_stats64(FILE *fp, struct rtattr *vfstats) + return; + } + +- parse_rtattr_nested(vf, IFLA_VF_MAX, vfstats); ++ parse_rtattr_nested(vf, IFLA_VF_STATS_MAX, vfstats); + + /* RX stats */ + fprintf(fp, "%s", _SL_); +-- +2.20.1 + diff --git a/SOURCES/0072-examples-Some-shell-fixes-to-cbq.init.patch b/SOURCES/0072-examples-Some-shell-fixes-to-cbq.init.patch new file mode 100644 index 0000000..116adf8 --- /dev/null +++ b/SOURCES/0072-examples-Some-shell-fixes-to-cbq.init.patch @@ -0,0 +1,131 @@ +From c1aa1bc599f0ced53b5e9d21d01a03d78ae2b37f Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:05:37 +0200 +Subject: [PATCH] examples: Some shell fixes to cbq.init + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 2313b6bfe4f5e + +commit 2313b6bfe4f5e6b60fcdfaaeaa1eabcfd3f550f4 +Author: Phil Sutter +Date: Thu Aug 17 19:09:31 2017 +0200 + + examples: Some shell fixes to cbq.init + + This addresses the following issues: + + - $@ is an array, so don't use it in quoted strings - use $* instead. + + - Add missing quotes to components of [ ] expressions. These are not + strictly necessary since the output of 'wc -l' should be a single word + only, but in case of errors, bash prints "integer expression expected" + instead of "too many arguments". + + - Use -print0/-0 when piping from find to xargs to allow for filenames + which contain whitespace. + + - Quote arguments to 'eval' to prevent word-splitting. + + Signed-off-by: Phil Sutter +--- + examples/cbq.init-v0.7.3 | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/examples/cbq.init-v0.7.3 b/examples/cbq.init-v0.7.3 +index 1bc0d446f8983..66448d88f0053 100644 +--- a/examples/cbq.init-v0.7.3 ++++ b/examples/cbq.init-v0.7.3 +@@ -532,7 +532,7 @@ cbq_off () { + + ### Prefixed message + cbq_message () { +- echo -e "**CBQ: $@" ++ echo -e "**CBQ: $*" + } # cbq_message + + ### Failure message +@@ -560,15 +560,15 @@ cbq_time2abs () { + ### Display CBQ setup + cbq_show () { + for dev in `cbq_device_list`; do +- [ `tc qdisc show dev $dev| wc -l` -eq 0 ] && continue ++ [ "`tc qdisc show dev $dev| wc -l`" -eq 0 ] && continue + echo -e "### $dev: queueing disciplines\n" + tc $1 qdisc show dev $dev; echo + +- [ `tc class show dev $dev| wc -l` -eq 0 ] && continue ++ [ "`tc class show dev $dev| wc -l`" -eq 0 ] && continue + echo -e "### $dev: traffic classes\n" + tc $1 class show dev $dev; echo + +- [ `tc filter show dev $dev| wc -l` -eq 0 ] && continue ++ [ "`tc filter show dev $dev| wc -l`" -eq 0 ] && continue + echo -e "### $dev: filtering rules\n" + tc $1 filter show dev $dev; echo + done +@@ -585,7 +585,7 @@ cbq_init () { + + ### Gather all DEVICE fields from $1/cbq-* + DEVFIELDS=`find $1 -maxdepth 1 \( -type f -or -type l \) -name 'cbq-*' \ +- -not -name '*~' | xargs sed -n 's/#.*//; \ ++ -not -name '*~' -print0 | xargs -0 sed -n 's/#.*//; \ + s/[[:space:]]//g; /^DEVICE=[^,]*,[^,]*\(,[^,]*\)\?/ \ + { s/.*=//; p; }'| sort -u` + [ -z "$DEVFIELDS" ] && +@@ -593,7 +593,7 @@ cbq_init () { + + ### Check for different DEVICE fields for the same device + DEVICES=`echo "$DEVFIELDS"| sed 's/,.*//'| sort -u` +- [ `echo "$DEVICES"| wc -l` -ne `echo "$DEVFIELDS"| wc -l` ] && ++ [ "`echo "$DEVICES"| wc -l`" -ne "`echo "$DEVFIELDS"| wc -l`" ] && + cbq_failure "different DEVICE fields for single device!\n$DEVFIELDS" + } # cbq_init + +@@ -618,7 +618,7 @@ cbq_load_class () { + PRIO_MARK=$PRIO_MARK_DEFAULT + PRIO_REALM=$PRIO_REALM_DEFAULT + +- eval `echo "$CFILE"| grep -E "^($CBQ_WORDS)="` ++ eval "`echo "$CFILE"| grep -E "^($CBQ_WORDS)="`" + + ### Require RATE/WEIGHT + [ -z "$RATE" -o -z "$WEIGHT" ] && +@@ -661,7 +661,7 @@ if [ "$1" = "compile" ]; then + + ### echo-only version of "tc" command + tc () { +- echo "$TC $@" ++ echo "$TC $*" + } # tc + + elif [ -n "$CBQ_DEBUG" ]; then +@@ -669,13 +669,13 @@ elif [ -n "$CBQ_DEBUG" ]; then + + ### Logging version of "ip" command + ip () { +- echo -e "\n# ip $@" >> $CBQ_DEBUG ++ echo -e "\n# ip $*" >> $CBQ_DEBUG + $IP "$@" 2>&1 | tee -a $CBQ_DEBUG + } # ip + + ### Logging version of "tc" command + tc () { +- echo -e "\n# tc $@" >> $CBQ_DEBUG ++ echo -e "\n# tc $*" >> $CBQ_DEBUG + $TC "$@" 2>&1 | tee -a $CBQ_DEBUG + } # tc + else +@@ -711,8 +711,8 @@ if [ "$1" != "compile" -a "$2" != "nocache" -a -z "$CBQ_DEBUG" ]; then + ### validate the cache + [ "$2" = "invalidate" -o ! -f $CBQ_CACHE ] && VALID=0 + if [ $VALID -eq 1 ]; then +- [ `find $CBQ_PATH -maxdepth 1 -newer $CBQ_CACHE| \ +- wc -l` -gt 0 ] && VALID=0 ++ [ "`find $CBQ_PATH -maxdepth 1 -newer $CBQ_CACHE| \ ++ wc -l`" -gt 0 ] && VALID=0 + fi + + ### compile the config if the cache is invalid +-- +2.20.1 + diff --git a/SOURCES/0073-ifcfg-Quote-left-hand-side-of-expression.patch b/SOURCES/0073-ifcfg-Quote-left-hand-side-of-expression.patch new file mode 100644 index 0000000..14be257 --- /dev/null +++ b/SOURCES/0073-ifcfg-Quote-left-hand-side-of-expression.patch @@ -0,0 +1,38 @@ +From 955ce06f1f4be5a8733e5829e3c8cadf9fc68c40 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:05:37 +0200 +Subject: [PATCH] ifcfg: Quote left-hand side of [ ] expression + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 1e3197e0fdbf2 + +commit 1e3197e0fdbf299fe24cdba7c0d613317ed82063 +Author: Phil Sutter +Date: Thu Aug 17 19:09:32 2017 +0200 + + ifcfg: Quote left-hand side of [ ] expression + + This prevents word-splitting and therefore leads to more accurate error + message in case 'grep -c' prints something other than a number. + + Signed-off-by: Phil Sutter +--- + ip/ifcfg | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ip/ifcfg b/ip/ifcfg +index 083d9df36742f..30a2dc49816cd 100644 +--- a/ip/ifcfg ++++ b/ip/ifcfg +@@ -131,7 +131,7 @@ noarp=$? + + ip route add unreachable 224.0.0.0/24 >& /dev/null + ip route add unreachable 255.255.255.255 >& /dev/null +-if [ `ip link ls $dev | grep -c MULTICAST` -ge 1 ]; then ++if [ "`ip link ls $dev | grep -c MULTICAST`" -ge 1 ]; then + ip route add 224.0.0.0/4 dev $dev scope global >& /dev/null + fi + +-- +2.20.1 + diff --git a/SOURCES/0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch b/SOURCES/0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch new file mode 100644 index 0000000..e7192ee --- /dev/null +++ b/SOURCES/0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch @@ -0,0 +1,38 @@ +From 8743a7a8978270195693441f370cea552f100cae Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:05:38 +0200 +Subject: [PATCH] tipc/node: Fix socket fd check in cmd_node_get_addr() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 436270a45dea2 + +commit 436270a45dea2fe5dbc4680f9c8e31f07d167f20 +Author: Phil Sutter +Date: Thu Aug 17 19:09:32 2017 +0200 + + tipc/node: Fix socket fd check in cmd_node_get_addr() + + socket() returns -1 on error, not 0. + + Signed-off-by: Phil Sutter +--- + tipc/node.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tipc/node.c b/tipc/node.c +index 201fe1a4df3bd..fe085aec9b4ac 100644 +--- a/tipc/node.c ++++ b/tipc/node.c +@@ -109,7 +109,8 @@ static int cmd_node_get_addr(struct nlmsghdr *nlh, const struct cmd *cmd, + socklen_t sz = sizeof(struct sockaddr_tipc); + struct sockaddr_tipc addr; + +- if (!(sk = socket(AF_TIPC, SOCK_RDM, 0))) { ++ sk = socket(AF_TIPC, SOCK_RDM, 0); ++ if (sk < 0) { + fprintf(stderr, "opening TIPC socket: %s\n", strerror(errno)); + return -1; + } +-- +2.20.1 + diff --git a/SOURCES/0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch b/SOURCES/0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch new file mode 100644 index 0000000..97c715e --- /dev/null +++ b/SOURCES/0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch @@ -0,0 +1,35 @@ +From 4e55e568493084c458ef96f10a2a3dab93e8464a Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:05:38 +0200 +Subject: [PATCH] iproute_lwtunnel: Argument to strerror must be positive + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 58a15e6c7e7cb + +commit 58a15e6c7e7cb4c0d25e6bb3762ac2b1c94ff523 +Author: Phil Sutter +Date: Thu Aug 17 19:09:31 2017 +0200 + + iproute_lwtunnel: Argument to strerror must be positive + + Signed-off-by: Phil Sutter +--- + ip/iproute_lwtunnel.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c +index b6f08f073ef02..92ea2c87787ec 100644 +--- a/ip/iproute_lwtunnel.c ++++ b/ip/iproute_lwtunnel.c +@@ -480,7 +480,7 @@ static int lwt_parse_bpf(struct rtattr *rta, size_t len, + err = bpf_parse_common(bpf_type, &cfg, &bpf_cb_ops, &x); + if (err < 0) { + fprintf(stderr, "Failed to parse eBPF program: %s\n", +- strerror(err)); ++ strerror(-err)); + return -1; + } + rta_nest_end(rta, nest); +-- +2.20.1 + diff --git a/SOURCES/0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch b/SOURCES/0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch new file mode 100644 index 0000000..df39404 --- /dev/null +++ b/SOURCES/0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch @@ -0,0 +1,61 @@ +From db11067fb37cc3a77cc70fb9233a454102c4854c Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:05:38 +0200 +Subject: [PATCH] iproute_lwtunnel: csum_mode value checking was ineffective + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 08806fb0191e9 +Conflicts: adjust rta_addattr8() call to handle return value + +commit 08806fb0191e9ee8769507dc93b722fd021feb34 +Author: Phil Sutter +Date: Thu Aug 17 19:09:30 2017 +0200 + + iproute_lwtunnel: csum_mode value checking was ineffective + + ila_csum_name2mode() returning -1 on error but being declared as + returning __u8 doesn't make much sense. Change the code to correctly + detect this issue. Checking for __u8 overruns shouldn't be necessary + though since ila_csum_name2mode() return values are well-defined. + + Signed-off-by: Phil Sutter +--- + ip/iproute_lwtunnel.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c +index 92ea2c87787ec..5da3a1b488cbd 100644 +--- a/ip/iproute_lwtunnel.c ++++ b/ip/iproute_lwtunnel.c +@@ -125,7 +125,7 @@ static char *ila_csum_mode2name(__u8 csum_mode) + } + } + +-static __u8 ila_csum_name2mode(char *name) ++static int ila_csum_name2mode(char *name) + { + if (strcmp(name, "adj-transport") == 0) + return ILA_CSUM_ADJUST_TRANSPORT; +@@ -348,7 +348,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + + while (argc > 0) { + if (strcmp(*argv, "csum-mode") == 0) { +- __u8 csum_mode; ++ int csum_mode; + + NEXT_ARG(); + +@@ -357,8 +357,8 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, + invarg("\"csum-mode\" value is invalid\n", + *argv); + +- ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE, +- (__u8)csum_mode); ++ ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, ++ (__u8)csum_mode); + + argc--; argv++; + } else { +-- +2.20.1 + diff --git a/SOURCES/0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch b/SOURCES/0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch new file mode 100644 index 0000000..3ae8c4b --- /dev/null +++ b/SOURCES/0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch @@ -0,0 +1,107 @@ +From fa8b9f8fa8a6762bb0151e65a11eca9dca7aca83 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ss: Don't leak fd in tcp_show_netlink_file() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 4b45ae221e949 + +commit 4b45ae221e949b604d968a10d5d996c7c7cec1a6 +Author: Phil Sutter +Date: Thu Aug 17 19:09:30 2017 +0200 + + ss: Don't leak fd in tcp_show_netlink_file() + + Signed-off-by: Phil Sutter +--- + misc/ss.c | 32 ++++++++++++++++++++------------ + 1 file changed, 20 insertions(+), 12 deletions(-) + +diff --git a/misc/ss.c b/misc/ss.c +index 86defc71fabc4..eb46e0c4b95fb 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -2764,41 +2764,44 @@ static int tcp_show_netlink_file(struct filter *f) + { + FILE *fp; + char buf[16384]; ++ int err = -1; + + if ((fp = fopen(getenv("TCPDIAG_FILE"), "r")) == NULL) { + perror("fopen($TCPDIAG_FILE)"); +- return -1; ++ return err; + } + + while (1) { +- int status, err; ++ int status, err2; + struct nlmsghdr *h = (struct nlmsghdr *)buf; + struct sockstat s = {}; + + status = fread(buf, 1, sizeof(*h), fp); + if (status < 0) { + perror("Reading header from $TCPDIAG_FILE"); +- return -1; ++ break; + } + if (status != sizeof(*h)) { + perror("Unexpected EOF reading $TCPDIAG_FILE"); +- return -1; ++ break; + } + + status = fread(h+1, 1, NLMSG_ALIGN(h->nlmsg_len-sizeof(*h)), fp); + + if (status < 0) { + perror("Reading $TCPDIAG_FILE"); +- return -1; ++ break; + } + if (status + sizeof(*h) < h->nlmsg_len) { + perror("Unexpected EOF reading $TCPDIAG_FILE"); +- return -1; ++ break; + } + + /* The only legal exit point */ +- if (h->nlmsg_type == NLMSG_DONE) +- return 0; ++ if (h->nlmsg_type == NLMSG_DONE) { ++ err = 0; ++ break; ++ } + + if (h->nlmsg_type == NLMSG_ERROR) { + struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(h); +@@ -2809,7 +2812,7 @@ static int tcp_show_netlink_file(struct filter *f) + errno = -err->error; + perror("TCPDIAG answered"); + } +- return -1; ++ break; + } + + parse_diag_msg(h, &s); +@@ -2818,10 +2821,15 @@ static int tcp_show_netlink_file(struct filter *f) + if (f && f->f && run_ssfilter(f->f, &s) == 0) + continue; + +- err = inet_show_sock(h, &s); +- if (err < 0) +- return err; ++ err2 = inet_show_sock(h, &s); ++ if (err2 < 0) { ++ err = err2; ++ break; ++ } + } ++ ++ fclose(fp); ++ return err; + } + + static int tcp_show(struct filter *f) +-- +2.20.1 + diff --git a/SOURCES/0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch b/SOURCES/0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch new file mode 100644 index 0000000..30c146e --- /dev/null +++ b/SOURCES/0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch @@ -0,0 +1,34 @@ +From d28ee4b622ad9fa10a81d88bb6b5ded02c085acd Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] tc/em_ipset: Don't leak sockfd on error path + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 3e587d9f43891 + +commit 3e587d9f438910df6c1751c45fd898cec1477ae6 +Author: Phil Sutter +Date: Thu Aug 17 19:09:31 2017 +0200 + + tc/em_ipset: Don't leak sockfd on error path + + Signed-off-by: Phil Sutter +--- + tc/em_ipset.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tc/em_ipset.c b/tc/em_ipset.c +index fab975f5ea563..b59756515d239 100644 +--- a/tc/em_ipset.c ++++ b/tc/em_ipset.c +@@ -84,6 +84,7 @@ static int get_version(unsigned int *version) + res = getsockopt(sockfd, SOL_IP, SO_IP_SET, &req_version, &size); + if (res != 0) { + perror("xt_set getsockopt"); ++ close(sockfd); + return -1; + } + +-- +2.20.1 + diff --git a/SOURCES/0079-ipvrf-Fix-error-path-of-vrf_switch.patch b/SOURCES/0079-ipvrf-Fix-error-path-of-vrf_switch.patch new file mode 100644 index 0000000..ebf3bbc --- /dev/null +++ b/SOURCES/0079-ipvrf-Fix-error-path-of-vrf_switch.patch @@ -0,0 +1,60 @@ +From 7ea6dbec34ae5166dd93fd4dbfcab35512e86e94 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ipvrf: Fix error path of vrf_switch() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 6ac5943bdd5ac + +commit 6ac5943bdd5ac5bb8c22b99f5a1d5907ebbcae2b +Author: Phil Sutter +Date: Thu Aug 17 19:09:27 2017 +0200 + + ipvrf: Fix error path of vrf_switch() + + Apart from trying to close(-1), this also leaked memory. + + Signed-off-by: Phil Sutter +--- + ip/ipvrf.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/ip/ipvrf.c b/ip/ipvrf.c +index 0f611b44b78ab..ae3b48fa81996 100644 +--- a/ip/ipvrf.c ++++ b/ip/ipvrf.c +@@ -369,12 +369,12 @@ static int vrf_switch(const char *name) + + /* -1 on length to add '/' to the end */ + if (ipvrf_get_netns(netns, sizeof(netns) - 1) < 0) +- return -1; ++ goto out; + + if (vrf_path(vpath, sizeof(vpath)) < 0) { + fprintf(stderr, "Failed to get base cgroup path: %s\n", + strerror(errno)); +- return -1; ++ goto out; + } + + /* if path already ends in netns then don't add it again */ +@@ -425,13 +425,14 @@ static int vrf_switch(const char *name) + snprintf(pid, sizeof(pid), "%d", getpid()); + if (write(fd, pid, strlen(pid)) < 0) { + fprintf(stderr, "Failed to join cgroup\n"); +- goto out; ++ goto out2; + } + + rc = 0; ++out2: ++ close(fd); + out: + free(mnt); +- close(fd); + + return rc; + } +-- +2.20.1 + diff --git a/SOURCES/0080-ifstat-Fix-memleak-in-error-case.patch b/SOURCES/0080-ifstat-Fix-memleak-in-error-case.patch new file mode 100644 index 0000000..aac3573 --- /dev/null +++ b/SOURCES/0080-ifstat-Fix-memleak-in-error-case.patch @@ -0,0 +1,38 @@ +From 78ff1fa1a2ff22e6fb7dc0a689e5a4861826431e Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ifstat: Fix memleak in error case + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 35f6adefb8f9d + +commit 35f6adefb8f9d56437f5455ac8c0c3cc329e3317 +Author: Phil Sutter +Date: Thu Aug 17 19:09:28 2017 +0200 + + ifstat: Fix memleak in error case + + Signed-off-by: Phil Sutter +--- + misc/ifstat.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/misc/ifstat.c b/misc/ifstat.c +index a853ee6d7e3b3..8fa354265a9a1 100644 +--- a/misc/ifstat.c ++++ b/misc/ifstat.c +@@ -143,8 +143,10 @@ static int get_nlmsg_extended(const struct sockaddr_nl *who, + struct rtattr *attr; + + attr = parse_rtattr_one_nested(sub_type, tb[filter_type]); +- if (attr == NULL) ++ if (attr == NULL) { ++ free(n); + return 0; ++ } + memcpy(&n->val, RTA_DATA(attr), sizeof(n->val)); + } + memset(&n->rate, 0, sizeof(n->rate)); +-- +2.20.1 + diff --git a/SOURCES/0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch b/SOURCES/0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch new file mode 100644 index 0000000..520bac0 --- /dev/null +++ b/SOURCES/0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch @@ -0,0 +1,45 @@ +From 3f74fdcd943982101775db3b4240a6f953d1198d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ifstat: Fix memleak in dump_kern_db() for json output + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit b530cef0e3bbd + +commit b530cef0e3bbd27510e19f5f720a7ec94f3fa723 +Author: Phil Sutter +Date: Thu Aug 17 19:09:29 2017 +0200 + + ifstat: Fix memleak in dump_kern_db() for json output + + Looks like this was forgotten when converting to common json output + formatter. + + Fixes: fcc16c2287bf8 ("provide common json output formatter") + Signed-off-by: Phil Sutter +--- + misc/ifstat.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/misc/ifstat.c b/misc/ifstat.c +index 8fa354265a9a1..1be21703bf14c 100644 +--- a/misc/ifstat.c ++++ b/misc/ifstat.c +@@ -535,8 +535,12 @@ static void dump_kern_db(FILE *fp) + else + print_one_if(fp, n, n->val); + } +- if (json_output) +- fprintf(fp, "\n} }\n"); ++ if (jw) { ++ jsonw_end_object(jw); ++ ++ jsonw_end_object(jw); ++ jsonw_destroy(&jw); ++ } + } + + static void dump_incr_db(FILE *fp) +-- +2.20.1 + diff --git a/SOURCES/0082-ss-Fix-potential-memleak-in-unix_stats_print.patch b/SOURCES/0082-ss-Fix-potential-memleak-in-unix_stats_print.patch new file mode 100644 index 0000000..57bec49 --- /dev/null +++ b/SOURCES/0082-ss-Fix-potential-memleak-in-unix_stats_print.patch @@ -0,0 +1,39 @@ +From 125c0e845acd690c9dce5702413294304a328fd1 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ss: Fix potential memleak in unix_stats_print() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 46131577cf1ba + +commit 46131577cf1ba37198c82e1ce89c9bbca2153ef4 +Author: Phil Sutter +Date: Thu Aug 17 19:09:30 2017 +0200 + + ss: Fix potential memleak in unix_stats_print() + + Fixes: 2d0e538f3e1cd ("ss: Drop list traversal from unix_stats_print()") + Signed-off-by: Phil Sutter +--- + misc/ss.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/misc/ss.c b/misc/ss.c +index eb46e0c4b95fb..c97f05a4c7033 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -3258,8 +3258,10 @@ static int unix_show(struct filter *f) + + if (name[0]) { + u->name = strdup(name); +- if (!u->name) ++ if (!u->name) { ++ free(u); + break; ++ } + } + + if (u->rport) { +-- +2.20.1 + diff --git a/SOURCES/0083-tipc-bearer-Fix-resource-leak-in-error-path.patch b/SOURCES/0083-tipc-bearer-Fix-resource-leak-in-error-path.patch new file mode 100644 index 0000000..db1fd9d --- /dev/null +++ b/SOURCES/0083-tipc-bearer-Fix-resource-leak-in-error-path.patch @@ -0,0 +1,43 @@ +From b6bf156c4d4abab8176112e48a595c3e7bb7f825 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] tipc/bearer: Fix resource leak in error path + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit be55416addf76 + +commit be55416addf76e76836af6a4dd94b19c4186e1b2 +Author: Phil Sutter +Date: Thu Aug 17 19:09:31 2017 +0200 + + tipc/bearer: Fix resource leak in error path + + Signed-off-by: Phil Sutter +--- + tipc/bearer.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tipc/bearer.c b/tipc/bearer.c +index 810344f672af1..c3d4491f8f6ef 100644 +--- a/tipc/bearer.c ++++ b/tipc/bearer.c +@@ -163,6 +163,7 @@ static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts, + if (!remip) { + if (generate_multicast(loc->ai_family, buf, sizeof(buf))) { + fprintf(stderr, "Failed to generate multicast address\n"); ++ freeaddrinfo(loc); + return -EINVAL; + } + remip = buf; +@@ -177,6 +178,8 @@ static int nl_add_udp_enable_opts(struct nlmsghdr *nlh, struct opt *opts, + + if (rem->ai_family != loc->ai_family) { + fprintf(stderr, "UDP local and remote AF mismatch\n"); ++ freeaddrinfo(rem); ++ freeaddrinfo(loc); + return -EINVAL; + } + +-- +2.20.1 + diff --git a/SOURCES/0084-devlink-No-need-for-this-self-assignment.patch b/SOURCES/0084-devlink-No-need-for-this-self-assignment.patch new file mode 100644 index 0000000..7809ca6 --- /dev/null +++ b/SOURCES/0084-devlink-No-need-for-this-self-assignment.patch @@ -0,0 +1,39 @@ +From 1fe740ceabb0b965224678a69a02255e20d5a47a Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] devlink: No need for this self-assignment + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 8579a398c5ab0 + +commit 8579a398c5ab0d26bce0ed9b4b6b6e5d62fcc89d +Author: Phil Sutter +Date: Thu Aug 17 19:09:25 2017 +0200 + + devlink: No need for this self-assignment + + dl_argv_handle_both() will either assign to handle_bit or error out in + which case the variable is not used by the caller. + + Signed-off-by: Phil Sutter + Acked-by: Jiri Pirko +--- + devlink/devlink.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index 2000db81aabb0..ae295b5632e8c 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -845,7 +845,7 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required, + int err; + + if (o_required & DL_OPT_HANDLE && o_required & DL_OPT_HANDLEP) { +- uint32_t handle_bit = handle_bit; ++ uint32_t handle_bit; + + err = dl_argv_handle_both(dl, &opts->bus_name, &opts->dev_name, + &opts->port_index, &handle_bit); +-- +2.20.1 + diff --git a/SOURCES/0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch b/SOURCES/0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch new file mode 100644 index 0000000..5d26732 --- /dev/null +++ b/SOURCES/0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch @@ -0,0 +1,38 @@ +From d62d2ffc71194068af509ec3285ecd6823d883fb Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ipntable: No need to check and assign to parms_rta + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 2869262144271 + +commit 28692621442710f4a67fe33742f56efc582ee33a +Author: Phil Sutter +Date: Thu Aug 17 19:09:26 2017 +0200 + + ipntable: No need to check and assign to parms_rta + + This variable is initialized at declaration and nowhere else does any + assignment to it happen, so just drop the check. + + Signed-off-by: Phil Sutter +--- + ip/ipntable.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/ip/ipntable.c b/ip/ipntable.c +index 65063321c85f8..ae8c74ead2cb8 100644 +--- a/ip/ipntable.c ++++ b/ip/ipntable.c +@@ -202,8 +202,6 @@ static int ipntable_modify(int cmd, int flags, int argc, char **argv) + if (get_u32(&queue, *argv, 0)) + invarg("\"queue\" value is invalid", *argv); + +- if (!parms_rta) +- parms_rta = (struct rtattr *)&parms_buf; + rta_addattr32(parms_rta, sizeof(parms_buf), + NDTPA_QUEUE_LEN, queue); + parms_change = 1; +-- +2.20.1 + diff --git a/SOURCES/0086-iproute-Fix-for-missing-Oifs-display.patch b/SOURCES/0086-iproute-Fix-for-missing-Oifs-display.patch new file mode 100644 index 0000000..32254db --- /dev/null +++ b/SOURCES/0086-iproute-Fix-for-missing-Oifs-display.patch @@ -0,0 +1,55 @@ +From 2cb971cefe001a66677c2d1d23b1596cbffb3989 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] iproute: Fix for missing 'Oifs:' display + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 2a866256197f8 + +commit 2a866256197f8b86e61fa1afc99b11d7056d5686 +Author: Phil Sutter +Date: Thu Aug 17 19:09:27 2017 +0200 + + iproute: Fix for missing 'Oifs:' display + + Covscan complained about dead code but after reading it, I assume the + author's intention was to prefix the interface list with 'Oifs: '. + Initializing first to 1 and setting it to 0 after above prefix was + printed should fix it. + + Signed-off-by: Phil Sutter +--- + ip/iproute.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/ip/iproute.c b/ip/iproute.c +index d4db035fc7b24..6ebc6214c45ee 100644 +--- a/ip/iproute.c ++++ b/ip/iproute.c +@@ -618,7 +618,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) + } + if (tb[RTA_MULTIPATH]) { + struct rtnexthop *nh = RTA_DATA(tb[RTA_MULTIPATH]); +- int first = 0; ++ int first = 1; + + len = RTA_PAYLOAD(tb[RTA_MULTIPATH]); + +@@ -628,10 +628,12 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) + if (nh->rtnh_len > len) + break; + if (r->rtm_flags&RTM_F_CLONED && r->rtm_type == RTN_MULTICAST) { +- if (first) ++ if (first) { + fprintf(fp, "Oifs: "); +- else ++ first = 0; ++ } else { + fprintf(fp, " "); ++ } + } else + fprintf(fp, "%s\tnexthop ", _SL_); + if (nh->rtnh_len > sizeof(*nh)) { +-- +2.20.1 + diff --git a/SOURCES/0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch b/SOURCES/0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch new file mode 100644 index 0000000..4f32b28 --- /dev/null +++ b/SOURCES/0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch @@ -0,0 +1,40 @@ +From cd4f6a9976a969d4981b3b3d09b60ed311f3e9a5 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] lib/rt_names: Drop dead code in rtnl_rttable_n2a() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit b3c5f84493d33 + +commit b3c5f84493d3399a546566475203207aa5b64d54 +Author: Phil Sutter +Date: Thu Aug 17 19:09:28 2017 +0200 + + lib/rt_names: Drop dead code in rtnl_rttable_n2a() + + Since 'id' is 32bit unsigned, it can never exceed RT_TABLE_MAX (which is + defined to 0xFFFFFFFF). Therefore drop that never matching conditional. + + Signed-off-by: Phil Sutter +--- + lib/rt_names.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/lib/rt_names.c b/lib/rt_names.c +index 04c15ff5b15f8..e5efd78e6f810 100644 +--- a/lib/rt_names.c ++++ b/lib/rt_names.c +@@ -410,10 +410,6 @@ const char *rtnl_rttable_n2a(__u32 id, char *buf, int len) + { + struct rtnl_hash_entry *entry; + +- if (id > RT_TABLE_MAX) { +- snprintf(buf, len, "%u", id); +- return buf; +- } + if (!rtnl_rttable_init) + rtnl_rttable_initialize(); + entry = rtnl_rttable_hash[id & 255]; +-- +2.20.1 + diff --git a/SOURCES/0088-ss-Skip-useless-check-in-parse_hostcond.patch b/SOURCES/0088-ss-Skip-useless-check-in-parse_hostcond.patch new file mode 100644 index 0000000..ce300e1 --- /dev/null +++ b/SOURCES/0088-ss-Skip-useless-check-in-parse_hostcond.patch @@ -0,0 +1,39 @@ +From 4b2f0a5a479f2714b8b44932ba961ba8cf07e18e Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ss: Skip useless check in parse_hostcond() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 44448a90eab34 + +commit 44448a90eab34713af019356926828720c67a268 +Author: Phil Sutter +Date: Thu Aug 17 19:09:29 2017 +0200 + + ss: Skip useless check in parse_hostcond() + + The passed 'addr' parameter is dereferenced by caller before and in + parse_hostcond() multiple times before this check, so assume it is + always true. + + Signed-off-by: Phil Sutter +--- + misc/ss.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/misc/ss.c b/misc/ss.c +index c97f05a4c7033..38f4017e4a8c8 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -1747,7 +1747,7 @@ void *parse_hostcond(char *addr, bool is_port) + } + } + } +- if (!is_port && addr && *addr && *addr != '*') { ++ if (!is_port && *addr && *addr != '*') { + if (get_prefix_1(&a.addr, addr, fam)) { + if (get_dns_host(&a, addr, fam)) { + fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", addr); +-- +2.20.1 + diff --git a/SOURCES/0089-ss-Drop-useless-assignment.patch b/SOURCES/0089-ss-Drop-useless-assignment.patch new file mode 100644 index 0000000..c406ed9 --- /dev/null +++ b/SOURCES/0089-ss-Drop-useless-assignment.patch @@ -0,0 +1,36 @@ +From 23e13f60728a68b2c4a5b3656a1ce79affaafc6d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] ss: Drop useless assignment + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit e469523e8e8d1 + +commit e469523e8e8d1d31c3b35251105e2a843216d687 +Author: Phil Sutter +Date: Thu Aug 17 19:09:30 2017 +0200 + + ss: Drop useless assignment + + After '*b = *a', 'b->next' already has the same value as 'a->next'. + + Signed-off-by: Phil Sutter +--- + misc/ss.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/misc/ss.c b/misc/ss.c +index 38f4017e4a8c8..cc38fc499c210 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -1476,7 +1476,6 @@ static int remember_he(struct aafilter *a, struct hostent *he) + if ((b = malloc(sizeof(*b))) == NULL) + return cnt; + *b = *a; +- b->next = a->next; + a->next = b; + } + memcpy(b->addr.data, *ptr, len); +-- +2.20.1 + diff --git a/SOURCES/0090-tc-m_gact-Drop-dead-code.patch b/SOURCES/0090-tc-m_gact-Drop-dead-code.patch new file mode 100644 index 0000000..b3702ee --- /dev/null +++ b/SOURCES/0090-tc-m_gact-Drop-dead-code.patch @@ -0,0 +1,90 @@ +From c6e0fc7a5ec0b890c35a3b5d4cc5e1f7794cc47f Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:07:22 +0200 +Subject: [PATCH] tc/m_gact: Drop dead code + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 73aa988868e7e +Conflicts: context change due to missing commits: +* e67aba5595811 ("tc: actions: add helpers to parse and print control actions") +* 18f05d06016d9 ("tc: gact: fix control action parsing") + +commit 73aa988868e7e068b4fc0daaca7cfdb3e07fe744 +Author: Phil Sutter +Date: Thu Aug 17 19:09:31 2017 +0200 + + tc/m_gact: Drop dead code + + The use of 'ok' variable in parse_gact() is ineffective: The second + conditional increments it either if *argv is 'gact' or if + parse_action_control() doesn't fail (in which case exit() is called). + So this is effectively an unconditional increment and since no decrement + happens anywhere, all remaining checks for 'ok != 0' can be dropped. + + Signed-off-by: Phil Sutter +--- + tc/m_gact.c | 18 +++++------------- + 1 file changed, 5 insertions(+), 13 deletions(-) + +diff --git a/tc/m_gact.c b/tc/m_gact.c +index 755a3bee2c2f2..0cb5222fd3817 100644 +--- a/tc/m_gact.c ++++ b/tc/m_gact.c +@@ -86,7 +86,6 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + { + int argc = *argc_p; + char **argv = *argv_p; +- int ok = 0; + int action = TC_POLICE_RECLASSIFY; + struct tc_gact p = { .action = TC_POLICE_RECLASSIFY }; + #ifdef CONFIG_GACT_PROB +@@ -100,25 +99,22 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + + + if (matches(*argv, "gact") == 0) { +- ok++; ++ argc--; ++ argv++; + } else { + action = get_act(&argv); + if (action != -10) { + p.action = action; +- ok++; ++ argc--; ++ argv++; + } else { + explain(); + return action; + } + } + +- if (ok) { +- argc--; +- argv++; +- } +- + #ifdef CONFIG_GACT_PROB +- if (ok && argc > 0) { ++ if (argc > 0) { + if (matches(*argv, "random") == 0) { + rd = 1; + NEXT_ARG(); +@@ -167,15 +163,11 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + } + argc--; + argv++; +- ok++; + } else if (matches(*argv, "help") == 0) { + usage(); + } + } + +- if (!ok) +- return -1; +- + tail = NLMSG_TAIL(n); + addattr_l(n, MAX_MSG, tca_id, NULL, 0); + addattr_l(n, MAX_MSG, TCA_GACT_PARMS, &p, sizeof(p)); +-- +2.20.1 + diff --git a/SOURCES/0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch b/SOURCES/0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch new file mode 100644 index 0000000..fcf2770 --- /dev/null +++ b/SOURCES/0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch @@ -0,0 +1,38 @@ +From a7150dc1d46b73f65bfedd728aeca1dcf5ec20eb Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] ipaddress: Avoid accessing uninitialized variable lcl + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit d044ea3e784d1 + +commit d044ea3e784d1a4f0a61f306b86ce95c9a26b0b5 +Author: Phil Sutter +Date: Mon Aug 21 11:26:59 2017 +0200 + + ipaddress: Avoid accessing uninitialized variable lcl + + If no address was given, ipaddr_modify() accesses uninitialized data + when assigning to req.ifa.ifa_prefixlen. + + Signed-off-by: Phil Sutter +--- + ip/ipaddress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ip/ipaddress.c b/ip/ipaddress.c +index bed2d3801809b..2c27da3a1f079 100644 +--- a/ip/ipaddress.c ++++ b/ip/ipaddress.c +@@ -1887,7 +1887,7 @@ static int ipaddr_modify(int cmd, int flags, int argc, char **argv) + char *lcl_arg = NULL; + char *valid_lftp = NULL; + char *preferred_lftp = NULL; +- inet_prefix lcl; ++ inet_prefix lcl = {}; + inet_prefix peer; + int local_len = 0; + int peer_len = 0; +-- +2.20.1 + diff --git a/SOURCES/0092-iplink_can-Prevent-overstepping-array-bounds.patch b/SOURCES/0092-iplink_can-Prevent-overstepping-array-bounds.patch new file mode 100644 index 0000000..0804c5b --- /dev/null +++ b/SOURCES/0092-iplink_can-Prevent-overstepping-array-bounds.patch @@ -0,0 +1,49 @@ +From 4c775c035e2751b1aec52dcc2ca0e4fc99bac793 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] iplink_can: Prevent overstepping array bounds + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 258b7c0fa70c2 + +commit 258b7c0fa70c2d6b5f9776cc35c38c80b4ee5752 +Author: Phil Sutter +Date: Mon Aug 21 11:27:00 2017 +0200 + + iplink_can: Prevent overstepping array bounds + + can_state_names array contains at most CAN_STATE_MAX fields, so allowing + an index to it to be equal to that number is wrong. While here, also + make sure the array is indeed that big so nothing bad happens if + CAN_STATE_MAX ever increases. + + Signed-off-by: Phil Sutter +--- + ip/iplink_can.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/ip/iplink_can.c b/ip/iplink_can.c +index 20d4d37d0d087..4133a658a059e 100644 +--- a/ip/iplink_can.c ++++ b/ip/iplink_can.c +@@ -241,7 +241,7 @@ static int can_parse_opt(struct link_util *lu, int argc, char **argv, + return 0; + } + +-static const char *can_state_names[] = { ++static const char *can_state_names[CAN_STATE_MAX] = { + [CAN_STATE_ERROR_ACTIVE] = "ERROR-ACTIVE", + [CAN_STATE_ERROR_WARNING] = "ERROR-WARNING", + [CAN_STATE_ERROR_PASSIVE] = "ERROR-PASSIVE", +@@ -265,7 +265,7 @@ static void can_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) + if (tb[IFLA_CAN_STATE]) { + uint32_t state = rta_getattr_u32(tb[IFLA_CAN_STATE]); + +- fprintf(f, "state %s ", state <= CAN_STATE_MAX ? ++ fprintf(f, "state %s ", state < CAN_STATE_MAX ? + can_state_names[state] : "UNKNOWN"); + } + +-- +2.20.1 + diff --git a/SOURCES/0093-ipmaddr-Avoid-accessing-uninitialized-data.patch b/SOURCES/0093-ipmaddr-Avoid-accessing-uninitialized-data.patch new file mode 100644 index 0000000..03b06ec --- /dev/null +++ b/SOURCES/0093-ipmaddr-Avoid-accessing-uninitialized-data.patch @@ -0,0 +1,38 @@ +From e5d32611010d4694562980b790ed7849342f594b Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] ipmaddr: Avoid accessing uninitialized data + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit b48a1161f5f9b + +commit b48a1161f5f9b6a0cda399a224bbbf72eba4a5c6 +Author: Phil Sutter +Date: Mon Aug 21 11:27:01 2017 +0200 + + ipmaddr: Avoid accessing uninitialized data + + Looks like this can only happen if /proc/net/igmp is malformed, but + better be sure. + + Signed-off-by: Phil Sutter +--- + ip/ipmaddr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ip/ipmaddr.c b/ip/ipmaddr.c +index 4f726fdd976f1..85a69e779563d 100644 +--- a/ip/ipmaddr.c ++++ b/ip/ipmaddr.c +@@ -136,7 +136,7 @@ static void read_igmp(struct ma_info **result_p) + + while (fgets(buf, sizeof(buf), fp)) { + struct ma_info *ma; +- size_t len; ++ size_t len = 0; + + if (buf[0] != '\t') { + sscanf(buf, "%d%s", &m.index, m.name); +-- +2.20.1 + diff --git a/SOURCES/0094-ss-Use-C99-initializer-in-netlink_show_one.patch b/SOURCES/0094-ss-Use-C99-initializer-in-netlink_show_one.patch new file mode 100644 index 0000000..4914cd9 --- /dev/null +++ b/SOURCES/0094-ss-Use-C99-initializer-in-netlink_show_one.patch @@ -0,0 +1,54 @@ +From 60a5c300c8cd0fbd4c378900d298eb2444c0343d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] ss: Use C99 initializer in netlink_show_one() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 301826beb3baa + +commit 301826beb3baa902e2057d81912d1586459f605f +Author: Phil Sutter +Date: Mon Aug 21 11:27:02 2017 +0200 + + ss: Use C99 initializer in netlink_show_one() + + This has the additional benefit of initializing st.ino to zero which is + used later in is_sctp_assoc() function. + + Signed-off-by: Phil Sutter +--- + misc/ss.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/misc/ss.c b/misc/ss.c +index cc38fc499c210..7a38e9d830e8d 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -3567,17 +3567,18 @@ static int netlink_show_one(struct filter *f, + int rq, int wq, + unsigned long long sk, unsigned long long cb) + { +- struct sockstat st; ++ struct sockstat st = { ++ .state = SS_CLOSE, ++ .rq = rq, ++ .wq = wq, ++ .local.family = AF_NETLINK, ++ .remote.family = AF_NETLINK, ++ }; + + SPRINT_BUF(prot_buf) = {}; + const char *prot_name; + char procname[64] = {}; + +- st.state = SS_CLOSE; +- st.rq = rq; +- st.wq = wq; +- st.local.family = st.remote.family = AF_NETLINK; +- + if (f->f) { + st.rport = -1; + st.lport = pid; +-- +2.20.1 + diff --git a/SOURCES/0095-netem-maketable-Check-return-value-of-fstat.patch b/SOURCES/0095-netem-maketable-Check-return-value-of-fstat.patch new file mode 100644 index 0000000..37c71a3 --- /dev/null +++ b/SOURCES/0095-netem-maketable-Check-return-value-of-fstat.patch @@ -0,0 +1,39 @@ +From 56c1a9e6c4d7d54ee27472428bcb33be471b3346 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] netem/maketable: Check return value of fstat() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit d304b05c12b3a + +commit d304b05c12b3a0247b627ebc8e4477520bb4b969 +Author: Phil Sutter +Date: Mon Aug 21 11:27:03 2017 +0200 + + netem/maketable: Check return value of fstat() + + Otherwise info.st_size may contain garbage. + + Signed-off-by: Phil Sutter +--- + netem/maketable.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/netem/maketable.c b/netem/maketable.c +index 6aff927be7040..ad660e7d457f0 100644 +--- a/netem/maketable.c ++++ b/netem/maketable.c +@@ -24,8 +24,8 @@ readdoubles(FILE *fp, int *number) + int limit; + int n=0, i; + +- fstat(fileno(fp), &info); +- if (info.st_size > 0) { ++ if (!fstat(fileno(fp), &info) && ++ info.st_size > 0) { + limit = 2*info.st_size/sizeof(double); /* @@ approximate */ + } else { + limit = 10000; +-- +2.20.1 + diff --git a/SOURCES/0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch b/SOURCES/0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch new file mode 100644 index 0000000..eb63ef2 --- /dev/null +++ b/SOURCES/0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch @@ -0,0 +1,38 @@ +From 8a115584261b32308d604063b56f25330ce8adaf Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] tc/q_multiq: Don't pass garbage in TCA_OPTIONS + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 82ed9ffa2bb86 + +commit 82ed9ffa2bb86eea653f68a0ade945b7708818c9 +Author: Phil Sutter +Date: Mon Aug 21 11:27:04 2017 +0200 + + tc/q_multiq: Don't pass garbage in TCA_OPTIONS + + multiq_parse_opt() doesn't change 'opt' at all. So at least make sure + it doesn't fill TCA_OPTIONS attribute with garbage from stack. + + Signed-off-by: Phil Sutter +--- + tc/q_multiq.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tc/q_multiq.c b/tc/q_multiq.c +index 7823931494563..9c09c9a7748f6 100644 +--- a/tc/q_multiq.c ++++ b/tc/q_multiq.c +@@ -43,7 +43,7 @@ static void explain(void) + static int multiq_parse_opt(struct qdisc_util *qu, int argc, char **argv, + struct nlmsghdr *n) + { +- struct tc_multiq_qopt opt; ++ struct tc_multiq_qopt opt = {}; + + if (argc) { + if (strcmp(*argv, "help") == 0) { +-- +2.20.1 + diff --git a/SOURCES/0097-iproute-Check-mark-value-input.patch b/SOURCES/0097-iproute-Check-mark-value-input.patch new file mode 100644 index 0000000..73c7ae8 --- /dev/null +++ b/SOURCES/0097-iproute-Check-mark-value-input.patch @@ -0,0 +1,46 @@ +From ce3460e0a39948054139e5bcf72130e82bf2da8d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] iproute: Check mark value input + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 7c66d89828a6e + +commit 7c66d89828a6ee4c5a4e3f48ef4a4cb07b50013d +Author: Phil Sutter +Date: Mon Aug 21 18:36:50 2017 +0200 + + iproute: Check mark value input + + Signed-off-by: Phil Sutter +--- + ip/iproute.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/ip/iproute.c b/ip/iproute.c +index 6ebc6214c45ee..1d92530fd3421 100644 +--- a/ip/iproute.c ++++ b/ip/iproute.c +@@ -1481,7 +1481,8 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action) + id = *argv; + } else if (strcmp(*argv, "mark") == 0) { + NEXT_ARG(); +- get_unsigned(&mark, *argv, 0); ++ if (get_unsigned(&mark, *argv, 0)) ++ invarg("invalid mark value", *argv); + filter.markmask = -1; + } else if (strcmp(*argv, "via") == 0) { + int family; +@@ -1698,7 +1699,8 @@ static int iproute_get(int argc, char **argv) + idev = *argv; + } else if (matches(*argv, "mark") == 0) { + NEXT_ARG(); +- get_unsigned(&mark, *argv, 0); ++ if (get_unsigned(&mark, *argv, 0)) ++ invarg("invalid mark value", *argv); + } else if (matches(*argv, "oif") == 0 || + strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +-- +2.20.1 + diff --git a/SOURCES/0098-iplink_vrf-Complain-if-main-table-is-not-found.patch b/SOURCES/0098-iplink_vrf-Complain-if-main-table-is-not-found.patch new file mode 100644 index 0000000..e42872e --- /dev/null +++ b/SOURCES/0098-iplink_vrf-Complain-if-main-table-is-not-found.patch @@ -0,0 +1,38 @@ +From b9d228a8c22f1d9069fa0c8f98e6bd94011c5714 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] iplink_vrf: Complain if main table is not found + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 84b6a3f4b5720 + +commit 84b6a3f4b5720aaf673c2eaad2cf60f786de077b +Author: Phil Sutter +Date: Mon Aug 21 18:36:51 2017 +0200 + + iplink_vrf: Complain if main table is not found + + Signed-off-by: Phil Sutter + Acked-by: David Ahern +--- + ip/iplink_vrf.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c +index 370bb86815a80..9c2de2732a88e 100644 +--- a/ip/iplink_vrf.c ++++ b/ip/iplink_vrf.c +@@ -127,7 +127,9 @@ __u32 ipvrf_get_table(const char *name) + if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, &answer) < 0) { + /* special case "default" vrf to be the main table */ + if (errno == ENODEV && !strcmp(name, "default")) +- rtnl_rttable_a2n(&tb_id, "main"); ++ if (rtnl_rttable_a2n(&tb_id, "main")) ++ fprintf(stderr, ++ "BUG: RTTable \"main\" not found.\n"); + + return tb_id; + } +-- +2.20.1 + diff --git a/SOURCES/0099-devlink-Check-return-code-of-strslashrsplit.patch b/SOURCES/0099-devlink-Check-return-code-of-strslashrsplit.patch new file mode 100644 index 0000000..4aa717f --- /dev/null +++ b/SOURCES/0099-devlink-Check-return-code-of-strslashrsplit.patch @@ -0,0 +1,62 @@ +From ea11b95042171f254fe0127ea0f1f2786d81dc83 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] devlink: Check return code of strslashrsplit() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 6e33f7b0f6e04 + +commit 6e33f7b0f6e04dd46bea24c3ab28d61e54625dd7 +Author: Phil Sutter +Date: Mon Aug 21 18:36:52 2017 +0200 + + devlink: Check return code of strslashrsplit() + + This function shouldn't fail because all callers of + __dl_argv_handle_port() make sure the passed string contains enough + slashes already, but better make sure if this changes in future the + function won't access uninitialized data. + + Signed-off-by: Phil Sutter +--- + devlink/devlink.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/devlink/devlink.c b/devlink/devlink.c +index ae295b5632e8c..082eeafa1146a 100644 +--- a/devlink/devlink.c ++++ b/devlink/devlink.c +@@ -576,18 +576,26 @@ static int __dl_argv_handle_port(char *str, + char **p_bus_name, char **p_dev_name, + uint32_t *p_port_index) + { +- char *handlestr = handlestr; +- char *portstr = portstr; ++ char *handlestr; ++ char *portstr; + int err; + +- strslashrsplit(str, &handlestr, &portstr); ++ err = strslashrsplit(str, &handlestr, &portstr); ++ if (err) { ++ pr_err("Port identification \"%s\" is invalid\n", str); ++ return err; ++ } + err = strtouint32_t(portstr, p_port_index); + if (err) { + pr_err("Port index \"%s\" is not a number or not within range\n", + portstr); + return err; + } +- strslashrsplit(handlestr, p_bus_name, p_dev_name); ++ err = strslashrsplit(handlestr, p_bus_name, p_dev_name); ++ if (err) { ++ pr_err("Port identification \"%s\" is invalid\n", str); ++ return err; ++ } + return 0; + } + +-- +2.20.1 + diff --git a/SOURCES/0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch b/SOURCES/0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch new file mode 100644 index 0000000..2e22047 --- /dev/null +++ b/SOURCES/0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch @@ -0,0 +1,43 @@ +From bafabe7a067e647f97ae0df277bded8b9349db50 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] lib/bpf: Don't leak fp in bpf_find_mntpt() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit c3724e4bc3a6c + +commit c3724e4bc3a6c40dc846f0c3b02934d711bf81fb +Author: Phil Sutter +Date: Mon Aug 21 16:46:51 2017 +0200 + + lib/bpf: Don't leak fp in bpf_find_mntpt() + + If fopen() succeeded but len != PATH_MAX, the function leaks the open + FILE pointer. Fix this by checking len value before calling fopen(). + + Signed-off-by: Phil Sutter + Acked-by: Daniel Borkmann +--- + lib/bpf.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/lib/bpf.c b/lib/bpf.c +index 3aabf44d1abf8..33c5288e82187 100644 +--- a/lib/bpf.c ++++ b/lib/bpf.c +@@ -432,8 +432,11 @@ static const char *bpf_find_mntpt(const char *fstype, unsigned long magic, + } + } + ++ if (len != PATH_MAX) ++ return NULL; ++ + fp = fopen("/proc/mounts", "r"); +- if (fp == NULL || len != PATH_MAX) ++ if (fp == NULL) + return NULL; + + while (fscanf(fp, "%*s %" textify(PATH_MAX) "s %99s %*s %*d %*d\n", +-- +2.20.1 + diff --git a/SOURCES/0101-ifstat-nstat-Check-fdopen-return-value.patch b/SOURCES/0101-ifstat-nstat-Check-fdopen-return-value.patch new file mode 100644 index 0000000..792575a --- /dev/null +++ b/SOURCES/0101-ifstat-nstat-Check-fdopen-return-value.patch @@ -0,0 +1,84 @@ +From 5ae0f31d9c5d40dbf9eaf00435b9df1968109f5e Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:07 +0200 +Subject: [PATCH] ifstat, nstat: Check fdopen() return value + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 6d02518fdc37e + +commit 6d02518fdc37eb12abff67b6f8c741fbd81dce72 +Author: Phil Sutter +Date: Thu Aug 24 11:46:31 2017 +0200 + + ifstat, nstat: Check fdopen() return value + + Prevent passing NULL FILE pointer to fgets() later. + + Fix both tools in a single patch since the code changes are basically + identical. + + Signed-off-by: Phil Sutter +--- + misc/ifstat.c | 16 +++++++++++----- + misc/nstat.c | 16 +++++++++++----- + 2 files changed, 22 insertions(+), 10 deletions(-) + +diff --git a/misc/ifstat.c b/misc/ifstat.c +index 1be21703bf14c..ac3eff6b870a9 100644 +--- a/misc/ifstat.c ++++ b/misc/ifstat.c +@@ -992,12 +992,18 @@ int main(int argc, char *argv[]) + && verify_forging(fd) == 0) { + FILE *sfp = fdopen(fd, "r"); + +- load_raw_table(sfp); +- if (hist_db && source_mismatch) { +- fprintf(stderr, "ifstat: history is stale, ignoring it.\n"); +- hist_db = NULL; ++ if (!sfp) { ++ fprintf(stderr, "ifstat: fdopen failed: %s\n", ++ strerror(errno)); ++ close(fd); ++ } else { ++ load_raw_table(sfp); ++ if (hist_db && source_mismatch) { ++ fprintf(stderr, "ifstat: history is stale, ignoring it.\n"); ++ hist_db = NULL; ++ } ++ fclose(sfp); + } +- fclose(sfp); + } else { + if (fd >= 0) + close(fd); +diff --git a/misc/nstat.c b/misc/nstat.c +index 1212b1f2c8128..a4dd405d43a93 100644 +--- a/misc/nstat.c ++++ b/misc/nstat.c +@@ -706,12 +706,18 @@ int main(int argc, char *argv[]) + && verify_forging(fd) == 0) { + FILE *sfp = fdopen(fd, "r"); + +- load_good_table(sfp); +- if (hist_db && source_mismatch) { +- fprintf(stderr, "nstat: history is stale, ignoring it.\n"); +- hist_db = NULL; ++ if (!sfp) { ++ fprintf(stderr, "nstat: fdopen failed: %s\n", ++ strerror(errno)); ++ close(fd); ++ } else { ++ load_good_table(sfp); ++ if (hist_db && source_mismatch) { ++ fprintf(stderr, "nstat: history is stale, ignoring it.\n"); ++ hist_db = NULL; ++ } ++ fclose(sfp); + } +- fclose(sfp); + } else { + if (fd >= 0) + close(fd); +-- +2.20.1 + diff --git a/SOURCES/0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch b/SOURCES/0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch new file mode 100644 index 0000000..4b35e5f --- /dev/null +++ b/SOURCES/0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch @@ -0,0 +1,46 @@ +From a7329f9d8681bdbd2d8257b152ae6b4959232e67 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] tc/q_netem: Don't dereference possibly NULL pointer + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit a754de3ccd937 + +commit a754de3ccd937500940c6fcd0ad043855f56862d +Author: Phil Sutter +Date: Thu Aug 24 11:46:32 2017 +0200 + + tc/q_netem: Don't dereference possibly NULL pointer + + Assuming 'opt' might be NULL, move the call to RTA_PAYLOAD to after the + check since it dereferences its parameter. + + Signed-off-by: Phil Sutter +--- + tc/q_netem.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tc/q_netem.c b/tc/q_netem.c +index 0975ae111de97..5a9e747411e85 100644 +--- a/tc/q_netem.c ++++ b/tc/q_netem.c +@@ -538,7 +538,7 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) + int *ecn = NULL; + struct tc_netem_qopt qopt; + const struct tc_netem_rate *rate = NULL; +- int len = RTA_PAYLOAD(opt) - sizeof(qopt); ++ int len; + __u64 rate64 = 0; + + SPRINT_BUF(b1); +@@ -546,6 +546,7 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) + if (opt == NULL) + return 0; + ++ len = RTA_PAYLOAD(opt) - sizeof(qopt); + if (len < 0) { + fprintf(stderr, "options size error\n"); + return -1; +-- +2.20.1 + diff --git a/SOURCES/0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch b/SOURCES/0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch new file mode 100644 index 0000000..d74eae8 --- /dev/null +++ b/SOURCES/0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch @@ -0,0 +1,39 @@ +From a4c190565a85db814ad1185ada5382e7fb8707a0 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] tc/tc_filter: Make sure filter name is not empty + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 75716932a0af2 + +commit 75716932a0af28da207aa57c212794ab28ce9036 +Author: Phil Sutter +Date: Thu Aug 24 11:46:33 2017 +0200 + + tc/tc_filter: Make sure filter name is not empty + + The later check for 'k[0] != 0' requires a non-empty filter name, + otherwise NULL pointer dereference in 'q' might happen. + + Signed-off-by: Phil Sutter +--- + tc/tc_filter.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tc/tc_filter.c b/tc/tc_filter.c +index e640492b25ba6..a6bb73d12eaba 100644 +--- a/tc/tc_filter.c ++++ b/tc/tc_filter.c +@@ -380,6 +380,9 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + usage(); + return 0; + } else { ++ if (!**argv) ++ invarg("invalid filter name", *argv); ++ + strncpy(k, *argv, sizeof(k)-1); + + q = get_filter_kind(k); +-- +2.20.1 + diff --git a/SOURCES/0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch b/SOURCES/0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch new file mode 100644 index 0000000..d4530f3 --- /dev/null +++ b/SOURCES/0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch @@ -0,0 +1,35 @@ +From 73b2d3ee4bbdbfba7db035d9b89a2bcffc15e1ba Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] tipc/bearer: Prevent NULL pointer dereference + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 70a6df3962b84 + +commit 70a6df3962b8448fc9c28d72606828a004ed5b6b +Author: Phil Sutter +Date: Thu Aug 24 11:46:34 2017 +0200 + + tipc/bearer: Prevent NULL pointer dereference + + Signed-off-by: Phil Sutter +--- + tipc/bearer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tipc/bearer.c b/tipc/bearer.c +index c3d4491f8f6ef..0d84570150624 100644 +--- a/tipc/bearer.c ++++ b/tipc/bearer.c +@@ -439,7 +439,7 @@ static int cmd_bearer_enable(struct nlmsghdr *nlh, const struct cmd *cmd, + return err; + + opt = get_opt(opts, "media"); +- if (strcmp(opt->val, "udp") == 0) { ++ if (opt && strcmp(opt->val, "udp") == 0) { + err = nl_add_udp_enable_opts(nlh, opts, cmdl); + if (err) + return err; +-- +2.20.1 + diff --git a/SOURCES/0105-ipntable-Avoid-memory-allocation-for-filter.name.patch b/SOURCES/0105-ipntable-Avoid-memory-allocation-for-filter.name.patch new file mode 100644 index 0000000..da866f9 --- /dev/null +++ b/SOURCES/0105-ipntable-Avoid-memory-allocation-for-filter.name.patch @@ -0,0 +1,58 @@ +From c176919cbf8f11f666c2281785e58fd147ecfea0 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] ipntable: Avoid memory allocation for filter.name + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 45c2ec9e95fef + +commit 45c2ec9e95fef8eb6f0807d9a7e5f14c14313c7e +Author: Phil Sutter +Date: Thu Aug 24 11:51:45 2017 +0200 + + ipntable: Avoid memory allocation for filter.name + + The original issue was that filter.name might end up unterminated if + user provided string was too long. But in fact it is not necessary to + copy the commandline parameter at all: just make filter.name point to it + instead. + + Signed-off-by: Phil Sutter +--- + ip/ipntable.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/ip/ipntable.c b/ip/ipntable.c +index ae8c74ead2cb8..2f72c989f35df 100644 +--- a/ip/ipntable.c ++++ b/ip/ipntable.c +@@ -37,7 +37,7 @@ static struct + int family; + int index; + #define NONE_DEV (-1) +- char name[1024]; ++ const char *name; + } filter; + + static void usage(void) __attribute__((noreturn)); +@@ -367,7 +367,7 @@ static int print_ntable(const struct sockaddr_nl *who, struct nlmsghdr *n, void + if (tb[NDTA_NAME]) { + const char *name = rta_getattr_str(tb[NDTA_NAME]); + +- if (strlen(filter.name) > 0 && strcmp(filter.name, name)) ++ if (filter.name && strcmp(filter.name, name)) + return 0; + } + if (tb[NDTA_PARMS]) { +@@ -631,7 +631,7 @@ static int ipntable_show(int argc, char **argv) + } else if (strcmp(*argv, "name") == 0) { + NEXT_ARG(); + +- strncpy(filter.name, *argv, sizeof(filter.name)); ++ filter.name = *argv; + } else + invarg("unknown", *argv); + +-- +2.20.1 + diff --git a/SOURCES/0106-lib-fs-Fix-format-string-in-find_fs_mount.patch b/SOURCES/0106-lib-fs-Fix-format-string-in-find_fs_mount.patch new file mode 100644 index 0000000..59d8032 --- /dev/null +++ b/SOURCES/0106-lib-fs-Fix-format-string-in-find_fs_mount.patch @@ -0,0 +1,39 @@ +From dfc6dc25fcc666ed3fa938bca5ccd87d6cf4a99e Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lib/fs: Fix format string in find_fs_mount() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit eab450789829e + +commit eab450789829e33a64dbd08dced3438d580d5179 +Author: Phil Sutter +Date: Thu Aug 24 11:51:46 2017 +0200 + + lib/fs: Fix format string in find_fs_mount() + + A field width of 4096 allows fscanf() to store that amount of characters + into the given buffer, though that doesn't include the terminating NULL + byte. Decrease the value by one to leave space for it. + + Signed-off-by: Phil Sutter +--- + lib/fs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/fs.c b/lib/fs.c +index c59ac564581d0..1ff881ecfcd8c 100644 +--- a/lib/fs.c ++++ b/lib/fs.c +@@ -45,7 +45,7 @@ static char *find_fs_mount(const char *fs_to_find) + return NULL; + } + +- while (fscanf(fp, "%*s %4096s %127s %*s %*d %*d\n", ++ while (fscanf(fp, "%*s %4095s %127s %*s %*d %*d\n", + path, fstype) == 2) { + if (strcmp(fstype, fs_to_find) == 0) { + mnt = strdup(path); +-- +2.20.1 + diff --git a/SOURCES/0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch b/SOURCES/0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch new file mode 100644 index 0000000..3bce03d --- /dev/null +++ b/SOURCES/0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch @@ -0,0 +1,90 @@ +From e47b57df11565c51b9d8a5307a63d93f8e9a061b Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lib/inet_proto: Review inet_proto_{a2n,n2a}() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit cfda500a7d808 + +commit cfda500a7d808a6e0f3eca47abd75c22cfe716e5 +Author: Phil Sutter +Date: Thu Aug 24 11:51:47 2017 +0200 + + lib/inet_proto: Review inet_proto_{a2n,n2a}() + + The original intent was to make sure strings written by those functions + are NUL-terminated at all times, though it was suggested to get rid of + the 15 char protocol name limit as well which this patch accomplishes. + + In addition to that, simplify inet_proto_a2n() a bit: Use the error + checking in get_u8() to find out whether passed 'buf' contains a valid + decimal number instead of checking the first character's value manually. + + Signed-off-by: Phil Sutter +--- + lib/inet_proto.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +diff --git a/lib/inet_proto.c b/lib/inet_proto.c +index ceda082b12a2e..53c029039b6d5 100644 +--- a/lib/inet_proto.c ++++ b/lib/inet_proto.c +@@ -25,7 +25,7 @@ + + const char *inet_proto_n2a(int proto, char *buf, int len) + { +- static char ncache[16]; ++ static char *ncache; + static int icache = -1; + struct protoent *pe; + +@@ -34,9 +34,12 @@ const char *inet_proto_n2a(int proto, char *buf, int len) + + pe = getprotobynumber(proto); + if (pe) { ++ if (icache != -1) ++ free(ncache); + icache = proto; +- strncpy(ncache, pe->p_name, 16); +- strncpy(buf, pe->p_name, len); ++ ncache = strdup(pe->p_name); ++ strncpy(buf, pe->p_name, len - 1); ++ buf[len - 1] = '\0'; + return buf; + } + snprintf(buf, len, "ipproto-%d", proto); +@@ -45,24 +48,23 @@ const char *inet_proto_n2a(int proto, char *buf, int len) + + int inet_proto_a2n(const char *buf) + { +- static char ncache[16]; ++ static char *ncache; + static int icache = -1; + struct protoent *pe; ++ __u8 ret; + +- if (icache>=0 && strcmp(ncache, buf) == 0) ++ if (icache != -1 && strcmp(ncache, buf) == 0) + return icache; + +- if (buf[0] >= '0' && buf[0] <= '9') { +- __u8 ret; +- if (get_u8(&ret, buf, 10)) +- return -1; ++ if (!get_u8(&ret, buf, 10)) + return ret; +- } + + pe = getprotobyname(buf); + if (pe) { ++ if (icache != -1) ++ free(ncache); + icache = pe->p_proto; +- strncpy(ncache, pe->p_name, 16); ++ ncache = strdup(pe->p_name); + return pe->p_proto; + } + return -1; +-- +2.20.1 + diff --git a/SOURCES/0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch b/SOURCES/0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch new file mode 100644 index 0000000..4a7541c --- /dev/null +++ b/SOURCES/0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch @@ -0,0 +1,44 @@ +From 5cdf4d78d15b127d0f4a7a09e4700d7df16dda19 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lnstat_util: Simplify alloc_and_open() a bit + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit bc27878d21909 + +commit bc27878d21909b110dd21eea0c3505d023f29dc2 +Author: Phil Sutter +Date: Thu Aug 24 11:51:48 2017 +0200 + + lnstat_util: Simplify alloc_and_open() a bit + + Relying upon callers and using unsafe strcpy() is probably not the best + idea. Aside from that, using snprintf() allows to format the string for + lf->path in one go. + + Signed-off-by: Phil Sutter +--- + misc/lnstat_util.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/misc/lnstat_util.c b/misc/lnstat_util.c +index cc54598fe1bef..ec19238c24b94 100644 +--- a/misc/lnstat_util.c ++++ b/misc/lnstat_util.c +@@ -180,11 +180,8 @@ static struct lnstat_file *alloc_and_open(const char *path, const char *file) + } + + /* initialize */ +- /* de->d_name is guaranteed to be <= NAME_MAX */ +- strcpy(lf->basename, file); +- strcpy(lf->path, path); +- strcat(lf->path, "/"); +- strcat(lf->path, lf->basename); ++ snprintf(lf->basename, sizeof(lf->basename), "%s", file); ++ snprintf(lf->path, sizeof(lf->path), "%s/%s", path, file); + + /* initialize to default */ + lf->interval.tv_sec = 1; +-- +2.20.1 + diff --git a/SOURCES/0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch b/SOURCES/0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch new file mode 100644 index 0000000..c411268 --- /dev/null +++ b/SOURCES/0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch @@ -0,0 +1,55 @@ +From 8ac8129d710b8a084ce213791874330aa30ec70e Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] tc/m_xt: Fix for potential string buffer overflows + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 56270e54661e8 + +commit 56270e54661e8ca51d4b3661b9f9bb12a0a40d95 +Author: Phil Sutter +Date: Thu Aug 24 11:51:49 2017 +0200 + + tc/m_xt: Fix for potential string buffer overflows + + - Use strncpy() when writing to target->t->u.user.name and make sure the + final byte remains untouched (xtables_calloc() set it to zero). + - 'tname' length sanitization was completely wrong: If it's length + exceeded the 16 bytes available in 'k', passing a length value of 16 + to strncpy() would overwrite the previously NULL'ed 'k[15]'. Also, the + sanitization has to happen if 'tname' is exactly 16 bytes long as + well. + + Signed-off-by: Phil Sutter +--- + tc/m_xt.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/tc/m_xt.c b/tc/m_xt.c +index ad52d239caf61..9218b14594403 100644 +--- a/tc/m_xt.c ++++ b/tc/m_xt.c +@@ -95,7 +95,8 @@ build_st(struct xtables_target *target, struct xt_entry_target *t) + if (t == NULL) { + target->t = xtables_calloc(1, size); + target->t->u.target_size = size; +- strcpy(target->t->u.user.name, target->name); ++ strncpy(target->t->u.user.name, target->name, ++ sizeof(target->t->u.user.name) - 1); + target->t->u.user.revision = target->revision; + + if (target->init != NULL) +@@ -277,8 +278,8 @@ static int parse_ipt(struct action_util *a, int *argc_p, + } + fprintf(stdout, " index %d\n", index); + +- if (strlen(tname) > 16) { +- size = 16; ++ if (strlen(tname) >= 16) { ++ size = 15; + k[15] = 0; + } else { + size = 1 + strlen(tname); +-- +2.20.1 + diff --git a/SOURCES/0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch b/SOURCES/0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch new file mode 100644 index 0000000..3ea22e5 --- /dev/null +++ b/SOURCES/0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch @@ -0,0 +1,48 @@ +From 6ab89ff96d59c90cd6227399a065d52cc38e0ee7 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lib/ll_map: Choose size of new cache items at run-time + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 4b9e91782269f + +commit 4b9e91782269fc871d158ed4f11bfcfe4e3b8bf7 +Author: Phil Sutter +Date: Thu Aug 24 11:51:50 2017 +0200 + + lib/ll_map: Choose size of new cache items at run-time + + Instead of having a fixed buffer of 16 bytes for the interface name, + tailor size of new ll_cache entry using the interface name's actual + length. This also makes sure the following call to strcpy() is safe. + + Signed-off-by: Phil Sutter +--- + lib/ll_map.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/ll_map.c b/lib/ll_map.c +index 4e4556c9ac80b..70684b02042b6 100644 +--- a/lib/ll_map.c ++++ b/lib/ll_map.c +@@ -30,7 +30,7 @@ struct ll_cache { + unsigned flags; + unsigned index; + unsigned short type; +- char name[IFNAMSIZ]; ++ char name[]; + }; + + #define IDXMAP_SIZE 1024 +@@ -120,7 +120,7 @@ int ll_remember_index(const struct sockaddr_nl *who, + return 0; + } + +- im = malloc(sizeof(*im)); ++ im = malloc(sizeof(*im) + strlen(ifname) + 1); + if (im == NULL) + return 0; + im->index = ifi->ifi_index; +-- +2.20.1 + diff --git a/SOURCES/0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch b/SOURCES/0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch new file mode 100644 index 0000000..0561037 --- /dev/null +++ b/SOURCES/0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch @@ -0,0 +1,58 @@ +From ca6a2e6f21fc48b494216a095f5bd792a0c6e35d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] ss: Make struct tcpstat fields 'timer' and 'timeout' unsigned + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 4cbf5224f2b50 + +commit 4cbf5224f2b50a24e1873508e7a0f1f81cc81a81 +Author: Phil Sutter +Date: Thu Aug 24 11:41:26 2017 +0200 + + ss: Make struct tcpstat fields 'timer' and 'timeout' unsigned + + Both 'timer' and 'timeout' variables of struct tcpstat are either + scanned as unsigned values from /proc/net/tcp{,6} or copied from + 'idiag_timer' and 'idiag_expries' fields of struct inet_diag_msg, which + itself are unsigned. Therefore they may be unsigned as well, which + eliminates the need to check for negative values. + + Signed-off-by: Phil Sutter +--- + misc/ss.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/misc/ss.c b/misc/ss.c +index 7a38e9d830e8d..2a981d8b06918 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -716,8 +716,8 @@ struct dctcpstat { + + struct tcpstat { + struct sockstat ss; +- int timer; +- int timeout; ++ unsigned int timer; ++ unsigned int timeout; + int probes; + char cong_alg[16]; + double rto, ato, rtt, rttvar; +@@ -903,13 +903,11 @@ static void sock_addr_print(const char *addr, char *delim, const char *port, + sock_addr_print_width(addr_width, addr, delim, serv_width, port, ifname); + } + +-static const char *print_ms_timer(int timeout) ++static const char *print_ms_timer(unsigned int timeout) + { + static char buf[64]; + int secs, msecs, minutes; + +- if (timeout < 0) +- timeout = 0; + secs = timeout/1000; + minutes = secs/60; + secs = secs%60; +-- +2.20.1 + diff --git a/SOURCES/0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch b/SOURCES/0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch new file mode 100644 index 0000000..48630b2 --- /dev/null +++ b/SOURCES/0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch @@ -0,0 +1,36 @@ +From f92edf9b3d088bf8a5619073de43b2f693590be8 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] ss: Make sure scanned index value to unix_state_map is sane + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 0aa03350c00d7 + +commit 0aa03350c00d70edbbdab0662a2d8262be2bb68d +Author: Phil Sutter +Date: Thu Aug 24 11:41:27 2017 +0200 + + ss: Make sure scanned index value to unix_state_map is sane + + Signed-off-by: Phil Sutter +--- + misc/ss.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/misc/ss.c b/misc/ss.c +index 2a981d8b06918..fdb00a9f3f696 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -3236,7 +3236,8 @@ static int unix_show(struct filter *f) + + if (flags & (1 << 16)) { + u->state = SS_LISTEN; +- } else { ++ } else if (u->state > 0 && ++ u->state <= ARRAY_SIZE(unix_state_map)) { + u->state = unix_state_map[u->state-1]; + if (u->type == SOCK_DGRAM && u->state == SS_CLOSE && u->rport) + u->state = SS_ESTABLISHED; +-- +2.20.1 + diff --git a/SOURCES/0113-netem-maketable-Check-return-value-of-fscanf.patch b/SOURCES/0113-netem-maketable-Check-return-value-of-fscanf.patch new file mode 100644 index 0000000..bf2b9b5 --- /dev/null +++ b/SOURCES/0113-netem-maketable-Check-return-value-of-fscanf.patch @@ -0,0 +1,37 @@ +From d533a60518e79593c6a1813a6f44aa3889045120 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] netem/maketable: Check return value of fscanf() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 92963d136de8c + +commit 92963d136de8c370324716add98888b2ce6e6a94 +Author: Phil Sutter +Date: Thu Aug 24 11:41:28 2017 +0200 + + netem/maketable: Check return value of fscanf() + + Signed-off-by: Phil Sutter +--- + netem/maketable.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/netem/maketable.c b/netem/maketable.c +index ad660e7d457f0..ccb8f0c68b062 100644 +--- a/netem/maketable.c ++++ b/netem/maketable.c +@@ -38,8 +38,8 @@ readdoubles(FILE *fp, int *number) + } + + for (i=0; i +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lib/bpf: Check return value of write() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit b5c78e1b2c868 + +commit b5c78e1b2c8681e82684f47563acd3d383893658 +Author: Phil Sutter +Date: Thu Aug 24 11:41:29 2017 +0200 + + lib/bpf: Check return value of write() + + This is merely to silence the compiler warning. If write to stderr + failed, assume that printing an error message will fail as well so don't + even try. + + Signed-off-by: Phil Sutter +--- + lib/bpf.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/lib/bpf.c b/lib/bpf.c +index 33c5288e82187..7eb754ad7cb56 100644 +--- a/lib/bpf.c ++++ b/lib/bpf.c +@@ -486,7 +486,8 @@ int bpf_trace_pipe(void) + + ret = read(fd, buff, sizeof(buff) - 1); + if (ret > 0) { +- write(2, buff, ret); ++ if (write(STDERR_FILENO, buff, ret) != ret) ++ return -1; + fflush(stderr); + } + } +-- +2.20.1 + diff --git a/SOURCES/0115-lib-fs-Fix-and-simplify-make_path.patch b/SOURCES/0115-lib-fs-Fix-and-simplify-make_path.patch new file mode 100644 index 0000000..3137352 --- /dev/null +++ b/SOURCES/0115-lib-fs-Fix-and-simplify-make_path.patch @@ -0,0 +1,65 @@ +From 7ab899539b920609712ad24f871b50a19fd8189f Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lib/fs: Fix and simplify make_path() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit ac3415f5c1b1d + +commit ac3415f5c1b1df2d6a4bf770ad52e2e14c09e58e +Author: Phil Sutter +Date: Thu Aug 24 11:41:30 2017 +0200 + + lib/fs: Fix and simplify make_path() + + Calling stat() before mkdir() is racey: The entry might change in + between. Also, the call to stat() seems to exist only to check if the + directory exists already. So simply call mkdir() unconditionally and + catch only errors other than EEXIST. + + Signed-off-by: Phil Sutter +--- + lib/fs.c | 20 +++++--------------- + 1 file changed, 5 insertions(+), 15 deletions(-) + +diff --git a/lib/fs.c b/lib/fs.c +index 1ff881ecfcd8c..ebe05cd44e11b 100644 +--- a/lib/fs.c ++++ b/lib/fs.c +@@ -102,7 +102,6 @@ out: + int make_path(const char *path, mode_t mode) + { + char *dir, *delim; +- struct stat sbuf; + int rc = -1; + + delim = dir = strdup(path); +@@ -120,20 +119,11 @@ int make_path(const char *path, mode_t mode) + if (delim) + *delim = '\0'; + +- if (stat(dir, &sbuf) != 0) { +- if (errno != ENOENT) { +- fprintf(stderr, +- "stat failed for %s: %s\n", +- dir, strerror(errno)); +- goto out; +- } +- +- if (mkdir(dir, mode) != 0) { +- fprintf(stderr, +- "mkdir failed for %s: %s\n", +- dir, strerror(errno)); +- goto out; +- } ++ rc = mkdir(dir, mode); ++ if (mkdir(dir, mode) != 0 && errno != EEXIST) { ++ fprintf(stderr, "mkdir failed for %s: %s\n", ++ dir, strerror(errno)); ++ goto out; + } + + if (delim == NULL) +-- +2.20.1 + diff --git a/SOURCES/0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch b/SOURCES/0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch new file mode 100644 index 0000000..dcbfc2f --- /dev/null +++ b/SOURCES/0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch @@ -0,0 +1,49 @@ +From 8af39fdff4f966d00571bda2610eac8fae2f7482 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] lib/libnetlink: Don't pass NULL parameter to memcpy() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 893deac4c43b5 + +commit 893deac4c43b57ae49f736ec050724b6de181062 +Author: Phil Sutter +Date: Thu Aug 24 11:41:31 2017 +0200 + + lib/libnetlink: Don't pass NULL parameter to memcpy() + + Both addattr_l() and rta_addattr_l() may be called with NULL data + pointer and 0 alen parameters. Avoid calling memcpy() in that case. + + Signed-off-by: Phil Sutter +--- + lib/libnetlink.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/lib/libnetlink.c b/lib/libnetlink.c +index 75e20abf0b97f..ff26ddf50552b 100644 +--- a/lib/libnetlink.c ++++ b/lib/libnetlink.c +@@ -898,7 +898,8 @@ int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, + rta = NLMSG_TAIL(n); + rta->rta_type = type; + rta->rta_len = len; +- memcpy(RTA_DATA(rta), data, alen); ++ if (alen) ++ memcpy(RTA_DATA(rta), data, alen); + n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len); + return 0; + } +@@ -985,7 +986,8 @@ int rta_addattr_l(struct rtattr *rta, int maxlen, int type, + subrta = (struct rtattr *)(((char *)rta) + RTA_ALIGN(rta->rta_len)); + subrta->rta_type = type; + subrta->rta_len = len; +- memcpy(RTA_DATA(subrta), data, alen); ++ if (alen) ++ memcpy(RTA_DATA(subrta), data, alen); + rta->rta_len = NLMSG_ALIGN(rta->rta_len) + RTA_ALIGN(len); + return 0; + } +-- +2.20.1 + diff --git a/SOURCES/0117-utils-Implement-strlcpy-and-strlcat.patch b/SOURCES/0117-utils-Implement-strlcpy-and-strlcat.patch new file mode 100644 index 0000000..660b433 --- /dev/null +++ b/SOURCES/0117-utils-Implement-strlcpy-and-strlcat.patch @@ -0,0 +1,65 @@ +From 3bcdea42e7402e79a914fe3cbefdcc1caa89464c Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] utils: Implement strlcpy() and strlcat() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 8d15e012a3227 + +commit 8d15e012a3227d79295cd95582bb6d8a6f0bdc92 +Author: Phil Sutter +Date: Fri Sep 1 18:52:51 2017 +0200 + + utils: Implement strlcpy() and strlcat() + + By making use of strncpy(), both implementations are really simple so + there is no need to add libbsd as additional dependency. + + Signed-off-by: Phil Sutter +--- + include/utils.h | 3 +++ + lib/utils.c | 19 +++++++++++++++++++ + 2 files changed, 22 insertions(+) + +diff --git a/include/utils.h b/include/utils.h +index d707a9dacdb85..d596a6fc10574 100644 +--- a/include/utils.h ++++ b/include/utils.h +@@ -264,4 +264,7 @@ int make_path(const char *path, mode_t mode); + char *find_cgroup2_mount(void); + int get_command_name(const char *pid, char *comm, size_t len); + ++size_t strlcpy(char *dst, const char *src, size_t size); ++size_t strlcat(char *dst, const char *src, size_t size); ++ + #endif /* __UTILS_H__ */ +diff --git a/lib/utils.c b/lib/utils.c +index fc9c575ba0c7d..c9ba2f332c2a7 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -1228,3 +1228,22 @@ int get_real_family(int rtm_type, int rtm_family) + + return rtm_family; + } ++ ++size_t strlcpy(char *dst, const char *src, size_t size) ++{ ++ if (size) { ++ strncpy(dst, src, size - 1); ++ dst[size - 1] = '\0'; ++ } ++ return strlen(src); ++} ++ ++size_t strlcat(char *dst, const char *src, size_t size) ++{ ++ size_t dlen = strlen(dst); ++ ++ if (dlen > size) ++ return dlen + strlen(src); ++ ++ return dlen + strlcpy(dst + dlen, src, size - dlen); ++} +-- +2.20.1 + diff --git a/SOURCES/0118-Convert-the-obvious-cases-to-strlcpy.patch b/SOURCES/0118-Convert-the-obvious-cases-to-strlcpy.patch new file mode 100644 index 0000000..200a2d8 --- /dev/null +++ b/SOURCES/0118-Convert-the-obvious-cases-to-strlcpy.patch @@ -0,0 +1,135 @@ +From e557cf7984d2f06aff158a9089e714e5f445d3ac Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:08:08 +0200 +Subject: [PATCH] Convert the obvious cases to strlcpy() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 18f156bfecda2 +Conflicts: +* on iproute_lwtunnel.c, due to missing commit + e8493916a8ede ("iproute: add support for SR-IPv6 lwtunnel encapsulation") +* on lib/bpf.c, due to missing commit + 95ae9a4870e7d ("bpf: fix mnt path when from env") + fix bpf_find_mntpt() in this case, instead. + +commit 18f156bfecda20166c2fb543ba8c9c6559edef9c +Author: Phil Sutter +Date: Fri Sep 1 18:52:52 2017 +0200 + + Convert the obvious cases to strlcpy() + + This converts the typical idiom of manually terminating the buffer after + a call to strncpy(). + + Signed-off-by: Phil Sutter +--- + ip/ipnetns.c | 3 +-- + ip/ipvrf.c | 3 +-- + lib/bpf.c | 3 +-- + lib/fs.c | 3 +-- + lib/inet_proto.c | 3 +-- + misc/ss.c | 3 +-- + tc/em_ipset.c | 3 +-- + 7 files changed, 7 insertions(+), 14 deletions(-) + +diff --git a/ip/ipnetns.c b/ip/ipnetns.c +index 1c0ade90dee5e..427b59c57381d 100644 +--- a/ip/ipnetns.c ++++ b/ip/ipnetns.c +@@ -523,8 +523,7 @@ int netns_identify_pid(const char *pidstr, char *name, int len) + + if ((st.st_dev == netst.st_dev) && + (st.st_ino == netst.st_ino)) { +- strncpy(name, entry->d_name, len - 1); +- name[len - 1] = '\0'; ++ strlcpy(name, entry->d_name, len); + } + } + closedir(dir); +diff --git a/ip/ipvrf.c b/ip/ipvrf.c +index ae3b48fa81996..f58c8df728265 100644 +--- a/ip/ipvrf.c ++++ b/ip/ipvrf.c +@@ -333,8 +333,7 @@ static int vrf_path(char *vpath, size_t len) + if (vrf) + *vrf = '\0'; + +- strncpy(vpath, start, len - 1); +- vpath[len - 1] = '\0'; ++ strlcpy(vpath, start, len); + + /* if vrf path is just / then return nothing */ + if (!strcmp(vpath, "/")) +diff --git a/lib/bpf.c b/lib/bpf.c +index 7eb754ad7cb56..e072cba214067 100644 +--- a/lib/bpf.c ++++ b/lib/bpf.c +@@ -424,8 +424,7 @@ static const char *bpf_find_mntpt(const char *fstype, unsigned long magic, + ptr = known_mnts; + while (*ptr) { + if (bpf_valid_mntpt(*ptr, magic) == 0) { +- strncpy(mnt, *ptr, len - 1); +- mnt[len - 1] = 0; ++ strlcpy(mnt, *ptr, len); + return mnt; + } + ptr++; +diff --git a/lib/fs.c b/lib/fs.c +index ebe05cd44e11b..86efd4ed2ed80 100644 +--- a/lib/fs.c ++++ b/lib/fs.c +@@ -172,8 +172,7 @@ int get_command_name(const char *pid, char *comm, size_t len) + if (nl) + *nl = '\0'; + +- strncpy(comm, name, len - 1); +- comm[len - 1] = '\0'; ++ strlcpy(comm, name, len); + break; + } + +diff --git a/lib/inet_proto.c b/lib/inet_proto.c +index 53c029039b6d5..bdfd52fdafe5a 100644 +--- a/lib/inet_proto.c ++++ b/lib/inet_proto.c +@@ -38,8 +38,7 @@ const char *inet_proto_n2a(int proto, char *buf, int len) + free(ncache); + icache = proto; + ncache = strdup(pe->p_name); +- strncpy(buf, pe->p_name, len - 1); +- buf[len - 1] = '\0'; ++ strlcpy(buf, pe->p_name, len); + return buf; + } + snprintf(buf, len, "ipproto-%d", proto); +diff --git a/misc/ss.c b/misc/ss.c +index fdb00a9f3f696..6aaae1b5390e4 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -444,8 +444,7 @@ static void user_ent_hash_build(void) + + user_ent_hash_build_init = 1; + +- strncpy(name, root, sizeof(name)-1); +- name[sizeof(name)-1] = 0; ++ strlcpy(name, root, sizeof(name)); + + if (strlen(name) == 0 || name[strlen(name)-1] != '/') + strcat(name, "/"); +diff --git a/tc/em_ipset.c b/tc/em_ipset.c +index b59756515d239..48b287f5ba3b2 100644 +--- a/tc/em_ipset.c ++++ b/tc/em_ipset.c +@@ -145,8 +145,7 @@ get_set_byname(const char *setname, struct xt_set_info *info) + int res; + + req.op = IP_SET_OP_GET_BYNAME; +- strncpy(req.set.name, setname, IPSET_MAXNAMELEN); +- req.set.name[IPSET_MAXNAMELEN - 1] = '\0'; ++ strlcpy(req.set.name, setname, IPSET_MAXNAMELEN); + res = do_getsockopt(&req); + if (res != 0) + return -1; +-- +2.20.1 + diff --git a/SOURCES/0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch b/SOURCES/0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch new file mode 100644 index 0000000..ee6b156 --- /dev/null +++ b/SOURCES/0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch @@ -0,0 +1,66 @@ +From 9556150792daf8f2fbea934bcb77b4b74a21b2e1 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:12 +0200 +Subject: [PATCH] Convert harmful calls to strncpy() to strlcpy() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 532b8874fe545 + +commit 532b8874fe545acaa8d45c4dd3b54b8f3bb41d9f +Author: Phil Sutter +Date: Fri Sep 1 18:52:53 2017 +0200 + + Convert harmful calls to strncpy() to strlcpy() + + This patch converts spots where manual buffer termination was missing to + strlcpy() since that does what is needed. + + Signed-off-by: Phil Sutter +--- + genl/ctrl.c | 2 +- + ip/ipvrf.c | 2 +- + ip/xfrm_state.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/genl/ctrl.c b/genl/ctrl.c +index 21e857cfcfc25..a6d31b04e5679 100644 +--- a/genl/ctrl.c ++++ b/genl/ctrl.c +@@ -317,7 +317,7 @@ static int ctrl_list(int cmd, int argc, char **argv) + + if (matches(*argv, "name") == 0) { + NEXT_ARG(); +- strncpy(d, *argv, sizeof (d) - 1); ++ strlcpy(d, *argv, sizeof(d)); + addattr_l(nlh, 128, CTRL_ATTR_FAMILY_NAME, + d, strlen(d) + 1); + } else if (matches(*argv, "id") == 0) { +diff --git a/ip/ipvrf.c b/ip/ipvrf.c +index f58c8df728265..406cddbcd44ca 100644 +--- a/ip/ipvrf.c ++++ b/ip/ipvrf.c +@@ -71,7 +71,7 @@ static int vrf_identify(pid_t pid, char *name, size_t len) + if (end) + *end = '\0'; + +- strncpy(name, vrf, len - 1); ++ strlcpy(name, vrf, len); + break; + } + } +diff --git a/ip/xfrm_state.c b/ip/xfrm_state.c +index 04ed3492ad3b5..2222737cdd98d 100644 +--- a/ip/xfrm_state.c ++++ b/ip/xfrm_state.c +@@ -123,7 +123,7 @@ static int xfrm_algo_parse(struct xfrm_algo *alg, enum xfrm_attr_type_t type, + fprintf(stderr, "warning: ALGO-NAME/ALGO-KEYMAT values will be sent to the kernel promiscuously! (verifying them isn't implemented yet)\n"); + #endif + +- strncpy(alg->alg_name, name, sizeof(alg->alg_name)); ++ strlcpy(alg->alg_name, name, sizeof(alg->alg_name)); + + if (slen > 2 && strncmp(key, "0x", 2) == 0) { + /* split two chars "0x" from the top */ +-- +2.20.1 + diff --git a/SOURCES/0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch b/SOURCES/0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch new file mode 100644 index 0000000..ea251a2 --- /dev/null +++ b/SOURCES/0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch @@ -0,0 +1,75 @@ +From 65d69021e5b8998cec1e7a13b8b297bfc606f9fd Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:12 +0200 +Subject: [PATCH] ipxfrm: Replace STRBUF_CAT macro with strlcat() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 44cc6c792a650 + +commit 44cc6c792a6503e024f042c65f35cd44b3283b20 +Author: Phil Sutter +Date: Fri Sep 1 18:52:54 2017 +0200 + + ipxfrm: Replace STRBUF_CAT macro with strlcat() + + Signed-off-by: Phil Sutter +--- + ip/ipxfrm.c | 21 +++++---------------- + 1 file changed, 5 insertions(+), 16 deletions(-) + +diff --git a/ip/ipxfrm.c b/ip/ipxfrm.c +index b0cfac178f8bc..df72a0c0bf88e 100644 +--- a/ip/ipxfrm.c ++++ b/ip/ipxfrm.c +@@ -40,17 +40,6 @@ + #include "ip_common.h" + + #define STRBUF_SIZE (128) +-#define STRBUF_CAT(buf, str) \ +- do { \ +- int rest = sizeof(buf) - 1 - strlen(buf); \ +- if (rest > 0) { \ +- int len = strlen(str); \ +- if (len > rest) \ +- len = rest; \ +- strncat(buf, str, len); \ +- buf[sizeof(buf) - 1] = '\0'; \ +- } \ +- } while (0); + + struct xfrm_filter filter; + +@@ -883,8 +872,8 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo, + prefix, title); + + if (prefix) +- STRBUF_CAT(buf, prefix); +- STRBUF_CAT(buf, "\t"); ++ strlcat(buf, prefix, sizeof(buf)); ++ strlcat(buf, "\t", sizeof(buf)); + + fputs(buf, fp); + fprintf(fp, "replay-window %u ", xsinfo->replay_window); +@@ -925,7 +914,7 @@ void xfrm_state_info_print(struct xfrm_usersa_info *xsinfo, + char sbuf[STRBUF_SIZE]; + + memcpy(sbuf, buf, sizeof(sbuf)); +- STRBUF_CAT(sbuf, "sel "); ++ strlcat(sbuf, "sel ", sizeof(sbuf)); + + xfrm_selector_print(&xsinfo->sel, xsinfo->family, fp, sbuf); + } +@@ -973,8 +962,8 @@ void xfrm_policy_info_print(struct xfrm_userpolicy_info *xpinfo, + } + + if (prefix) +- STRBUF_CAT(buf, prefix); +- STRBUF_CAT(buf, "\t"); ++ strlcat(buf, prefix, sizeof(buf)); ++ strlcat(buf, "\t", sizeof(buf)); + + fputs(buf, fp); + if (xpinfo->dir >= XFRM_POLICY_MAX) { +-- +2.20.1 + diff --git a/SOURCES/0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch b/SOURCES/0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch new file mode 100644 index 0000000..da2efeb --- /dev/null +++ b/SOURCES/0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch @@ -0,0 +1,37 @@ +From 42b9cc605f54f2a3ad75a29b5f2fc308bfe5fc61 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:12 +0200 +Subject: [PATCH] tc_util: No need to terminate an snprintf'ed buffer + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 9376314b49a47 + +commit 9376314b49a47eb42ade3fc0d41cb51438f8dbc6 +Author: Phil Sutter +Date: Fri Sep 1 18:52:55 2017 +0200 + + tc_util: No need to terminate an snprintf'ed buffer + + snprintf() won't leave the buffer unterminated, so manually terminating + is not necessary here. + + Signed-off-by: Phil Sutter +--- + tc/tc_util.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/tc/tc_util.c b/tc/tc_util.c +index 24ca1f1c1c040..296825ae174e0 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -430,7 +430,6 @@ const char *action_n2a(int action) + return "stolen"; + default: + snprintf(buf, 64, "%d", action); +- buf[63] = '\0'; + return buf; + } + } +-- +2.20.1 + diff --git a/SOURCES/0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch b/SOURCES/0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch new file mode 100644 index 0000000..20ccdc3 --- /dev/null +++ b/SOURCES/0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch @@ -0,0 +1,40 @@ +From ed508c9ee5991655039d2b080191b1c70680b5c8 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:12 +0200 +Subject: [PATCH] lnstat_util: Make sure buffer is NUL-terminated + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit bc4a57b87990b + +commit bc4a57b87990b30c85fdf0efbc1f8f219466daf4 +Author: Phil Sutter +Date: Fri Sep 1 18:52:56 2017 +0200 + + lnstat_util: Make sure buffer is NUL-terminated + + Can't use strlcpy() here since lnstat is not linked against libutil. + + While being at it, fix coding style in that chunk as well. + + Signed-off-by: Phil Sutter +--- + misc/lnstat_util.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/misc/lnstat_util.c b/misc/lnstat_util.c +index ec19238c24b94..c2dc42ec1ff12 100644 +--- a/misc/lnstat_util.c ++++ b/misc/lnstat_util.c +@@ -150,7 +150,8 @@ static int lnstat_scan_compat_rtstat_fields(struct lnstat_file *lf) + { + char buf[FGETS_BUF_SIZE]; + +- strncpy(buf, RTSTAT_COMPAT_LINE, sizeof(buf)-1); ++ strncpy(buf, RTSTAT_COMPAT_LINE, sizeof(buf) - 1); ++ buf[sizeof(buf) - 1] = '\0'; + + return __lnstat_scan_fields(lf, buf); + } +-- +2.20.1 + diff --git a/SOURCES/0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch b/SOURCES/0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch new file mode 100644 index 0000000..230f3a6 --- /dev/null +++ b/SOURCES/0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch @@ -0,0 +1,62 @@ +From 866b995355894ab8f20d22a554d47322dcf1029a Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:13 +0200 +Subject: [PATCH] utils: strlcpy() and strlcat() don't clobber dst + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 50ea3c64384b1 + +commit 50ea3c64384b1d1bfa9c96de86c21ac8e9fef183 +Author: Phil Sutter +Date: Wed Sep 6 18:51:42 2017 +0200 + + utils: strlcpy() and strlcat() don't clobber dst + + As David Laight correctly pointed out, the first version of strlcpy() + modified dst buffer behind the string copied into it. Fix this by + writing NUL to the byte immediately following src string instead of to + the last byte in dst. Doing so also allows to reduce overhead by using + memcpy(). + + Improve strlcat() by avoiding the call to strlcpy() if dst string is + already full, not just as sanity check. + + Signed-off-by: Phil Sutter +--- + lib/utils.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/lib/utils.c b/lib/utils.c +index c9ba2f332c2a7..228d97bfe5e9b 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -1231,18 +1231,22 @@ int get_real_family(int rtm_type, int rtm_family) + + size_t strlcpy(char *dst, const char *src, size_t size) + { ++ size_t srclen = strlen(src); ++ + if (size) { +- strncpy(dst, src, size - 1); +- dst[size - 1] = '\0'; ++ size_t minlen = min(srclen, size - 1); ++ ++ memcpy(dst, src, minlen); ++ dst[minlen] = '\0'; + } +- return strlen(src); ++ return srclen; + } + + size_t strlcat(char *dst, const char *src, size_t size) + { + size_t dlen = strlen(dst); + +- if (dlen > size) ++ if (dlen >= size) + return dlen + strlen(src); + + return dlen + strlcpy(dst + dlen, src, size - dlen); +-- +2.20.1 + diff --git a/SOURCES/0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch b/SOURCES/0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch new file mode 100644 index 0000000..8881924 --- /dev/null +++ b/SOURCES/0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch @@ -0,0 +1,152 @@ +From 74331750f118690ca3c375e52b10272b992320e7 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:13 +0200 +Subject: [PATCH] ip{6, }tunnel: Avoid copying user-supplied interface name + around + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 26111ab1dba82 + +commit 26111ab1dba820421ccaf283ac097a79b95023a2 +Author: Phil Sutter +Date: Mon Oct 2 13:46:35 2017 +0200 + + ip{6, }tunnel: Avoid copying user-supplied interface name around + + In both files' parse_args() functions as well as in iptunnel's do_prl() + and do_6rd() functions, a user-supplied 'dev' parameter is uselessly + copied into a temporary buffer before passing it to ll_name_to_index() + or copying into a struct ifreq. Avoid this by just caching the argv + pointer value until the later lookup/strcpy. + + Signed-off-by: Phil Sutter +--- + ip/ip6tunnel.c | 6 +++--- + ip/iptunnel.c | 22 +++++++++------------- + 2 files changed, 12 insertions(+), 16 deletions(-) + +diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c +index b4a7def144226..c12d700e74189 100644 +--- a/ip/ip6tunnel.c ++++ b/ip/ip6tunnel.c +@@ -136,7 +136,7 @@ static void print_tunnel(struct ip6_tnl_parm2 *p) + static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p) + { + int count = 0; +- char medium[IFNAMSIZ] = {}; ++ const char *medium = NULL; + + while (argc > 0) { + if (strcmp(*argv, "mode") == 0) { +@@ -180,7 +180,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p) + memcpy(&p->laddr, &laddr.data, sizeof(p->laddr)); + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +- strncpy(medium, *argv, IFNAMSIZ - 1); ++ medium = *argv; + } else if (strcmp(*argv, "encaplimit") == 0) { + NEXT_ARG(); + if (strcmp(*argv, "none") == 0) { +@@ -285,7 +285,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p) + count++; + argc--; argv++; + } +- if (medium[0]) { ++ if (medium) { + p->link = ll_name_to_index(medium); + if (p->link == 0) { + fprintf(stderr, "Cannot find device \"%s\"\n", medium); +diff --git a/ip/iptunnel.c b/ip/iptunnel.c +index 105d0f5576f1a..0acfd0793d3cd 100644 +--- a/ip/iptunnel.c ++++ b/ip/iptunnel.c +@@ -60,7 +60,7 @@ static void set_tunnel_proto(struct ip_tunnel_parm *p, int proto) + static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) + { + int count = 0; +- char medium[IFNAMSIZ] = {}; ++ const char *medium = NULL; + int isatap = 0; + + memset(p, 0, sizeof(*p)); +@@ -139,7 +139,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) + p->iph.saddr = htonl(INADDR_ANY); + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +- strncpy(medium, *argv, IFNAMSIZ - 1); ++ medium = *argv; + } else if (strcmp(*argv, "ttl") == 0 || + strcmp(*argv, "hoplimit") == 0 || + strcmp(*argv, "hlim") == 0) { +@@ -216,7 +216,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) + } + } + +- if (medium[0]) { ++ if (medium) { + p->link = ll_name_to_index(medium); + if (p->link == 0) { + fprintf(stderr, "Cannot find device \"%s\"\n", medium); +@@ -465,9 +465,8 @@ static int do_prl(int argc, char **argv) + { + struct ip_tunnel_prl p = {}; + int count = 0; +- int devname = 0; + int cmd = 0; +- char medium[IFNAMSIZ] = {}; ++ const char *medium = NULL; + + while (argc > 0) { + if (strcmp(*argv, "prl-default") == 0) { +@@ -488,8 +487,7 @@ static int do_prl(int argc, char **argv) + count++; + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +- strncpy(medium, *argv, IFNAMSIZ-1); +- devname++; ++ medium = *argv; + } else { + fprintf(stderr, + "Invalid PRL parameter \"%s\"\n", *argv); +@@ -502,7 +500,7 @@ static int do_prl(int argc, char **argv) + } + argc--; argv++; + } +- if (devname == 0) { ++ if (!medium) { + fprintf(stderr, "Must specify device\n"); + exit(-1); + } +@@ -513,9 +511,8 @@ static int do_prl(int argc, char **argv) + static int do_6rd(int argc, char **argv) + { + struct ip_tunnel_6rd ip6rd = {}; +- int devname = 0; + int cmd = 0; +- char medium[IFNAMSIZ] = {}; ++ const char *medium = NULL; + inet_prefix prefix; + + while (argc > 0) { +@@ -537,8 +534,7 @@ static int do_6rd(int argc, char **argv) + cmd = SIOCDEL6RD; + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +- strncpy(medium, *argv, IFNAMSIZ-1); +- devname++; ++ medium = *argv; + } else { + fprintf(stderr, + "Invalid 6RD parameter \"%s\"\n", *argv); +@@ -546,7 +542,7 @@ static int do_6rd(int argc, char **argv) + } + argc--; argv++; + } +- if (devname == 0) { ++ if (!medium) { + fprintf(stderr, "Must specify device\n"); + exit(-1); + } +-- +2.20.1 + diff --git a/SOURCES/0125-tc-flower-No-need-to-cache-indev-arg.patch b/SOURCES/0125-tc-flower-No-need-to-cache-indev-arg.patch new file mode 100644 index 0000000..d6312ea --- /dev/null +++ b/SOURCES/0125-tc-flower-No-need-to-cache-indev-arg.patch @@ -0,0 +1,42 @@ +From 85bcdf3ca3a76ce3b4f62769aa64adcb1c849082 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:13 +0200 +Subject: [PATCH] tc: flower: No need to cache indev arg + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit ee474849c8511 + +commit ee474849c85116ec36e387882447f737ac3fdefb +Author: Phil Sutter +Date: Mon Oct 2 13:46:36 2017 +0200 + + tc: flower: No need to cache indev arg + + Since addattrstrz() will copy the provided string into the attribute + payload, there is no need to cache the data. + + Signed-off-by: Phil Sutter +--- + tc/f_flower.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/tc/f_flower.c b/tc/f_flower.c +index e2c7daa0b8e03..34249254603ff 100644 +--- a/tc/f_flower.c ++++ b/tc/f_flower.c +@@ -642,11 +642,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + } else if (matches(*argv, "skip_sw") == 0) { + flags |= TCA_CLS_FLAGS_SKIP_SW; + } else if (matches(*argv, "indev") == 0) { +- char ifname[IFNAMSIZ] = {}; +- + NEXT_ARG(); +- strncpy(ifname, *argv, sizeof(ifname) - 1); +- addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, ifname); ++ addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, *argv); + } else if (matches(*argv, "vlan_id") == 0) { + __u16 vid; + +-- +2.20.1 + diff --git a/SOURCES/0126-Check-user-supplied-interface-name-lengths.patch b/SOURCES/0126-Check-user-supplied-interface-name-lengths.patch new file mode 100644 index 0000000..ada9ba1 --- /dev/null +++ b/SOURCES/0126-Check-user-supplied-interface-name-lengths.patch @@ -0,0 +1,378 @@ +From 358ca205cfc9646aefae6572607a0a1363086e51 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Mon, 29 Apr 2019 20:09:13 +0200 +Subject: [PATCH] Check user supplied interface name lengths + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 625df645b703d + +commit 625df645b703dc858d54784c35beff64464afae2 +Author: Phil Sutter +Date: Mon Oct 2 13:46:37 2017 +0200 + + Check user supplied interface name lengths + + The original problem was that something like: + + | strncpy(ifr.ifr_name, *argv, IFNAMSIZ); + + might leave ifr.ifr_name unterminated if length of *argv exceeds + IFNAMSIZ. In order to fix this, I thought about replacing all those + cases with (equivalent) calls to snprintf() or even introducing + strlcpy(). But as Ulrich Drepper correctly pointed out when rejecting + the latter from being added to glibc, truncating a string without + notifying the user is not to be considered good practice. So let's + excercise what he suggested and reject empty, overlong or otherwise + invalid interface names right from the start - this way calls to + strncpy() like shown above become safe and the user has a chance to + reconsider what he was trying to do. + + Note that this doesn't add calls to check_ifname() to all places where + user supplied interface name is parsed. In many cases, the interface + must exist already and is therefore looked up using ll_name_to_index(), + so if_nametoindex() will perform the necessary checks already. + + Signed-off-by: Phil Sutter +--- + include/utils.h | 2 ++ + ip/ip6tunnel.c | 3 ++- + ip/ipl2tp.c | 4 +++- + ip/iplink.c | 31 ++++++++++++------------------- + ip/ipmaddr.c | 3 ++- + ip/iprule.c | 10 ++++++++-- + ip/iptunnel.c | 7 ++++++- + ip/iptuntap.c | 6 ++++-- + lib/utils.c | 29 +++++++++++++++++++++++++++++ + misc/arpd.c | 3 ++- + tc/f_flower.c | 2 ++ + 11 files changed, 72 insertions(+), 28 deletions(-) + +diff --git a/include/utils.h b/include/utils.h +index d596a6fc10574..0382460136180 100644 +--- a/include/utils.h ++++ b/include/utils.h +@@ -145,6 +145,8 @@ void missarg(const char *) __attribute__((noreturn)); + void invarg(const char *, const char *) __attribute__((noreturn)); + void duparg(const char *, const char *) __attribute__((noreturn)); + void duparg2(const char *, const char *) __attribute__((noreturn)); ++int check_ifname(const char *); ++int get_ifname(char *, const char *); + int matches(const char *arg, const char *pattern); + int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits); + +diff --git a/ip/ip6tunnel.c b/ip/ip6tunnel.c +index c12d700e74189..bc44bef7f030c 100644 +--- a/ip/ip6tunnel.c ++++ b/ip/ip6tunnel.c +@@ -273,7 +273,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p) + usage(); + if (p->name[0]) + duparg2("name", *argv); +- strncpy(p->name, *argv, IFNAMSIZ - 1); ++ if (get_ifname(p->name, *argv)) ++ invarg("\"name\" not a valid ifname", *argv); + if (cmd == SIOCCHGTUNNEL && count == 0) { + struct ip6_tnl_parm2 old_p = {}; + +diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c +index 742adbe4f9c3a..7c5ed313b186f 100644 +--- a/ip/ipl2tp.c ++++ b/ip/ipl2tp.c +@@ -182,7 +182,7 @@ static int create_session(struct l2tp_parm *p) + if (p->peer_cookie_len) + addattr_l(&req.n, 1024, L2TP_ATTR_PEER_COOKIE, + p->peer_cookie, p->peer_cookie_len); +- if (p->ifname && p->ifname[0]) ++ if (p->ifname) + addattrstrz(&req.n, 1024, L2TP_ATTR_IFNAME, p->ifname); + + if (rtnl_talk(&genl_rth, &req.n, NULL) < 0) +@@ -545,6 +545,8 @@ static int parse_args(int argc, char **argv, int cmd, struct l2tp_parm *p) + } + } else if (strcmp(*argv, "name") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"name\" not a valid ifname", *argv); + p->ifname = *argv; + } else if (strcmp(*argv, "remote") == 0) { + NEXT_ARG(); +diff --git a/ip/iplink.c b/ip/iplink.c +index db5b2c9645ba8..50f1075d94171 100644 +--- a/ip/iplink.c ++++ b/ip/iplink.c +@@ -581,6 +581,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, + req->i.ifi_flags &= ~IFF_UP; + } else if (strcmp(*argv, "name") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"name\" not a valid ifname", *argv); + *name = *argv; + } else if (strcmp(*argv, "index") == 0) { + NEXT_ARG(); +@@ -848,6 +850,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, + NEXT_ARG(); + if (*dev) + duparg2("dev", *argv); ++ if (check_ifname(*argv)) ++ invarg("\"dev\" not a valid ifname", *argv); + *dev = *argv; + dev_index = ll_name_to_index(*dev); + } +@@ -870,7 +874,6 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, + + static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) + { +- int len; + char *dev = NULL; + char *name = NULL; + char *link = NULL; +@@ -960,13 +963,8 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) + } + + if (name) { +- len = strlen(name) + 1; +- if (len == 1) +- invarg("\"\" is not a valid device identifier\n", +- "name"); +- if (len > IFNAMSIZ) +- invarg("\"name\" too long\n", name); +- addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len); ++ addattr_l(&req.n, sizeof(req), ++ IFLA_IFNAME, name, strlen(name) + 1); + } + + if (type) { +@@ -1016,7 +1014,6 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) + + int iplink_get(unsigned int flags, char *name, __u32 filt_mask) + { +- int len; + struct iplink_req req = { + .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), + .n.nlmsg_flags = NLM_F_REQUEST | flags, +@@ -1026,13 +1023,8 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask) + struct nlmsghdr *answer; + + if (name) { +- len = strlen(name) + 1; +- if (len == 1) +- invarg("\"\" is not a valid device identifier\n", +- "name"); +- if (len > IFNAMSIZ) +- invarg("\"name\" too long\n", name); +- addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len); ++ addattr_l(&req.n, sizeof(req), ++ IFLA_IFNAME, name, strlen(name) + 1); + } + addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask); + +@@ -1256,6 +1248,8 @@ static int do_set(int argc, char **argv) + flags &= ~IFF_UP; + } else if (strcmp(*argv, "name") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"name\" not a valid ifname", *argv); + newname = *argv; + } else if (matches(*argv, "address") == 0) { + NEXT_ARG(); +@@ -1346,6 +1340,8 @@ static int do_set(int argc, char **argv) + + if (dev) + duparg2("dev", *argv); ++ if (check_ifname(*argv)) ++ invarg("\"dev\" not a valid ifname", *argv); + dev = *argv; + } + argc--; argv++; +@@ -1374,9 +1370,6 @@ static int do_set(int argc, char **argv) + } + + if (newname && strcmp(dev, newname)) { +- if (strlen(newname) == 0) +- invarg("\"\" is not a valid device identifier\n", +- "name"); + if (do_changename(dev, newname) < 0) + return -1; + dev = newname; +diff --git a/ip/ipmaddr.c b/ip/ipmaddr.c +index 85a69e779563d..5683f6fa830c1 100644 +--- a/ip/ipmaddr.c ++++ b/ip/ipmaddr.c +@@ -284,7 +284,8 @@ static int multiaddr_modify(int cmd, int argc, char **argv) + NEXT_ARG(); + if (ifr.ifr_name[0]) + duparg("dev", *argv); +- strncpy(ifr.ifr_name, *argv, IFNAMSIZ); ++ if (get_ifname(ifr.ifr_name, *argv)) ++ invarg("\"dev\" not a valid ifname", *argv); + } else { + if (matches(*argv, "address") == 0) { + NEXT_ARG(); +diff --git a/ip/iprule.c b/ip/iprule.c +index e64b4d7db2815..201d3bdc20427 100644 +--- a/ip/iprule.c ++++ b/ip/iprule.c +@@ -472,11 +472,13 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action) + } else if (strcmp(*argv, "dev") == 0 || + strcmp(*argv, "iif") == 0) { + NEXT_ARG(); +- strncpy(filter.iif, *argv, IFNAMSIZ); ++ if (get_ifname(filter.iif, *argv)) ++ invarg("\"iif\"/\"dev\" not a valid ifname", *argv); + filter.iifmask = 1; + } else if (strcmp(*argv, "oif") == 0) { + NEXT_ARG(); +- strncpy(filter.oif, *argv, IFNAMSIZ); ++ if (get_ifname(filter.oif, *argv)) ++ invarg("\"oif\" not a valid ifname", *argv); + filter.oifmask = 1; + } else if (strcmp(*argv, "l3mdev") == 0) { + filter.l3mdev = 1; +@@ -695,10 +697,14 @@ static int iprule_modify(int cmd, int argc, char **argv) + } else if (strcmp(*argv, "dev") == 0 || + strcmp(*argv, "iif") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"iif\"/\"dev\" not a valid ifname", *argv); + addattr_l(&req.n, sizeof(req), FRA_IFNAME, + *argv, strlen(*argv)+1); + } else if (strcmp(*argv, "oif") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"oif\" not a valid ifname", *argv); + addattr_l(&req.n, sizeof(req), FRA_OIFNAME, + *argv, strlen(*argv)+1); + } else if (strcmp(*argv, "l3mdev") == 0) { +diff --git a/ip/iptunnel.c b/ip/iptunnel.c +index 0acfd0793d3cd..208a1f06ab12f 100644 +--- a/ip/iptunnel.c ++++ b/ip/iptunnel.c +@@ -178,7 +178,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) + + if (p->name[0]) + duparg2("name", *argv); +- strncpy(p->name, *argv, IFNAMSIZ - 1); ++ if (get_ifname(p->name, *argv)) ++ invarg("\"name\" not a valid ifname", *argv); + if (cmd == SIOCCHGTUNNEL && count == 0) { + struct ip_tunnel_parm old_p = {}; + +@@ -487,6 +488,8 @@ static int do_prl(int argc, char **argv) + count++; + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"dev\" not a valid ifname", *argv); + medium = *argv; + } else { + fprintf(stderr, +@@ -534,6 +537,8 @@ static int do_6rd(int argc, char **argv) + cmd = SIOCDEL6RD; + } else if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"dev\" not a valid ifname", *argv); + medium = *argv; + } else { + fprintf(stderr, +diff --git a/ip/iptuntap.c b/ip/iptuntap.c +index 451f7f0eac6bb..b46e452f21278 100644 +--- a/ip/iptuntap.c ++++ b/ip/iptuntap.c +@@ -176,7 +176,8 @@ static int parse_args(int argc, char **argv, + ifr->ifr_flags |= IFF_MULTI_QUEUE; + } else if (matches(*argv, "dev") == 0) { + NEXT_ARG(); +- strncpy(ifr->ifr_name, *argv, IFNAMSIZ-1); ++ if (get_ifname(ifr->ifr_name, *argv)) ++ invarg("\"dev\" not a valid ifname", *argv); + } else { + if (matches(*argv, "name") == 0) { + NEXT_ARG(); +@@ -184,7 +185,8 @@ static int parse_args(int argc, char **argv, + usage(); + if (ifr->ifr_name[0]) + duparg2("name", *argv); +- strncpy(ifr->ifr_name, *argv, IFNAMSIZ); ++ if (get_ifname(ifr->ifr_name, *argv)) ++ invarg("\"name\" not a valid ifname", *argv); + } + count++; + argc--; argv++; +diff --git a/lib/utils.c b/lib/utils.c +index 228d97bfe5e9b..0c56f0b478f23 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -697,6 +698,34 @@ void duparg2(const char *key, const char *arg) + exit(-1); + } + ++int check_ifname(const char *name) ++{ ++ /* These checks mimic kernel checks in dev_valid_name */ ++ if (*name == '\0') ++ return -1; ++ if (strlen(name) >= IFNAMSIZ) ++ return -1; ++ ++ while (*name) { ++ if (*name == '/' || isspace(*name)) ++ return -1; ++ ++name; ++ } ++ return 0; ++} ++ ++/* buf is assumed to be IFNAMSIZ */ ++int get_ifname(char *buf, const char *name) ++{ ++ int ret; ++ ++ ret = check_ifname(name); ++ if (ret == 0) ++ strncpy(buf, name, IFNAMSIZ); ++ ++ return ret; ++} ++ + int matches(const char *cmd, const char *pattern) + { + int len = strlen(cmd); +diff --git a/misc/arpd.c b/misc/arpd.c +index c9d86475e5995..67d86b67957b8 100644 +--- a/misc/arpd.c ++++ b/misc/arpd.c +@@ -662,7 +662,8 @@ int main(int argc, char **argv) + struct ifreq ifr = {}; + + for (i = 0; i < ifnum; i++) { +- strncpy(ifr.ifr_name, ifnames[i], IFNAMSIZ); ++ if (get_ifname(ifr.ifr_name, ifnames[i])) ++ invarg("not a valid ifname", ifnames[i]); + if (ioctl(udp_sock, SIOCGIFINDEX, &ifr)) { + perror("ioctl(SIOCGIFINDEX)"); + exit(-1); +diff --git a/tc/f_flower.c b/tc/f_flower.c +index 34249254603ff..f3f8d3427c761 100644 +--- a/tc/f_flower.c ++++ b/tc/f_flower.c +@@ -643,6 +643,8 @@ static int flower_parse_opt(struct filter_util *qu, char *handle, + flags |= TCA_CLS_FLAGS_SKIP_SW; + } else if (matches(*argv, "indev") == 0) { + NEXT_ARG(); ++ if (check_ifname(*argv)) ++ invarg("\"indev\" not a valid ifname", *argv); + addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, *argv); + } else if (matches(*argv, "vlan_id") == 0) { + __u16 vid; +-- +2.20.1 + diff --git a/SOURCES/0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch b/SOURCES/0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch new file mode 100644 index 0000000..a96efb9 --- /dev/null +++ b/SOURCES/0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch @@ -0,0 +1,73 @@ +From edf0ae950c5b9d3c5eed29a40f5669cf657995e6 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Tue, 30 Apr 2019 15:43:03 +0200 +Subject: [PATCH] bpf: minor cleanups for bpf_trace_pipe + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1465646 +Upstream Status: iproute2.git commit 1b736dc469dca + +commit 1b736dc469dcabd4180848a1f1b3d1fef2b84dbc +Author: Daniel Borkmann +Date: Tue Sep 5 02:24:31 2017 +0200 + + bpf: minor cleanups for bpf_trace_pipe + + Just minor nits, e.g. no need to fflush() and instead of returning + right away, just break and close the fd. + + Signed-off-by: Daniel Borkmann +--- + lib/bpf.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/lib/bpf.c b/lib/bpf.c +index e072cba214067..f0e6c6fb732ee 100644 +--- a/lib/bpf.c ++++ b/lib/bpf.c +@@ -461,9 +461,9 @@ int bpf_trace_pipe(void) + "/trace", + 0, + }; ++ int fd_in, fd_out = STDERR_FILENO; + char tpipe[PATH_MAX]; + const char *mnt; +- int fd; + + mnt = bpf_find_mntpt("tracefs", TRACEFS_MAGIC, tracefs_mnt, + sizeof(tracefs_mnt), tracefs_known_mnts); +@@ -474,8 +474,8 @@ int bpf_trace_pipe(void) + + snprintf(tpipe, sizeof(tpipe), "%s/trace_pipe", mnt); + +- fd = open(tpipe, O_RDONLY); +- if (fd < 0) ++ fd_in = open(tpipe, O_RDONLY); ++ if (fd_in < 0) + return -1; + + fprintf(stderr, "Running! Hang up with ^C!\n\n"); +@@ -483,15 +483,14 @@ int bpf_trace_pipe(void) + static char buff[4096]; + ssize_t ret; + +- ret = read(fd, buff, sizeof(buff) - 1); +- if (ret > 0) { +- if (write(STDERR_FILENO, buff, ret) != ret) +- return -1; +- fflush(stderr); +- } ++ ret = read(fd_in, buff, sizeof(buff)); ++ if (ret > 0 && write(fd_out, buff, ret) == ret) ++ continue; ++ break; + } + +- return 0; ++ close(fd_in); ++ return -1; + } + + static int bpf_gen_global(const char *bpf_sub_dir) +-- +2.20.1 + diff --git a/SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch b/SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch new file mode 100644 index 0000000..537029f --- /dev/null +++ b/SOURCES/0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch @@ -0,0 +1,339 @@ +From 8f2338a51859158b8699e0736f84ab1e42a3da97 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:05:04 +0200 +Subject: [PATCH] ip/tunnel: Use tnl_parse_key() to parse tunnel key + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 1f44b93744f11 +Conflicts: context change due to missing commit 2a80154fde40b + ("vti6: fix local/remote any addr handling") + +commit 1f44b93744f11f2a8249e3c13751ab7debebaa5f +Author: Serhey Popovych +Date: Mon Dec 18 19:48:03 2017 +0200 + + ip/tunnel: Use tnl_parse_key() to parse tunnel key + + It is added with + commit a7ed1520ee96 ("ip/tunnel: introduce tnl_parse_key()") + to avoid code duplication in ip6?tunnel.c. + + Reuse it for gre/gre6 and vti/vti6 tunnel rtnl + configuration interface with the same purpose + it is used in tunnel ioctl interface in ip6?tunnel.c. + + While there change type of key variables from + unsigned integer to __be32 to reflect nature of the + value they store and place error message in + tnl_parse_key() on a single line to make single + call to fprintf(). + + Signed-off-by: Serhey Popovych + Signed-off-by: Stephen Hemminger +--- + ip/link_gre.c | 45 +++++---------------------------------------- + ip/link_gre6.c | 45 +++++---------------------------------------- + ip/link_vti.c | 45 +++++---------------------------------------- + ip/link_vti6.c | 45 +++++---------------------------------------- + ip/tunnel.c | 5 +++-- + 5 files changed, 23 insertions(+), 162 deletions(-) + +diff --git a/ip/link_gre.c b/ip/link_gre.c +index ced993692e6f6..1376d2e3af7de 100644 +--- a/ip/link_gre.c ++++ b/ip/link_gre.c +@@ -77,8 +77,8 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + struct rtattr *greinfo[IFLA_GRE_MAX + 1]; + __u16 iflags = 0; + __u16 oflags = 0; +- unsigned int ikey = 0; +- unsigned int okey = 0; ++ __be32 ikey = 0; ++ __be32 okey = 0; + unsigned int saddr = 0; + unsigned int daddr = 0; + unsigned int link = 0; +@@ -167,53 +167,18 @@ get_failed: + + while (argc > 0) { + if (!matches(*argv, "key")) { +- unsigned int uval; +- + NEXT_ARG(); + iflags |= GRE_KEY; + oflags |= GRE_KEY; +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, +- "Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- +- ikey = okey = uval; ++ ikey = okey = tnl_parse_key("key", *argv); + } else if (!matches(*argv, "ikey")) { +- unsigned int uval; +- + NEXT_ARG(); + iflags |= GRE_KEY; +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- ikey = uval; ++ ikey = tnl_parse_key("ikey", *argv); + } else if (!matches(*argv, "okey")) { +- unsigned int uval; +- + NEXT_ARG(); + oflags |= GRE_KEY; +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- okey = uval; ++ okey = tnl_parse_key("okey", *argv); + } else if (!matches(*argv, "seq")) { + iflags |= GRE_SEQ; + oflags |= GRE_SEQ; +diff --git a/ip/link_gre6.c b/ip/link_gre6.c +index a9d18ee954641..22e6e44aae29b 100644 +--- a/ip/link_gre6.c ++++ b/ip/link_gre6.c +@@ -89,8 +89,8 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + struct rtattr *greinfo[IFLA_GRE_MAX + 1]; + __u16 iflags = 0; + __u16 oflags = 0; +- unsigned int ikey = 0; +- unsigned int okey = 0; ++ __be32 ikey = 0; ++ __be32 okey = 0; + struct in6_addr raddr = IN6ADDR_ANY_INIT; + struct in6_addr laddr = IN6ADDR_ANY_INIT; + unsigned int link = 0; +@@ -181,53 +181,18 @@ get_failed: + + while (argc > 0) { + if (!matches(*argv, "key")) { +- unsigned int uval; +- + NEXT_ARG(); + iflags |= GRE_KEY; + oflags |= GRE_KEY; +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, +- "Invalid value for \"key\"\n"); +- exit(-1); +- } +- uval = htonl(uval); +- } +- +- ikey = okey = uval; ++ ikey = okey = tnl_parse_key("key", *argv); + } else if (!matches(*argv, "ikey")) { +- unsigned int uval; +- + NEXT_ARG(); + iflags |= GRE_KEY; +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value of \"ikey\"\n"); +- exit(-1); +- } +- uval = htonl(uval); +- } +- ikey = uval; ++ ikey = tnl_parse_key("ikey", *argv); + } else if (!matches(*argv, "okey")) { +- unsigned int uval; +- + NEXT_ARG(); + oflags |= GRE_KEY; +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value of \"okey\"\n"); +- exit(-1); +- } +- uval = htonl(uval); +- } +- okey = uval; ++ okey = tnl_parse_key("okey", *argv); + } else if (!matches(*argv, "seq")) { + iflags |= GRE_SEQ; + oflags |= GRE_SEQ; +diff --git a/ip/link_vti.c b/ip/link_vti.c +index d2aacbe78ded1..6e4234170bb50 100644 +--- a/ip/link_vti.c ++++ b/ip/link_vti.c +@@ -62,8 +62,8 @@ static int vti_parse_opt(struct link_util *lu, int argc, char **argv, + struct rtattr *tb[IFLA_MAX + 1]; + struct rtattr *linkinfo[IFLA_INFO_MAX+1]; + struct rtattr *vtiinfo[IFLA_VTI_MAX + 1]; +- unsigned int ikey = 0; +- unsigned int okey = 0; ++ __be32 ikey = 0; ++ __be32 okey = 0; + unsigned int saddr = 0; + unsigned int daddr = 0; + unsigned int link = 0; +@@ -116,49 +116,14 @@ get_failed: + + while (argc > 0) { + if (!matches(*argv, "key")) { +- unsigned int uval; +- + NEXT_ARG(); +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, +- "Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- +- ikey = okey = uval; ++ ikey = okey = tnl_parse_key("key", *argv); + } else if (!matches(*argv, "ikey")) { +- unsigned int uval; +- + NEXT_ARG(); +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- ikey = uval; ++ ikey = tnl_parse_key("ikey", *argv); + } else if (!matches(*argv, "okey")) { +- unsigned int uval; +- + NEXT_ARG(); +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- okey = uval; ++ okey = tnl_parse_key("okey", *argv); + } else if (!matches(*argv, "remote")) { + NEXT_ARG(); + if (!strcmp(*argv, "any")) { +diff --git a/ip/link_vti6.c b/ip/link_vti6.c +index aedfbeaeea0e1..e246cedbcb7a7 100644 +--- a/ip/link_vti6.c ++++ b/ip/link_vti6.c +@@ -59,8 +59,8 @@ static int vti6_parse_opt(struct link_util *lu, int argc, char **argv, + struct rtattr *vtiinfo[IFLA_VTI_MAX + 1]; + struct in6_addr saddr; + struct in6_addr daddr; +- unsigned int ikey = 0; +- unsigned int okey = 0; ++ __be32 ikey = 0; ++ __be32 okey = 0; + unsigned int link = 0; + int len; + +@@ -111,49 +111,14 @@ get_failed: + + while (argc > 0) { + if (!matches(*argv, "key")) { +- unsigned int uval; +- + NEXT_ARG(); +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, +- "Invalid value for \"key\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- +- ikey = okey = uval; ++ ikey = okey = tnl_parse_key("key", *argv); + } else if (!matches(*argv, "ikey")) { +- unsigned int uval; +- + NEXT_ARG(); +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value for \"ikey\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- ikey = uval; ++ ikey = tnl_parse_key("ikey", *argv); + } else if (!matches(*argv, "okey")) { +- unsigned int uval; +- + NEXT_ARG(); +- if (strchr(*argv, '.')) +- uval = get_addr32(*argv); +- else { +- if (get_unsigned(&uval, *argv, 0) < 0) { +- fprintf(stderr, "invalid value for \"okey\": \"%s\"; it should be an unsigned integer\n", *argv); +- exit(-1); +- } +- uval = htonl(uval); +- } +- okey = uval; ++ okey = tnl_parse_key("okey", *argv); + } else if (!matches(*argv, "remote")) { + NEXT_ARG(); + if (!strcmp(*argv, "any")) { +diff --git a/ip/tunnel.c b/ip/tunnel.c +index 7956d71aa7334..3967d5df3ca1c 100644 +--- a/ip/tunnel.c ++++ b/ip/tunnel.c +@@ -189,8 +189,9 @@ __be32 tnl_parse_key(const char *name, const char *key) + return get_addr32(key); + + if (get_unsigned(&uval, key, 0) < 0) { +- fprintf(stderr, "invalid value for \"%s\": \"%s\";", name, key); +- fprintf(stderr, " it should be an unsigned integer\n"); ++ fprintf(stderr, ++ "invalid value for \"%s\": \"%s\"; it should be an unsigned integer\n", ++ name, key); + exit(-1); + } + return htonl(uval); +-- +2.20.1 + diff --git a/SOURCES/0129-man-ip-link-document-GRE-tunnels.patch b/SOURCES/0129-man-ip-link-document-GRE-tunnels.patch new file mode 100644 index 0000000..76b36b3 --- /dev/null +++ b/SOURCES/0129-man-ip-link-document-GRE-tunnels.patch @@ -0,0 +1,218 @@ +From 266b19dec4b79c4f63118dd6151c1b0a80f521f7 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:08:00 +0200 +Subject: [PATCH] man: ip link: document GRE tunnels + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit d21c028cf7414 +Conflicts: context change due to missing commit 1eccc5734148c + ("ip: add vxcan/veth to ip-link man page") + +commit d21c028cf74147360c530a4c53063bbe677dbe73 +Author: Sabrina Dubroca +Date: Fri Apr 20 10:31:59 2018 +0200 + + man: ip link: document GRE tunnels + + GRE tunnels are currently only documented together with IPIP and SIT + tunnels, but they actually have very different configuration + options. Let's separate them. + + Signed-off-by: Sabrina Dubroca + Signed-off-by: David Ahern +--- + man/man8/ip-link.8.in | 152 ++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 148 insertions(+), 4 deletions(-) + +diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in +index 48417dbce80aa..cfea1bdfdc030 100644 +--- a/man/man8/ip-link.8.in ++++ b/man/man8/ip-link.8.in +@@ -643,15 +643,88 @@ keyword. + .in -8 + + .TP +-GRE, IPIP, SIT Type Support +-For a link of types +-.I GRE/IPIP/SIT ++IPIP, SIT Type Support ++For a link of type ++.IR IPIP or SIT ++the following additional arguments are supported: ++ ++.BI "ip link add " DEVICE ++.BR type " { " ipip " | " sit " }" ++.BI " remote " ADDR " local " ADDR ++[ ++.BR encap " { " fou " | " gue " | " none " }" ++] [ ++.BR encap-sport " { " \fIPORT " | " auto " }" ++] [ ++.BI "encap-dport " PORT ++] [ ++.RB [ no ] encap-csum ++] [ ++.RB [ no ] encap-remcsum ++] ++ ++.in +8 ++.sp ++.BI remote " ADDR " ++- specifies the remote address of the tunnel. ++ ++.sp ++.BI local " ADDR " ++- specifies the fixed local address for tunneled packets. ++It must be an address on another interface on this host. ++ ++.sp ++.BR encap " { " fou " | " gue " | " none " }" ++- specifies type of secondary UDP encapsulation. "fou" indicates ++Foo-Over-UDP, "gue" indicates Generic UDP Encapsulation. ++ ++.sp ++.BR encap-sport " { " \fIPORT " | " auto " }" ++- specifies the source port in UDP encapsulation. ++.IR PORT ++indicates the port by number, "auto" ++indicates that the port number should be chosen automatically ++(the kernel picks a flow based on the flow hash of the ++encapsulated packet). ++ ++.sp ++.RB [ no ] encap-csum ++- specifies if UDP checksums are enabled in the secondary ++encapsulation. ++ ++.sp ++.RB [ no ] encap-remcsum ++- specifies if Remote Checksum Offload is enabled. This is only ++applicable for Generic UDP Encapsulation. ++ ++.in -8 ++.TP ++GRE Type Support ++For a link of type ++.IR GRE " or " GRETAP + the following additional arguments are supported: + + .BI "ip link add " DEVICE +-.BR type " { " gre " | " ipip " | " sit " }" ++.BR type " { " gre " | " gretap " }" + .BI " remote " ADDR " local " ADDR + [ ++.RB [ i | o ] seq ++] [ ++.RB [ i | o ] key ++.I KEY ++] [ ++.RB [ i | o ] csum ++] [ ++.BI ttl " TTL " ++] [ ++.BI tos " TOS " ++] [ ++.RB [ no ] pmtudisc ++] [ ++.RB [ no ] ignore-df ++] [ ++.BI dev " PHYS_DEV " ++] [ + .BR encap " { " fou " | " gue " | " none " }" + ] [ + .BR encap-sport " { " \fIPORT " | " auto " }" +@@ -661,6 +734,8 @@ the following additional arguments are supported: + .RB [ no ] encap-csum + ] [ + .RB [ no ] encap-remcsum ++] [ ++.BR external + ] + + .in +8 +@@ -673,6 +748,70 @@ the following additional arguments are supported: + - specifies the fixed local address for tunneled packets. + It must be an address on another interface on this host. + ++.sp ++.RB [ i | o ] seq ++- serialize packets. ++The ++.B oseq ++flag enables sequencing of outgoing packets. ++The ++.B iseq ++flag requires that all input packets are serialized. ++ ++.sp ++.RB [ i | o ] key ++.I KEY ++- use keyed GRE with key ++.IR KEY ". "KEY ++is either a number or an IPv4 address-like dotted quad. ++The ++.B key ++parameter specifies the same key to use in both directions. ++The ++.BR ikey " and " okey ++parameters specify different keys for input and output. ++ ++.sp ++.RB [ i | o ] csum ++- generate/require checksums for tunneled packets. ++The ++.B ocsum ++flag calculates checksums for outgoing packets. ++The ++.B icsum ++flag requires that all input packets have the correct ++checksum. The ++.B csum ++flag is equivalent to the combination ++.B "icsum ocsum" . ++ ++.sp ++.BI ttl " TTL" ++- specifies the TTL value to use in outgoing packets. ++ ++.sp ++.BI tos " TOS" ++- specifies the TOS value to use in outgoing packets. ++ ++.sp ++.RB [ no ] pmtudisc ++- enables/disables Path MTU Discovery on this tunnel. ++It is enabled by default. Note that a fixed ttl is incompatible ++with this option: tunneling with a fixed ttl always makes pmtu ++discovery. ++ ++.sp ++.RB [ no ] ignore-df ++- enables/disables IPv4 DF suppression on this tunnel. ++Normally datagrams that exceed the MTU will be fragmented; the presence ++of the DF flag inhibits this, resulting instead in an ICMP Unreachable ++(Fragmentation Required) message. Enabling this attribute casues the ++DF flag to be ignored. ++ ++.sp ++.BI dev " PHYS_DEV" ++- specifies the physical device to use for tunnel endpoint communication. ++ + .sp + .BR encap " { " fou " | " gue " | " none " }" + - specifies type of secondary UDP encapsulation. "fou" indicates +@@ -697,6 +836,11 @@ encapsulation. + - specifies if Remote Checksum Offload is enabled. This is only + applicable for Generic UDP Encapsulation. + ++.sp ++.BR external ++- make this tunnel externally controlled ++.RB "(e.g. " "ip route encap" ). ++ + .in -8 + + .TP +-- +2.20.1 + diff --git a/SOURCES/0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch b/SOURCES/0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch new file mode 100644 index 0000000..2d4af18 --- /dev/null +++ b/SOURCES/0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch @@ -0,0 +1,268 @@ +From 24eec64aa52b65b606d8cc0b03619f3974f12484 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:08:41 +0200 +Subject: [PATCH] gre/gre6: allow clearing {,i,o}{key,seq,csum} flags + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 7f520601f59ee +Conflicts: context change on ip/link_gre?.c due to missing commit + ae91205c4d2a7 ("gre/gre6: Unify gre_print_help()") + +commit 7f520601f59ee35da2fc48b3f1b39ed2b80c9efa +Author: Sabrina Dubroca +Date: Fri Apr 20 10:32:00 2018 +0200 + + gre/gre6: allow clearing {,i,o}{key,seq,csum} flags + + Currently, iproute allows setting those flags, but it's impossible to + clear them, since their current value is fetched from the kernel and + then we OR in the additional flags passed on the command line. + + Add no* variants to allow clearing them. + + Signed-off-by: Sabrina Dubroca + Signed-off-by: David Ahern +--- + ip/link_gre.c | 30 +++++++++++++++++++++++++++--- + ip/link_gre6.c | 30 +++++++++++++++++++++++++++--- + man/man8/ip-link.8.in | 27 ++++++++++++++++++--------- + 3 files changed, 72 insertions(+), 15 deletions(-) + +diff --git a/ip/link_gre.c b/ip/link_gre.c +index 1376d2e3af7de..41e2edbedb6eb 100644 +--- a/ip/link_gre.c ++++ b/ip/link_gre.c +@@ -28,9 +28,9 @@ static void print_usage(FILE *f) + fprintf(f, + "Usage: ... { gre | gretap } [ remote ADDR ]\n" + " [ local ADDR ]\n" +- " [ [i|o]seq ]\n" +- " [ [i|o]key KEY ]\n" +- " [ [i|o]csum ]\n" ++ " [ [no][i|o]seq ]\n" ++ " [ [i|o]key KEY | no[i|o]key ]\n" ++ " [ [no][i|o]csum ]\n" + " [ ttl TTL ]\n" + " [ tos TOS ]\n" + " [ [no]pmtudisc ]\n" +@@ -171,28 +171,52 @@ get_failed: + iflags |= GRE_KEY; + oflags |= GRE_KEY; + ikey = okey = tnl_parse_key("key", *argv); ++ } else if (!matches(*argv, "nokey")) { ++ iflags &= ~GRE_KEY; ++ oflags &= ~GRE_KEY; ++ ikey = okey = 0; + } else if (!matches(*argv, "ikey")) { + NEXT_ARG(); + iflags |= GRE_KEY; + ikey = tnl_parse_key("ikey", *argv); ++ } else if (!matches(*argv, "noikey")) { ++ iflags &= ~GRE_KEY; ++ ikey = 0; + } else if (!matches(*argv, "okey")) { + NEXT_ARG(); + oflags |= GRE_KEY; + okey = tnl_parse_key("okey", *argv); ++ } else if (!matches(*argv, "nookey")) { ++ oflags &= ~GRE_KEY; ++ okey = 0; + } else if (!matches(*argv, "seq")) { + iflags |= GRE_SEQ; + oflags |= GRE_SEQ; ++ } else if (!matches(*argv, "noseq")) { ++ iflags &= ~GRE_SEQ; ++ oflags &= ~GRE_SEQ; + } else if (!matches(*argv, "iseq")) { + iflags |= GRE_SEQ; ++ } else if (!matches(*argv, "noiseq")) { ++ iflags &= ~GRE_SEQ; + } else if (!matches(*argv, "oseq")) { + oflags |= GRE_SEQ; ++ } else if (!matches(*argv, "nooseq")) { ++ oflags &= ~GRE_SEQ; + } else if (!matches(*argv, "csum")) { + iflags |= GRE_CSUM; + oflags |= GRE_CSUM; ++ } else if (!matches(*argv, "nocsum")) { ++ iflags &= ~GRE_CSUM; ++ oflags &= ~GRE_CSUM; + } else if (!matches(*argv, "icsum")) { + iflags |= GRE_CSUM; ++ } else if (!matches(*argv, "noicsum")) { ++ iflags &= ~GRE_CSUM; + } else if (!matches(*argv, "ocsum")) { + oflags |= GRE_CSUM; ++ } else if (!matches(*argv, "noocsum")) { ++ oflags &= ~GRE_CSUM; + } else if (!matches(*argv, "nopmtudisc")) { + pmtudisc = 0; + } else if (!matches(*argv, "pmtudisc")) { +diff --git a/ip/link_gre6.c b/ip/link_gre6.c +index 22e6e44aae29b..127e51de4ab73 100644 +--- a/ip/link_gre6.c ++++ b/ip/link_gre6.c +@@ -35,9 +35,9 @@ static void print_usage(FILE *f) + fprintf(f, + "Usage: ... { ip6gre | ip6gretap } [ remote ADDR ]\n" + " [ local ADDR ]\n" +- " [ [i|o]seq ]\n" +- " [ [i|o]key KEY ]\n" +- " [ [i|o]csum ]\n" ++ " [ [no][i|o]seq ]\n" ++ " [ [i|o]key KEY | no[i|o]key ]\n" ++ " [ [no][i|o]csum ]\n" + " [ hoplimit TTL ]\n" + " [ encaplimit ELIM ]\n" + " [ tclass TCLASS ]\n" +@@ -185,28 +185,52 @@ get_failed: + iflags |= GRE_KEY; + oflags |= GRE_KEY; + ikey = okey = tnl_parse_key("key", *argv); ++ } else if (!matches(*argv, "nokey")) { ++ iflags &= ~GRE_KEY; ++ oflags &= ~GRE_KEY; ++ ikey = okey = 0; + } else if (!matches(*argv, "ikey")) { + NEXT_ARG(); + iflags |= GRE_KEY; + ikey = tnl_parse_key("ikey", *argv); ++ } else if (!matches(*argv, "noikey")) { ++ iflags &= ~GRE_KEY; ++ ikey = 0; + } else if (!matches(*argv, "okey")) { + NEXT_ARG(); + oflags |= GRE_KEY; + okey = tnl_parse_key("okey", *argv); ++ } else if (!matches(*argv, "nookey")) { ++ oflags &= ~GRE_KEY; ++ okey = 0; + } else if (!matches(*argv, "seq")) { + iflags |= GRE_SEQ; + oflags |= GRE_SEQ; ++ } else if (!matches(*argv, "noseq")) { ++ iflags &= ~GRE_SEQ; ++ oflags &= ~GRE_SEQ; + } else if (!matches(*argv, "iseq")) { + iflags |= GRE_SEQ; ++ } else if (!matches(*argv, "noiseq")) { ++ iflags &= ~GRE_SEQ; + } else if (!matches(*argv, "oseq")) { + oflags |= GRE_SEQ; ++ } else if (!matches(*argv, "nooseq")) { ++ oflags &= ~GRE_SEQ; + } else if (!matches(*argv, "csum")) { + iflags |= GRE_CSUM; + oflags |= GRE_CSUM; ++ } else if (!matches(*argv, "nocsum")) { ++ iflags &= ~GRE_CSUM; ++ oflags &= ~GRE_CSUM; + } else if (!matches(*argv, "icsum")) { + iflags |= GRE_CSUM; ++ } else if (!matches(*argv, "noicsum")) { ++ iflags &= ~GRE_CSUM; + } else if (!matches(*argv, "ocsum")) { + oflags |= GRE_CSUM; ++ } else if (!matches(*argv, "noocsum")) { ++ oflags &= ~GRE_CSUM; + } else if (!matches(*argv, "remote")) { + inet_prefix addr; + +diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in +index cfea1bdfdc030..8be5d5e1e9fd6 100644 +--- a/man/man8/ip-link.8.in ++++ b/man/man8/ip-link.8.in +@@ -708,12 +708,14 @@ the following additional arguments are supported: + .BR type " { " gre " | " gretap " }" + .BI " remote " ADDR " local " ADDR + [ +-.RB [ i | o ] seq ++.RB [ no ] "" [ i | o ] seq + ] [ + .RB [ i | o ] key + .I KEY ++| ++.BR no [ i | o ] key + ] [ +-.RB [ i | o ] csum ++.RB [ no ] "" [ i | o ] csum + ] [ + .BI ttl " TTL " + ] [ +@@ -749,7 +751,7 @@ the following additional arguments are supported: + It must be an address on another interface on this host. + + .sp +-.RB [ i | o ] seq ++.RB [ no ] "" [ i | o ] seq + - serialize packets. + The + .B oseq +@@ -761,6 +763,8 @@ flag requires that all input packets are serialized. + .sp + .RB [ i | o ] key + .I KEY ++| ++.BR no [ i | o ] key + - use keyed GRE with key + .IR KEY ". "KEY + is either a number or an IPv4 address-like dotted quad. +@@ -772,7 +776,7 @@ The + parameters specify different keys for input and output. + + .sp +-.RB [ i | o ] csum ++.RB [ no ] "" [ i | o ] csum + - generate/require checksums for tunneled packets. + The + .B ocsum +@@ -853,12 +857,14 @@ the following additional arguments are supported: + .BR type " { " ip6gre " | " ip6gretap " }" + .BI remote " ADDR " local " ADDR" + [ +-.RB [ i | o ] seq ++.RB [ no ] "" [ i | o ] seq + ] [ + .RB [ i | o ] key + .I KEY ++| ++.BR no [ i | o ] key + ] [ +-.RB [ i | o ] csum ++.RB [ no ] "" [ i | o ] csum + ] [ + .BI hoplimit " TTL " + ] [ +@@ -884,7 +890,7 @@ the following additional arguments are supported: + It must be an address on another interface on this host. + + .sp +-.RB [ i | o ] seq ++.RB [ no ] "" [ i | o ] seq + - serialize packets. + The + .B oseq +@@ -894,7 +900,10 @@ The + flag requires that all input packets are serialized. + + .sp +-.RB [ i | o ] key " \fIKEY" ++.RB [ i | o ] key ++.I KEY ++| ++.BR no [ i | o ] key + - use keyed GRE with key + .IR KEY ". "KEY + is either a number or an IPv4 address-like dotted quad. +@@ -906,7 +915,7 @@ The + parameters specify different keys for input and output. + + .sp +-.RB [ i | o ] csum ++.RB [ no ] "" [ i | o ] csum + - generate/require checksums for tunneled packets. + The + .B ocsum +-- +2.20.1 + diff --git a/SOURCES/0131-tc_filter-add-support-for-chain-index.patch b/SOURCES/0131-tc_filter-add-support-for-chain-index.patch new file mode 100644 index 0000000..4fe63f0 --- /dev/null +++ b/SOURCES/0131-tc_filter-add-support-for-chain-index.patch @@ -0,0 +1,250 @@ +From 55c511b5caab0bfb9997bca9031947a45fe7854b Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:09:39 +0200 +Subject: [PATCH] tc_filter: add support for chain index + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 732f03461bc48 + +commit 732f03461bc48cf94946ee3cc92ab5832862b989 +Author: Jiri Pirko +Date: Tue May 16 19:29:35 2017 +0200 + + tc_filter: add support for chain index + + Allow user to put filter to a specific chain identified by index. + + Signed-off-by: Jiri Pirko +--- + tc/tc_filter.c | 87 +++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 72 insertions(+), 15 deletions(-) + +diff --git a/tc/tc_filter.c b/tc/tc_filter.c +index a6bb73d12eaba..8dbebf1ffa32a 100644 +--- a/tc/tc_filter.c ++++ b/tc/tc_filter.c +@@ -31,7 +31,7 @@ static void usage(void) + fprintf(stderr, + "Usage: tc filter [ add | del | change | replace | show ] dev STRING\n" + "Usage: tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" +- " [ pref PRIO ] protocol PROTO\n" ++ " [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]\n" + " [ estimator INTERVAL TIME_CONSTANT ]\n" + " [ root | ingress | egress | parent CLASSID ]\n" + " [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n" +@@ -59,6 +59,8 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + __u32 prio = 0; + __u32 protocol = 0; + int protocol_set = 0; ++ __u32 chain_index; ++ int chain_index_set = 0; + char *fhandle = NULL; + char d[16] = {}; + char k[16] = {}; +@@ -127,6 +129,13 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + invarg("invalid protocol", *argv); + protocol = id; + protocol_set = 1; ++ } else if (matches(*argv, "chain") == 0) { ++ NEXT_ARG(); ++ if (chain_index_set) ++ duparg("chain", *argv); ++ if (get_u32(&chain_index, *argv, 0)) ++ invarg("invalid chain index value", *argv); ++ chain_index_set = 1; + } else if (matches(*argv, "estimator") == 0) { + if (parse_estimator(&argc, &argv, &est) < 0) + return -1; +@@ -146,6 +155,9 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + + req.t.tcm_info = TC_H_MAKE(prio<<16, protocol); + ++ if (chain_index_set) ++ addattr32(&req.n, sizeof(req), TCA_CHAIN, chain_index); ++ + if (k[0]) + addattr_l(&req.n, sizeof(req), TCA_KIND, k, strlen(k)+1); + +@@ -167,6 +179,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + return -1; + } + } ++ + if (est.ewma_log) + addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est)); + +@@ -193,6 +206,8 @@ static __u32 filter_parent; + static int filter_ifindex; + static __u32 filter_prio; + static __u32 filter_protocol; ++static __u32 filter_chain_index; ++static int filter_chain_index_set; + __u16 f_proto; + + int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) +@@ -270,6 +285,15 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) + } + } + fprintf(fp, "%s ", rta_getattr_str(tb[TCA_KIND])); ++ ++ if (tb[TCA_CHAIN]) { ++ __u32 chain_index = rta_getattr_u32(tb[TCA_CHAIN]); ++ ++ if (!filter_chain_index_set || ++ filter_chain_index != chain_index) ++ fprintf(fp, "chain %u ", chain_index); ++ } ++ + q = get_filter_kind(RTA_DATA(tb[TCA_KIND])); + if (tb[TCA_OPTIONS]) { + if (q) +@@ -312,6 +336,8 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + __u32 prio = 0; + __u32 protocol = 0; + int protocol_set = 0; ++ __u32 chain_index; ++ int chain_index_set = 0; + __u32 parent_handle = 0; + char *fhandle = NULL; + char d[16] = {}; +@@ -376,6 +402,13 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + invarg("invalid protocol", *argv); + protocol = id; + protocol_set = 1; ++ } else if (matches(*argv, "chain") == 0) { ++ NEXT_ARG(); ++ if (chain_index_set) ++ duparg("chain", *argv); ++ if (get_u32(&chain_index, *argv, 0)) ++ invarg("invalid chain index value", *argv); ++ chain_index_set = 1; + } else if (matches(*argv, "help") == 0) { + usage(); + return 0; +@@ -405,6 +438,9 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + + req.t.tcm_info = TC_H_MAKE(prio<<16, protocol); + ++ if (chain_index_set) ++ addattr32(&req.n, sizeof(req), TCA_CHAIN, chain_index); ++ + if (req.t.tcm_parent == TC_H_UNSPEC) { + fprintf(stderr, "Must specify filter parent\n"); + return -1; +@@ -462,10 +498,20 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + + static int tc_filter_list(int argc, char **argv) + { +- struct tcmsg t = { .tcm_family = AF_UNSPEC }; ++ struct { ++ struct nlmsghdr n; ++ struct tcmsg t; ++ char buf[MAX_MSG]; ++ } req = { ++ .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)), ++ .n.nlmsg_type = RTM_GETTFILTER, ++ .t.tcm_parent = TC_H_UNSPEC, ++ .t.tcm_family = AF_UNSPEC, ++ }; + char d[16] = {}; + __u32 prio = 0; + __u32 protocol = 0; ++ __u32 chain_index; + char *fhandle = NULL; + + while (argc > 0) { +@@ -475,39 +521,39 @@ static int tc_filter_list(int argc, char **argv) + duparg("dev", *argv); + strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "root") == 0) { +- if (t.tcm_parent) { ++ if (req.t.tcm_parent) { + fprintf(stderr, + "Error: \"root\" is duplicate parent ID\n"); + return -1; + } +- filter_parent = t.tcm_parent = TC_H_ROOT; ++ filter_parent = req.t.tcm_parent = TC_H_ROOT; + } else if (strcmp(*argv, "ingress") == 0) { +- if (t.tcm_parent) { ++ if (req.t.tcm_parent) { + fprintf(stderr, + "Error: \"ingress\" is duplicate parent ID\n"); + return -1; + } + filter_parent = TC_H_MAKE(TC_H_CLSACT, + TC_H_MIN_INGRESS); +- t.tcm_parent = filter_parent; ++ req.t.tcm_parent = filter_parent; + } else if (strcmp(*argv, "egress") == 0) { +- if (t.tcm_parent) { ++ if (req.t.tcm_parent) { + fprintf(stderr, + "Error: \"egress\" is duplicate parent ID\n"); + return -1; + } + filter_parent = TC_H_MAKE(TC_H_CLSACT, + TC_H_MIN_EGRESS); +- t.tcm_parent = filter_parent; ++ req.t.tcm_parent = filter_parent; + } else if (strcmp(*argv, "parent") == 0) { + __u32 handle; + + NEXT_ARG(); +- if (t.tcm_parent) ++ if (req.t.tcm_parent) + duparg("parent", *argv); + if (get_tc_classid(&handle, *argv)) + invarg("invalid parent ID", *argv); +- filter_parent = t.tcm_parent = handle; ++ filter_parent = req.t.tcm_parent = handle; + } else if (strcmp(*argv, "handle") == 0) { + NEXT_ARG(); + if (fhandle) +@@ -531,6 +577,14 @@ static int tc_filter_list(int argc, char **argv) + invarg("invalid protocol", *argv); + protocol = res; + filter_protocol = protocol; ++ } else if (matches(*argv, "chain") == 0) { ++ NEXT_ARG(); ++ if (filter_chain_index_set) ++ duparg("chain", *argv); ++ if (get_u32(&chain_index, *argv, 0)) ++ invarg("invalid chain index value", *argv); ++ filter_chain_index_set = 1; ++ filter_chain_index = chain_index; + } else if (matches(*argv, "help") == 0) { + usage(); + } else { +@@ -543,20 +597,23 @@ static int tc_filter_list(int argc, char **argv) + argc--; argv++; + } + +- t.tcm_info = TC_H_MAKE(prio<<16, protocol); ++ req.t.tcm_info = TC_H_MAKE(prio<<16, protocol); + + ll_init_map(&rth); + + if (d[0]) { +- t.tcm_ifindex = ll_name_to_index(d); +- if (t.tcm_ifindex == 0) { ++ req.t.tcm_ifindex = ll_name_to_index(d); ++ if (req.t.tcm_ifindex == 0) { + fprintf(stderr, "Cannot find device \"%s\"\n", d); + return 1; + } +- filter_ifindex = t.tcm_ifindex; ++ filter_ifindex = req.t.tcm_ifindex; + } + +- if (rtnl_dump_request(&rth, RTM_GETTFILTER, &t, sizeof(t)) < 0) { ++ if (filter_chain_index_set) ++ addattr32(&req.n, sizeof(req), TCA_CHAIN, chain_index); ++ ++ if (rtnl_dump_request_n(&rth, &req.n) < 0) { + perror("Cannot send dump request"); + return 1; + } +-- +2.20.1 + diff --git a/SOURCES/0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch b/SOURCES/0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch new file mode 100644 index 0000000..7d1a3b4 --- /dev/null +++ b/SOURCES/0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch @@ -0,0 +1,772 @@ +From 23f1822fa8129326de4709d643f41cf26b6bae88 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:09:39 +0200 +Subject: [PATCH] tc: actions: add helpers to parse and print control actions + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit e67aba5595811 +Conflicts: context change due to out-of-order cherry-pick of + commit 73aa988868e7e ("tc/m_gact: Drop dead code") + +commit e67aba559581143f9bc34f0706b0c3feeeab08fa +Author: Jiri Pirko +Date: Tue May 16 19:29:36 2017 +0200 + + tc: actions: add helpers to parse and print control actions + + Each tc action is terminated by a control action. Each action parses and + prints then intividually. Introduce set of helpers and allow to share + this code. + + Signed-off-by: Jiri Pirko +--- + tc/m_bpf.c | 8 +-- + tc/m_connmark.c | 4 +- + tc/m_csum.c | 9 ++- + tc/m_gact.c | 45 ++++----------- + tc/m_ife.c | 10 ++-- + tc/m_mirred.c | 10 ++-- + tc/m_nat.c | 11 ++-- + tc/m_pedit.c | 8 +-- + tc/m_police.c | 50 +++++------------ + tc/m_sample.c | 4 +- + tc/m_simple.c | 3 - + tc/m_skbedit.c | 7 +-- + tc/m_skbmod.c | 30 +--------- + tc/m_tunnel_key.c | 8 +-- + tc/m_vlan.c | 9 ++- + tc/tc_util.c | 137 +++++++++++++++++++++++++++++++++++++++++++++- + tc/tc_util.h | 11 +++- + 17 files changed, 209 insertions(+), 155 deletions(-) + +diff --git a/tc/m_bpf.c b/tc/m_bpf.c +index 1ddc334f2f21b..57283030a35f5 100644 +--- a/tc/m_bpf.c ++++ b/tc/m_bpf.c +@@ -75,7 +75,7 @@ static int bpf_parse_opt(struct action_util *a, int *ptr_argc, char ***ptr_argv, + int tca_id, struct nlmsghdr *n) + { + const char *bpf_obj = NULL, *bpf_uds_name = NULL; +- struct tc_act_bpf parm = { .action = TC_ACT_PIPE }; ++ struct tc_act_bpf parm = {}; + struct bpf_cfg_in cfg = {}; + bool seen_run = false; + struct rtattr *tail; +@@ -123,8 +123,8 @@ opt_bpf: + NEXT_ARG_FWD(); + } + +- if (argc && !action_a2n(*argv, &parm.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &parm.action, ++ false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -186,7 +186,7 @@ static int bpf_print_opt(struct action_util *au, FILE *f, struct rtattr *arg) + b, sizeof(b))); + } + +- fprintf(f, "default-action %s\n", action_n2a(parm->action)); ++ print_action_control(f, "default-action ", parm->action, "\n"); + fprintf(f, "\tindex %u ref %d bind %d", parm->index, parm->refcnt, + parm->bindcnt); + +diff --git a/tc/m_connmark.c b/tc/m_connmark.c +index 295f90d52eefd..3c2274bc0d2af 100644 +--- a/tc/m_connmark.c ++++ b/tc/m_connmark.c +@@ -80,9 +80,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + } + } + +- sel.action = TC_ACT_PIPE; +- if (argc && !action_a2n(*argv, &sel.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_csum.c b/tc/m_csum.c +index 0ee8cad3fbe4c..7b156734f64c5 100644 +--- a/tc/m_csum.c ++++ b/tc/m_csum.c +@@ -123,8 +123,7 @@ parse_csum(struct action_util *a, int *argc_p, + return -1; + } + +- if (argc && !action_a2n(*argv, &sel.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -200,10 +199,10 @@ print_csum(struct action_util *au, FILE *f, struct rtattr *arg) + uflag_1 = "?empty"; + } + +- fprintf(f, "csum (%s%s%s%s%s%s%s) action %s\n", ++ fprintf(f, "csum (%s%s%s%s%s%s%s) ", + uflag_1, uflag_2, uflag_3, +- uflag_4, uflag_5, uflag_6, uflag_7, +- action_n2a(sel->action)); ++ uflag_4, uflag_5, uflag_6, uflag_7); ++ print_action_control(f, "action ", sel->action, "\n"); + fprintf(f, "\tindex %u ref %d bind %d", sel->index, sel->refcnt, + sel->bindcnt); + +diff --git a/tc/m_gact.c b/tc/m_gact.c +index 0cb5222fd3817..bc3860bbe4441 100644 +--- a/tc/m_gact.c ++++ b/tc/m_gact.c +@@ -68,26 +68,13 @@ usage(void) + exit(-1); + } + +-static int +-get_act(char ***argv_p) +-{ +- int n; +- +- if (action_a2n(**argv_p, &n, false)) { +- fprintf(stderr, "bad action type %s\n", **argv_p); +- return -10; +- } +- return n; +-} +- + static int + parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + int tca_id, struct nlmsghdr *n) + { + int argc = *argc_p; + char **argv = *argv_p; +- int action = TC_POLICE_RECLASSIFY; +- struct tc_gact p = { .action = TC_POLICE_RECLASSIFY }; ++ struct tc_gact p = { 0 }; + #ifdef CONFIG_GACT_PROB + int rd = 0; + struct tc_gact_p pp; +@@ -101,16 +88,8 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + if (matches(*argv, "gact") == 0) { + argc--; + argv++; +- } else { +- action = get_act(&argv); +- if (action != -10) { +- p.action = action; +- argc--; +- argv++; +- } else { +- explain(); +- return action; +- } ++ } else if (parse_action_control(&argc, &argv, &p.action, false) == -1) { ++ usage(); + } + + #ifdef CONFIG_GACT_PROB +@@ -129,13 +108,9 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + return -1; + } + +- action = get_act(&argv); +- if (action != -10) { /* FIXME */ +- pp.paction = action; +- } else { +- explain(); +- return -1; +- } ++ if (parse_action_control(&argc, &argv, ++ &pp.paction, false) == -1) ++ usage(); + argc--; + argv++; + if (get_u16(&pp.pval, *argv, 10)) { +@@ -204,7 +179,8 @@ print_gact(struct action_util *au, FILE * f, struct rtattr *arg) + } + p = RTA_DATA(tb[TCA_GACT_PARMS]); + +- fprintf(f, "gact action %s", action_n2a(p->action)); ++ fprintf(f, "gact "); ++ print_action_control(f, "action ", p->action, ""); + #ifdef CONFIG_GACT_PROB + if (tb[TCA_GACT_PROB] != NULL) { + pp = RTA_DATA(tb[TCA_GACT_PROB]); +@@ -213,8 +189,9 @@ print_gact(struct action_util *au, FILE * f, struct rtattr *arg) + memset(&pp_dummy, 0, sizeof(pp_dummy)); + pp = &pp_dummy; + } +- fprintf(f, "\n\t random type %s %s val %d", +- prob_n2a(pp->ptype), action_n2a(pp->paction), pp->pval); ++ fprintf(f, "\n\t random type %s", prob_n2a(pp->ptype)); ++ print_action_control(f, " ", pp->paction, " "); ++ fprintf(f, "val %d", pp->pval); + #endif + fprintf(f, "\n\t index %u ref %d bind %d", p->index, p->refcnt, + p->bindcnt); +diff --git a/tc/m_ife.c b/tc/m_ife.c +index f6131b1332324..e3521e62c178c 100644 +--- a/tc/m_ife.c ++++ b/tc/m_ife.c +@@ -57,7 +57,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p, + int argc = *argc_p; + char **argv = *argv_p; + int ok = 0; +- struct tc_ife p = { .action = TC_ACT_PIPE }; /* good default */ ++ struct tc_ife p = { 0 }; + struct rtattr *tail; + struct rtattr *tail2; + char dbuf[ETH_ALEN]; +@@ -156,8 +156,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p, + argv++; + } + +- if (argc && !action_a2n(*argv, &p.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -245,9 +244,8 @@ static int print_ife(struct action_util *au, FILE *f, struct rtattr *arg) + } + p = RTA_DATA(tb[TCA_IFE_PARMS]); + +- fprintf(f, "ife %s action %s ", +- (p->flags & IFE_ENCODE) ? "encode" : "decode", +- action_n2a(p->action)); ++ fprintf(f, "ife %s ", p->flags & IFE_ENCODE ? "encode" : "decode"); ++ print_action_control(f, "action ", p->action, " "); + + if (tb[TCA_IFE_TYPE]) { + ife_type = rta_getattr_u16(tb[TCA_IFE_TYPE]); +diff --git a/tc/m_mirred.c b/tc/m_mirred.c +index e9438904fdf50..2384bda1ff045 100644 +--- a/tc/m_mirred.c ++++ b/tc/m_mirred.c +@@ -170,10 +170,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, + } + + +- if (argc && +- (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) +- && !action_a2n(*argv, &p.action, false)) +- NEXT_ARG(); ++ if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) ++ parse_action_control(&argc, &argv, &p.action, false); + + if (argc) { + if (iok && matches(*argv, "index") == 0) { +@@ -272,8 +270,8 @@ print_mirred(struct action_util *au, FILE * f, struct rtattr *arg) + return -1; + } + +- fprintf(f, "mirred (%s to device %s) %s", +- mirred_n2a(p->eaction), dev, action_n2a(p->action)); ++ fprintf(f, "mirred (%s to device %s)", mirred_n2a(p->eaction), dev); ++ print_action_control(f, " ", p->action, ""); + + fprintf(f, "\n "); + fprintf(f, "\tindex %u ref %d bind %d", p->index, p->refcnt, +diff --git a/tc/m_nat.c b/tc/m_nat.c +index 525f185e2c082..31b68fb6bd784 100644 +--- a/tc/m_nat.c ++++ b/tc/m_nat.c +@@ -115,8 +115,7 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct + return -1; + } + +- if (argc && !action_a2n(*argv, &sel.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -164,12 +163,12 @@ print_nat(struct action_util *au, FILE * f, struct rtattr *arg) + len = ffs(sel->mask); + len = len ? 33 - len : 0; + +- fprintf(f, " nat %s %s/%d %s %s", sel->flags & TCA_NAT_FLAG_EGRESS ? +- "egress" : "ingress", ++ fprintf(f, " nat %s %s/%d %s", sel->flags & TCA_NAT_FLAG_EGRESS ? ++ "egress" : "ingress", + format_host_r(AF_INET, 4, &sel->old_addr, buf1, sizeof(buf1)), + len, +- format_host_r(AF_INET, 4, &sel->new_addr, buf2, sizeof(buf2)), +- action_n2a(sel->action)); ++ format_host_r(AF_INET, 4, &sel->new_addr, buf2, sizeof(buf2))); ++ print_action_control(f, " ", sel->action, ""); + + if (show_stats) { + if (tb[TCA_NAT_TM]) { +diff --git a/tc/m_pedit.c b/tc/m_pedit.c +index dfa6b2c4835e9..b7d26b4540beb 100644 +--- a/tc/m_pedit.c ++++ b/tc/m_pedit.c +@@ -670,8 +670,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + return -1; + } + +- if (argc && !action_a2n(*argv, &sel.sel.action, false)) +- NEXT_ARG(); ++ parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -776,8 +775,9 @@ int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg) + } + } + +- fprintf(f, " pedit action %s keys %d\n ", +- action_n2a(sel->action), sel->nkeys); ++ fprintf(f, " pedit "); ++ print_action_control(f, "action ", sel->action, " "); ++ fprintf(f,"keys %d\n ", sel->nkeys); + fprintf(f, "\t index %u ref %d bind %d", sel->index, sel->refcnt, + sel->bindcnt); + +diff --git a/tc/m_police.c b/tc/m_police.c +index 226e20e4e8005..2b73969de5daf 100644 +--- a/tc/m_police.c ++++ b/tc/m_police.c +@@ -50,27 +50,6 @@ static void explain1(char *arg) + fprintf(stderr, "Illegal \"%s\"\n", arg); + } + +-static int get_police_result(int *action, int *result, char *arg) +-{ +- char *p = strchr(arg, '/'); +- +- if (p) +- *p = 0; +- +- if (action_a2n(arg, action, true)) { +- if (p) +- *p = '/'; +- return -1; +- } +- +- if (p) { +- *p = '/'; +- if (action_a2n(p+1, result, true)) +- return -1; +- } +- return 0; +-} +- + int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, + int tca_id, struct nlmsghdr *n) + { +@@ -166,23 +145,19 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, + explain1("peakrate"); + return -1; + } +- } else if (matches(*argv, "reclassify") == 0) { +- p.action = TC_POLICE_RECLASSIFY; +- } else if (matches(*argv, "drop") == 0 || +- matches(*argv, "shot") == 0) { +- p.action = TC_POLICE_SHOT; +- } else if (matches(*argv, "continue") == 0) { +- p.action = TC_POLICE_UNSPEC; +- } else if (matches(*argv, "pass") == 0) { +- p.action = TC_POLICE_OK; +- } else if (matches(*argv, "pipe") == 0) { +- p.action = TC_POLICE_PIPE; ++ } else if (matches(*argv, "reclassify") == 0 || ++ matches(*argv, "drop") == 0 || ++ matches(*argv, "shot") == 0 || ++ matches(*argv, "continue") == 0 || ++ matches(*argv, "pass") == 0 || ++ matches(*argv, "pipe") == 0) { ++ if (parse_action_control(&argc, &argv, &p.action, false)) ++ return -1; + } else if (strcmp(*argv, "conform-exceed") == 0) { + NEXT_ARG(); +- if (get_police_result(&p.action, &presult, *argv)) { +- fprintf(stderr, "Illegal \"action\"\n"); ++ if (parse_action_control_slash(&argc, &argv, &p.action, ++ &presult, true)) + return -1; +- } + } else if (matches(*argv, "overhead") == 0) { + NEXT_ARG(); + if (get_u16(&overhead, *argv, 10)) { +@@ -318,12 +293,13 @@ int print_police(struct action_util *a, FILE *f, struct rtattr *arg) + fprintf(f, "avrate %s ", + sprint_rate(rta_getattr_u32(tb[TCA_POLICE_AVRATE]), + b1)); +- fprintf(f, "action %s", action_n2a(p->action)); ++ ++ print_action_control(f, "action ", p->action, ""); + + if (tb[TCA_POLICE_RESULT]) { + __u32 action = rta_getattr_u32(tb[TCA_POLICE_RESULT]); + +- fprintf(f, "/%s ", action_n2a(action)); ++ print_action_control(f, "/", action, " "); + } else + fprintf(f, " "); + +diff --git a/tc/m_sample.c b/tc/m_sample.c +index 9291109071a89..ff5ee6bd1ef63 100644 +--- a/tc/m_sample.c ++++ b/tc/m_sample.c +@@ -98,9 +98,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p, + NEXT_ARG_FWD(); + } + +- p.action = TC_ACT_PIPE; +- if (argc && !action_a2n(*argv, &p.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_simple.c b/tc/m_simple.c +index 65e48addf161b..f8937bcabb7ae 100644 +--- a/tc/m_simple.c ++++ b/tc/m_simple.c +@@ -120,9 +120,6 @@ parse_simple(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + } + } + +- if (argc && !action_a2n(*argv, &sel.action, false)) +- NEXT_ARG_FWD(); +- + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c +index 638715f679d37..aa374fcb33ed9 100644 +--- a/tc/m_skbedit.c ++++ b/tc/m_skbedit.c +@@ -120,9 +120,8 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + argv++; + } + +- sel.action = TC_ACT_PIPE; +- if (argc && !action_a2n(*argv, &sel.action, false)) +- NEXT_ARG(); ++ parse_action_control_dflt(&argc, &argv, &sel.action, ++ false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -214,7 +213,7 @@ static int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg) + fprintf(f, " ptype %d", *ptype); + } + +- fprintf(f, " %s", action_n2a(p->action)); ++ print_action_control(f, " ", p->action, ""); + + fprintf(f, "\n\t index %u ref %d bind %d", + p->index, p->refcnt, p->bindcnt); +diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c +index acb7771d2901b..1ccd474309348 100644 +--- a/tc/m_skbmod.c ++++ b/tc/m_skbmod.c +@@ -61,7 +61,6 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p, + char *saddr = NULL; + + memset(&p, 0, sizeof(p)); +- p.action = TC_ACT_PIPE; /* good default */ + + if (argc <= 0) + return -1; +@@ -123,31 +122,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p, + argv++; + } + +- if (argc) { +- if (matches(*argv, "reclassify") == 0) { +- p.action = TC_ACT_RECLASSIFY; +- argc--; +- argv++; +- } else if (matches(*argv, "pipe") == 0) { +- p.action = TC_ACT_PIPE; +- argc--; +- argv++; +- } else if (matches(*argv, "drop") == 0 || +- matches(*argv, "shot") == 0) { +- p.action = TC_ACT_SHOT; +- argc--; +- argv++; +- } else if (matches(*argv, "continue") == 0) { +- p.action = TC_ACT_UNSPEC; +- argc--; +- argv++; +- } else if (matches(*argv, "pass") == 0 || +- matches(*argv, "ok") == 0) { +- p.action = TC_ACT_OK; +- argc--; +- argv++; +- } +- } ++ parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -206,7 +181,8 @@ static int print_skbmod(struct action_util *au, FILE *f, struct rtattr *arg) + + p = RTA_DATA(tb[TCA_SKBMOD_PARMS]); + +- fprintf(f, "skbmod action %s ", action_n2a(p->action)); ++ fprintf(f, "skbmod "); ++ print_action_control(f, "", p->action, " "); + + if (tb[TCA_SKBMOD_ETYPE]) { + skbmod_etype = rta_getattr_u16(tb[TCA_SKBMOD_ETYPE]); +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index 60fd1c464e531..cdde64a15b929 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -99,7 +99,7 @@ static int tunnel_key_parse_tos_ttl(char *str, int type, struct nlmsghdr *n) + static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + int tca_id, struct nlmsghdr *n) + { +- struct tc_tunnel_key parm = { .action = TC_ACT_PIPE }; ++ struct tc_tunnel_key parm = {}; + char **argv = *argv_p; + int argc = *argc_p; + struct rtattr *tail; +@@ -194,8 +194,8 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + NEXT_ARG_FWD(); + } + +- if (argc && !action_a2n(*argv, &parm.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &parm.action, ++ false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -318,7 +318,7 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg) + tb[TCA_TUNNEL_KEY_ENC_TTL]); + break; + } +- fprintf(f, " %s", action_n2a(parm->action)); ++ print_action_control(f, " ", parm->action, ""); + + fprintf(f, "\n\tindex %d ref %d bind %d", parm->index, parm->refcnt, + parm->bindcnt); +diff --git a/tc/m_vlan.c b/tc/m_vlan.c +index 44b9375966da3..2441b06847ecd 100644 +--- a/tc/m_vlan.c ++++ b/tc/m_vlan.c +@@ -59,7 +59,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p, + int proto_set = 0; + __u8 prio; + int prio_set = 0; +- struct tc_vlan parm = { 0 }; ++ struct tc_vlan parm = {}; + + if (matches(*argv, "vlan") != 0) + return -1; +@@ -133,9 +133,8 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p, + argv++; + } + +- parm.action = TC_ACT_PIPE; +- if (argc && !action_a2n(*argv, &parm.action, false)) +- NEXT_ARG_FWD(); ++ parse_action_control_dflt(&argc, &argv, &parm.action, ++ false, TC_ACT_PIPE); + + if (argc) { + if (matches(*argv, "index") == 0) { +@@ -224,7 +223,7 @@ static int print_vlan(struct action_util *au, FILE *f, struct rtattr *arg) + } + break; + } +- fprintf(f, " %s", action_n2a(parm->action)); ++ print_action_control(f, " ", parm->action, ""); + + fprintf(f, "\n\t index %u ref %d bind %d", parm->index, parm->refcnt, + parm->bindcnt); +diff --git a/tc/tc_util.c b/tc/tc_util.c +index 296825ae174e0..840222832690b 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -411,7 +411,7 @@ char *sprint_qdisc_handle(__u32 h, char *buf) + return buf; + } + +-const char *action_n2a(int action) ++static const char *action_n2a(int action) + { + static char buf[64]; + +@@ -443,7 +443,7 @@ const char *action_n2a(int action) + * + * In error case, returns -1 and does not touch @result. Otherwise returns 0. + */ +-int action_a2n(char *arg, int *result, bool allow_num) ++static int action_a2n(char *arg, int *result, bool allow_num) + { + int n; + char dummy; +@@ -474,6 +474,139 @@ int action_a2n(char *arg, int *result, bool allow_num) + return 0; + } + ++/* Parse action control including possible options. ++ * ++ * Parameters: ++ * @argc_p - pointer to argc to parse ++ * @argv_p - pointer to argv to parse ++ * @result_p - pointer to output variable ++ * @allow_num - whether action may be in numeric format already ++ * ++ * In error case, returns -1 and does not touch @result_1p. Otherwise returns 0. ++ */ ++int parse_action_control(int *argc_p, char ***argv_p, ++ int *result_p, bool allow_num) ++{ ++ int argc = *argc_p; ++ char **argv = *argv_p; ++ int result; ++ ++ if (!argc) ++ return -1; ++ if (action_a2n(*argv, &result, allow_num) == -1) { ++ fprintf(stderr, "Bad action type %s\n", *argv); ++ return -1; ++ } ++ NEXT_ARG_FWD(); ++ *argc_p = argc; ++ *argv_p = argv; ++ *result_p = result; ++ return 0; ++} ++ ++/* Parse action control including possible options. ++ * ++ * Parameters: ++ * @argc_p - pointer to argc to parse ++ * @argv_p - pointer to argv to parse ++ * @result_p - pointer to output variable ++ * @allow_num - whether action may be in numeric format already ++ * @default_result - set as a result in case of parsing error ++ * ++ * In case there is an error during parsing, the default result is used. ++ */ ++void parse_action_control_dflt(int *argc_p, char ***argv_p, ++ int *result_p, bool allow_num, ++ int default_result) ++{ ++ if (parse_action_control(argc_p, argv_p, result_p, allow_num)) ++ *result_p = default_result; ++} ++ ++static int parse_action_control_slash_spaces(int *argc_p, char ***argv_p, ++ int *result1_p, int *result2_p, ++ bool allow_num) ++{ ++ int argc = *argc_p; ++ char **argv = *argv_p; ++ int result1, result2; ++ int *result_p = &result1; ++ int ok = 0; ++ int ret; ++ ++ while (argc > 0) { ++ switch (ok) { ++ case 1: ++ if (strcmp(*argv, "/") != 0) ++ goto out; ++ result_p = &result2; ++ NEXT_ARG(); ++ /* fall-through */ ++ case 0: /* fall-through */ ++ case 2: ++ ret = parse_action_control(&argc, &argv, ++ result_p, allow_num); ++ if (ret) ++ return ret; ++ ok++; ++ break; ++ default: ++ goto out; ++ } ++ } ++out: ++ *result1_p = result1; ++ if (ok == 2) ++ *result2_p = result2; ++ *argc_p = argc; ++ *argv_p = argv; ++ return 0; ++} ++ ++/* Parse action control with slash including possible options. ++ * ++ * Parameters: ++ * @argc_p - pointer to argc to parse ++ * @argv_p - pointer to argv to parse ++ * @result1_p - pointer to the first (before slash) output variable ++ * @result2_p - pointer to the second (after slash) output variable ++ * @allow_num - whether action may be in numeric format already ++ * ++ * In error case, returns -1 and does not touch @result*. Otherwise returns 0. ++ */ ++int parse_action_control_slash(int *argc_p, char ***argv_p, ++ int *result1_p, int *result2_p, bool allow_num) ++{ ++ char **argv = *argv_p; ++ int result1, result2; ++ char *p = strchr(*argv, '/'); ++ ++ if (!p) ++ return parse_action_control_slash_spaces(argc_p, argv_p, ++ result1_p, result2_p, ++ allow_num); ++ *p = 0; ++ if (action_a2n(*argv, &result1, allow_num)) { ++ if (p) ++ *p = '/'; ++ return -1; ++ } ++ ++ *p = '/'; ++ if (action_a2n(p + 1, &result2, allow_num)) ++ return -1; ++ ++ *result1_p = result1; ++ *result2_p = result2; ++ return 0; ++} ++ ++void print_action_control(FILE *f, const char *prefix, ++ int action, const char *suffix) ++{ ++ fprintf(f, "%s%s%s", prefix, action_n2a(action), suffix); ++} ++ + int get_linklayer(unsigned int *val, const char *arg) + { + int res; +diff --git a/tc/tc_util.h b/tc/tc_util.h +index 4db26c6d5e25b..5c54ad384eae6 100644 +--- a/tc/tc_util.h ++++ b/tc/tc_util.h +@@ -100,8 +100,15 @@ char *sprint_tc_classid(__u32 h, char *buf); + int tc_print_police(FILE *f, struct rtattr *tb); + int parse_police(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n); + +-const char *action_n2a(int action); +-int action_a2n(char *arg, int *result, bool allow_num); ++int parse_action_control(int *argc_p, char ***argv_p, ++ int *result_p, bool allow_num); ++void parse_action_control_dflt(int *argc_p, char ***argv_p, ++ int *result_p, bool allow_num, ++ int default_result); ++int parse_action_control_slash(int *argc_p, char ***argv_p, ++ int *result1_p, int *result2_p, bool allow_num); ++void print_action_control(FILE *f, const char *prefix, ++ int action, const char *suffix); + int act_parse_police(struct action_util *a, int *argc_p, + char ***argv_p, int tca_id, struct nlmsghdr *n); + int print_police(struct action_util *a, FILE *f, struct rtattr *tb); +-- +2.20.1 + diff --git a/SOURCES/0133-tc-actions-introduce-support-for-goto-chain-action.patch b/SOURCES/0133-tc-actions-introduce-support-for-goto-chain-action.patch new file mode 100644 index 0000000..bd60875 --- /dev/null +++ b/SOURCES/0133-tc-actions-introduce-support-for-goto-chain-action.patch @@ -0,0 +1,247 @@ +From eaccce1b85efafbea1607ff88d7259541f311ee2 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:10:31 +0200 +Subject: [PATCH] tc/actions: introduce support for goto chain action + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit d19f72f7898a7 + +commit d19f72f7898a78ef76628833c204afb96f9a05cd +Author: Jiri Pirko +Date: Tue May 16 19:29:37 2017 +0200 + + tc/actions: introduce support for goto chain action + + Allow user to set control action "goto" with filter chain index as + a parameter. + + Signed-off-by: Jiri Pirko +--- + man/man8/tc-ife.8 | 2 +- + man/man8/tc-pedit.8 | 2 +- + man/man8/tc-police.8 | 2 +- + man/man8/tc-vlan.8 | 2 +- + tc/m_connmark.c | 3 ++- + tc/m_gact.c | 6 ++++-- + tc/m_pedit.c | 3 ++- + tc/m_police.c | 6 ++++-- + tc/m_skbmod.c | 3 ++- + tc/m_vlan.c | 3 ++- + tc/tc_util.c | 24 +++++++++++++++++++++++- + 11 files changed, 43 insertions(+), 13 deletions(-) + +diff --git a/man/man8/tc-ife.8 b/man/man8/tc-ife.8 +index a8f1f287d1502..24595cc6d615c 100644 +--- a/man/man8/tc-ife.8 ++++ b/man/man8/tc-ife.8 +@@ -34,7 +34,7 @@ IFE - encapsulate/decapsulate metadata + + .ti -8 + .IR CONTROL " := { " +-.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " }" ++.BR reclassify " | " use " | " pipe " | " drop " | " continue " | " ok " | " goto " " chain " " CHAIN_INDEX " }" + .SH DESCRIPTION + The + .B ife +diff --git a/man/man8/tc-pedit.8 b/man/man8/tc-pedit.8 +index 82d4217bc9589..bbd725c4d0ba1 100644 +--- a/man/man8/tc-pedit.8 ++++ b/man/man8/tc-pedit.8 +@@ -82,7 +82,7 @@ pedit - generic packet editor action + + .ti -8 + .IR CONTROL " := {" +-.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " }" ++.BR reclassify " | " pipe " | " drop " | " shot " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }" + .SH DESCRIPTION + The + .B pedit +diff --git a/man/man8/tc-police.8 b/man/man8/tc-police.8 +index 620c28813fc7e..bcc5f438825d1 100644 +--- a/man/man8/tc-police.8 ++++ b/man/man8/tc-police.8 +@@ -30,7 +30,7 @@ police - policing action + + .ti -8 + .IR EXCEEDACT/NOTEXCEEDACT " := { " +-.BR pipe " | " ok " | " reclassify " | " drop " | " continue " }" ++.BR pipe " | " ok " | " reclassify " | " drop " | " continue " | " goto " " chain " " CHAIN_INDEX " }" + .SH DESCRIPTION + The + .B police +diff --git a/man/man8/tc-vlan.8 b/man/man8/tc-vlan.8 +index a526f66b60b4c..f5ffc25f054ed 100644 +--- a/man/man8/tc-vlan.8 ++++ b/man/man8/tc-vlan.8 +@@ -26,7 +26,7 @@ vlan - vlan manipulation module + + .ti -8 + .IR CONTROL " := { " +-.BR reclassify " | " pipe " | " drop " | " continue " | " pass " }" ++.BR reclassify " | " pipe " | " drop " | " continue " | " pass " | " goto " " chain " " CHAIN_INDEX " }" + .SH DESCRIPTION + The + .B vlan +diff --git a/tc/m_connmark.c b/tc/m_connmark.c +index 3c2274bc0d2af..37d7185415490 100644 +--- a/tc/m_connmark.c ++++ b/tc/m_connmark.c +@@ -30,7 +30,8 @@ explain(void) + fprintf(stderr, "Usage: ... connmark [zone ZONE] [CONTROL] [index ]\n"); + fprintf(stderr, "where :\n" + "\tZONE is the conntrack zone\n" +- "\tCONTROL := reclassify|pipe|drop|continue|ok\n"); ++ "\tCONTROL := reclassify | pipe | drop | continue | ok |\n" ++ "\t goto chain \n"); + } + + static void +diff --git a/tc/m_gact.c b/tc/m_gact.c +index bc3860bbe4441..c04c00bbded3c 100644 +--- a/tc/m_gact.c ++++ b/tc/m_gact.c +@@ -45,7 +45,8 @@ explain(void) + #ifdef CONFIG_GACT_PROB + fprintf(stderr, "Usage: ... gact [RAND] [INDEX]\n"); + fprintf(stderr, +- "Where: \tACTION := reclassify | drop | continue | pass | pipe\n" ++ "Where: \tACTION := reclassify | drop | continue | pass | pipe |\n" ++ " \t goto chain \n" + "\tRAND := random \n" + "\tRANDTYPE := netrand | determ\n" + "\tVAL : = value not exceeding 10000\n" +@@ -54,7 +55,8 @@ explain(void) + #else + fprintf(stderr, "Usage: ... gact [INDEX]\n"); + fprintf(stderr, +- "Where: \tACTION := reclassify | drop | continue | pass | pipe\n" ++ "Where: \tACTION := reclassify | drop | continue | pass | pipe |\n" ++ " \t goto chain \n" + "\tINDEX := index value used\n" + "\n"); + #endif +diff --git a/tc/m_pedit.c b/tc/m_pedit.c +index b7d26b4540beb..5d89ab1d832ab 100644 +--- a/tc/m_pedit.c ++++ b/tc/m_pedit.c +@@ -45,7 +45,8 @@ static void explain(void) + "\t\tCMD:= clear | invert | set | add | retain\n" + "\t:= ip | ip6 \n" + " \t\t| udp | tcp | icmp \n" +- "\tCONTROL:= reclassify | pipe | drop | continue | pass\n" ++ "\tCONTROL:= reclassify | pipe | drop | continue | pass |\n" ++ "\t goto chain \n" + "\tNOTE: if 'ex' is set, extended functionality will be supported (kernel >= 4.11)\n" + "For Example usage look at the examples directory\n"); + +diff --git a/tc/m_police.c b/tc/m_police.c +index 2b73969de5daf..86117db0482ec 100644 +--- a/tc/m_police.c ++++ b/tc/m_police.c +@@ -41,7 +41,8 @@ static void usage(void) + fprintf(stderr, "Where: CONTROL := conform-exceed [/NOTEXCEEDACT]\n"); + fprintf(stderr, " Define how to handle packets which exceed ()\n"); + fprintf(stderr, " or conform () the configured bandwidth limit.\n"); +- fprintf(stderr, " EXCEEDACT/NOTEXCEEDACT := { pipe | ok | reclassify | drop | continue }\n"); ++ fprintf(stderr, " EXCEEDACT/NOTEXCEEDACT := { pipe | ok | reclassify | drop | continue |\n"); ++ fprintf(stderr, " goto chain }\n"); + exit(-1); + } + +@@ -150,7 +151,8 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, + matches(*argv, "shot") == 0 || + matches(*argv, "continue") == 0 || + matches(*argv, "pass") == 0 || +- matches(*argv, "pipe") == 0) { ++ matches(*argv, "pipe") == 0 || ++ matches(*argv, "goto") == 0) { + if (parse_action_control(&argc, &argv, &p.action, false)) + return -1; + } else if (strcmp(*argv, "conform-exceed") == 0) { +diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c +index 1ccd474309348..ba79308ba8354 100644 +--- a/tc/m_skbmod.c ++++ b/tc/m_skbmod.c +@@ -36,7 +36,8 @@ static void skbmod_explain(void) + "\tDMAC := 6 byte Destination MAC address\n" + "\tSMAC := optional 6 byte Source MAC address\n" + "\tETYPE := optional 16 bit ethertype\n" +- "\tCONTROL := reclassify|pipe|drop|continue|ok\n" ++ "\tCONTROL := reclassify | pipe | drop | continue | ok |\n" ++ "\t goto chain \n" + "\tINDEX := skbmod index value to use\n"); + } + +diff --git a/tc/m_vlan.c b/tc/m_vlan.c +index 2441b06847ecd..cccb4996b05f3 100644 +--- a/tc/m_vlan.c ++++ b/tc/m_vlan.c +@@ -32,7 +32,8 @@ static void explain(void) + fprintf(stderr, " vlan modify [ protocol VLANPROTO ] id VLANID [ priority VLANPRIO ] [CONTROL]\n"); + fprintf(stderr, " VLANPROTO is one of 802.1Q or 802.1AD\n"); + fprintf(stderr, " with default: 802.1Q\n"); +- fprintf(stderr, " CONTROL := reclassify | pipe | drop | continue | pass\n"); ++ fprintf(stderr, " CONTROL := reclassify | pipe | drop | continue | pass |\n"); ++ fprintf(stderr, " goto chain \n"); + } + + static void usage(void) +diff --git a/tc/tc_util.c b/tc/tc_util.c +index 840222832690b..194185a0fa1d8 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -415,6 +415,8 @@ static const char *action_n2a(int action) + { + static char buf[64]; + ++ if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN)) ++ return "goto"; + switch (action) { + case TC_ACT_UNSPEC: + return "continue"; +@@ -458,6 +460,7 @@ static int action_a2n(char *arg, int *result, bool allow_num) + {"ok", TC_ACT_OK}, + {"reclassify", TC_ACT_RECLASSIFY}, + {"pipe", TC_ACT_PIPE}, ++ {"goto", TC_ACT_GOTO_CHAIN}, + { NULL }, + }, *iter; + +@@ -497,6 +500,22 @@ int parse_action_control(int *argc_p, char ***argv_p, + fprintf(stderr, "Bad action type %s\n", *argv); + return -1; + } ++ if (result == TC_ACT_GOTO_CHAIN) { ++ __u32 chain_index; ++ ++ NEXT_ARG(); ++ if (matches(*argv, "chain") != 0) { ++ fprintf(stderr, "\"chain index\" expected\n"); ++ return -1; ++ } ++ NEXT_ARG(); ++ if (get_u32(&chain_index, *argv, 10) || ++ chain_index > TC_ACT_EXT_VAL_MASK) { ++ fprintf(stderr, "Illegal \"chain index\"\n"); ++ return -1; ++ } ++ result |= chain_index; ++ } + NEXT_ARG_FWD(); + *argc_p = argc; + *argv_p = argv; +@@ -604,7 +623,10 @@ int parse_action_control_slash(int *argc_p, char ***argv_p, + void print_action_control(FILE *f, const char *prefix, + int action, const char *suffix) + { +- fprintf(f, "%s%s%s", prefix, action_n2a(action), suffix); ++ fprintf(f, "%s%s", prefix, action_n2a(action)); ++ if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN)) ++ fprintf(f, " chain %u", action & TC_ACT_EXT_VAL_MASK); ++ fprintf(f, "%s", suffix); + } + + int get_linklayer(unsigned int *val, const char *arg) +-- +2.20.1 + diff --git a/SOURCES/0134-tc-gact-fix-control-action-parsing.patch b/SOURCES/0134-tc-gact-fix-control-action-parsing.patch new file mode 100644 index 0000000..46e953c --- /dev/null +++ b/SOURCES/0134-tc-gact-fix-control-action-parsing.patch @@ -0,0 +1,41 @@ +From 46ce82dd840a158c8fe80842ac808b1df425e216 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:10:31 +0200 +Subject: [PATCH] tc: gact: fix control action parsing + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 18f05d06016d9 +Conflicts: context change due to out-of-order cherry-pick of + commit 73aa988868e7e ("tc/m_gact: Drop dead code") + +commit 18f05d06016d9492c87fd105d831de0d6d858f43 +Author: Jiri Pirko +Date: Mon Jun 5 16:22:03 2017 +0200 + + tc: gact: fix control action parsing + + parse_action_control helper does advancing of the arg inside. So don't + do it outside. + + Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions") + Signed-off-by: Jiri Pirko +--- + tc/m_gact.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/tc/m_gact.c b/tc/m_gact.c +index c04c00bbded3c..73346d4e9333b 100644 +--- a/tc/m_gact.c ++++ b/tc/m_gact.c +@@ -113,8 +113,6 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + if (parse_action_control(&argc, &argv, + &pp.paction, false) == -1) + usage(); +- argc--; +- argv++; + if (get_u16(&pp.pval, *argv, 10)) { + fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval); + return -1; +-- +2.20.1 + diff --git a/SOURCES/0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch b/SOURCES/0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch new file mode 100644 index 0000000..3d32538 --- /dev/null +++ b/SOURCES/0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch @@ -0,0 +1,97 @@ +From 8efbb8de949eedd4341d075175f932245a9f142c Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:11:03 +0200 +Subject: [PATCH] tc: don't print error message on miss when parsing action + with default + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit c794b7b179026 + +commit c794b7b17902627b19ddc00699d89ea7b6b1edf7 +Author: Jiri Pirko +Date: Thu Jun 15 14:10:51 2017 +0200 + + tc: don't print error message on miss when parsing action with default + + In case default control action parsing takes place, it is ok to miss. + So don't print error message. + + Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions") + Reported-by: Jiri Benc + Signed-off-by: Jiri Pirko + Tested-by: Jiri Benc +--- + tc/tc_util.c | 36 ++++++++++++++++++++++-------------- + 1 file changed, 22 insertions(+), 14 deletions(-) + +diff --git a/tc/tc_util.c b/tc/tc_util.c +index 194185a0fa1d8..cdc23477ada53 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -477,18 +477,8 @@ static int action_a2n(char *arg, int *result, bool allow_num) + return 0; + } + +-/* Parse action control including possible options. +- * +- * Parameters: +- * @argc_p - pointer to argc to parse +- * @argv_p - pointer to argv to parse +- * @result_p - pointer to output variable +- * @allow_num - whether action may be in numeric format already +- * +- * In error case, returns -1 and does not touch @result_1p. Otherwise returns 0. +- */ +-int parse_action_control(int *argc_p, char ***argv_p, +- int *result_p, bool allow_num) ++static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p, ++ bool allow_num, bool ignore_a2n_miss) + { + int argc = *argc_p; + char **argv = *argv_p; +@@ -497,7 +487,8 @@ int parse_action_control(int *argc_p, char ***argv_p, + if (!argc) + return -1; + if (action_a2n(*argv, &result, allow_num) == -1) { +- fprintf(stderr, "Bad action type %s\n", *argv); ++ if (!ignore_a2n_miss) ++ fprintf(stderr, "Bad action type %s\n", *argv); + return -1; + } + if (result == TC_ACT_GOTO_CHAIN) { +@@ -523,6 +514,23 @@ int parse_action_control(int *argc_p, char ***argv_p, + return 0; + } + ++/* Parse action control including possible options. ++ * ++ * Parameters: ++ * @argc_p - pointer to argc to parse ++ * @argv_p - pointer to argv to parse ++ * @result_p - pointer to output variable ++ * @allow_num - whether action may be in numeric format already ++ * ++ * In error case, returns -1 and does not touch @result_1p. Otherwise returns 0. ++ */ ++int parse_action_control(int *argc_p, char ***argv_p, ++ int *result_p, bool allow_num) ++{ ++ return __parse_action_control(argc_p, argv_p, result_p, ++ allow_num, false); ++} ++ + /* Parse action control including possible options. + * + * Parameters: +@@ -538,7 +546,7 @@ void parse_action_control_dflt(int *argc_p, char ***argv_p, + int *result_p, bool allow_num, + int default_result) + { +- if (parse_action_control(argc_p, argv_p, result_p, allow_num)) ++ if (__parse_action_control(argc_p, argv_p, result_p, allow_num, true)) + *result_p = default_result; + } + +-- +2.20.1 + diff --git a/SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch b/SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch new file mode 100644 index 0000000..1b806df --- /dev/null +++ b/SOURCES/0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch @@ -0,0 +1,235 @@ +From 1a12c7c90330410171007ada7513247fda5a1c57 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:11:03 +0200 +Subject: [PATCH] tc: util: Don't call NEXT_ARG_FWD() in + __parse_action_control() + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 3572e01a090a2 +Conflicts: context change mainly due to missing commit 35f2a7639dca4 + ("tc/actions: introduce support for jump action") + +commit 3572e01a090a298e2f4c4f796bad6639b652e031 +Author: Michal Privoznik +Date: Fri Dec 8 11:18:07 2017 +0100 + + tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control() + + Not all callers want parse_action_control*() to advance the + arguments. For instance act_parse_police() does the argument + advancing itself. + + Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions") + Signed-off-by: Michal Privoznik +--- + tc/m_bpf.c | 1 + + tc/m_connmark.c | 1 + + tc/m_csum.c | 1 + + tc/m_gact.c | 12 ++++++------ + tc/m_ife.c | 1 + + tc/m_mirred.c | 4 +++- + tc/m_nat.c | 1 + + tc/m_pedit.c | 1 + + tc/m_sample.c | 1 + + tc/m_skbedit.c | 1 + + tc/m_skbmod.c | 1 + + tc/m_tunnel_key.c | 1 + + tc/m_vlan.c | 1 + + tc/tc_util.c | 1 - + 14 files changed, 20 insertions(+), 8 deletions(-) + +diff --git a/tc/m_bpf.c b/tc/m_bpf.c +index 57283030a35f5..c2bad5640707c 100644 +--- a/tc/m_bpf.c ++++ b/tc/m_bpf.c +@@ -125,6 +125,7 @@ opt_bpf: + + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); ++ NEXT_ARG_FWD(); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_connmark.c b/tc/m_connmark.c +index 37d7185415490..47c7a8c2b17e7 100644 +--- a/tc/m_connmark.c ++++ b/tc/m_connmark.c +@@ -82,6 +82,7 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + } + + parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE); ++ NEXT_ARG_FWD(); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_csum.c b/tc/m_csum.c +index 7b156734f64c5..e1352c0820f69 100644 +--- a/tc/m_csum.c ++++ b/tc/m_csum.c +@@ -124,6 +124,7 @@ parse_csum(struct action_util *a, int *argc_p, + } + + parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK); ++ NEXT_ARG_FWD(); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_gact.c b/tc/m_gact.c +index 73346d4e9333b..dd9542a5cc644 100644 +--- a/tc/m_gact.c ++++ b/tc/m_gact.c +@@ -86,14 +86,13 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + if (argc < 0) + return -1; + +- +- if (matches(*argv, "gact") == 0) { +- argc--; +- argv++; +- } else if (parse_action_control(&argc, &argv, &p.action, false) == -1) { +- usage(); ++ if (matches(*argv, "gact") != 0 && ++ parse_action_control(&argc, &argv, &p.action, false) == -1) { ++ usage(); /* does not return */ + } + ++ NEXT_ARG_FWD(); ++ + #ifdef CONFIG_GACT_PROB + if (argc > 0) { + if (matches(*argv, "random") == 0) { +@@ -113,6 +112,7 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + if (parse_action_control(&argc, &argv, + &pp.paction, false) == -1) + usage(); ++ NEXT_ARG_FWD(); + if (get_u16(&pp.pval, *argv, 10)) { + fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval); + return -1; +diff --git a/tc/m_ife.c b/tc/m_ife.c +index e3521e62c178c..54fad8f70e73a 100644 +--- a/tc/m_ife.c ++++ b/tc/m_ife.c +@@ -158,6 +158,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p, + + parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_mirred.c b/tc/m_mirred.c +index 2384bda1ff045..b09b016c2ca39 100644 +--- a/tc/m_mirred.c ++++ b/tc/m_mirred.c +@@ -170,8 +170,10 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, + } + + +- if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) ++ if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) { + parse_action_control(&argc, &argv, &p.action, false); ++ NEXT_ARG_FWD(); ++ } + + if (argc) { + if (iok && matches(*argv, "index") == 0) { +diff --git a/tc/m_nat.c b/tc/m_nat.c +index 31b68fb6bd784..bb455f080b3a4 100644 +--- a/tc/m_nat.c ++++ b/tc/m_nat.c +@@ -117,6 +117,7 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct + + parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_pedit.c b/tc/m_pedit.c +index 5d89ab1d832ab..3391be95da38c 100644 +--- a/tc/m_pedit.c ++++ b/tc/m_pedit.c +@@ -673,6 +673,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + + parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_sample.c b/tc/m_sample.c +index ff5ee6bd1ef63..31774c0e806b4 100644 +--- a/tc/m_sample.c ++++ b/tc/m_sample.c +@@ -100,6 +100,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p, + + parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c +index aa374fcb33ed9..c41a7bb082dad 100644 +--- a/tc/m_skbedit.c ++++ b/tc/m_skbedit.c +@@ -123,6 +123,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + parse_action_control_dflt(&argc, &argv, &sel.action, + false, TC_ACT_PIPE); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c +index ba79308ba8354..00318d42642a5 100644 +--- a/tc/m_skbmod.c ++++ b/tc/m_skbmod.c +@@ -125,6 +125,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p, + + parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index cdde64a15b929..0ff3f1a2b9876 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -197,6 +197,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_vlan.c b/tc/m_vlan.c +index cccb4996b05f3..0b2966ce82e53 100644 +--- a/tc/m_vlan.c ++++ b/tc/m_vlan.c +@@ -137,6 +137,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p, + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); + ++ NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/tc_util.c b/tc/tc_util.c +index cdc23477ada53..4584d4a448fb4 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -507,7 +507,6 @@ static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p, + } + result |= chain_index; + } +- NEXT_ARG_FWD(); + *argc_p = argc; + *argv_p = argv; + *result_p = result; +-- +2.20.1 + diff --git a/SOURCES/0137-tc-fix-parsing-of-the-control-action.patch b/SOURCES/0137-tc-fix-parsing-of-the-control-action.patch new file mode 100644 index 0000000..78b9286 --- /dev/null +++ b/SOURCES/0137-tc-fix-parsing-of-the-control-action.patch @@ -0,0 +1,321 @@ +From cb73324026eb3f9c315735b9020890f43eeaac43 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:12:06 +0200 +Subject: [PATCH] tc: fix parsing of the control action + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 75ef7b18d2a13 +Conflicts: context change due to missing commit 35f2a7639dca4 + ("tc/actions: introduce support for jump action") + +commit 75ef7b18d2a13657056706895bf8d8dd3ac93e46 +Author: Davide Caratti +Date: Fri Mar 2 19:36:16 2018 +0100 + + tc: fix parsing of the control action + + If the user didn't specify any control action, don't pop the command line + arguments: otherwise, parsing of the next argument (tipically the 'index' + keyword) results in an error, causing the following 'tc-testing' failures: + + Test a6d6: Add skbedit action with index + Test 38f3: Delete skbedit action + Test a568: Add action with ife type + Test b983: Add action without ife type + Test 7d50: Add skbmod action to set destination mac + Test 9b29: Add skbmod action to set source mac + Test e93a: Delete an skbmod action + + Also, add missing parse for 'ok' control action to m_police, to fix the + following 'tc-testing' failure: + + Test 8dd5: Add police action with control ok + + tested with: + # ./tdc.py + + test results: + all tests ok using kernel 4.16-rc2, except 9aa8 "Get a single skbmod + action from a list" (which is failing also before this commit) + + Fixes: 3572e01a090a ("tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control()") + Cc: Michal Privoznik + Cc: Wolfgang Bumiller + Signed-off-by: Davide Caratti + Signed-off-by: Stephen Hemminger +--- + tc/m_bpf.c | 1 - + tc/m_connmark.c | 1 - + tc/m_csum.c | 1 - + tc/m_gact.c | 9 +++------ + tc/m_ife.c | 1 - + tc/m_mirred.c | 5 ++--- + tc/m_nat.c | 1 - + tc/m_pedit.c | 1 - + tc/m_police.c | 16 ++++++++++------ + tc/m_sample.c | 1 - + tc/m_skbedit.c | 1 - + tc/m_skbmod.c | 1 - + tc/m_tunnel_key.c | 1 - + tc/m_vlan.c | 1 - + tc/tc_util.c | 6 +++++- + 15 files changed, 20 insertions(+), 27 deletions(-) + +diff --git a/tc/m_bpf.c b/tc/m_bpf.c +index c2bad5640707c..57283030a35f5 100644 +--- a/tc/m_bpf.c ++++ b/tc/m_bpf.c +@@ -125,7 +125,6 @@ opt_bpf: + + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); +- NEXT_ARG_FWD(); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_connmark.c b/tc/m_connmark.c +index 47c7a8c2b17e7..37d7185415490 100644 +--- a/tc/m_connmark.c ++++ b/tc/m_connmark.c +@@ -82,7 +82,6 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + } + + parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE); +- NEXT_ARG_FWD(); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_csum.c b/tc/m_csum.c +index e1352c0820f69..7b156734f64c5 100644 +--- a/tc/m_csum.c ++++ b/tc/m_csum.c +@@ -124,7 +124,6 @@ parse_csum(struct action_util *a, int *argc_p, + } + + parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK); +- NEXT_ARG_FWD(); + + if (argc) { + if (matches(*argv, "index") == 0) { +diff --git a/tc/m_gact.c b/tc/m_gact.c +index dd9542a5cc644..45eecf7ea1647 100644 +--- a/tc/m_gact.c ++++ b/tc/m_gact.c +@@ -86,12 +86,10 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + if (argc < 0) + return -1; + +- if (matches(*argv, "gact") != 0 && +- parse_action_control(&argc, &argv, &p.action, false) == -1) { ++ if (!matches(*argv, "gact")) ++ NEXT_ARG_FWD(); ++ if (parse_action_control(&argc, &argv, &p.action, false)) + usage(); /* does not return */ +- } +- +- NEXT_ARG_FWD(); + + #ifdef CONFIG_GACT_PROB + if (argc > 0) { +@@ -112,7 +110,6 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p, + if (parse_action_control(&argc, &argv, + &pp.paction, false) == -1) + usage(); +- NEXT_ARG_FWD(); + if (get_u16(&pp.pval, *argv, 10)) { + fprintf(stderr, "Illegal probability val 0x%x\n", pp.pval); + return -1; +diff --git a/tc/m_ife.c b/tc/m_ife.c +index 54fad8f70e73a..e3521e62c178c 100644 +--- a/tc/m_ife.c ++++ b/tc/m_ife.c +@@ -158,7 +158,6 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p, + + parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_mirred.c b/tc/m_mirred.c +index b09b016c2ca39..b1f45f1e6ecb0 100644 +--- a/tc/m_mirred.c ++++ b/tc/m_mirred.c +@@ -76,6 +76,7 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, + while (argc > 0) { + + if (matches(*argv, "action") == 0) { ++ NEXT_ARG(); + break; + } else if (!egress && matches(*argv, "egress") == 0) { + egress = 1; +@@ -170,10 +171,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, + } + + +- if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) { ++ if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) + parse_action_control(&argc, &argv, &p.action, false); +- NEXT_ARG_FWD(); +- } + + if (argc) { + if (iok && matches(*argv, "index") == 0) { +diff --git a/tc/m_nat.c b/tc/m_nat.c +index bb455f080b3a4..31b68fb6bd784 100644 +--- a/tc/m_nat.c ++++ b/tc/m_nat.c +@@ -117,7 +117,6 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct + + parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_OK); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_pedit.c b/tc/m_pedit.c +index 3391be95da38c..5d89ab1d832ab 100644 +--- a/tc/m_pedit.c ++++ b/tc/m_pedit.c +@@ -673,7 +673,6 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + + parse_action_control_dflt(&argc, &argv, &sel.sel.action, false, TC_ACT_OK); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_police.c b/tc/m_police.c +index 86117db0482ec..b79545961f4d7 100644 +--- a/tc/m_police.c ++++ b/tc/m_police.c +@@ -151,15 +151,18 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, + matches(*argv, "shot") == 0 || + matches(*argv, "continue") == 0 || + matches(*argv, "pass") == 0 || ++ matches(*argv, "ok") == 0 || + matches(*argv, "pipe") == 0 || + matches(*argv, "goto") == 0) { +- if (parse_action_control(&argc, &argv, &p.action, false)) +- return -1; ++ if (!parse_action_control(&argc, &argv, &p.action, false)) ++ goto action_ctrl_ok; ++ return -1; + } else if (strcmp(*argv, "conform-exceed") == 0) { + NEXT_ARG(); +- if (parse_action_control_slash(&argc, &argv, &p.action, +- &presult, true)) +- return -1; ++ if (!parse_action_control_slash(&argc, &argv, &p.action, ++ &presult, true)) ++ goto action_ctrl_ok; ++ return -1; + } else if (matches(*argv, "overhead") == 0) { + NEXT_ARG(); + if (get_u16(&overhead, *argv, 10)) { +@@ -175,8 +178,9 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p, + } else { + break; + } ++ NEXT_ARG_FWD(); ++action_ctrl_ok: + ok++; +- argc--; argv++; + } + + if (!ok) +diff --git a/tc/m_sample.c b/tc/m_sample.c +index 31774c0e806b4..ff5ee6bd1ef63 100644 +--- a/tc/m_sample.c ++++ b/tc/m_sample.c +@@ -100,7 +100,6 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p, + + parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c +index c41a7bb082dad..aa374fcb33ed9 100644 +--- a/tc/m_skbedit.c ++++ b/tc/m_skbedit.c +@@ -123,7 +123,6 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, + parse_action_control_dflt(&argc, &argv, &sel.action, + false, TC_ACT_PIPE); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_skbmod.c b/tc/m_skbmod.c +index 00318d42642a5..ba79308ba8354 100644 +--- a/tc/m_skbmod.c ++++ b/tc/m_skbmod.c +@@ -125,7 +125,6 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p, + + parse_action_control_dflt(&argc, &argv, &p.action, false, TC_ACT_PIPE); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index 0ff3f1a2b9876..cdde64a15b929 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -197,7 +197,6 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/m_vlan.c b/tc/m_vlan.c +index 0b2966ce82e53..cccb4996b05f3 100644 +--- a/tc/m_vlan.c ++++ b/tc/m_vlan.c +@@ -137,7 +137,6 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p, + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); + +- NEXT_ARG_FWD(); + if (argc) { + if (matches(*argv, "index") == 0) { + NEXT_ARG(); +diff --git a/tc/tc_util.c b/tc/tc_util.c +index 4584d4a448fb4..65695ea592ed8 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -507,6 +507,7 @@ static int __parse_action_control(int *argc_p, char ***argv_p, int *result_p, + } + result |= chain_index; + } ++ NEXT_ARG_FWD(); + *argc_p = argc; + *argv_p = argv; + *result_p = result; +@@ -603,8 +604,8 @@ out: + int parse_action_control_slash(int *argc_p, char ***argv_p, + int *result1_p, int *result2_p, bool allow_num) + { ++ int result1, result2, argc = *argc_p; + char **argv = *argv_p; +- int result1, result2; + char *p = strchr(*argv, '/'); + + if (!p) +@@ -624,6 +625,9 @@ int parse_action_control_slash(int *argc_p, char ***argv_p, + + *result1_p = result1; + *result2_p = result2; ++ NEXT_ARG_FWD(); ++ *argc_p = argc; ++ *argv_p = argv; + return 0; + } + +-- +2.20.1 + diff --git a/SOURCES/0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch b/SOURCES/0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch new file mode 100644 index 0000000..f87d77e --- /dev/null +++ b/SOURCES/0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch @@ -0,0 +1,46 @@ +From e4526cbbfb6151e87e493a7fecfe2384a3751100 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:12:49 +0200 +Subject: [PATCH] m_mirred: don't bail if the control action is missing + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 6eccf7ecdb010 + +commit 6eccf7ecdb010a90e5271942748ef4338ddb61ae +Author: Paolo Abeni +Date: Mon May 20 11:56:52 2019 +0200 + + m_mirred: don't bail if the control action is missing + + The mirred act admits an optional control action, defaulting + to TC_ACT_PIPE. The parsing code currently emits an error message + if the control action is not provided on the command line, even + if the command itself completes with no error. + + This change shuts down the error message, using the appropriate + parsing helper. + + Fixes: e67aba559581 ("tc: actions: add helpers to parse and print control actions") + Signed-off-by: Paolo Abeni + Signed-off-by: Stephen Hemminger +--- + tc/m_mirred.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tc/m_mirred.c b/tc/m_mirred.c +index b1f45f1e6ecb0..90d0b633c1318 100644 +--- a/tc/m_mirred.c ++++ b/tc/m_mirred.c +@@ -172,7 +172,8 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p, + + + if (p.eaction == TCA_EGRESS_MIRROR || p.eaction == TCA_INGRESS_MIRROR) +- parse_action_control(&argc, &argv, &p.action, false); ++ parse_action_control_dflt(&argc, &argv, &p.action, false, ++ TC_ACT_PIPE); + + if (argc) { + if (iok && matches(*argv, "index") == 0) { +-- +2.20.1 + diff --git a/SOURCES/0139-tc-m_tunnel_key-add-csum-nocsum-option.patch b/SOURCES/0139-tc-m_tunnel_key-add-csum-nocsum-option.patch new file mode 100644 index 0000000..3aa571a --- /dev/null +++ b/SOURCES/0139-tc-m_tunnel_key-add-csum-nocsum-option.patch @@ -0,0 +1,131 @@ +From 0152070641c58eccf6c6d9981a33f17ada23996f Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:12:49 +0200 +Subject: [PATCH] tc: m_tunnel_key: add csum/nocsum option + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 59eb271d1d259 +Conflicts: context change due to out-of-order cherry-pick of + commit 9f89b0cc0eda2 ("tc/act_tunnel_key: Enable + setup of tos and ttl") + +commit 59eb271d1d259da21372d222a2d995e57ef648a9 +Author: Jiri Benc +Date: Wed Jun 14 21:30:18 2017 +0200 + + tc: m_tunnel_key: add csum/nocsum option + + Allows control of UDP zero checksum. + + Signed-off-by: Jiri Benc +--- + man/man8/tc-tunnel_key.8 | 18 ++++++++++++++++++ + tc/m_tunnel_key.c | 21 ++++++++++++++++++++- + 2 files changed, 38 insertions(+), 1 deletion(-) + +diff --git a/man/man8/tc-tunnel_key.8 b/man/man8/tc-tunnel_key.8 +index 5e93c59d49465..0cd792a66d185 100644 +--- a/man/man8/tc-tunnel_key.8 ++++ b/man/man8/tc-tunnel_key.8 +@@ -18,6 +18,7 @@ tunnel_key - Tunnel metadata manipulation + .BI dst_port " UDP_PORT" + .BI tos " TOS" + .BI ttl " TTL" ++.RB "[ " csum " | " nocsum " ]" + + .SH DESCRIPTION + The +@@ -85,6 +86,23 @@ Outer header TOS + .TP + .B ttl + Outer header TTL ++.TP ++.RB [ no ] csum ++Controlls outer UDP checksum. When set to ++.B csum ++(which is default), the outer UDP checksum is calculated and included in the ++packets. When set to ++.BR nocsum , ++outer UDP checksum is zero. Note that when using zero UDP checksums with ++IPv6, the other tunnel endpoint must be configured to accept such packets. ++In Linux, this would be the ++.B udp6zerocsumrx ++option for the VXLAN tunnel interface. ++.IP ++If using ++.B nocsum ++with IPv6, be sure you know what you are doing. Zero UDP checksums provide ++weaker protection against corrupted packets. See RFC6935 for details. + .RE + .SH EXAMPLES + The following example encapsulates incoming ICMP packets on eth0 into a vxlan +diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c +index cdde64a15b929..992adc51c28ab 100644 +--- a/tc/m_tunnel_key.c ++++ b/tc/m_tunnel_key.c +@@ -28,7 +28,8 @@ static void explain(void) + "id \n" + "src_ip (mandatory)\n" + "dst_ip (mandatory)\n" +- "dst_port \n"); ++ "dst_port \n" ++ "csum | nocsum (default is \"csum\")\n"); + } + + static void usage(void) +@@ -107,6 +108,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + int ret; + int has_src_ip = 0; + int has_dst_ip = 0; ++ int csum = 1; + + if (matches(*argv, "tunnel_key") != 0) + return -1; +@@ -186,6 +188,10 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + fprintf(stderr, "Illegal \"ttl\"\n"); + return -1; + } ++ } else if (matches(*argv, "csum") == 0) { ++ csum = 1; ++ } else if (matches(*argv, "nocsum") == 0) { ++ csum = 0; + } else if (matches(*argv, "help") == 0) { + usage(); + } else { +@@ -194,6 +200,8 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p, + NEXT_ARG_FWD(); + } + ++ addattr8(n, MAX_MSG, TCA_TUNNEL_KEY_NO_CSUM, !csum); ++ + parse_action_control_dflt(&argc, &argv, &parm.action, + false, TC_ACT_PIPE); + +@@ -276,6 +284,15 @@ static void tunnel_key_print_tos_ttl(FILE *f, char *name, + } + } + ++static void tunnel_key_print_flag(FILE *f, const char *name_on, ++ const char *name_off, ++ struct rtattr *attr) ++{ ++ if (!attr) ++ return; ++ fprintf(f, "\n\t%s", rta_getattr_u8(attr) ? name_on : name_off); ++} ++ + static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg) + { + struct rtattr *tb[TCA_TUNNEL_KEY_MAX + 1]; +@@ -312,6 +329,8 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg) + tb[TCA_TUNNEL_KEY_ENC_KEY_ID]); + tunnel_key_print_dst_port(f, "dst_port", + tb[TCA_TUNNEL_KEY_ENC_DST_PORT]); ++ tunnel_key_print_flag(f, "nocsum", "csum", ++ tb[TCA_TUNNEL_KEY_NO_CSUM]); + tunnel_key_print_tos_ttl(f, "tos", + tb[TCA_TUNNEL_KEY_ENC_TOS]); + tunnel_key_print_tos_ttl(f, "ttl", +-- +2.20.1 + diff --git a/SOURCES/0140-gre6-add-collect-metadata-support.patch b/SOURCES/0140-gre6-add-collect-metadata-support.patch new file mode 100644 index 0000000..38ec1d7 --- /dev/null +++ b/SOURCES/0140-gre6-add-collect-metadata-support.patch @@ -0,0 +1,160 @@ +From b9961cdb54c22fa1b3f1eac5446a008fde7532e6 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:13:31 +0200 +Subject: [PATCH] gre6: add collect metadata support + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 6231c5bec6d25 +Conflicts: +* Context change due to missing commit + ad4b1425c3182 ("iplink: Expose IFLA_*_FWMARK attributes for supported link types") +* Adjusted gre_print_opt() to missing commit 6856fb65484ba + ("ip: link_gre6.c: add json output support") + +commit 6231c5bec6d256f7861f39d3a578f5259f274cc4 +Author: William Tu +Date: Tue Dec 12 18:22:52 2017 -0800 + + gre6: add collect metadata support + + The patch adds 'external' option to support collect metadata + gre6 tunnel. The 'external' keyword is already used to set the + device into collect metadata mode such as vxlan, geneve, ipip, + etc. This patch extends support for ipv6 gre and gretap. + Example of L3 and L2 gre device: + bash:~# ip link add dev ip6gre123 type ip6gre external + bash:~# ip link add dev ip6gretap123 type ip6gretap external + + Signed-off-by: William Tu + Cc: Daniel Borkmann +--- + ip/link_gre6.c | 49 ++++++++++++++++++++++++++++--------------- + man/man8/ip-link.8.in | 17 +++++++++++++++ + 2 files changed, 49 insertions(+), 17 deletions(-) + +diff --git a/ip/link_gre6.c b/ip/link_gre6.c +index 127e51de4ab73..ea42fb1a9f664 100644 +--- a/ip/link_gre6.c ++++ b/ip/link_gre6.c +@@ -102,6 +102,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, + __u16 encapflags = TUNNEL_ENCAP_FLAG_CSUM6; + __u16 encapsport = 0; + __u16 encapdport = 0; ++ __u8 metadata = 0; + int len; + + if (!(n->nlmsg_flags & NLM_F_CREATE)) { +@@ -173,6 +174,9 @@ get_failed: + if (greinfo[IFLA_GRE_ENCAP_SPORT]) + encapsport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_SPORT]); + ++ if (greinfo[IFLA_GRE_COLLECT_METADATA]) ++ metadata = 1; ++ + if (greinfo[IFLA_GRE_ENCAP_DPORT]) + encapdport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_DPORT]); + +@@ -333,6 +337,8 @@ get_failed: + encapflags |= TUNNEL_ENCAP_FLAG_REMCSUM; + } else if (strcmp(*argv, "noencap-remcsum") == 0) { + encapflags &= ~TUNNEL_ENCAP_FLAG_REMCSUM; ++ } else if (strcmp(*argv, "external") == 0) { ++ metadata = 1; + } else if (strcmp(*argv, "encaplimit") == 0) { + NEXT_ARG(); + if (strcmp(*argv, "none") == 0) { +@@ -350,23 +356,27 @@ get_failed: + argc--; argv++; + } + +- addattr32(n, 1024, IFLA_GRE_IKEY, ikey); +- addattr32(n, 1024, IFLA_GRE_OKEY, okey); +- addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2); +- addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2); +- addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr)); +- addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr)); +- if (link) +- addattr32(n, 1024, IFLA_GRE_LINK, link); +- addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1); +- addattr_l(n, 1024, IFLA_GRE_ENCAP_LIMIT, &encap_limit, 1); +- addattr_l(n, 1024, IFLA_GRE_FLOWINFO, &flowinfo, 4); +- addattr32(n, 1024, IFLA_GRE_FLAGS, flags); +- +- addattr16(n, 1024, IFLA_GRE_ENCAP_TYPE, encaptype); +- addattr16(n, 1024, IFLA_GRE_ENCAP_FLAGS, encapflags); +- addattr16(n, 1024, IFLA_GRE_ENCAP_SPORT, htons(encapsport)); +- addattr16(n, 1024, IFLA_GRE_ENCAP_DPORT, htons(encapdport)); ++ if (!metadata) { ++ addattr32(n, 1024, IFLA_GRE_IKEY, ikey); ++ addattr32(n, 1024, IFLA_GRE_OKEY, okey); ++ addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2); ++ addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2); ++ addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr)); ++ addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr)); ++ if (link) ++ addattr32(n, 1024, IFLA_GRE_LINK, link); ++ addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1); ++ addattr_l(n, 1024, IFLA_GRE_ENCAP_LIMIT, &encap_limit, 1); ++ addattr_l(n, 1024, IFLA_GRE_FLOWINFO, &flowinfo, 4); ++ addattr32(n, 1024, IFLA_GRE_FLAGS, flags); ++ ++ addattr16(n, 1024, IFLA_GRE_ENCAP_TYPE, encaptype); ++ addattr16(n, 1024, IFLA_GRE_ENCAP_FLAGS, encapflags); ++ addattr16(n, 1024, IFLA_GRE_ENCAP_SPORT, htons(encapsport)); ++ addattr16(n, 1024, IFLA_GRE_ENCAP_DPORT, htons(encapdport)); ++ } else { ++ addattr_l(n, 1024, IFLA_GRE_COLLECT_METADATA, NULL, 0); ++ } + + return 0; + } +@@ -385,6 +395,11 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) + if (!tb) + return; + ++ if (tb[IFLA_GRE_COLLECT_METADATA]) { ++ fprintf(f, "external"); ++ return; ++ } ++ + if (tb[IFLA_GRE_FLAGS]) + flags = rta_getattr_u32(tb[IFLA_GRE_FLAGS]); + +diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in +index 8be5d5e1e9fd6..612bd8ce92696 100644 +--- a/man/man8/ip-link.8.in ++++ b/man/man8/ip-link.8.in +@@ -877,6 +877,8 @@ the following additional arguments are supported: + .BI "dscp inherit" + ] [ + .BI dev " PHYS_DEV " ++] [ ++.RB external + ] + + .in +8 +@@ -958,6 +960,21 @@ or + .IR 00 ".." ff + when tunneling non-IP packets. The default value is 00. + ++.sp ++.RB external ++- make this tunnel externally controlled (or not, which is the default). ++In the kernel, this is referred to as collect metadata mode. This flag is ++mutually exclusive with the ++.BR remote , ++.BR local , ++.BR seq , ++.BR key, ++.BR csum, ++.BR hoplimit, ++.BR encaplimit, ++.BR flowlabel " and " tclass ++options. ++ + .in -8 + + .TP +-- +2.20.1 + diff --git a/SOURCES/0141-tc_util-Silence-spurious-compiler-warning.patch b/SOURCES/0141-tc_util-Silence-spurious-compiler-warning.patch new file mode 100644 index 0000000..b345515 --- /dev/null +++ b/SOURCES/0141-tc_util-Silence-spurious-compiler-warning.patch @@ -0,0 +1,40 @@ +From 774b1c35d4515434e979d9090960ad3293bfe12e Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 5 Jun 2019 13:18:27 +0200 +Subject: [PATCH] tc_util: Silence spurious compiler warning + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1714660 +Upstream Status: iproute2.git commit 66942e522e54d + +commit 66942e522e54d9f96153590b7c1c7830b8f73f5c +Author: Phil Sutter +Date: Wed Nov 15 15:01:31 2017 +0100 + + tc_util: Silence spurious compiler warning + + GCC version 7.2.1 complains that 'result1' may be used uninitialized in + parse_action_control_slash_spaces(). This should not be possible in + practice, so the actual value 'result1' is initialized with does not + matter. + + Signed-off-by: Phil Sutter +--- + tc/tc_util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tc/tc_util.c b/tc/tc_util.c +index 65695ea592ed8..e115e5a70e3a1 100644 +--- a/tc/tc_util.c ++++ b/tc/tc_util.c +@@ -556,7 +556,7 @@ static int parse_action_control_slash_spaces(int *argc_p, char ***argv_p, + { + int argc = *argc_p; + char **argv = *argv_p; +- int result1, result2; ++ int result1 = -1, result2; + int *result_p = &result1; + int ok = 0; + int ret; +-- +2.20.1 + diff --git a/SOURCES/0142-ss-use-for-any-address-any-family-sockets.patch b/SOURCES/0142-ss-use-for-any-address-any-family-sockets.patch new file mode 100644 index 0000000..8e97133 --- /dev/null +++ b/SOURCES/0142-ss-use-for-any-address-any-family-sockets.patch @@ -0,0 +1,76 @@ +From 04453080a3a92071227fd79a039137f72fa82e15 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Wed, 12 Jun 2019 15:00:33 +0200 +Subject: [PATCH] ss: use [::] for any address/any family sockets + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1588122 +Upstream Status: RHEL-only + +commit d981824803999a339f4b8fb9ad36d9d5990d9eab +Author: Andrea Claudi +Date: Wed Jun 12 14:49:07 2019 +0200 + + ss: use [::] for any address/any family sockets + + commit aba9c23a6e1cb ("ss: enclose IPv6 address in brackets") + brings in the unintended side effect of showing as "*" sockets + listening to any address in any family. This is consistent with + upstream iproute and RHEL 8 iproute version, but not with + previous versions of RHEL 7 iproute. + + This commit partially reverts aba9c23a6e1cb using "[::]" for + any family sockets when -f inet6 is used. + + Tested with + # ss -ln -f inet6 + + ("ss: enclose IPv6 address in brackets") +--- + misc/ss.c | 29 ++++++++++++----------------- + 1 file changed, 12 insertions(+), 17 deletions(-) + +diff --git a/misc/ss.c b/misc/ss.c +index 6aaae1b5390e4..8f184fb929d31 100644 +--- a/misc/ss.c ++++ b/misc/ss.c +@@ -1090,25 +1090,20 @@ static void inet_addr_print(const inet_prefix *a, int port, unsigned int ifindex + ap = format_host(AF_INET, 4, a->data); + } + } else { +- if (!memcmp(a->data, &in6addr_any, sizeof(in6addr_any))) { +- buf[0] = '*'; +- buf[1] = 0; +- } else { +- ap = format_host(a->family, 16, a->data); +- +- /* Numeric IPv6 addresses should be bracketed */ +- if (strchr(ap, ':')) { +- snprintf(buf, sizeof(buf), +- "[%s]", ap); +- ap = buf; +- } ++ ap = format_host(a->family, 16, a->data); + +- est_len = strlen(ap); +- if (est_len <= addr_width) +- est_len = addr_width; +- else +- est_len = addr_width + ((est_len-addr_width+3)/4)*4; ++ /* Numeric IPv6 addresses should be bracketed */ ++ if (strchr(ap, ':')) { ++ snprintf(buf, sizeof(buf), ++ "[%s]", ap); ++ ap = buf; + } ++ ++ est_len = strlen(ap); ++ if (est_len <= addr_width) ++ est_len = addr_width; ++ else ++ est_len = addr_width + ((est_len-addr_width+3)/4)*4; + } + + if (ifindex) { +-- +2.20.1 + diff --git a/SOURCES/0143-tc-introduce-tc_qdisc_block_exists-helper.patch b/SOURCES/0143-tc-introduce-tc_qdisc_block_exists-helper.patch new file mode 100644 index 0000000..df5bbd6 --- /dev/null +++ b/SOURCES/0143-tc-introduce-tc_qdisc_block_exists-helper.patch @@ -0,0 +1,110 @@ +From 2e2ac620670997b59d65a73b0af3e77431be3c18 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Tue, 18 Jun 2019 20:01:45 +0200 +Subject: [PATCH] tc: introduce tc_qdisc_block_exists helper + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291 +Upstream Status: iproute2.git commit d0bcedd549566 +Conflicts: context change due to missing commit 6f7df6b2a1fef + ("tc: Optimize gact action lookup") + +commit d0bcedd549566a87354aa804df3be6be80681ee9 +Author: Jiri Pirko +Date: Sat Jan 20 11:00:27 2018 +0100 + + tc: introduce tc_qdisc_block_exists helper + + This hepler used qdisc dump to list all qdisc and find if block index in + question is used by any of them. That means the block with specified + index exists. + + Signed-off-by: Jiri Pirko + Signed-off-by: David Ahern +--- + tc/tc_qdisc.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ + tc/tc_util.h | 2 ++ + 2 files changed, 63 insertions(+) + +diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c +index 8b0c5c72dbad1..f8e06ccf205a0 100644 +--- a/tc/tc_qdisc.c ++++ b/tc/tc_qdisc.c +@@ -366,3 +366,64 @@ int do_qdisc(int argc, char **argv) + fprintf(stderr, "Command \"%s\" is unknown, try \"tc qdisc help\".\n", *argv); + return -1; + } ++ ++struct tc_qdisc_block_exists_ctx { ++ __u32 block_index; ++ bool found; ++}; ++ ++static int tc_qdisc_block_exists_cb(const struct sockaddr_nl *who, ++ struct nlmsghdr *n, void *arg) ++{ ++ struct tc_qdisc_block_exists_ctx *ctx = arg; ++ struct tcmsg *t = NLMSG_DATA(n); ++ struct rtattr *tb[TCA_MAX+1]; ++ int len = n->nlmsg_len; ++ ++ if (n->nlmsg_type != RTM_NEWQDISC) ++ return 0; ++ ++ len -= NLMSG_LENGTH(sizeof(*t)); ++ if (len < 0) ++ return -1; ++ ++ parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len); ++ ++ if (tb[TCA_KIND] == NULL) ++ return -1; ++ ++ if (tb[TCA_INGRESS_BLOCK] && ++ RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) { ++ __u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]); ++ ++ if (block == ctx->block_index) ++ ctx->found = true; ++ } ++ ++ if (tb[TCA_EGRESS_BLOCK] && ++ RTA_PAYLOAD(tb[TCA_EGRESS_BLOCK]) >= sizeof(__u32)) { ++ __u32 block = rta_getattr_u32(tb[TCA_EGRESS_BLOCK]); ++ ++ if (block == ctx->block_index) ++ ctx->found = true; ++ } ++ return 0; ++} ++ ++bool tc_qdisc_block_exists(__u32 block_index) ++{ ++ struct tc_qdisc_block_exists_ctx ctx = { .block_index = block_index }; ++ struct tcmsg t = { .tcm_family = AF_UNSPEC }; ++ ++ if (rtnl_dump_request(&rth, RTM_GETQDISC, &t, sizeof(t)) < 0) { ++ perror("Cannot send dump request"); ++ return false; ++ } ++ ++ if (rtnl_dump_filter(&rth, tc_qdisc_block_exists_cb, &ctx) < 0) { ++ perror("Dump terminated\n"); ++ return false; ++ } ++ ++ return ctx.found; ++} +diff --git a/tc/tc_util.h b/tc/tc_util.h +index 5c54ad384eae6..8344c11833ee8 100644 +--- a/tc/tc_util.h ++++ b/tc/tc_util.h +@@ -122,4 +122,6 @@ int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt); + int cls_names_init(char *path); + void cls_names_uninit(void); + ++bool tc_qdisc_block_exists(__u32 block_index); ++ + #endif +-- +2.20.1 + diff --git a/SOURCES/0144-tc_filter-resolve-device-name-before-parsing-filter.patch b/SOURCES/0144-tc_filter-resolve-device-name-before-parsing-filter.patch new file mode 100644 index 0000000..66c8eaa --- /dev/null +++ b/SOURCES/0144-tc_filter-resolve-device-name-before-parsing-filter.patch @@ -0,0 +1,113 @@ +From 83b78ff645260a51ff5d643169009faeb3032d3c Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Tue, 18 Jun 2019 20:02:54 +0200 +Subject: [PATCH] tc_filter: resolve device name before parsing filter + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291 +Upstream Status: iproute2.git commit 01ea76b1cf545 + +commit 01ea76b1cf54516c71a9a54fba672410ada2cccb +Author: Jakub Kicinski +Date: Thu Nov 23 18:12:06 2017 -0800 + + tc_filter: resolve device name before parsing filter + + Move resolving device name into an ifindex before calling filter + specific callbacks. This way if filters need the ifindex, they + can read it from the request. + + Signed-off-by: Jakub Kicinski + Reviewed-by: Quentin Monnet + Acked-by: Daniel Borkmann +--- + tc/tc_filter.c | 50 ++++++++++++++++++++++++-------------------------- + 1 file changed, 24 insertions(+), 26 deletions(-) + +diff --git a/tc/tc_filter.c b/tc/tc_filter.c +index 8dbebf1ffa32a..e479039159df6 100644 +--- a/tc/tc_filter.c ++++ b/tc/tc_filter.c +@@ -161,6 +161,16 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + if (k[0]) + addattr_l(&req.n, sizeof(req), TCA_KIND, k, strlen(k)+1); + ++ if (d[0]) { ++ ll_init_map(&rth); ++ ++ req.t.tcm_ifindex = ll_name_to_index(d); ++ if (req.t.tcm_ifindex == 0) { ++ fprintf(stderr, "Cannot find device \"%s\"\n", d); ++ return 1; ++ } ++ } ++ + if (q) { + if (q->parse_fopt(q, fhandle, argc, argv, &req.n)) + return 1; +@@ -183,17 +193,6 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + if (est.ewma_log) + addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est)); + +- +- if (d[0]) { +- ll_init_map(&rth); +- +- req.t.tcm_ifindex = ll_name_to_index(d); +- if (req.t.tcm_ifindex == 0) { +- fprintf(stderr, "Cannot find device \"%s\"\n", d); +- return 1; +- } +- } +- + if (rtnl_talk(&rth, &req.n, NULL) < 0) { + fprintf(stderr, "We have an error talking to the kernel\n"); + return 2; +@@ -453,10 +452,23 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + return -1; + } + ++ if (d[0]) { ++ ll_init_map(&rth); ++ ++ req.t.tcm_ifindex = ll_name_to_index(d); ++ if (req.t.tcm_ifindex == 0) { ++ fprintf(stderr, "Cannot find device \"%s\"\n", d); ++ return 1; ++ } ++ filter_ifindex = req.t.tcm_ifindex; ++ } else { ++ fprintf(stderr, "Must specify netdevice \"dev\"\n"); ++ return -1; ++ } ++ + if (q->parse_fopt(q, fhandle, argc, argv, &req.n)) + return 1; + +- + if (!fhandle) { + fprintf(stderr, "Must specify filter \"handle\"\n"); + return -1; +@@ -471,20 +483,6 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + return -1; + } + +- if (d[0]) { +- ll_init_map(&rth); +- +- req.t.tcm_ifindex = ll_name_to_index(d); +- if (req.t.tcm_ifindex == 0) { +- fprintf(stderr, "Cannot find device \"%s\"\n", d); +- return 1; +- } +- filter_ifindex = req.t.tcm_ifindex; +- } else { +- fprintf(stderr, "Must specify netdevice \"dev\"\n"); +- return -1; +- } +- + if (rtnl_talk(&rth, &req.n, &answer) < 0) { + fprintf(stderr, "We have an error talking to the kernel\n"); + return 2; +-- +2.20.1 + diff --git a/SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch b/SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch new file mode 100644 index 0000000..1fe56ff --- /dev/null +++ b/SOURCES/0145-tc-introduce-support-for-block-handle-for-filter-ope.patch @@ -0,0 +1,269 @@ +From 13e1ae7b588c723091f81538bb5834b274f0b0c7 Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Tue, 18 Jun 2019 20:02:54 +0200 +Subject: [PATCH] tc: introduce support for block-handle for filter operations + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291 +Upstream Status: iproute2.git commit 0c7cef9669a82 +Conflicts: context change due to missing commit 485d0c6001c4a + ("tc: Add batchsize feature for filter and actions"), + also adjust code to use fprintf instead of print_string + due to missing commit 249284ff5a44a ("tc: jsonify filter core") + +commit 0c7cef9669a82d4ad0438922f7ce57c18100d6b8 +Author: Jiri Pirko +Date: Sat Jan 20 11:00:28 2018 +0100 + + tc: introduce support for block-handle for filter operations + + So far, qdisc was the only handle that could be used to manipulate + filters. Kernel added support for using block to manipulate it. So add + the support to use block index to manipulate filters. The magic + TCM_IFINDEX_MAGIC_BLOCK indicates the block index is in use. + + Signed-off-by: Jiri Pirko + Signed-off-by: David Ahern +--- + man/man8/tc.8 | 18 +++++++++ + tc/tc_filter.c | 102 +++++++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 104 insertions(+), 16 deletions(-) + +diff --git a/man/man8/tc.8 b/man/man8/tc.8 +index a341a8f995f85..c493ccfa7c900 100644 +--- a/man/man8/tc.8 ++++ b/man/man8/tc.8 +@@ -41,6 +41,19 @@ tc \- show / manipulate traffic control settings + .B flowid + \fIflow-id\fR + ++.B tc ++.RI "[ " OPTIONS " ]" ++.B filter [ add | change | replace | delete | get ] block ++\fIBLOCK_INDEX\fR ++.B [ handle \fIfilter-id\fR ] ++.B protocol ++\fIprotocol\fR ++.B prio ++\fIpriority\fR filtertype ++[ filtertype specific parameters ] ++.B flowid ++\fIflow-id\fR ++ + .B tc + .RI "[ " OPTIONS " ]" + .RI "[ " FORMAT " ]" +@@ -58,6 +71,11 @@ tc \- show / manipulate traffic control settings + .RI "[ " OPTIONS " ]" + .B filter show dev + \fIDEV\fR ++.P ++.B tc ++.RI "[ " OPTIONS " ]" ++.B filter show block ++\fIBLOCK_INDEX\fR + + .P + .ti 8 +diff --git a/tc/tc_filter.c b/tc/tc_filter.c +index e479039159df6..5676ed3a74383 100644 +--- a/tc/tc_filter.c ++++ b/tc/tc_filter.c +@@ -29,14 +29,17 @@ + static void usage(void) + { + fprintf(stderr, +- "Usage: tc filter [ add | del | change | replace | show ] dev STRING\n" +- "Usage: tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" ++ "Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]\n" ++ " tc filter [ add | del | change | replace | show ] [ block BLOCK_INDEX ]\n" ++ " tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" ++ " tc filter get block BLOCK_INDEX protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" + " [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]\n" + " [ estimator INTERVAL TIME_CONSTANT ]\n" + " [ root | ingress | egress | parent CLASSID ]\n" + " [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n" + "\n" + " tc filter show [ dev STRING ] [ root | ingress | egress | parent CLASSID ]\n" ++ " tc filter show [ block BLOCK_INDEX ]\n" + "Where:\n" + "FILTER_TYPE := { rsvp | u32 | bpf | fw | route | etc. }\n" + "FILTERID := ... format depends on classifier, see there\n" +@@ -61,6 +64,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + int protocol_set = 0; + __u32 chain_index; + int chain_index_set = 0; ++ __u32 block_index = 0; + char *fhandle = NULL; + char d[16] = {}; + char k[16] = {}; +@@ -74,7 +78,21 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); ++ if (block_index) { ++ fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); ++ return -1; ++ } + strncpy(d, *argv, sizeof(d)-1); ++ } else if (matches(*argv, "block") == 0) { ++ NEXT_ARG(); ++ if (block_index) ++ duparg("block", *argv); ++ if (d[0]) { ++ fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); ++ return -1; ++ } ++ if (get_u32(&block_index, *argv, 0) || !block_index) ++ invarg("invalid block index value", *argv); + } else if (strcmp(*argv, "root") == 0) { + if (req.t.tcm_parent) { + fprintf(stderr, +@@ -169,6 +187,9 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv) + fprintf(stderr, "Cannot find device \"%s\"\n", d); + return 1; + } ++ } else if (block_index) { ++ req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; ++ req.t.tcm_block_index = block_index; + } + + if (q) { +@@ -207,6 +228,7 @@ static __u32 filter_prio; + static __u32 filter_protocol; + static __u32 filter_chain_index; + static int filter_chain_index_set; ++static __u32 filter_block_index; + __u16 f_proto; + + int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) +@@ -251,19 +273,25 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) + fprintf(fp, "added "); + + fprintf(fp, "filter "); +- if (!filter_ifindex || filter_ifindex != t->tcm_ifindex) +- fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex)); +- +- if (!filter_parent || filter_parent != t->tcm_parent) { +- if (t->tcm_parent == TC_H_ROOT) +- fprintf(fp, "root "); +- else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS)) +- fprintf(fp, "ingress "); +- else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS)) +- fprintf(fp, "egress "); +- else { +- print_tc_classid(abuf, sizeof(abuf), t->tcm_parent); +- fprintf(fp, "parent %s ", abuf); ++ if (t->tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK) { ++ if (!filter_block_index || ++ filter_block_index != t->tcm_block_index) ++ fprintf(fp, "block %u ", t->tcm_block_index); ++ } else { ++ if (!filter_ifindex || filter_ifindex != t->tcm_ifindex) ++ fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex)); ++ ++ if (!filter_parent || filter_parent != t->tcm_parent) { ++ if (t->tcm_parent == TC_H_ROOT) ++ fprintf(fp, "root "); ++ else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS)) ++ fprintf(fp, "ingress "); ++ else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS)) ++ fprintf(fp, "egress "); ++ else { ++ print_tc_classid(abuf, sizeof(abuf), t->tcm_parent); ++ fprintf(fp, "parent %s ", abuf); ++ } + } + } + +@@ -337,6 +365,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + int protocol_set = 0; + __u32 chain_index; + int chain_index_set = 0; ++ __u32 block_index = 0; + __u32 parent_handle = 0; + char *fhandle = NULL; + char d[16] = {}; +@@ -347,7 +376,21 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); ++ if (block_index) { ++ fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); ++ return -1; ++ } + strncpy(d, *argv, sizeof(d)-1); ++ } else if (matches(*argv, "block") == 0) { ++ NEXT_ARG(); ++ if (block_index) ++ duparg("block", *argv); ++ if (d[0]) { ++ fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); ++ return -1; ++ } ++ if (get_u32(&block_index, *argv, 0) || !block_index) ++ invarg("invalid block index value", *argv); + } else if (strcmp(*argv, "root") == 0) { + if (req.t.tcm_parent) { + fprintf(stderr, +@@ -461,8 +504,12 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) + return 1; + } + filter_ifindex = req.t.tcm_ifindex; ++ } else if (block_index) { ++ req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; ++ req.t.tcm_block_index = block_index; ++ filter_block_index = block_index; + } else { +- fprintf(stderr, "Must specify netdevice \"dev\"\n"); ++ fprintf(stderr, "Must specify netdevice \"dev\" or block index \"block\"\n"); + return -1; + } + +@@ -510,6 +557,7 @@ static int tc_filter_list(int argc, char **argv) + __u32 prio = 0; + __u32 protocol = 0; + __u32 chain_index; ++ __u32 block_index = 0; + char *fhandle = NULL; + + while (argc > 0) { +@@ -517,7 +565,21 @@ static int tc_filter_list(int argc, char **argv) + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); ++ if (block_index) { ++ fprintf(stderr, "Error: \"dev\" cannot be used in the same time as \"block\"\n"); ++ return -1; ++ } + strncpy(d, *argv, sizeof(d)-1); ++ } else if (matches(*argv, "block") == 0) { ++ NEXT_ARG(); ++ if (block_index) ++ duparg("block", *argv); ++ if (d[0]) { ++ fprintf(stderr, "Error: \"block\" cannot be used in the same time as \"dev\"\n"); ++ return -1; ++ } ++ if (get_u32(&block_index, *argv, 0) || !block_index) ++ invarg("invalid block index value", *argv); + } else if (strcmp(*argv, "root") == 0) { + if (req.t.tcm_parent) { + fprintf(stderr, +@@ -606,6 +668,14 @@ static int tc_filter_list(int argc, char **argv) + return 1; + } + filter_ifindex = req.t.tcm_ifindex; ++ } else if (block_index) { ++ if (!tc_qdisc_block_exists(block_index)) { ++ fprintf(stderr, "Cannot find block \"%u\"\n", block_index); ++ return 1; ++ } ++ req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; ++ req.t.tcm_block_index = block_index; ++ filter_block_index = block_index; + } + + if (filter_chain_index_set) +-- +2.20.1 + diff --git a/SOURCES/0146-tc-implement-ingress-egress-block-index-attributes-f.patch b/SOURCES/0146-tc-implement-ingress-egress-block-index-attributes-f.patch new file mode 100644 index 0000000..e0aa77c --- /dev/null +++ b/SOURCES/0146-tc-implement-ingress-egress-block-index-attributes-f.patch @@ -0,0 +1,121 @@ +From f38f33f8693ed7a4f883b18862e47f822ff8a62d Mon Sep 17 00:00:00 2001 +From: Andrea Claudi +Date: Tue, 18 Jun 2019 20:04:42 +0200 +Subject: [PATCH] tc: implement ingress/egress block index attributes for + qdiscs + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291 +Upstream Status: iproute2.git commit 063463efd7f0d +Conflicts: adjust the code to make it compile due to missing + commit c91d262f414d2 ("tc: jsonify qdisc core") + +commit 063463efd7f0d91b7372b089a7b7aff7fc9ac0f6 +Author: Jiri Pirko +Date: Sat Jan 20 11:00:29 2018 +0100 + + tc: implement ingress/egress block index attributes for qdiscs + + During qdisc creation it is possible to specify shared block for bot + ingress and egress. Pass this values to kernel according to the command + line options. + + Signed-off-by: Jiri Pirko + Signed-off-by: David Ahern +--- + man/man8/tc.8 | 6 +++++- + tc/tc_qdisc.c | 34 ++++++++++++++++++++++++++++++++++ + 2 files changed, 39 insertions(+), 1 deletion(-) + +diff --git a/man/man8/tc.8 b/man/man8/tc.8 +index c493ccfa7c900..c89a7a8ecf83b 100644 +--- a/man/man8/tc.8 ++++ b/man/man8/tc.8 +@@ -11,7 +11,11 @@ tc \- show / manipulate traffic control settings + \fIqdisc-id\fR + .B | root ] + .B [ handle +-\fIqdisc-id\fR ] qdisc ++\fIqdisc-id\fR ] ++.B [ ingress_block ++\fIBLOCK_INDEX\fR ] ++.B [ egress_block ++\fIBLOCK_INDEX\fR ] qdisc + [ qdisc specific parameters ] + .P + +diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c +index f8e06ccf205a0..26d23f43007ae 100644 +--- a/tc/tc_qdisc.c ++++ b/tc/tc_qdisc.c +@@ -32,6 +32,7 @@ static int usage(void) + fprintf(stderr, " [ handle QHANDLE ] [ root | ingress | clsact | parent CLASSID ]\n"); + fprintf(stderr, " [ estimator INTERVAL TIME_CONSTANT ]\n"); + fprintf(stderr, " [ stab [ help | STAB_OPTIONS] ]\n"); ++ fprintf(stderr, " [ ingress_block BLOCK_INDEX ] [ egress_block BLOCK_INDEX ]\n"); + fprintf(stderr, " [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " tc qdisc show [ dev STRING ] [ ingress | clsact ]\n"); +@@ -62,6 +63,8 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) + .n.nlmsg_type = cmd, + .t.tcm_family = AF_UNSPEC, + }; ++ __u32 ingress_block = 0; ++ __u32 egress_block = 0; + + while (argc > 0) { + if (strcmp(*argv, "dev") == 0) { +@@ -122,6 +125,14 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) + if (parse_size_table(&argc, &argv, &stab.szopts) < 0) + return -1; + continue; ++ } else if (matches(*argv, "ingress_block") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&ingress_block, *argv, 0) || !ingress_block) ++ invarg("invalid ingress block index value", *argv); ++ } else if (matches(*argv, "egress_block") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&egress_block, *argv, 0) || !egress_block) ++ invarg("invalid egress block index value", *argv); + } else if (matches(*argv, "help") == 0) { + usage(); + } else { +@@ -139,6 +150,13 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) + if (est.ewma_log) + addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est)); + ++ if (ingress_block) ++ addattr32(&req.n, sizeof(req), ++ TCA_INGRESS_BLOCK, ingress_block); ++ if (egress_block) ++ addattr32(&req.n, sizeof(req), ++ TCA_EGRESS_BLOCK, egress_block); ++ + if (q) { + if (q->parse_qopt) { + if (q->parse_qopt(q, argc, argv, &req.n)) +@@ -252,6 +270,22 @@ int print_qdisc(const struct sockaddr_nl *who, + if (t->tcm_info != 1) + fprintf(fp, "refcnt %d ", t->tcm_info); + ++ if (tb[TCA_INGRESS_BLOCK] && ++ RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) { ++ __u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]); ++ ++ if (block) ++ fprintf(fp, "ingress_block %u ", block); ++ } ++ ++ if (tb[TCA_EGRESS_BLOCK] && ++ RTA_PAYLOAD(tb[TCA_EGRESS_BLOCK]) >= sizeof(__u32)) { ++ __u32 block = rta_getattr_u32(tb[TCA_EGRESS_BLOCK]); ++ ++ if (block) ++ fprintf(fp, "egress_block %u ", block); ++ } ++ + /* pfifo_fast is generic enough to warrant the hardcoding --JHS */ + if (strcmp("pfifo_fast", RTA_DATA(tb[TCA_KIND])) == 0) + q = get_qdisc_kind("prio"); +-- +2.20.1 + diff --git a/SOURCES/avpkt b/SOURCES/avpkt new file mode 100644 index 0000000..c362b94 --- /dev/null +++ b/SOURCES/avpkt @@ -0,0 +1 @@ +AVPKT=3000 diff --git a/SOURCES/cbq-0000.example b/SOURCES/cbq-0000.example new file mode 100644 index 0000000..5503374 --- /dev/null +++ b/SOURCES/cbq-0000.example @@ -0,0 +1,5 @@ +DEVICE=eth0,10Mbit,1Mbit +RATE=128Kbit +WEIGHT=10Kbit +PRIO=5 +RULE=192.168.1.0/24 diff --git a/SOURCES/rt_dsfield.deprecated b/SOURCES/rt_dsfield.deprecated new file mode 100644 index 0000000..c8eec63 --- /dev/null +++ b/SOURCES/rt_dsfield.deprecated @@ -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 diff --git a/SPECS/iproute.spec b/SPECS/iproute.spec new file mode 100644 index 0000000..9c0adae --- /dev/null +++ b/SPECS/iproute.spec @@ -0,0 +1,1712 @@ +%global cbq_version v0.7.3 + +%define rpmversion 4.11.0 +%define baserelease 0.el7 +%define specrelease 25%{?dist} +%define pkg_release %{specrelease}%{?buildid} + +Summary: Advanced IP routing and network device configuration tools +Name: iproute +Version: %{rpmversion} +Release: %{pkg_release} +Group: Applications/System +URL: http://kernel.org/pub/linux/utils/net/%{name}2/ +Source0: %{name}-%{rpmversion}-%{baserelease}.tar.xz +Source1: cbq-0000.example +Source2: avpkt +Source3: rt_dsfield.deprecated +Patch0: 0001-Confirm-success-for-each-tc-batch-command.patch +Patch1: 0002-Really-fix-get_addr-and-get_prefix-error-messages.patch +Patch2: 0003-tc-simple-Fix-documentation.patch +Patch3: 0004-tc-fix-m_simple-usage.patch +Patch4: 0005-bpf-Make-bytecode-file-reading-a-little-more-robust.patch +Patch5: 0006-ss-Fix-for-added-diag-support-check.patch +Patch6: 0007-tc-simple.8-Fix-reference-to-non-existing-tc-actions.patch +Patch7: 0008-lib-bpf-Fix-bytecode-file-parsing.patch +Patch8: 0009-tc-simple.8-Fix-one-more-reference-to-non-existing-t.patch +Patch9: 0010-tc-m_xt-Prevent-a-segfault-in-libipt.patch +Patch10: 0011-link_gre6-really-support-encaplimit-option.patch +Patch11: 0012-tc-fix-typo-in-manpage.patch +Patch12: 0013-ip-neigh-allow-flush-FAILED-neighbour-entry.patch +Patch13: 0014-netns-avoid-directory-traversal.patch +Patch14: 0015-utils-return-default-family-when-rtm_family-is-not-R.patch +Patch15: 0016-link_gre6-Fix-for-changing-tclass-flowlabel.patch +Patch16: 0017-netlink-Change-rtnl_dump_done-to-always-show-error.patch +Patch17: 0018-libnetlink-drop-unused-parameter-to-rtnl_dump_done.patch +Patch18: 0019-iproute-Add-support-for-extended-ack-to-rtnl_talk.patch +Patch19: 0020-iplink-check-for-message-truncation-in-iplink_get.patch +Patch20: 0021-iplink-double-the-buffer-size-also-in-iplink_get.patch +Patch21: 0022-lib-libnetlink-re-malloc-buff-if-size-is-not-enough.patch +Patch22: 0023-lib-libnetlink-update-rtnl_talk-to-support-malloc-bu.patch +Patch23: 0024-Update-linux-headers.patch +Patch24: 0025-devlink-Change-netlink-attribute-validation.patch +Patch25: 0026-devlink-Add-support-for-pipeline-debug-dpipe.patch +Patch26: 0027-tc-Reflect-HW-offload-status.patch +Patch27: 0028-pedit-Fix-a-typo-in-warning.patch +Patch28: 0029-pedit-Do-not-allow-using-retain-for-too-big-fields.patch +Patch29: 0030-pedit-Check-for-extended-capability-in-protocol-pars.patch +Patch30: 0031-pedit-Introduce-ipv6-support.patch +Patch31: 0032-devlink-Add-option-to-set-and-show-eswitch-encapsula.patch +Patch32: 0033-tc-flower-add-support-for-tcp-flags.patch +Patch33: 0034-iplink-Update-usage-in-help-message.patch +Patch34: 0035-tc-flower-add-support-for-matching-on-ip-tos-and-ttl.patch +Patch35: 0036-iproute-build-more-easily-on-Android.patch +Patch36: 0037-uapi-add-include-linux-vm_sockets_diag.h.patch +Patch37: 0038-ss-allow-AF_FAMILY-constants-32.patch +Patch38: 0039-ss-add-AF_VSOCK-support.patch +Patch39: 0040-link_gre6-Detect-invalid-encaplimit-values.patch +Patch40: 0041-man-tc-csum.8-Fix-inconsistency-in-example-descripti.patch +Patch41: 0042-tc-fix-command-tc-actions-del-hang-issue.patch +Patch42: 0043-ip-link-Fix-use-after-free-in-nl_get_ll_addr_len.patch +Patch43: 0044-tc-m_tunnel_key-reformat-the-usage-text.patch +Patch44: 0045-tc-m_tunnel_key-Allow-key-less-tunnels.patch +Patch45: 0046-tc-include-stdint.h-explicitly-for-UINT16_MAX.patch +Patch46: 0047-Update-kernel-headers.patch +Patch47: 0048-tc-flower-Add-match-on-encapsulating-tos-ttl.patch +Patch48: 0049-tc-act_tunnel_key-Enable-setup-of-tos-and-ttl.patch +Patch49: 0050-iproute-Abort-if-nexthop-cannot-be-parsed.patch +Patch50: 0051-ip-route-Fix-segfault-with-many-nexthops.patch +Patch51: 0052-man-ip-route.8-Document-nexthop-limit.patch +Patch52: 0053-ip-route-Fix-nexthop-encap-parsing.patch +Patch53: 0054-ip-link-Fix-listing-of-alias-interfaces.patch +Patch54: 0055-ip-Add-violation-counters-to-VF-statisctics.patch +Patch55: 0056-devlink-Add-support-for-devlink-resource-abstraction.patch +Patch56: 0057-devlink-Add-support-for-hot-reload.patch +Patch57: 0058-devlink-Update-man-pages-and-add-resource-man.patch +Patch58: 0059-devlink-Add-param-command-support.patch +Patch59: 0060-man-ip-route.8-ssthresh-parameter-is-NUMBER.patch +Patch60: 0061-man-tc-vlan.8-Fix-for-incorrect-example.patch +Patch61: 0062-tc-flower-Add-support-for-QinQ.patch +Patch62: 0063-utils-Move-BIT-macro-to-common-header.patch +Patch63: 0064-lib-make-resolve_hosts-variable-common.patch +Patch64: 0065-json_writer-add-new-json-handlers-null-float-with-fo.patch +Patch65: 0066-rdma-Add-MR-resource-tracking-information.patch +Patch66: 0067-rdma-add-infrastructure-for-RDMA-tool.patch +Patch67: 0068-rdma-add-man-pages-for-RDMA-tool.patch +Patch68: 0069-tc-f_flower-Add-support-for-matching-first-frag-pack.patch +Patch69: 0070-ss-enclose-IPv6-address-in-brackets.patch +Patch70: 0071-ip-address-Use-correct-max-attribute-value-in-print_.patch +Patch71: 0072-examples-Some-shell-fixes-to-cbq.init.patch +Patch72: 0073-ifcfg-Quote-left-hand-side-of-expression.patch +Patch73: 0074-tipc-node-Fix-socket-fd-check-in-cmd_node_get_addr.patch +Patch74: 0075-iproute_lwtunnel-Argument-to-strerror-must-be-positi.patch +Patch75: 0076-iproute_lwtunnel-csum_mode-value-checking-was-ineffe.patch +Patch76: 0077-ss-Don-t-leak-fd-in-tcp_show_netlink_file.patch +Patch77: 0078-tc-em_ipset-Don-t-leak-sockfd-on-error-path.patch +Patch78: 0079-ipvrf-Fix-error-path-of-vrf_switch.patch +Patch79: 0080-ifstat-Fix-memleak-in-error-case.patch +Patch80: 0081-ifstat-Fix-memleak-in-dump_kern_db-for-json-output.patch +Patch81: 0082-ss-Fix-potential-memleak-in-unix_stats_print.patch +Patch82: 0083-tipc-bearer-Fix-resource-leak-in-error-path.patch +Patch83: 0084-devlink-No-need-for-this-self-assignment.patch +Patch84: 0085-ipntable-No-need-to-check-and-assign-to-parms_rta.patch +Patch85: 0086-iproute-Fix-for-missing-Oifs-display.patch +Patch86: 0087-lib-rt_names-Drop-dead-code-in-rtnl_rttable_n2a.patch +Patch87: 0088-ss-Skip-useless-check-in-parse_hostcond.patch +Patch88: 0089-ss-Drop-useless-assignment.patch +Patch89: 0090-tc-m_gact-Drop-dead-code.patch +Patch90: 0091-ipaddress-Avoid-accessing-uninitialized-variable-lcl.patch +Patch91: 0092-iplink_can-Prevent-overstepping-array-bounds.patch +Patch92: 0093-ipmaddr-Avoid-accessing-uninitialized-data.patch +Patch93: 0094-ss-Use-C99-initializer-in-netlink_show_one.patch +Patch94: 0095-netem-maketable-Check-return-value-of-fstat.patch +Patch95: 0096-tc-q_multiq-Don-t-pass-garbage-in-TCA_OPTIONS.patch +Patch96: 0097-iproute-Check-mark-value-input.patch +Patch97: 0098-iplink_vrf-Complain-if-main-table-is-not-found.patch +Patch98: 0099-devlink-Check-return-code-of-strslashrsplit.patch +Patch99: 0100-lib-bpf-Don-t-leak-fp-in-bpf_find_mntpt.patch +Patch100: 0101-ifstat-nstat-Check-fdopen-return-value.patch +Patch101: 0102-tc-q_netem-Don-t-dereference-possibly-NULL-pointer.patch +Patch102: 0103-tc-tc_filter-Make-sure-filter-name-is-not-empty.patch +Patch103: 0104-tipc-bearer-Prevent-NULL-pointer-dereference.patch +Patch104: 0105-ipntable-Avoid-memory-allocation-for-filter.name.patch +Patch105: 0106-lib-fs-Fix-format-string-in-find_fs_mount.patch +Patch106: 0107-lib-inet_proto-Review-inet_proto_-a2n-n2a.patch +Patch107: 0108-lnstat_util-Simplify-alloc_and_open-a-bit.patch +Patch108: 0109-tc-m_xt-Fix-for-potential-string-buffer-overflows.patch +Patch109: 0110-lib-ll_map-Choose-size-of-new-cache-items-at-run-tim.patch +Patch110: 0111-ss-Make-struct-tcpstat-fields-timer-and-timeout-unsi.patch +Patch111: 0112-ss-Make-sure-scanned-index-value-to-unix_state_map-i.patch +Patch112: 0113-netem-maketable-Check-return-value-of-fscanf.patch +Patch113: 0114-lib-bpf-Check-return-value-of-write.patch +Patch114: 0115-lib-fs-Fix-and-simplify-make_path.patch +Patch115: 0116-lib-libnetlink-Don-t-pass-NULL-parameter-to-memcpy.patch +Patch116: 0117-utils-Implement-strlcpy-and-strlcat.patch +Patch117: 0118-Convert-the-obvious-cases-to-strlcpy.patch +Patch118: 0119-Convert-harmful-calls-to-strncpy-to-strlcpy.patch +Patch119: 0120-ipxfrm-Replace-STRBUF_CAT-macro-with-strlcat.patch +Patch120: 0121-tc_util-No-need-to-terminate-an-snprintf-ed-buffer.patch +Patch121: 0122-lnstat_util-Make-sure-buffer-is-NUL-terminated.patch +Patch122: 0123-utils-strlcpy-and-strlcat-don-t-clobber-dst.patch +Patch123: 0124-ip-6-tunnel-Avoid-copying-user-supplied-interface-na.patch +Patch124: 0125-tc-flower-No-need-to-cache-indev-arg.patch +Patch125: 0126-Check-user-supplied-interface-name-lengths.patch +Patch126: 0127-bpf-minor-cleanups-for-bpf_trace_pipe.patch +Patch127: 0128-ip-tunnel-Use-tnl_parse_key-to-parse-tunnel-key.patch +Patch128: 0129-man-ip-link-document-GRE-tunnels.patch +Patch129: 0130-gre-gre6-allow-clearing-i-o-key-seq-csum-flags.patch +Patch130: 0131-tc_filter-add-support-for-chain-index.patch +Patch131: 0132-tc-actions-add-helpers-to-parse-and-print-control-ac.patch +Patch132: 0133-tc-actions-introduce-support-for-goto-chain-action.patch +Patch133: 0134-tc-gact-fix-control-action-parsing.patch +Patch134: 0135-tc-don-t-print-error-message-on-miss-when-parsing-ac.patch +Patch135: 0136-tc-util-Don-t-call-NEXT_ARG_FWD-in-__parse_action_co.patch +Patch136: 0137-tc-fix-parsing-of-the-control-action.patch +Patch137: 0138-m_mirred-don-t-bail-if-the-control-action-is-missing.patch +Patch138: 0139-tc-m_tunnel_key-add-csum-nocsum-option.patch +Patch139: 0140-gre6-add-collect-metadata-support.patch +Patch140: 0141-tc_util-Silence-spurious-compiler-warning.patch +Patch141: 0142-ss-use-for-any-address-any-family-sockets.patch +Patch142: 0143-tc-introduce-tc_qdisc_block_exists-helper.patch +Patch143: 0144-tc_filter-resolve-device-name-before-parsing-filter.patch +Patch144: 0145-tc-introduce-support-for-block-handle-for-filter-ope.patch +Patch145: 0146-tc-implement-ingress-egress-block-index-attributes-f.patch +License: GPLv2+ and Public Domain +BuildRequires: bison +BuildRequires: flex +BuildRequires: iptables-devel >= 1.4.5 +BuildRequires: libdb-devel +BuildRequires: libmnl-devel +BuildRequires: libselinux-devel +BuildRequires: linuxdoc-tools +BuildRequires: pkgconfig +BuildRequires: psutils +BuildRequires: tex(cm-super-t1.enc) +BuildRequires: tex(dvips) +BuildRequires: tex(ecrm1000.tfm) +BuildRequires: tex(latex) +BuildRequires: tex(fullpage.sty) +%if 0%{?fedora} +BuildRequires: linux-atm-libs-devel +%endif +# For the UsrMove transition period +Conflicts: filesystem < 3 +Provides: /sbin/ip + +%description +The iproute package contains networking utilities (ip and rtmon, for example) +which are designed to use the advanced networking capabilities of the Linux +kernel. + +%package doc +Summary: ip and tc documentation with examples +Group: Applications/System +License: GPLv2+ +Requires: %{name} = %{version}-%{release} + +%description doc +The iproute documentation contains howtos and examples of settings. + +%package devel +Summary: iproute development files +Group: Development/Libraries +License: GPLv2+ +Requires: %{name} = %{version}-%{release} +Provides: iproute-static = %{version}-%{release} + +%description devel +The libnetlink static library. + +%prep +%autosetup -p1 -n %{name}-%{version}-%{baserelease} +sed -i 's/iproute-doc/%{name}-%{version}/' man/man8/lnstat.8 + +%build +export LIBDIR=/%{_libdir} +export IPT_LIB_DIR=/%{_lib}/xtables +export CFLAGS="${CFLAGS:-%optflags} -fno-exceptions" +./configure +make %{?_smp_mflags} +make -C doc + +%install +export SBINDIR=%{_sbindir} +export MANDIR=%{_mandir} +export LIBDIR=%{_libdir} +export CONFDIR=%{_sysconfdir}/iproute2 +export DOCDIR=%{_docdir} +%make_install +# libnetlink for iproute-devel +install -m644 include/libnetlink.h %{buildroot}%{_includedir} +install -m644 lib/libnetlink.a %{buildroot}%{_libdir} +# RHEL7 ships cbq tool in standard location +install -m755 examples/cbq.init-%{cbq_version} %{buildroot}%{_sbindir}/cbq +echo '.so man8/tc-cbq.8' > %{buildroot}%{_mandir}/man8/cbq.8 +install -d -m755 %{buildroot}%{_sysconfdir}/sysconfig/cbq +install -m644 %{SOURCE1} %{SOURCE2} %{buildroot}%{_sysconfdir}/sysconfig/cbq +# These man pages are missing in respective Makefile +for manpage in genl ifcfg ip-vrf; do + install -m644 man/man8/${manpage}.8 %{buildroot}%{_mandir}/man8 +done +# files in here are extracted manually from %{_builddir} +rm -rf %{buildroot}%{_docdir} +# RHEL7 does not support TIPC so remove tipc tool and its man pages +rm -f %{buildroot}%{_sbindir}/tipc +rm -rf %{buildroot}%{_mandir}/man8/tipc* +# Append deprecated values to rt_dsfield for compatibility reasons +cat %{SOURCE3} >>%{buildroot}%{_sysconfdir}/iproute2/rt_dsfield + +%files +%dir %{_sysconfdir}/iproute2 +%doc COPYING +%doc README README.decnet README.iproute2+tc README.distribution README.lnstat +%{_mandir}/man7/* +%{_mandir}/man8/* +%attr(644,root,root) %config(noreplace) %{_sysconfdir}/iproute2/* +%{_sbindir}/* +%dir %{_libdir}/tc/ +%{_libdir}/tc/* +%dir %{_sysconfdir}/sysconfig/cbq +%config(noreplace) %{_sysconfdir}/sysconfig/cbq/* +%{_datadir}/bash-completion/completions/tc + +%files doc +%doc COPYING +%doc doc/*.ps +%doc examples + +%files devel +%doc COPYING +%{_mandir}/man3/* +%{_libdir}/libnetlink.a +%{_includedir}/libnetlink.h +%{_includedir}/iproute2/bpf_elf.h + +%changelog +* Fri Jun 21 2019 Andrea Claudi [4.11.0-25.el7] +- tc: implement ingress/egress block index attributes for qdiscs (Andrea Claudi) [1721291] +- tc: introduce support for block-handle for filter operations (Andrea Claudi) [1721291] +- tc_filter: resolve device name before parsing filter (Andrea Claudi) [1721291] +- tc: introduce tc_qdisc_block_exists helper (Andrea Claudi) [1721291] + +* Wed Jun 12 2019 Andrea Claudi [4.11.0-24.el7] +- ss: use [::] for any address/any family sockets (Andrea Claudi) [1588122] + +* Wed Jun 05 2019 Andrea Claudi [4.11.0-23.el7] +- tc_util: Silence spurious compiler warning (Andrea Claudi) [1714660] +- gre6: add collect metadata support (Andrea Claudi) [1714660] +- tc: m_tunnel_key: add csum/nocsum option (Andrea Claudi) [1714660] +- m_mirred: don't bail if the control action is missing (Andrea Claudi) [1714660] +- tc: fix parsing of the control action (Andrea Claudi) [1714660] +- tc: util: Don't call NEXT_ARG_FWD() in __parse_action_control() (Andrea Claudi) [1714660] +- tc: don't print error message on miss when parsing action with default (Andrea Claudi) [1714660] +- tc: gact: fix control action parsing (Andrea Claudi) [1714660] +- tc/actions: introduce support for goto chain action (Andrea Claudi) [1714660] +- tc: actions: add helpers to parse and print control actions (Andrea Claudi) [1714660] +- tc_filter: add support for chain index (Andrea Claudi) [1714660] +- gre/gre6: allow clearing {,i,o}{key,seq,csum} flags (Andrea Claudi) [1714660] +- man: ip link: document GRE tunnels (Andrea Claudi) [1714660] +- ip/tunnel: Use tnl_parse_key() to parse tunnel key (Andrea Claudi) [1714660] + +* Tue Apr 30 2019 Andrea Claudi [4.11.0-22.el7] +- bpf: minor cleanups for bpf_trace_pipe (Andrea Claudi) [1465646] + +* Mon Apr 29 2019 Andrea Claudi [4.11.0-21.el7] +- Check user supplied interface name lengths (Andrea Claudi) [1465646] +- tc: flower: No need to cache indev arg (Andrea Claudi) [1465646] +- ip{6, }tunnel: Avoid copying user-supplied interface name around (Andrea Claudi) [1465646] +- utils: strlcpy() and strlcat() don't clobber dst (Andrea Claudi) [1465646] +- lnstat_util: Make sure buffer is NUL-terminated (Andrea Claudi) [1465646] +- tc_util: No need to terminate an snprintf'ed buffer (Andrea Claudi) [1465646] +- ipxfrm: Replace STRBUF_CAT macro with strlcat() (Andrea Claudi) [1465646] +- Convert harmful calls to strncpy() to strlcpy() (Andrea Claudi) [1465646] +- Convert the obvious cases to strlcpy() (Andrea Claudi) [1465646] +- utils: Implement strlcpy() and strlcat() (Andrea Claudi) [1465646] +- lib/libnetlink: Don't pass NULL parameter to memcpy() (Andrea Claudi) [1465646] +- lib/fs: Fix and simplify make_path() (Andrea Claudi) [1465646] +- lib/bpf: Check return value of write() (Andrea Claudi) [1465646] +- netem/maketable: Check return value of fscanf() (Andrea Claudi) [1465646] +- ss: Make sure scanned index value to unix_state_map is sane (Andrea Claudi) [1465646] +- ss: Make struct tcpstat fields 'timer' and 'timeout' unsigned (Andrea Claudi) [1465646] +- lib/ll_map: Choose size of new cache items at run-time (Andrea Claudi) [1465646] +- tc/m_xt: Fix for potential string buffer overflows (Andrea Claudi) [1465646] +- lnstat_util: Simplify alloc_and_open() a bit (Andrea Claudi) [1465646] +- lib/inet_proto: Review inet_proto_{a2n,n2a}() (Andrea Claudi) [1465646] +- lib/fs: Fix format string in find_fs_mount() (Andrea Claudi) [1465646] +- ipntable: Avoid memory allocation for filter.name (Andrea Claudi) [1465646] +- tipc/bearer: Prevent NULL pointer dereference (Andrea Claudi) [1465646] +- tc/tc_filter: Make sure filter name is not empty (Andrea Claudi) [1465646] +- tc/q_netem: Don't dereference possibly NULL pointer (Andrea Claudi) [1465646] +- ifstat, nstat: Check fdopen() return value (Andrea Claudi) [1465646] +- lib/bpf: Don't leak fp in bpf_find_mntpt() (Andrea Claudi) [1465646] +- devlink: Check return code of strslashrsplit() (Andrea Claudi) [1465646] +- iplink_vrf: Complain if main table is not found (Andrea Claudi) [1465646] +- iproute: Check mark value input (Andrea Claudi) [1465646] +- tc/q_multiq: Don't pass garbage in TCA_OPTIONS (Andrea Claudi) [1465646] +- netem/maketable: Check return value of fstat() (Andrea Claudi) [1465646] +- ss: Use C99 initializer in netlink_show_one() (Andrea Claudi) [1465646] +- ipmaddr: Avoid accessing uninitialized data (Andrea Claudi) [1465646] +- iplink_can: Prevent overstepping array bounds (Andrea Claudi) [1465646] +- ipaddress: Avoid accessing uninitialized variable lcl (Andrea Claudi) [1465646] +- tc/m_gact: Drop dead code (Andrea Claudi) [1465646] +- ss: Drop useless assignment (Andrea Claudi) [1465646] +- ss: Skip useless check in parse_hostcond() (Andrea Claudi) [1465646] +- lib/rt_names: Drop dead code in rtnl_rttable_n2a() (Andrea Claudi) [1465646] +- iproute: Fix for missing 'Oifs:' display (Andrea Claudi) [1465646] +- ipntable: No need to check and assign to parms_rta (Andrea Claudi) [1465646] +- devlink: No need for this self-assignment (Andrea Claudi) [1465646] +- tipc/bearer: Fix resource leak in error path (Andrea Claudi) [1465646] +- ss: Fix potential memleak in unix_stats_print() (Andrea Claudi) [1465646] +- ifstat: Fix memleak in dump_kern_db() for json output (Andrea Claudi) [1465646] +- ifstat: Fix memleak in error case (Andrea Claudi) [1465646] +- ipvrf: Fix error path of vrf_switch() (Andrea Claudi) [1465646] +- tc/em_ipset: Don't leak sockfd on error path (Andrea Claudi) [1465646] +- ss: Don't leak fd in tcp_show_netlink_file() (Andrea Claudi) [1465646] +- iproute_lwtunnel: csum_mode value checking was ineffective (Andrea Claudi) [1465646] +- iproute_lwtunnel: Argument to strerror must be positive (Andrea Claudi) [1465646] +- tipc/node: Fix socket fd check in cmd_node_get_addr() (Andrea Claudi) [1465646] +- ifcfg: Quote left-hand side of [ ] expression (Andrea Claudi) [1465646] +- examples: Some shell fixes to cbq.init (Andrea Claudi) [1465646] +- ip-address: Use correct max attribute value in print_vf_stats64() (Andrea Claudi) [1679749] +- ss: enclose IPv6 address in brackets (Andrea Claudi) [1588122] +- tc: f_flower: Add support for matching first frag packets (Andrea Claudi) [1559814] + +* Thu Mar 28 2019 Andrea Claudi [4.11.0-20.el7] +- rdma: add man pages for RDMA tool (Andrea Claudi) [1642479] + +* Wed Mar 27 2019 Andrea Claudi [4.11.0-19.el7] +- rdma: add infrastructure for RDMA tool (Andrea Claudi) [1642479 1641914] +- rdma: Add MR resource tracking information (Andrea Claudi) [1642479 1641914] +- json_writer: add new json handlers (null, float with format, lluint, hu) (Andrea Claudi) [1642479 1641914] +- lib: make resolve_hosts variable common (Andrea Claudi) [1642479 1641914] +- utils: Move BIT macro to common header (Andrea Claudi) [1642479 1641914] +- tc: flower: Add support for QinQ (Andrea Claudi) [1642347] +- man: tc-vlan.8: Fix for incorrect example (Andrea Claudi) [1593630] +- man: ip-route.8: ssthresh parameter is NUMBER (Andrea Claudi) [1593628] +- devlink: Add param command support (Andrea Claudi) [1644731] +- devlink: Update man pages and add resource man (Andrea Claudi) [1644731] +- devlink: Add support for hot reload (Andrea Claudi) [1644731] +- devlink: Add support for devlink resource abstraction (Andrea Claudi) [1644731] + +* Mon Mar 18 2019 Andrea Claudi [4.11.0-18.el7] +- ip: Add violation counters to VF statisctics (Andrea Claudi) [1471680] + +* Mon Mar 11 2019 Phil Sutter [4.11.0-17.el7] +- ip-link: Fix listing of alias interfaces (Phil Sutter) [1673226] + +* Thu Feb 21 2019 Phil Sutter [4.11.0-16.el7] +- ip-route: Fix nexthop encap parsing (Phil Sutter) [1624656] +- man: ip-route.8: Document nexthop limit (Phil Sutter) [1624656] +- ip-route: Fix segfault with many nexthops (Phil Sutter) [1624656] +- iproute: Abort if nexthop cannot be parsed (Phil Sutter) [1624656] + +* Wed Feb 06 2019 Phil Sutter [4.11.0-15.el7] +- tc/act_tunnel_key: Enable setup of tos and ttl (Phil Sutter) [1641909] +- tc/flower: Add match on encapsulating tos/ttl (Phil Sutter) [1641909] +- Update kernel headers (Phil Sutter) +- tc: include stdint.h explicitly for UINT16_MAX (Phil Sutter) [1641909] +- tc: m_tunnel_key: Allow key-less tunnels (Phil Sutter) [1658506] +- tc: m_tunnel_key: reformat the usage text (Phil Sutter) [1658506] + +* Tue Mar 06 2018 Phil Sutter [4.11.0-14.el7] +- ip-link: Fix use after free in nl_get_ll_addr_len() (Phil Sutter) [1550097] + +* Fri Dec 15 2017 Phil Sutter [4.11.0-13.el7] +- tc: fix command "tc actions del" hang issue (Phil Sutter) [1526394] + +* Wed Dec 06 2017 Phil Sutter [4.11.0-12.el7] +- man: tc-csum.8: Fix inconsistency in example description (Phil Sutter) [1417162] +- link_gre6: Detect invalid encaplimit values (Phil Sutter) [1459600] + +* Mon Nov 13 2017 Phil Sutter [4.11.0-11.el7] +- ss: add AF_VSOCK support (Stefano Brivio) [1472759] +- ss: allow AF_FAMILY constants >32 (Stefano Brivio) [1472759] +- uapi: add include linux/vm_sockets_diag.h (Stefano Brivio) [1472759] +- iproute: build more easily on Android (Phil Sutter) [1472759] + +* Fri Nov 10 2017 Phil Sutter [4.11.0-10.el7] +- tc: flower: add support for matching on ip tos and ttl (Kamal Heib) [1456539] +- iplink: Update usage in help message (Kamal Heib) [1456539] +- tc: flower: add support for tcp flags (Kamal Heib) [1456539] +- devlink: Add option to set and show eswitch encapsulation support (Kamal Heib) [1456539] +- pedit: Introduce ipv6 support (Kamal Heib) [1456539] +- pedit: Check for extended capability in protocol parser (Kamal Heib) [1456539] +- pedit: Do not allow using retain for too big fields (Kamal Heib) [1456539] +- pedit: Fix a typo in warning (Kamal Heib) [1456539] +- tc: Reflect HW offload status (Kamal Heib) [1456539] +- devlink: Add support for pipeline debug (dpipe) (Kamal Heib) [1456539] +- devlink: Change netlink attribute validation (Kamal Heib) [1456539] +- Update linux headers (Phil Sutter) [1456539] + +* Wed Nov 08 2017 Phil Sutter [4.11.0-9.el7] +- lib/libnetlink: update rtnl_talk to support malloc buff at run time (Hangbin Liu) [1380803] +- lib/libnetlink: re malloc buff if size is not enough (Hangbin Liu) [1380803] +- iplink: double the buffer size also in iplink_get() (Hangbin Liu) [1380803] +- iplink: check for message truncation in iplink_get() (Hangbin Liu) [1380803] +- iproute: Add support for extended ack to rtnl_talk (Hangbin Liu) [1380803] +- libnetlink: drop unused parameter to rtnl_dump_done (Hangbin Liu) [1380803] +- netlink: Change rtnl_dump_done to always show error (Hangbin Liu) [1380803] + +* Fri Oct 20 2017 Phil Sutter [4.11.0-8.el7] +- Fix subpackage dependencies (don't require base package ARCH) (Phil Sutter) [1489548] + +* Wed Oct 18 2017 Phil Sutter [4.11.0-7.el7] +- Make sub-packages depend on base package (Phil Sutter) [1489548] + +* Fri Oct 06 2017 Phil Sutter [4.11.0-6.el7] +- link_gre6: Fix for changing tclass/flowlabel (Phil Sutter) [1487486] +- utils: return default family when rtm_family is not RTNL_FAMILY_IPMR/IP6MR (Stefano Brivio) [1475762] +- netns: avoid directory traversal (Phil Sutter) [1468529] +- Disable -fexceptions CFLAG passed by build system (Phil Sutter) [1418715] + +* Thu Sep 28 2017 Phil Sutter [4.11.0-5.el7] +- ip neigh: allow flush FAILED neighbour entry (Matteo Croce) [1469945] +- tc: fix typo in manpage (Phil Sutter) [1417162] +- link_gre6: really support encaplimit option (Phil Sutter) [1459600] +- tc: m_xt: Prevent a segfault in libipt (Phil Sutter) [1465599] + +* Wed Sep 06 2017 Phil Sutter [4.11.0-4.el7] +- tc-simple.8: Fix one more reference to non-existing tc-actions.8 (Phil Sutter) [1477523] + +* Wed Sep 06 2017 Phil Sutter [4.11.0-3.el7] +- lib/bpf: Fix bytecode-file parsing (Phil Sutter) [1477491] +- tc-simple.8: Fix reference to non-existing tc-actions.8 (Phil Sutter) [1477523] +- ss: Fix for added diag support check (Phil Sutter) [1487152] + +* Fri Aug 11 2017 Phil Sutter [4.11.0-2.el7] +- rt_dsfield: Ship deprecated values for compatibility (Phil Sutter) [1480136] +- bpf: Make bytecode-file reading a little more robust (Phil Sutter) [1477491] +- tc: fix m_simple usage (Phil Sutter) [1477523] +- tc-simple: Fix documentation (Phil Sutter) [1477523] +- Really fix get_addr() and get_prefix() error messages (Phil Sutter) [1477206] + +* Tue Jun 27 2017 Phil Sutter [4.11.0-1.el7] +- Rebase onto upstream version 4.11.0 (Phil Sutter) [1418715] + +* Tue Jun 13 2017 Sabrina Dubroca [3.10.0-87.el7] +- devlink: Add e-switch support (Sabrina Dubroca) [1459772] +- devlink: whitespace cleanup (Sabrina Dubroca) [1459772] +- devlink: Convert conditional in dl_argv_handle_port() to switch() (Sabrina Dubroca) [1459772] +- devlink: write usage help messages to stderr (Sabrina Dubroca) [1459772] +- devlink: Add usage help for eswitch subcommand (Sabrina Dubroca) [1459772] +- devlink: Call dl_free in early exit case (Sabrina Dubroca) [1459772] + +* Mon Jun 12 2017 Eric Garver [3.10.0-86.el7] +- Revert "ip-route man: add usage and description for lwtunnel encap attributes" (Eric Garver) [1459975] +- Revert "lwtunnel: implement support for ip6 encap" (Eric Garver) [1459975] +- Revert "lwtunnel: fix argument parsing" (Eric Garver) [1459975] +- Revert "lwtunnel: Add encapsulation support to ip route" (Eric Garver) [1459975] + +* Mon Jun 12 2017 Eric Garver [3.10.0-85.el7] +- Revert "vxlan: Add support for remote checksum offload" (Eric Garver) [1459975] + +* Wed May 31 2017 Ivan Vecera [3.10.0-84.el7] +- tc: Add support for the matchall traffic classifier. (Ivan Vecera) [1435624] +- tc: man: Add man entry for the matchall classifier. (Ivan Vecera) [1435624] +- tc: add missing limits.h header (Ivan Vecera) [1435624] +- tc: man: matchall: Fix example indentation (Ivan Vecera) [1435624] +- tc: matchall: Print skip flags when dumping a filter (Ivan Vecera) [1435624] +- tc, clsact: add clsact frontend (Ivan Vecera) [1435624] + +* Thu May 18 2017 Phil Sutter [3.10.0-83.el7] +- vxlan: Add support for remote checksum offload (Phil Sutter) [1446363] + +* Thu Apr 20 2017 Phil Sutter [3.10.0-82.el7] +- ip-route: Prevent some other double spaces in output (Phil Sutter) [1374446] + +* Wed Apr 05 2017 Phil Sutter [3.10.0-81.el7] +- man: ip-link: Specify min/max values for bridge slave priority and cost (Phil Sutter) [1374360] +- man: ip-link.8: document bridge options (Phil Sutter) [1373869] + +* Tue Apr 04 2017 Phil Sutter [3.10.0-80.el7] +- tc: m_xt: Drop needless parentheses from #if checks (Phil Sutter) [1326726] +- tc: m_xt: Fix segfault with iptables-1.6.0 (Phil Sutter) [1326726] +- m_xt: whitespace cleanup (Phil Sutter) [1326726] +- tc: m_xt: Introduce get_xtables_target_opts() (Phil Sutter) [1326726] +- tc: m_xt: Simplify argc adjusting in parse_ipt() (Phil Sutter) [1326726] +- tc: m_xt: Get rid of iargc variable in parse_ipt() (Phil Sutter) [1326726] +- tc: m_xt: Get rid of rargc in parse_ipt() (Phil Sutter) [1326726] +- tc: m_xt: Drop unused variable fw in parse_ipt() (Phil Sutter) [1326726] +- tc: m_xt: Get rid of one indentation level in parse_ipt() (Phil Sutter) [1326726] +- tc: m_xt: Fix indenting (Phil Sutter) [1326726] +- tc: m_xt: Fix segfault when adding multiple actions at once (Phil Sutter) [1326726] +- tc: m_xt: Prevent segfault with standard targets (Phil Sutter) [1326726] +- man: update doc after support of ESN and anti-replay window (Phil Sutter) [1425059] +- xfrm: add support of ESN and anti-replay window (Phil Sutter) [1425059] + +* Fri Mar 17 2017 Phil Sutter [3.10.0-79.el7] +- man: ss.8: Add missing protocols to description of -A (Phil Sutter) [1063934] + +* Fri Mar 17 2017 Phil Sutter [3.10.0-78.el7] +- ip-address: Support filtering by slave type, too (Phil Sutter) [1375434] +- tc: don't accept qdisc 'handle' greater than ffff (Davide Caratti) [1375393] +- macsec: show usage even if the module is not available (Timothy Redaelli) [1367071] +- libgenl: introduce genl_init_handle (Timothy Redaelli) [1367071] +- tc: flower: Fix parsing ip address (Phil Sutter) [1422629] +- tc: flower: support masked ICMP code and type match (Phil Sutter) [1422629] +- tc: flower: provide generic masked u8 print helper (Phil Sutter) [1422629] +- tc: flower: provide generic masked u8 parser helper (Phil Sutter) [1422629] +- tc: flower: Update documentation to indicate ARP takes IPv4 prefixes (Phil Sutter) [1422629] +- tc: flower: use correct type when calling flower_icmp_attr_type (Phil Sutter) [1422629] +- f_flower: don't set TCA_FLOWER_KEY_ETH_TYPE for "protocol all" (Phil Sutter) [1422629] +- tc: flower: Refactor matching flags to be more user friendly (Phil Sutter) [1422629] +- tc: flower: Support matching ARP (Phil Sutter) [1422629] +- kernel headers update (Phil Sutter) [1422629] +- tc: flower: Fix incorrect error msg about eth type (Phil Sutter) [1422629] +- tc: flower: Add missing err check when parsing flower options (Phil Sutter) [1422629] +- tc: flower: Fix flower output for src and dst ports (Phil Sutter) [1422629] +- tc: flower: Update dest UDP port documentation (Phil Sutter) [1422629] +- tc: flower: support matching flags (Phil Sutter) [1422629] +- tc/cls_flower: Add to the usage encapsulation dest UDP port (Phil Sutter) [1422629] +- tc: flower: Allow *_mac options to accept a mask (Phil Sutter) [1422629] +- tc: flower: document that *_ip parameters take a PREFIX as an argument. (Phil Sutter) [1422629] +- tc: flower: Fix typo and style in flower man page (Phil Sutter) [1422629] +- tc/cls_flower: Add dest UDP port to tunnel params (Phil Sutter) [1422629] +- tc: flower: support matching on ICMP type and code (Phil Sutter) [1422629] +- tc: flower: introduce enum flower_endpoint (Phil Sutter) [1422629] +- tc: flower: make use of flower_port_attr_type() safe and silent (Phil Sutter) [1422629] +- tc: flower: correct name of ip_proto parameter to flower_parse_port() (Phil Sutter) [1422629] +- tc: flower: document SCTP ip_proto (Phil Sutter) [1422629] +- tc: flower: remove references to eth_type in manpage (Phil Sutter) [1422629] +- tc/cls_flower: Classify packet in ip tunnels (Phil Sutter) [1422629] +- libnetlink: Introduce rta_getattr_be*() (Phil Sutter) [1422629] +- tc: flower: Support matching on SCTP ports (Phil Sutter) [1422629] +- tc: flower: Fix usage message (Phil Sutter) [1422629] +- tc: flower checkpatch cleanups (Phil Sutter) [1422629] +- tc: flower: Introduce vlan support (Phil Sutter) [1422629] +- tc: flower: Add skip_{hw|sw} support (Phil Sutter) [1422629] +- utils: add get_be{16, 32, 64}, use them where possible (Phil Sutter) [1422629] +- lib/utils: introduce rt_addr_n2a_rta() (Phil Sutter) [1422629] +- utils: make rt_addr_n2a() non-reentrant by default (Phil Sutter) [1422629] +- make format_host non-reentrant by default (Phil Sutter) [1422629] +- tc: flower no need to specify the ethertype (Phil Sutter) [1422629] +- ip6tunnel: print local/remote addresses like iptunnel does (Phil Sutter) [1422629] +- tc: ship filter man pages and refer to them in tc.8 (Phil Sutter) [1422629] +- tc: add a man page for flower filter (Phil Sutter) [1422629] +- tc: improve filter help texts a bit (Phil Sutter) [1422629] +- tc: add support for Flower classifier (Phil Sutter) [1422629] +- ip: make -resolve addr to print names rather than addresses (Phil Sutter) [1422629] + +* Tue Feb 28 2017 Phil Sutter [3.10.0-77.el7] +- change of rtnetlink to use RTN_F_OFFLOAD (Phil Sutter) [1417289] +- bridge: add support for the multicast flood flag (Phil Sutter) [1417289] +- RH-INTERNAL: Update kernel headers to v4.10.0 (Phil Sutter) [1417289] +- bridge: man: fix STP LISTENING description (Phil Sutter) [1417289] +- bridge: man: fix BPUD typo (Phil Sutter) [1417289] +- bridge: man: fix "brige" typo (Phil Sutter) [1417289] +- bridge: vlan: fix a few "fdb" typos in vlan doc (Phil Sutter) [1417289] +- bridge: vlan: add support to filter by vlan id (Phil Sutter) [1417289] +- bridge: mdb: add support to filter by vlan id (Phil Sutter) [1417289] +- bridge: fdb: add support to filter by vlan id (Phil Sutter) [1417289] +- bridge: code cleanup (Phil Sutter) [1417289] +- bridge: mdb: add support for extended router port information (Phil Sutter) [1417289] +- bridge: mdb: add support for offloaded mdb entries (Phil Sutter) [1417289] +- bridge: mdb: add user-space support for extended attributes (Phil Sutter) [1417289] +- iplink: bridge: remove unnecessary returns (Phil Sutter) [1417289] +- bridge: add support for dynamic fdb entries (Phil Sutter) [1417289] +- iplink: bridge_slave: export read-only values (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_STARTUP_QUERY_INTVL (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_QUERY_RESPONSE_INTVL (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_QUERY_INTVL (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_QUERIER_INTVL (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_MEMBERSHIP_INTVL (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_LAST_MEMBER_INTVL (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_STARTUP_QUERY_CNT (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_LAST_MEMBER_CNT (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_HASH_MAX (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_HASH_ELASTICITY (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_QUERIER (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_QUERY_USE_IFADDR (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_SNOOPING (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_MCAST_ROUTER (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_VLAN_DEFAULT_PVID (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_GROUP_ADDR (Phil Sutter) [1417289] +- iplink: bridge: add support for IFLA_BR_GROUP_FWD_MASK (Phil Sutter) [1417289] +- iplink: bridge: export read-only timers (Phil Sutter) [1417289] +- iplink: bridge: export root_(port|path_cost), topology_change and change_detected (Phil Sutter) [1417289] +- iplink: bridge: export bridge_id and designated_root (Phil Sutter) [1417289] +- bridge: support for static fdb entries (Phil Sutter) [1417289] +- bridge.8: minor formatting cleanup (Phil Sutter) [1417289] +- bridge.8: document fdb replace command (Phil Sutter) [1417289] +- bridge: fdb: minor syntax fix in help text (Phil Sutter) [1417289] +- bridge: add calls to fflush in fdb and mdb print functions (Phil Sutter) [1417289] +- ip, bridge: document -timestamp option (Phil Sutter) [1417289] +- bridge: add batch command support (Phil Sutter) [1417289] +- iplink: Add support for IFLA_BR_VLAN_PROTOCOL attribute (Phil Sutter) [1417289] +- iplink: add support for IFLA_BR_VLAN_FILTERING attribute (Phil Sutter) [1417289] +- bridge: mdb: add deleted when monitoring delmdb event (Phil Sutter) [1417289] +- bridge: mdb: add support for vlans (Phil Sutter) [1417289] +- ip link: proto_down config and display. (Phil Sutter) [1417289] +- bridge: mdb: add support for router add/del notifications monitoring (Phil Sutter) [1417289] +- ip: fix all the checkpatch warnings (Phil Sutter) [1417289] +- iproute2: ipa: show switch id (Phil Sutter) [1417289] +- ip: return correct exit code on route failure (Phil Sutter) [1417289] +- iproute2: unify naming for entries offloaded to hardware (Phil Sutter) [1417289] +- route: label externally offloaded routes (Phil Sutter) [1417289] +- fix ip -force -batch to continue on errors (Phil Sutter) [1417289] +- bridge link: add support to specify master (Phil Sutter) [1417289] +- Allow specifying bridge port STP state by name rather than number. (Phil Sutter) [1417289] +- iproute2: bridge vlan show new option to print ranges (Phil Sutter) [1417289] +- iproute2: bridge: support vlan range adds (Phil Sutter) [1417289] +- bridge/link: add learning_sync policy flag (Phil Sutter) [1417289] +- bridge link: add option 'self' (Phil Sutter) [1417289] +- bridge/fdb: add flag/indication for FDB entry synced from offload device (Phil Sutter) [1417289] +- bridge/fdb: fix statistics output spacing (Phil Sutter) [1417289] +- iproute2 bridge: bring to above par with brctl show macs (Phil Sutter) [1417289] +- link dump filter (Phil Sutter) [1417289] +- bridge: Make filter_index match in signedness (Phil Sutter) [1417289] +- bridge: Add learning and flood support (Phil Sutter) [1417289] +- iproute2: ipa: show port id (Phil Sutter) [1417289] +- bridge: fix reporting of IPv6 addresses (Phil Sutter) [1417289] +- iplink: bridge_slave: add support for IFLA_BRPORT_PROXYARP_WIFI (Phil Sutter) [1374360] +- iplink: bridge_slave: add support for IFLA_BRPORT_PROXYARP (Phil Sutter) [1374360] +- Revert "man: ip-link: Remove bits about proxy_arp and proxy_arp_wifi" (Phil Sutter) [1374360] + +* Tue Feb 21 2017 Phil Sutter [3.10.0-76.el7] +- iplink: add missing link type (Phil Sutter) [1374493] +- man: ip-link: Remove bits about proxy_arp and proxy_arp_wifi (Phil Sutter) [1374360] +- iplink: bridge_slave: add support for IFLA_BRPORT_FAST_LEAVE (Phil Sutter) [1374360] +- iplink: bridge_slave: add support for IFLA_BRPORT_MULTICAST_ROUTER (Phil Sutter) [1374360] +- macsec: fix input range of 'icvlen' parameter (Phil Sutter) [1373121] + +* Tue Feb 21 2017 Phil Sutter [3.10.0-75.el7] +- ip: vfinfo: remove code duplication for IFLA_VF_RSS_QUERY_EN (Timothy Redaelli) [1264149] +- ipaddress: Print IFLA_VF_QUERY_RSS_EN setting (Timothy Redaelli) [1264149] +- ipaddress: Simplify vf_info parsing (Timothy Redaelli) [1264149] +- ip-route: Prevent some double spaces in output (Timothy Redaelli) [1374446] +- ip-route man: add usage and description for lwtunnel encap attributes (Phil Sutter) [1329730] +- lwtunnel: implement support for ip6 encap (Phil Sutter) [1329730] +- lwtunnel: fix argument parsing (Phil Sutter) [1329730] +- lwtunnel: Add encapsulation support to ip route (Phil Sutter) [1329730] +- libnetlink: introduce rta_nest and u8, u16, u64 helpers for nesting within rtattr (Phil Sutter) [1329730] +- utils: add missing return value (Phil Sutter) [1329730] +- remove unnecessary extern (Phil Sutter) [1329730] +- ss: Add support for SCTP protocol (Phil Sutter) [1063934] +- include: Add linux/sctp.h (Phil Sutter) [1063934] +- update inet_diag.h header (Phil Sutter) [1063934] +- macsec: fix byte ordering on input/display of 'sci' (Davide Caratti) [1355629] +- macsec: fix input of 'port', improve documentation of 'address' (Davide Caratti) [1355629] +- misc/ss: tcp cwnd should be unsigned (Davide Caratti) [1375215] + +* Thu Aug 25 2016 Phil Sutter [3.10.0-74.el7] +- ip route: restore_handler should check tb[RTA_PREFSRC] for local networks (Phil Sutter) [1362728] + +* Thu Aug 18 2016 Phil Sutter [3.10.0-73.el7] +- ip-link: add missing {min,max}_tx_rate to help text (Phil Sutter) [1340914] +- man: ip-link.8: Document missing geneve options (Phil Sutter) [1339178] +- iproute.spec: Fix for missing cbq.8 man page (Phil Sutter) [1362551] + +* Thu Aug 04 2016 Phil Sutter [3.10.0-72.el7] +- macsec: cipher and icvlen can be set separately (Davide Caratti) [1354408] +- ip {link,address}: add 'macsec' item to TYPE list (Davide Caratti) [1354702] +- man: macsec: fix macsec related typos (Davide Caratti) [1354702 1354319] +- Revert "Allow specifying bridge port STP state by name rather than number." (Phil Sutter) [1288042] +- Revert "fix ip -force -batch to continue on errors" (Phil Sutter) [1288042] +- Revert "ip: fix exit code for addrlabel" (Phil Sutter) [1288042] +- Revert "link dump filter" (Phil Sutter) [1288042] +- Revert "ip: return correct exit code on route failure" (Phil Sutter) [1288042] +- Revert "ip: fix exit code for rule failures" (Phil Sutter) [1288042] +- man: ip-link: Drop fou and gue related documentation (Phil Sutter) [1013584] +- man: ip-link, ip-address: Drop references to ipvlan (Phil Sutter) [1013584] +- doc, man: ip-rule: Remove incorrect statement about rule 0 (Phil Sutter) [1362561] + +* Sat Jul 30 2016 Phil Sutter [3.10.0-71.el7] +- ip: add paren to silence warning (Phil Sutter) [1340914] +- Fix MAC address length check (Jakub Sitnicki) [1253767 1271580] +- iplink: Check address length via netlink (Jakub Sitnicki) [1253767 1271580] +- iplink: Add missing variable initialization (Jakub Sitnicki) [1253767 1271580] +- ip link: Fix crash on older kernels when show VF dev (Jakub Sitnicki) [1340914] +- ip link: Remove unnecessary device checking (Jakub Sitnicki) [1340914] +- ip: check for missing dev arg when doing VF rate (Jakub Sitnicki) [1340914] +- Add support to configure SR-IOV VF minimum and maximum Tx rate through ip tool (Jakub Sitnicki) [1340914] + +* Fri Jul 22 2016 Phil Sutter [3.10.0-70.el7] +- man: ip-link: Document query_rss option (Phil Sutter) [1264146] +- Document VF link state control in the ip-link man page (Phil Sutter) [1264146] +- ipneigh: List all nud states in help output (Phil Sutter) [1276661] +- iproute2: ip-route.8.in: Add expires option for ip route (Phil Sutter) [1357020] +- ip route: timeout for routes has to be set in seconds (Phil Sutter) [1357020] +- route: allow routes to be configured with expire values (Phil Sutter) [1357020] + +* Wed Jul 20 2016 Phil Sutter [3.10.0-69.el7] +- ip-address.8: Document autojoin flag (Phil Sutter) [1333513] +- ip-link.8: Fix font choices (Phil Sutter) [1269528] +- ip-link: fix man page warnings (Phil Sutter) [1269528] +- vxlan: fix help and man text (Phil Sutter) [1269528] +- ip-link: fix unterminated string in manpage (Phil Sutter) [1269528] +- ip-link.8: Add slave type option descriptions (Phil Sutter) [1269528] +- ip-link.8: Place 'ip link set' warning more prominently (Phil Sutter) [1269528] +- ip-link.8: Extend type list in synopsis (Phil Sutter) [1269528] +- man ip-link: Remove extra GROUP explanation (Phil Sutter) [1269528] +- man ip-link: Add short description about 'group' (Phil Sutter) [1269528] +- man ip-link: Add deleting links by group (Phil Sutter) [1269528] +- iplink: bond_slave: Add missing help functions (Phil Sutter) [1269528] +- iplink: List valid 'type' argument in ip link help text (Phil Sutter) [1269528] +- ip link: Add group in usage() for 'ip link delete' (Phil Sutter) [1269528] +- iproute: constify rtattr_cmp (Phil Sutter) [1348133] +- ip route: restore route entries in correct order (Phil Sutter) [1348133] + +* Sat Jul 09 2016 Phil Sutter [3.10.0-68.el7] +- devlink: add manpage for shared buffer (Phil Sutter) [1342515] +- devlink: implement shared buffer occupancy control (Phil Sutter) [1342515] +- devlink: implement shared buffer support (Phil Sutter) [1342515] +- devlink: allow to parse both devlink and port handle in the same time (Phil Sutter) [1342515] +- devlink: introduce dump filtering function (Phil Sutter) [1342515] +- devlink: split dl_argv_parse_put to parse and put parts (Phil Sutter) [1342515] +- devlink: introduce helper to print out nice names (ifnames) (Phil Sutter) [1342515] +- devlink: introduce pr_out_port_handle helper (Phil Sutter) [1342515] +- list: add list_add_tail helper (Phil Sutter) [1342515] +- list: add list_for_each_entry_reverse macro (Phil Sutter) [1342515] +- devlink: fix "devlink port" help message (Phil Sutter) [1342515] +- devlink: ignore build result (Phil Sutter) [1342515] +- add devlink tool (Phil Sutter) [1342515] +- include: add linked list implementation from kernel (Phil Sutter) [1342515] +- configure: cleanup (Phil Sutter) [1342515] +- configure: Check for libmnl (Phil Sutter) [1342515] +- configure: Add check for the doc tools (Phil Sutter) [1342515] +- add if_macsec header (Davide Caratti) [1300765] +- RH-INTERNAL: update kernel headers to v4.6.0 (Davide Caratti) [1300765] +- utils: fix hex digits parsing in hexstring_a2n() (Davide Caratti) [1300765] +- ip: add MACsec support (Davide Caratti) [1300765] +- utils: provide get_hex to read a hex digit from a char (Davide Caratti) [1300765] +- utils: add get_be{16, 32, 64}, use them where possible (Davide Caratti) [1300765] +- utils: make hexstring_a2n provide the number of hex digits parsed (Davide Caratti) [1300765] +- lib/ll_addr: improve ll_addr_n2a() a bit (Davide Caratti) [1300765] +- iproute2: arpd: use ll_addr_a2n and ll_addr_n2a (Davide Caratti) [1300765] +- iproute2: utils: change hexstring_n2a and hexstring_a2n to do not work with ":" (Davide Caratti) [1300765] + +* Tue Jul 05 2016 Phil Sutter [3.10.0-67.el7] +- geneve: fix IPv6 remote address reporting (Phil Sutter) [1339178] +- geneve: add support to set flow label (Phil Sutter) [1339178] +- geneve: Add support for configuring UDP checksums. (Phil Sutter) [1339178] +- geneve: add support for lwt tunnel creation and dst port selection (Phil Sutter) [1339178] +- geneve: add support for IPv6 link partners (Phil Sutter) [1339178] +- iplink_geneve: add tos configuration at link creation (Phil Sutter) [1339178] +- iplink_geneve: add ttl configuration at link creation (Phil Sutter) [1339178] +- iproute2: update ip-link.8 for geneve tunnels (Phil Sutter) [1339178] +- iproute2: GENEVE support (Phil Sutter) [1339178] +- man: ip-address, ip-link: Document 'type' quirk (Phil Sutter) [1341343] +- man: ip-link.8: Fix 'ip link delete' description (Phil Sutter) [1341343] + +* Thu Jun 16 2016 Phil Sutter [3.10.0-66.el7] +- ip-link: Support printing VF trust setting (Phil Sutter) [1302119] +- iplink: Support VF Trust (Phil Sutter) [1302119] +- add new IFLA_VF_TRUST netlink attribute (Phil Sutter) [1302119] +- ipaddress: Allow listing addresses by type (Phil Sutter) [1341343] +- man ip-link: Small example of 'ip link show master' (Phil Sutter) [1341343] +- ip link: Show devices by type (Phil Sutter) [1341343] +- ip link: Allow to filter devices by master dev (Phil Sutter) [1341343] + +* Fri Jun 03 2016 Phil Sutter [3.10.0-65.el7] +- man: ip, ip-link: Fix ip option location (Phil Sutter) [1251186] +- ip: enable configuring multicast group autojoin (Phil Sutter) [1333513] +- ss: Fix accidental state filter override (Phil Sutter) [1318005] +- ss: Drop silly assignment (Phil Sutter) [1318005] +- ss: Fix wrong filter behaviour (Phil Sutter) [1318005] + +* Wed Mar 30 2016 Phil Sutter [3.10.0-64.el7] +- Add missing build dependency to spec file (Phil Sutter) [1275426] + +* Wed Mar 30 2016 Phil Sutter [3.10.0-63.el7] +- doc/tc-filters.tex: Drop overly subjective paragraphs (Phil Sutter) [1275426] +- doc: Add my article about tc, filters and actions (Phil Sutter) [1275426] +- gitignore: Ignore 'doc' files generated at runtime (Phil Sutter) [1275426] +- tests: Add runtime generated files to .gitignore (Phil Sutter) [1275426] +- man: ship action man pages (Phil Sutter) [1275426] +- man: tc-skbedit.8: Elaborate a bit on TX queues (Phil Sutter) [1275426] +- man: tc-police.8: Emphasize on the two rate control mechanisms (Phil Sutter) [1275426] +- man: tc-mirred.8: Reword man page a bit, add generic mirror example (Phil Sutter) [1275426] +- man: tc-csum.8: Add an example (Phil Sutter) [1275426] +- tc: connmark, pedit: Rename BRANCH to CONTROL (Phil Sutter) [1275426] +- tc: pedit: document branch control in help output (Phil Sutter) [1275426] +- man: tc-u32: Minor syntax fix (Phil Sutter) [1275426] +- man: Add a man page for the xt action (Phil Sutter) [1275426] +- man: Add a man page for the skbedit action (Phil Sutter) [1275426] +- man: Add a man page for the simple action (Phil Sutter) [1275426] +- man: Add a man page for the police action (Phil Sutter) [1275426] +- man: Add a man page for the pedit action (Phil Sutter) [1275426] +- man: Add a man page for the nat action (Phil Sutter) [1275426] +- man: Add a man page for the mirred action (Phil Sutter) [1275426] +- man: Add a man page for the csum action. (Phil Sutter) [1275426] + +* Wed Mar 23 2016 Phil Sutter [3.10.0-62.el7] +- tc: fix compilation warning on 32bits arch (Phil Sutter) [1315930] +- whitespace cleanup (Phil Sutter) [1315930] +- tc: minor spelling fixes (Phil Sutter) [1315930] +- simple print newline (Phil Sutter) [1315930] +- tc: introduce simple action (Phil Sutter) [1315930] +- man: rtpr: add minimal manpage (Phil Sutter) [1316059] + +* Tue Mar 08 2016 Phil Sutter [3.10.0-61.el7] +- fix print_ipt: segfault if more then one filter with action -j MARK. (Phil Sutter) [1314403] +- man: ip-link: Beef up VXLAN csum options a bit (Phil Sutter) [1254625] +- libnetlink: Double the dump buffer size (Phil Sutter) [1304840] + +* Mon Mar 07 2016 Phil Sutter [3.10.0-60.el7] +- man: ip-neighbour.8: Document all known nud states (Phil Sutter) [1276661] +- fix indentation of ip neighbour man page (Phil Sutter) [1276661] +- man: ip-*.8: drop any reference to generic ip options (Phil Sutter) [1251186] +- man8: scrub trailing whitespace (Phil Sutter) [1251186] +- TBF man page fix (tbf is not classless) (Phil Sutter) [1251186] +- man tc-htb: Fix HRB -> HTB typo (Phil Sutter) [1251186] +- man: Spelling fixes (Phil Sutter) [1251186] +- fix spelling of Kuznetsov (Phil Sutter) [1251186] +- man: ip-l2tp.8: Fix BNF syntax (Phil Sutter) [1251186] +- man: ip.8: Add missing flags and token subcommand description (Phil Sutter) [1251186] +- man: ip: add -h[uman-readable] option (Phil Sutter) [1251186] +- man: ip-xfrm.8: Document missing parameters (Phil Sutter) [1251186] +- man: ip-tunnel.8: Document missing 6rd action (Phil Sutter) [1251186] +- add 'vti'/'vti6' tunnel modes to ip-tunnel manual page (Phil Sutter) [1251186] +- man: ip-token.8: Review synopsis section (Phil Sutter) [1251186] +- man: ip-rule.8: Review synopsis section (Phil Sutter) [1251186] +- man: ip-ntable.8: Review synopsis section (Phil Sutter) [1251186] +- man: ip-netns.8: Clarify synopsis a bit (Phil Sutter) [1251186] +- man: ip-neighbour: Fix for missing NUD_STATE description (Phil Sutter) [1251186] +- man: ip-link.8: Fix and improve synopsis (Phil Sutter) [1251186] +- man: ip-link.8: minor font fix (Phil Sutter) [1251186] +- man: ip-address.8: Minor syntax fixes (Phil Sutter) [1251186] +- iprule: add missing nat keyword to help text (Phil Sutter) [1251186] +- iproute: TYPE keyword is not optional, fix help text accordingly (Phil Sutter) [1251186] +- ipntable: Fix typo in help text (Phil Sutter) [1251186] +- ipneigh: add missing proxy keyword to help text (Phil Sutter) [1251186] +- iplink: fix help text syntax (Phil Sutter) [1251186] +- ipaddrlabel: Improve help text precision (Phil Sutter) [1251186] +- ip: align help text with manpage (Phil Sutter) [1251186] +- ipl2tp: Print help even on systems without l2tp support (Phil Sutter) [1251186] +- iprule: Align help text with man page synopsis (Phil Sutter) [1251186] +- iplink: macvtap: fix man page (Phil Sutter) [1013584] +- man: ip-link: document MACVLAN/MACVTAP interface types (Phil Sutter) [1013584] +- man: ip-link: fix a typo (Phil Sutter) [1013584] +- man ip-link: Add missing link types - vti,ipvlan,nlmon (Phil Sutter) [1013584] +- iproute2: ip-link.8.in: Spelling fixes (Phil Sutter) [1013584] +- ip-link: Document IPoIB link type in the man page (Phil Sutter) [1013584] +- iproute: Descriptions of fou and gue options in ip-link man pages (Phil Sutter) [1013584] +- iproute2: ip6gre: update man pages (Phil Sutter) [1013584] +- ip: macvlan: support MACVLAN_FLAG_NOPROMISC flag (Phil Sutter) [1013584] +- ip: link: consolidate macvlan and macvtap (Phil Sutter) [1013584] + +* Wed Feb 24 2016 Phil Sutter [3.10.0-59.el7] +- iplink: add ageing_time, stp_state and priority for bridge (Phil Sutter) [1270759] +- iplink: shortify printing the usage of link type (Phil Sutter) [1270759] +- iplink: use the short format to print help info (Phil Sutter) [1270759] +- iplink_bridge: add support for priority (Phil Sutter) [1270759] +- iplink_bridge: add support for stp_state (Phil Sutter) [1270759] +- iplink_bridge: add support for ageing_time (Phil Sutter) [1270759] +- add bridge master device support (Phil Sutter) [1270759] +- add bridge_slave device support (Phil Sutter) [1270759] +- iplink: bond_slave: fix ad_actor/partner_oper_port_state output (Phil Sutter) [1269528] +- ip: remove extra newlines at end-of-file (Phil Sutter) [1269528] +- ip link: missing options in bond usage (Phil Sutter) [1269528] +- bond: fix return after invarg (Phil Sutter) [1269528] +- iplink: bonding: add support for IFLA_BOND_TLB_DYNAMIC_LB (Phil Sutter) [1269528] +- bonding: export 3ad actor and partner port state (Phil Sutter) [1269528] +- iplink_bond: add support for ad_actor and port_key options (Phil Sutter) [1269528] +- ip link: Shortify printing the usage of link type (Phil Sutter) [1269528] +- add help command to bonding master (Phil Sutter) [1269528] +- iproute2: allow to change slave options via type_slave (Phil Sutter) [1269528] +- ip: add nlmon as a device type to help message (Phil Sutter) [1269528] +- iplink: can: fix help text and man page (Phil Sutter) [1269528] +- iplink_bond_slave: show mii_status only once (Phil Sutter) [1269528] +- iplink_bond: fix parameter value matching (Phil Sutter) [1269528] +- iplink_bond: fix arp_all_targets parameter name in output (Phil Sutter) [1269528] +- iplink: add support for bonding slave (Phil Sutter) [1269528] +- introduce support for slave info data (Phil Sutter) [1269528] +- iproute2: finish support for bonding attributes (Phil Sutter) [1269528] +- iplink: add support for bonding netlink (Phil Sutter) [1269528] +- iplink: update available type list (Phil Sutter) [1269528] +- xfrm: revise man page and document ip xfrm policy set (Phil Sutter) [1269528] +- xfrm: add command for configuring SPD hash table (Phil Sutter) [1212026] + +* Thu Feb 18 2016 Phil Sutter [3.10.0-58.el7] +- tc: ship filter man pages and refer to them in tc.8 (Phil Sutter) [1286711] +- tc: add a man page for u32 filter (Phil Sutter) [1286711] +- tc: add a man page for tcindex filter (Phil Sutter) [1286711] +- tc: add a man page for route filter (Phil Sutter) [1286711] +- tc: add a man page for fw filter (Phil Sutter) [1286711] +- tc: add a man page for flow filter (Phil Sutter) [1286711] +- tc: add a man page for cgroup filter (Phil Sutter) [1286711] +- tc: add a man page for basic filter (Phil Sutter) [1286711] +- batch: support quoted strings (Phil Sutter) [1272593] +- man: fix whatis for fq (Phil Sutter) [1261520] +- man: tc: add man page for fq pacer (Phil Sutter) [1261520] + +* Thu Feb 18 2016 Phil Sutter [3.10.0-57.el7] +- route: Fix printing of locked entries (Phil Sutter) [1291832] +- route: ignore RTAX_HOPLIMIT of value -1 (Phil Sutter) [1291832] +- ip-link: remove warning message (Phil Sutter) [1291832] +- ip: route: add congestion control metric (Phil Sutter) [1291832] +- ip route: enable per-route ecn settings via 'features' option (Phil Sutter) [1291832] +- iproute2: ip-route.8.in: minor fixes (Phil Sutter) [1291832] +- iproute: restrict hoplimit values to be in range [0; 255] (Phil Sutter) [1291832] +- man ss: Fix explanation when no options specified (Phil Sutter) [1291818] +- libnetlink: don't confuse variables in rtnl_talk() (Phil Sutter) [1288042] +- libnetlink: add size argument to rtnl_talk (Phil Sutter) [1288042] +- ip: fix exit code for rule failures (Phil Sutter) [1288042] +- ip: return correct exit code on route failure (Phil Sutter) [1288042] +- link dump filter (Phil Sutter) [1288042] +- ip: fix exit code for addrlabel (Phil Sutter) [1288042] +- fix ip -force -batch to continue on errors (Phil Sutter) [1288042] +- Allow specifying bridge port STP state by name rather than number. (Phil Sutter) [1288042] +- gre: raising the size of the buffer holding nl messages. (Phil Sutter) [1288042] +- neighbor: check return values (Phil Sutter) [1277094] +- ip-address: fix oneline mode for interfaces with VF (Phil Sutter) [1272405] +- ss: add support for segs_in and segs_out (Phil Sutter) [1269114] +- ss: add support for bytes_acked & bytes_received (Phil Sutter) [1269114] +- ss: return -1 if an unrecognized option was given (Phil Sutter) [1265238] +- man: ip-address: document mngtmpaddr and noprefixroute flags (Phil Sutter) [1231898] +- man: ip-address: align synopsis with help output (Phil Sutter) [1231898] +- ip-address.8.in: fix BNF syntax error (Phil Sutter) [1231898] +- ip-address: fix and extend documentation (Phil Sutter) [1231898] +- ip: extend "ip-address" man page to reflect the recent flag extensions (Phil Sutter) [1231898] +- ip: allow ip address show to list addresses with certain flags not being set (Phil Sutter) [1231898] +- bridge fdb: add 'use' option to set NTF_USE flag in fdb add requests (Phil Sutter) [1075692] +- bridge: drop man page fragment (Phil Sutter) [1075692] +- bridge: drop reference to unused option embedded from manpage (Phil Sutter) [1075692] + +* Thu Feb 18 2016 Phil Sutter [3.10.0-56.el7] +- ipaddress: fix ipaddr_flush for Linux >= 3.1 (Phil Sutter) [1291825] +- ipaddress: simplify ipaddr_flush() (Phil Sutter) [1291825] +- libnetlink: introduce nc_flags (Phil Sutter) [1291825] +- iproute2: Ignore EADDRNOTAVAIL errors during address flush operation (Phil Sutter) [1291825] +- lnstat: fix header displaying mechanism (Phil Sutter) [1263392] +- man: lnstat: rewrite manpage (Phil Sutter) [1269133] + +* Wed Feb 17 2016 Phil Sutter [3.10.0-55.el7] +- Resolves: #1290860 - Rework list of patches, replace by upstream backports + +* Thu Sep 17 2015 Phil Sutter - 3.10.0-54 +- Related: #1241486 - backport: tc: fq scheduler - add missing documentation + +* Thu Sep 03 2015 Phil Sutter - 3.10.0-53 +- Related: #1212026 - [6wind 7.2 Feat]: backport: ipxfrm: unable to configure + SPD hash table - reverted this backport due to unmet dependencies + +* Mon Aug 24 2015 Phil Sutter - 3.10.0-52 +- Resolves: #1254095 - bridge: Add master device name to bridge fdb show +- Resolves: #1255316 - tc does not allow to attach pfifo_fast qdisc +- Related: #1251070 - Fix multiple programming errors in iproute package + +* Sun Aug 16 2015 Phil Sutter - 3.10.0-51 +- Resolves: bz#1251451 - can't change the remote/local address of tunnel + interface to "any" in ipip mode +- Related: #1213869 - [6wind 7.2 Feat]: backport: iproute2: various netns + features +- Related: #1215006 - [RFE] backport current version of the ss command +- Resolves: #1251070 - Fix multiple programming errors in iproute package +- Related: #1198456 - backport: dynamic precision, human readable, and IEC + output to ip stats +- Related: #1210402 - [6wind 7.2 Feat]: backport: vxlan: unable to configure + UDP checksums +- Related: #1213869 - [6wind 7.2 Feat]: backport: iproute2: various netns + features + +* Fri Aug 07 2015 Phil Sutter - 3.10.0-50 +- Resolves: #1244851 - vti tunnel does not work +- Resolves: #1155116 - iproute2: implement "-d" option for "ip mon" + +* Thu Aug 06 2015 Phil Sutter - 3.10.0-49 +- Resolves: bz#1241486 - backport: tc: fq scheduler +- Related: #1215006 - backport current version of the ss command + +* Wed Aug 05 2015 Phil Sutter - 3.10.0-48 +- Related: #1215006 - backport current version of the ss command +- Resolves: #1247315 - Fix limitation in iproute/ss regarding dual-stack sockets + +* Mon Aug 03 2015 Phil Sutter - 3.10.0-47 +- Related: #1215006 - backport current version of the ss command +- Related: #1219280 - backport: iproute2: vti6 support + +* Wed Jul 08 2015 Pavel Šimerda - 3.10.0-46 +- Related: #1198456 - add missing parts + +* Wed Jul 08 2015 Pavel Šimerda - 3.10.0-45 +- Related: #1213869 - add support for 'ip -all netns' + +* Wed Jul 08 2015 Pavel Šimerda - 3.10.0-44 +- Related: #1176180 - put back addrgenmode docs + +* Wed Jul 08 2015 Pavel Šimerda - 3.10.0-43 +- Related: #1131928 - make netns docs consistent + +* Wed Jul 08 2015 Pavel Šimerda - 3.10.0-42 +- Resolves: #1169901 - ip rule help output contains action reject, but this + action does not work + +* Tue Jul 07 2015 Pavel Šimerda - 3.10.0-41 +- Resolves: #1169874 - ip rule command allows to remove rule with priority 0 + +* Tue Jul 07 2015 Pavel Šimerda - 3.10.0-40 +- Resolves: #1042802 - make 'ip -d monitor' consistent with 'ip -d link' + +* Thu Jun 04 2015 Pavel Šimerda - 3.10.0-39 +- Resolves: #1228166 - remove redundant libnl-devel build dependency + +* Tue Jun 02 2015 Pavel Šimerda - 3.10.0-38 +- Resolves: #1131473 - backport: implement -s option for ip a + +* Tue Jun 02 2015 Pavel Šimerda - 3.10.0-37 +- Resolves: #1213869 - backport: iproute2: unable to manage nsid + +* Fri May 29 2015 Pavel Šimerda - 3.10.0-36 +- Resolves: #1224970 - backport: ipv6: support noprefixroute and mngtmpaddr + +* Thu May 28 2015 Pavel Šimerda - 3.10.0-35 +- Related: #1198456 - refactor patchset thoroughly + +* Mon May 25 2015 Pavel Šimerda - 3.10.0-34 +- Resolves: #1176684 - backport: ip xfrm monitor all does not work + +* Mon May 25 2015 Pavel Šimerda - 3.10.0-33 +- Resolves: #1219280 - backport: iproute2: vti6 support + +* Wed May 20 2015 Pavel Šimerda - 3.10.0-32 +- Resolves: #1198489 - backport: "ip route del" without arguments should print + help + +* Thu May 14 2015 Pavel Šimerda - 3.10.0-31 +- Resolves: #1218568 - backport: iproute2: query_rss command is missing + +* Thu May 14 2015 Pavel Šimerda - 3.10.0-30 +- Resolves: #1212026 - backport: ipxfrm: unable to configure SPD hash table + +* Wed May 13 2015 Pavel Šimerda - 3.10.0-29 +- Resolves: #1210402 - backport: vxlan: unable to configure UDP checksums + +* Wed May 13 2015 Pavel Šimerda - 3.10.0-28 +- Resolves: #1131928 - backport: introduce option to ip to operate on a + different namespace + +* Wed May 13 2015 Pavel Šimerda - 3.10.0-27 +- Resolves: #1198456 - make sure the patch is applied + +* Tue Apr 28 2015 Pavel Šimerda - 3.10.0-26 +- Resolves: #1198456 - backport changes in link statistics + +* Tue Apr 28 2015 Pavel Šimerda +- Resolves: #1139173 - ip -s xfrm state crashes with segfault + +* Tue Apr 28 2015 Pavel Šimerda - 3.10.0-24 +- Resolves: #1215006 - backport current version of the ss command + +* Fri Apr 17 2015 Pavel Šimerda - 3.10.0-23 +- Resolves: #1203646 - backport VXLAN-GBP + +* Thu Apr 16 2015 Pavel Šimerda - 3.10.0-22 +- Resolves: #1176180 - ip -d link show: print addrgenmode + +* Fri Oct 24 2014 Pavel Šimerda - 3.10.0-21 +- Related: #1119180 - improve addrgen documentation + +* Fri Oct 24 2014 Pavel Šimerda - 3.10.0-20 +- Related: #1119180 - document addrgen + +* Wed Oct 08 2014 Pavel Šimerda - 3.10.0-19 +- Resolves: #1081081 - lnstat man page references iproute-doc when it should + reference iproute- + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-18 +- Resolves: #1044535 - tc: add cls_bpf frontend + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-17 +- Resolves: #1044535 - backport tc: + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-16 +- Resolves: #1091010 - [RFE] iproute2: Allow Configurable TCP Delayed Ack in + RHEL + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-15 +- Resolves: #1100271 - ip -6 addrlabel return incorrect error message + +* Fri Oct 03 2014 Pavel Šimerda - 3.10.0-14 +- Resolves: #1119180 - iproute2: allow to ipv6 set address generation mode + +* Tue Feb 25 2014 Petr Šabata - 3.10.0-13 +- Add VF link state control mechanisms (#1061593) + +* Tue Feb 25 2014 Petr Šabata - 3.10.0-12 +- Add destination port and IPv6 support to VXLAN (#1067437) + +* Wed Jan 29 2014 Petr Šabata - 3.10.0-11 +- Don't hang on rtnl_send() failure (#1040454) +- Add the dstport option to vxlan (#1039855) + +* Fri Jan 24 2014 Daniel Mach - 3.10.0-10 +- Mass rebuild 2014-01-24 + +* Fri Dec 27 2013 Daniel Mach - 3.10.0-9 +- Mass rebuild 2013-12-27 + +* Tue Nov 26 2013 Petr Šabata - 3.10.0-8 +- Document fdb replace and embedded bridge options (#1024697) + +* Fri Nov 22 2013 Petr Šabata - 3.10.0-7 +- Fix the rtt time values (#1032501) + +* Fri Nov 08 2013 Petr Šabata - 3.10.0-6 +- Fix lnstat -i (#1024426) +- Support IPv6 peer addresses (#1017228) +- Add the replace command to bridge fdb (#1024697) +- Document link type vlan (#979326) + +* Tue Oct 01 2013 Petr Pisar - 3.10.0-5 +- Close file with bridge monitor file (#1011818) + +* Tue Sep 24 2013 Petr Pisar - 3.10.0-4 +- Document tc -OK option (#977844) +- Document "bridge mdb" and "bridge monitor mdb" (#1009860) + +* Wed Sep 18 2013 Marcela Mašláňová - 3.10.0-3 +- Add '-OK' command line option to tc telling it to write an "OK\n" to stdout +- rhbz#977844 + +* Mon Aug 05 2013 Petr Šabata - 3.10.0-2.1 +- Add a skeleton manpages for genl and ifstat (#881180) + +* Wed Jul 17 2013 Petr Šabata - 3.10.0-2 +- Fix the XFRM patch + +* Wed Jul 17 2013 Petr Šabata - 3.10.0-1 +- 3.10.0 bump +- Drop the SHAREDIR patch and revert to upstream ways (#966445) +- Fix an XFRM regression with FORTIFY_SOURCE + +* Tue Apr 30 2013 Petr Šabata - 3.9.0-1 +- 3.9.0 bump + +* Thu Apr 25 2013 Petr Šabata - 3.8.0-4 +- ATM is available in Fedora only + +* Tue Mar 12 2013 Petr Šabata - 3.8.0-3 +- Mention the "up" argument in documentation and help outputs (#907468) + +* Mon Mar 04 2013 Petr Šabata - 3.8.0-2 +- Bump for 1.4.18 rebuild + +* Tue Feb 26 2013 Petr Šabata - 3.8.0-1 +- 3.8.0 bump + +* Fri Feb 08 2013 Petr Šabata - 3.7.0-2 +- Don't propogate mounts out of ip (#882047) + +* Wed Dec 12 2012 Petr Šabata - 3.7.0-1 +- 3.7.0 bump + +* Mon Nov 19 2012 Petr Šabata - 3.6.0-3 +- Include section 7 manpages (#876857) +- Fix ancient bogus dates in the changelog (correction based upon commits) +- Explicitly require some TeX fonts no longer present in the base distribution + +* Thu Oct 04 2012 Petr Šabata - 3.6.0-2 +- List all interfaces by default + +* Wed Oct 03 2012 Petr Šabata - 3.6.0-1 +- 3.6.0 bump + +* Thu Aug 30 2012 Petr Šabata - 3.5.1-2 +- Remove the explicit iptables dependency (#852840) + +* Tue Aug 14 2012 Petr Šabata - 3.5.1-1 +- 3.5.1 bugfix release bump +- Rename 'br' to 'bridge' + +* Mon Aug 06 2012 Petr Šabata - 3.5.0-2 +- Install the new bridge utility + +* Thu Aug 02 2012 Petr Šabata - 3.5.0-1 +- 3.5.0 bump +- Move to db5. + +* Thu Jul 19 2012 Fedora Release Engineering - 3.4.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue May 22 2012 Petr Šabata - 3.4.0-1 +- 3.4.0 bump +- Drop the print route patch (included upstream) + +* Mon Apr 30 2012 Petr Šabata - 3.3.0-2 +- Let's install rtmon too... (#814819) + +* Thu Mar 22 2012 Petr Šabata - 3.3.0-1 +- 3.3.0 bump +- Update source URL + +* Mon Feb 27 2012 Petr Šabata - 3.2.0-3 +- Address dangerous /tmp files security issue (CVE-2012-1088, #797881, #797878) + +* Fri Jan 27 2012 Petr Šabata - 3.2.0-2 +- Simplify the spec a bit thanks to the UsrMove feature + +* Fri Jan 06 2012 Petr Šabata - 3.2.0-1 +- 3.2.0 bump +- Removing a useless, now conflicting patch (initcwnd already decumented) + +* Thu Nov 24 2011 Petr Šabata - 3.1.0-1 +- 3.1.0 bump +- Point URL and Source to the new location on kernel.org +- Remove now obsolete defattr +- Dropping various patches now included upstream +- Dropping iproute2-2.6.25-segfault.patch; I fail to understand the reason for + this hack + +* Tue Nov 15 2011 Petr Šabata - 2.6.39-6 +- ss -ul should display UDP CLOSED sockets (#691100) + +* Thu Oct 06 2011 Petr Sabata - 2.6.39-5 +- Fix ss, lnstat and arpd usage and manpages + +* Wed Sep 07 2011 Petr Sabata - 2.6.39-4 +- lnstat should dump (-d) to stdout instead of stderr (#736332) + +* Tue Jul 26 2011 Petr Sabata - 2.6.39-3 +- Rebuild for xtables7 + +* Tue Jul 12 2011 Petr Sabata - 2.6.39-2 +- Rebuild for xtables6 + +* Thu Jun 30 2011 Petr Sabata - 2.6.39-1 +- 2.6.39 bump + +* Wed Apr 27 2011 Petr Sabata - 2.6.38.1-4 +- Link [cr]tstat to lnstat + +* Wed Apr 27 2011 Petr Sabata - 2.6.38.1-3 +- Install ctstat, rtstat and routef manpage symlinks +- Install m_xt & m_ipt tc modules +- Creating devel and virtual static subpackages with libnetlink + +* Thu Apr 21 2011 Petr Sabata - 2.6.38.1-2 +- General cleanup +- Use global instead of define +- Buildroot removal +- Correcting URL and Source links +- Install genl, ifstat, routef, routel and rtpr (rhbz#697319) + +* Fri Mar 18 2011 Petr Sabata - 2.6.38.1-1 +- 2.6.38.1 bump + +* Wed Mar 16 2011 Petr Sabata - 2.6.38-1 +- 2.6.38 bump + +* Wed Feb 09 2011 Fedora Release Engineering - 2.6.37-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Mon Jan 31 2011 Petr Sabata - 2.6.37-2 +- man-pages.patch update, ip(8) TYPE whitespace + +* Mon Jan 10 2011 Petr Sabata - 2.6.37-1 +- 2.6.37 upstream release +- ss(8) improvements patch removed (included upstream) + +* Wed Dec 08 2010 Petr Sabata - 2.6.35-10 +- fix a typo in ss(8) improvements patch, rhbz#661267 + +* Tue Nov 30 2010 Petr Sabata - 2.6.35-9 +- ss(8) improvements patch by jpopelka; should be included in 2.6.36 + +* Tue Nov 09 2010 Petr Sabata - 2.6.35-8 +- rhbz#641599, use the versioned path, man-pages.patch update, prep update + +* Tue Oct 12 2010 Petr Sabata - 2.6.35-7 +- Do not segfault if peer name is omitted when creating a peer veth link, rhbz#642322 + +* Mon Oct 11 2010 Petr Sabata - 2.6.35-6 +- Man-pages update, rhbz#641599 + +* Wed Sep 29 2010 jkeating - 2.6.35-5 +- Rebuilt for gcc bug 634757 + +* Tue Sep 21 2010 Petr Sabata - 2.6.35-4 +- Modified man-pages.patch to fix cbq manpage, rhbz#635877 + +* Tue Sep 21 2010 Petr Sabata - 2.6.35-3 +- Don't print routes with negative metric fix, rhbz#628739 + +* Wed Aug 18 2010 Petr Sabata - 2.6.35-2 +- 'ip route get' fix, iproute2-2.6.35-print-route.patch +- rhbz#622782 + +* Thu Aug 05 2010 Petr Sabata - 2.6.35-1 +- 2.6.35 version bump +- iproute2-tc-priority.patch removed (included in upstream now) + +* Thu Jul 08 2010 Petr Sabata - 2.6.34-5 +- Licensing guidelines compliance fix + +* Wed Jul 07 2010 Petr Sabata - 2.6.34-4 +- Requires: iptables >= 1.4.5, BuildRequires: iptables-devel >= 1.4.5 + +* Thu Jul 01 2010 Petr Sabata - 2.6.34-3 +- Build now runs ./configure to regenerate Makefile for ipt/xt detection + +* Mon Jun 21 2010 Petr Sabata - 2.6.34-2 +- iproute-tc-priority.patch, rhbz#586112 + +* Mon Jun 21 2010 Petr Sabata - 2.6.34-1 +- 2.6.34 version bump + +* Tue Apr 20 2010 Marcela Mašláňová - 2.6.33-2 +- 578729 6rd tunnel correctly 3979ef91de9ed17d21672aaaefd6c228485135a2 +- change BR texlive to tex according to guidelines + +* Thu Feb 25 2010 Marcela Mašláňová - 2.6.33-1 +- update + +* Tue Jan 26 2010 Marcela Mašláňová - 2.6.32-2 +- add macvlan aka VESA support d63a9b2b1e4e3eab0d0577d0a0f412d50be1e0a7 +- kernel headers 2.6.33 ab322673298bd0b8927cdd9d11f3d36af5941b93 + are needed for macvlan features and probably for other added later. +- fix number of release which contains 2.6.32 kernel headers and features + but it was released as 2.6.31 + +* Mon Jan 4 2010 Marcela Mašláňová - 2.6.31-1 +- update to 2.6.31 + +* Fri Nov 27 2009 Marcela Mašláňová - 2.6.29-5.1.20091106gita7a9ddbb +- 539232 patch cbq initscript + +* Fri Nov 27 2009 Marcela Mašláňová - 2.6.29-5.0.20091106gita7a9ddbb +- snapshot with kernel headers for 2.6.32 + +* Fri Oct 9 2009 Marcela Mašláňová - 2.6.29-5.0.20091009gitdaf49fd6 +- new official version isn't available but it's needed -> switch to git snapshots + +* Thu Sep 24 2009 Marcela Mašláňová - 2.6.29-5 +- create missing man pages + +* Fri Jul 24 2009 Fedora Release Engineering - 2.6.29-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Thu Apr 23 2009 Marcela Mašláňová - 2.6.29-3 +- new iptables (xtables) bring problems to tc, when ipt is used. + rhbz#497344 still broken. tc_modules.patch brings correct paths to + xtables, but that doesn't fix whole issue. +- 497355 ip should allow creation of an IPsec SA with 'proto any' + and specified sport and dport as selectors + +* Tue Apr 14 2009 Marcela Mašláňová - 2.6.29-2 +- c3651bf4763d7247e3edd4e20526a85de459041b ip6tunnel: Fix no default + display of ip4ip6 tunnels +- e48f73d6a5e90d2f883e15ccedf4f53d26bb6e74 missing arpd directory + +* Wed Mar 25 2009 Marcela Mašláňová - 2.6.29-1 +- update to 2.6.29 +- remove DDR patch which became part of sourc +- add patch with correct headers 1957a322c9932e1a1d2ca1fd37ce4b335ceb7113 + +* Wed Feb 25 2009 Fedora Release Engineering - 2.6.28-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Wed Feb 4 2009 Marcela Mašláňová - 2.6.28-2 +- 483484 install distribution files into /usr/share and also fixed + install paths in spec +- add the latest change from git which add DRR support + c86f34942a0ce9f8203c0c38f9fe9604f96be706 + +* Mon Jan 19 2009 Marcela Mašláňová - 2.6.28-1 +- previous two patches were included into 2.6.28 release. +- update + +* Mon Jan 12 2009 Marcela Mašláňová - 2.6.27-2 +- 475130 - Negative preferred lifetimes of IPv6 prefixes/addresses + displayed incorrectly +- 472878 - “ip maddr show” in IB interface causes a stack corruption +- both patches will be probably in iproute v2.6.28 + +* Thu Dec 4 2008 Marcela Maslanova - 2.6.27-1 +- aead support was included into upstream version +- patch for moving libs is now deprecated +- update to 2.6.27 + +* Tue Aug 12 2008 Marcela Maslanova - 2.6.26-1 +- update to 2.6.26 +- clean patches + +* Tue Jul 22 2008 Marcela Maslanova - 2.6.25-5 +- fix iproute2-2.6.25-segfault.patch + +* Thu Jul 10 2008 Tom "spot" Callaway - 2.6.25-4 +- rebuild for new db4-4.7 + +* Thu Jul 3 2008 Marcela Maslanova - 2.6.25-3 +- 449933 instead of failing strncpy use copying byte after byte + +* Wed May 14 2008 Marcela Maslanova - 2.6.25-2 +- allow replay setting, solve also 444724 + +* Mon Apr 21 2008 Marcela Maslanova - 2.6.25-1 +- update +- remove patch for backward compatibility +- add patch for AEAD compatibility + +* Thu Feb 21 2008 Marcela Maslanova - 2.6.23-4 +- add creating ps file again. Fix was done in texlive + +* Wed Feb 6 2008 Marcela Maslanova - 2.6.23-3 +- rebuild without tetex files. It isn't working in rawhide yet. Added + new source for ps files. +- #431179 backward compatibility for previous iproute versions + +* Mon Jan 21 2008 Marcela Maslanova - 2.6.23-2 +- rebuild with fix tetex and linuxdoc-tools -> manual pdf +- clean unnecessary patches +- add into spec *.so objects, new BR linux-atm-libs-devel + +* Wed Oct 31 2007 Marcela Maslanova - 2.6.23-1 +- new version from upstrem 2.3.23 + +* Tue Oct 23 2007 Marcela Maslanova - 2.6.22-5 +- move files from /usr/lib/tc to /usr/share/tc +- remove listing files twice + +* Fri Aug 31 2007 Marcela Maslanova - 2.6.22-3 +- package review #225903 + +* Mon Aug 27 2007 Jeremy Katz - 2.6.22-2 +- rebuild for new db4 + +* Wed Jul 11 2007 Radek Vokál - 2.6.22-1 +- upgrade to 2.6.22 + +* Mon Mar 19 2007 Radek Vokál - 2.6.20-2 +- fix broken tc-pfifo man page (#232891) + +* Thu Mar 15 2007 Radek Vokál - 2.6.20-1 +- upgrade to 2.6.20 + +* Fri Dec 15 2006 Radek Vokál - 2.6.19-1 +- upgrade to 2.6.19 + +* Mon Dec 11 2006 Radek Vokál - 2.6.18-5 +- fix snapshot version + +* Fri Dec 1 2006 Radek Vokál - 2.6.18-4 +- spec file cleanup +- one more rebuilt against db4 + +* Thu Nov 16 2006 Radek Vokál - 2.6.18-3 +- fix defective manpage for tc-pfifo (#215399) + +* Mon Nov 13 2006 Radek Vokál - 2.6.18-2 +- rebuilt against new db4 + +* Tue Oct 3 2006 Radek Vokal - 2.6.18-1 +- upgrade to upstream 2.6.18 +- initcwnd patch merged +- bug fix for xfrm monitor +- alignment fixes for cris +- documentation corrections + +* Mon Oct 2 2006 Radek Vokal - 2.6.16-7 +- fix ip.8 man page, add initcwnd option + +* Sun Oct 01 2006 Jesse Keating - 2.6.16-6 +- rebuilt for unwind info generation, broken in gcc-4.1.1-21 + +* Tue Sep 19 2006 Radek Vokal - 2.6.16-5 +- fix crash when resolving ip address + +* Mon Aug 21 2006 Radek Vokál - 2.6.16-4 +- add LOWER_UP and DORMANT flags (#202199) +- use dist tag + +* Wed Jul 12 2006 Jesse Keating - 2.6.16-3.1 +- rebuild + +* Mon Jun 26 2006 Radek Vokál - 2.6.16-3 +- improve handling of initcwnd value (#179719) + +* Sun May 28 2006 Radek Vokál - 2.6.16-2 +- fix BuildRequires: flex (#193403) + +* Sun Mar 26 2006 Radek Vokál - 2.6.16-1 +- upgrade to 2.6.16-060323 +- don't hardcode /usr/lib in tc (#186607) + +* Wed Feb 22 2006 Radek Vokál - 2.6.15-2 +- own /usr/lib/tc (#181953) +- obsoletes shapecfg (#182284) + +* Fri Feb 10 2006 Jesse Keating - 2.6.15-1.2 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 2.6.15-1.1 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Tue Jan 17 2006 Radek Vokal 2.6.15-1 +- upgrade to 2.6.15-060110 + +* Mon Dec 12 2005 Radek Vokal 2.6.14-11 +- rebuilt + +* Fri Dec 09 2005 Radek Vokal 2.6.14-10 +- remove backup of config files (#175302) + +* Fri Nov 11 2005 Radek Vokal 2.6.14-9 +- use tc manpages and cbq.init from source tarball (#172851) + +* Thu Nov 10 2005 Radek Vokal 2.6.14-8 +- new upstream source + +* Mon Oct 31 2005 Radek Vokal 2.6.14-7 +- add warning to ip tunnel add command (#128107) + +* Fri Oct 07 2005 Bill Nottingham 2.6.14-6 +- update from upstream (appears to fix #170111) + +* Fri Oct 07 2005 Radek Vokal 2.6.14-5 +- update from upstream +- fixed host_len size for memcpy (#168903) + +* Fri Sep 23 2005 Radek Vokal 2.6.14-4 +- add RPM_OPT_FLAGS + +* Mon Sep 19 2005 Radek Vokal 2.6.14-3 +- forget to apply the patch :( + +* Mon Sep 19 2005 Radek Vokal 2.6.14-2 +- make ip help work again (#168449) + +* Wed Sep 14 2005 Radek Vokal 2.6.14-1 +- upgrade to ss050901 for 2.6.14 kernel headers + +* Fri Aug 26 2005 Radek Vokal 2.6.13-3 +- added /sbin/cbq script and sample configuration files (#166301) + +* Fri Aug 19 2005 Radek Vokal 2.6.13-2 +- upgrade to iproute2-050816 + +* Thu Aug 11 2005 Radek Vokal 2.6.13-1 +- update to snapshot for 2.6.13+ kernel + +* Tue May 24 2005 Radek Vokal 2.6.11-2 +- removed useless initvar patch (#150798) +- new upstream source + +* Tue Mar 15 2005 Radek Vokal 2.6.11-1 +- update to iproute-2.6.11 + +* Fri Mar 04 2005 Radek Vokal 2.6.10-2 +- gcc4 rebuilt + +* Wed Feb 16 2005 Radek Vokal 2.6.10-1 +- update to iproute-2.6.10 + +* Thu Dec 23 2004 Radek Vokal 2.6.9-6 +- added arpd into sbin + +* Mon Nov 29 2004 Radek Vokal 2.6.9-5 +- debug info removed from makefile and from spec (#140891) + +* Tue Nov 16 2004 Radek Vokal 2.6.9-4 +- source file updated from snapshot version +- endian patch adding + +* Sat Sep 18 2004 Joshua Blanton 2.6.9-3 +- added installation of netem module for tc + +* Mon Sep 06 2004 Radek Vokal 2.6.9-2 +- fixed possible buffer owerflow, path by Steve Grubb + +* Wed Sep 01 2004 Radek Vokal 2.6.9-1 +- updated to iproute-2.6.9, spec file change, patches cleared + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Wed May 26 2004 Phil Knirsch 2.4.7-16 +- Took tons of manpages from debian, much more complete (#123952). + +* Thu May 06 2004 Phil Knirsch 2.4.7-15 +- rebuilt + +* Thu May 06 2004 Phil Knirsch 2.4.7-13.2 +- Built security errata version for FC1. + +* Wed Apr 21 2004 Phil Knirsch 2.4.7-14 +- Fixed -f option for ss (#118355). +- Small description fix (#110997). +- Added initialization of some vars (#74961). +- Added patch to initialize "default" rule as well (#60693). + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Wed Nov 05 2003 Phil Knirsch 2.4.7-12 +- Security errata for netlink (CAN-2003-0856). + +* Thu Oct 23 2003 Phil Knirsch +- Updated to latest version. Used by other distros, so seems stable. ;-) +- Quite a few patches needed updating in that turn. +- Added ss (#107363) and several other new nifty tools. + +* Tue Jun 17 2003 Phil Knirsch +- rebuilt + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Thu Jan 16 2003 Phil Knirsch 2.4.7-7 +- Added htb3-tc patch from http://luxik.cdi.cz/~devik/qos/htb/ (#75486). + +* Fri Oct 11 2002 Bill Nottingham 2.4.7-6 +- remove flags patch at author's request + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Wed Jun 19 2002 Phil Knirsch 2.4.7-4 +- Don't forcibly strip binaries + +* Mon May 27 2002 Phil Knirsch 2.4.7-3 +- Fixed missing diffserv and atm support in config (#57278). +- Fixed inconsistent numeric base problem for command line (#65473). + +* Tue May 14 2002 Phil Knirsch 2.4.7-2 +- Added patch to fix crosscompiling by Adrian Linkins. + +* Fri Mar 15 2002 Phil Knirsch 2.4.7-1 +- Update to latest stable release 2.4.7-now-ss010824. +- Added simple man page for ip. + +* Wed Aug 8 2001 Bill Nottingham +- allow setting of allmulti & promisc flags (#48669) + +* Mon Jul 02 2001 Than Ngo +- fix build problem in beehive if kernel-sources is not installed + +* Fri May 25 2001 Helge Deller +- updated to iproute2-2.2.4-now-ss001007.tar.gz +- bzip2 source tar file +- "License" replaces "Copyright" +- added "BuildPrereq: tetex-latex tetex-dvips psutils" +- rebuilt for 7.2 + +* Tue May 1 2001 Bill Nottingham +- use the system headers - the included ones are broken +- ETH_P_ECHO went away + +* Sat Jan 6 2001 Jeff Johnson +- test for specific KERNEL_INCLUDE directories. + +* Thu Oct 12 2000 Than Ngo +- rebuild for 7.1 + +* Thu Oct 12 2000 Than Ngo +- add default configuration files for iproute (Bug #10549, #18887) + +* Tue Jul 25 2000 Jakub Jelinek +- fix include-glibc/ to cope with glibc 2.2 new resolver headers + +* Thu Jul 13 2000 Prospector +- automatic rebuild + +* Sun Jun 18 2000 Than Ngo +- rebuilt in the new build environment +- use RPM macros +- handle RPM_OPT_FLAGS + +* Sat Jun 03 2000 Than Ngo +- fix iproute to build with new glibc + +* Fri May 26 2000 Ngo Than +- update to 2.2.4-now-ss000305 +- add configuration files + +* Mon Sep 13 1999 Bill Nottingham +- strip binaries + +* Mon Aug 16 1999 Cristian Gafton +- first build