2011-10-26 06:26:31 +04:00
/*
2014-09-16 06:37:25 +04:00
* Copyright ( c ) 2007 - 2014 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 DATAPATH_H
# define DATAPATH_H 1
# include <asm/page.h>
# include <linux/kernel.h>
# include <linux/mutex.h>
# include <linux/netdevice.h>
# include <linux/skbuff.h>
# include <linux/u64_stats_sync.h>
2015-07-21 11:43:54 +03:00
# include <net/ip_tunnels.h>
2011-10-26 06:26:31 +04:00
2015-08-26 21:31:48 +03:00
# include "conntrack.h"
2011-10-26 06:26:31 +04:00
# include "flow.h"
2013-10-04 05:16:47 +04:00
# include "flow_table.h"
2011-10-26 06:26:31 +04:00
2012-08-23 23:40:54 +04:00
# define DP_MAX_PORTS USHRT_MAX
# define DP_VPORT_HASH_BUCKETS 1024
2011-10-26 06:26:31 +04:00
# define SAMPLE_ACTION_DEPTH 3
/**
* struct dp_stats_percpu - per - cpu packet processing statistics for a given
* datapath .
* @ n_hit : Number of received packets for which a matching flow was found in
* the flow table .
* @ n_miss : Number of received packets that had no matching flow in the flow
* table . The sum of @ n_hit and @ n_miss is the number of packets that have
* been received by the datapath .
* @ n_lost : Number of received packets that had no matching flow in the flow
* table that could not be sent to userspace ( normally due to an overflow in
* one of the datapath ' s queues ) .
2013-10-22 21:42:46 +04:00
* @ n_mask_hit : Number of masks looked up for flow match .
* @ n_mask_hit / ( @ n_hit + @ n_missed ) will be the average masks looked
* up per packet .
2011-10-26 06:26:31 +04:00
*/
struct dp_stats_percpu {
u64 n_hit ;
u64 n_missed ;
u64 n_lost ;
2013-10-22 21:42:46 +04:00
u64 n_mask_hit ;
2014-02-15 03:10:46 +04:00
struct u64_stats_sync syncp ;
2011-10-26 06:26:31 +04:00
} ;
/**
* struct datapath - datapath for flow - based packet switching
* @ rcu : RCU callback head for deferred destruction .
* @ list_node : Element in global ' dps ' list .
2013-10-04 11:14:23 +04:00
* @ table : flow table .
2012-08-23 23:40:54 +04:00
* @ ports : Hash table for ports . % OVSP_LOCAL port always exists . Protected by
2013-04-16 00:23:03 +04:00
* ovs_mutex and RCU .
2011-10-26 06:26:31 +04:00
* @ stats_percpu : Per - CPU datapath statistics .
2012-02-23 07:58:59 +04:00
* @ net : Reference to net namespace .
2016-02-26 12:45:39 +03:00
* @ max_headroom : the maximum headroom of all vports in this datapath ; it will
* be used by all the internal vports in this dp .
2011-10-26 06:26:31 +04:00
*
* Context : See the comment on locking at the top of datapath . c for additional
* locking information .
*/
struct datapath {
struct rcu_head rcu ;
struct list_head list_node ;
/* Flow table. */
2013-10-04 11:14:23 +04:00
struct flow_table table ;
2011-10-26 06:26:31 +04:00
/* Switch ports. */
2012-08-23 23:40:54 +04:00
struct hlist_head * ports ;
2011-10-26 06:26:31 +04:00
/* Stats. */
struct dp_stats_percpu __percpu * stats_percpu ;
2012-02-23 07:58:59 +04:00
/* Network namespace ref. */
2015-03-12 07:06:44 +03:00
possible_net_t net ;
2013-12-13 18:22:18 +04:00
u32 user_features ;
2016-02-26 12:45:39 +03:00
u32 max_headroom ;
2011-10-26 06:26:31 +04:00
} ;
/**
* struct ovs_skb_cb - OVS data in skb CB
2014-09-16 06:20:31 +04:00
* @ input_vport : The original vport packet came in on . This value is cached
* when a packet is received by OVS .
2015-08-26 21:31:48 +03:00
* @ mru : The maximum received fragement size ; 0 if the packet is not
2016-06-10 21:49:33 +03:00
* @ cutlen : The number of bytes from the packet end to be removed .
2015-08-26 21:31:48 +03:00
* fragmented .
2011-10-26 06:26:31 +04:00
*/
struct ovs_skb_cb {
2014-09-16 06:20:31 +04:00
struct vport * input_vport ;
2015-08-26 21:31:48 +03:00
u16 mru ;
2016-06-10 21:49:33 +03:00
u32 cutlen ;
2011-10-26 06:26:31 +04:00
} ;
# define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb)
/**
* struct dp_upcall - metadata to include with a packet to send to userspace
* @ cmd : One of % OVS_PACKET_CMD_ * .
2013-02-16 05:29:22 +04:00
* @ userdata : If nonnull , its variable - length value is passed to userspace as
2011-10-26 06:26:31 +04:00
* % OVS_PACKET_ATTR_USERDATA .
2014-11-06 17:57:27 +03:00
* @ portid : Netlink portid to which packet should be sent . If @ portid is 0
* then no packet is sent and the packet is accounted in the datapath ' s @ n_lost
2011-10-26 06:26:31 +04:00
* counter .
2014-11-06 17:51:24 +03:00
* @ egress_tun_info : If nonnull , becomes % OVS_PACKET_ATTR_EGRESS_TUN_KEY .
2015-08-26 21:31:48 +03:00
* @ mru : If not zero , Maximum received IP fragment size .
2011-10-26 06:26:31 +04:00
*/
struct dp_upcall_info {
2015-08-31 04:09:38 +03:00
struct ip_tunnel_info * egress_tun_info ;
2011-10-26 06:26:31 +04:00
const struct nlattr * userdata ;
2015-05-27 06:59:43 +03:00
const struct nlattr * actions ;
int actions_len ;
2012-09-08 00:12:54 +04:00
u32 portid ;
2014-11-06 17:57:27 +03:00
u8 cmd ;
2015-08-26 21:31:48 +03:00
u16 mru ;
2011-10-26 06:26:31 +04:00
} ;
2013-04-16 00:23:03 +04:00
/**
* struct ovs_net - Per net - namespace data for ovs .
* @ dps : List of datapaths to enable dumping them all out .
* Protected by genl_mutex .
*/
struct ovs_net {
struct list_head dps ;
struct work_struct dp_notify_work ;
2015-08-26 21:31:52 +03:00
/* Module reference for configuring conntrack. */
bool xt_label ;
2013-04-16 00:23:03 +04:00
} ;
extern int ovs_net_id ;
void ovs_lock ( void ) ;
void ovs_unlock ( void ) ;
# ifdef CONFIG_LOCKDEP
int lockdep_ovsl_is_held ( void ) ;
# else
# define lockdep_ovsl_is_held() 1
# endif
2014-07-30 04:31:08 +04:00
# define ASSERT_OVSL() WARN_ON(!lockdep_ovsl_is_held())
2013-04-16 00:23:03 +04:00
# define ovsl_dereference(p) \
rcu_dereference_protected ( p , lockdep_ovsl_is_held ( ) )
2013-12-03 22:58:53 +04:00
# define rcu_dereference_ovsl(p) \
rcu_dereference_check ( p , lockdep_ovsl_is_held ( ) )
2013-04-16 00:23:03 +04:00
2014-11-06 17:58:52 +03:00
static inline struct net * ovs_dp_get_net ( const struct datapath * dp )
2012-02-23 07:58:59 +04:00
{
return read_pnet ( & dp - > net ) ;
}
static inline void ovs_dp_set_net ( struct datapath * dp , struct net * net )
{
write_pnet ( & dp - > net , net ) ;
}
2013-04-16 00:23:03 +04:00
struct vport * ovs_lookup_vport ( const struct datapath * dp , u16 port_no ) ;
static inline struct vport * ovs_vport_rcu ( const struct datapath * dp , int port_no )
{
WARN_ON_ONCE ( ! rcu_read_lock_held ( ) ) ;
return ovs_lookup_vport ( dp , port_no ) ;
}
static inline struct vport * ovs_vport_ovsl_rcu ( const struct datapath * dp , int port_no )
{
WARN_ON_ONCE ( ! rcu_read_lock_held ( ) & & ! lockdep_ovsl_is_held ( ) ) ;
return ovs_lookup_vport ( dp , port_no ) ;
}
static inline struct vport * ovs_vport_ovsl ( const struct datapath * dp , int port_no )
{
ASSERT_OVSL ( ) ;
return ovs_lookup_vport ( dp , port_no ) ;
}
2011-10-26 06:26:31 +04:00
extern struct notifier_block ovs_dp_device_notifier ;
2013-11-19 18:19:38 +04:00
extern struct genl_family dp_vport_genl_family ;
2011-10-26 06:26:31 +04:00
2014-09-16 06:28:44 +04:00
void ovs_dp_process_packet ( struct sk_buff * skb , struct sw_flow_key * key ) ;
2011-10-26 06:26:31 +04:00
void ovs_dp_detach_port ( struct vport * ) ;
int ovs_dp_upcall ( struct datapath * , struct sk_buff * ,
2016-06-10 21:49:33 +03:00
const struct sw_flow_key * , const struct dp_upcall_info * ,
uint32_t cutlen ) ;
2011-10-26 06:26:31 +04:00
2014-09-16 06:37:25 +04:00
const char * ovs_dp_name ( const struct datapath * dp ) ;
2011-10-26 06:26:31 +04:00
struct sk_buff * ovs_vport_cmd_build_info ( struct vport * , u32 pid , u32 seq ,
u8 cmd ) ;
2014-09-16 06:15:28 +04:00
int ovs_execute_actions ( struct datapath * dp , struct sk_buff * skb ,
2014-11-06 17:58:52 +03:00
const struct sw_flow_actions * , struct sw_flow_key * ) ;
2014-09-16 06:37:25 +04:00
2013-04-16 00:23:03 +04:00
void ovs_dp_notify_wq ( struct work_struct * work ) ;
2013-08-08 07:01:00 +04:00
2014-09-16 06:37:25 +04:00
int action_fifos_init ( void ) ;
void action_fifos_exit ( void ) ;
2015-08-26 21:31:45 +03:00
/* 'KEY' must not have any bits set outside of the 'MASK' */
# define OVS_MASKED(OLD, KEY, MASK) ((KEY) | ((OLD) & ~(MASK)))
# define OVS_SET_MASKED(OLD, KEY, MASK) ((OLD) = OVS_MASKED(OLD, KEY, MASK))
2014-11-06 18:03:05 +03:00
# define OVS_NLERR(logging_allowed, fmt, ...) \
2014-02-04 05:06:46 +04:00
do { \
2014-11-06 18:03:05 +03:00
if ( logging_allowed & & net_ratelimit ( ) ) \
pr_info ( " netlink: " fmt " \n " , # # __VA_ARGS__ ) ; \
2014-02-04 05:06:46 +04:00
} while ( 0 )
2011-10-26 06:26:31 +04:00
# endif /* datapath.h */