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