используя пример DPDK-basicfwd, как отправить собственный пакет на желаемый порт - PullRequest
1 голос
/ 08 мая 2020

Требование: я хотел бы использовать DPDK basicfwd, чтобы отправить собственный ответ на входящий порт.

Пояснение:

Порты DPDK: Пример порта-0 и порта-1 код: отредактировал DPDK basicfwd. Пользовательская функция: PacketHandler() Требование: Иногда мне нужно отправить собственный пакет (тип пакета RST) на входящий порт.

пример: Port-0 -> RX burst -> PacketHandler() -> normal packets fwd to Port-1, special packets send back to Port-0

Фрагмент кода:

while (isRun) {
    num_rx = rte_eth_rx_burst(port_id, queue_id, mbufs, BURST_SIZE);
    if (num_rx == 0) {
        continue;
    }

    num_tx = 0;
    for (int idx = 0; idx < num_rx; idx++) {
        struct pcap_pkthdr pktHdr;
        gettimeofday(&pktHdr.ts, NULL);
        pktHdr.caplen = rte_pktmbuf_pkt_len(mbufs[idx]);
        pktHdr.len = rte_pktmbuf_pkt_len(mbufs[idx]);

        if (PacketHandler(&pktHdr, rte_pktmbuf_mtod(mbufs[idx], unsigned char *)) > 1) {
            printf("Blocked Packets, do not fwd");
            //TODO: send custom packet to incoming way
            rte_pktmbuf_free(mbufs[idx]);
            continue;
        }

        txbufs[num_tx++] = mbufs[idx];            
    }

    if (num_tx > 0) {
        sent = rte_eth_tx_burst(port_id ^ 1, queue_id, txbufs, num_tx);
        for (int idx = sent; idx < num_tx; idx++) {
            rte_pktmbuf_free(txbufs[idx]);
        }
    }
}

Мой настраиваемый тип пакета - u_char. Как я могу отправить свой пакет на входящий путь?

Спасибо

1 Ответ

1 голос
/ 08 мая 2020

Вариант 1: простой способ (но может повлиять на производительность)

  1. получение пакетов через rte_eth_rx_burst

  2. итерация пакетов, чтобы обновить dest_port = PacketHandler ()? mbufs [idx] -> порт: (mbufs [idx] -> port ^ 1)

  3. Отправлять пакет с rte_eth_tx_burst с dest_port

  4. Закомментируйте вызов tx_burst generi c ниже.

Вариант 2:

  1. Создайте 2 mbuf-массива, а именно mbufs_inport и mbufs_outport.

  2. Итерировать пакеты, чтобы вызвать PacketHandler (). Соответствующие пакеты отправляются в mbufs_inport, а несоответствующие - в mbufs_outport

  3. для вызова rte_eth_tx_burst для mbufs_inport и mbufs_outprt.

Опция 3:

  1. регистрация rx-callback для фильтрации пакетов с помощью packethandler.

  2. Теперь у вас есть возможность для прямой отправки выбранного обратно на основе mbuf->portid. В то время как несовпадающие пакеты продолжаются в основном l oop.

  3. Если есть сомнения по поводу packet order или previous packets needs to be processed, используйте mbuf-udata64 в качестве заполнителя для порт выхода. Для случаев, когда не совпадают, набор будет как -1. Затем в основном l oop вы преобразовали tx_burst для n пакетов, чтобы выполнить итерацию для каждого, поскольку вам нужно проверить значение udata64.

...