DPDK: наиболее эффективный способ изменения заголовков захваченного пакета

я пытаюсь изменить заголовки некоторых пакетов 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);
}

Эта функция вызывается из цикла, который анализирует поток пакетов и передает пакет а также размер на каждой итерации. Поскольку будет много вызовов, как я могу сделать свою память кода эффективной и лучше? Какие-нибудь советы?

0

Решение

Есть несколько проблем с кодом.

byte_size

uint8_t byte_size = static_cast<uint8_t>(size); Я не уверен, что это правильно, так как он в основном ограничивает все пакеты 256 байтами, что может быть не всегда так. Так что я бы просто удалил эту строку, так как size Сам по себе прекрасно.

rte_pktmbuf_append ()

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 () документация.

Другие манипуляции с длиной Mbuf

Так как 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 меньше, чем может потребоваться длина пакета, если только в коде нет такой проверки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector