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
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA
*/
# 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
* @ rcu : RCU callback head for deferred destruction .
* @ 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 .
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 * ) ;
2013-06-18 04:50:33 +04:00
void ovs_vport_deferred_free ( struct vport * vport ) ;
2011-10-26 06:26:31 +04:00
# 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
2013-06-13 22:11:44 +04:00
static inline void ovs_skb_postpush_rcsum ( struct sk_buff * skb ,
const void * start , unsigned int len )
{
if ( skb - > ip_summed = = CHECKSUM_COMPLETE )
skb - > csum = csum_add ( skb - > csum , csum_partial ( start , len , 0 ) ) ;
}
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
}
2014-10-22 19:29:06 +04:00
int ovs_vport_ops_register ( struct vport_ops * ops ) ;
void ovs_vport_ops_unregister ( struct vport_ops * ops ) ;
2015-01-14 08:10:35 +03:00
static inline struct rtable * ovs_tunnel_route_lookup ( struct net * net ,
2015-07-21 11:43:54 +03:00
const struct ip_tunnel_key * key ,
2015-01-14 08:10:35 +03:00
u32 mark ,
struct flowi4 * fl ,
u8 protocol )
{
struct rtable * rt ;
memset ( fl , 0 , sizeof ( * fl ) ) ;
2015-08-20 14:56:23 +03:00
fl - > daddr = key - > u . ipv4 . dst ;
fl - > saddr = key - > u . ipv4 . src ;
2015-08-20 14:56:24 +03:00
fl - > flowi4_tos = RT_TOS ( key - > tos ) ;
2015-01-14 08:10:35 +03:00
fl - > flowi4_mark = mark ;
fl - > flowi4_proto = protocol ;
rt = ip_route_output_key ( net , fl ) ;
return rt ;
}
2015-08-30 03:44:07 +03:00
2015-10-21 09:00:10 +03:00
void ovs_vport_send ( struct vport * vport , struct sk_buff * skb ) ;
2015-08-30 03:44:07 +03:00
2011-10-26 06:26:31 +04:00
# endif /* vport.h */