Initial commit

This commit is contained in:
domenico
2025-06-24 13:14:22 +02:00
commit 4002f145fc
9002 changed files with 1731834 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
--- a/configure
+++ b/configure
@@ -34,7 +34,8 @@ int main(int argc, char **argv) {
}
EOF
- if $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1; then
+# OpenWrt: disable ATM support even if present on host system
+ if [ 1 -eq 0 ]; then
echo "TC_CONFIG_ATM:=y" >>$CONFIG
echo yes
else

View File

@@ -0,0 +1,59 @@
--- a/netem/maketable.c
+++ b/netem/maketable.c
@@ -10,7 +10,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
#include <malloc.h>
+#endif
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
--- a/netem/normal.c
+++ b/netem/normal.c
@@ -8,8 +8,12 @@
#include <string.h>
#include <limits.h>
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
#include <linux/types.h>
#include <linux/pkt_sched.h>
+#else
+#define NETEM_DIST_SCALE 8192
+#endif
#define TABLESIZE 16384
#define TABLEFACTOR NETEM_DIST_SCALE
--- a/netem/pareto.c
+++ b/netem/pareto.c
@@ -7,8 +7,12 @@
#include <math.h>
#include <limits.h>
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
#include <linux/types.h>
#include <linux/pkt_sched.h>
+#else
+#define NETEM_DIST_SCALE 8192
+#endif
static const double a=3.0;
#define TABLESIZE 16384
--- a/netem/paretonormal.c
+++ b/netem/paretonormal.c
@@ -14,10 +14,13 @@
#include <string.h>
#include <math.h>
#include <limits.h>
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
#include <malloc.h>
-
#include <linux/types.h>
#include <linux/pkt_sched.h>
+#else
+#define NETEM_DIST_SCALE 8192
+#endif
#define TABLESIZE 16384
#define TABLEFACTOR NETEM_DIST_SCALE

View File

@@ -0,0 +1,12 @@
--- a/tc/Makefile
+++ b/tc/Makefile
@@ -128,6 +128,9 @@ CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PR
ifneq ($(IPT_LIB_DIR),)
CFLAGS += -DIPT_LIB_DIR=\"$(IPT_LIB_DIR)\"
endif
+ifneq ($(XT_LIB_DIR),)
+ CFLAGS += -DXT_LIB_DIR=\"$(XT_LIB_DIR)\"
+endif
LEX := flex
CFLAGS += -DYY_NO_INPUT

View File

@@ -0,0 +1,20 @@
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -2,13 +2,13 @@
SSOBJ=ss.o ssfilter_check.o ssfilter.tab.o
LNSTATOBJ=lnstat.o lnstat_util.o
-TARGETS=ss nstat ifstat rtacct lnstat
+TARGETS=ss nstat
include ../config.mk
-ifeq ($(HAVE_BERKELEY_DB),y)
- TARGETS += arpd
-endif
+#ifeq ($(HAVE_BERKELEY_DB),y)
+# TARGETS += arpd
+#endif
all: $(TARGETS)

View File

@@ -0,0 +1,11 @@
--- a/Makefile
+++ b/Makefile
@@ -55,7 +55,7 @@ WFLAGS += -Wmissing-declarations -Wold-s
CFLAGS := $(WFLAGS) $(CCOPTS) -I../include -I../include/uapi $(DEFINES) $(CFLAGS)
YACCFLAGS = -d -t -v
-SUBDIRS=lib ip tc bridge misc netem genl tipc devlink rdma dcb man vdpa
+SUBDIRS=lib ip tc bridge misc genl devlink rdma
LIBNETLINK=../lib/libutil.a ../lib/libnetlink.a
LDLIBS += $(LIBNETLINK)

View File

@@ -0,0 +1,9 @@
--- a/tc/q_fifo.c
+++ b/tc/q_fifo.c
@@ -95,5 +95,6 @@ struct qdisc_util pfifo_head_drop_qdisc_
struct qdisc_util pfifo_fast_qdisc_util = {
.id = "pfifo_fast",
+ .parse_qopt = fifo_parse_opt,
.print_qopt = prio_print_opt,
};

