60 #include <netlink-private/netlink.h>
61 #include <netlink/netlink.h>
62 #include <netlink/attr.h>
63 #include <netlink/route/rtnl.h>
64 #include <netlink-private/route/link/api.h>
69 uint8_t i_confset[IPV4_DEVCONF_MAX];
70 uint32_t i_conf[IPV4_DEVCONF_MAX];
74 static void *inet_alloc(
struct rtnl_link *link)
76 return calloc(1,
sizeof(
struct inet_data));
79 static void *inet_clone(
struct rtnl_link *link,
void *data)
83 if ((
id = inet_alloc(link)))
84 memcpy(
id, data,
sizeof(*
id));
89 static void inet_free(
struct rtnl_link *link,
void *data)
94 static struct nla_policy inet_policy[IFLA_INET6_MAX+1] = {
95 [IFLA_INET_CONF] = { .
minlen = IPV4_DEVCONF_MAX * 4 },
98 static int inet_parse_af(
struct rtnl_link *link,
struct nlattr *attr,
void *data)
100 struct inet_data *
id = data;
101 struct nlattr *tb[IFLA_INET_MAX+1];
108 if (tb[IFLA_INET_CONF])
109 nla_memcpy(&id->i_conf, tb[IFLA_INET_CONF],
sizeof(id->i_conf));
114 static int inet_fill_af(
struct rtnl_link *link,
struct nl_msg *msg,
void *data)
116 struct inet_data *
id = data;
123 for (i = 0; i < IPV4_DEVCONF_MAX; i++)
124 if (id->i_confset[i])
135 static const struct trans_tbl inet_devconf[] = {
136 __ADD(IPV4_DEVCONF_FORWARDING, forwarding)
137 __ADD(IPV4_DEVCONF_MC_FORWARDING, mc_forwarding)
138 __ADD(IPV4_DEVCONF_PROXY_ARP, proxy_arp)
139 __ADD(IPV4_DEVCONF_ACCEPT_REDIRECTS, accept_redirects)
140 __ADD(IPV4_DEVCONF_SECURE_REDIRECTS, secure_redirects)
141 __ADD(IPV4_DEVCONF_SEND_REDIRECTS, send_redirects)
142 __ADD(IPV4_DEVCONF_SHARED_MEDIA, shared_media)
143 __ADD(IPV4_DEVCONF_RP_FILTER, rp_filter)
144 __ADD(IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE, accept_source_route)
145 __ADD(IPV4_DEVCONF_BOOTP_RELAY, bootp_relay)
146 __ADD(IPV4_DEVCONF_LOG_MARTIANS, log_martians)
147 __ADD(IPV4_DEVCONF_TAG, tag)
148 __ADD(IPV4_DEVCONF_ARPFILTER, arpfilter)
149 __ADD(IPV4_DEVCONF_MEDIUM_ID, medium_id)
150 __ADD(IPV4_DEVCONF_NOXFRM, noxfrm)
151 __ADD(IPV4_DEVCONF_NOPOLICY, nopolicy)
152 __ADD(IPV4_DEVCONF_FORCE_IGMP_VERSION, force_igmp_version)
153 __ADD(IPV4_DEVCONF_ARP_ANNOUNCE, arp_announce)
154 __ADD(IPV4_DEVCONF_ARP_IGNORE, arp_ignore)
155 __ADD(IPV4_DEVCONF_PROMOTE_SECONDARIES, promote_secondaries)
156 __ADD(IPV4_DEVCONF_ARP_ACCEPT, arp_accept)
157 __ADD(IPV4_DEVCONF_ARP_NOTIFY, arp_notify)
158 __ADD(IPV4_DEVCONF_ACCEPT_LOCAL, accept_local)
159 __ADD(IPV4_DEVCONF_SRC_VMARK, src_vmark)
160 __ADD(IPV4_DEVCONF_PROXY_ARP_PVLAN, proxy_arp_pvlan)
163 const
char *rtnl_link_inet_devconf2str(
int type,
char *buf,
size_t len)
165 return __type2str(type, buf, len, inet_devconf,
166 ARRAY_SIZE(inet_devconf));
169 int rtnl_link_inet_str2devconf(
const char *name)
171 return __str2type(name, inet_devconf, ARRAY_SIZE(inet_devconf));
174 static void inet_dump_details(
struct rtnl_link *link,
177 struct inet_data *
id = data;
181 nl_dump_line(p,
" ipv4 devconf:\n");
182 nl_dump_line(p,
" ");
184 for (i = 0; i < IPV4_DEVCONF_MAX; i++) {
185 nl_dump_line(p,
"%-19s %3u",
186 rtnl_link_inet_devconf2str(i+1, buf,
sizeof(buf)),
191 nl_dump_line(p,
" ");
201 static struct rtnl_link_af_ops inet_ops = {
202 .ao_family = AF_INET,
203 .ao_alloc = &inet_alloc,
204 .ao_clone = &inet_clone,
205 .ao_free = &inet_free,
206 .ao_parse_af = &inet_parse_af,
207 .ao_fill_af = &inet_fill_af,
227 struct inet_data *id;
229 if (cfgid == 0 || cfgid > IPV4_DEVCONF_MAX)
235 *res =
id->i_conf[cfgid - 1];
255 struct inet_data *id;
260 if (cfgid == 0 || cfgid > IPV4_DEVCONF_MAX)
263 id->i_confset[cfgid - 1] = 1;
264 id->i_conf[cfgid - 1] = value;
270 static void __init inet_init(
void)
275 static void __exit inet_exit(
void)