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