Мне нужно настроить сетевое устройство в 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?