if (tb[IFLA_INET_CONF] && nla_len(tb[IFLA_INET_CONF]) % 4)
return -EINVAL;
- if (tb[IFLA_INET_CONF])
+ if (tb[IFLA_INET_CONF]) {
+ int i;
+ int len = min_t(int, IPV4_DEVCONF_MAX, nla_len(tb[IFLA_INET_CONF]) / 4);
+
+ for (i = 0; i < len; i++)
+ id->i_confset[i] = 1;
nla_memcpy(&id->i_conf, tb[IFLA_INET_CONF], sizeof(id->i_conf));
+ }
return 0;
}
for (i = 0; i < IPV4_DEVCONF_MAX; i++) {
nl_dump_line(p, "%-19s %3u",
rtnl_link_inet_devconf2str(i+1, buf, sizeof(buf)),
- id->i_conf[i]);
+ id->i_confset[i] ? id->i_conf[i] : 0);
if (++n == 3) {
nl_dump(p, "\n");
* @return 0 on success or a negative error code.
* @return -NLE_RANGE cfgid is out of range, 1..IPV4_DEVCONF_MAX
* @return -NLE_NOATTR configuration setting not available
+ * @return -NLE_INVAL cfgid not set. If the link was received via netlink,
+ * it means that the cfgid is not supported.
*/
int rtnl_link_inet_get_conf(struct rtnl_link *link, const unsigned int cfgid,
uint32_t *res)
if (!(id = rtnl_link_af_alloc(link, &inet_ops)))
return -NLE_NOATTR;
+ if (!id->i_confset[cfgid - 1])
+ return -NLE_INVAL;
*res = id->i_conf[cfgid - 1];
return 0;