xref: /aosp_15_r20/external/libnl/lib/route/link/inet.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) 2010 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 link_API
8*4dc78e53SAndroid Build Coastguard Worker  * @defgroup link_inet IPv4 Link Module
9*4dc78e53SAndroid Build Coastguard Worker  * @brief Implementation of IPv4 specific link attributes
10*4dc78e53SAndroid Build Coastguard Worker  *
11*4dc78e53SAndroid Build Coastguard Worker  *
12*4dc78e53SAndroid Build Coastguard Worker  *
13*4dc78e53SAndroid Build Coastguard Worker  * @par Example: Reading the value of IPV4_DEVCONF_FORWARDING
14*4dc78e53SAndroid Build Coastguard Worker  * @code
15*4dc78e53SAndroid Build Coastguard Worker  * struct nl_cache *cache;
16*4dc78e53SAndroid Build Coastguard Worker  * struct rtnl_link *link;
17*4dc78e53SAndroid Build Coastguard Worker  * uint32_t value;
18*4dc78e53SAndroid Build Coastguard Worker  *
19*4dc78e53SAndroid Build Coastguard Worker  * // Allocate a link cache
20*4dc78e53SAndroid Build Coastguard Worker  * rtnl_link_alloc_cache(sock, AF_UNSPEC, &cache);
21*4dc78e53SAndroid Build Coastguard Worker  *
22*4dc78e53SAndroid Build Coastguard Worker  * // Search for the link we wish to see the value from
23*4dc78e53SAndroid Build Coastguard Worker  * link = rtnl_link_get_by_name(cache, "eth0");
24*4dc78e53SAndroid Build Coastguard Worker  *
25*4dc78e53SAndroid Build Coastguard Worker  * // Read the value of the setting IPV4_DEVCONF_FORWARDING
26*4dc78e53SAndroid Build Coastguard Worker  * if (rtnl_link_inet_get_conf(link, IPV4_DEVCONF_FORWARDING, &value) < 0)
27*4dc78e53SAndroid Build Coastguard Worker  *         // Error: Unable to read config setting
28*4dc78e53SAndroid Build Coastguard Worker  *
29*4dc78e53SAndroid Build Coastguard Worker  * printf("forwarding is %s\n", value ? "enabled" : "disabled");
30*4dc78e53SAndroid Build Coastguard Worker  * @endcode
31*4dc78e53SAndroid Build Coastguard Worker  *
32*4dc78e53SAndroid Build Coastguard Worker  * @par Example: Changing the value of IPV4_DEVCONF_FOWARDING
33*4dc78e53SAndroid Build Coastguard Worker  * @code
34*4dc78e53SAndroid Build Coastguard Worker  * //
35*4dc78e53SAndroid Build Coastguard Worker  * // ... Continueing from the previous example ...
36*4dc78e53SAndroid Build Coastguard Worker  * //
37*4dc78e53SAndroid Build Coastguard Worker  *
38*4dc78e53SAndroid Build Coastguard Worker  * struct rtnl_link *new;
39*4dc78e53SAndroid Build Coastguard Worker  *
40*4dc78e53SAndroid Build Coastguard Worker  * // Allocate a new link to store the changes we wish to make.
41*4dc78e53SAndroid Build Coastguard Worker  * new = rtnl_link_alloc();
42*4dc78e53SAndroid Build Coastguard Worker  *
43*4dc78e53SAndroid Build Coastguard Worker  * // Set IPV4_DEVCONF_FORWARDING to '1'
44*4dc78e53SAndroid Build Coastguard Worker  * rtnl_link_inet_set_conf(new, IPV4_DEVCONF_FORWARDING, 1);
45*4dc78e53SAndroid Build Coastguard Worker  *
46*4dc78e53SAndroid Build Coastguard Worker  * // Send the change request to the kernel.
47*4dc78e53SAndroid Build Coastguard Worker  * rtnl_link_change(sock, link, new, 0);
48*4dc78e53SAndroid Build Coastguard Worker  * @endcode
49*4dc78e53SAndroid Build Coastguard Worker  *
50*4dc78e53SAndroid Build Coastguard Worker  * @{
51*4dc78e53SAndroid Build Coastguard Worker  */
52*4dc78e53SAndroid Build Coastguard Worker 
53*4dc78e53SAndroid Build Coastguard Worker 
54*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
55*4dc78e53SAndroid Build Coastguard Worker 
56*4dc78e53SAndroid Build Coastguard Worker #include <linux/ip.h>
57*4dc78e53SAndroid Build Coastguard Worker 
58*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
59*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
60*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/rtnl.h>
61*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/inet.h>
62*4dc78e53SAndroid Build Coastguard Worker 
63*4dc78e53SAndroid Build Coastguard Worker #include "link-api.h"
64*4dc78e53SAndroid Build Coastguard Worker 
65*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
66*4dc78e53SAndroid Build Coastguard Worker struct inet_data
67*4dc78e53SAndroid Build Coastguard Worker {
68*4dc78e53SAndroid Build Coastguard Worker 	uint8_t			i_confset[IPV4_DEVCONF_MAX];
69*4dc78e53SAndroid Build Coastguard Worker 	uint32_t		i_conf[IPV4_DEVCONF_MAX];
70*4dc78e53SAndroid Build Coastguard Worker };
71*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
72*4dc78e53SAndroid Build Coastguard Worker 
inet_alloc(struct rtnl_link * link)73*4dc78e53SAndroid Build Coastguard Worker static void *inet_alloc(struct rtnl_link *link)
74*4dc78e53SAndroid Build Coastguard Worker {
75*4dc78e53SAndroid Build Coastguard Worker 	return calloc(1, sizeof(struct inet_data));
76*4dc78e53SAndroid Build Coastguard Worker }
77*4dc78e53SAndroid Build Coastguard Worker 
inet_clone(struct rtnl_link * link,void * data)78*4dc78e53SAndroid Build Coastguard Worker static void *inet_clone(struct rtnl_link *link, void *data)
79*4dc78e53SAndroid Build Coastguard Worker {
80*4dc78e53SAndroid Build Coastguard Worker 	struct inet_data *id;
81*4dc78e53SAndroid Build Coastguard Worker 
82*4dc78e53SAndroid Build Coastguard Worker 	if ((id = inet_alloc(link)))
83*4dc78e53SAndroid Build Coastguard Worker 		memcpy(id, data, sizeof(*id));
84*4dc78e53SAndroid Build Coastguard Worker 
85*4dc78e53SAndroid Build Coastguard Worker 	return id;
86*4dc78e53SAndroid Build Coastguard Worker }
87*4dc78e53SAndroid Build Coastguard Worker 
inet_free(struct rtnl_link * link,void * data)88*4dc78e53SAndroid Build Coastguard Worker static void inet_free(struct rtnl_link *link, void *data)
89*4dc78e53SAndroid Build Coastguard Worker {
90*4dc78e53SAndroid Build Coastguard Worker 	free(data);
91*4dc78e53SAndroid Build Coastguard Worker }
92*4dc78e53SAndroid Build Coastguard Worker 
93*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy inet_policy[IFLA_INET_MAX+1] = {
94*4dc78e53SAndroid Build Coastguard Worker 	[IFLA_INET_CONF]	= { .minlen = 4 },
95*4dc78e53SAndroid Build Coastguard Worker };
96*4dc78e53SAndroid Build Coastguard Worker 
inet_parse_af(struct rtnl_link * link,struct nlattr * attr,void * data)97*4dc78e53SAndroid Build Coastguard Worker static int inet_parse_af(struct rtnl_link *link, struct nlattr *attr, void *data)
98*4dc78e53SAndroid Build Coastguard Worker {
99*4dc78e53SAndroid Build Coastguard Worker 	struct inet_data *id = data;
100*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr *tb[IFLA_INET_MAX+1];
101*4dc78e53SAndroid Build Coastguard Worker 	int err;
102*4dc78e53SAndroid Build Coastguard Worker 
103*4dc78e53SAndroid Build Coastguard Worker 	err = nla_parse_nested(tb, IFLA_INET_MAX, attr, inet_policy);
104*4dc78e53SAndroid Build Coastguard Worker 	if (err < 0)
105*4dc78e53SAndroid Build Coastguard Worker 		return err;
106*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_INET_CONF] && nla_len(tb[IFLA_INET_CONF]) % 4)
107*4dc78e53SAndroid Build Coastguard Worker 		return -EINVAL;
108*4dc78e53SAndroid Build Coastguard Worker 
109*4dc78e53SAndroid Build Coastguard Worker 	if (tb[IFLA_INET_CONF]) {
110*4dc78e53SAndroid Build Coastguard Worker 		int i;
111*4dc78e53SAndroid Build Coastguard Worker 		int len = _NL_MIN(IPV4_DEVCONF_MAX, nla_len(tb[IFLA_INET_CONF]) / 4);
112*4dc78e53SAndroid Build Coastguard Worker 
113*4dc78e53SAndroid Build Coastguard Worker 		for (i = 0; i < len; i++)
114*4dc78e53SAndroid Build Coastguard Worker 			id->i_confset[i] = 1;
115*4dc78e53SAndroid Build Coastguard Worker 		nla_memcpy(&id->i_conf, tb[IFLA_INET_CONF], sizeof(id->i_conf));
116*4dc78e53SAndroid Build Coastguard Worker 	}
117*4dc78e53SAndroid Build Coastguard Worker 
118*4dc78e53SAndroid Build Coastguard Worker 	return 0;
119*4dc78e53SAndroid Build Coastguard Worker }
120*4dc78e53SAndroid Build Coastguard Worker 
inet_fill_af(struct rtnl_link * link,struct nl_msg * msg,void * data)121*4dc78e53SAndroid Build Coastguard Worker static int inet_fill_af(struct rtnl_link *link, struct nl_msg *msg, void *data)
122*4dc78e53SAndroid Build Coastguard Worker {
123*4dc78e53SAndroid Build Coastguard Worker 	struct inet_data *id = data;
124*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr *nla;
125*4dc78e53SAndroid Build Coastguard Worker 	int i;
126*4dc78e53SAndroid Build Coastguard Worker 
127*4dc78e53SAndroid Build Coastguard Worker 	if (!(nla = nla_nest_start(msg, IFLA_INET_CONF)))
128*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_MSGSIZE;
129*4dc78e53SAndroid Build Coastguard Worker 
130*4dc78e53SAndroid Build Coastguard Worker 	for (i = 0; i < IPV4_DEVCONF_MAX; i++)
131*4dc78e53SAndroid Build Coastguard Worker 		if (id->i_confset[i])
132*4dc78e53SAndroid Build Coastguard Worker 			NLA_PUT_U32(msg, i+1, id->i_conf[i]);
133*4dc78e53SAndroid Build Coastguard Worker 
134*4dc78e53SAndroid Build Coastguard Worker 	nla_nest_end(msg, nla);
135*4dc78e53SAndroid Build Coastguard Worker 
136*4dc78e53SAndroid Build Coastguard Worker 	return 0;
137*4dc78e53SAndroid Build Coastguard Worker 
138*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
139*4dc78e53SAndroid Build Coastguard Worker 	return -NLE_MSGSIZE;
140*4dc78e53SAndroid Build Coastguard Worker }
141*4dc78e53SAndroid Build Coastguard Worker 
142*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl inet_devconf[] = {
143*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_FORWARDING, forwarding),
144*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_MC_FORWARDING, mc_forwarding),
145*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_PROXY_ARP, proxy_arp),
146*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ACCEPT_REDIRECTS, accept_redirects),
147*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_SECURE_REDIRECTS, secure_redirects),
148*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_SEND_REDIRECTS, send_redirects),
149*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_SHARED_MEDIA, shared_media),
150*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_RP_FILTER, rp_filter),
151*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, accept_source_route),
152*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_BOOTP_RELAY, bootp_relay),
153*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_LOG_MARTIANS, log_martians),
154*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_TAG, tag),
155*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ARPFILTER, arpfilter),
156*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_MEDIUM_ID, medium_id),
157*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_NOXFRM, noxfrm),
158*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_NOPOLICY, nopolicy),
159*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_FORCE_IGMP_VERSION, force_igmp_version),
160*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ARP_ANNOUNCE, arp_announce),
161*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ARP_IGNORE, arp_ignore),
162*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_PROMOTE_SECONDARIES, promote_secondaries),
163*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ARP_ACCEPT, arp_accept),
164*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ARP_NOTIFY, arp_notify),
165*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ACCEPT_LOCAL, accept_local),
166*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_SRC_VMARK, src_vmark),
167*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_PROXY_ARP_PVLAN, proxy_arp_pvlan),
168*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_ROUTE_LOCALNET, route_localnet),
169*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL, igmpv2_unsolicited_report_interval),
170*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL, igmpv3_unsolicited_report_interval),
171*4dc78e53SAndroid Build Coastguard Worker };
172*4dc78e53SAndroid Build Coastguard Worker 
rtnl_link_inet_devconf2str(int type,char * buf,size_t len)173*4dc78e53SAndroid Build Coastguard Worker const char *rtnl_link_inet_devconf2str(int type, char *buf, size_t len)
174*4dc78e53SAndroid Build Coastguard Worker {
175*4dc78e53SAndroid Build Coastguard Worker 	return __type2str(type, buf, len, inet_devconf,
176*4dc78e53SAndroid Build Coastguard Worker 			  ARRAY_SIZE(inet_devconf));
177*4dc78e53SAndroid Build Coastguard Worker }
178*4dc78e53SAndroid Build Coastguard Worker 
rtnl_link_inet_str2devconf(const char * name)179*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet_str2devconf(const char *name)
180*4dc78e53SAndroid Build Coastguard Worker {
181*4dc78e53SAndroid Build Coastguard Worker 	return __str2type(name, inet_devconf, ARRAY_SIZE(inet_devconf));
182*4dc78e53SAndroid Build Coastguard Worker }
183*4dc78e53SAndroid Build Coastguard Worker 
inet_dump_details(struct rtnl_link * link,struct nl_dump_params * p,void * data)184*4dc78e53SAndroid Build Coastguard Worker static void inet_dump_details(struct rtnl_link *link,
185*4dc78e53SAndroid Build Coastguard Worker 			      struct nl_dump_params *p, void *data)
186*4dc78e53SAndroid Build Coastguard Worker {
187*4dc78e53SAndroid Build Coastguard Worker 	struct inet_data *id = data;
188*4dc78e53SAndroid Build Coastguard Worker 	char buf[64];
189*4dc78e53SAndroid Build Coastguard Worker 	int i, n = 0;
190*4dc78e53SAndroid Build Coastguard Worker 
191*4dc78e53SAndroid Build Coastguard Worker 	nl_dump_line(p, "    ipv4 devconf:\n");
192*4dc78e53SAndroid Build Coastguard Worker 	nl_dump_line(p, "      ");
193*4dc78e53SAndroid Build Coastguard Worker 
194*4dc78e53SAndroid Build Coastguard Worker 	for (i = 0; i < IPV4_DEVCONF_MAX; i++) {
195*4dc78e53SAndroid Build Coastguard Worker 		nl_dump_line(p, "%-19s %3u",
196*4dc78e53SAndroid Build Coastguard Worker 			rtnl_link_inet_devconf2str(i+1, buf, sizeof(buf)),
197*4dc78e53SAndroid Build Coastguard Worker 			id->i_confset[i] ? id->i_conf[i] : 0);
198*4dc78e53SAndroid Build Coastguard Worker 
199*4dc78e53SAndroid Build Coastguard Worker 		if (++n == 3) {
200*4dc78e53SAndroid Build Coastguard Worker 			nl_dump(p, "\n");
201*4dc78e53SAndroid Build Coastguard Worker 			nl_dump_line(p, "      ");
202*4dc78e53SAndroid Build Coastguard Worker 			n = 0;
203*4dc78e53SAndroid Build Coastguard Worker 		} else
204*4dc78e53SAndroid Build Coastguard Worker 			nl_dump(p, "  ");
205*4dc78e53SAndroid Build Coastguard Worker 	}
206*4dc78e53SAndroid Build Coastguard Worker 
207*4dc78e53SAndroid Build Coastguard Worker 	if (n != 0)
208*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, "\n");
209*4dc78e53SAndroid Build Coastguard Worker }
210*4dc78e53SAndroid Build Coastguard Worker 
211*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_link_af_ops inet_ops = {
212*4dc78e53SAndroid Build Coastguard Worker 	.ao_family			= AF_INET,
213*4dc78e53SAndroid Build Coastguard Worker 	.ao_alloc			= &inet_alloc,
214*4dc78e53SAndroid Build Coastguard Worker 	.ao_clone			= &inet_clone,
215*4dc78e53SAndroid Build Coastguard Worker 	.ao_free			= &inet_free,
216*4dc78e53SAndroid Build Coastguard Worker 	.ao_parse_af			= &inet_parse_af,
217*4dc78e53SAndroid Build Coastguard Worker 	.ao_fill_af			= &inet_fill_af,
218*4dc78e53SAndroid Build Coastguard Worker 	.ao_dump[NL_DUMP_DETAILS]	= &inet_dump_details,
219*4dc78e53SAndroid Build Coastguard Worker };
220*4dc78e53SAndroid Build Coastguard Worker 
221*4dc78e53SAndroid Build Coastguard Worker /**
222*4dc78e53SAndroid Build Coastguard Worker  * Get value of a ipv4 link configuration setting
223*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object
224*4dc78e53SAndroid Build Coastguard Worker  * @arg cfgid		Configuration identifier
225*4dc78e53SAndroid Build Coastguard Worker  * @arg res		Result pointer
226*4dc78e53SAndroid Build Coastguard Worker  *
227*4dc78e53SAndroid Build Coastguard Worker  * Stores the value of the specified configuration setting in the provided
228*4dc78e53SAndroid Build Coastguard Worker  * result pointer.
229*4dc78e53SAndroid Build Coastguard Worker  *
230*4dc78e53SAndroid Build Coastguard Worker  * @return 0 on success or a negative error code.
231*4dc78e53SAndroid Build Coastguard Worker  * @return -NLE_RANGE cfgid is out of range, 1..IPV4_DEVCONF_MAX
232*4dc78e53SAndroid Build Coastguard Worker  * @return -NLE_NOATTR configuration setting not available
233*4dc78e53SAndroid Build Coastguard Worker  * @return -NLE_INVAL cfgid not set. If the link was received via netlink,
234*4dc78e53SAndroid Build Coastguard Worker  *                    it means that the cfgid is not supported.
235*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_inet_get_conf(struct rtnl_link * link,const unsigned int cfgid,uint32_t * res)236*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet_get_conf(struct rtnl_link *link, const unsigned int cfgid,
237*4dc78e53SAndroid Build Coastguard Worker 			    uint32_t *res)
238*4dc78e53SAndroid Build Coastguard Worker {
239*4dc78e53SAndroid Build Coastguard Worker 	struct inet_data *id;
240*4dc78e53SAndroid Build Coastguard Worker 
241*4dc78e53SAndroid Build Coastguard Worker 	if (cfgid == 0 || cfgid > IPV4_DEVCONF_MAX)
242*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_RANGE;
243*4dc78e53SAndroid Build Coastguard Worker 
244*4dc78e53SAndroid Build Coastguard Worker 	if (!(id = rtnl_link_af_data(link, &inet_ops)))
245*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
246*4dc78e53SAndroid Build Coastguard Worker 
247*4dc78e53SAndroid Build Coastguard Worker 	if (!id->i_confset[cfgid - 1])
248*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_INVAL;
249*4dc78e53SAndroid Build Coastguard Worker 	*res = id->i_conf[cfgid - 1];
250*4dc78e53SAndroid Build Coastguard Worker 
251*4dc78e53SAndroid Build Coastguard Worker 	return 0;
252*4dc78e53SAndroid Build Coastguard Worker }
253*4dc78e53SAndroid Build Coastguard Worker 
254*4dc78e53SAndroid Build Coastguard Worker /**
255*4dc78e53SAndroid Build Coastguard Worker  * Change value of a ipv4 link configuration setting
256*4dc78e53SAndroid Build Coastguard Worker  * @arg link		Link object
257*4dc78e53SAndroid Build Coastguard Worker  * @arg cfgid		Configuration identifier
258*4dc78e53SAndroid Build Coastguard Worker  * @arg value		New value
259*4dc78e53SAndroid Build Coastguard Worker  *
260*4dc78e53SAndroid Build Coastguard Worker  * Changes the value in the per link ipv4 configuration array.
261*4dc78e53SAndroid Build Coastguard Worker  *
262*4dc78e53SAndroid Build Coastguard Worker  * @return 0 on success or a negative error code.
263*4dc78e53SAndroid Build Coastguard Worker  * @return -NLE_RANGE cfgid is out of range, 1..IPV4_DEVCONF_MAX
264*4dc78e53SAndroid Build Coastguard Worker  * @return -NLE_NOMEM memory allocation failed
265*4dc78e53SAndroid Build Coastguard Worker  */
rtnl_link_inet_set_conf(struct rtnl_link * link,const unsigned int cfgid,uint32_t value)266*4dc78e53SAndroid Build Coastguard Worker int rtnl_link_inet_set_conf(struct rtnl_link *link, const unsigned int cfgid,
267*4dc78e53SAndroid Build Coastguard Worker 			    uint32_t value)
268*4dc78e53SAndroid Build Coastguard Worker {
269*4dc78e53SAndroid Build Coastguard Worker 	struct inet_data *id;
270*4dc78e53SAndroid Build Coastguard Worker 
271*4dc78e53SAndroid Build Coastguard Worker 	if (!(id = rtnl_link_af_alloc(link, &inet_ops)))
272*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
273*4dc78e53SAndroid Build Coastguard Worker 
274*4dc78e53SAndroid Build Coastguard Worker 	if (cfgid == 0 || cfgid > IPV4_DEVCONF_MAX)
275*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_RANGE;
276*4dc78e53SAndroid Build Coastguard Worker 
277*4dc78e53SAndroid Build Coastguard Worker 	id->i_confset[cfgid - 1] = 1;
278*4dc78e53SAndroid Build Coastguard Worker 	id->i_conf[cfgid - 1] = value;
279*4dc78e53SAndroid Build Coastguard Worker 
280*4dc78e53SAndroid Build Coastguard Worker 	return 0;
281*4dc78e53SAndroid Build Coastguard Worker }
282*4dc78e53SAndroid Build Coastguard Worker 
283*4dc78e53SAndroid Build Coastguard Worker 
inet_init(void)284*4dc78e53SAndroid Build Coastguard Worker static void _nl_init inet_init(void)
285*4dc78e53SAndroid Build Coastguard Worker {
286*4dc78e53SAndroid Build Coastguard Worker 	rtnl_link_af_register(&inet_ops);
287*4dc78e53SAndroid Build Coastguard Worker }
288*4dc78e53SAndroid Build Coastguard Worker 
inet_exit(void)289*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit inet_exit(void)
290*4dc78e53SAndroid Build Coastguard Worker {
291*4dc78e53SAndroid Build Coastguard Worker 	rtnl_link_af_unregister(&inet_ops);
292*4dc78e53SAndroid Build Coastguard Worker }
293*4dc78e53SAndroid Build Coastguard Worker 
294*4dc78e53SAndroid Build Coastguard Worker /** @} */
295