1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker * m_connmark.c Connection tracking marking import
3*de1e4e89SAndroid Build Coastguard Worker *
4*de1e4e89SAndroid Build Coastguard Worker * Copyright (c) 2011 Felix Fietkau <[email protected]>
5*de1e4e89SAndroid Build Coastguard Worker *
6*de1e4e89SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify it
7*de1e4e89SAndroid Build Coastguard Worker * under the terms and conditions of the GNU General Public License,
8*de1e4e89SAndroid Build Coastguard Worker * version 2, as published by the Free Software Foundation.
9*de1e4e89SAndroid Build Coastguard Worker *
10*de1e4e89SAndroid Build Coastguard Worker * This program is distributed in the hope it will be useful, but WITHOUT
11*de1e4e89SAndroid Build Coastguard Worker * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12*de1e4e89SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13*de1e4e89SAndroid Build Coastguard Worker * more details.
14*de1e4e89SAndroid Build Coastguard Worker *
15*de1e4e89SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License along with
16*de1e4e89SAndroid Build Coastguard Worker * this program; if not, see <http://www.gnu.org/licenses>.
17*de1e4e89SAndroid Build Coastguard Worker */
18*de1e4e89SAndroid Build Coastguard Worker
19*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
20*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h>
21*de1e4e89SAndroid Build Coastguard Worker #include <unistd.h>
22*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
23*de1e4e89SAndroid Build Coastguard Worker #include "utils.h"
24*de1e4e89SAndroid Build Coastguard Worker #include "tc_util.h"
25*de1e4e89SAndroid Build Coastguard Worker #include <linux/tc_act/tc_connmark.h>
26*de1e4e89SAndroid Build Coastguard Worker
27*de1e4e89SAndroid Build Coastguard Worker static void
explain(void)28*de1e4e89SAndroid Build Coastguard Worker explain(void)
29*de1e4e89SAndroid Build Coastguard Worker {
30*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "Usage: ... connmark [zone ZONE] [CONTROL] [index <INDEX>]\n");
31*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "where :\n"
32*de1e4e89SAndroid Build Coastguard Worker "\tZONE is the conntrack zone\n"
33*de1e4e89SAndroid Build Coastguard Worker "\tCONTROL := reclassify | pipe | drop | continue | ok |\n"
34*de1e4e89SAndroid Build Coastguard Worker "\t goto chain <CHAIN_INDEX>\n");
35*de1e4e89SAndroid Build Coastguard Worker }
36*de1e4e89SAndroid Build Coastguard Worker
37*de1e4e89SAndroid Build Coastguard Worker static void
usage(void)38*de1e4e89SAndroid Build Coastguard Worker usage(void)
39*de1e4e89SAndroid Build Coastguard Worker {
40*de1e4e89SAndroid Build Coastguard Worker explain();
41*de1e4e89SAndroid Build Coastguard Worker exit(-1);
42*de1e4e89SAndroid Build Coastguard Worker }
43*de1e4e89SAndroid Build Coastguard Worker
44*de1e4e89SAndroid Build Coastguard Worker static int
parse_connmark(struct action_util * a,int * argc_p,char *** argv_p,int tca_id,struct nlmsghdr * n)45*de1e4e89SAndroid Build Coastguard Worker parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
46*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *n)
47*de1e4e89SAndroid Build Coastguard Worker {
48*de1e4e89SAndroid Build Coastguard Worker struct tc_connmark sel = {};
49*de1e4e89SAndroid Build Coastguard Worker char **argv = *argv_p;
50*de1e4e89SAndroid Build Coastguard Worker int argc = *argc_p;
51*de1e4e89SAndroid Build Coastguard Worker int ok = 0;
52*de1e4e89SAndroid Build Coastguard Worker struct rtattr *tail;
53*de1e4e89SAndroid Build Coastguard Worker
54*de1e4e89SAndroid Build Coastguard Worker while (argc > 0) {
55*de1e4e89SAndroid Build Coastguard Worker if (matches(*argv, "connmark") == 0) {
56*de1e4e89SAndroid Build Coastguard Worker ok = 1;
57*de1e4e89SAndroid Build Coastguard Worker argc--;
58*de1e4e89SAndroid Build Coastguard Worker argv++;
59*de1e4e89SAndroid Build Coastguard Worker } else if (matches(*argv, "help") == 0) {
60*de1e4e89SAndroid Build Coastguard Worker usage();
61*de1e4e89SAndroid Build Coastguard Worker } else {
62*de1e4e89SAndroid Build Coastguard Worker break;
63*de1e4e89SAndroid Build Coastguard Worker }
64*de1e4e89SAndroid Build Coastguard Worker
65*de1e4e89SAndroid Build Coastguard Worker }
66*de1e4e89SAndroid Build Coastguard Worker
67*de1e4e89SAndroid Build Coastguard Worker if (!ok) {
68*de1e4e89SAndroid Build Coastguard Worker explain();
69*de1e4e89SAndroid Build Coastguard Worker return -1;
70*de1e4e89SAndroid Build Coastguard Worker }
71*de1e4e89SAndroid Build Coastguard Worker
72*de1e4e89SAndroid Build Coastguard Worker if (argc) {
73*de1e4e89SAndroid Build Coastguard Worker if (matches(*argv, "zone") == 0) {
74*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
75*de1e4e89SAndroid Build Coastguard Worker if (get_u16(&sel.zone, *argv, 10)) {
76*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "simple: Illegal \"index\"\n");
77*de1e4e89SAndroid Build Coastguard Worker return -1;
78*de1e4e89SAndroid Build Coastguard Worker }
79*de1e4e89SAndroid Build Coastguard Worker argc--;
80*de1e4e89SAndroid Build Coastguard Worker argv++;
81*de1e4e89SAndroid Build Coastguard Worker }
82*de1e4e89SAndroid Build Coastguard Worker }
83*de1e4e89SAndroid Build Coastguard Worker
84*de1e4e89SAndroid Build Coastguard Worker parse_action_control_dflt(&argc, &argv, &sel.action, false, TC_ACT_PIPE);
85*de1e4e89SAndroid Build Coastguard Worker
86*de1e4e89SAndroid Build Coastguard Worker if (argc) {
87*de1e4e89SAndroid Build Coastguard Worker if (matches(*argv, "index") == 0) {
88*de1e4e89SAndroid Build Coastguard Worker NEXT_ARG();
89*de1e4e89SAndroid Build Coastguard Worker if (get_u32(&sel.index, *argv, 10)) {
90*de1e4e89SAndroid Build Coastguard Worker fprintf(stderr, "simple: Illegal \"index\"\n");
91*de1e4e89SAndroid Build Coastguard Worker return -1;
92*de1e4e89SAndroid Build Coastguard Worker }
93*de1e4e89SAndroid Build Coastguard Worker argc--;
94*de1e4e89SAndroid Build Coastguard Worker argv++;
95*de1e4e89SAndroid Build Coastguard Worker }
96*de1e4e89SAndroid Build Coastguard Worker }
97*de1e4e89SAndroid Build Coastguard Worker
98*de1e4e89SAndroid Build Coastguard Worker tail = NLMSG_TAIL(n);
99*de1e4e89SAndroid Build Coastguard Worker addattr_l(n, MAX_MSG, tca_id, NULL, 0);
100*de1e4e89SAndroid Build Coastguard Worker addattr_l(n, MAX_MSG, TCA_CONNMARK_PARMS, &sel, sizeof(sel));
101*de1e4e89SAndroid Build Coastguard Worker tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
102*de1e4e89SAndroid Build Coastguard Worker
103*de1e4e89SAndroid Build Coastguard Worker *argc_p = argc;
104*de1e4e89SAndroid Build Coastguard Worker *argv_p = argv;
105*de1e4e89SAndroid Build Coastguard Worker return 0;
106*de1e4e89SAndroid Build Coastguard Worker }
107*de1e4e89SAndroid Build Coastguard Worker
print_connmark(struct action_util * au,FILE * f,struct rtattr * arg)108*de1e4e89SAndroid Build Coastguard Worker static int print_connmark(struct action_util *au, FILE *f, struct rtattr *arg)
109*de1e4e89SAndroid Build Coastguard Worker {
110*de1e4e89SAndroid Build Coastguard Worker struct rtattr *tb[TCA_CONNMARK_MAX + 1];
111*de1e4e89SAndroid Build Coastguard Worker struct tc_connmark *ci;
112*de1e4e89SAndroid Build Coastguard Worker
113*de1e4e89SAndroid Build Coastguard Worker if (arg == NULL)
114*de1e4e89SAndroid Build Coastguard Worker return -1;
115*de1e4e89SAndroid Build Coastguard Worker
116*de1e4e89SAndroid Build Coastguard Worker parse_rtattr_nested(tb, TCA_CONNMARK_MAX, arg);
117*de1e4e89SAndroid Build Coastguard Worker if (tb[TCA_CONNMARK_PARMS] == NULL) {
118*de1e4e89SAndroid Build Coastguard Worker fprintf(f, "[NULL connmark parameters]");
119*de1e4e89SAndroid Build Coastguard Worker return -1;
120*de1e4e89SAndroid Build Coastguard Worker }
121*de1e4e89SAndroid Build Coastguard Worker
122*de1e4e89SAndroid Build Coastguard Worker ci = RTA_DATA(tb[TCA_CONNMARK_PARMS]);
123*de1e4e89SAndroid Build Coastguard Worker
124*de1e4e89SAndroid Build Coastguard Worker fprintf(f, " connmark zone %d\n", ci->zone);
125*de1e4e89SAndroid Build Coastguard Worker fprintf(f, "\t index %u ref %d bind %d", ci->index,
126*de1e4e89SAndroid Build Coastguard Worker ci->refcnt, ci->bindcnt);
127*de1e4e89SAndroid Build Coastguard Worker
128*de1e4e89SAndroid Build Coastguard Worker if (show_stats) {
129*de1e4e89SAndroid Build Coastguard Worker if (tb[TCA_CONNMARK_TM]) {
130*de1e4e89SAndroid Build Coastguard Worker struct tcf_t *tm = RTA_DATA(tb[TCA_CONNMARK_TM]);
131*de1e4e89SAndroid Build Coastguard Worker
132*de1e4e89SAndroid Build Coastguard Worker print_tm(f, tm);
133*de1e4e89SAndroid Build Coastguard Worker }
134*de1e4e89SAndroid Build Coastguard Worker }
135*de1e4e89SAndroid Build Coastguard Worker fprintf(f, "\n");
136*de1e4e89SAndroid Build Coastguard Worker
137*de1e4e89SAndroid Build Coastguard Worker return 0;
138*de1e4e89SAndroid Build Coastguard Worker }
139*de1e4e89SAndroid Build Coastguard Worker
140*de1e4e89SAndroid Build Coastguard Worker struct action_util connmark_action_util = {
141*de1e4e89SAndroid Build Coastguard Worker .id = "connmark",
142*de1e4e89SAndroid Build Coastguard Worker .parse_aopt = parse_connmark,
143*de1e4e89SAndroid Build Coastguard Worker .print_aopt = print_connmark,
144*de1e4e89SAndroid Build Coastguard Worker };
145