xref: /aosp_15_r20/external/libnl/src/lib/addr.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  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker  * @ingroup cli
8*4dc78e53SAndroid Build Coastguard Worker  * @defgroup cli_addr Addresses
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/addr.h>
17*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_alloc(void)18*4dc78e53SAndroid Build Coastguard Worker struct rtnl_addr *nl_cli_addr_alloc(void)
19*4dc78e53SAndroid Build Coastguard Worker {
20*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_addr *addr;
21*4dc78e53SAndroid Build Coastguard Worker 
22*4dc78e53SAndroid Build Coastguard Worker 	addr = rtnl_addr_alloc();
23*4dc78e53SAndroid Build Coastguard Worker 	if (!addr)
24*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(ENOMEM, "Unable to allocate address object");
25*4dc78e53SAndroid Build Coastguard Worker 
26*4dc78e53SAndroid Build Coastguard Worker 	return addr;
27*4dc78e53SAndroid Build Coastguard Worker }
28*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_family(struct rtnl_addr * addr,char * arg)29*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_family(struct rtnl_addr *addr, char *arg)
30*4dc78e53SAndroid Build Coastguard Worker {
31*4dc78e53SAndroid Build Coastguard Worker 	int family;
32*4dc78e53SAndroid Build Coastguard Worker 
33*4dc78e53SAndroid Build Coastguard Worker 	if ((family = nl_str2af(arg)) != AF_UNSPEC)
34*4dc78e53SAndroid Build Coastguard Worker 		rtnl_addr_set_family(addr, family);
35*4dc78e53SAndroid Build Coastguard Worker }
36*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_local(struct rtnl_addr * addr,char * arg)37*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_local(struct rtnl_addr *addr, char *arg)
38*4dc78e53SAndroid Build Coastguard Worker {
39*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *a;
40*4dc78e53SAndroid Build Coastguard Worker 	int err;
41*4dc78e53SAndroid Build Coastguard Worker 
42*4dc78e53SAndroid Build Coastguard Worker 	a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
43*4dc78e53SAndroid Build Coastguard Worker 	if ((err = rtnl_addr_set_local(addr, a)) < 0)
44*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to set local address: %s",
45*4dc78e53SAndroid Build Coastguard Worker 			     nl_geterror(err));
46*4dc78e53SAndroid Build Coastguard Worker 
47*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(a);
48*4dc78e53SAndroid Build Coastguard Worker }
49*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_dev(struct rtnl_addr * addr,struct nl_cache * link_cache,char * arg)50*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_dev(struct rtnl_addr *addr, struct nl_cache *link_cache,
51*4dc78e53SAndroid Build Coastguard Worker 			   char *arg)
52*4dc78e53SAndroid Build Coastguard Worker {
53*4dc78e53SAndroid Build Coastguard Worker 	int ival;
54*4dc78e53SAndroid Build Coastguard Worker 
55*4dc78e53SAndroid Build Coastguard Worker 	if (!(ival = rtnl_link_name2i(link_cache, arg)))
56*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(ENOENT, "Link \"%s\" does not exist", arg);
57*4dc78e53SAndroid Build Coastguard Worker 
58*4dc78e53SAndroid Build Coastguard Worker 	rtnl_addr_set_ifindex(addr, ival);
59*4dc78e53SAndroid Build Coastguard Worker }
60*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_label(struct rtnl_addr * addr,char * arg)61*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_label(struct rtnl_addr *addr, char *arg)
62*4dc78e53SAndroid Build Coastguard Worker {
63*4dc78e53SAndroid Build Coastguard Worker 	int err;
64*4dc78e53SAndroid Build Coastguard Worker 
65*4dc78e53SAndroid Build Coastguard Worker 	if ((err = rtnl_addr_set_label(addr, arg)) < 0)
66*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to set address label: %s",
67*4dc78e53SAndroid Build Coastguard Worker 			     nl_geterror(err));
68*4dc78e53SAndroid Build Coastguard Worker }
69*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_peer(struct rtnl_addr * addr,char * arg)70*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_peer(struct rtnl_addr *addr, char *arg)
71*4dc78e53SAndroid Build Coastguard Worker {
72*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *a;
73*4dc78e53SAndroid Build Coastguard Worker 	int err;
74*4dc78e53SAndroid Build Coastguard Worker 
75*4dc78e53SAndroid Build Coastguard Worker 	a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
76*4dc78e53SAndroid Build Coastguard Worker 	if ((err = rtnl_addr_set_peer(addr, a)) < 0)
77*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to set peer address: %s",
78*4dc78e53SAndroid Build Coastguard Worker 			     nl_geterror(err));
79*4dc78e53SAndroid Build Coastguard Worker 
80*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(a);
81*4dc78e53SAndroid Build Coastguard Worker }
82*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_scope(struct rtnl_addr * addr,char * arg)83*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_scope(struct rtnl_addr *addr, char *arg)
84*4dc78e53SAndroid Build Coastguard Worker {
85*4dc78e53SAndroid Build Coastguard Worker 	int ival;
86*4dc78e53SAndroid Build Coastguard Worker 
87*4dc78e53SAndroid Build Coastguard Worker 	if ((ival = rtnl_str2scope(arg)) < 0)
88*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(EINVAL, "Unknown address scope \"%s\"", arg);
89*4dc78e53SAndroid Build Coastguard Worker 
90*4dc78e53SAndroid Build Coastguard Worker 	rtnl_addr_set_scope(addr, ival);
91*4dc78e53SAndroid Build Coastguard Worker }
92*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_broadcast(struct rtnl_addr * addr,char * arg)93*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_broadcast(struct rtnl_addr *addr, char *arg)
94*4dc78e53SAndroid Build Coastguard Worker {
95*4dc78e53SAndroid Build Coastguard Worker 	struct nl_addr *a;
96*4dc78e53SAndroid Build Coastguard Worker 	int err;
97*4dc78e53SAndroid Build Coastguard Worker 
98*4dc78e53SAndroid Build Coastguard Worker 	a = nl_cli_addr_parse(arg, rtnl_addr_get_family(addr));
99*4dc78e53SAndroid Build Coastguard Worker 	if ((err = rtnl_addr_set_broadcast(addr, a)) < 0)
100*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to set broadcast address: %s",
101*4dc78e53SAndroid Build Coastguard Worker 			     nl_geterror(err));
102*4dc78e53SAndroid Build Coastguard Worker 
103*4dc78e53SAndroid Build Coastguard Worker 	nl_addr_put(a);
104*4dc78e53SAndroid Build Coastguard Worker }
105*4dc78e53SAndroid Build Coastguard Worker 
parse_lifetime(const char * arg)106*4dc78e53SAndroid Build Coastguard Worker static uint32_t parse_lifetime(const char *arg)
107*4dc78e53SAndroid Build Coastguard Worker {
108*4dc78e53SAndroid Build Coastguard Worker 	uint64_t msecs;
109*4dc78e53SAndroid Build Coastguard Worker 	int err;
110*4dc78e53SAndroid Build Coastguard Worker 
111*4dc78e53SAndroid Build Coastguard Worker 	if (!strcasecmp(arg, "forever"))
112*4dc78e53SAndroid Build Coastguard Worker 		return 0xFFFFFFFFU;
113*4dc78e53SAndroid Build Coastguard Worker 
114*4dc78e53SAndroid Build Coastguard Worker 	if ((err = nl_str2msec(arg, &msecs)) < 0)
115*4dc78e53SAndroid Build Coastguard Worker 		nl_cli_fatal(err, "Unable to parse time string \"%s\": %s",
116*4dc78e53SAndroid Build Coastguard Worker 			     arg, nl_geterror(err));
117*4dc78e53SAndroid Build Coastguard Worker 
118*4dc78e53SAndroid Build Coastguard Worker 	return (msecs / 1000);
119*4dc78e53SAndroid Build Coastguard Worker }
120*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_preferred(struct rtnl_addr * addr,char * arg)121*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_preferred(struct rtnl_addr *addr, char *arg)
122*4dc78e53SAndroid Build Coastguard Worker {
123*4dc78e53SAndroid Build Coastguard Worker 	rtnl_addr_set_preferred_lifetime(addr, parse_lifetime(arg));
124*4dc78e53SAndroid Build Coastguard Worker }
125*4dc78e53SAndroid Build Coastguard Worker 
nl_cli_addr_parse_valid(struct rtnl_addr * addr,char * arg)126*4dc78e53SAndroid Build Coastguard Worker void nl_cli_addr_parse_valid(struct rtnl_addr *addr, char *arg)
127*4dc78e53SAndroid Build Coastguard Worker {
128*4dc78e53SAndroid Build Coastguard Worker 	rtnl_addr_set_valid_lifetime(addr, parse_lifetime(arg));
129*4dc78e53SAndroid Build Coastguard Worker }
130*4dc78e53SAndroid Build Coastguard Worker 
131*4dc78e53SAndroid Build Coastguard Worker /** @} */
132