12265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger/*
2ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * m_gact.c		generic actions module
32265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *
42265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *		This program is free software; you can distribute it and/or
52265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *		modify it under the terms of the GNU General Public License
62265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *		as published by the Free Software Foundation; either version
72265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *		2 of the License, or (at your option) any later version.
82265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *
9ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger * Authors:  J Hadi Salim (hadi@cyberus.ca)
10ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger *
112265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger */
122265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
132265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <stdio.h>
142265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <stdlib.h>
152265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <unistd.h>
162265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <syslog.h>
172265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <fcntl.h>
182265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <sys/socket.h>
192265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <netinet/in.h>
202265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <arpa/inet.h>
212265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <string.h>
222265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
232265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include "utils.h"
242265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include "tc_util.h"
252265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#include <linux/tc_act/tc_gact.h>
262265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
272265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger/* define to turn on probablity stuff */
282265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
292265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
30ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerstatic const char *prob_n2a(int p)
312265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
322265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (p == PGACT_NONE)
332265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return "none";
342265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (p == PGACT_NETRAND)
352265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return "netrand";
362265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (p == PGACT_DETERM)
372265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return "determ";
382265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	return "none";
392265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
402265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
412265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
422265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerstatic void
432265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerexplain(void)
442265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
452265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
462265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(stderr, "Usage: ... gact <ACTION> [RAND] [INDEX]\n");
472265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(stderr,
48ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim		"Where: \tACTION := reclassify | drop | continue | pass \n"
49ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim		        "\tRAND := random <RANDTYPE> <ACTION> <VAL>\n"
50ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim		        "\tRANDTYPE := netrand | determ\n"
51ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim			"\tVAL : = value not exceeding 10000\n"
52ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim			"\tINDEX := index value used\n"
53302d3fb720d920ca15b7bfb979532cc0e5d7f20fStephen Hemminger			"\n");
542265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#else
552265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n");
562265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(stderr,
57302d3fb720d920ca15b7bfb979532cc0e5d7f20fStephen Hemminger		"Where: \tACTION := reclassify | drop | continue | pass \n"
58ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim		"\tINDEX := index value used\n"
59f1e4f042a5bb36538702cd4f0471149ff06c7a15jamal		"\n");
602265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
612265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
622265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
63302d3fb720d920ca15b7bfb979532cc0e5d7f20fStephen Hemminger
64ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salimstatic void
65ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salimusage(void)
66ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim{
67ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim	explain();
68ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim	exit(-1);
69ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim}
70ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim
712265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerint
722265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerget_act(char ***argv_p)
732265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
742265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	char **argv = *argv_p;
752265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
762265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (matches(*argv, "reclassify") == 0) {
772265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_RECLASSIFY;
782265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "drop") == 0 || matches(*argv, "shot") == 0) {
792265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_SHOT;
802265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "continue") == 0) {
812265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_UNSPEC;
822265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "pipe") == 0) {
832265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_PIPE;
842265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "pass") == 0 || matches(*argv, "ok") == 0)  {
852265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_OK;
862265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else {
872265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		fprintf(stderr,"bad action type %s\n",*argv);
882265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -10;
892265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
902265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
912265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
922265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerint
932265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerparse_gact(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
942265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
952265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int argc = *argc_p;
962265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	char **argv = *argv_p;
972265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int ok = 0;
982265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int action = TC_POLICE_RECLASSIFY;
992265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact p;
1002265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
1012265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int rd = 0;
1022265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact_p pp;
1032265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
1042265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct rtattr *tail;
1052265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1062265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	memset(&p, 0, sizeof (p));
1072265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	p.action = TC_POLICE_RECLASSIFY;
1082265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1092265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (argc < 0)
1102265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
1112265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1122265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1132265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (matches(*argv, "gact") == 0) {
1142265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		ok++;
1152265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else {
1162265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		action = get_act(&argv);
1172265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (action != -10) {
1182265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			p.action = action;
1192265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			ok++;
1202265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		} else {
1212265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			explain();
1222265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			return action;
1232265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
1242265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1252265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1262265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (ok) {
1272265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		argc--;
1282265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		argv++;
1292265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1302265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1312265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
1322265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (ok && argc > 0) {
1332265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (matches(*argv, "random") == 0) {
1342265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			rd = 1;
1352265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			NEXT_ARG();
1362265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (matches(*argv, "netrand") == 0) {
1372265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				NEXT_ARG();
1382265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				pp.ptype = PGACT_NETRAND;
1392265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			} else if  (matches(*argv, "determ") == 0) {
1402265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				NEXT_ARG();
1412265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				pp.ptype = PGACT_DETERM;
1422265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			} else {
1432265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal \"random type\"\n");
1442265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1452265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1462265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1472265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			action = get_act(&argv);
1482265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (action != -10) { /* FIXME */
1492265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				pp.paction = action;
1502265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			} else {
1512265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				explain();
1522265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1532265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1542265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argc--;
1552265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argv++;
1562265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (get_u16(&pp.pval, *argv, 10)) {
1572265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal probability val 0x%x\n",pp.pval);
1582265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1592265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1602265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (pp.pval > 10000) {
1612265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal probability val  0x%x\n",pp.pval);
1622265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1632265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1642265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argc--;
1652265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argv++;
166ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim		} else if (matches(*argv, "help") == 0) {
167ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim				usage();
1682265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
1692265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1702265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
1712265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1722265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (argc > 0) {
1732265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (matches(*argv, "index") == 0) {
1742265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			NEXT_ARG();
1752265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (get_u32(&p.index, *argv, 10)) {
1762265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal \"index\"\n");
1772265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1782265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1792265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argc--;
1802265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argv++;
1812265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			ok++;
182f1e4f042a5bb36538702cd4f0471149ff06c7a15jamal		} else if (matches(*argv, "help") == 0) {
183302d3fb720d920ca15b7bfb979532cc0e5d7f20fStephen Hemminger				usage();
1842265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
1852265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1862265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1872265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (!ok)
1882265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
1892265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
190228569c3ff79468f4c7580fd88b0d6a34ebdc311n);	tail = NLMSG_TAIL(n);
1912265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	addattr_l(n, MAX_MSG, tca_id, NULL, 0);
1922265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	addattr_l(n, MAX_MSG, TCA_GACT_PARMS, &p, sizeof (p));
1932265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
1942265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (rd) {
1952265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		addattr_l(n, MAX_MSG, TCA_GACT_PROB, &pp, sizeof (pp));
1962265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1972265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
198228569c3ff79468f4c7580fd88b0d6a34ebdc311void *) NLMSG_TAIL(n) - (void *) tail;	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
1992265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2002265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	*argc_p = argc;
2012265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	*argv_p = argv;
2022265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	return 0;
2032265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
2042265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2052265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerint
2062265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerprint_gact(struct action_util *au,FILE * f, struct rtattr *arg)
2072265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
2082265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	SPRINT_BUF(b1);
2092265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
2102265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	SPRINT_BUF(b2);
2112265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact_p *pp = NULL;
2122265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact_p pp_dummy;
2132265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
2142265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact *p = NULL;
2152265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct rtattr *tb[TCA_GACT_MAX + 1];
2162265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2172265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (arg == NULL)
2182265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
2192265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2203b3ecd31c1e513f029ebbb83f2e808553de0a741tb, TCA_GACT_MAX, arg);	parse_rtattr_nested(tb, TCA_GACT_MAX, arg);
2212265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2222265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (tb[TCA_GACT_PARMS] == NULL) {
2232265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		fprintf(f, "[NULL gact parameters]");
2242265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
2252265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
2262265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	p = RTA_DATA(tb[TCA_GACT_PARMS]);
2272265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2282265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "gact action %s", action_n2a(p->action, b1, sizeof (b1)));
2292265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
2302265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (NULL != tb[TCA_GACT_PROB]) {
2312265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		pp = RTA_DATA(tb[TCA_GACT_PROB]);
2322265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else {
2332265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		/* need to keep consistent output */
2342265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		memset(&pp_dummy, 0, sizeof (pp_dummy));
2352265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		pp = &pp_dummy;
2362265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
2372265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "\n\t random type %s %s val %d",prob_n2a(pp->ptype), action_n2a(pp->paction, b2, sizeof (b2)), pp->pval);
2382265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
2392265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "\n\t index %d ref %d bind %d",p->index, p->refcnt, p->bindcnt);
2402265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (show_stats) {
2412265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (tb[TCA_GACT_TM]) {
2422265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			struct tcf_t *tm = RTA_DATA(tb[TCA_GACT_TM]);
2432265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			print_tm(f,tm);
2442265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
2452265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
2462265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "\n ");
2472265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	return 0;
2482265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
2492265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
25095812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct action_util gact_action_util = {
2512265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	.id = "gact",
2522265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	.parse_aopt = parse_gact,
2532265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	.print_aopt = print_gact,
2542265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger};
255