This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
stellar-stellar/src/packet/packet_utils.cpp

201 lines
4.5 KiB
C++
Raw Normal View History

2024-04-11 19:44:02 +08:00
#include <stdlib.h>
#include "packet_priv.h"
#include "packet_utils.h"
2024-04-11 19:44:02 +08:00
/******************************************************************************
* metadata utils
2024-04-11 19:44:02 +08:00
******************************************************************************/
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)
2024-04-11 19:44:02 +08:00
{
return &pkt->meta.route_ctx;
2024-04-11 19:44:02 +08:00
}
void packet_set_sids(struct packet *pkt, const struct sids *sids)
2024-04-11 19:44:02 +08:00
{
pkt->meta.sids = *sids;
2024-04-11 19:44:02 +08:00
}
const struct sids *packet_get_sids(const struct packet *pkt)
2024-04-11 19:44:02 +08:00
{
return &pkt->meta.sids;
2024-04-11 19:44:02 +08:00
}
void packet_prepend_sids(struct packet *pkt, const struct sids *sids)
2024-04-11 19:44:02 +08:00
{
if (pkt->meta.sids.used + sids->used > MAX_SIDS)
2024-04-11 19:44:02 +08:00
{
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;
2024-04-11 19:44:02 +08:00
}
}
void packet_set_session_id(struct packet *pkt, uint64_t id)
2024-04-11 19:44:02 +08:00
{
pkt->meta.session_id = id;
2024-04-11 19:44:02 +08:00
}
uint64_t packet_get_session_id(const struct packet *pkt)
2024-04-11 19:44:02 +08:00
{
return pkt->meta.session_id;
2024-04-11 19:44:02 +08:00
}
void packet_set_domain_id(struct packet *pkt, uint64_t id)
2024-04-11 19:44:02 +08:00
{
pkt->meta.domain_id = id;
2024-04-11 19:44:02 +08:00
}
uint64_t packet_get_domain_id(const struct packet *pkt)
2024-04-11 19:44:02 +08:00
{
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;
2024-04-11 19:44:02 +08:00
}
void packet_set_action(struct packet *pkt, enum packet_action action)
2024-04-11 19:44:02 +08:00
{
pkt->meta.action = action;
2024-04-11 19:44:02 +08:00
}
enum packet_action packet_get_action(const struct packet *pkt)
2024-04-11 19:44:02 +08:00
{
return pkt->meta.action;
2024-04-11 19:44:02 +08:00
}
2024-05-08 18:24:26 +08:00
void packet_set_origin_ctx(struct packet *pkt, void *ctx)
2024-04-11 19:44:02 +08:00
{
pkt->meta.origin_ctx = ctx;
2024-04-11 19:44:02 +08:00
}
const void *packet_get_origin_ctx(const struct packet *pkt)
2024-04-11 19:44:02 +08:00
{
return pkt->meta.origin_ctx;
2024-04-11 19:44:02 +08:00
}
/******************************************************************************
* other uitls
******************************************************************************/
2024-04-11 19:44:02 +08:00
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;
2024-04-11 19:44:02 +08:00
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;
}
2024-05-15 11:40:00 +08:00
dup_pkt->layers_used = pkt->layers_used;
dup_pkt->layers_size = pkt->layers_size;
2024-04-11 19:44:02 +08:00
memcpy((char *)dup_pkt->data_ptr, pkt->data_ptr, pkt->data_len);
2024-05-15 11:40:00 +08:00
dup_pkt->data_len = pkt->data_len;
packet_set_action(dup_pkt, PACKET_ACTION_DROP);
2024-04-11 19:44:02 +08:00
for (int8_t i = 0; i < pkt->layers_used; i++)
{
dup_pkt->layers[i].proto = pkt->layers[i].proto;
2024-04-11 19:44:02 +08:00
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;
2024-05-15 11:40:00 +08:00
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;
2024-04-11 19:44:02 +08:00
}
// 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)
2024-04-11 19:44:02 +08:00
{
if (pkt && pkt->need_free)
2024-04-11 19:44:02 +08:00
{
free((void *)pkt);
2024-05-08 18:24:26 +08:00
}
2024-06-17 11:41:21 +08:00
}
void layer_convert(const struct raw_layer *in, struct layer *out)
{
if (in == NULL || out == NULL)
{
return;
}
out->proto = in->proto;
2024-06-19 14:43:32 +08:00
out->hdr_len = in->hdr_len;
out->hdr.raw = (char *)in->hdr_ptr;
}