Доброго времени суток всезнающий 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