Перейти к содержанию
    

Драйвер сетевого устройства linux.

Всем привет! Пришлось писать драйвер сетевого устройства. Тк, в драйверах я новичок, то встал в тупик. Может кто подскажет? В чем суть: в каком-то объеме драйвер написан. Он принимает пакеты от железяки и кладет их в skb. В wireshark-е я эти пакеты вижу, однако, никакая софтина кроме wireshark-а и ostinsto эти пакеты принять не может. Те, как я понимаю, дальше вврерх по сетевому стеку они не идут. Я не понимаю - почему? В чем может быть причина? В какую сторону копать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

netif_rx вы вызываете?

Например, как это делается в https://github.com/IMCG/LDD/blob/master/snull/snull.c и описано в https://dmilvdv.narod.ru/Translate/LDD3/ldd_packet_reception.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, makc said:

netif_rx вы вызываете?

Например, как это делается в https://github.com/IMCG/LDD/blob/master/snull/snull.c и описано в https://dmilvdv.narod.ru/Translate/LDD3/ldd_packet_reception.html

Да, конечно. Точнее:

netif_receive_skb и napi_complete_done

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Vain сказал:

Те, как я понимаю, дальше вврерх по сетевому стеку они не идут. Я не понимаю - почему? В чем может быть причина? В какую сторону копать?

Тогда напрашивается мысль, что могут быть искажены данные в самих пакетах. Вы сравнивали то, что получает Wireshark с тем, что было отправлено? Побайтовое сравнение делали?
PS: Мак-адрес интерфейса на приёме, надеюсь, совпадает с мак-адресом назначения в пакете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пинг работает? ARP отрабатывает или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пингов нет,  арп нет, потому что железяка пока не умеет. Пытаюсь прописать mac в arp таблицу вручную arp -s IP_addr MAC_addr, получаю:

SIOCSARP: Недопустимый аргумент
Чего-то в драйвере не хватает. Чего? hard_header вроде переопределил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите, что выдает команда "ip -s l".

5 часов назад, Vain сказал:

SIOCSARP: Недопустимый аргумент
Чего-то в драйвере не хватает. Чего? hard_header вроде переопределил.

Ещё стоит посмотреть, что ядро пишет в dmesg. Приложите лог dmesg в виде файла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ip -s l

7: png0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 9144 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 73:02:01:76:05:04 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast           
          5512      85      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
        523758     638      0       0       0       0 
8: png1: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 9144 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 73:02:01:77:05:04 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast           
        469489     571      0       0       0       0 
    TX:  bytes packets errors dropped carrier collsns           
          2902      18      0       0       0       0 
 

dmesg ничего интересного, там либо сообщения драйвера,  либо если что-то крашется. 

Предполагаю, что не совпадают crc заголовков. Сейчас пытаюсь пересчитать их в ядре.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, Vain сказал:

7: png0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 9144 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000

Меня смущает выделенное жирным. Без ARP у вас сеть работать не будет... Мне кажется нужно копать в этом направлении настройки флагов netdev->features и около.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поправил crc. Ничего не изменилось. Arp в железяке нету. Потому и стоит флаг NO_ARP. Пакеты шлю мультикастовые c адресом 224 и маком 0x01005E. Да, мне тоже не нравится что нет arp, но ни tcp ни udp стека в железяке нету, по сути - это петля, принимает пакеты, меняет в пакете ip адрес, mac и порт, и отправляет на другой интерфейс. Пытался решить проблему отсутствия arp, прописав mac в arp таблицу вручную  arp -s IP_addr MAC_addr, на что получаю SIOCSARP: Недопустимый аргумент. Отсюда вопрос: чего не хватает драйверу что ядро  так ругается на arp -s? Какой метод драйвера должен вызывать запрос arp -s? Ставил prink, ни ndo_eth_ioctl, ни ndo_do_ioctl, ни set_klink_settings при этом не вызываются. Может какой флаг нужен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Vain сказал:

Поправил crc. Ничего не изменилось. Arp в железяке нету. Потому и стоит флаг NO_ARP.

Я не понимаю, как вы хотите, чтобы работал приём в прикладном ПО, работающем на 99% поверх IP-стека, который без ARP не работает? Сырой прием пакетов у вас отрабатывается нормально, что логично. Но сетевого стека в операционной системе для этого интерфейса как бы нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, makc said:

который без ARP не работает?

Статическая таблица arp, созданная вручную. Собственно, пакеты пошли, хотя и с потерями, но это баги в драйвере. Поставил флаги неразборчивости и алмультикаст, изменил адрес с мультикастового на обычный. Vlc даже картинку временами пытается показывать. Пока так. Буду дальше разбираться.

Всем спасибо за советы! Но тему не закрываю. Вопросы еще точно  будут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...