xref: /aosp_15_r20/external/libnl/src/lib/exp.c (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
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  * Copyright (c) 2012 Rich Fought <[email protected]>
5*4dc78e53SAndroid Build Coastguard Worker  */
6*4dc78e53SAndroid Build Coastguard Worker 
7*4dc78e53SAndroid Build Coastguard Worker /**
8*4dc78e53SAndroid Build Coastguard Worker  * @ingroup cli
9*4dc78e53SAndroid Build Coastguard Worker  * @defgroup cli_exp Expectation Tracking
10*4dc78e53SAndroid Build Coastguard Worker  *
11*4dc78e53SAndroid Build Coastguard Worker  * @{
12*4dc78e53SAndroid Build Coastguard Worker  */
13*4dc78e53SAndroid Build Coastguard Worker 
14*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
15*4dc78e53SAndroid Build Coastguard Worker 
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/utils.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cli/exp.h>
18*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_alloc(void)19*4dc78e53SAndroid Build Coastguard Worker struct nfnl_exp *nl_cli_exp_alloc(void)
20*4dc78e53SAndroid Build Coastguard Worker {
21*4dc78e53SAndroid Build Coastguard Worker 	struct nfnl_exp *exp;
22*4dc78e53SAndroid Build Coastguard Worker 
23*4dc78e53SAndroid Build Coastguard Worker 	exp = nfnl_exp_alloc();
24*4dc78e53SAndroid Build Coastguard Worker 	if (!exp)
25*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(ENOMEM, "Unable to allocate expectation object");
26*4dc78e53SAndroid Build Coastguard Worker 
27*4dc78e53SAndroid Build Coastguard Worker 	return exp;
28*4dc78e53SAndroid Build Coastguard Worker }
29*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_alloc_cache(struct nl_sock * sk)30*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *nl_cli_exp_alloc_cache(struct nl_sock *sk)
31*4dc78e53SAndroid Build Coastguard Worker {
32*4dc78e53SAndroid Build Coastguard Worker 	return nl_cli_alloc_cache(sk, "expectation", nfnl_exp_alloc_cache);
33*4dc78e53SAndroid Build Coastguard Worker }
34*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_family(struct nfnl_exp * exp,char * arg)35*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_family(struct nfnl_exp *exp, char *arg)
36*4dc78e53SAndroid Build Coastguard Worker {
37*4dc78e53SAndroid Build Coastguard Worker 	int family;
38*4dc78e53SAndroid Build Coastguard Worker 
39*4dc78e53SAndroid Build Coastguard Worker 	if ((family = nl_str2af(arg)) == AF_UNSPEC)
40*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(EINVAL,
41*4dc78e53SAndroid Build Coastguard Worker 			     "Unable to nl_cli_exp_parse family \"%s\": %s",
42*4dc78e53SAndroid Build Coastguard Worker 			     arg, nl_geterror(NLE_INVAL));
43*4dc78e53SAndroid Build Coastguard Worker 
44*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_family(exp, family);
45*4dc78e53SAndroid Build Coastguard Worker }
46*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_timeout(struct nfnl_exp * exp,char * arg)47*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_timeout(struct nfnl_exp *exp, char *arg)
48*4dc78e53SAndroid Build Coastguard Worker {
49*4dc78e53SAndroid Build Coastguard Worker 	uint32_t timeout = nl_cli_parse_u32(arg);
50*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_timeout(exp, timeout);
51*4dc78e53SAndroid Build Coastguard Worker }
52*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_id(struct nfnl_exp * exp,char * arg)53*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_id(struct nfnl_exp *exp, char *arg)
54*4dc78e53SAndroid Build Coastguard Worker {
55*4dc78e53SAndroid Build Coastguard Worker 	uint32_t id = nl_cli_parse_u32(arg);
56*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_id(exp, id);
57*4dc78e53SAndroid Build Coastguard Worker }
58*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_helper_name(struct nfnl_exp * exp,char * arg)59*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_helper_name(struct nfnl_exp *exp, char *arg)
60*4dc78e53SAndroid Build Coastguard Worker {
61*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_helper_name(exp, arg);
62*4dc78e53SAndroid Build Coastguard Worker }
63*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_zone(struct nfnl_exp * exp,char * arg)64*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_zone(struct nfnl_exp *exp, char *arg)
65*4dc78e53SAndroid Build Coastguard Worker {
66*4dc78e53SAndroid Build Coastguard Worker 	uint32_t zone = nl_cli_parse_u32(arg);
67*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_zone(exp, zone);
68*4dc78e53SAndroid Build Coastguard Worker }
69*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_flags(struct nfnl_exp * exp,char * arg)70*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_flags(struct nfnl_exp *exp, char *arg)
71*4dc78e53SAndroid Build Coastguard Worker {
72*4dc78e53SAndroid Build Coastguard Worker 	uint32_t flags = nl_cli_parse_u32(arg);
73*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_flags(exp, flags);
74*4dc78e53SAndroid Build Coastguard Worker }
75*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_class(struct nfnl_exp * exp,char * arg)76*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_class(struct nfnl_exp *exp, char *arg)
77*4dc78e53SAndroid Build Coastguard Worker {
78*4dc78e53SAndroid Build Coastguard Worker 	uint32_t class = nl_cli_parse_u32(arg);
79*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_class(exp, class);
80*4dc78e53SAndroid Build Coastguard Worker }
81*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_nat_dir(struct nfnl_exp * exp,char * arg)82*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_nat_dir(struct nfnl_exp *exp, char *arg)
83*4dc78e53SAndroid Build Coastguard Worker {
84*4dc78e53SAndroid Build Coastguard Worker 	uint32_t nat_dir = nl_cli_parse_u32(arg);
85*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_nat_dir(exp, nat_dir);
86*4dc78e53SAndroid Build Coastguard Worker }
87*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_fn(struct nfnl_exp * exp,char * arg)88*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_fn(struct nfnl_exp *exp, char *arg)
89*4dc78e53SAndroid Build Coastguard Worker {
90*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_fn(exp, arg);
91*4dc78e53SAndroid Build Coastguard Worker }
92*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_src(struct nfnl_exp * exp,int tuple,char * arg)93*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_src(struct nfnl_exp *exp, int tuple, char *arg)
94*4dc78e53SAndroid Build Coastguard Worker {
95*4dc78e53SAndroid Build Coastguard Worker 	int err;
96*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *a = nl_cli_addr_parse(arg, nfnl_exp_get_family(exp));
97*4dc78e53SAndroid Build Coastguard Worker 	if ((err = nfnl_exp_set_src(exp, tuple, a)) < 0)
98*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to set source address: %s",
99*4dc78e53SAndroid Build Coastguard Worker 			     nl_geterror(err));
100*4dc78e53SAndroid Build Coastguard Worker }
101*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_dst(struct nfnl_exp * exp,int tuple,char * arg)102*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_dst(struct nfnl_exp *exp, int tuple, char *arg)
103*4dc78e53SAndroid Build Coastguard Worker {
104*4dc78e53SAndroid Build Coastguard Worker 	int err;
105*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *a = nl_cli_addr_parse(arg, nfnl_exp_get_family(exp));
106*4dc78e53SAndroid Build Coastguard Worker 	if ((err = nfnl_exp_set_dst(exp, tuple, a)) < 0)
107*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to set destination address: %s",
108*4dc78e53SAndroid Build Coastguard Worker 			     nl_geterror(err));
109*4dc78e53SAndroid Build Coastguard Worker }
110*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_l4protonum(struct nfnl_exp * exp,int tuple,char * arg)111*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_l4protonum(struct nfnl_exp *exp, int tuple, char *arg)
112*4dc78e53SAndroid Build Coastguard Worker {
113*4dc78e53SAndroid Build Coastguard Worker 	int l4protonum;
114*4dc78e53SAndroid Build Coastguard Worker 
115*4dc78e53SAndroid Build Coastguard Worker 	if ((l4protonum = nl_str2ip_proto(arg)) < 0)
116*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(l4protonum,
117*4dc78e53SAndroid Build Coastguard Worker 			"Unable to nl_cli_exp_parse protocol \"%s\": %s",
118*4dc78e53SAndroid Build Coastguard Worker 			arg, nl_geterror(l4protonum));
119*4dc78e53SAndroid Build Coastguard Worker 
120*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_l4protonum(exp, tuple, l4protonum);
121*4dc78e53SAndroid Build Coastguard Worker }
122*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_src_port(struct nfnl_exp * exp,int tuple,char * arg)123*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_src_port(struct nfnl_exp *exp, int tuple, char *arg)
124*4dc78e53SAndroid Build Coastguard Worker {
125*4dc78e53SAndroid Build Coastguard Worker 	uint32_t sport = nl_cli_parse_u32(arg);
126*4dc78e53SAndroid Build Coastguard Worker 	uint16_t dport = nfnl_exp_get_dst_port(exp, tuple);
127*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_ports(exp, tuple, sport, dport);
128*4dc78e53SAndroid Build Coastguard Worker }
129*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_dst_port(struct nfnl_exp * exp,int tuple,char * arg)130*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_dst_port(struct nfnl_exp *exp, int tuple, char *arg)
131*4dc78e53SAndroid Build Coastguard Worker {
132*4dc78e53SAndroid Build Coastguard Worker 	uint32_t dport = nl_cli_parse_u32(arg);
133*4dc78e53SAndroid Build Coastguard Worker 	uint16_t sport = nfnl_exp_get_src_port(exp, tuple);
134*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_ports(exp, tuple, sport, dport);
135*4dc78e53SAndroid Build Coastguard Worker }
136*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_icmp_id(struct nfnl_exp * exp,int tuple,char * arg)137*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_icmp_id(struct nfnl_exp *exp, int tuple, char *arg)
138*4dc78e53SAndroid Build Coastguard Worker {
139*4dc78e53SAndroid Build Coastguard Worker 	uint32_t id = nl_cli_parse_u32(arg);
140*4dc78e53SAndroid Build Coastguard Worker 	uint8_t type = nfnl_exp_get_icmp_type(exp, tuple);
141*4dc78e53SAndroid Build Coastguard Worker 	uint8_t code = nfnl_exp_get_icmp_code(exp, tuple);
142*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_icmp(exp, tuple, id, type, code);
143*4dc78e53SAndroid Build Coastguard Worker }
144*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_icmp_type(struct nfnl_exp * exp,int tuple,char * arg)145*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_icmp_type(struct nfnl_exp *exp, int tuple, char *arg)
146*4dc78e53SAndroid Build Coastguard Worker {
147*4dc78e53SAndroid Build Coastguard Worker 	uint32_t type = nl_cli_parse_u32(arg);
148*4dc78e53SAndroid Build Coastguard Worker 	uint16_t id = nfnl_exp_get_icmp_id(exp, tuple);
149*4dc78e53SAndroid Build Coastguard Worker 	uint8_t code = nfnl_exp_get_icmp_code(exp, tuple);
150*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_icmp(exp, tuple, id, type, code);
151*4dc78e53SAndroid Build Coastguard Worker }
152*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_exp_parse_icmp_code(struct nfnl_exp * exp,int tuple,char * arg)153*4dc78e53SAndroid Build Coastguard Worker void nl_cli_exp_parse_icmp_code(struct nfnl_exp *exp, int tuple, char *arg)
154*4dc78e53SAndroid Build Coastguard Worker {
155*4dc78e53SAndroid Build Coastguard Worker 	uint32_t code = nl_cli_parse_u32(arg);
156*4dc78e53SAndroid Build Coastguard Worker 	uint16_t id = nfnl_exp_get_icmp_id(exp, tuple);
157*4dc78e53SAndroid Build Coastguard Worker 	uint8_t type = nfnl_exp_get_icmp_type(exp, tuple);
158*4dc78e53SAndroid Build Coastguard Worker 	nfnl_exp_set_icmp(exp, tuple, id, type, code);
159*4dc78e53SAndroid Build Coastguard Worker }
160*4dc78e53SAndroid Build Coastguard Worker 
161*4dc78e53SAndroid Build Coastguard Worker /** @} */
162