| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Драйвер сетевого устройства |
| Автор: diamond3351 13.1.2006, 21:11 |
| Есть драйвер сетевого устройства, выполенный в виде модуля ядра. Модуль грузится, устройство регестрируется в системе, его можно поднимать и опускать с помощью ifconfig. Что нужно писать(на С), чтобы выполнить ioctrl()? Для ioctrl нужно знать "дескриптор" устройства, а я знаю только имя. Как получить у ядра указатель на сетевое устройство, зная его имя? |
| Автор: bilbobagginz 14.1.2006, 04:18 |
| open() ? |
| Автор: diamond3351 14.1.2006, 19:08 |
| так open() что? пусть устройство называется driver, как его открывать? |
| Автор: bilbobagginz 15.1.2006, 02:16 | ||
| все это делается в userland, ты хотел узнать fd для ioctl(). делаешь:
|
| Автор: 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 файлы сетевых устройств.
не знаю как в линухе, но я думаю так же, отсюда видно что у меня есть интерфейс 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 главу, и нашел там это:
это меня убедило окончательно как я понял, походу в линухе устройства сетевые создаются динамически, а во фре только при старте системы они опознаются. в общем походу оба правы, только я думал что не так сильно различается поддержка сети между ними. |