2015-05-12 14:56:07 +02:00
# ifndef _NET_FLOW_DISSECTOR_H
# define _NET_FLOW_DISSECTOR_H
2011-11-28 05:22:18 +00:00
2015-05-12 14:56:17 +02:00
# include <linux/types.h>
2015-05-12 14:56:18 +02:00
# include <linux/in6.h>
2015-05-12 14:56:19 +02:00
# include <uapi/linux/if_ether.h>
2015-05-12 14:56:17 +02:00
2015-06-04 09:16:39 -07:00
/**
* struct flow_dissector_key_control :
* @ thoff : Transport header offset
*/
struct flow_dissector_key_control {
u16 thoff ;
2015-06-04 09:16:40 -07:00
u16 addr_type ;
2015-09-01 16:46:08 -07:00
u32 flags ;
2015-06-04 09:16:39 -07:00
} ;
2015-09-01 16:46:08 -07:00
# define FLOW_DIS_IS_FRAGMENT BIT(0)
# define FLOW_DIS_FIRST_FRAG BIT(1)
# define FLOW_DIS_ENCAPSULATION BIT(2)
2015-05-12 14:56:15 +02:00
/**
* struct flow_dissector_key_basic :
* @ thoff : Transport header offset
* @ n_proto : Network header protocol ( eg . IPv4 / IPv6 )
* @ ip_proto : Transport header protocol ( eg . TCP / UDP )
*/
struct flow_dissector_key_basic {
__be16 n_proto ;
u8 ip_proto ;
2015-06-04 09:16:39 -07:00
u8 padding ;
2015-05-12 14:56:15 +02:00
} ;
2015-06-04 09:16:43 -07:00
struct flow_dissector_key_tags {
2016-08-17 13:36:11 +03:00
u32 flow_label ;
} ;
struct flow_dissector_key_vlan {
u16 vlan_id : 12 ,
vlan_priority : 3 ;
u16 padding ;
2015-06-04 09:16:43 -07:00
} ;
2015-06-04 09:16:45 -07:00
struct flow_dissector_key_keyid {
__be32 keyid ;
} ;
2015-05-12 14:56:15 +02:00
/**
2015-06-04 09:16:40 -07:00
* struct flow_dissector_key_ipv4_addrs :
* @ src : source ip address
* @ dst : destination ip address
2015-05-12 14:56:15 +02:00
*/
2015-06-04 09:16:40 -07:00
struct flow_dissector_key_ipv4_addrs {
2015-05-12 14:56:15 +02:00
/* (src,dst) must be grouped, in the same way than in IP header */
__be32 src ;
__be32 dst ;
} ;
2015-06-04 09:16:40 -07:00
/**
* struct flow_dissector_key_ipv6_addrs :
* @ src : source ip address
* @ dst : destination ip address
*/
struct flow_dissector_key_ipv6_addrs {
/* (src,dst) must be grouped, in the same way than in IP header */
struct in6_addr src ;
struct in6_addr dst ;
} ;
2015-06-04 09:16:41 -07:00
/**
* struct flow_dissector_key_tipc_addrs :
* @ srcnode : source node address
*/
struct flow_dissector_key_tipc_addrs {
__be32 srcnode ;
} ;
2015-06-04 09:16:40 -07:00
/**
* struct flow_dissector_key_addrs :
* @ v4addrs : IPv4 addresses
* @ v6addrs : IPv6 addresses
*/
struct flow_dissector_key_addrs {
union {
struct flow_dissector_key_ipv4_addrs v4addrs ;
struct flow_dissector_key_ipv6_addrs v6addrs ;
2015-06-04 09:16:41 -07:00
struct flow_dissector_key_tipc_addrs tipcaddrs ;
2015-06-04 09:16:40 -07:00
} ;
} ;
2017-01-11 14:05:42 +01:00
/**
* flow_dissector_key_arp :
* @ ports : Operation , source and target addresses for an ARP header
* for Ethernet hardware addresses and IPv4 protocol addresses
* sip : Sender IP address
* tip : Target IP address
* op : Operation
* sha : Sender hardware address
* tpa : Target hardware address
*/
struct flow_dissector_key_arp {
__u32 sip ;
__u32 tip ;
__u8 op ;
unsigned char sha [ ETH_ALEN ] ;
unsigned char tha [ ETH_ALEN ] ;
} ;
2015-05-12 14:56:15 +02:00
/**
* flow_dissector_key_tp_ports :
* @ ports : port numbers of Transport header
2015-05-12 14:56:20 +02:00
* src : source port number
* dst : destination port number
2015-05-12 14:56:15 +02:00
*/
struct flow_dissector_key_ports {
union {
__be32 ports ;
2015-05-12 14:56:20 +02:00
struct {
__be16 src ;
__be16 dst ;
} ;
2015-05-12 14:56:15 +02:00
} ;
} ;
2016-12-07 13:48:27 +01:00
/**
* flow_dissector_key_icmp :
* @ ports : type and code of ICMP header
* icmp : ICMP type ( high ) and code ( low )
* type : ICMP type
* code : ICMP code
*/
struct flow_dissector_key_icmp {
union {
__be16 icmp ;
struct {
u8 type ;
u8 code ;
} ;
} ;
} ;
2015-05-12 14:56:18 +02:00
2015-05-12 14:56:19 +02:00
/**
* struct flow_dissector_key_eth_addrs :
* @ src : source Ethernet address
* @ dst : destination Ethernet address
*/
struct flow_dissector_key_eth_addrs {
/* (dst,src) must be grouped, in the same way than in ETH header */
unsigned char dst [ ETH_ALEN ] ;
unsigned char src [ ETH_ALEN ] ;
} ;
2015-05-12 14:56:15 +02:00
enum flow_dissector_key_id {
2015-06-04 09:16:39 -07:00
FLOW_DISSECTOR_KEY_CONTROL , /* struct flow_dissector_key_control */
2015-05-12 14:56:15 +02:00
FLOW_DISSECTOR_KEY_BASIC , /* struct flow_dissector_key_basic */
2015-06-04 09:16:40 -07:00
FLOW_DISSECTOR_KEY_IPV4_ADDRS , /* struct flow_dissector_key_ipv4_addrs */
FLOW_DISSECTOR_KEY_IPV6_ADDRS , /* struct flow_dissector_key_ipv6_addrs */
2015-05-12 14:56:15 +02:00
FLOW_DISSECTOR_KEY_PORTS , /* struct flow_dissector_key_ports */
2016-12-07 13:48:27 +01:00
FLOW_DISSECTOR_KEY_ICMP , /* struct flow_dissector_key_icmp */
2015-05-12 14:56:19 +02:00
FLOW_DISSECTOR_KEY_ETH_ADDRS , /* struct flow_dissector_key_eth_addrs */
2015-06-04 09:16:41 -07:00
FLOW_DISSECTOR_KEY_TIPC_ADDRS , /* struct flow_dissector_key_tipc_addrs */
2017-01-11 14:05:42 +01:00
FLOW_DISSECTOR_KEY_ARP , /* struct flow_dissector_key_arp */
2016-08-17 13:36:11 +03:00
FLOW_DISSECTOR_KEY_VLAN , /* struct flow_dissector_key_flow_vlan */
2015-06-04 09:16:44 -07:00
FLOW_DISSECTOR_KEY_FLOW_LABEL , /* struct flow_dissector_key_flow_tags */
2015-06-04 09:16:45 -07:00
FLOW_DISSECTOR_KEY_GRE_KEYID , /* struct flow_dissector_key_keyid */
2015-06-04 09:16:46 -07:00
FLOW_DISSECTOR_KEY_MPLS_ENTROPY , /* struct flow_dissector_key_keyid */
2016-11-07 15:14:37 +02:00
FLOW_DISSECTOR_KEY_ENC_KEYID , /* struct flow_dissector_key_keyid */
FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS , /* struct flow_dissector_key_ipv4_addrs */
FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS , /* struct flow_dissector_key_ipv6_addrs */
FLOW_DISSECTOR_KEY_ENC_CONTROL , /* struct flow_dissector_key_control */
2016-11-07 15:14:39 +02:00
FLOW_DISSECTOR_KEY_ENC_PORTS , /* struct flow_dissector_key_ports */
2015-05-12 14:56:15 +02:00
FLOW_DISSECTOR_KEY_MAX ,
} ;
2015-09-01 09:24:28 -07:00
# define FLOW_DISSECTOR_F_PARSE_1ST_FRAG BIT(0)
2015-09-01 09:24:30 -07:00
# define FLOW_DISSECTOR_F_STOP_AT_L3 BIT(1)
2015-09-01 09:24:31 -07:00
# define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(2)
2015-09-01 09:24:32 -07:00
# define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(3)
2015-09-01 09:24:28 -07:00
2015-05-12 14:56:15 +02:00
struct flow_dissector_key {
enum flow_dissector_key_id key_id ;
size_t offset ; /* offset of struct flow_dissector_key_*
in target the struct */
} ;
struct flow_dissector {
unsigned int used_keys ; /* each bit repesents presence of one key id */
unsigned short int offset [ FLOW_DISSECTOR_KEY_MAX ] ;
} ;
2015-05-12 14:56:16 +02:00
struct flow_keys {
2015-06-04 09:16:39 -07:00
struct flow_dissector_key_control control ;
# define FLOW_KEYS_HASH_START_FIELD basic
2015-05-12 14:56:16 +02:00
struct flow_dissector_key_basic basic ;
2015-06-04 09:16:43 -07:00
struct flow_dissector_key_tags tags ;
2016-08-17 13:36:11 +03:00
struct flow_dissector_key_vlan vlan ;
2015-06-04 09:16:45 -07:00
struct flow_dissector_key_keyid keyid ;
2015-06-04 09:16:39 -07:00
struct flow_dissector_key_ports ports ;
struct flow_dissector_key_addrs addrs ;
2015-05-12 14:56:16 +02:00
} ;
2015-06-04 09:16:39 -07:00
# define FLOW_KEYS_HASH_OFFSET \
offsetof ( struct flow_keys , FLOW_KEYS_HASH_START_FIELD )
2015-06-04 09:16:40 -07:00
__be32 flow_get_u32_src ( const struct flow_keys * flow ) ;
__be32 flow_get_u32_dst ( const struct flow_keys * flow ) ;
2015-05-12 14:56:16 +02:00
extern struct flow_dissector flow_keys_dissector ;
extern struct flow_dissector flow_keys_buf_dissector ;
2015-05-01 11:30:17 -07:00
/* struct flow_keys_digest:
*
* This structure is used to hold a digest of the full flow keys . This is a
* larger " hash " of a flow to allow definitively matching specific flows where
* the 32 bit skb - > hash is not large enough . The size is limited to 16 bytes so
* that it can by used in CB of skb ( see sch_choke for an example ) .
*/
# define FLOW_KEYS_DIGEST_LEN 16
struct flow_keys_digest {
u8 data [ FLOW_KEYS_DIGEST_LEN ] ;
} ;
void make_flow_keys_digest ( struct flow_keys_digest * digest ,
const struct flow_keys * flow ) ;
2016-08-31 11:16:22 +08:00
static inline bool flow_keys_have_l4 ( const struct flow_keys * keys )
2015-09-01 09:24:24 -07:00
{
return ( keys - > ports . ports | | keys - > tags . flow_label ) ;
}
2015-09-01 09:24:25 -07:00
u32 flow_hash_from_keys ( struct flow_keys * keys ) ;
2016-03-08 12:42:30 +02:00
static inline bool dissector_uses_key ( const struct flow_dissector * flow_dissector ,
enum flow_dissector_key_id key_id )
{
return flow_dissector - > used_keys & ( 1 < < key_id ) ;
}
static inline void * skb_flow_dissector_target ( struct flow_dissector * flow_dissector ,
enum flow_dissector_key_id key_id ,
void * target_container )
{
return ( ( char * ) target_container ) + flow_dissector - > offset [ key_id ] ;
}
2011-11-28 05:22:18 +00:00
# endif