Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c91208d8 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann
Browse files

ieee802154: add ack request default handling



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: default avatarStefan Schmidt <stefan@osg.samsung.com>
Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent fc0719e6
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -63,6 +63,8 @@ struct cfg802154_ops {
					 s8 max_frame_retries);
					 s8 max_frame_retries);
	int	(*set_lbt_mode)(struct wpan_phy *wpan_phy,
	int	(*set_lbt_mode)(struct wpan_phy *wpan_phy,
				struct wpan_dev *wpan_dev, bool mode);
				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
static inline bool
@@ -196,6 +198,9 @@ struct wpan_dev {
	bool lbt;
	bool lbt;


	bool promiscuous_mode;
	bool promiscuous_mode;

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


#define to_phy(_dev)	container_of(_dev, struct wpan_phy, dev)
#define to_phy(_dev)	container_of(_dev, struct wpan_phy, dev)
+4 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,8 @@ enum nl802154_commands {


	NL802154_CMD_SET_LBT_MODE,
	NL802154_CMD_SET_LBT_MODE,


	NL802154_CMD_SET_ACKREQ_DEFAULT,

	/* add new commands above here */
	/* add new commands above here */


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


	NL802154_ATTR_SUPPORTED_COMMANDS,
	NL802154_ATTR_SUPPORTED_COMMANDS,


	NL802154_ATTR_ACKREQ_DEFAULT,

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


	__NL802154_ATTR_AFTER_LAST,
	__NL802154_ATTR_AFTER_LAST,
+1 −1
Original line number Original line Diff line number Diff line
@@ -224,7 +224,7 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
	} else {
	} else {
		da.mode = IEEE802154_ADDR_LONG;
		da.mode = IEEE802154_ADDR_LONG;
		da.extended_addr = ieee802154_devaddr_from_raw(daddr);
		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,
	return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
+33 −0
Original line number Original line Diff line number Diff line
@@ -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_WPAN_PHY_CAPS] = { .type = NLA_NESTED },


	[NL802154_ATTR_SUPPORTED_COMMANDS] = { .type = NLA_NESTED },
	[NL802154_ATTR_SUPPORTED_COMMANDS] = { .type = NLA_NESTED },

	[NL802154_ATTR_ACKREQ_DEFAULT] = { .type = NLA_U8 },
};
};


/* message building helper */
/* 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_csma_backoffs, SET_MAX_CSMA_BACKOFFS);
	CMD(set_max_frame_retries, SET_MAX_FRAME_RETRIES);
	CMD(set_max_frame_retries, SET_MAX_FRAME_RETRIES);
	CMD(set_lbt_mode, SET_LBT_MODE);
	CMD(set_lbt_mode, SET_LBT_MODE);
	CMD(set_ackreq_default, SET_ACKREQ_DEFAULT);


	if (rdev->wpan_phy.flags & WPAN_PHY_FLAG_TXPOWER)
	if (rdev->wpan_phy.flags & WPAN_PHY_FLAG_TXPOWER)
		CMD(set_tx_power, SET_TX_POWER);
		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))
	if (nla_put_u8(msg, NL802154_ATTR_LBT_MODE, wpan_dev->lbt))
		goto nla_put_failure;
		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);
	genlmsg_end(msg, hdr);
	return 0;
	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);
	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_WPAN_PHY	0x01
#define NL802154_FLAG_NEED_NETDEV	0x02
#define NL802154_FLAG_NEED_NETDEV	0x02
#define NL802154_FLAG_NEED_RTNL		0x04
#define NL802154_FLAG_NEED_RTNL		0x04
@@ -1248,6 +1273,14 @@ static const struct genl_ops nl802154_ops[] = {
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
		.internal_flags = NL802154_FLAG_NEED_NETDEV |
				  NL802154_FLAG_NEED_RTNL,
				  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 */
/* initialisation/exit functions */
+13 −0
Original line number Original line Diff line number Diff line
@@ -195,4 +195,17 @@ rdev_set_lbt_mode(struct cfg802154_registered_device *rdev,
	return ret;
	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 */
#endif /* __CFG802154_RDEV_OPS */
Loading