2014-11-28 14:34:17 +01:00
/*
* include / net / switchdev . h - Switch device API
* Copyright ( c ) 2014 Jiri Pirko < jiri @ resnulli . us >
2015-03-09 13:59:09 -07:00
* Copyright ( c ) 2014 - 2015 Scott Feldman < sfeldma @ gmail . com >
2014-11-28 14:34:17 +01:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# ifndef _LINUX_SWITCHDEV_H_
# define _LINUX_SWITCHDEV_H_
# include <linux/netdevice.h>
2015-01-15 23:49:36 +01:00
# include <linux/notifier.h>
2015-03-15 21:07:14 -07:00
struct fib_info ;
/**
* struct switchdev_ops - switchdev operations
*
* int ( * swdev_parent_id_get ) ( struct net_device * dev ,
* struct netdev_phys_item_id * psid ) ;
* Called to get an ID of the switch chip this port is part of .
* If driver implements this , it indicates that it represents a port
* of a switch chip .
*
* int ( * swdev_port_stp_update ) ( struct net_device * dev , u8 state ) ;
* Called to notify switch device port of bridge port STP
* state change .
*
* int ( * swdev_fib_ipv4_add ) ( struct net_device * dev , __be32 dst ,
* int dst_len , struct fib_info * fi ,
* u8 tos , u8 type , u32 nlflags , u32 tb_id ) ;
* Called to add / modify IPv4 route to switch device .
*
* int ( * swdev_fib_ipv4_del ) ( struct net_device * dev , __be32 dst ,
* int dst_len , struct fib_info * fi ,
* u8 tos , u8 type , u32 tb_id ) ;
* Called to delete IPv4 route from switch device .
*/
struct swdev_ops {
int ( * swdev_parent_id_get ) ( struct net_device * dev ,
struct netdev_phys_item_id * psid ) ;
int ( * swdev_port_stp_update ) ( struct net_device * dev , u8 state ) ;
int ( * swdev_fib_ipv4_add ) ( struct net_device * dev , __be32 dst ,
int dst_len , struct fib_info * fi ,
u8 tos , u8 type , u32 nlflags ,
u32 tb_id ) ;
int ( * swdev_fib_ipv4_del ) ( struct net_device * dev , __be32 dst ,
int dst_len , struct fib_info * fi ,
u8 tos , u8 type , u32 tb_id ) ;
} ;
2015-01-15 23:49:37 +01:00
enum netdev_switch_notifier_type {
NETDEV_SWITCH_FDB_ADD = 1 ,
NETDEV_SWITCH_FDB_DEL ,
} ;
2015-01-15 23:49:36 +01:00
struct netdev_switch_notifier_info {
struct net_device * dev ;
} ;
2015-01-15 23:49:37 +01:00
struct netdev_switch_notifier_fdb_info {
struct netdev_switch_notifier_info info ; /* must be first */
const unsigned char * addr ;
u16 vid ;
} ;
2015-01-15 23:49:36 +01:00
static inline struct net_device *
netdev_switch_notifier_info_to_dev ( const struct netdev_switch_notifier_info * info )
{
return info - > dev ;
}
2014-11-28 14:34:17 +01:00
# ifdef CONFIG_NET_SWITCHDEV
int netdev_switch_parent_id_get ( struct net_device * dev ,
struct netdev_phys_item_id * psid ) ;
2014-11-28 14:34:20 +01:00
int netdev_switch_port_stp_update ( struct net_device * dev , u8 state ) ;
2015-01-15 23:49:36 +01:00
int register_netdev_switch_notifier ( struct notifier_block * nb ) ;
int unregister_netdev_switch_notifier ( struct notifier_block * nb ) ;
int call_netdev_switch_notifiers ( unsigned long val , struct net_device * dev ,
struct netdev_switch_notifier_info * info ) ;
2015-01-29 22:40:13 -08:00
int netdev_switch_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int netdev_switch_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int ndo_dflt_netdev_switch_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int ndo_dflt_netdev_switch_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
2015-03-05 21:21:15 -08:00
int netdev_switch_fib_ipv4_add ( u32 dst , int dst_len , struct fib_info * fi ,
2015-03-09 13:59:09 -07:00
u8 tos , u8 type , u32 nlflags , u32 tb_id ) ;
2015-03-05 21:21:15 -08:00
int netdev_switch_fib_ipv4_del ( u32 dst , int dst_len , struct fib_info * fi ,
u8 tos , u8 type , u32 tb_id ) ;
2015-03-05 21:21:19 -08:00
void netdev_switch_fib_ipv4_abort ( struct fib_info * fi ) ;
2015-03-05 21:21:15 -08:00
2014-11-28 14:34:17 +01:00
# else
static inline int netdev_switch_parent_id_get ( struct net_device * dev ,
struct netdev_phys_item_id * psid )
{
return - EOPNOTSUPP ;
}
2014-11-28 14:34:20 +01:00
static inline int netdev_switch_port_stp_update ( struct net_device * dev ,
u8 state )
{
return - EOPNOTSUPP ;
}
2015-01-15 23:49:36 +01:00
static inline int register_netdev_switch_notifier ( struct notifier_block * nb )
{
return 0 ;
}
static inline int unregister_netdev_switch_notifier ( struct notifier_block * nb )
{
return 0 ;
}
static inline int call_netdev_switch_notifiers ( unsigned long val , struct net_device * dev ,
2015-01-18 10:25:56 +01:00
struct netdev_switch_notifier_info * info )
2015-01-15 23:49:36 +01:00
{
return NOTIFY_DONE ;
}
2015-01-29 22:40:13 -08:00
static inline int netdev_switch_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
{
return - EOPNOTSUPP ;
}
static inline int netdev_switch_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
{
return - EOPNOTSUPP ;
}
static inline int ndo_dflt_netdev_switch_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
{
return 0 ;
}
static inline int ndo_dflt_netdev_switch_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
{
return 0 ;
}
2015-03-05 21:21:15 -08:00
static inline int netdev_switch_fib_ipv4_add ( u32 dst , int dst_len ,
struct fib_info * fi ,
2015-03-09 13:59:09 -07:00
u8 tos , u8 type ,
u32 nlflags , u32 tb_id )
2015-03-05 21:21:15 -08:00
{
return 0 ;
}
static inline int netdev_switch_fib_ipv4_del ( u32 dst , int dst_len ,
struct fib_info * fi ,
u8 tos , u8 type , u32 tb_id )
{
return 0 ;
}
2015-03-06 11:44:28 -05:00
static inline void netdev_switch_fib_ipv4_abort ( struct fib_info * fi )
2015-03-05 21:21:19 -08:00
{
}
2014-11-28 14:34:17 +01:00
# endif
# endif /* _LINUX_SWITCHDEV_H_ */