Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > on/off ethernet device |
Автор: bel_nikita 20.6.2008, 12:22 |
Нужно программно включать/выключать сетевые устройства, и настраивать ip-адреса. Как реализовать и в какую сторону копать? ![]() |
Автор: W4FhLF 20.6.2008, 12:58 |
Да, интересно глянуть как у вас в никсах это реализуется. В винде есть универсальные функция для вкл/выкл любого девайса ![]() |
Автор: MAKCim 20.6.2008, 13:20 | ||
все очень просто взаимодействие с сетевым интерфейсом идет через ioctl() в качестве первого параметра в ioctl() передается дескриптор сокета (любого домена, типа и протокола) второй параметр ioctl() - одна из констант, определенных в http://www.linux-m32r.org/lxr/http/source/include/linux/sockios.h третий параметр - адрес структуры http://www.linux-m32r.org/lxr/http/source/include/linux/if.h#L155 включение и выключение сетевого интерфейса осуществляется установкой/сбросом флага http://www.linux-m32r.org/lxr/http/source/include/linux/if.h#L30 в дескрипторе сетевого интерфейса (структура http://www.linux-m32r.org/lxr/http/source/include/linux/netdevice.h#L274) командами SIOCSIFFLAGS/SIOCGIFFLAGS любой сетевой интерфейс в Linux идентифицируется символьным и целочисленным идентификаторами при вызове ioctl() в ifreq.ifr_name указывается символьный идентификатор отображение символьный идентификатор <-> целочисленный идентификатор осуществляется через команды SIOCGIFINDEX/SIOCGIFNAME вот простой пример включения сетевого интерфейса
принцип работы IFF_UP заключается в том, что код ядра осуществляет вызов функции open() драйвера сетевого контроллера, адрес которой расположен в дескрипторе сетевого интерфейса (net_device) (http://www.linux-m32r.org/lxr/http/source/include/linux/netdevice.h#L478) Добавлено через 4 минуты и 43 секунды а мне вот интересно, как у вас в окнах QoS для сетевой подсистемы реализован? (если там вообще это есть) ![]() |
Автор: MAKCim 20.6.2008, 13:39 | ||
если нет желания создавать сокет и использовать ioctl(), можно поиграться с sysfs
|
Автор: MAKCim 20.6.2008, 15:58 | ||
это сказано с иронией? ![]()
ОК существует возможность определять свои стратегии работы с исходящими пакетами? |
Автор: W4FhLF 20.6.2008, 16:23 | ||
Не, серьёзно. Подумываю перебраться.
В общем не совсем ясно, что такое стратегия работы с исходящими пакетами. Насколько я понимаю можно, иначе какой смысл ![]() |
Автор: MAKCim 20.6.2008, 16:42 | ||
смотри есть сетевой интерфейс, представленный структурой net_device для него может быть реализован QoS с помощью структуры Qdisc Qdisc инкапсулирует структуру Qdisc_ops, которая содержит адреса функций enqueue()/dequeue()/requeue() функцией ядра, которая реализует взаимодействие с драйвером сетевого контроллера является функция dev_queue_xmit() она в качестве параметра получает пакет (структура sk_buff) если в net_device определен Qdisc, то вместо вызова функции драйвера через dev_hard_start_xmit() осуществляется вызов функции enqueue() из Qdisc_ops в Qdisc и далее run_qdisc() run_qdisc() осуществляет вызов (пока возможно) dequeue() из Qdisc_ops для получения пакета и передает его драйверу через dev_hard_start_xmit() так вот, функции enqueue() и dequeue() как раз и реализуют стратегию работы с пакетами к примеру, если Qdisc реализует стратегию FIFO, то enqueue() осуществляет добавление пакета в конец очереди, а dequeue() - выбор первого пакета из начала очереди я могу реализовать свою стратегию работы, реализовав Qdisc (написав модуль) в окнах такое возможно? |
Автор: W4FhLF 20.6.2008, 17:41 |
MAKCim, твоя идея понятна. В окнах QoS это некоторая подсистема общей сетевой архитектуры, которая в юзермоде представлена набором API в дополнение к winsock2. Стратегия определяется на низком уровне планировщиком пакетов QoS(который является одним из драйверов NDIS), в юзермоде ты вправе регулировать некоторый набор параметров, который будет влиять на характер планирования пакетов, набор параметров достаточно обширен и, видимо, предусмотрена не одна стратегия. Ты создаёшь некий flow(это сущность подсистемы QoS), определяешь параметры планирования и далее "привязываешь" к этому flow сокеты, служба QoS будет уведомлена о том, что в системе появились соединения требующие обработки. Мэйби на уровне NDIS есть возможность определять свою стратегию, я таких подробностей не знаю. |
Автор: MAKCim 20.6.2008, 18:21 |
правильный выбор ![]() |
Автор: ushakofff 4.12.2009, 11:51 |
А при отключении просто ifFlags &= ~IFF_UP; да? У меня просто что то не работает :( |
Автор: MAKCim 4.12.2009, 15:29 |
ushakofff, IFF_DOWN |