LINUX.ORG.RU

Разработка драйвера сетевой карты

 , ,


0

7

Доброго времени суток всезнающий All.

Суть истории в следующем: пишу дравер сетевой карты для арм проца. Ввиду отсутствия pci шин пишу с использованием platform device (примеров работы с ним маловато, но вроде подразобрался).

В probe вызываю следующие функции

alloc_etherdev()
SET_NETDEV_DEV()
заполняю netdev->dev_addr
netdev->netdev_ops = &ip_mod_ops;
register_netdev(netdev);
netif_carrier_on(netdev);
netif_carrier_ok(netdev);

В итоге регистрируется драйвер и появляется в /sys/class/net и тд.

При запуске ifconfig выдает:
eth0      Link encap:Ethernet  HWaddr 1E:ED:19:27:1A:B3
          inet addr:192.168.0.109  Bcast:255.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11894 (11.6 KiB)  TX bytes:1690 (1.6 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

А при ifconfig -a:
eth0      Link encap:Ethernet  HWaddr 1E:ED:19:27:1A:B3
          inet addr:192.168.0.109  Bcast:255.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11894 (11.6 KiB)  TX bytes:1690 (1.6 KiB)

eth1      Link encap:Ethernet  HWaddr 0B:16:21:2C:37:42
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

тоесть как я понимаю, система его достаточно корректно видит в качестве сетевого устройства.

Далее и начинаются непонятки.
Пытаюсь перевести eth1 в активное состояние.
Для начала назначить адрес:

ip addr add 10.0.0.1/24 dev eth1

ifconfig -a
eth1      Link encap:Ethernet  HWaddr 0B:16:21:2C:37:42
          inet addr:10.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.0
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

адрес вроде применился, но по ifconfig среди активных интерфейсов его нет.

пытаюсь поднимать дальше
ifconfig eth1 up

ifconfig: SIOCSIFFLAGS: Cannot assign requested address

и всё дальше никак.


при вызове ifconfig происходит вызов колбека на ndo_get_stats, в котором особо ничего не происходит

return &netdev->stats;

Насколько я понимаю должны быть вызовы колбеков на .open и ioctl но их я не вижу. Возможно надо еще както дополнительно сообщить системе что устройство активно(аналог вставленного кабеля Ethernet).
Кто что знает расскажите. Или ссылку дайте на чтото толковое кроме LDD, и /usr/src/linux

Код покажи чтоли

Возможно надо еще както дополнительно сообщить системе что устройство активно(аналог вставленного кабеля Ethernet).

За это отвечает mdio. Но если он не реализован, то всё должно работать и показываться сразу после ifconfig up.

anonymous ()
Ответ на: комментарий от anonymous

Так mdio занимается общением с физикой, если бы он был, я же сам должен был заниматься его обслуживанием.
И сообщать системе о событиях. для этого netif_carrier_ насколько я понял используется.

AndriAno ()
Ответ на: комментарий от AndriAno

Извини, я не вчитывался в твой ОП. Наверное, ты прав.

Я просто хочу заметить, что можно начать с написания просто минимального работающего драйвера, который из netif_* содержит только netif_rx. Такой драйвер можно затем руками ifconfig-up'нуть и протестировать. Если ручной ifconfig up почему-то не работает, то надо сделать так чтобы работал.

anonymous ()

HWaddr 0B:16:21:2C:37:42
0B

Ахаха, дай ка я угадаю, это у тебя карточка с фирмварью, разработанной в России, да? Иди стучать по голове тем даунам, которые такой мак карточке назначили - у тебя тут младший бит в первой октете единичка, что означает, что это - мультикаст-адрес, который ну никак не может быть назначен сетевухе. Попробуй мак смени, лол, чтобы младший бит в первой октета нулем был

cherry-pick ()
Ответ на: комментарий от cherry-pick

О вот за это спасибо.
А карточки на самом деле даже нет.(Видишь суслика? а он есть (с))
Это драйвер виртуальной сетевухи.
Сейчас попробую поменять

AndriAno ()
Ответ на: комментарий от cherry-pick

это у тебя карточка с фирмварью, разработанной в России, да?

почему-то тоже сразу так подумалось

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.