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
*
2015-05-10 09:47:47 -07:00
* @ switchdev_parent_id_get : Called to get an ID of the switch chip this port
2015-03-20 17:42:46 -07:00
* is part of . If driver implements this , it indicates that it
* represents a port of a switch chip .
2015-03-15 21:07:14 -07:00
*
2015-05-10 09:47:47 -07:00
* @ switchdev_port_stp_update : Called to notify switch device port of bridge
2015-03-20 17:42:46 -07:00
* port STP state change .
2015-03-15 21:07:14 -07:00
*
2015-05-10 09:47:47 -07:00
* @ switchdev_fib_ipv4_add : Called to add / modify IPv4 route to switch device .
2015-03-15 21:07:14 -07:00
*
2015-05-10 09:47:47 -07:00
* @ switchdev_fib_ipv4_del : Called to delete IPv4 route from switch device .
2015-03-15 21:07:14 -07:00
*/
2015-05-10 09:47:47 -07:00
struct switchdev_ops {
int ( * switchdev_parent_id_get ) ( struct net_device * dev ,
struct netdev_phys_item_id * psid ) ;
int ( * switchdev_port_stp_update ) ( struct net_device * dev , u8 state ) ;
int ( * switchdev_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 ( * switchdev_fib_ipv4_del ) ( struct net_device * dev , __be32 dst ,
int dst_len , struct fib_info * fi ,
u8 tos , u8 type , u32 tb_id ) ;
2015-03-15 21:07:14 -07:00
} ;
2015-05-10 09:47:46 -07:00
enum switchdev_notifier_type {
SWITCHDEV_FDB_ADD = 1 ,
SWITCHDEV_FDB_DEL ,
2015-01-15 23:49:37 +01:00
} ;
2015-05-10 09:47:46 -07:00
struct switchdev_notifier_info {
2015-01-15 23:49:36 +01:00
struct net_device * dev ;
} ;
2015-05-10 09:47:46 -07:00
struct switchdev_notifier_fdb_info {
struct switchdev_notifier_info info ; /* must be first */
2015-01-15 23:49:37 +01:00
const unsigned char * addr ;
u16 vid ;
} ;
2015-01-15 23:49:36 +01:00
static inline struct net_device *
2015-05-10 09:47:46 -07:00
switchdev_notifier_info_to_dev ( const struct switchdev_notifier_info * info )
2015-01-15 23:49:36 +01:00
{
return info - > dev ;
}
2014-11-28 14:34:17 +01:00
# ifdef CONFIG_NET_SWITCHDEV
2015-05-10 09:47:46 -07:00
int switchdev_parent_id_get ( struct net_device * dev ,
struct netdev_phys_item_id * psid ) ;
int switchdev_port_stp_update ( struct net_device * dev , u8 state ) ;
int register_switchdev_notifier ( struct notifier_block * nb ) ;
int unregister_switchdev_notifier ( struct notifier_block * nb ) ;
int call_switchdev_notifiers ( unsigned long val , struct net_device * dev ,
struct switchdev_notifier_info * info ) ;
int switchdev_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int switchdev_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int ndo_dflt_switchdev_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int ndo_dflt_switchdev_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh , u16 flags ) ;
int switchdev_fib_ipv4_add ( u32 dst , int dst_len , struct fib_info * fi ,
u8 tos , u8 type , u32 nlflags , u32 tb_id ) ;
int switchdev_fib_ipv4_del ( u32 dst , int dst_len , struct fib_info * fi ,
u8 tos , u8 type , u32 tb_id ) ;
void switchdev_fib_ipv4_abort ( struct fib_info * fi ) ;
2015-03-05 21:21:15 -08:00
2014-11-28 14:34:17 +01:00
# else
2015-05-10 09:47:46 -07:00
static inline int switchdev_parent_id_get ( struct net_device * dev ,
struct netdev_phys_item_id * psid )
2014-11-28 14:34:17 +01:00
{
return - EOPNOTSUPP ;
}
2015-05-10 09:47:46 -07:00
static inline int switchdev_port_stp_update ( struct net_device * dev ,
u8 state )
2014-11-28 14:34:20 +01:00
{
return - EOPNOTSUPP ;
}
2015-05-10 09:47:46 -07:00
static inline int register_switchdev_notifier ( struct notifier_block * nb )
2015-01-15 23:49:36 +01:00
{
return 0 ;
}
2015-05-10 09:47:46 -07:00
static inline int unregister_switchdev_notifier ( struct notifier_block * nb )
2015-01-15 23:49:36 +01:00
{
return 0 ;
}
2015-05-10 09:47:46 -07:00
static inline int call_switchdev_notifiers ( unsigned long val ,
struct net_device * dev ,
struct switchdev_notifier_info * info )
2015-01-15 23:49:36 +01:00
{
return NOTIFY_DONE ;
}
2015-05-10 09:47:46 -07:00
static inline int switchdev_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
2015-01-29 22:40:13 -08:00
{
return - EOPNOTSUPP ;
}
2015-05-10 09:47:46 -07:00
static inline int switchdev_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
2015-01-29 22:40:13 -08:00
{
return - EOPNOTSUPP ;
}
2015-05-10 09:47:46 -07:00
static inline int ndo_dflt_switchdev_port_bridge_dellink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
2015-01-29 22:40:13 -08:00
{
return 0 ;
}
2015-05-10 09:47:46 -07:00
static inline int ndo_dflt_switchdev_port_bridge_setlink ( struct net_device * dev ,
struct nlmsghdr * nlh ,
u16 flags )
2015-01-29 22:40:13 -08:00
{
return 0 ;
}
2015-05-10 09:47:46 -07:00
static inline int switchdev_fib_ipv4_add ( u32 dst , int dst_len ,
struct fib_info * fi ,
u8 tos , u8 type ,
u32 nlflags , u32 tb_id )
2015-03-05 21:21:15 -08:00
{
return 0 ;
}
2015-05-10 09:47:46 -07:00
static inline int switchdev_fib_ipv4_del ( u32 dst , int dst_len ,
struct fib_info * fi ,
u8 tos , u8 type , u32 tb_id )
2015-03-05 21:21:15 -08:00
{
return 0 ;
}
2015-05-10 09:47:46 -07:00
static inline void switchdev_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_ */