2011-10-25 19:26:31 -07:00
/*
2013-08-07 20:01:00 -07:00
* Copyright ( c ) 2007 - 2013 Nicira , Inc .
2011-10-25 19:26:31 -07: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 FLOW_H
# define FLOW_H 1
2013-10-29 17:22:21 -07:00
# include <linux/cache.h>
2011-10-25 19:26:31 -07:00
# include <linux/kernel.h>
# include <linux/netlink.h>
# include <linux/openvswitch.h>
# include <linux/spinlock.h>
# include <linux/types.h>
# include <linux/rcupdate.h>
# include <linux/if_ether.h>
# include <linux/in6.h>
# include <linux/jiffies.h>
# include <linux/time.h>
# include <linux/flex_array.h>
# include <net/inet_ecn.h>
struct sk_buff ;
2013-06-17 17:50:18 -07:00
/* Used to memset ovs_key_ipv4_tunnel padding. */
# define OVS_TUNNEL_KEY_SIZE \
( offsetof ( struct ovs_key_ipv4_tunnel , ipv4_ttl ) + \
FIELD_SIZEOF ( struct ovs_key_ipv4_tunnel , ipv4_ttl ) )
struct ovs_key_ipv4_tunnel {
__be64 tun_id ;
__be32 ipv4_src ;
__be32 ipv4_dst ;
2013-06-17 17:50:33 -07:00
__be16 tun_flags ;
2013-06-17 17:50:18 -07:00
u8 ipv4_tos ;
u8 ipv4_ttl ;
} ;
2013-06-17 17:50:33 -07:00
static inline void ovs_flow_tun_key_init ( struct ovs_key_ipv4_tunnel * tun_key ,
const struct iphdr * iph , __be64 tun_id ,
__be16 tun_flags )
{
tun_key - > tun_id = tun_id ;
tun_key - > ipv4_src = iph - > saddr ;
tun_key - > ipv4_dst = iph - > daddr ;
tun_key - > ipv4_tos = iph - > tos ;
tun_key - > ipv4_ttl = iph - > ttl ;
tun_key - > tun_flags = tun_flags ;
/* clear struct padding. */
memset ( ( unsigned char * ) tun_key + OVS_TUNNEL_KEY_SIZE , 0 ,
sizeof ( * tun_key ) - OVS_TUNNEL_KEY_SIZE ) ;
}
2011-10-25 19:26:31 -07:00
struct sw_flow_key {
2013-06-17 17:50:18 -07:00
struct ovs_key_ipv4_tunnel tun_key ; /* Encapsulating tunnel key. */
2011-10-25 19:26:31 -07:00
struct {
u32 priority ; /* Packet QoS priority. */
2012-11-26 11:24:11 -08:00
u32 skb_mark ; /* SKB mark. */
2012-08-23 12:40:54 -07:00
u16 in_port ; /* Input switch port (or DP_MAX_PORTS). */
2011-10-25 19:26:31 -07:00
} phy ;
struct {
u8 src [ ETH_ALEN ] ; /* Ethernet source address. */
u8 dst [ ETH_ALEN ] ; /* Ethernet destination address. */
__be16 tci ; /* 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */
__be16 type ; /* Ethernet frame type. */
} eth ;
struct {
u8 proto ; /* IP protocol or lower 8 bits of ARP opcode. */
u8 tos ; /* IP ToS. */
u8 ttl ; /* IP TTL/hop limit. */
u8 frag ; /* One of OVS_FRAG_TYPE_*. */
} ip ;
union {
struct {
struct {
__be32 src ; /* IP source address. */
__be32 dst ; /* IP destination address. */
} addr ;
union {
struct {
2013-08-22 12:30:48 -07:00
__be16 src ; /* TCP/UDP/SCTP source port. */
__be16 dst ; /* TCP/UDP/SCTP destination port. */
2013-10-23 01:44:59 -07:00
__be16 flags ; /* TCP flags. */
2011-10-25 19:26:31 -07:00
} tp ;
struct {
u8 sha [ ETH_ALEN ] ; /* ARP source hardware address. */
u8 tha [ ETH_ALEN ] ; /* ARP target hardware address. */
} arp ;
} ;
} ipv4 ;
struct {
struct {
struct in6_addr src ; /* IPv6 source address. */
struct in6_addr dst ; /* IPv6 destination address. */
} addr ;
__be32 label ; /* IPv6 flow label. */
struct {
2013-08-22 12:30:48 -07:00
__be16 src ; /* TCP/UDP/SCTP source port. */
__be16 dst ; /* TCP/UDP/SCTP destination port. */
2013-10-23 01:44:59 -07:00
__be16 flags ; /* TCP flags. */
2011-10-25 19:26:31 -07:00
} tp ;
struct {
struct in6_addr target ; /* ND target address. */
u8 sll [ ETH_ALEN ] ; /* ND source link layer address. */
u8 tll [ ETH_ALEN ] ; /* ND target link layer address. */
} nd ;
} ipv6 ;
} ;
2013-09-05 12:17:05 -07:00
} __aligned ( BITS_PER_LONG / 8 ) ; /* Ensure that we can do comparisons as longs. */
2011-10-25 19:26:31 -07:00
2013-10-03 18:16:47 -07:00
struct sw_flow_key_range {
2013-11-25 10:41:28 -08:00
unsigned short int start ;
unsigned short int end ;
2013-10-03 18:16:47 -07:00
} ;
struct sw_flow_mask {
int ref_count ;
struct rcu_head rcu ;
struct list_head list ;
struct sw_flow_key_range range ;
struct sw_flow_key key ;
} ;
struct sw_flow_match {
struct sw_flow_key * key ;
struct sw_flow_key_range range ;
struct sw_flow_mask * mask ;
} ;
struct sw_flow_actions {
struct rcu_head rcu ;
u32 actions_len ;
struct nlattr actions [ ] ;
} ;
2013-10-29 17:22:21 -07:00
struct flow_stats {
u64 packet_count ; /* Number of packets matched. */
u64 byte_count ; /* Number of bytes matched. */
unsigned long used ; /* Last used time (in jiffies). */
spinlock_t lock ; /* Lock for atomic stats update. */
__be16 tcp_flags ; /* Union of seen TCP flags. */
} ;
struct sw_flow_stats {
bool is_percpu ;
union {
struct flow_stats * stat ;
struct flow_stats __percpu * cpu_stats ;
} ;
} ;
2011-10-25 19:26:31 -07:00
struct sw_flow {
struct rcu_head rcu ;
struct hlist_node hash_node [ 2 ] ;
u32 hash ;
struct sw_flow_key key ;
2013-08-07 20:01:00 -07:00
struct sw_flow_key unmasked_key ;
struct sw_flow_mask * mask ;
2011-10-25 19:26:31 -07:00
struct sw_flow_actions __rcu * sf_acts ;
2013-10-29 17:22:21 -07:00
struct sw_flow_stats stats ;
2011-10-25 19:26:31 -07:00
} ;
struct arp_eth_header {
__be16 ar_hrd ; /* format of hardware address */
__be16 ar_pro ; /* format of protocol address */
unsigned char ar_hln ; /* length of hardware address */
unsigned char ar_pln ; /* length of protocol address */
__be16 ar_op ; /* ARP opcode (command) */
/* Ethernet+IPv4 specific members. */
unsigned char ar_sha [ ETH_ALEN ] ; /* sender hardware address */
unsigned char ar_sip [ 4 ] ; /* sender IP address */
unsigned char ar_tha [ ETH_ALEN ] ; /* target hardware address */
unsigned char ar_tip [ 4 ] ; /* target IP address */
} __packed ;
2013-10-29 17:22:21 -07:00
void ovs_flow_stats_update ( struct sw_flow * flow , struct sk_buff * skb ) ;
void ovs_flow_stats_get ( struct sw_flow * flow , struct ovs_flow_stats * stats ,
unsigned long * used , __be16 * tcp_flags ) ;
void ovs_flow_stats_clear ( struct sw_flow * flow ) ;
2011-10-25 19:26:31 -07:00
u64 ovs_flow_used_time ( unsigned long flow_jiffies ) ;
2013-10-03 18:16:47 -07:00
int ovs_flow_extract ( struct sk_buff * , u16 in_port , struct sw_flow_key * ) ;
2013-08-07 20:01:00 -07:00
2011-10-25 19:26:31 -07:00
# endif /* flow.h */