1f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck/*
2f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * m_skbedit.c		SKB Editing module
3f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *
4f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * Copyright (c) 2008, Intel Corporation.
5f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *
6f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * This program is free software; you can redistribute it and/or modify it
7f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * under the terms and conditions of the GNU General Public License,
8f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * version 2, as published by the Free Software Foundation.
9f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *
10f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * This program is distributed in the hope it will be useful, but WITHOUT
11f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * more details.
14f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *
15f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * You should have received a copy of the GNU General Public License along with
16f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * Place - Suite 330, Boston, MA 02111-1307 USA.
18f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *
19f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * Authors:	Alexander Duyck <alexander.h.duyck@intel.com>
20f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *
21f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck */
22f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
23f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <stdio.h>
24f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <stdlib.h>
25f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <unistd.h>
26f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <string.h>
27f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include "utils.h"
28f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include "tc_util.h"
29f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <linux/tc_act/tc_skbedit.h>
30f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
31f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic void
32f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckexplain(void)
33f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{
34e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim 	fprintf(stderr, "Usage: ... skbedit <[QM] [PM] [MM]>\n"
35e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		"QM = queue_mapping QUEUE_MAPPING\n"
36e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		"PM = priority PRIORITY \n"
37e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		"MM = mark MARK \n"
38e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		"QUEUE_MAPPING = device transmit queue to use\n"
39e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		"PRIORITY = classID to assign to priority field\n"
40e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		"MARK = firewall mark to set\n");
41f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck}
42f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
43f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic void
44f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckusage(void)
45f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{
46f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	explain();
47f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	exit(-1);
48f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck}
49f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
50f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic int
51f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckparse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
52f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	      struct nlmsghdr *n)
53f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{
54f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	int argc = *argc_p;
55f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	char **argv = *argv_p;
56f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	int ok = 0;
57f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	struct rtattr *tail;
58f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	unsigned int tmp;
59f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	__u16 queue_mapping;
60e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim	__u32 flags = 0, priority, mark;
6146a6573259f46f86eb0048a2c805b24ff4183fa6Stephen Hemminger	struct tc_skbedit sel = { 0 };
62f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
63f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (matches(*argv, "skbedit") != 0)
64f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		return -1;
65f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
66f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	NEXT_ARG();
67f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
68f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	while (argc > 0) {
69f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		if (matches(*argv, "queue_mapping") == 0) {
70f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			flags |= SKBEDIT_F_QUEUE_MAPPING;
71f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
72f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			if (get_unsigned(&tmp, *argv, 10) || tmp > 65535) {
73f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck				fprintf(stderr, "Illegal queue_mapping\n");
74f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck				return -1;
75f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			}
76f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			queue_mapping = tmp;
77f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			ok++;
78f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else if (matches(*argv, "priority") == 0) {
79f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			flags |= SKBEDIT_F_PRIORITY;
80f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
81f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			if (get_tc_classid(&priority, *argv)) {
82f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck				fprintf(stderr, "Illegal priority\n");
83f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck				return -1;
84f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			}
85f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			ok++;
86e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		} else if (matches(*argv, "mark") == 0) {
87e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim			flags |= SKBEDIT_F_MARK;
88e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim			NEXT_ARG();
89e906975a53df2614a08d32017aa6e3c70f204a2djamal			if (get_u32(&mark, *argv, 0)) {
90e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim				fprintf(stderr, "Illegal mark\n");
91e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim				return -1;
92e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim			}
93e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim			ok++;
94f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else if (matches(*argv, "help") == 0) {
95f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			usage();
96f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else {
97f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			break;
98f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		}
99f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		argc--;
100f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		argv++;
101f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
102f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
103f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (argc) {
104f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		if (matches(*argv, "reclassify") == 0) {
105f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			sel.action = TC_ACT_RECLASSIFY;
106f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
107f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else if (matches(*argv, "pipe") == 0) {
108f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			sel.action = TC_ACT_PIPE;
109f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
110f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else if (matches(*argv, "drop") == 0 ||
111f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			matches(*argv, "shot") == 0) {
112f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			sel.action = TC_ACT_SHOT;
113f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
114f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else if (matches(*argv, "continue") == 0) {
115f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			sel.action = TC_ACT_UNSPEC;
116f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
117f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		} else if (matches(*argv, "pass") == 0) {
118f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			sel.action = TC_ACT_OK;
119f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
120f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		}
121f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
122f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
123f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (argc) {
124f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		if (matches(*argv, "index") == 0) {
125f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			NEXT_ARG();
126f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			if (get_u32(&sel.index, *argv, 10)) {
127f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck				fprintf(stderr, "Pedit: Illegal \"index\"\n");
128f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck				return -1;
129f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			}
130f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			argc--;
131f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			argv++;
132f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			ok++;
133f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		}
134f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
135f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
136f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (!ok) {
137f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		explain();
138f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		return -1;
139f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
140f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
141f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
142f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	tail = NLMSG_TAIL(n);
143f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	addattr_l(n, MAX_MSG, tca_id, NULL, 0);
144f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	addattr_l(n, MAX_MSG, TCA_SKBEDIT_PARMS, &sel, sizeof(sel));
145f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (flags & SKBEDIT_F_QUEUE_MAPPING)
146f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		addattr_l(n, MAX_MSG, TCA_SKBEDIT_QUEUE_MAPPING,
147f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			  &queue_mapping, sizeof(queue_mapping));
148f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (flags & SKBEDIT_F_PRIORITY)
149f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		addattr_l(n, MAX_MSG, TCA_SKBEDIT_PRIORITY,
150f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			  &priority, sizeof(priority));
151e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim	if (flags & SKBEDIT_F_MARK)
152e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		addattr_l(n, MAX_MSG, TCA_SKBEDIT_MARK,
153e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim			  &mark, sizeof(mark));
154f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
155f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
156f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	*argc_p = argc;
157f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	*argv_p = argv;
158f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	return 0;
159f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck}
160f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
161f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg)
162f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{
163f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	struct rtattr *tb[TCA_SKBEDIT_MAX + 1];
164f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	SPRINT_BUF(b1);
165f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	__u32 *priority;
166e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim	__u32 *mark;
167f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	__u16 *queue_mapping;
168f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
169f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (arg == NULL)
170f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		return -1;
171f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
172f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	parse_rtattr_nested(tb, TCA_SKBEDIT_MAX, arg);
173f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
174f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (tb[TCA_SKBEDIT_PARMS] == NULL) {
175f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		fprintf(f, "[NULL skbedit parameters]");
176f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		return -1;
177f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
178f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
179f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	fprintf(f, " skbedit");
180f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
181f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (tb[TCA_SKBEDIT_QUEUE_MAPPING] != NULL) {
182f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		queue_mapping = RTA_DATA(tb[TCA_SKBEDIT_QUEUE_MAPPING]);
183f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		fprintf(f, " queue_mapping %u", *queue_mapping);
184f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
185f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (tb[TCA_SKBEDIT_PRIORITY] != NULL) {
186f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		priority = RTA_DATA(tb[TCA_SKBEDIT_PRIORITY]);
187f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		fprintf(f, " priority %s", sprint_tc_classid(*priority, b1));
188f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
189e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim	if (tb[TCA_SKBEDIT_MARK] != NULL) {
190e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		mark = RTA_DATA(tb[TCA_SKBEDIT_MARK]);
191e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim		fprintf(f, " mark %d", *mark);
192e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim	}
193f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
194f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	if (show_stats) {
195f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		if (tb[TCA_SKBEDIT_TM]) {
196f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			struct tcf_t *tm = RTA_DATA(tb[TCA_SKBEDIT_TM]);
197f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck			print_tm(f, tm);
198f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck		}
199f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	}
200f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
201f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	return 0;
202f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck}
203f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck
204f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstruct action_util skbedit_action_util = {
205f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	.id = "skbedit",
206f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	.parse_aopt = parse_skbedit,
207f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck	.print_aopt = print_skbedit,
208f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck};
209