193 lines
13 KiB
C
193 lines
13 KiB
C
#ifndef _PACKET_TRACE_H
|
|
#define _PACKET_TRACE_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#include "utils.h"
|
|
#include "policy.h"
|
|
|
|
#include <marsio.h>
|
|
|
|
/*
|
|
* SCE packet trace info format
|
|
*
|
|
* PACKET_TRACE_ON_NEW : "Packet I/O new packet"
|
|
* PACKET_TRACE_ON_FREE : "Packet I/O free packet"
|
|
* PACKET_TRACE_ON_CTRL : "Session Synchronization ${MSG}"
|
|
*
|
|
* Service Function Path (SFP) https://datatracker.ietf.org/doc/html/rfc7665
|
|
*
|
|
* PACKET_TRACE_ON_POLICY : "Policy rule list=[${Rule_ID1}, ${Rule_ID2}, ...], SFP list=[${SF_ID1}, ${SF_ID2}, ...]"
|
|
* PACKET_TRACE_ON_CHAIN : "Forwarder sc rule id=${Rule_ID}, sf id=${SF_ID}, fwd type=${FWD_TYPE}, pkt dir=${PKT_DIR}, pkt type=${PKT_TYPE}, state=${STATE} ${ACTION}"
|
|
* Forwarder sc rule id=${Rule_ID}, sf id=${SF_ID}, type=${FWD_TYPE}, action=${ACTION}
|
|
*
|
|
* ${FWD_TYPE}
|
|
* steering
|
|
* mirroring
|
|
*
|
|
* ${PKT_DIR}
|
|
* I2E
|
|
* E2I
|
|
*
|
|
* ${PKT_TYPE}
|
|
* raw
|
|
* decrypted
|
|
*
|
|
* ${STATE}
|
|
* success
|
|
* failure
|
|
*
|
|
* ${ACTION}
|
|
* bypass
|
|
* block
|
|
* re-dispatch block
|
|
* re-dispatch bypass
|
|
* re-dispatch bypass(health SF limit)
|
|
*
|
|
* bypass(default)
|
|
* bypass(invalid policy)
|
|
*/
|
|
|
|
static inline int rule_id_tostring(struct uuid_array *array, char *buffer, int size)
|
|
{
|
|
char uuid_str[UUID_STRING_SIZE] = {0};
|
|
int used = 0;
|
|
int num = uuid_array_get_count(array);
|
|
used += snprintf(buffer + used, size - used, "[");
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
uuid_unparse(*uuid_array_get_at(array, i), uuid_str);
|
|
used += snprintf(buffer + used, size - used, "%s", uuid_str);
|
|
if (i < num - 1)
|
|
{
|
|
used += snprintf(buffer + used, size - used, ", ");
|
|
}
|
|
}
|
|
used += snprintf(buffer + used, size - used, "]");
|
|
return used;
|
|
}
|
|
|
|
static inline int sf_id_tostring(struct selected_chaining *chain, char *buffer, int size)
|
|
{
|
|
char uuid_str[UUID_STRING_SIZE] = {0};
|
|
int used = 0;
|
|
used += snprintf(buffer + used, size - used, "[");
|
|
for (int i = 0; i < chain->chaining_used; i++)
|
|
{
|
|
uuid_unparse(chain->chaining[i].sf_uuid, uuid_str);
|
|
used += snprintf(buffer + used, size - used, "%s", uuid_str);
|
|
if (i < chain->chaining_used - 1)
|
|
{
|
|
used += snprintf(buffer + used, size - used, ", ");
|
|
}
|
|
}
|
|
used += snprintf(buffer + used, size - used, "]");
|
|
return used;
|
|
}
|
|
|
|
#define PACKET_TRACE_ON_NEW(mr_ins, mr_buff) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE)) \
|
|
{ \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE, "Packet I/O", "new packet"); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define PACKET_TRACE_ON_FREE(mr_ins, mr_buff) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE)) \
|
|
{ \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE, "Packet I/O", "free packet"); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define PACKET_TRACE_ON_CTRL(mr_ins, mr_buff, state) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE)) \
|
|
{ \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE, "Session Synchronization", \
|
|
control_packte_state_to_string(state)); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define PACKET_TRACE_ON_POLICY(mr_ins, mr_buff, rule_uuid_array, chain) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE)) \
|
|
{ \
|
|
char rule_ids_str[1024] = {0}; \
|
|
char sf_ids_str[1024] = {0}; \
|
|
char buff[4096] = {0}; \
|
|
rule_id_tostring(rule_uuid_array, rule_ids_str, sizeof(rule_ids_str)); \
|
|
sf_id_tostring(chain, sf_ids_str, sizeof(sf_ids_str)); \
|
|
snprintf(buff, sizeof(buff), "sc rule list=%s, SFP list=%s", rule_ids_str, sf_ids_str); \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE, "Policy", buff); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define PACKET_TELEMETRY_ON_POLICY(mr_ins, mr_buff, rule_uuid_array, chain) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY)) \
|
|
{ \
|
|
char rule_ids_str[1024] = {0}; \
|
|
char sf_ids_str[1024] = {0}; \
|
|
char buff[4096] = {0}; \
|
|
rule_id_tostring(rule_uuid_array, rule_ids_str, sizeof(rule_ids_str)); \
|
|
sf_id_tostring(chain, sf_ids_str, sizeof(sf_ids_str)); \
|
|
snprintf(buff, sizeof(buff), "sc rule list=%s, SFP list=%s", rule_ids_str, sf_ids_str); \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY, "Policy", buff); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define PACKET_TRACE_ON_CHAIN(mr_ins, mr_buff, sf, meta) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE)) \
|
|
{ \
|
|
char buff[2048] = {0}; \
|
|
char rule_uuid_str[UUID_STRING_SIZE] = {0}; \
|
|
char sf_uuid_str[UUID_STRING_SIZE] = {0}; \
|
|
uuid_unparse((sf)->rule_uuid, rule_uuid_str); \
|
|
uuid_unparse((sf)->sf_uuid, sf_uuid_str); \
|
|
snprintf(buff, sizeof(buff), "sc rule id=%s, sf id=%s, fwd type=%s, pkt dir=%s, pkt type=%s, state=%s %s", \
|
|
rule_uuid_str, sf_uuid_str, \
|
|
forward_type_tostring((sf)->sff_forward_type), \
|
|
((meta)->direction ? "E2I" : "I2E"), \
|
|
((meta)->is_decrypted ? "decrypted" : "raw"), \
|
|
((sf)->sf_action == SESSION_ACTION_FORWARD ? "success" : "failure"), \
|
|
((sf)->sf_action == SESSION_ACTION_FORWARD ? "" : action_desc_tostring((sf)->sf_action_desc))); \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TRACE, "Forwarder", buff); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define PACKET_TELEMETRY_ON_CHAIN(mr_ins, mr_buff, sf, meta) \
|
|
do \
|
|
{ \
|
|
if (marsio_dp_trace_measurements_can_emit(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY)) \
|
|
{ \
|
|
char buff[2048] = {0}; \
|
|
char rule_uuid_str[UUID_STRING_SIZE] = {0}; \
|
|
char sf_uuid_str[UUID_STRING_SIZE] = {0}; \
|
|
uuid_unparse((sf)->rule_uuid, rule_uuid_str); \
|
|
uuid_unparse((sf)->sf_uuid, sf_uuid_str); \
|
|
snprintf(buff, sizeof(buff), "sc rule id=%s, sf id=%s, type=%s, action=%s", \
|
|
rule_uuid_str, sf_uuid_str, \
|
|
forward_type_tostring((sf)->sff_forward_type), \
|
|
action_desc_tostring((sf)->sf_action_desc)); \
|
|
marsio_dp_trace_measurement_emit_str(mr_ins, mr_buff, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY, "Forwarder", buff); \
|
|
} \
|
|
} while (0)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|