2019-05-29 17:12:43 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2011-10-26 06:26:31 +04:00
/*
2012-05-04 05:55:23 +04:00
* Copyright ( c ) 2007 - 2012 Nicira , Inc .
2011-10-26 06:26:31 +04:00
*/
# ifndef VPORT_H
# define VPORT_H 1
2013-04-16 00:30:37 +04:00
# include <linux/if_tunnel.h>
2011-10-26 06:26:31 +04:00
# include <linux/list.h>
2012-02-23 07:58:59 +04:00
# include <linux/netlink.h>
2011-10-26 06:26:31 +04:00
# include <linux/openvswitch.h>
2014-07-18 02:14:13 +04:00
# include <linux/reciprocal_div.h>
2011-10-26 06:26:31 +04:00
# include <linux/skbuff.h>
# include <linux/spinlock.h>
# include <linux/u64_stats_sync.h>
# include "datapath.h"
struct vport ;
struct vport_parms ;
/* The following definitions are for users of the vport subsytem: */
int ovs_vport_init ( void ) ;
void ovs_vport_exit ( void ) ;
struct vport * ovs_vport_add ( const struct vport_parms * ) ;
void ovs_vport_del ( struct vport * ) ;
2014-11-06 17:58:52 +03:00
struct vport * ovs_vport_locate ( const struct net * net , const char * name ) ;
2011-10-26 06:26:31 +04:00
void ovs_vport_get_stats ( struct vport * , struct ovs_vport_stats * ) ;
int ovs_vport_set_options ( struct vport * , struct nlattr * options ) ;
int ovs_vport_get_options ( const struct vport * , struct sk_buff * ) ;
2014-11-06 17:58:52 +03:00
int ovs_vport_set_upcall_portids ( struct vport * , const struct nlattr * pids ) ;
2014-07-18 02:14:13 +04:00
int ovs_vport_get_upcall_portids ( const struct vport * , struct sk_buff * ) ;
u32 ovs_vport_find_upcall_portid ( const struct vport * , struct sk_buff * ) ;
/**
* struct vport_portids - array of netlink portids of a vport .
* must be protected by rcu .
* @ rn_ids : The reciprocal value of @ n_ids .
* @ rcu : RCU callback head for deferred destruction .
* @ n_ids : Size of @ ids array .
* @ ids : Array storing the Netlink socket pids to be used for packets received
* on this port that miss the flow table .
*/
struct vport_portids {
struct reciprocal_value rn_ids ;
struct rcu_head rcu ;
u32 n_ids ;
u32 ids [ ] ;
} ;
2011-10-26 06:26:31 +04:00
/**
* struct vport - one port within a datapath
2016-01-10 02:07:11 +03:00
* @ dev : Pointer to net_device .
2011-10-26 06:26:31 +04:00
* @ dp : Datapath to which this port belongs .
2014-07-18 02:14:13 +04:00
* @ upcall_portids : RCU protected ' struct vport_portids ' .
2012-12-04 02:24:32 +04:00
* @ port_no : Index into @ dp ' s @ ports array .
2011-10-26 06:26:31 +04:00
* @ hash_node : Element in @ dev_table hash table in vport . c .
2012-08-23 23:40:54 +04:00
* @ dp_hash_node : Element in @ datapath - > ports hash table in datapath . c .
2011-10-26 06:26:31 +04:00
* @ ops : Class structure .
2015-02-17 22:23:10 +03:00
* @ detach_list : list used for detaching vport in net - exit call .
2016-01-10 02:07:11 +03:00
* @ rcu : RCU callback head for deferred destruction .
2011-10-26 06:26:31 +04:00
*/
struct vport {
2015-07-21 11:44:04 +03:00
struct net_device * dev ;
2011-10-26 06:26:31 +04:00
struct datapath * dp ;
2014-07-18 02:14:13 +04:00
struct vport_portids __rcu * upcall_portids ;
2012-12-04 02:24:32 +04:00
u16 port_no ;
2011-10-26 06:26:31 +04:00
struct hlist_node hash_node ;
2012-08-23 23:40:54 +04:00
struct hlist_node dp_hash_node ;
2011-10-26 06:26:31 +04:00
const struct vport_ops * ops ;
2015-02-17 22:23:10 +03:00
struct list_head detach_list ;
2015-07-21 11:44:04 +03:00
struct rcu_head rcu ;
2011-10-26 06:26:31 +04:00
} ;
/**
* struct vport_parms - parameters for creating a new vport
*
* @ name : New vport ' s name .
* @ type : New vport ' s type .
* @ options : % OVS_VPORT_ATTR_OPTIONS attribute from Netlink message , % NULL if
* none was supplied .
* @ dp : New vport ' s datapath .
* @ port_no : New vport ' s port number .
*/
struct vport_parms {
const char * name ;
enum ovs_vport_type type ;
struct nlattr * options ;
/* For ovs_vport_alloc(). */
struct datapath * dp ;
u16 port_no ;
2014-07-18 02:14:13 +04:00
struct nlattr * upcall_portids ;
2011-10-26 06:26:31 +04:00
} ;
/**
* struct vport_ops - definition of a type of virtual port
*
* @ type : % OVS_VPORT_TYPE_ * value for this type of virtual port .
* @ create : Create a new vport configured as specified . On success returns
* a new vport allocated with ovs_vport_alloc ( ) , otherwise an ERR_PTR ( ) value .
* @ destroy : Destroys a vport . Must call vport_free ( ) on the vport but not
* before an RCU grace period has elapsed .
* @ set_options : Modify the configuration of an existing vport . May be % NULL
* if modification is not supported .
* @ get_options : Appends vport - specific attributes for the configuration of an
* existing vport to a & struct sk_buff . May be % NULL for a vport that does not
* have any configuration .
2015-08-30 03:44:07 +03:00
* @ send : Send a packet on the device .
2013-05-13 19:22:34 +04:00
* zero for dropped packets or negative for error .
2011-10-26 06:26:31 +04:00
*/
struct vport_ops {
enum ovs_vport_type type ;
2013-04-16 00:23:03 +04:00
/* Called with ovs_mutex. */
2011-10-26 06:26:31 +04:00
struct vport * ( * create ) ( const struct vport_parms * ) ;
void ( * destroy ) ( struct vport * ) ;
int ( * set_options ) ( struct vport * , struct nlattr * ) ;
int ( * get_options ) ( const struct vport * , struct sk_buff * ) ;
2015-10-21 09:00:10 +03:00
netdev_tx_t ( * send ) ( struct sk_buff * skb ) ;
2014-10-22 19:29:06 +04:00
struct module * owner ;
struct list_head list ;
2011-10-26 06:26:31 +04:00
} ;
struct vport * ovs_vport_alloc ( int priv_size , const struct vport_ops * ,
const struct vport_parms * ) ;
void ovs_vport_free ( struct vport * ) ;
# define VPORT_ALIGN 8
/**
* vport_priv - access private data area of vport
*
* @ vport : vport to access
*
* If a nonzero size was passed in priv_size of vport_alloc ( ) a private data
* area was allocated on creation . This allows that area to be accessed and
* used for any purpose needed by the vport implementer .
*/
static inline void * vport_priv ( const struct vport * vport )
{
2014-02-04 02:08:29 +04:00
return ( u8 * ) ( uintptr_t ) vport + ALIGN ( sizeof ( struct vport ) , VPORT_ALIGN ) ;
2011-10-26 06:26:31 +04:00
}
/**
* vport_from_priv - lookup vport from private data pointer
*
* @ priv : Start of private data area .
*
* It is sometimes useful to translate from a pointer to the private data
* area to the vport , such as in the case where the private data pointer is
* the result of a hash table lookup . @ priv must point to the start of the
* private data area .
*/
2014-02-04 02:07:43 +04:00
static inline struct vport * vport_from_priv ( void * priv )
2011-10-26 06:26:31 +04:00
{
2014-02-04 02:07:43 +04:00
return ( struct vport * ) ( ( u8 * ) priv - ALIGN ( sizeof ( struct vport ) , VPORT_ALIGN ) ) ;
2011-10-26 06:26:31 +04:00
}
2015-08-30 03:44:07 +03:00
int ovs_vport_receive ( struct vport * , struct sk_buff * ,
const struct ip_tunnel_info * ) ;
2011-10-26 06:26:31 +04:00
2015-07-21 11:44:05 +03:00
static inline const char * ovs_vport_name ( struct vport * vport )
{
2015-08-30 03:44:05 +03:00
return vport - > dev - > name ;
2015-07-21 11:44:05 +03:00
}
2015-11-30 14:31:43 +03:00
int __ovs_vport_ops_register ( struct vport_ops * ops ) ;
# define ovs_vport_ops_register(ops) \
( { \
( ops ) - > owner = THIS_MODULE ; \
__ovs_vport_ops_register ( ops ) ; \
} )
2014-10-22 19:29:06 +04:00
void ovs_vport_ops_unregister ( struct vport_ops * ops ) ;
2016-11-10 18:28:19 +03:00
void ovs_vport_send ( struct vport * vport , struct sk_buff * skb , u8 mac_proto ) ;
2015-08-30 03:44:07 +03:00
2011-10-26 06:26:31 +04:00
# endif /* vport.h */