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