настроить сетевое устройство с беспроводными расширениями

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


person user3258845    schedule 01.07.2018    source источник
comment
Дополнительный комментарий: Драйвер устройства не поддерживает настройку частоты (и ряда других вещей) через mac80211.   -  person user3258845    schedule 01.07.2018
comment
Может этот вопрос лучше задать на Unix бирже?   -  person user3258845    schedule 01.07.2018


Ответы (1)


структура iwreq находится в linux/wireless.h, вы можете просто включить ее и использовать структуру iwreq.

person user3258845    schedule 01.07.2018