Вот главная проблема.
- У меня есть 10-гигабитный интерфейс Ethernet, и ток составляет 6-7 Гбит / с
- Мне нужно реализовать брандмауэр. Затем мне нужно перехватить необработанные пакеты для фильтрации некоторых пакетов.
Просто я начал реализовывать в виде необработанного сокета необходимые коды ниже. Сокет привязан к определенному интерфейсу.
socketfd=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
strncpy(ifopts.ifr_name,interfaceName,IFNAMSIZ-1);
ioctl(socketfd,SIOCGIFINDEX,&ifopts);
sll.sll_family=AF_INET;
sll.sll_ifindex=ifopts.ifr_ifindex;
sll.sll_protocol=htons(ETH_PALL);
bind(socketfd,&sll,sizeof(sll));
Вот как я читаю, а размер mtu составляет 9000
while(true)
recvfrom(socketfd,buffer,9000,0,0,0);
Без какого-либо процесса в пакете я получил ~ 150 Мбит / с.
Это проблема, которую мне нужно решить. Я понимаю, что ссылка nload или ip -s показывает фактическую скорость; но я не могу достичь этих цифр около 6-7 Гбит / с.
~ 150 Мбит / с - это очень смешная скорость для меня. Мне нужно увеличить производительность настолько, насколько я могу сделать, используя один процессор. Я постараюсь использовать PF_INET, если вы хотите, я могу поделиться результатом этого.