#include #include "packet_priv.h" #include "packet_utils.h" /****************************************************************************** * metadata utils ******************************************************************************/ void packet_set_route_ctx(struct packet *pkt, const struct route_ctx *ctx) { pkt->meta.route_ctx = *ctx; } const struct route_ctx *packet_get_route_ctx(const struct packet *pkt) { return &pkt->meta.route_ctx; } void packet_set_sids(struct packet *pkt, const struct sids *sids) { pkt->meta.sids = *sids; } const struct sids *packet_get_sids(const struct packet *pkt) { return &pkt->meta.sids; } void packet_prepend_sids(struct packet *pkt, const struct sids *sids) { if (pkt->meta.sids.used + sids->used > MAX_SIDS) { PACKET_LOG_ERROR("sids overflow"); return; } else { for (int i = pkt->meta.sids.used - 1; i >= 0; i--) { pkt->meta.sids.sid[i + sids->used] = pkt->meta.sids.sid[i]; } for (int i = 0; i < sids->used; i++) { pkt->meta.sids.sid[i] = sids->sid[i]; } pkt->meta.sids.used += sids->used; } } void packet_set_session_id(struct packet *pkt, uint64_t id) { pkt->meta.session_id = id; } uint64_t packet_get_session_id(const struct packet *pkt) { return pkt->meta.session_id; } void packet_set_domain_id(struct packet *pkt, uint64_t id) { pkt->meta.domain_id = id; } uint64_t packet_get_domain_id(const struct packet *pkt) { return pkt->meta.domain_id; } void packet_set_link_id(struct packet *pkt, uint16_t id) { pkt->meta.link_id = id; } uint16_t packet_get_link_id(const struct packet *pkt) { return pkt->meta.link_id; } void packet_set_ctrl(struct packet *pkt, uint8_t ctrl) { pkt->meta.is_ctrl = ctrl; } uint8_t packet_is_ctrl(const struct packet *pkt) { return pkt->meta.is_ctrl; } void packet_set_direction(struct packet *pkt, enum packet_direction dir) { pkt->meta.direction = dir; } enum packet_direction packet_get_direction(const struct packet *pkt) { return pkt->meta.direction; } void packet_set_action(struct packet *pkt, enum packet_action action) { pkt->meta.action = action; } enum packet_action packet_get_action(const struct packet *pkt) { return pkt->meta.action; } void packet_set_origin_ctx(struct packet *pkt, void *ctx) { pkt->meta.origin_ctx = ctx; } const void *packet_get_origin_ctx(const struct packet *pkt) { return pkt->meta.origin_ctx; } /****************************************************************************** * other uitls ******************************************************************************/ int packet_is_fragment(const struct packet *pkt) { return (pkt->frag_layer) ? 1 : 0; } struct packet *packet_new(uint16_t pkt_len) { struct packet *pkt = (struct packet *)calloc(1, sizeof(struct packet) + pkt_len); if (pkt == NULL) { return NULL; } pkt->data_len = pkt_len; pkt->data_ptr = (const char *)pkt + sizeof(struct packet); pkt->need_free = 1; return pkt; } struct packet *packet_dup(const struct packet *pkt) { if (pkt == NULL) { return NULL; } struct packet *dup_pkt = packet_new(pkt->data_len); if (dup_pkt == NULL) { return NULL; } dup_pkt->layers_used = pkt->layers_used; dup_pkt->layers_size = pkt->layers_size; memcpy((char *)dup_pkt->data_ptr, pkt->data_ptr, pkt->data_len); dup_pkt->data_len = pkt->data_len; packet_set_action(dup_pkt, PACKET_ACTION_DROP); for (int8_t i = 0; i < pkt->layers_used; i++) { dup_pkt->layers[i].proto = pkt->layers[i].proto; dup_pkt->layers[i].hdr_ptr = dup_pkt->data_ptr + pkt->layers[i].hdr_offset; dup_pkt->layers[i].pld_ptr = dup_pkt->data_ptr + pkt->layers[i].hdr_offset + pkt->layers[i].hdr_len; dup_pkt->layers[i].hdr_offset = pkt->layers[i].hdr_offset; dup_pkt->layers[i].hdr_len = pkt->layers[i].hdr_len; dup_pkt->layers[i].pld_len = pkt->layers[i].pld_len; } // update frag_layer if (pkt->frag_layer) { dup_pkt->frag_layer = &dup_pkt->layers[pkt->frag_layer - pkt->layers]; } return dup_pkt; } void packet_free(struct packet *pkt) { if (pkt && pkt->need_free) { free((void *)pkt); } }