libnl 'недопустимый аргумент (-22) при попытке использовать nl80211

Я попытался расширить утилиту iw, чтобы она позволяла устанавливать максимальный и минимальный размер окна конкуренции 802.11. Но я всегда получаю «недопустимый аргумент (-22)».

Я отредактировал phy.c исходного кода iw-3.15 и добавил

static int handle_txq(struct nl80211_state *state,
            struct nl_cb *cb,
            struct nl_msg *msg,
            int argc, char **argv,
            enum id_input id)
{
    unsigned int cw_min, cw_max;
    printf("HANDLE TXQ");
    if (argc != 2)
        return 1;

    cw_min = atoi(argv[0]);
    cw_max = atoi(argv[1]);

    printf("setting contention window to: %d - %d\n",cw_min,cw_max);

    //create nested txq array

    struct nlattr *nested;

    nested = nla_nest_start(msg,NL80211_ATTR_WIPHY_TXQ_PARAMS);

    NLA_PUT_U16(msg,NL80211_TXQ_ATTR_CWMIN,cw_min);
    NLA_PUT_U16(msg,NL80211_TXQ_ATTR_CWMAX,cw_max);

    nla_nest_end(msg,nested);

    return 0;
 nla_put_failure:
    return -ENOBUFS;
}
COMMAND(set, txq, "<cw_min> <cw_max>",
    NL80211_CMD_SET_WIPHY, 0, CIB_NETDEV, handle_txq,
    "Set contention window minimum and maximum size.\n"
    "Valid values: 1 - 32767 in the form 2^n-1");

COMMAND(set, txq, "<cw_min> <cw_max>",
    NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_txq,
    "Set contention window minimum and maximum size.\n"
    "Valid values: 1 - 32767 in the form 2^n-1");

Я не смог найти никакой хорошей документации по nl80211 или его использованию через netlink, кроме самого заголовочного файла. Я не уверен, что я создаю вложенное сообщение в соответствии со спецификацией, и использование U16 для атрибутов является обоснованным предположением (это uint_16 в соответствующем cfg80211).

Насколько я понимаю netlink, моя сборка сообщения должна быть правильной, но, поскольку я получаю сообщение об ошибке, я, вероятно, ошибаюсь... Есть ли у кого-нибудь хорошая документация по nl80211 и его использованию? Может ли кто-нибудь обнаружить мою проблему?


person trichner    schedule 18.06.2014    source источник


Ответы (1)


Из кода ядра на другом конце сокета netlink (в linux/net/wireless/nl80211.c — я использую 3.13.0-30) кажется, что есть несколько причин, по которым вы можете получить «недопустимый аргумент» ( -EINVAL) ответ.

Во-первых, вам нужно дать ему действительный интерфейс, и устройство должно быть в режиме AP или P2P_GO. Вам также необходимо предоставить все параметры TXQ, а не только значения окон конкуренции. См. функции nl80211_set_wiphy() и parse_txq_params() в nl80211.c, если вы хотите увидеть, как именно обрабатывается ваше сообщение.

Похоже, вы используете правильные типы для параметров: NL80211_TXQ_ATTR_QUEUE/NL80211_TXQ_ATTR_AC (в зависимости от версии) и NL80211_TXQ_ATTR_AIFS — это u8, а остальные три (NL80211_TXQ_ATTR_TXOP, NL80211_TXQ_ATTR_CWMIN и NL80211_CWQ_ATTR) — uMAX.

person lemnisca    schedule 24.07.2014