2016-08-02 20 views
1

Я пытаюсь понять механизм пересылки базового примера DPDK. Может ли кто-нибудь помочь мне с инициализацией и редактированием полезной нагрузки rte_mbuf? Here - класс. Я планирую использовать tcpdump и для просмотра содержимого пакета.DPDK - rte_mbuf полезная нагрузка/инициализация данных или обновление/модификация

Вот rte_mbuf Я хочу, чтобы добавить свой собственный полезную нагрузку:

struct rte_mbuf *bufs[BURST_SIZE]; 

Это rte_mbuf принимается:

const uint16_t nb_rx = rte_eth_rx_burst(port, 0, bufs, BURST_SIZE); 

Это rte_mbuf передается:

const uint16_t nb_tx = rte_eth_tx_burst(port^1, 0, 
            bufs, nb_rx); 

Я изменил образец приложения basicfwd.c в примерах DPDK печатать пересылаемые пакеты в файле:

/* Get burst of RX packets, from first port of pair. */ 

const uint16_t nb_rx = rte_eth_rx_burst(port, 0, bufs, BURST_SIZE); 
FILE *fp; 

fp = fopen("dump.txt", "a"); 
fprintf(fp, "\n-----------------------\n fprintf... %d<->%d\n", count, port); 

rte_pktmbuf_dump(fp, bufs[0], 1000); 
fclose(fp); 
if (unlikely(nb_rx == 0)) 
     continue; 

/* Send burst of TX packets, to second port of pair. */ 
    const uint16_t nb_tx = rte_eth_tx_burst(port^1, 0,bufs, nb_rx); 

Эти пакеты, которые я вижу в выходном файле: The dump for the first three iterations of the loop Я хотел бы иметь возможность изменять содержимое для лучшего понимания. Я пробовал rte_pktmbuf_init и bufs->userdata =*(unsigned short*) 0xAAAAAAAA, но это не работает для меня.

+0

пользовательские данные не полезная нагрузка является частной областью для пользователя, чтобы использовать. полезная нагрузка равна mbuf-> buf_addr, она указывает на первый байт в реальном пакете. – roni

ответ

2

Я решил проблему, создав свои собственные пакеты в пуле памяти.

  1. Создать пул памяти для программы.
  2. Выделите пакет в пуле памяти.
  3. Заполните пакет данными, адресом источника, адресом назначения и инициализируйте поля пакета.

Полная lcore_main функция:

/* 
* The main thread that does the work, reading from 
* an input port and writing to an output port. 
*/ 
struct message { 
    char data[DATA_SIZE]; 
}; 

static __attribute__(()) void 
lcore_main(void) 
{ 
    const uint8_t nb_ports = rte_eth_dev_count(); 
    uint8_t port; 

    for (port = 0; port < nb_ports; port++) 
     if (rte_eth_dev_socket_id(port) > 0 && 
      rte_eth_dev_socket_id(port) != 
      (int)rte_socket_id()) 
      printf("WARNING, port %u is on remote NUMA node to " 
      "polling thread.\n\tPerformance will " 
      "not be optimal.\n", port); 

    struct rte_mbuf *pkt; 
    struct ether_hdr *eth_hdr; 

    struct message obj; 
    struct message *msg; 
    int nb_rx = 0, nb_tx = 0, cnt = 0, pkt_size = 0; 
    int count = 0; 
    int k = 0; 
    for (count = 0; count < DATA_SIZE; count++){ 
     obj.data[count] = (char)(97 + (k++)); 
     if (k == 26) 
      k = 0; 
    } 
    time_t endtime = time(NULL) + 10; 
    port = 0; 
    while (time(NULL) < endtime) { 
     cnt = rte_eth_rx_burst(port, 0, &pkt, 1); 
     nb_rx += cnt; 

     if (cnt > 0) 
     { 
      eth_hdr = rte_pktmbuf_mtod(pkt, struct ether_hdr *); 

      rte_eth_macaddr_get(port, &eth_hdr->s_addr); 

      pkt_size = sizeof(struct message) + sizeof(struct ether_hdr); 
      msg = (struct message *) (rte_pktmbuf_mtod(pkt, char*)) + sizeof(struct ether_hdr); 
      rte_pktmbuf_free(pkt); 
     } 

     msg = &obj; 
     pkt = rte_pktmbuf_alloc(mbuf_pool); 
     pkt_size = sizeof(struct message) + sizeof(struct ether_hdr); 
     pkt->data_len = pkt_size; 
     pkt->pkt_len = pkt_size; 
     eth_hdr = rte_pktmbuf_mtod(pkt, struct ether_hdr *); 
     rte_eth_macaddr_get(port, &eth_hdr->d_addr); 
     rte_eth_macaddr_get(port^1, &eth_hdr->s_addr); 
     eth_hdr->ether_type = htons(PTP_PROTOCOL); 
     char* data; 

     data = rte_pktmbuf_append(pkt, sizeof(struct message)); 
     if (data != NULL) 
      rte_memcpy(data, msg, sizeof(struct message)); 

     nb_tx += rte_eth_tx_burst(port^1, 0, &pkt, 1); 
    } 
    printf("----\nData size: %d\nPacket size: %d\nRX : %d, TX : %d\n\n", DATA_SIZE, pkt_size, nb_rx, nb_tx); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^