Linux wiphy vendor command - policy

續前篇: Linux wiphy vendor command

之前範例, 如果在 Linux v5 以上執行, 會在 wiphy_register 發生 warn on.

這是因為沒有設定 policy 的關係,

對於不是 nested 的 NLA data 資料, 我們可以用

VENDOR_CMD_RAW_DATA


這樣就可以在 linux kernel v5.3 之後版本 上執行. 

但需要注意的是, 應用程式不會用到 nla_nest_start

https://android.googlesource.com/platform/external/libnl/+/refs/heads/master
struct nlattr *nla_nest_start(struct nl_msg *msg, int attrtype)
{
struct nlattr *start = (struct nlattr *) nlmsg_tail(msg->nm_nlh);
if (nla_put(msg, NLA_F_NESTED | attrtype, 0, NULL) < 0)
return NULL;

因為這會將 NLA_F_NESTED 舉起
而在 nl80211_vendor_check_policy() 中 , 若為 VENDOR_CMD_RAW_DATA,
又有舉起 NLA_F_NESTED 的話, 則會出錯.

nl80211.c
 
static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd,
                                       struct nlattr *attr,
                                       struct netlink_ext_ack *extack)
{
        if (vcmd->policy == VENDOR_CMD_RAW_DATA) {
                if (attr->nla_type & NLA_F_NESTED) {
                        NL_SET_ERR_MSG_ATTR(extack, attr,
                                            "unexpected nested data");
                        return -EINVAL;
                }
                return 0;
        }
        …
}

留言

熱門文章