Add packet utils to packet.h
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
add_library(packet packet.cpp)
|
||||
add_library(packet packet.cpp packet_utils.cpp)
|
||||
target_include_directories(packet PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||
target_include_directories(packet PUBLIC ${CMAKE_SOURCE_DIR}/deps/uthash)
|
||||
target_include_directories(packet PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
||||
target_link_libraries(packet tuple log)
|
||||
target_link_libraries(packet tuple log mrzcpd)
|
||||
|
||||
add_subdirectory(test)
|
||||
@@ -1131,7 +1131,6 @@ const char *packet_parse(struct packet *pkt, const char *data, uint16_t len)
|
||||
pkt->layers_size = PACKET_MAX_LAYERS;
|
||||
pkt->data_ptr = data;
|
||||
pkt->data_len = len;
|
||||
memset(&pkt->meta, 0, sizeof(struct metadata));
|
||||
|
||||
// TESTED
|
||||
return parse_ether(pkt, data, len);
|
||||
@@ -1291,7 +1290,7 @@ int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
|
||||
const struct packet_layer *layer_l3 = NULL;
|
||||
const struct packet_layer *layer_l4 = NULL;
|
||||
const struct packet_layer *layer = NULL;
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
uint64_t domain = packet_get_domain(pkt);
|
||||
|
||||
for (int8_t i = pkt->layers_used - 1; i >= 0; i--)
|
||||
{
|
||||
@@ -1312,10 +1311,10 @@ int packet_get_innermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
|
||||
}
|
||||
}
|
||||
|
||||
if (layer_l3 && layer_l4)
|
||||
if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
|
||||
{
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l3->hdr_offset, layer_l3->type, tuple, meta->domain);
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l4->hdr_offset, layer_l4->type, tuple, meta->domain);
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l3->hdr_offset, layer_l3->type, tuple, domain);
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l4->hdr_offset, layer_l4->type, tuple, domain);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@@ -1332,7 +1331,7 @@ int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
|
||||
const struct packet_layer *layer_l3 = NULL;
|
||||
const struct packet_layer *layer_l4 = NULL;
|
||||
const struct packet_layer *layer = NULL;
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
uint64_t domain = packet_get_domain(pkt);
|
||||
|
||||
for (int8_t i = 0; i < pkt->layers_used; i++)
|
||||
{
|
||||
@@ -1353,10 +1352,10 @@ int packet_get_outermost_tuple6(const struct packet *pkt, struct tuple6 *tuple)
|
||||
}
|
||||
}
|
||||
|
||||
if (layer_l3 && layer_l4)
|
||||
if (layer_l3 && layer_l4 && layer_l4 - layer_l3 == 1)
|
||||
{
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l3->hdr_offset, layer_l3->type, tuple, meta->domain);
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l4->hdr_offset, layer_l4->type, tuple, meta->domain);
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l3->hdr_offset, layer_l3->type, tuple, domain);
|
||||
set_tuple6((const char *)pkt->data_ptr + layer_l4->hdr_offset, layer_l4->type, tuple, domain);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@@ -1515,276 +1514,4 @@ uint64_t packet_get_hash(const struct packet *pkt, enum ldbc_method method, int
|
||||
}
|
||||
|
||||
return hash_value;
|
||||
}
|
||||
|
||||
int8_t packet_get_layers(const struct packet *pkt)
|
||||
{
|
||||
return pkt->layers_used;
|
||||
}
|
||||
|
||||
const struct packet_layer *packet_get_layer(const struct packet *pkt, int8_t idx)
|
||||
{
|
||||
if (idx < 0 || idx >= pkt->layers_used)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return &pkt->layers[idx];
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Packet Meta Data
|
||||
******************************************************************************/
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : failed
|
||||
int packet_set_sid(struct packet *pkt, uint16_t *sid, int num)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
if (num > MAX_SID_NUM)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
meta->sid.used = num;
|
||||
memcpy(meta->sid.list, sid, num * sizeof(uint16_t));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// return number of sid
|
||||
int packet_get_sid(const struct packet *pkt, uint16_t *sid, int size)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
if (size < meta->sid.used)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(sid, meta->sid.list, meta->sid.used * sizeof(uint16_t));
|
||||
return meta->sid.used;
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : failed
|
||||
int packet_prepend_sid(struct packet *pkt, uint16_t sid)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
if (meta->sid.used >= MAX_SID_NUM)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
memmove(meta->sid.list + 1, meta->sid.list, meta->sid.used * sizeof(uint16_t));
|
||||
meta->sid.list[0] = sid;
|
||||
meta->sid.used++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : failed
|
||||
int packet_append_sid(struct packet *pkt, uint16_t sid)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
if (meta->sid.used >= MAX_SID_NUM)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
meta->sid.list[meta->sid.used] = sid;
|
||||
meta->sid.used++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// return 0 : success
|
||||
// return -1 : failed
|
||||
int packet_set_route_ctx(struct packet *pkt, const char *route, int len)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
if (len > MAX_ROUTE_LEN)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(meta->route.data, route, len);
|
||||
meta->route.len = len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// return len of route ctx
|
||||
int packet_get_route_ctx(const struct packet *pkt, char *buff, int size)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
if (meta->route.len > size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
memcpy(buff, meta->route.data, meta->route.len);
|
||||
return meta->route.len;
|
||||
}
|
||||
|
||||
void packet_set_io_ctx(struct packet *pkt, void *ctx)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
meta->io_ctx = ctx;
|
||||
}
|
||||
|
||||
void *packet_get_io_ctx(const struct packet *pkt)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
return meta->io_ctx;
|
||||
}
|
||||
|
||||
void packet_set_domain(struct packet *pkt, uint64_t domain)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
meta->domain = domain;
|
||||
}
|
||||
|
||||
uint64_t packet_get_domain(const struct packet *pkt)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
return meta->domain;
|
||||
}
|
||||
|
||||
void packet_set_session_id(struct packet *pkt, uint64_t session_id)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
meta->session_id = session_id;
|
||||
}
|
||||
|
||||
uint64_t packet_get_session_id(const struct packet *pkt)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
return meta->session_id;
|
||||
}
|
||||
|
||||
void packet_set_direction(struct packet *pkt, enum packet_direction direction)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
meta->direction = direction;
|
||||
}
|
||||
|
||||
enum packet_direction packet_get_direction(const struct packet *pkt)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
return meta->direction;
|
||||
}
|
||||
|
||||
void packet_set_action(struct packet *pkt, enum packet_action action)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
meta->action = action;
|
||||
}
|
||||
|
||||
enum packet_action packet_get_action(const struct packet *pkt)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
return meta->action;
|
||||
}
|
||||
|
||||
void packet_set_type(struct packet *pkt, enum packet_type type)
|
||||
{
|
||||
struct metadata *meta = &pkt->meta;
|
||||
|
||||
meta->type = type;
|
||||
}
|
||||
|
||||
enum packet_type packet_get_type(const struct packet *pkt)
|
||||
{
|
||||
const struct metadata *meta = &pkt->meta;
|
||||
|
||||
return meta->type;
|
||||
}
|
||||
|
||||
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 = true;
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
void packet_free(struct packet *pkt)
|
||||
{
|
||||
if (pkt && pkt->need_free)
|
||||
{
|
||||
pkt->need_free = false;
|
||||
free((void *)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;
|
||||
}
|
||||
memcpy(dup_pkt, pkt, sizeof(struct packet));
|
||||
memcpy((char *)dup_pkt->data_ptr, pkt->data_ptr, pkt->data_len);
|
||||
dup_pkt->need_free = true;
|
||||
|
||||
struct metadata *meta = &dup_pkt->meta;
|
||||
meta->io_ctx = NULL;
|
||||
|
||||
// update layers
|
||||
for (int8_t i = 0; i < pkt->layers_used; i++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
// update frag_layer
|
||||
if (pkt->frag_layer)
|
||||
{
|
||||
dup_pkt->frag_layer = &dup_pkt->layers[pkt->frag_layer - pkt->layers];
|
||||
}
|
||||
|
||||
return dup_pkt;
|
||||
}
|
||||
|
||||
const char *packet_get_data(const struct packet *pkt)
|
||||
{
|
||||
return pkt->data_ptr;
|
||||
}
|
||||
|
||||
uint16_t packet_get_len(const struct packet *pkt)
|
||||
{
|
||||
return pkt->data_len;
|
||||
}
|
||||
|
||||
bool packet_is_fragment(const struct packet *pkt)
|
||||
{
|
||||
if (pkt->frag_layer)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,8 @@ extern "C"
|
||||
|
||||
#define PACKET_MAX_LAYERS 32
|
||||
#define PACKET_LOG_ERROR(format, ...) LOG_ERROR("packet", format, ##__VA_ARGS__)
|
||||
#define PACKET_LOG_DEBUG(format, ...) LOG_DEBUG("packet", format, ##__VA_ARGS__)
|
||||
#define PACKET_LOG_DEBUG(format, ...) void(0)
|
||||
//#define PACKET_LOG_DEBUG(format, ...) LOG_DEBUG("packet", format, ##__VA_ARGS__)
|
||||
|
||||
enum ldbc_method
|
||||
{
|
||||
@@ -26,46 +27,11 @@ enum ldbc_method
|
||||
LDBC_METHOD_HASH_INNERMOST_EXT_IP = 5,
|
||||
};
|
||||
|
||||
enum packet_direction
|
||||
enum packet_origin
|
||||
{
|
||||
PACKET_DIRECTION_I2E = 0,
|
||||
PACKET_DIRECTION_E2I = 1,
|
||||
};
|
||||
|
||||
enum packet_action
|
||||
{
|
||||
PACKET_ACTION_FORWARD = 0,
|
||||
PACKET_ACTION_DROP = 1,
|
||||
};
|
||||
|
||||
enum packet_type
|
||||
{
|
||||
PACKET_TYPE_DATA = 0,
|
||||
PACKET_TYPE_CTRL = 1,
|
||||
};
|
||||
|
||||
struct metadata
|
||||
{
|
||||
#define MAX_SID_NUM 8
|
||||
#define MAX_ROUTE_LEN 64
|
||||
|
||||
struct
|
||||
{
|
||||
uint16_t list[MAX_SID_NUM];
|
||||
uint16_t used;
|
||||
} sid;
|
||||
struct
|
||||
{
|
||||
char data[MAX_ROUTE_LEN];
|
||||
uint16_t len;
|
||||
} route;
|
||||
|
||||
void *io_ctx;
|
||||
uint64_t domain;
|
||||
uint64_t session_id;
|
||||
enum packet_direction direction;
|
||||
enum packet_action action;
|
||||
enum packet_type type;
|
||||
PACKET_ORIGIN_MARSIO = 0x1,
|
||||
PACKET_ORIGIN_DUMPFILE = 0x2,
|
||||
PACKET_ORIGIN_USER = 0x3,
|
||||
};
|
||||
|
||||
struct packet
|
||||
@@ -77,9 +43,10 @@ struct packet
|
||||
|
||||
const char *data_ptr;
|
||||
uint16_t data_len;
|
||||
bool need_free;
|
||||
|
||||
struct metadata meta;
|
||||
int need_drop;
|
||||
void *io_ctx;
|
||||
enum packet_origin origin;
|
||||
};
|
||||
|
||||
// return innermost payload
|
||||
@@ -90,50 +57,27 @@ void packet_print(const struct packet *pkt);
|
||||
// direction 0: I2E
|
||||
uint64_t packet_get_hash(const struct packet *pkt, enum ldbc_method method, int direction);
|
||||
|
||||
// return 0: success
|
||||
// return -1: failed
|
||||
int packet_set_sid(struct packet *pkt, uint16_t *sid, int num);
|
||||
// return number of sid
|
||||
int packet_get_sid(const struct packet *pkt, uint16_t *sid, int size);
|
||||
// return 0: success
|
||||
// return -1: failed
|
||||
int packet_prepend_sid(struct packet *pkt, uint16_t sid);
|
||||
// return 0: success
|
||||
// return -1: failed
|
||||
int packet_append_sid(struct packet *pkt, uint16_t sid);
|
||||
/******************************************************************************
|
||||
* Utils
|
||||
******************************************************************************/
|
||||
|
||||
// return 0: success
|
||||
// return -1: failed
|
||||
int packet_set_route_ctx(struct packet *pkt, const char *route, int len);
|
||||
// return len of route ctx
|
||||
int packet_get_route_ctx(const struct packet *pkt, char *buff, int size);
|
||||
void packet_set_origin(struct packet *pkt, enum packet_origin origin);
|
||||
enum packet_origin packet_get_origin(const struct packet *pkt);
|
||||
|
||||
void packet_set_io_ctx(struct packet *pkt, void *ctx);
|
||||
void *packet_get_io_ctx(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_session_id(struct packet *pkt, uint64_t session_id);
|
||||
uint64_t packet_get_session_id(const struct packet *pkt);
|
||||
|
||||
void packet_set_direction(struct packet *pkt, enum packet_direction direction);
|
||||
enum packet_direction packet_get_direction(const struct packet *pkt);
|
||||
|
||||
void packet_set_action(struct packet *pkt, enum packet_action action);
|
||||
enum packet_action packet_get_action(const struct packet *pkt);
|
||||
|
||||
void packet_set_type(struct packet *pkt, enum packet_type type);
|
||||
enum packet_type packet_get_type(const struct packet *pkt);
|
||||
int packet_is_fragment(const struct packet *pkt);
|
||||
|
||||
struct packet *packet_new(uint16_t pkt_len);
|
||||
void packet_free(struct packet *pkt);
|
||||
struct packet *packet_dup(const struct packet *pkt);
|
||||
|
||||
const char *packet_get_data(const struct packet *pkt);
|
||||
uint16_t packet_get_len(const struct packet *pkt);
|
||||
void packet_set_domain(struct packet *pkt, uint64_t domain);
|
||||
uint64_t packet_get_domain(const struct packet *pkt);
|
||||
|
||||
bool packet_is_fragment(const struct packet *pkt);
|
||||
void packet_set_route_ctx(struct packet *pkt, const char *route, int len);
|
||||
int packet_get_route_ctx(const struct packet *pkt, char *buff, int size); // return len of route ctx
|
||||
|
||||
#ifdef __cpluscplus
|
||||
}
|
||||
|
||||
310
src/packet/packet_utils.cpp
Normal file
310
src/packet/packet_utils.cpp
Normal file
@@ -0,0 +1,310 @@
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "packet_private.h"
|
||||
#include "marsio.h"
|
||||
|
||||
/******************************************************************************
|
||||
* set and get from struct packet
|
||||
******************************************************************************/
|
||||
|
||||
void packet_set_origin(struct packet *pkt, enum packet_origin origin)
|
||||
{
|
||||
pkt->origin = origin;
|
||||
}
|
||||
|
||||
enum packet_origin packet_get_origin(const struct packet *pkt)
|
||||
{
|
||||
return pkt->origin;
|
||||
}
|
||||
|
||||
int8_t packet_get_layers(const struct packet *pkt)
|
||||
{
|
||||
return pkt->layers_used;
|
||||
}
|
||||
|
||||
const struct packet_layer *packet_get_layer(const struct packet *pkt, int8_t idx)
|
||||
{
|
||||
if (idx < 0 || idx >= pkt->layers_used)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return &pkt->layers[idx];
|
||||
}
|
||||
|
||||
const char *packet_get_data(const struct packet *pkt)
|
||||
{
|
||||
return pkt->data_ptr;
|
||||
}
|
||||
|
||||
uint16_t packet_get_len(const struct packet *pkt)
|
||||
{
|
||||
return pkt->data_len;
|
||||
}
|
||||
|
||||
const char *packet_get_payload(const struct packet *pkt)
|
||||
{
|
||||
if (pkt->layers_used == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return pkt->layers[pkt->layers_used - 1].pld_ptr;
|
||||
}
|
||||
|
||||
uint16_t packet_get_payload_len(const struct packet *pkt)
|
||||
{
|
||||
if (pkt->layers_used == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return pkt->layers[pkt->layers_used - 1].pld_len;
|
||||
}
|
||||
|
||||
int packet_need_drop(const struct packet *pkt)
|
||||
{
|
||||
return pkt->need_drop;
|
||||
}
|
||||
|
||||
void packet_set_drop(struct packet *pkt)
|
||||
{
|
||||
pkt->need_drop = 1;
|
||||
}
|
||||
|
||||
void packet_set_io_ctx(struct packet *pkt, void *ctx)
|
||||
{
|
||||
pkt->io_ctx = ctx;
|
||||
}
|
||||
|
||||
void *packet_get_io_ctx(const struct packet *pkt)
|
||||
{
|
||||
return pkt->io_ctx;
|
||||
}
|
||||
|
||||
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->origin = PACKET_ORIGIN_USER;
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
void packet_free(struct packet *pkt)
|
||||
{
|
||||
if (pkt && pkt->origin == PACKET_ORIGIN_USER)
|
||||
{
|
||||
free((void *)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;
|
||||
}
|
||||
memcpy(dup_pkt, pkt, sizeof(struct packet));
|
||||
memcpy((char *)dup_pkt->data_ptr, pkt->data_ptr, pkt->data_len);
|
||||
dup_pkt->origin = PACKET_ORIGIN_USER;
|
||||
dup_pkt->io_ctx = dup_pkt;
|
||||
|
||||
// update layers
|
||||
for (int8_t i = 0; i < pkt->layers_used; i++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
// update frag_layer
|
||||
if (pkt->frag_layer)
|
||||
{
|
||||
dup_pkt->frag_layer = &dup_pkt->layers[pkt->frag_layer - pkt->layers];
|
||||
}
|
||||
|
||||
return dup_pkt;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* set and get from mbuff
|
||||
******************************************************************************/
|
||||
|
||||
void packet_set_ctrl(struct packet *pkt)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_set_ctrlbuf(mbuff);
|
||||
}
|
||||
}
|
||||
|
||||
int packet_is_ctrl(const struct packet *pkt)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
return marsio_buff_is_ctrlbuf(mbuff);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 1: E2I, 0: I2E
|
||||
void packet_set_direction(struct packet *pkt, int dir)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_set_metadata(mbuff, MR_BUFF_DIR, &dir, sizeof(dir));
|
||||
}
|
||||
}
|
||||
|
||||
// 1: E2I, 0: I2E
|
||||
int packet_get_direction(const struct packet *pkt)
|
||||
{
|
||||
int direction = 0;
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_get_metadata(mbuff, MR_BUFF_DIR, &direction, sizeof(direction));
|
||||
}
|
||||
|
||||
return direction;
|
||||
}
|
||||
|
||||
void packet_set_session_id(struct packet *pkt, uint64_t sess_id)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_set_metadata(mbuff, MR_BUFF_SESSION_ID, &sess_id, sizeof(sess_id));
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t packet_get_session_id(const struct packet *pkt)
|
||||
{
|
||||
uint64_t sess_id = 0;
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_get_metadata(mbuff, MR_BUFF_SESSION_ID, &sess_id, sizeof(sess_id));
|
||||
}
|
||||
|
||||
return sess_id;
|
||||
}
|
||||
|
||||
void packet_set_domain(struct packet *pkt, uint64_t domain)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
// TODO
|
||||
// marsio_buff_set_metadata(mbuff, MR_BUFF_DOMAIN, &domain, sizeof(domain));
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t packet_get_domain(const struct packet *pkt)
|
||||
{
|
||||
uint64_t domain = 0;
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
// TODO
|
||||
// marsio_buff_get_metadata(mbuff, MR_BUFF_DOMAIN, &domain, sizeof(domain));
|
||||
}
|
||||
|
||||
return domain;
|
||||
}
|
||||
|
||||
void packet_set_route_ctx(struct packet *pkt, const char *route, int len)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_set_metadata(mbuff, MR_BUFF_ROUTE_CTX, (void *)route, len);
|
||||
}
|
||||
}
|
||||
|
||||
// return len of route ctx
|
||||
int packet_get_route_ctx(const struct packet *pkt, char *buff, int size)
|
||||
{
|
||||
int len = 0;
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
len = marsio_buff_get_metadata(mbuff, MR_BUFF_ROUTE_CTX, buff, size);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void packet_set_sid_list(struct packet *pkt, uint16_t *sid, int num)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_set_sid_list(mbuff, sid, num);
|
||||
}
|
||||
}
|
||||
|
||||
// return number of sid
|
||||
int packet_get_sid_list(const struct packet *pkt, uint16_t *sid, int num)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
return marsio_buff_get_sid_list(mbuff, sid, num);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void packet_prepend_sid_list(struct packet *pkt, uint16_t *sid, int num)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_prepend_sid_list(mbuff, sid, num);
|
||||
}
|
||||
}
|
||||
|
||||
void packet_append_sid_list(struct packet *pkt, uint16_t *sid, int num)
|
||||
{
|
||||
if (packet_get_origin(pkt) == PACKET_ORIGIN_MARSIO)
|
||||
{
|
||||
marsio_buff_t *mbuff = (marsio_buff_t *)packet_get_io_ctx(pkt);
|
||||
assert(mbuff != NULL);
|
||||
marsio_buff_append_sid_list(mbuff, sid, num);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user