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 之後版本 上執行.
之前範例, 如果在 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 舉起
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; |
} |
… |
} |
留言
張貼留言