2007-03-22 21:48:11 +03:00
# ifndef __NET_RTNETLINK_H
# define __NET_RTNETLINK_H
# include <linux/rtnetlink.h>
# include <net/netlink.h>
2017-04-16 19:48:24 +03:00
typedef int ( * rtnl_doit_func ) ( struct sk_buff * , struct nlmsghdr * ,
struct netlink_ext_ack * ) ;
2007-03-22 21:48:11 +03:00
typedef int ( * rtnl_dumpit_func ) ( struct sk_buff * , struct netlink_callback * ) ;
2012-02-22 01:54:48 +04:00
typedef u16 ( * rtnl_calcit_func ) ( struct sk_buff * , struct nlmsghdr * ) ;
2007-03-22 21:48:11 +03:00
2013-09-22 21:32:23 +04:00
int __rtnl_register ( int protocol , int msgtype ,
rtnl_doit_func , rtnl_dumpit_func , rtnl_calcit_func ) ;
void rtnl_register ( int protocol , int msgtype ,
rtnl_doit_func , rtnl_dumpit_func , rtnl_calcit_func ) ;
int rtnl_unregister ( int protocol , int msgtype ) ;
void rtnl_unregister_all ( int protocol ) ;
2007-03-22 21:48:11 +03:00
2009-08-25 18:07:40 +04:00
static inline int rtnl_msg_family ( const struct nlmsghdr * nlh )
2007-03-26 10:24:24 +04:00
{
if ( nlmsg_len ( nlh ) > = sizeof ( struct rtgenmsg ) )
return ( ( struct rtgenmsg * ) nlmsg_data ( nlh ) ) - > rtgen_family ;
else
return AF_UNSPEC ;
}
2007-06-13 23:03:51 +04:00
/**
* struct rtnl_link_ops - rtnetlink link operations
*
* @ list : Used internally
* @ kind : Identifier
* @ maxtype : Highest device specific netlink attribute number
* @ policy : Netlink policy for device specific attribute validation
* @ validate : Optional validation function for netlink / changelink parameters
* @ priv_size : sizeof net_device private space
* @ setup : net_device setup function
* @ newlink : Function for configuring and registering a new device
* @ changelink : Function for changing parameters of an existing device
* @ dellink : Function to remove a device
* @ get_size : Function to calculate required room for dumping device
* specific netlink attributes
* @ fill_info : Function to dump device specific netlink attributes
2012-04-10 22:32:59 +04:00
* @ get_xstats_size : Function to calculate required room for dumping device
2007-06-13 23:03:51 +04:00
* specific statistics
* @ fill_xstats : Function to dump device specific statistics
2012-07-20 06:28:47 +04:00
* @ get_num_tx_queues : Function to determine number of transmit queues
* to create when creating a new device .
* @ get_num_rx_queues : Function to determine number of receive queues
* to create when creating a new device .
2015-01-15 17:11:16 +03:00
* @ get_link_net : Function to get the i / o netns of the device
2016-04-30 11:25:27 +03:00
* @ get_linkxstats_size : Function to calculate the required room for
* dumping device - specific extended link stats
* @ fill_linkxstats : Function to dump device - specific extended link stats
2007-06-13 23:03:51 +04:00
*/
struct rtnl_link_ops {
struct list_head list ;
const char * kind ;
size_t priv_size ;
void ( * setup ) ( struct net_device * dev ) ;
int maxtype ;
const struct nla_policy * policy ;
int ( * validate ) ( struct nlattr * tb [ ] ,
2017-06-26 00:56:01 +03:00
struct nlattr * data [ ] ,
struct netlink_ext_ack * extack ) ;
2007-06-13 23:03:51 +04:00
2009-11-08 11:53:51 +03:00
int ( * newlink ) ( struct net * src_net ,
struct net_device * dev ,
2007-06-13 23:03:51 +04:00
struct nlattr * tb [ ] ,
2017-06-26 00:55:59 +03:00
struct nlattr * data [ ] ,
struct netlink_ext_ack * extack ) ;
2007-06-13 23:03:51 +04:00
int ( * changelink ) ( struct net_device * dev ,
struct nlattr * tb [ ] ,
2017-06-26 00:56:00 +03:00
struct nlattr * data [ ] ,
struct netlink_ext_ack * extack ) ;
2009-10-27 10:06:36 +03:00
void ( * dellink ) ( struct net_device * dev ,
struct list_head * head ) ;
2007-06-13 23:03:51 +04:00
size_t ( * get_size ) ( const struct net_device * dev ) ;
int ( * fill_info ) ( struct sk_buff * skb ,
const struct net_device * dev ) ;
size_t ( * get_xstats_size ) ( const struct net_device * dev ) ;
int ( * fill_xstats ) ( struct sk_buff * skb ,
const struct net_device * dev ) ;
2012-07-20 06:28:47 +04:00
unsigned int ( * get_num_tx_queues ) ( void ) ;
unsigned int ( * get_num_rx_queues ) ( void ) ;
2014-01-22 12:05:55 +04:00
int slave_maxtype ;
const struct nla_policy * slave_policy ;
int ( * slave_validate ) ( struct nlattr * tb [ ] ,
struct nlattr * data [ ] ) ;
int ( * slave_changelink ) ( struct net_device * dev ,
struct net_device * slave_dev ,
struct nlattr * tb [ ] ,
struct nlattr * data [ ] ) ;
size_t ( * get_slave_size ) ( const struct net_device * dev ,
const struct net_device * slave_dev ) ;
int ( * fill_slave_info ) ( struct sk_buff * skb ,
const struct net_device * dev ,
const struct net_device * slave_dev ) ;
2015-01-15 17:11:16 +03:00
struct net * ( * get_link_net ) ( const struct net_device * dev ) ;
2016-06-28 17:57:05 +03:00
size_t ( * get_linkxstats_size ) ( const struct net_device * dev ,
int attr ) ;
2016-04-30 11:25:27 +03:00
int ( * fill_linkxstats ) ( struct sk_buff * skb ,
const struct net_device * dev ,
2016-06-28 17:57:05 +03:00
int * prividx , int attr ) ;
2007-06-13 23:03:51 +04:00
} ;
2013-09-22 21:32:23 +04:00
int __rtnl_link_register ( struct rtnl_link_ops * ops ) ;
void __rtnl_link_unregister ( struct rtnl_link_ops * ops ) ;
2007-06-13 23:03:51 +04:00
2013-09-22 21:32:23 +04:00
int rtnl_link_register ( struct rtnl_link_ops * ops ) ;
void rtnl_link_unregister ( struct rtnl_link_ops * ops ) ;
2007-06-13 23:03:51 +04:00
2010-11-16 07:30:14 +03:00
/**
* 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
2012-04-10 22:32:59 +04:00
* netlink attributes .
2010-11-22 04:31:54 +03:00
* @ validate_link_af : Validate a IFLA_AF_SPEC attribute , must check attr
* for invalid configuration settings .
* @ set_link_af : Function to parse a IFLA_AF_SPEC attribute and modify
* net_device accordingly .
2010-11-16 07:30:14 +03:00
*/
struct rtnl_af_ops {
struct list_head list ;
int family ;
int ( * fill_link_af ) ( struct sk_buff * skb ,
2015-09-11 23:48:48 +03:00
const struct net_device * dev ,
u32 ext_filter_mask ) ;
2015-10-19 19:23:28 +03:00
size_t ( * get_link_af_size ) ( const struct net_device * dev ,
u32 ext_filter_mask ) ;
2010-11-16 07:30:14 +03:00
2010-11-22 04:31:54 +03:00
int ( * validate_link_af ) ( const struct net_device * dev ,
const struct nlattr * attr ) ;
int ( * set_link_af ) ( struct net_device * dev ,
const struct nlattr * attr ) ;
2017-01-16 17:16:36 +03:00
int ( * fill_stats_af ) ( struct sk_buff * skb ,
const struct net_device * dev ) ;
size_t ( * get_stats_af_size ) ( const struct net_device * dev ) ;
2010-11-16 07:30:14 +03:00
} ;
2013-09-22 21:32:23 +04:00
void __rtnl_af_unregister ( struct rtnl_af_ops * ops ) ;
2010-11-16 07:30:14 +03:00
2013-12-30 22:41:32 +04:00
void rtnl_af_register ( struct rtnl_af_ops * ops ) ;
2013-09-22 21:32:23 +04:00
void rtnl_af_unregister ( struct rtnl_af_ops * ops ) ;
2010-11-16 07:30:14 +03:00
2013-09-22 21:32:23 +04:00
struct net * rtnl_link_get_net ( struct net * src_net , struct nlattr * tb [ ] ) ;
2015-04-10 02:45:53 +03:00
struct net_device * rtnl_create_link ( struct net * net , const char * ifname ,
2014-07-14 18:37:25 +04:00
unsigned char name_assign_type ,
2013-09-22 21:32:23 +04:00
const struct rtnl_link_ops * ops ,
struct nlattr * tb [ ] ) ;
2015-07-21 11:44:06 +03:00
int rtnl_delete_link ( struct net_device * dev ) ;
2013-09-22 21:32:23 +04:00
int rtnl_configure_link ( struct net_device * dev , const struct ifinfomsg * ifm ) ;
2010-11-16 07:30:14 +03:00
2017-04-12 15:34:07 +03:00
int rtnl_nla_parse_ifla ( struct nlattr * * tb , const struct nlattr * head , int len ,
struct netlink_ext_ack * exterr ) ;
2007-08-09 09:16:38 +04:00
2007-06-13 23:03:51 +04:00
# define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind)
2007-03-22 21:48:11 +03:00
# endif