#pragma once #ifdef __cplusplus extern "C" { #endif #include "stellar/tunnel.h" #include "stellar/layer.h" #include "stellar/packet.h" #define PACKET_MAX_LAYERS 32 #define MAX_ROUTE_CTX 64 struct route_ctx { char data[MAX_ROUTE_CTX]; int used; }; struct metadata { struct route_ctx route_ctx; struct sids sids; uint64_t session_id; uint64_t domain; uint16_t link_id; int is_ctrl; enum packet_direction direction; enum packet_action action; const void *origin_ctx; }; struct raw_layer { enum layer_proto proto; const char *hdr_ptr; // header pointer const char *pld_ptr; // payload pointer uint16_t hdr_offset; // header offset from data_ptr uint16_t hdr_len; // header length uint16_t pld_len; // payload length }; struct packet { void *user_data; struct raw_layer layers[PACKET_MAX_LAYERS]; struct raw_layer *frag_layer; // fragment layer int8_t layers_used; int8_t layers_size; int8_t need_free; const char *data_ptr; uint16_t data_len; uint16_t trim_len; // trim eth padding struct metadata meta; }; enum packet_load_balance_method { PKT_LDBC_METH_OUTERMOST_INT_IP = 1, PKT_LDBC_METH_OUTERMOST_EXT_IP = 2, PKT_LDBC_METH_OUTERMOST_INT_EXT_IP = 3, PKT_LDBC_METH_INNERMOST_INT_IP = 4, PKT_LDBC_METH_INNERMOST_EXT_IP = 5, }; /****************************************************************************** * metadata utils ******************************************************************************/ void packet_set_route_ctx(struct packet *pkt, const struct route_ctx *ctx); const struct route_ctx *packet_get_route_ctx(const struct packet *pkt); void packet_set_origin_ctx(struct packet *pkt, void *ctx); const void *packet_get_origin_ctx(const struct packet *pkt); void packet_set_sids(struct packet *pkt, const struct sids *sids); const struct sids *packet_get_sids(const struct packet *pkt); void packet_set_session_id(struct packet *pkt, uint64_t id); uint64_t packet_get_session_id(const struct packet *pkt); void packet_set_domain(struct packet *pkt, uint64_t domain); uint64_t packet_get_domain(const struct packet *pkt); void packet_set_link_id(struct packet *pkt, uint16_t id); uint16_t packet_get_link_id(const struct packet *pkt); void packet_set_ctrl(struct packet *pkt, uint8_t ctrl); uint8_t packet_is_ctrl(const struct packet *pkt); void packet_set_direction(struct packet *pkt, enum packet_direction dir); void *packet_get_user_data(struct packet *pkt); void packet_set_user_data(struct packet *pkt, void *data); /****************************************************************************** * tuple uitls ******************************************************************************/ // return 0: found // return -1: not found int packet_get_innermost_tuple2(const struct packet *pkt, struct tuple2 *tuple); int packet_get_outermost_tuple2(const struct packet *pkt, struct tuple2 *tuple); // return 0: found // return -1: not found int packet_get_innermost_tuple4(const struct packet *pkt, struct tuple4 *tuple); int packet_get_outermost_tuple4(const struct packet *pkt, struct tuple4 *tuple); // return 0: found // return -1: not found int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple); int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple); /****************************************************************************** * layer uitls ******************************************************************************/ const struct raw_layer *packet_get_raw_layer(const struct packet *pkt, int idx); const struct raw_layer *packet_get_innermost_raw_layer(const struct packet *pkt, enum layer_proto proto); const struct raw_layer *packet_get_outermost_raw_layer(const struct packet *pkt, enum layer_proto proto); /****************************************************************************** * load balance uitls ******************************************************************************/ uint64_t packet_ldbc_hash(const struct packet *pkt, enum packet_load_balance_method method, enum packet_direction direction); /****************************************************************************** * other uitls ******************************************************************************/ struct packet *packet_new(uint16_t pkt_len); struct packet *packet_dup(const struct packet *pkt); void packet_free(struct packet *pkt); int packet_is_fragment(const struct packet *pkt); void layer_convert(const struct raw_layer *in, struct layer *out); #ifdef __cplusplus } #endif