2007-03-22 21:48:11 +03:00
# ifndef __NET_RTNETLINK_H
# define __NET_RTNETLINK_H
# include <linux/rtnetlink.h>
# include <net/netlink.h>
typedef int ( * rtnl_doit_func ) ( struct sk_buff * , struct nlmsghdr * , void * ) ;
typedef int ( * rtnl_dumpit_func ) ( struct sk_buff * , struct netlink_callback * ) ;
extern int __rtnl_register ( int protocol , int msgtype ,
rtnl_doit_func , rtnl_dumpit_func ) ;
extern void rtnl_register ( int protocol , int msgtype ,
rtnl_doit_func , rtnl_dumpit_func ) ;
extern int rtnl_unregister ( int protocol , int msgtype ) ;
extern void rtnl_unregister_all ( int protocol ) ;
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
* @ get_xstats_size : Function to calculate required room for dumping devic
* specific statistics
* @ fill_xstats : Function to dump device specific statistics
*/
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 [ ] ,
struct nlattr * data [ ] ) ;
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 [ ] ,
struct nlattr * data [ ] ) ;
int ( * changelink ) ( struct net_device * dev ,
struct nlattr * tb [ ] ,
struct nlattr * data [ ] ) ;
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 ) ;
2009-09-03 05:03:00 +04:00
int ( * get_tx_queues ) ( struct net * net , struct nlattr * tb [ ] ,
unsigned int * tx_queues ,
unsigned int * real_tx_queues ) ;
2007-06-13 23:03:51 +04:00
} ;
extern int __rtnl_link_register ( struct rtnl_link_ops * ops ) ;
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 ) ;
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
* netlink attributes exlusive the container attribute .
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 ,
const struct net_device * dev ) ;
size_t ( * get_link_af_size ) ( const struct net_device * dev ) ;
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 ) ;
2010-11-16 07:30:14 +03:00
} ;
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 ) ;
2009-11-08 11:53:51 +03:00
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 [ ] ) ;
rtnetlink: support specifying device flags on device creation
commit e8469ed959c373c2ff9e6f488aa5a14971aebe1f
Author: Patrick McHardy <kaber@trash.net>
Date: Tue Feb 23 20:41:30 2010 +0100
Support specifying the initial device flags when creating a device though
rtnl_link. Devices allocated by rtnl_create_link() are marked as INITIALIZING
in order to surpress netlink registration notifications. To complete setup,
rtnl_configure_link() must be called, which performs the device flag changes
and invokes the deferred notifiers if everything went well.
Two examples:
# add macvlan to eth0
#
$ ip link add link eth0 up allmulticast on type macvlan
[LINK]11: macvlan0@eth0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 26:f8:84:02:f9:2a brd ff:ff:ff:ff:ff:ff
[ROUTE]ff00::/8 dev macvlan0 table local metric 256 mtu 1500 advmss 1440 hoplimit 0
[ROUTE]fe80::/64 dev macvlan0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
[LINK]11: macvlan0@eth0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500
link/ether 26:f8:84:02:f9:2a
[ADDR]11: macvlan0 inet6 fe80::24f8:84ff:fe02:f92a/64 scope link
valid_lft forever preferred_lft forever
[ROUTE]local fe80::24f8:84ff:fe02:f92a via :: dev lo table local proto none metric 0 mtu 16436 advmss 16376 hoplimit 0
[ROUTE]default via fe80::215:e9ff:fef0:10f8 dev macvlan0 proto kernel metric 1024 mtu 1500 advmss 1440 hoplimit 0
[NEIGH]fe80::215:e9ff:fef0:10f8 dev macvlan0 lladdr 00:15:e9:f0:10:f8 router STALE
[ROUTE]2001:6f8:974::/64 dev macvlan0 proto kernel metric 256 expires 0sec mtu 1500 advmss 1440 hoplimit 0
[PREFIX]prefix 2001:6f8:974::/64 dev macvlan0 onlink autoconf valid 14400 preferred 131084
[ADDR]11: macvlan0 inet6 2001:6f8:974:0:24f8:84ff:fe02:f92a/64 scope global dynamic
valid_lft 86399sec preferred_lft 14399sec
# add VLAN to eth1, eth1 is down
#
$ ip link add link eth1 up type vlan id 1000
RTNETLINK answers: Network is down
<no events>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2010-02-26 09:34:54 +03:00
extern int rtnl_configure_link ( struct net_device * dev ,
const struct ifinfomsg * ifm ) ;
2007-08-09 09:16:38 +04:00
extern const struct nla_policy ifla_policy [ IFLA_MAX + 1 ] ;
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