rtnetlink: Link address family API
Each net_device contains address family specific data such as
per device settings and statistics. We already expose this data
via procfs/sysfs and partially netlink.
The netlink method requires the requester to send one RTM_GETLINK
request for each address family it wishes to receive data of
and then merge this data itself.
This patch implements a new API which combines all address family
specific link data in a new netlink attribute IFLA_AF_SPEC.
IFLA_AF_SPEC contains a sequence of nested attributes, one for each
address family which in turn defines the structure of its own
attribute. Example:
[IFLA_AF_SPEC] = {
[AF_INET] = {
[IFLA_INET_CONF] = ...,
},
[AF_INET6] = {
[IFLA_INET6_FLAGS] = ...,
[IFLA_INET6_CONF] = ...,
}
}
The API also allows for address families to implement a function
which parses the IFLA_AF_SPEC attribute sent by userspace to
implement address family specific link options.
Signed-off-by: Thomas Graf <tgraf@infradead.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
d67ef35fff
commit
f8ff182c71
@@ -83,6 +83,37 @@ extern void __rtnl_link_unregister(struct rtnl_link_ops *ops);
|
||||
extern int rtnl_link_register(struct rtnl_link_ops *ops);
|
||||
extern void rtnl_link_unregister(struct rtnl_link_ops *ops);
|
||||
|
||||
/**
|
||||
* struct rtnl_af_ops - rtnetlink address family operations
|
||||
*
|
||||
* @list: Used internally
|
||||
* @family: Address family
|
||||
* @fill_link_af: Function to fill IFLA_AF_SPEC with address family
|
||||
* specific netlink attributes.
|
||||
* @get_link_af_size: Function to calculate size of address family specific
|
||||
* netlink attributes exlusive the container attribute.
|
||||
* @parse_link_af: Function to parse a IFLA_AF_SPEC attribute and modify
|
||||
* net_device accordingly.
|
||||
*/
|
||||
struct rtnl_af_ops {
|
||||
struct list_head list;
|
||||
int family;
|
||||
|
||||
int (*fill_link_af)(struct sk_buff *skb,
|
||||
const struct net_device *dev);
|
||||
size_t (*get_link_af_size)(const struct net_device *dev);
|
||||
|
||||
int (*parse_link_af)(struct net_device *dev,
|
||||
const struct nlattr *attr);
|
||||
};
|
||||
|
||||
extern int __rtnl_af_register(struct rtnl_af_ops *ops);
|
||||
extern void __rtnl_af_unregister(struct rtnl_af_ops *ops);
|
||||
|
||||
extern int rtnl_af_register(struct rtnl_af_ops *ops);
|
||||
extern void rtnl_af_unregister(struct rtnl_af_ops *ops);
|
||||
|
||||
|
||||
extern struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]);
|
||||
extern struct net_device *rtnl_create_link(struct net *src_net, struct net *net,
|
||||
char *ifname, const struct rtnl_link_ops *ops, struct nlattr *tb[]);
|
||||
|
||||
Reference in New Issue
Block a user