#include "tuple.h" #include "uthash.h" #include "packet_ldbc.h" #include "packet_utils.h" uint64_t packet_ldbc_hash(const struct packet *pkt, enum load_balance ldbc, enum packet_direction direction) { uint64_t temp = 0; uint64_t hash_value = 1; int inner_addr_len = 0; int outer_addr_len = 0; const char *inner_src_addr = NULL; const char *inner_dst_addr = NULL; const char *outer_src_addr = NULL; const char *outer_dst_addr = NULL; struct tuple2 inner_addr; struct tuple2 outer_addr; if (pkt == NULL) { return hash_value; } if (packet_get_innermost_tuple2(pkt, &inner_addr) == -1) { return hash_value; } if (packet_get_outermost_tuple2(pkt, &outer_addr) == -1) { return hash_value; } if (inner_addr.ip_type == IP_TYPE_V4) { inner_src_addr = (const char *)&inner_addr.src_addr.v4; inner_dst_addr = (const char *)&inner_addr.dst_addr.v4; inner_addr_len = sizeof(struct in_addr); } else { inner_src_addr = (const char *)&inner_addr.src_addr.v6; inner_dst_addr = (const char *)&inner_addr.dst_addr.v6; inner_addr_len = sizeof(struct in6_addr); } if (outer_addr.ip_type == IP_TYPE_V4) { outer_src_addr = (const char *)&outer_addr.src_addr.v4; outer_dst_addr = (const char *)&outer_addr.dst_addr.v4; outer_addr_len = sizeof(struct in_addr); } else { outer_src_addr = (const char *)&outer_addr.src_addr.v6; outer_dst_addr = (const char *)&outer_addr.dst_addr.v6; outer_addr_len = sizeof(struct in6_addr); } switch (ldbc) { case LDBC_HASH_OUTERMOST_INT_IP: if (direction == PACKET_DIRECTION_INCOMING) { // direction 1: E2I HASH_VALUE(outer_dst_addr, outer_addr_len, hash_value); } else { // direction 0: I2E HASH_VALUE(outer_src_addr, outer_addr_len, hash_value); } break; case LDBC_HASH_OUTERMOST_EXT_IP: if (direction == PACKET_DIRECTION_INCOMING) { // direction 1: E2I HASH_VALUE(outer_src_addr, outer_addr_len, hash_value); } else { // direction 0: I2E HASH_VALUE(outer_dst_addr, outer_addr_len, hash_value); } break; case LDBC_HASH_OUTERMOST_INT_EXT_IP: HASH_VALUE(outer_src_addr, outer_addr_len, hash_value); HASH_VALUE(outer_dst_addr, outer_addr_len, temp); hash_value = hash_value ^ temp; break; case LDBC_HASH_INNERMOST_INT_IP: if (direction == PACKET_DIRECTION_INCOMING) { // direction 1: E2I HASH_VALUE(inner_dst_addr, inner_addr_len, hash_value); } else { // direction 0: I2E HASH_VALUE(inner_src_addr, inner_addr_len, hash_value); } break; case LDBC_HASH_INNERMOST_EXT_IP: if (direction == PACKET_DIRECTION_INCOMING) { // direction 1: E2I HASH_VALUE(inner_src_addr, inner_addr_len, hash_value); } else { // direction 0: I2E HASH_VALUE(inner_dst_addr, inner_addr_len, hash_value); } break; default: return hash_value; } return hash_value; }