Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Драйвер сетевого устройства


Автор: diamond3351 13.1.2006, 21:11
Есть драйвер сетевого устройства, выполенный в виде модуля ядра. Модуль грузится, устройство регестрируется в системе, его можно поднимать и опускать с помощью ifconfig. Что нужно писать(на С), чтобы выполнить ioctrl()? Для ioctrl нужно знать "дескриптор" устройства, а я знаю только имя. Как получить у ядра указатель на сетевое устройство, зная его имя?

Автор: bilbobagginz 14.1.2006, 04:18
open() ?
smile

Автор: diamond3351 14.1.2006, 19:08
так open() что? пусть устройство называется driver, как его открывать? smile

Автор: bilbobagginz 15.1.2006, 02:16
все это делается в userland, ты хотел узнать fd для ioctl().
делаешь:
Код

....
/** где-то надо объявить о int myfd=-1; */
....
if (-1==(myfd=open("/dev/driver",O_NONBLOCK))){
    perror("блин...ошибка:");
    /* выход */
    return -1;
}
/** а теперь у нас есть живой дескриптор: */
ioctl(myfd,.....);
...
...

Автор: diamond3351 15.1.2006, 19:50
Спасибо!...
Правда я вчера перерыл исзодники ifconfig, и вроде это слегка по другому делается
fd = socket( /* какие-то параметры */ );
ioctrl(fd, command, "device");

Мне кажется (может я ошибаюсь) что сетевые устройства на создают файлов в каталоге /dev/ ?

Автор: diamond3351 16.1.2006, 12:40
Проверил - действительно, сетевые устройства не создают файлы в каталоге /dev/. Писать нужно так:

struct ifreq ifr;
int skfd;

skfd = socket(AF_UNIX, SOCK_DGRAM, 0);
strncpy(ifr.ifr_name, driver_name, IFNAMSIZ);

if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) {
fprintf(stderr, "%s: unknown interface (module not loaded?)\n", ifr.ifr_name);
return (-1);
}

И дальше таким образом через ioctl

Автор: cenix 16.1.2006, 13:28
diamond3351
Все устройства в никсах и не только они лежат в /dev, только так никсы работают с устройствами.
В том числе там находятся и сетевые устройства, и многое другое(мышь, клава, терминал, список процессов ...)

Автор: dwr_budr 16.1.2006, 13:38
cenix
На сетевые устройства абстракция "устройство-файл" не распространяется и в /dev нет файлов представляющих сетевые интерфейсы.

Автор: cenix 17.1.2006, 13:41
dwr_budr
Насколько я знаю, обращение ко всем устройствам идет через файлы,
точно утверждать не буду, но вот подтверждение того, что у меня есть в /dev файлы сетевых устройств.
Код

freebsd# ifconfig                                                      
de0: flags=108843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500     
        inet 192.168.123.7 netmask 0xffffff00 broadcast 192.168.123.255
        inet6 fe80::203:ffff:fe7f:84a0%de0 prefixlen 64 scopeid 0x1    
        ether 00:03:ff:7f:84:a0                                        
        media: Ethernet autoselect (100baseTX)     
        status: active     

freebsd# ls -laG /dev

dr-xr-xr-x   2 root   wheel          512 Dec 15 12:39 net              
lrwxr-xr-x   1 root   wheel            7 Dec 15 12:39 net1 -> net/de0  
lrwxr-xr-x   1 root   wheel            9 Dec 15 12:39 net2 -> net/plip0
lrwxr-xr-x   1 root   wheel            7 Dec 15 12:39 net3 -> net/lo0  

freebsd# ls -la net                                   
total 1                                               
dr-xr-xr-x  2 root  wheel       512 Dec 15 12:39 .    
dr-xr-xr-x  4 root  wheel       512 Dec 15 12:39 ..   
crw-------  1 root  wheel  253,   1 Dec 15 12:39 de0  
crw-------  1 root  wheel  253,   3 Dec 15 12:39 lo0  
crw-------  1 root  wheel  253,   2 Dec 15 12:39 plip0


не знаю как в линухе, но я думаю так же,
отсюда видно что у меня есть интерфейс de0(сетевая), которая есть ссылкой прямо в /dev под именем net1, и сам файл в каталоге /dev/net.
возражения, предложения ?..

Автор: dwr_budr 18.1.2006, 06:47
Я FreeBSD в глаза не видел и ничего о его ядре не читал, посему спорить не буду и поверю на слово.
Но мой пост был по поводу Линукса и я могу лишь еще раз повторить, что в Линуксе сетевые интерфейсы не представленны в виде файлов. Для подтверждения и разъяснения полистай самое начало 17й главы http://lwn.net/Kernel/LDD3/.

Автор: cenix 18.1.2006, 18:46
dwr_budr
видимо в линухе по-другому сделано, но в общем запустил в виртуалке линух, поглядел в /dev и не нашел там файла интерфейса, а потом почитал 17 главу, и нашел там это:
Цитата

There are a few important differences between mounted disks and packet-delivery interfaces.To begin with,a disk exists as a special file in the /dev directory, whereas a network interface has no such entrypoint.The normal file operations (read,write,and soon)do not make sense when applied to network interfaces,so it is not possible to apply the Unix “everythingisafile”approach to them.Thus, network interfaces exist in their own namespace and export a different set of operations.

это меня убедило окончательно smile
как я понял, походу в линухе устройства сетевые создаются динамически, а во фре только при старте системы они опознаются.
в общем походу оба правы, только я думал что не так сильно различается поддержка сети между ними.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)