1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2008-2009 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup cli
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup cli_ct Connection Tracking
9*4dc78e53SAndroid Build Coastguard Worker *
10*4dc78e53SAndroid Build Coastguard Worker * @{
11*4dc78e53SAndroid Build Coastguard Worker */
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/utils.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/ct.h>
17*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_alloc(void)18*4dc78e53SAndroid Build Coastguard Worker struct nfnl_ct *nl_cli_ct_alloc(void)
19*4dc78e53SAndroid Build Coastguard Worker {
20*4dc78e53SAndroid Build Coastguard Worker struct nfnl_ct *ct;
21*4dc78e53SAndroid Build Coastguard Worker
22*4dc78e53SAndroid Build Coastguard Worker ct = nfnl_ct_alloc();
23*4dc78e53SAndroid Build Coastguard Worker if (!ct)
24*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(ENOMEM, "Unable to allocate conntrack object");
25*4dc78e53SAndroid Build Coastguard Worker
26*4dc78e53SAndroid Build Coastguard Worker return ct;
27*4dc78e53SAndroid Build Coastguard Worker }
28*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_alloc_cache(struct nl_sock * sk)29*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *nl_cli_ct_alloc_cache(struct nl_sock *sk)
30*4dc78e53SAndroid Build Coastguard Worker {
31*4dc78e53SAndroid Build Coastguard Worker return nl_cli_alloc_cache(sk, "conntrack", nfnl_ct_alloc_cache);
32*4dc78e53SAndroid Build Coastguard Worker }
33*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_family(struct nfnl_ct * ct,char * arg)34*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_family(struct nfnl_ct *ct, char *arg)
35*4dc78e53SAndroid Build Coastguard Worker {
36*4dc78e53SAndroid Build Coastguard Worker int family;
37*4dc78e53SAndroid Build Coastguard Worker
38*4dc78e53SAndroid Build Coastguard Worker if ((family = nl_str2af(arg)) == AF_UNSPEC)
39*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(EINVAL,
40*4dc78e53SAndroid Build Coastguard Worker "Unable to nl_cli_ct_parse family \"%s\": %s",
41*4dc78e53SAndroid Build Coastguard Worker arg, nl_geterror(NLE_INVAL));
42*4dc78e53SAndroid Build Coastguard Worker
43*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_family(ct, family);
44*4dc78e53SAndroid Build Coastguard Worker }
45*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_protocol(struct nfnl_ct * ct,char * arg)46*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_protocol(struct nfnl_ct *ct, char *arg)
47*4dc78e53SAndroid Build Coastguard Worker {
48*4dc78e53SAndroid Build Coastguard Worker int proto;
49*4dc78e53SAndroid Build Coastguard Worker
50*4dc78e53SAndroid Build Coastguard Worker if ((proto = nl_str2ip_proto(arg)) < 0)
51*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(proto,
52*4dc78e53SAndroid Build Coastguard Worker "Unable to nl_cli_ct_parse protocol \"%s\": %s",
53*4dc78e53SAndroid Build Coastguard Worker arg, nl_geterror(proto));
54*4dc78e53SAndroid Build Coastguard Worker
55*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_proto(ct, proto);
56*4dc78e53SAndroid Build Coastguard Worker }
57*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_mark(struct nfnl_ct * ct,char * arg)58*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_mark(struct nfnl_ct *ct, char *arg)
59*4dc78e53SAndroid Build Coastguard Worker {
60*4dc78e53SAndroid Build Coastguard Worker uint32_t mark = nl_cli_parse_u32(arg);
61*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_mark(ct, mark);
62*4dc78e53SAndroid Build Coastguard Worker }
63*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_timeout(struct nfnl_ct * ct,char * arg)64*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_timeout(struct nfnl_ct *ct, char *arg)
65*4dc78e53SAndroid Build Coastguard Worker {
66*4dc78e53SAndroid Build Coastguard Worker uint32_t timeout = nl_cli_parse_u32(arg);
67*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_timeout(ct, timeout);
68*4dc78e53SAndroid Build Coastguard Worker }
69*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_id(struct nfnl_ct * ct,char * arg)70*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_id(struct nfnl_ct *ct, char *arg)
71*4dc78e53SAndroid Build Coastguard Worker {
72*4dc78e53SAndroid Build Coastguard Worker uint32_t id = nl_cli_parse_u32(arg);
73*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_id(ct, id);
74*4dc78e53SAndroid Build Coastguard Worker }
75*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_use(struct nfnl_ct * ct,char * arg)76*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_use(struct nfnl_ct *ct, char *arg)
77*4dc78e53SAndroid Build Coastguard Worker {
78*4dc78e53SAndroid Build Coastguard Worker uint32_t use = nl_cli_parse_u32(arg);
79*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_use(ct, use);
80*4dc78e53SAndroid Build Coastguard Worker }
81*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_src(struct nfnl_ct * ct,int reply,char * arg)82*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_src(struct nfnl_ct *ct, int reply, char *arg)
83*4dc78e53SAndroid Build Coastguard Worker {
84*4dc78e53SAndroid Build Coastguard Worker int err;
85*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *a = nl_cli_addr_parse(arg, nfnl_ct_get_family(ct));
86*4dc78e53SAndroid Build Coastguard Worker if ((err = nfnl_ct_set_src(ct, reply, a)) < 0)
87*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(err, "Unable to set source address: %s",
88*4dc78e53SAndroid Build Coastguard Worker nl_geterror(err));
89*4dc78e53SAndroid Build Coastguard Worker }
90*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_dst(struct nfnl_ct * ct,int reply,char * arg)91*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_dst(struct nfnl_ct *ct, int reply, char *arg)
92*4dc78e53SAndroid Build Coastguard Worker {
93*4dc78e53SAndroid Build Coastguard Worker int err;
94*4dc78e53SAndroid Build Coastguard Worker struct nl_addr *a = nl_cli_addr_parse(arg, nfnl_ct_get_family(ct));
95*4dc78e53SAndroid Build Coastguard Worker if ((err = nfnl_ct_set_dst(ct, reply, a)) < 0)
96*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(err, "Unable to set destination address: %s",
97*4dc78e53SAndroid Build Coastguard Worker nl_geterror(err));
98*4dc78e53SAndroid Build Coastguard Worker }
99*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_src_port(struct nfnl_ct * ct,int reply,char * arg)100*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_src_port(struct nfnl_ct *ct, int reply, char *arg)
101*4dc78e53SAndroid Build Coastguard Worker {
102*4dc78e53SAndroid Build Coastguard Worker uint32_t port = nl_cli_parse_u32(arg);
103*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_src_port(ct, reply, port);
104*4dc78e53SAndroid Build Coastguard Worker }
105*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_dst_port(struct nfnl_ct * ct,int reply,char * arg)106*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_dst_port(struct nfnl_ct *ct, int reply, char *arg)
107*4dc78e53SAndroid Build Coastguard Worker {
108*4dc78e53SAndroid Build Coastguard Worker uint32_t port = nl_cli_parse_u32(arg);
109*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_dst_port(ct, reply, port);
110*4dc78e53SAndroid Build Coastguard Worker }
111*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_tcp_state(struct nfnl_ct * ct,char * arg)112*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_tcp_state(struct nfnl_ct *ct, char *arg)
113*4dc78e53SAndroid Build Coastguard Worker {
114*4dc78e53SAndroid Build Coastguard Worker int state;
115*4dc78e53SAndroid Build Coastguard Worker
116*4dc78e53SAndroid Build Coastguard Worker if ((state = nfnl_ct_str2tcp_state(arg)) < 0)
117*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(state,
118*4dc78e53SAndroid Build Coastguard Worker "Unable to nl_cli_ct_parse tcp state \"%s\": %s",
119*4dc78e53SAndroid Build Coastguard Worker arg, nl_geterror(state));
120*4dc78e53SAndroid Build Coastguard Worker
121*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_tcp_state(ct, state);
122*4dc78e53SAndroid Build Coastguard Worker }
123*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_status(struct nfnl_ct * ct,char * arg)124*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_status(struct nfnl_ct *ct, char *arg)
125*4dc78e53SAndroid Build Coastguard Worker {
126*4dc78e53SAndroid Build Coastguard Worker int status;
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Worker if ((status = nfnl_ct_str2status(arg)) < 0)
129*4dc78e53SAndroid Build Coastguard Worker nl_cli_fatal(status,
130*4dc78e53SAndroid Build Coastguard Worker "Unable to nl_cli_ct_parse flags \"%s\": %s",
131*4dc78e53SAndroid Build Coastguard Worker arg, nl_geterror(status));
132*4dc78e53SAndroid Build Coastguard Worker
133*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_status(ct, status);
134*4dc78e53SAndroid Build Coastguard Worker }
135*4dc78e53SAndroid Build Coastguard Worker
nl_cli_ct_parse_zone(struct nfnl_ct * ct,char * arg)136*4dc78e53SAndroid Build Coastguard Worker void nl_cli_ct_parse_zone(struct nfnl_ct *ct, char *arg)
137*4dc78e53SAndroid Build Coastguard Worker {
138*4dc78e53SAndroid Build Coastguard Worker uint32_t zone = nl_cli_parse_u32(arg);
139*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_zone(ct, zone);
140*4dc78e53SAndroid Build Coastguard Worker }
141*4dc78e53SAndroid Build Coastguard Worker
142*4dc78e53SAndroid Build Coastguard Worker #if 0
143*4dc78e53SAndroid Build Coastguard Worker } else if (arg_match("origicmpid")) {
144*4dc78e53SAndroid Build Coastguard Worker if (argc > ++idx)
145*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_icmp_id(ct, 0, strtoul(argv[idx++], NULL, 0));
146*4dc78e53SAndroid Build Coastguard Worker } else if (arg_match("origicmptype")) {
147*4dc78e53SAndroid Build Coastguard Worker if (argc > ++idx)
148*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_icmp_type(ct, 0, strtoul(argv[idx++], NULL, 0));
149*4dc78e53SAndroid Build Coastguard Worker } else if (arg_match("origicmpcode")) {
150*4dc78e53SAndroid Build Coastguard Worker if (argc > ++idx)
151*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_icmp_code(ct, 0, strtoul(argv[idx++], NULL, 0));
152*4dc78e53SAndroid Build Coastguard Worker } else if (arg_match("replyicmpid")) {
153*4dc78e53SAndroid Build Coastguard Worker if (argc > ++idx)
154*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_icmp_id(ct, 1, strtoul(argv[idx++], NULL, 0));
155*4dc78e53SAndroid Build Coastguard Worker } else if (arg_match("replyicmptype")) {
156*4dc78e53SAndroid Build Coastguard Worker if (argc > ++idx)
157*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_icmp_type(ct, 1, strtoul(argv[idx++], NULL, 0));
158*4dc78e53SAndroid Build Coastguard Worker } else if (arg_match("replyicmpcode")) {
159*4dc78e53SAndroid Build Coastguard Worker if (argc > ++idx)
160*4dc78e53SAndroid Build Coastguard Worker nfnl_ct_set_icmp_code(ct, 1, strtoul(argv[idx++], NULL, 0));
161*4dc78e53SAndroid Build Coastguard Worker }
162*4dc78e53SAndroid Build Coastguard Worker #endif
163*4dc78e53SAndroid Build Coastguard Worker
164*4dc78e53SAndroid Build Coastguard Worker /** @} */
165