1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * m_gact.c generic actions module 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is free software; you can distribute it and/or 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * modify it under the terms of the GNU General Public License 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * as published by the Free Software Foundation; either version 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 2 of the License, or (at your option) any later version. 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Authors: J Hadi Salim (hadi@cyberus.ca) 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <unistd.h> 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <syslog.h> 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <fcntl.h> 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/socket.h> 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h> 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <arpa/inet.h> 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "tc_util.h" 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <linux/tc_act/tc_gact.h> 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* define to turn on probablity stuff */ 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic const char *prob_n2a(int p) 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (p == PGACT_NONE) 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return "none"; 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (p == PGACT_NETRAND) 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return "netrand"; 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (p == PGACT_DETERM) 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return "determ"; 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return "none"; 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatexplain(void) 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Usage: ... gact <ACTION> [RAND] [INDEX]\n"); 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "Where: \tACTION := reclassify | drop | continue | pass \n" 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\tRAND := random <RANDTYPE> <ACTION> <VAL>\n" 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\tRANDTYPE := netrand | determ\n" 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\tVAL : = value not exceeding 10000\n" 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\tINDEX := index value used\n" 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\n"); 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#else 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Usage: ... gact <ACTION> [INDEX]\n"); 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "Where: \tACTION := reclassify | drop | continue | pass \n" 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\tINDEX := index value used\n" 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "\n"); 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatusage(void) 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat exit(-1); 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatget_act(char ***argv_p) 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char **argv = *argv_p; 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "reclassify") == 0) { 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return TC_ACT_RECLASSIFY; 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "drop") == 0 || matches(*argv, "shot") == 0) { 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return TC_ACT_SHOT; 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "continue") == 0) { 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return TC_ACT_UNSPEC; 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "pipe") == 0) { 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return TC_ACT_PIPE; 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "pass") == 0 || matches(*argv, "ok") == 0) { 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return TC_ACT_OK; 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr,"bad action type %s\n",*argv); 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -10; 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatparse_gact(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n) 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int argc = *argc_p; 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char **argv = *argv_p; 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int ok = 0; 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int action = TC_POLICE_RECLASSIFY; 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_gact p; 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int rd = 0; 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_gact_p pp; 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tail; 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&p, 0, sizeof (p)); 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat p.action = TC_POLICE_RECLASSIFY; 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (argc < 0) 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "gact") == 0) { 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ok++; 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat action = get_act(&argv); 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (action != -10) { 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat p.action = action; 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ok++; 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return action; 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ok) { 127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; 128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argv++; 129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ok && argc > 0) { 133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "random") == 0) { 134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat rd = 1; 135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "netrand") == 0) { 137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pp.ptype = PGACT_NETRAND; 139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "determ") == 0) { 140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pp.ptype = PGACT_DETERM; 142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"random type\"\n"); 144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat action = get_act(&argv); 148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (action != -10) { /* FIXME */ 149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pp.paction = action; 150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; 155dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argv++; 156dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u16(&pp.pval, *argv, 10)) { 157dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal probability val 0x%x\n",pp.pval); 158dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 159dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 160dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (pp.pval > 10000) { 161dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal probability val 0x%x\n",pp.pval); 162dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 163dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 164dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; 165dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argv++; 166dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "help") == 0) { 167dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat usage(); 168dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 169dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 170dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 171dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 172dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (argc > 0) { 173dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "index") == 0) { 174dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 175dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_u32(&p.index, *argv, 10)) { 176dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"index\"\n"); 177dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 178dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 179dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; 180dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argv++; 181dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ok++; 182dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "help") == 0) { 183dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat usage(); 184dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 185dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 186dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 187dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!ok) 188dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 189dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 190dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail = NLMSG_TAIL(n); 191dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, MAX_MSG, tca_id, NULL, 0); 192dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, MAX_MSG, TCA_GACT_PARMS, &p, sizeof (p)); 193dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 194dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (rd) { 195dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, MAX_MSG, TCA_GACT_PROB, &pp, sizeof (pp)); 196dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 197dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 198dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; 199dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 200dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *argc_p = argc; 201dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *argv_p = argv; 202dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 203dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 204dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 205dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint 206dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatprint_gact(struct action_util *au,FILE * f, struct rtattr *arg) 207dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 208dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat SPRINT_BUF(b1); 209dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 210dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat SPRINT_BUF(b2); 211dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_gact_p *pp = NULL; 212dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_gact_p pp_dummy; 213dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 214dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_gact *p = NULL; 215dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tb[TCA_GACT_MAX + 1]; 216dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 217dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (arg == NULL) 218dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 219dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 220dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_rtattr_nested(tb, TCA_GACT_MAX, arg); 221dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 222dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_GACT_PARMS] == NULL) { 223dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "[NULL gact parameters]"); 224dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 225dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 226dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat p = RTA_DATA(tb[TCA_GACT_PARMS]); 227dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 228dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "gact action %s", action_n2a(p->action, b1, sizeof (b1))); 229dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef CONFIG_GACT_PROB 230dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (NULL != tb[TCA_GACT_PROB]) { 231dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pp = RTA_DATA(tb[TCA_GACT_PROB]); 232dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 233dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat /* need to keep consistent output */ 234dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&pp_dummy, 0, sizeof (pp_dummy)); 235dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pp = &pp_dummy; 236dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 237dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "\n\t random type %s %s val %d",prob_n2a(pp->ptype), action_n2a(pp->paction, b2, sizeof (b2)), pp->pval); 238dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif 239dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "\n\t index %d ref %d bind %d",p->index, p->refcnt, p->bindcnt); 240dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (show_stats) { 241dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_GACT_TM]) { 242dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tcf_t *tm = RTA_DATA(tb[TCA_GACT_TM]); 243dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat print_tm(f,tm); 244dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 245dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 246dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "\n "); 247dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 248dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 249dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 250dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct action_util gact_action_util = { 251dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "gact", 252dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_aopt = parse_gact, 253dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_aopt = print_gact, 254dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 255