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

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

Другие вопросы по тегам