Одноадресный / многоадресный пакет с использованием xdp / tc eBPF

#bpf #ebpf #xdp-bpf

#bpf #ebpf #xdp-bpf

Вопрос:

Я пытаюсь разработать балансировщик нагрузки с использованием ebpf. Я хочу передать входящий пакет разным адресатам (устройствам, подключенным к одной сети). Хотя я использовал clone_bpf_redirect() вспомогательную функцию для перенаправления пакета на реальные / виртуальные интерфейсы, и она работает нормально, теперь я хочу передать / передать пакет другим устройствам, подключенным к той же сети.

Насколько я знаю, XDP его не поддерживает. Поэтому, используя перехват tc bpf. Есть ли какая-либо вспомогательная функция или какое действие я должен использовать? Может кто-нибудь подсказать мне, как я могу это сделать?

 **eBpf load divider**: 192.168.98.178 (load divider)
**Receiver 1**: 192.168.98.131
**Receiver 2**: 192.168.98.138
  
     iph->daddr = htonl(3232260739);  //Dest: 192.168.98.131 
    iph->check = 0;
    iph->check = checksum((unsigned short *)iph, sizeof(struct iphdr));

    // Update upd packet checksum of 
    sum = old_daddr   (~ntohs(*(unsigned short *)amp;iph->daddr) amp; 0xffff);
    sum  = ntohs(udp->check);
    sum = (sum amp; 0xffff)   (sum>>16);
    udp->check = htons(sum   (sum>>16) - 1);
// clone the packet and redirect to infdex 
    bpf_clone_redirect(skb,  skb->ifindex, 0);
//clone the packet and redirect to infdex (virtual interface 2)
    bpf_clone_redirect(skb,  skb->ifindex   2, 0);
//clone the packet and redirect to infdex (virtual interface 4)
    bpf_clone_redirect(skb,  skb->ifindex   4, 0);
            return TC_ACT_OK;
// Or
         //   return TC_ACT_REDIRECT;

  
 sudo tc filter add dev ens33 ingress bpf da obj bpf_loadbalancer.o sec ingress

  

после этого я получаю 1 пакет на 3 разных ifindex, но я хочу получить тот же пакет на другие устройства, подключенные к сети. Как я могу перенаправить пакет с устройства, а не с интерфейсов?

Комментарии:

1. Я не понимаю, в чем проблема. Вы можете использовать bpf_clone_redirect программу tc-bpf и отправлять пакеты на другие устройства.

2. bpf_clone_redirect(skb, skb-> ifindex, 0); или bpf_clone_redirect(skb, skb-> ifindex 1, 0); эта вспомогательная функция перенаправляет трафик на тот же интерфейс устройства, верно ?… я просто хочу переслать входной пакет на другое устройство, подключенное к той же сети.

3. давайте предположим, что в сценарии у нас есть 4 устройства, подключенных к сети, программа bpf запущена только на устройстве 1, а устройство 2 отправляет сообщение «привет» на устройство 1. В ответ устройство 1 отправляет сообщение «привет» на устройства 3 и 4. Я не знаю, как я могу перенаправить сообщение на другие устройства, а не на интерфейс устройства 1. просто хочу реализовать одноадресную / многоадресную рассылку.

4. Нет, этот помощник также может перенаправлять на другие устройства в соответствии с документацией: man7.org/linux/man-pages/man7/bpf-helpers.7.html .

5. Разве у вас уже нет фрагмента кода, с которым вы можете работать? ( Although I have used the clone_bpf_redirect helper function to redirect the packet to real/ virtual interfaces and its working fine. ) Вам необходимо изменить адрес в пакете, прежде чем перенаправлять его на устройство. Вы можете найти примеры в исходном коде Linux, в разделе samples/bpf/ .