C: Linux Kernel - Как использовать массив переменных поля объединения (переменная u8 [0]) в структуре ieee80211_mgmt? - PullRequest
0 голосов
/ 05 февраля 2019

В файле include/linux/ieee80211.h у нас есть:

struct ieee80211_mgmt {
        ...
    union {
                ...
        struct {
           __le16 capab_info;
           __le16 listen_interval;
            /* followed by SSID and Supported rates */
            u8 variable[0];
        } __packed assoc_req;
                ...
    } u;
} __packed __aligned(2);

Мне нужно изменить некоторые поля в этой структуре.Например, чтобы изменить capab_info, я бы сделал это следующим образом:

...
struct ieee80211_mgmt *mgmt_hdr = skb->data;
mgmt_hdr->u.assoc_req.capab_info = 0xABCD;

Но если я хочу изменить / вставить поле "SSID", которое будет локализовано где-то в массиве переменных, я не знаю, гдеи как я должен выделить и изменить его.

Приведенный выше код, я предполагаю, skb-> структура данных уже была выделена модулем mac80211, и что я хочу сделать, это просто вставить новое поле (которого нет в списке встатическая структура).

Я не нашел подобного кода в дереве ядра для использования в качестве примера.Я ценю любые моменты, которые вы можете дать мне, чтобы понять это лучше.Большое спасибо!

1 Ответ

0 голосов
/ 05 февраля 2019

Разрешение структуре иметь массив нулевой длины в качестве ее конечного элемента: расширение GCC с практически такой же семантикой, что и у стандартного гибкого элемента массива .Элемент доступен по имени и в соответствии с типом элемента массива, как и любой другой, и вы можете получить доступ к столько элементов, сколько позволяет фактический выделенный размер структуры.Например, mgmt_hdr->u.assoc_req.variable[i] для i в допустимом диапазоне.

Конечно, чтобы узнать, к какому количеству данных вы можете получить доступ, вам нужно либо полагаться на сохраненную длину где-либо, либо полагаться на некоторую характеристикусами данные, такие как терминатор / страж.Если вы надеетесь расширить массив на месте, то вам может не повезти, и если вы не знаете, сколько места было выделено, то вы, безусловно, это сделаете.В таких случаях ваша единственная жизнеспособная альтернатива - перераспределить весь объект побольше и заменить все указатели на исходный указателями на новый.Если вы не можете быть уверены в этом, то расширение массива не вариант для вас, но вы все равно можете изменить существующее содержимое, если можете сказать, где оно заканчивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...