View File

@@ -0,0 +1,11 @@
--- a/configure
+++ b/configure
@@ -387,7 +387,7 @@ check_selinux()
check_mnl()
{
- if ${PKG_CONFIG} libmnl --exists; then
+ if [ "${HAVE_MNL}" = "y" ] && ${PKG_CONFIG} libmnl --exists; then
echo "HAVE_MNL:=y" >>$CONFIG
echo "yes"

View File

@@ -0,0 +1,11 @@
--- a/configure
+++ b/configure
@@ -255,7 +255,7 @@ EOF
check_elf()
{
- if ${PKG_CONFIG} libelf --exists; then
+ if [ "${HAVE_ELF}" = "y" ] && ${PKG_CONFIG} libelf --exists; then
echo "HAVE_ELF:=y" >>$CONFIG
echo "yes"

View File

@@ -0,0 +1,11 @@
--- a/configure
+++ b/configure
@@ -445,7 +445,7 @@ EOF
check_cap()
{
- if ${PKG_CONFIG} libcap --exists; then
+ if [ "${HAVE_CAP}" = "y" ] && ${PKG_CONFIG} libcap --exists; then
echo "HAVE_CAP:=y" >>$CONFIG
echo "yes"

View File

@@ -0,0 +1,11 @@
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0
include ../config.mk
-CFLAGS += -fPIC
+CFLAGS += $(FPIC)
UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \

View File

@@ -0,0 +1,109 @@
--- a/ip/Makefile
+++ b/ip/Makefile
@@ -17,6 +17,13 @@ RTMONOBJ=rtmon.o
include ../config.mk
+STATIC_SYM_FILTER:=
+ifeq ($(IP_CONFIG_TINY),y)
+ STATIC_SYM_FILTER:=iplink_can.c iplink_ipoib.c iplink_vxlan.c
+ CFLAGS += -DIPROUTE2_TINY
+endif
+STATIC_SYM_SOURCES:=$(filter-out $(STATIC_SYM_FILTER),$(wildcard *.c))
+
ALLOBJ=$(IPOBJ) $(RTMONOBJ)
SCRIPTS=ifcfg rtpr routel routef
TARGETS=ip rtmon
@@ -46,7 +53,7 @@ else
ip: static-syms.o
static-syms.o: static-syms.h
-static-syms.h: $(wildcard *.c)
+static-syms.h: $(STATIC_SYM_SOURCES)
files="$^" ; \
for s in `grep -B 3 '\<dlsym' $$files | sed -n '/snprintf/{s:.*"\([^"]*\)".*:\1:;s:%s::;p}'` ; do \
sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \
--- a/ip/ip.c
+++ b/ip/ip.c
@@ -64,11 +64,17 @@ static void usage(void)
fprintf(stderr,
"Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
" ip [ -force ] -batch filename\n"
+#ifndef IPROUTE2_TINY
"where OBJECT := { address | addrlabel | fou | help | ila | l2tp | link |\n"
" macsec | maddress | monitor | mptcp | mroute | mrule |\n"
" neighbor | neighbour | netconf | netns | nexthop | ntable |\n"
" ntbl | route | rule | sr | tap | tcpmetrics |\n"
" token | tunnel | tuntap | vrf | xfrm }\n"
+#else
+ "where OBJECT := { address | ila | link | macsec | maddress | monitor |\n"
+ " mroute | mrule | neighbor | neighbour | netns | route |\n"
+ " rule | sr | token | tunnel | vrf }\n"
+#endif
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
" -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
" -f[amily] { inet | inet6 | mpls | bridge | link } |\n"
@@ -91,36 +97,50 @@ static const struct cmd {
int (*func)(int argc, char **argv);
} cmds[] = {
{ "address", do_ipaddr },
+#ifndef IPROUTE2_TINY
{ "addrlabel", do_ipaddrlabel },
+#endif
{ "maddress", do_multiaddr },
{ "route", do_iproute },
{ "rule", do_iprule },
{ "neighbor", do_ipneigh },
{ "neighbour", do_ipneigh },
+#ifndef IPROUTE2_TINY
{ "ntable", do_ipntable },
{ "ntbl", do_ipntable },
+#endif
{ "link", do_iplink },
+#ifndef IPROUTE2_TINY
{ "l2tp", do_ipl2tp },
{ "fou", do_ipfou },
+#endif
{ "ila", do_ipila },
{ "macsec", do_ipmacsec },
{ "tunnel", do_iptunnel },
{ "tunl", do_iptunnel },
+#ifndef IPROUTE2_TINY
{ "tuntap", do_iptuntap },
{ "tap", do_iptuntap },
{ "token", do_iptoken },
{ "tcpmetrics", do_tcp_metrics },
{ "tcp_metrics", do_tcp_metrics },
+#endif
{ "monitor", do_ipmonitor },
+#ifndef IPROUTE2_TINY
{ "xfrm", do_xfrm },
+#endif
{ "mroute", do_multiroute },
{ "mrule", do_multirule },
{ "netns", do_netns },
+#ifndef IPROUTE2_TINY
{ "netconf", do_ipnetconf },
+#endif
{ "vrf", do_ipvrf},
{ "sr", do_seg6 },
+#ifndef IPROUTE2_TINY
{ "nexthop", do_ipnh },
{ "mptcp", do_mptcp },
+#endif
{ "help", do_help },
{ 0 }
};
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -3,6 +3,10 @@ include ../config.mk
CFLAGS += $(FPIC)
+ifeq ($(IP_CONFIG_TINY),y)
+ CFLAGS += -DIPROUTE2_TINY
+endif
+
UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o

View File

@@ -0,0 +1,45 @@
--- a/tc/Makefile
+++ b/tc/Makefile
@@ -114,7 +114,7 @@ LDLIBS += -L. -lm
ifeq ($(SHARED_LIBS),y)
LDLIBS += -ldl
-LDFLAGS += -Wl,-export-dynamic
+LDFLAGS += -Wl,--dynamic-list=dynsyms.list
endif
TCLIB := tc_core.o
@@ -144,7 +144,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc
all: tc $(TCSO)
tc: $(TCOBJ) $(LIBNETLINK) libtc.a
- $(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
+ $(QUIET_LINK)$(CC) $(filter-out dynsyms.list, $^) $(LDFLAGS) $(LDLIBS) -o $@
libtc.a: $(TCLIB)
$(QUIET_AR)$(AR) rcs $@ $^
@@ -166,6 +166,7 @@ install: all
clean:
rm -f $(TCOBJ) $(TCLIB) libtc.a tc *.so emp_ematch.tab.h; \
rm -f emp_ematch.tab.*
+ rm -f dynsyms.list
q_atm.so: q_atm.c
$(QUIET_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fpic -o q_atm.so q_atm.c -latm
@@ -205,4 +206,16 @@ static-syms.h: $(wildcard *.c)
sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \
done > $@
+else
+
+tc: dynsyms.list
+m_xt.so: dynsyms.list
+dynsyms.list: $(wildcard *.c)
+ files="$(filter-out $(patsubst %.so,%.c,$(TCSO)), $^)" ; \
+ echo "{" > $@ ; \
+ for s in `grep -B 3 '\<dlsym' $$files | sed -n '/snprintf/{s:.*"\([^"]*\)".*:\1:;s:%s::;p}'` ; do \
+ sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:\1;:;p}' $$files ; \
+ done >> $@ ; \
+ echo "show_stats; print_nl; print_tm; parse_rtattr; parse_rtattr_flags; get_u32; matches; addattr_l; addattr_nest; addattr_nest_end; };" >> $@
+
endif

View File

@@ -0,0 +1,41 @@
From 4e7dbf76227e8c7be7897dc81def3011f637864d Mon Sep 17 00:00:00 2001
From: Jonas Gorski <jogo@openwrt.org>
Date: Thu, 30 May 2013 11:54:04 +0200
Subject: [PATCH] add support for dropping with FAILED_POLICY
---
include/linux/fib_rules.h | 4 ++++
include/linux/rtnetlink.h | 1 +
ip/rtm_map.c | 4 ++++
3 files changed, 9 insertions(+)
--- a/ip/rtm_map.c
+++ b/ip/rtm_map.c
@@ -54,6 +54,8 @@ char *rtnl_rtntype_n2a(int id, char *buf
return "nat";
case RTN_XRESOLVE:
return "xresolve";
+ case RTN_FAILED_POLICY:
+ return "failed_policy";
default:
snprintf(buf, len, "%d", id);
return buf;
@@ -89,6 +91,8 @@ int rtnl_rtntype_a2n(int *id, char *arg)
res = RTN_UNICAST;
else if (strcmp(arg, "throw") == 0)
res = RTN_THROW;
+ else if (strcmp(arg, "failed_policy") == 0)
+ res = RTN_FAILED_POLICY;
else {
res = strtoul(arg, &end, 0);
if (!end || end == arg || *end || res > 255)
--- a/include/uapi/linux/rtnetlink.h
+++ b/include/uapi/linux/rtnetlink.h
@@ -256,6 +256,7 @@ enum {
RTN_THROW, /* Not in this table */
RTN_NAT, /* Translate this address */
RTN_XRESOLVE, /* Use external resolver */
+ RTN_FAILED_POLICY, /* Source address failed policy */
__RTN_MAX
};

View File

@@ -0,0 +1,20 @@
--- a/configure
+++ b/configure
@@ -279,7 +279,7 @@ int main(int argc, char **argv) {
}
EOF
- $CC -o $TMPDIR/libbpf_test $TMPDIR/libbpf_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1
+ $CC -o $TMPDIR/libbpf_test $TMPDIR/libbpf_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS $LDFLAGS >/dev/null 2>&1
local ret=$?
rm -f $TMPDIR/libbpf_test.c $TMPDIR/libbpf_test
@@ -297,7 +297,7 @@ int main(int argc, char **argv) {
}
EOF
- $CC -o $TMPDIR/libbpf_sec_test $TMPDIR/libbpf_sec_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS >/dev/null 2>&1
+ $CC -o $TMPDIR/libbpf_sec_test $TMPDIR/libbpf_sec_test.c $LIBBPF_CFLAGS $LIBBPF_LDLIBS $LDFLAGS >/dev/null 2>&1
local ret=$?
rm -f $TMPDIR/libbpf_sec_test.c $TMPDIR/libbpf_sec_test

View File

@@ -0,0 +1,22 @@
--- a/ip/Makefile
+++ b/ip/Makefile
@@ -26,7 +26,7 @@ STATIC_SYM_SOURCES:=$(filter-out $(STATI
ALLOBJ=$(IPOBJ) $(RTMONOBJ)
SCRIPTS=ifcfg rtpr routel routef
-TARGETS=ip rtmon
+TARGETS=$(findstring ip,$(BUILD_VARIANT)) rtmon
all: $(TARGETS) $(SCRIPTS)
--- a/tc/Makefile
+++ b/tc/Makefile
@@ -141,7 +141,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc
$(QUIET_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fpic $< -o $@
-all: tc $(TCSO)
+all: $(findstring tc,$(BUILD_VARIANT)) $(TCSO)
tc: $(TCOBJ) $(LIBNETLINK) libtc.a
$(QUIET_LINK)$(CC) $(filter-out dynsyms.list, $^) $(LDFLAGS) $(LDLIBS) -o $@

View File

@@ -0,0 +1,19 @@
--- a/configure
+++ b/configure
@@ -431,14 +431,8 @@ EOF
if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then
echo "no"
else
- if ${PKG_CONFIG} libbsd --exists; then
- echo 'CFLAGS += -DHAVE_LIBBSD' `${PKG_CONFIG} libbsd --cflags` >>$CONFIG
- echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG
- echo "no"
- else
- echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG
- echo "yes"
- fi
+ echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG
+ echo "yes"
fi
rm -f $TMPDIR/strtest.c $TMPDIR/strtest
}

View File

@@ -0,0 +1,11 @@
--- a/configure
+++ b/configure
@@ -374,7 +374,7 @@ check_libbpf()
check_selinux()
# SELinux is a compile time option in the ss utility
{
- if ${PKG_CONFIG} libselinux --exists; then
+ if [ "${HAVE_SELINUX}" = "y" ] && ${PKG_CONFIG} libselinux --exists; then
echo "HAVE_SELINUX:=y" >>$CONFIG
echo "yes"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,243 @@
--- a/tc/Makefile 2019-04-08 12:48:15.425854828 +0530
+++ b/tc/Makefile 2019-04-08 13:03:17.204741000 +0530
@@ -54,6 +54,7 @@ TCMODULES += m_bpf.o
TCMODULES += m_sample.o
TCMODULES += m_ct.o
TCMODULES += m_gate.o
+TCMODULES += m_nssmirred.o
TCMODULES += p_ip.o
TCMODULES += p_ip6.o
TCMODULES += p_icmp.o
--- /dev/null 1970-01-01 05:30:00.000000000 +0530
+++ b/tc/m_nssmirred.c 2019-06-19 14:25:51.369793000 +0530
@@ -0,0 +1,183 @@
+/*
+ **************************************************************************
+ * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all copies.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ **************************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include "utils.h"
+#include "tc_util.h"
+#include "tc_common.h"
+#include <linux/tc_act/tc_nssmirred.h>
+
+/*
+ * explain()
+ * API to print the explaination of nssmirred action statement's
+ * elements.
+ */
+static void explain(void)
+{
+ fprintf(stderr, "Usage: nssmirred redirect <dev TO_DEVICENAME fromdev FROM_DEVICENAME> \n");
+ fprintf(stderr, "where: \n");
+ fprintf(stderr, "\tTO_DEVICENAME is the devicename to redirect to\n");
+ fprintf(stderr, "\tFROM_DEVICENAME is the devicename to redirect from\n");
+}
+
+/*
+ * usage()
+ * API to show the usage of the nssmirred action.
+ */
+static void usage(void)
+{
+ explain();
+ exit(-1);
+}
+
+/*
+ * parse_nss_mirred()
+ * Parse and validate the nssmirred action statement.
+ */
+static int parse_nss_mirred(struct action_util *a, int *argc_p, char ***argv_p,
+ int tca_id, struct nlmsghdr *n)
+{
+ int idx, argc = *argc_p;
+ char **argv = *argv_p;
+ struct tc_nss_mirred p;
+ struct rtattr *tail;
+
+ if (argc < 0) {
+ fprintf(stderr, "nssmirred bad argument count %d. Try option \"help\"\n", argc);
+ goto error;
+ }
+
+ if (matches(*argv, "nssmirred")) {
+ fprintf(stderr, "nssmirred bad argument %s. Try option \"help\"\n", *argv);
+ goto error;
+ }
+
+ NEXT_ARG();
+ if (!matches(*argv, "help")) {
+ usage();
+ }
+
+ if (matches(*argv, "redirect")) {
+ fprintf(stderr, "nssmirred bad argument %s. Try option \"help\"\n", *argv);
+ goto error;
+ }
+
+ NEXT_ARG();
+ if (matches(*argv, "dev")) {
+ fprintf(stderr, "nssmirred: bad value %s. Try option \"help\"\n", *argv);
+ goto error;
+ }
+
+ NEXT_ARG();
+ memset(&p, 0, sizeof(struct tc_nss_mirred));
+ if ((idx = ll_name_to_index(*argv)) == 0) {
+ fprintf(stderr, "Cannot find to device \"%s\"\n", *argv);
+ goto error;
+ }
+
+ p.to_ifindex = idx;
+ NEXT_ARG();
+ if (matches(*argv, "fromdev")) {
+ fprintf(stderr, "nssmirred: bad value %s. Try option \"help\"\n", *argv);
+ goto error;
+ }
+
+ NEXT_ARG();
+ if ((idx = ll_name_to_index(*argv)) == 0) {
+ fprintf(stderr, "Cannot find from device \"%s\"\n", *argv);
+ goto error;
+ }
+
+ p.from_ifindex = idx;
+ p.action = TC_ACT_STOLEN;
+ tail = NLMSG_TAIL(n);
+ addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+ addattr_l(n, MAX_MSG, TCA_NSS_MIRRED_PARMS, &p, sizeof (p));
+ tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+ argc--;
+ argv++;
+ *argc_p = argc;
+ *argv_p = argv;
+ return 0;
+
+error:
+ return -1;
+}
+
+/*
+ * print_nss_mirred()
+ * Print information related to nssmirred action.
+ */
+static int print_nss_mirred(struct action_util *au, FILE * f, struct rtattr *arg)
+{
+ struct tc_nss_mirred *p;
+ struct rtattr *tb[TCA_NSS_MIRRED_MAX + 1];
+ const char *from_dev, *to_dev;
+
+ if (arg == NULL) {
+ return -1;
+ }
+
+ parse_rtattr_nested(tb, TCA_NSS_MIRRED_MAX, arg);
+
+ if (tb[TCA_NSS_MIRRED_PARMS] == NULL) {
+ fprintf(f, "[NULL nssmirred parameters]");
+ goto error;
+ }
+
+ p = RTA_DATA(tb[TCA_NSS_MIRRED_PARMS]);
+ if ((from_dev = ll_index_to_name(p->from_ifindex)) == 0) {
+ fprintf(stderr, "Invalid interface (index: %d)\n", p->from_ifindex);
+ goto error;
+ }
+
+ if ((to_dev = ll_index_to_name(p->to_ifindex)) == 0) {
+ fprintf(stderr, "Invalid interface (index: %d)\n", p->to_ifindex);
+ goto error;
+ }
+
+ fprintf(f, "nssmirred (%s to device %s) stolen\n", from_dev, to_dev);
+ fprintf(f, "\tindex %d ref %d bind %d\n",p->index,p->refcnt,p->bindcnt);
+
+ if (show_stats) {
+ if (tb[TCA_NSS_MIRRED_TM]) {
+ struct tcf_t *tm = RTA_DATA(tb[TCA_NSS_MIRRED_TM]);
+ print_tm(f,tm);
+ }
+ }
+ return 0;
+
+error:
+ return -1;
+}
+
+/*
+ * nssmirred_action_util
+ * nssmirred action utility structure.
+ */
+struct action_util nssmirred_action_util = {
+ .id = "nssmirred",
+ .parse_aopt = parse_nss_mirred,
+ .print_aopt = print_nss_mirred,
+};
--- /dev/null 1970-01-01 05:30:00.000000000 +0530
+++ a/include/linux/tc_act/tc_nssmirred.h 2019-06-19 14:25:40.787768000 +0530
@@ -0,0 +1,44 @@
+/*
+ **************************************************************************
+ * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all copies.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ **************************************************************************
+ */
+
+#ifndef __LINUX_TC_NSS_MIR_H
+#define __LINUX_TC_NSS_MIR_H
+
+#include <linux/types.h>
+#include <linux/pkt_cls.h>
+
+/*
+ * tc_nss_mirred
+ * Structure for nssmirred action.
+ */
+struct tc_nss_mirred {
+ tc_gen;
+ __u32 from_ifindex; /* ifindex of the port to be redirected from */
+ __u32 to_ifindex; /* ifindex of the port to be redirected to */
+};
+
+/*
+ * Types of nssmirred action parameters.
+ */
+enum {
+ TCA_NSS_MIRRED_UNSPEC,
+ TCA_NSS_MIRRED_TM,
+ TCA_NSS_MIRRED_PARMS,
+ __TCA_NSS_MIRRED_MAX
+};
+#define TCA_NSS_MIRRED_MAX (__TCA_NSS_MIRRED_MAX - 1)
+
+#endif /* __LINUX_TC_NSS_MIR_H */