m_gact.c revision 95812b56a5a66e7e9a21744cfe8bc0bb9791ea98
12265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger/*
22265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger * 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 *
92265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger * Authors:  J Hadi Salim (hadi@cyberus.ca)
102265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger *
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
302265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerstatic 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,
482265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		"Where: ACTION := reclassify | drop | continue | pass "
492265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		        "RAND := random <RANDTYPE> <ACTION> <VAL>"
502265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		        "RANDTYPE := netrand | determ"
512265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			"VAL : = value not exceeding 10000"
522265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			"INDEX := index value used"
532265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			"\n");
542265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#else
552265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n");
562265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(stderr,
572265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		"Where: ACTION := reclassify | drop | continue | pass "
582265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		"INDEX := index value used"
592265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			"\n");
602265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
612265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
622265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
632265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#define usage() return(-1)
642265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
652265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerint
662265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerget_act(char ***argv_p)
672265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
682265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	char **argv = *argv_p;
692265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
702265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (matches(*argv, "reclassify") == 0) {
712265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_RECLASSIFY;
722265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "drop") == 0 || matches(*argv, "shot") == 0) {
732265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_SHOT;
742265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "continue") == 0) {
752265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_UNSPEC;
762265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "pipe") == 0) {
772265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_PIPE;
782265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else if (matches(*argv, "pass") == 0 || matches(*argv, "ok") == 0)  {
792265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return TC_ACT_OK;
802265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else {
812265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		fprintf(stderr,"bad action type %s\n",*argv);
822265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -10;
832265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
842265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
852265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
862265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerint
872265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerparse_gact(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
882265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
892265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int argc = *argc_p;
902265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	char **argv = *argv_p;
912265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int ok = 0;
922265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int action = TC_POLICE_RECLASSIFY;
932265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact p;
942265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
952265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	int rd = 0;
962265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact_p pp;
972265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
982265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct rtattr *tail;
992265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1002265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	memset(&p, 0, sizeof (p));
1012265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	p.action = TC_POLICE_RECLASSIFY;
1022265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1032265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (argc < 0)
1042265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
1052265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1062265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1072265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (matches(*argv, "gact") == 0) {
1082265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		ok++;
1092265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else {
1102265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		action = get_act(&argv);
1112265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (action != -10) {
1122265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			p.action = action;
1132265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			ok++;
1142265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		} else {
1152265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			explain();
1162265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			return action;
1172265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
1182265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1192265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1202265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (ok) {
1212265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		argc--;
1222265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		argv++;
1232265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1242265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1252265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
1262265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (ok && argc > 0) {
1272265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (matches(*argv, "random") == 0) {
1282265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			rd = 1;
1292265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			NEXT_ARG();
1302265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (matches(*argv, "netrand") == 0) {
1312265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				NEXT_ARG();
1322265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				pp.ptype = PGACT_NETRAND;
1332265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			} else if  (matches(*argv, "determ") == 0) {
1342265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				NEXT_ARG();
1352265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				pp.ptype = PGACT_DETERM;
1362265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			} else {
1372265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal \"random type\"\n");
1382265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1392265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1402265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1412265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			action = get_act(&argv);
1422265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (action != -10) { /* FIXME */
1432265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				pp.paction = action;
1442265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			} else {
1452265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				explain();
1462265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1472265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1482265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argc--;
1492265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argv++;
1502265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (get_u16(&pp.pval, *argv, 10)) {
1512265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal probability val 0x%x\n",pp.pval);
1522265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1532265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1542265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (pp.pval > 10000) {
1552265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal probability val  0x%x\n",pp.pval);
1562265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1572265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1582265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argc--;
1592265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argv++;
1602265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
1612265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1622265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
1632265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1642265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (argc > 0) {
1652265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (matches(*argv, "index") == 0) {
1662265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			NEXT_ARG();
1672265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			if (get_u32(&p.index, *argv, 10)) {
1682265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				fprintf(stderr, "Illegal \"index\"\n");
1692265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger				return -1;
1702265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			}
1712265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argc--;
1722265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			argv++;
1732265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			ok++;
1742265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
1752265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1762265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1772265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (!ok)
1782265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
1792265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1802265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	tail = (struct rtattr *) (((void *) n) + NLMSG_ALIGN(n->nlmsg_len));
1812265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	addattr_l(n, MAX_MSG, tca_id, NULL, 0);
1822265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	addattr_l(n, MAX_MSG, TCA_GACT_PARMS, &p, sizeof (p));
1832265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
1842265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (rd) {
1852265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		addattr_l(n, MAX_MSG, TCA_GACT_PROB, &pp, sizeof (pp));
1862265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
1872265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
1882265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	tail->rta_len =
1892265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	    (((void *) n) + NLMSG_ALIGN(n->nlmsg_len)) - (void *) tail;
1902265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1912265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	*argc_p = argc;
1922265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	*argv_p = argv;
1932265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	return 0;
1942265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
1952265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
1962265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerint
1972265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemmingerprint_gact(struct action_util *au,FILE * f, struct rtattr *arg)
1982265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger{
1992265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	SPRINT_BUF(b1);
2002265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
2012265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	SPRINT_BUF(b2);
2022265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact_p *pp = NULL;
2032265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact_p pp_dummy;
2042265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
2052265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct tc_gact *p = NULL;
2062265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	struct rtattr *tb[TCA_GACT_MAX + 1];
2072265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2082265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (arg == NULL)
2092265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
2102265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2112265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	memset(tb, 0, sizeof (tb));
2122265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	parse_rtattr(tb, TCA_GACT_MAX, RTA_DATA(arg), RTA_PAYLOAD(arg));
2132265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2142265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (tb[TCA_GACT_PARMS] == NULL) {
2152265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		fprintf(f, "[NULL gact parameters]");
2162265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		return -1;
2172265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
2182265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	p = RTA_DATA(tb[TCA_GACT_PARMS]);
2192265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
2202265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "gact action %s", action_n2a(p->action, b1, sizeof (b1)));
2212265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#ifdef CONFIG_GACT_PROB
2222265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (NULL != tb[TCA_GACT_PROB]) {
2232265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		pp = RTA_DATA(tb[TCA_GACT_PROB]);
2242265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	} else {
2252265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		/* need to keep consistent output */
2262265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		memset(&pp_dummy, 0, sizeof (pp_dummy));
2272265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		pp = &pp_dummy;
2282265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
2292265da08e838f2ac0187b8c4e4a55387b21da976osdl.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);
2302265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger#endif
2312265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "\n\t index %d ref %d bind %d",p->index, p->refcnt, p->bindcnt);
2322265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	if (show_stats) {
2332265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		if (tb[TCA_GACT_TM]) {
2342265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			struct tcf_t *tm = RTA_DATA(tb[TCA_GACT_TM]);
2352265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger			print_tm(f,tm);
2362265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger		}
2372265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	}
2382265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	fprintf(f, "\n ");
2392265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	return 0;
2402265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger}
2412265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger
24295812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct action_util gact_action_util = {
2432265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	.id = "gact",
2442265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	.parse_aopt = parse_gact,
2452265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger	.print_aopt = print_gact,
2462265da08e838f2ac0187b8c4e4a55387b21da976osdl.net!shemminger};
247