|
@@ -230,6 +230,8 @@ static const struct nla_policy nl802154_policy[NL802154_ATTR_MAX+1] = {
|
|
|
[NL802154_ATTR_WPAN_PHY_CAPS] = { .type = NLA_NESTED },
|
|
|
|
|
|
[NL802154_ATTR_SUPPORTED_COMMANDS] = { .type = NLA_NESTED },
|
|
|
+
|
|
|
+ [NL802154_ATTR_ACKREQ_DEFAULT] = { .type = NLA_U8 },
|
|
|
};
|
|
|
|
|
|
/* message building helper */
|
|
@@ -458,6 +460,7 @@ static int nl802154_send_wpan_phy(struct cfg802154_registered_device *rdev,
|
|
|
CMD(set_max_csma_backoffs, SET_MAX_CSMA_BACKOFFS);
|
|
|
CMD(set_max_frame_retries, SET_MAX_FRAME_RETRIES);
|
|
|
CMD(set_lbt_mode, SET_LBT_MODE);
|
|
|
+ CMD(set_ackreq_default, SET_ACKREQ_DEFAULT);
|
|
|
|
|
|
if (rdev->wpan_phy.flags & WPAN_PHY_FLAG_TXPOWER)
|
|
|
CMD(set_tx_power, SET_TX_POWER);
|
|
@@ -656,6 +659,10 @@ nl802154_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
|
|
|
if (nla_put_u8(msg, NL802154_ATTR_LBT_MODE, wpan_dev->lbt))
|
|
|
goto nla_put_failure;
|
|
|
|
|
|
+ /* ackreq default behaviour */
|
|
|
+ if (nla_put_u8(msg, NL802154_ATTR_ACKREQ_DEFAULT, wpan_dev->ackreq))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
genlmsg_end(msg, hdr);
|
|
|
return 0;
|
|
|
|
|
@@ -1042,6 +1049,24 @@ static int nl802154_set_lbt_mode(struct sk_buff *skb, struct genl_info *info)
|
|
|
return rdev_set_lbt_mode(rdev, wpan_dev, mode);
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+nl802154_set_ackreq_default(struct sk_buff *skb, struct genl_info *info)
|
|
|
+{
|
|
|
+ struct cfg802154_registered_device *rdev = info->user_ptr[0];
|
|
|
+ struct net_device *dev = info->user_ptr[1];
|
|
|
+ struct wpan_dev *wpan_dev = dev->ieee802154_ptr;
|
|
|
+ bool ackreq;
|
|
|
+
|
|
|
+ if (netif_running(dev))
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ if (!info->attrs[NL802154_ATTR_ACKREQ_DEFAULT])
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ackreq = !!nla_get_u8(info->attrs[NL802154_ATTR_ACKREQ_DEFAULT]);
|
|
|
+ return rdev_set_ackreq_default(rdev, wpan_dev, ackreq);
|
|
|
+}
|
|
|
+
|
|
|
#define NL802154_FLAG_NEED_WPAN_PHY 0x01
|
|
|
#define NL802154_FLAG_NEED_NETDEV 0x02
|
|
|
#define NL802154_FLAG_NEED_RTNL 0x04
|
|
@@ -1248,6 +1273,14 @@ static const struct genl_ops nl802154_ops[] = {
|
|
|
.internal_flags = NL802154_FLAG_NEED_NETDEV |
|
|
|
NL802154_FLAG_NEED_RTNL,
|
|
|
},
|
|
|
+ {
|
|
|
+ .cmd = NL802154_CMD_SET_ACKREQ_DEFAULT,
|
|
|
+ .doit = nl802154_set_ackreq_default,
|
|
|
+ .policy = nl802154_policy,
|
|
|
+ .flags = GENL_ADMIN_PERM,
|
|
|
+ .internal_flags = NL802154_FLAG_NEED_NETDEV |
|
|
|
+ NL802154_FLAG_NEED_RTNL,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
/* initialisation/exit functions */
|