@ -89,9 +89,10 @@ typedef struct FlowHashKey4_ {
uint16_t ports [ 2 ] ;
uint16_t proto ; /**< u16 so proto and recur add up to u32 */
uint16_t recur ; /**< u16 so proto and recur add up to u32 */
uint16_t vlan_id [ 2 ] ;
uint16_t vlan_id [ VLAN_MAX_LAYERS ] ;
uint16_t pad [ 1 ] ;
} ;
const uint32_t u32 [ 5 ] ;
const uint32_t u32 [ 6 ] ;
} ;
} FlowHashKey4 ;
@ -102,9 +103,10 @@ typedef struct FlowHashKey6_ {
uint16_t ports [ 2 ] ;
uint16_t proto ; /**< u16 so proto and recur add up to u32 */
uint16_t recur ; /**< u16 so proto and recur add up to u32 */
uint16_t vlan_id [ 2 ] ;
uint16_t vlan_id [ VLAN_MAX_LAYERS ] ;
uint16_t pad [ 1 ] ;
} ;
const uint32_t u32 [ 1 1 ] ;
const uint32_t u32 [ 1 2 ] ;
} ;
} FlowHashKey6 ;
@ -112,7 +114,9 @@ uint32_t FlowGetIpPairProtoHash(const Packet *p)
{
uint32_t hash = 0 ;
if ( p - > ip4h ! = NULL ) {
FlowHashKey4 fhk ;
FlowHashKey4 fhk = {
. pad [ 0 ] = 0 ,
} ;
int ai = ( p - > src . addr_data32 [ 0 ] > p - > dst . addr_data32 [ 0 ] ) ;
fhk . addrs [ 1 - ai ] = p - > src . addr_data32 [ 0 ] ;
@ -127,10 +131,13 @@ uint32_t FlowGetIpPairProtoHash(const Packet *p)
* is disabled . */
fhk . vlan_id [ 0 ] = p - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = p - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = p - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 5 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
} else if ( p - > ip6h ! = NULL ) {
FlowHashKey6 fhk ;
FlowHashKey6 fhk = {
. pad [ 0 ] = 0 ,
} ;
if ( FlowHashRawAddressIPv6GtU32 ( p - > src . addr_data32 , p - > dst . addr_data32 ) ) {
fhk . src [ 0 ] = p - > src . addr_data32 [ 0 ] ;
fhk . src [ 1 ] = p - > src . addr_data32 [ 1 ] ;
@ -157,8 +164,9 @@ uint32_t FlowGetIpPairProtoHash(const Packet *p)
fhk . recur = ( uint16_t ) p - > recursion_level ;
fhk . vlan_id [ 0 ] = p - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = p - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = p - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 11 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
}
return hash ;
}
@ -182,7 +190,7 @@ static inline uint32_t FlowGetHash(const Packet *p)
if ( p - > ip4h ! = NULL ) {
if ( p - > tcph ! = NULL | | p - > udph ! = NULL ) {
FlowHashKey4 fhk ;
FlowHashKey4 fhk = { . pad [ 0 ] = 0 } ;
int ai = ( p - > src . addr_data32 [ 0 ] > p - > dst . addr_data32 [ 0 ] ) ;
fhk . addrs [ 1 - ai ] = p - > src . addr_data32 [ 0 ] ;
@ -198,13 +206,14 @@ static inline uint32_t FlowGetHash(const Packet *p)
* is disabled . */
fhk . vlan_id [ 0 ] = p - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = p - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = p - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 5 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
} else if ( ICMPV4_DEST_UNREACH_IS_VALID ( p ) ) {
uint32_t psrc = IPV4_GET_RAW_IPSRC_U32 ( ICMPV4_GET_EMB_IPV4 ( p ) ) ;
uint32_t pdst = IPV4_GET_RAW_IPDST_U32 ( ICMPV4_GET_EMB_IPV4 ( p ) ) ;
FlowHashKey4 fhk ;
FlowHashKey4 fhk = { . pad [ 0 ] = 0 } ;
const int ai = ( psrc > pdst ) ;
fhk . addrs [ 1 - ai ] = psrc ;
@ -218,11 +227,12 @@ static inline uint32_t FlowGetHash(const Packet *p)
fhk . recur = ( uint16_t ) p - > recursion_level ;
fhk . vlan_id [ 0 ] = p - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = p - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = p - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 5 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
} else {
FlowHashKey4 fhk ;
FlowHashKey4 fhk = { . pad [ 0 ] = 0 } ;
const int ai = ( p - > src . addr_data32 [ 0 ] > p - > dst . addr_data32 [ 0 ] ) ;
fhk . addrs [ 1 - ai ] = p - > src . addr_data32 [ 0 ] ;
fhk . addrs [ ai ] = p - > dst . addr_data32 [ 0 ] ;
@ -232,11 +242,12 @@ static inline uint32_t FlowGetHash(const Packet *p)
fhk . recur = ( uint16_t ) p - > recursion_level ;
fhk . vlan_id [ 0 ] = p - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = p - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = p - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 5 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
}
} else if ( p - > ip6h ! = NULL ) {
FlowHashKey6 fhk ;
FlowHashKey6 fhk = { . pad [ 0 ] = 0 } ;
if ( FlowHashRawAddressIPv6GtU32 ( p - > src . addr_data32 , p - > dst . addr_data32 ) ) {
fhk . src [ 0 ] = p - > src . addr_data32 [ 0 ] ;
fhk . src [ 1 ] = p - > src . addr_data32 [ 1 ] ;
@ -264,8 +275,9 @@ static inline uint32_t FlowGetHash(const Packet *p)
fhk . recur = ( uint16_t ) p - > recursion_level ;
fhk . vlan_id [ 0 ] = p - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = p - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = p - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 11 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
}
return hash ;
@ -284,7 +296,9 @@ uint32_t FlowKeyGetHash(FlowKey *fk)
uint32_t hash = 0 ;
if ( fk - > src . family = = AF_INET ) {
FlowHashKey4 fhk ;
FlowHashKey4 fhk = {
. pad [ 0 ] = 0 ,
} ;
int ai = ( fk - > src . address . address_un_data32 [ 0 ] > fk - > dst . address . address_un_data32 [ 0 ] ) ;
fhk . addrs [ 1 - ai ] = fk - > src . address . address_un_data32 [ 0 ] ;
fhk . addrs [ ai ] = fk - > dst . address . address_un_data32 [ 0 ] ;
@ -297,10 +311,13 @@ uint32_t FlowKeyGetHash(FlowKey *fk)
fhk . recur = ( uint16_t ) fk - > recursion_level ;
fhk . vlan_id [ 0 ] = fk - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = fk - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = fk - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 5 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
} else {
FlowHashKey6 fhk ;
FlowHashKey6 fhk = {
. pad [ 0 ] = 0 ,
} ;
if ( FlowHashRawAddressIPv6GtU32 ( fk - > src . address . address_un_data32 ,
fk - > dst . address . address_un_data32 ) ) {
fhk . src [ 0 ] = fk - > src . address . address_un_data32 [ 0 ] ;
@ -329,8 +346,9 @@ uint32_t FlowKeyGetHash(FlowKey *fk)
fhk . recur = ( uint16_t ) fk - > recursion_level ;
fhk . vlan_id [ 0 ] = fk - > vlan_id [ 0 ] & g_vlan_mask ;
fhk . vlan_id [ 1 ] = fk - > vlan_id [ 1 ] & g_vlan_mask ;
fhk . vlan_id [ 2 ] = fk - > vlan_id [ 2 ] & g_vlan_mask ;
hash = hashword ( fhk . u32 , 11 , flow_config . hash_rand ) ;
hash = hashword ( fhk . u32 , ARRAY_SIZE ( fhk . u32 ) , flow_config . hash_rand ) ;
}
return hash ;
}
@ -355,10 +373,12 @@ static inline bool CmpAddrsAndPorts(const uint32_t src1[4],
src_port1 = = dst_port2 & & dst_port1 = = src_port2 ) ;
}
static inline bool CmpVlanIds ( const uint16_t vlan_id1 [ 2 ] , const uint16_t vlan_id2 [ 2 ] )
static inline bool CmpVlanIds (
const uint16_t vlan_id1 [ VLAN_MAX_LAYERS ] , const uint16_t vlan_id2 [ VLAN_MAX_LAYERS ] )
{
return ( ( vlan_id1 [ 0 ] ^ vlan_id2 [ 0 ] ) & g_vlan_mask ) = = 0 & &
( ( vlan_id1 [ 1 ] ^ vlan_id2 [ 1 ] ) & g_vlan_mask ) = = 0 ;
( ( vlan_id1 [ 1 ] ^ vlan_id2 [ 1 ] ) & g_vlan_mask ) = = 0 & &
( ( vlan_id1 [ 2 ] ^ vlan_id2 [ 2 ] ) & g_vlan_mask ) = = 0 ;
}
/* Since two or more flows can have the same hash key, we need to compare
@ -993,8 +1013,8 @@ Flow *FlowGetFromFlowKey(FlowKey *key, struct timespec *ttime, const uint32_t ha
return NULL ;
}
f - > proto = key - > proto ;
f - > vlan_id [ 0 ] = key - > vlan_id [ 0 ] ;
f - > vlan_id [ 1 ] = key - > vlan_id [ 1 ] ;
memcpy ( & f - > vlan_id [ 0 ] , & key - > vlan_id [ 0 ] , sizeof ( f - > vlan_id ) ) ;
;
f - > src . addr_data32 [ 0 ] = key - > src . addr_data32 [ 0 ] ;
f - > src . addr_data32 [ 1 ] = key - > src . addr_data32 [ 1 ] ;
f - > src . addr_data32 [ 2 ] = key - > src . addr_data32 [ 2 ] ;