C:Linux内核 - 如何利用工会的变量场阵列(U8变量[0])的结构ieee80211_mgmt?

问题描述 投票:0回答:1

在文件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模块分配的,我想这样做只是插入一个新的字段(未在静态结构列出)。

我没有发现过的内核树中的任何类似的代码作为例子来使用。我很感谢你能提供给我更好地理解它的任何点。非常感谢你!

c linux-kernel device-driver
1个回答
2
投票

允许一结构以具有一个长度为零数组作为它的最后构件是a GCC extension具有基本上相同的语义作为标准flexible array member。该构件是由名称和根据阵列,像任何其他的元素类型可访问的,并且可能会访问一样多的元素的结构允许的实际分配的大小。例如,对于mgmt_hdr->u.assoc_req.variable[i]在允许范围内i

当然,知道你能有多少数据访问所需要么某处依靠存储长度还是要靠数据本身,如终止/哨兵的一些特征。如果你希望延长就地数组,那么你可能是出于运气,如果你不知道有多少空间分配的,那么你肯定是。在这种情况下,你唯一可行的选择是重新分配整个物体越大,并更换所有的指针到原来的指针到新的一个。如果你不能肯定这样做,然后扩展阵列是不是一个选择,但你仍然可以修改现有的内容,如果你能说出它的结束。

© www.soinside.com 2019 - 2024. All rights reserved.