Настроить сетевое устройство с беспроводными расширениями
Мне нужно настроить сетевое устройство в C на хосте Linux для приложения. Я прочитал о netlink, libnl и nl80211, которые проходят через cfg80211 и mac80211. Позже я узнал, что драйвер для устройства, которое я использую, не поддерживает интерфейс mac80211, поэтому я не могу использовать библиотеку netlink для настройки устройства. Моя единственная оставленная опция - через беспроводные расширения, использующие ioctl. Поэтому я читал исходный код для iwconfig (iw использует netlink, а iwconfig использует wext).
Например, скажем, я пытаюсь установить канал на адаптере 80211. Команда ioctl беспроводного расширения - SIOCSIWFREQ (согласно iwconfig и драйверу моего устройства). Из того, что я прочитал, вы открываете сокет и используете ioctl со структурой 'ifreq' для настройки сетевого адаптера (см. "Man netdevice").
Дело в том, что iwconfigure определяет свою собственную структуру 'ifreq', называемую 'iwreq', которая выглядит совершенно иначе (см. Источник iwconfig, есть комментарий, который говорит, что эта структура iwreq такая же, как структура ifreq).
Структура ifreq даже не выглядит как поле для установки канала.
Поэтому мой вопрос, где в ядре находится и обрабатывается структура ifreq. Где я могу найти документацию по интерфейсу (поля в структуре).
Все команды IOCTLS определены в /usr/inlcude/linux/wireless.h
Спасибо!
Вот ифрек:
struct ifreq {
char ifr_name[IFNAMSIZ]; /* Interface name */
union {
struct sockaddr ifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmap ifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char *ifr_data;
};
};
а вот iwreq (из wireless.h в wireless-tools от HP)
union iwreq_data
{
/* Config - generic */
char name[IFNAMSIZ];
/* Name : used to verify the presence of wireless extensions.
* Name of the protocol/provider... */
struct iw_point essid; /* Extended network name */
struct iw_param nwid; /* network id (or domain - the cell) */
struct iw_freq freq; /* frequency or channel :
* 0-1000 = channel
* > 1000 = frequency in Hz */
struct iw_param sens; /* signal level threshold */
struct iw_param bitrate; /* default bit rate */
struct iw_param txpower; /* default transmit power */
struct iw_param rts; /* RTS threshold threshold */
struct iw_param frag; /* Fragmentation threshold */
__u32 mode; /* Operation mode */
struct iw_param retry; /* Retry limits & lifetime */
struct iw_point encoding; /* Encoding stuff : tokens */
struct iw_param power; /* PM duration/timeout */
struct iw_quality qual; /* Quality part of statistics */
struct sockaddr ap_addr; /* Access point address */
struct sockaddr addr; /* Destination address (hw/mac) */
struct iw_param param; /* Other small parameters */
struct iw_point data; /* Other large parameters */
};
struct iwreq
{
union
{
char ifrn_name[IFNAMSIZ]; /* if name, e.g. "eth0" */
} ifr_ifrn;
/* Data part (defined just above) */
union iwreq_data u;
};
Легко сказать, как бы вы использовали iwreq для настройки канала, поля freq, но где стандарт в структуре ifreq?
1 ответ
struct iwreq находится в linux/wireless.h, вы можете просто включить ее и использовать структуру 'iwreq'.