Skip to content
This repository has been archived by the owner on Dec 14, 2022. It is now read-only.

Commit

Permalink
ieee802154: add ack request default handling
Browse files Browse the repository at this point in the history
This patch introduce a new mib entry which isn't part of 802.15.4 but
useful as default behaviour to set the ack request bit or not if we
don't know if the ack request bit should set. This is currently used for
stacks like IEEE 802.15.4 6LoWPAN.

Reviewed-by: Stefan Schmidt <[email protected]>
Signed-off-by: Alexander Aring <[email protected]>
Signed-off-by: Marcel Holtmann <[email protected]>
  • Loading branch information
alexaring authored and holtmann committed Aug 10, 2015
1 parent fc0719e commit c91208d
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 1 deletion.
5 changes: 5 additions & 0 deletions include/net/cfg802154.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ struct cfg802154_ops {
s8 max_frame_retries);
int (*set_lbt_mode)(struct wpan_phy *wpan_phy,
struct wpan_dev *wpan_dev, bool mode);
int (*set_ackreq_default)(struct wpan_phy *wpan_phy,
struct wpan_dev *wpan_dev, bool ackreq);
};

static inline bool
Expand Down Expand Up @@ -196,6 +198,9 @@ struct wpan_dev {
bool lbt;

bool promiscuous_mode;

/* fallback for acknowledgment bit setting */
bool ackreq;
};

#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
Expand Down
4 changes: 4 additions & 0 deletions include/net/nl802154.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ enum nl802154_commands {

NL802154_CMD_SET_LBT_MODE,

NL802154_CMD_SET_ACKREQ_DEFAULT,

/* add new commands above here */

/* used to define NL802154_CMD_MAX below */
Expand Down Expand Up @@ -104,6 +106,8 @@ enum nl802154_attrs {

NL802154_ATTR_SUPPORTED_COMMANDS,

NL802154_ATTR_ACKREQ_DEFAULT,

/* add attributes here, update the policy in nl802154.c */

__NL802154_ATTR_AFTER_LAST,
Expand Down
2 changes: 1 addition & 1 deletion net/ieee802154/6lowpan/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
} else {
da.mode = IEEE802154_ADDR_LONG;
da.extended_addr = ieee802154_devaddr_from_raw(daddr);
cb->ackreq = wpan_dev->frame_retries >= 0;
cb->ackreq = wpan_dev->ackreq;
}

return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
Expand Down
33 changes: 33 additions & 0 deletions net/ieee802154/nl802154.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */
Expand Down
13 changes: 13 additions & 0 deletions net/ieee802154/rdev-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,4 +195,17 @@ rdev_set_lbt_mode(struct cfg802154_registered_device *rdev,
return ret;
}

static inline int
rdev_set_ackreq_default(struct cfg802154_registered_device *rdev,
struct wpan_dev *wpan_dev, bool ackreq)
{
int ret;

trace_802154_rdev_set_ackreq_default(&rdev->wpan_phy, wpan_dev,
ackreq);
ret = rdev->ops->set_ackreq_default(&rdev->wpan_phy, wpan_dev, ackreq);
trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
return ret;
}

#endif /* __CFG802154_RDEV_OPS */
19 changes: 19 additions & 0 deletions net/ieee802154/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,25 @@ TRACE_EVENT(802154_rdev_set_lbt_mode,
WPAN_DEV_PR_ARG, BOOL_TO_STR(__entry->mode))
);

TRACE_EVENT(802154_rdev_set_ackreq_default,
TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev,
bool ackreq),
TP_ARGS(wpan_phy, wpan_dev, ackreq),
TP_STRUCT__entry(
WPAN_PHY_ENTRY
WPAN_DEV_ENTRY
__field(bool, ackreq)
),
TP_fast_assign(
WPAN_PHY_ASSIGN;
WPAN_DEV_ASSIGN;
__entry->ackreq = ackreq;
),
TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT
", ackreq default: %s", WPAN_PHY_PR_ARG,
WPAN_DEV_PR_ARG, BOOL_TO_STR(__entry->ackreq))
);

TRACE_EVENT(802154_rdev_return_int,
TP_PROTO(struct wpan_phy *wpan_phy, int ret),
TP_ARGS(wpan_phy, ret),
Expand Down
11 changes: 11 additions & 0 deletions net/mac802154/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,16 @@ ieee802154_set_lbt_mode(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev,
return 0;
}

static int
ieee802154_set_ackreq_default(struct wpan_phy *wpan_phy,
struct wpan_dev *wpan_dev, bool ackreq)
{
ASSERT_RTNL();

wpan_dev->ackreq = ackreq;
return 0;
}

const struct cfg802154_ops mac802154_config_ops = {
.add_virtual_intf_deprecated = ieee802154_add_iface_deprecated,
.del_virtual_intf_deprecated = ieee802154_del_iface_deprecated,
Expand All @@ -273,4 +283,5 @@ const struct cfg802154_ops mac802154_config_ops = {
.set_max_csma_backoffs = ieee802154_set_max_csma_backoffs,
.set_max_frame_retries = ieee802154_set_max_frame_retries,
.set_lbt_mode = ieee802154_set_lbt_mode,
.set_ackreq_default = ieee802154_set_ackreq_default,
};

0 comments on commit c91208d

Please sign in to comment.