summaryrefslogtreecommitdiff
path: root/common/src/tfe_raw_packet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/tfe_raw_packet.cpp')
-rw-r--r--common/src/tfe_raw_packet.cpp64
1 files changed, 61 insertions, 3 deletions
diff --git a/common/src/tfe_raw_packet.cpp b/common/src/tfe_raw_packet.cpp
index 9efada2..07c0932 100644
--- a/common/src/tfe_raw_packet.cpp
+++ b/common/src/tfe_raw_packet.cpp
@@ -168,7 +168,7 @@ int raw_packet_parser_get_most_inner_tuple4(struct raw_pkt_parser *handler, stru
// return 0 : success
// return -1 : error
-int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, struct addr_tuple4 *addr, void *logger)
+int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, struct addr_tuple4 *addr, void *logger)
{
const char *l3_layer_data = NULL;
const char *l4_layer_data = NULL;
@@ -271,6 +271,64 @@ int raw_packet_parser_get_most_outer_address(struct raw_pkt_parser *handler, str
return -1;
}
+uint16_t raw_packet_parser_get_most_inner_ipid(struct raw_pkt_parser *handler)
+{
+ const char *l3_layer_data = NULL;
+ struct layer_results *results = &handler->results;
+
+ // search L3 layer in reverse order
+ for (int8_t i = results->layers_used - 1; i >= 0; i--)
+ {
+ const struct layer_result *layer = &results->layers[i];
+ enum layer_type type = layer->type;
+
+ if (type & LAYER_TYPE_L3)
+ {
+ l3_layer_data = (const char *)handler->ptr_pkt_start + layer->offset;
+ if (type == LAYER_TYPE_IPV4)
+ {
+ const struct ip *ipv4_hdr = (const struct ip *)l3_layer_data;
+ return ntohs(ipv4_hdr->ip_id);
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 0;
+}
+
+uint16_t raw_packet_parser_get_most_outer_ipid(struct raw_pkt_parser *handler)
+{
+ const char *l3_layer_data = NULL;
+ struct layer_results *results = &handler->results;
+
+ // search L3 layer in order
+ for (int8_t i = 0; i <= results->layers_used - 1; i++)
+ {
+ const struct layer_result *layer = &results->layers[i];
+ enum layer_type type = layer->type;
+
+ if (type & LAYER_TYPE_L3)
+ {
+ l3_layer_data = (const char *)handler->ptr_pkt_start + layer->offset;
+ if (type == LAYER_TYPE_IPV4)
+ {
+ const struct ip *ipv4_hdr = (const struct ip *)l3_layer_data;
+ return ntohs(ipv4_hdr->ip_id);
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
uint64_t raw_packet_parser_get_hash_value(struct raw_pkt_parser *handler, enum ldbc_method method, int dir_is_internal, void *logger)
{
uint64_t temp = 0;
@@ -392,7 +450,7 @@ uint64_t raw_packet_parser_get_hash_value(struct raw_pkt_parser *handler, enum l
char *inner_addr_str = addr_tuple4_to_str(&inner_addr);
char *outer_addr_str = addr_tuple4_to_str(&outer_addr);
TFE_LOG_DEBUG(logger, "%s: pkt_trace_id: %lu, outer_addr: %s, inner_addr: %s, is_internal: %d, hash_method: %s, hash_value: %lu",
- LOG_TAG_RAWPKT, handler->pkt_trace_id, outer_addr_str, inner_addr_str, dir_is_internal, ldbc_method_to_string(method), hash_value);
+ LOG_TAG_RAWPKT, handler->pkt_trace_id, outer_addr_str, inner_addr_str, dir_is_internal, ldbc_method_to_string(method), hash_value);
free(inner_addr_str);
free(outer_addr_str);
@@ -889,7 +947,7 @@ static const void *parse_vxlan(struct raw_pkt_parser *handler, const void *data,
return data;
}
- //struct vxlan_hdr *vxlan_hdr = (struct vxlan_hdr *)data;
+ // struct vxlan_hdr *vxlan_hdr = (struct vxlan_hdr *)data;
uint16_t hdr_len = sizeof(struct vxlan_hdr);
const void *data_next_layer = (const char *)data + hdr_len;
size_t data_next_length = length - hdr_len;