получить дескриптор файла ioctl для порта Ethernet

Мне нужно получить дескриптор файла для использования в вызовах ioctl() для порта Ethernet в Linux. Не уверен, как это сделать.


person Terminal    schedule 15.06.2010    source источник


Ответы (2)


Просто используйте файловый дескриптор открытого сокета, используя имя устройства в структуре ifreq, переданной в ioctl(), при условии, что ваша программа имеет для этого соответствующие разрешения.

Из документов:

Linux поддерживает некоторые стандартные ioctl для настройки сетевых устройств. Их можно использовать в любом файловом дескрипторе сокета, независимо от семейства или типа. Они передают структуру ifreq:

Сокет не обязательно должен быть привязан к целевому устройству или принадлежать к какому-либо определенному семейству. Подойдет любой открытый сокет fd (опять же, с соответствующими привилегиями), просто откройте его для конкретной задачи, подождите, пока ioctl() вернется, и закройте его.

См. man 7 netdevice для получения дополнительной информации или здесь, если у вас не установлены соответствующие пакеты документации. (подсказка, пакет обычно называется manpages-dev или manpages-devel, в зависимости от вашего дистрибутива)

Вы также можете взглянуть на исходный код пакета net-tools, который может называться по-разному в зависимости от вашего дистрибутива. Это источник ifconfig (Debian/Ubuntu здесь).

Извините за первоначальную двусмысленность, я думал, вы пытаетесь настроить специальное многофункциональное устройство (сейчас не знаю, почему, возможно, из-за недостатка сна).

person Tim Post♦    schedule 15.06.2010
comment
Извините, не уверен, где будет файл, который я хочу открыть. Просто подумал, что использовать ioctl будет проще, чем анализировать ifconfig. - person Terminal; 15.06.2010
comment
@Terminal - И вообще, да, это .. в зависимости от того, что вы делаете. - person Tim Post♦; 15.06.2010

Вы можете сделать что-то вроде этого fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)

Используйте strace, чтобы увидеть, какие функции вызывает ifconfig.

person Daniel Băluţă    schedule 15.06.2010
comment
Этот конкретный ioctl() не заботится о семействе или даже о том, привязан ли сокет к рассматриваемому интерфейсу. - person Tim Post♦; 15.06.2010
comment
Вы правы, но этот вызов используется ifconfig eth0 ‹ip› для установки IP-адреса на eth0. - person Daniel Băluţă; 15.06.2010
comment
Я думаю, вы имели в виду, какие функции вызывает ifconfig? Тем не менее, любой открытый сокет будет работать. «Магия» указана по адресу инициализированной структуры ifreq, переданной ядру через ioctl(). - person Tim Post♦; 15.06.2010
comment
Так должен ли fd быть действительным? Могу ли я просто использовать 1 в качестве первого параметра? - person Terminal; 15.06.2010
comment
@Terminal: Да, fd должен быть допустимым дескриптором файла для открытого сокета. Это делается для того, чтобы ядро ​​знало, что нужно передать ваш ioctl() реализации сокета ioctl(), а не какой-либо из множества других реализаций ioctl() для других типов файлов. - person caf; 16.06.2010