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