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