1f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck/* 2f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * m_skbedit.c SKB Editing module 3f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * 4f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * Copyright (c) 2008, Intel Corporation. 5f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * 6f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * This program is free software; you can redistribute it and/or modify it 7f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * under the terms and conditions of the GNU General Public License, 8f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * version 2, as published by the Free Software Foundation. 9f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * 10f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * This program is distributed in the hope it will be useful, but WITHOUT 11f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * more details. 14f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * 15f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * You should have received a copy of the GNU General Public License along with 16f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 17f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * Place - Suite 330, Boston, MA 02111-1307 USA. 18f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * 19f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * Authors: Alexander Duyck <alexander.h.duyck@intel.com> 20f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck * 21f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck */ 22f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 23f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <stdio.h> 24f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <stdlib.h> 25f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <unistd.h> 26f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <string.h> 27f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include "utils.h" 28f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include "tc_util.h" 29f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck#include <linux/tc_act/tc_skbedit.h> 30f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 31f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic void 32f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckexplain(void) 33f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{ 34e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim fprintf(stderr, "Usage: ... skbedit <[QM] [PM] [MM]>\n" 35e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim "QM = queue_mapping QUEUE_MAPPING\n" 36e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim "PM = priority PRIORITY \n" 37e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim "MM = mark MARK \n" 38e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim "QUEUE_MAPPING = device transmit queue to use\n" 39e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim "PRIORITY = classID to assign to priority field\n" 40e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim "MARK = firewall mark to set\n"); 41f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck} 42f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 43f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic void 44f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckusage(void) 45f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{ 46f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck explain(); 47f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck exit(-1); 48f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck} 49f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 50f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic int 51f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckparse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, 52f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck struct nlmsghdr *n) 53f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{ 54f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck int argc = *argc_p; 55f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck char **argv = *argv_p; 56f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck int ok = 0; 57f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck struct rtattr *tail; 58f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck unsigned int tmp; 59f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck __u16 queue_mapping; 60e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim __u32 flags = 0, priority, mark; 6146a6573259f46f86eb0048a2c805b24ff4183fa6Stephen Hemminger struct tc_skbedit sel = { 0 }; 62f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 63f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (matches(*argv, "skbedit") != 0) 64f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 65f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 66f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 67f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 68f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck while (argc > 0) { 69f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (matches(*argv, "queue_mapping") == 0) { 70f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck flags |= SKBEDIT_F_QUEUE_MAPPING; 71f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 72f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (get_unsigned(&tmp, *argv, 10) || tmp > 65535) { 73f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(stderr, "Illegal queue_mapping\n"); 74f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 75f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 76f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck queue_mapping = tmp; 77f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck ok++; 78f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else if (matches(*argv, "priority") == 0) { 79f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck flags |= SKBEDIT_F_PRIORITY; 80f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 81f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (get_tc_classid(&priority, *argv)) { 82f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(stderr, "Illegal priority\n"); 83f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 84f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 85f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck ok++; 86e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim } else if (matches(*argv, "mark") == 0) { 87e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim flags |= SKBEDIT_F_MARK; 88e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim NEXT_ARG(); 89e906975a53df2614a08d32017aa6e3c70f204a2djamal if (get_u32(&mark, *argv, 0)) { 90e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim fprintf(stderr, "Illegal mark\n"); 91e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim return -1; 92e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim } 93e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim ok++; 94f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else if (matches(*argv, "help") == 0) { 95f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck usage(); 96f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else { 97f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck break; 98f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 99f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck argc--; 100f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck argv++; 101f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 102f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 103f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (argc) { 104f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (matches(*argv, "reclassify") == 0) { 105f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck sel.action = TC_ACT_RECLASSIFY; 106f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 107f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else if (matches(*argv, "pipe") == 0) { 108f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck sel.action = TC_ACT_PIPE; 109f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 110f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else if (matches(*argv, "drop") == 0 || 111f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck matches(*argv, "shot") == 0) { 112f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck sel.action = TC_ACT_SHOT; 113f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 114f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else if (matches(*argv, "continue") == 0) { 115f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck sel.action = TC_ACT_UNSPEC; 116f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 117f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } else if (matches(*argv, "pass") == 0) { 118f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck sel.action = TC_ACT_OK; 119f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 120f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 121f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 122f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 123f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (argc) { 124f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (matches(*argv, "index") == 0) { 125f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck NEXT_ARG(); 126f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (get_u32(&sel.index, *argv, 10)) { 127f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(stderr, "Pedit: Illegal \"index\"\n"); 128f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 129f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 130f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck argc--; 131f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck argv++; 132f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck ok++; 133f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 134f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 135f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 136f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (!ok) { 137f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck explain(); 138f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 139f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 140f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 141f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 142f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck tail = NLMSG_TAIL(n); 143f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck addattr_l(n, MAX_MSG, tca_id, NULL, 0); 144f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck addattr_l(n, MAX_MSG, TCA_SKBEDIT_PARMS, &sel, sizeof(sel)); 145f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (flags & SKBEDIT_F_QUEUE_MAPPING) 146f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck addattr_l(n, MAX_MSG, TCA_SKBEDIT_QUEUE_MAPPING, 147f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck &queue_mapping, sizeof(queue_mapping)); 148f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (flags & SKBEDIT_F_PRIORITY) 149f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck addattr_l(n, MAX_MSG, TCA_SKBEDIT_PRIORITY, 150f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck &priority, sizeof(priority)); 151e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim if (flags & SKBEDIT_F_MARK) 152e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim addattr_l(n, MAX_MSG, TCA_SKBEDIT_MARK, 153e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim &mark, sizeof(mark)); 154f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail; 155f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 156f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *argc_p = argc; 157f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck *argv_p = argv; 158f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return 0; 159f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck} 160f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 161f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstatic int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg) 162f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck{ 163f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck struct rtattr *tb[TCA_SKBEDIT_MAX + 1]; 164f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck SPRINT_BUF(b1); 165f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck __u32 *priority; 166e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim __u32 *mark; 167f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck __u16 *queue_mapping; 168f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 169f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (arg == NULL) 170f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 171f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 172f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck parse_rtattr_nested(tb, TCA_SKBEDIT_MAX, arg); 173f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 174f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (tb[TCA_SKBEDIT_PARMS] == NULL) { 175f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(f, "[NULL skbedit parameters]"); 176f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return -1; 177f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 178f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 179f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(f, " skbedit"); 180f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 181f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (tb[TCA_SKBEDIT_QUEUE_MAPPING] != NULL) { 182f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck queue_mapping = RTA_DATA(tb[TCA_SKBEDIT_QUEUE_MAPPING]); 183f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(f, " queue_mapping %u", *queue_mapping); 184f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 185f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (tb[TCA_SKBEDIT_PRIORITY] != NULL) { 186f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck priority = RTA_DATA(tb[TCA_SKBEDIT_PRIORITY]); 187f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck fprintf(f, " priority %s", sprint_tc_classid(*priority, b1)); 188f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 189e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim if (tb[TCA_SKBEDIT_MARK] != NULL) { 190e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim mark = RTA_DATA(tb[TCA_SKBEDIT_MARK]); 191e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim fprintf(f, " mark %d", *mark); 192e04dd30a38130a3d85065a747cc33274766a9cb6Jamal Hadi Salim } 193f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 194f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (show_stats) { 195f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck if (tb[TCA_SKBEDIT_TM]) { 196f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck struct tcf_t *tm = RTA_DATA(tb[TCA_SKBEDIT_TM]); 197f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck print_tm(f, tm); 198f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 199f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck } 200f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 201f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck return 0; 202f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck} 203f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck 204f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyckstruct action_util skbedit_action_util = { 205f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck .id = "skbedit", 206f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck .parse_aopt = parse_skbedit, 207f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck .print_aopt = print_skbedit, 208f72a7aab0ce946ca1133cc8b6b7fcb088fbb1d96Alexander Duyck}; 209