я пытаюсь изменить заголовки некоторых пакетов GTP с помощью библиотек mbuf и mempool, особенно я хочу вырезать все уровни ETH, IP, UDP, GTP и получить (глубокую) копию полезной нагрузки пакета.
Вот кусок кода, который должен делать эту работу:
void (const unsigned char* packet, size_t size)
{
auto outer_header_len = sizeof(ether_header) + sizeof(ip) + sizeof(udphdr) + sizeof(gtp); //length to cut
uint8_t byte_size = static_cast<uint8_t>(size);
struct rte_mempool* mbuf_pool;
struct rte_mbuf *mbuf_pkt = rte_pktmbuf_alloc(mbuf_pool);
mbuf_pkt->data_len = byte_size;
mbuf_pkt->pkt_len = byte_size;
rte_pktmbuf_append(mbuf_pkt, packet[byte_size]);
auto payload = rte_pktmbuf_adj(mbuf_pkt, outer_header_len);
}
Эта функция вызывается из цикла, который анализирует поток пакетов и передает пакет а также размер на каждой итерации. Поскольку будет много вызовов, как я могу сделать свою память кода эффективной и лучше? Какие-нибудь советы?
Есть несколько проблем с кодом.
uint8_t byte_size = static_cast<uint8_t>(size);
Я не уверен, что это правильно, так как он в основном ограничивает все пакеты 256 байтами, что может быть не всегда так. Так что я бы просто удалил эту строку, так как size
Сам по себе прекрасно.
rte_pktmbuf_append(mbuf_pkt, packet[byte_size]);
эта функция увеличивает длину mbuf_pkt
, но не меняйте сами байты mbuf. Таким образом, мы должны использовать указатель, который он возвращает, чтобы фактически сделать копию, т.е.
ptr = rte_pktmbuf_append(mbuf_pkt, size);
if (ptr != NULL)
rte_memcpy(ptr, packet + outer_header_len, size -outer_header_len);
Вот также ссылки на rte_pktmbuf_append () а также rte_memcpy () документация.
Так как rte_pktmbuf_append()
увеличивает длину пакета, следующие строки являются избыточными:
mbuf_pkt->data_len = byte_size;
mbuf_pkt->pkt_len = byte_size;
auto payload = rte_pktmbuf_adj(mbuf_pkt, outer_header_len);
Мы можем копировать данные без внешнего заголовка, принимая во внимание outer_header_len
во время копирования данных, как в предыдущем примере:
ptr = rte_pktmbuf_append(mbuf_pkt, size);
if (ptr != NULL)
rte_memcpy(ptr, packet + outer_header_len, size -outer_header_len);
Проверка, если outer_header_len
меньше, чем может потребоваться длина пакета, если только в коде нет такой проверки.
Других решений пока нет …