Re: [PATCH bluetooth-next 1/2] mac802154: iface: check concurrent ifaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Alex,

> This patch adds a check for concurrent interfaces while calling
> interface up. This avoids to have different mac parameters on one phy.
> Otherwise it could be that a interface can overwrite current phy mac
> settings which is set by an another interface.
> 
> Signed-off-by: Alexander Aring <alex.aring@xxxxxxxxx>
> ---
> net/mac802154/iface.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
> 
> diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c
> index 9ae8930..509621a 100644
> --- a/net/mac802154/iface.c
> +++ b/net/mac802154/iface.c
> @@ -175,6 +175,79 @@ err:
> 	return res;
> }
> 
> +static int
> +ieee802154_check_mac_settings(struct ieee802154_local *local,
> +			      struct wpan_dev *wpan_dev,
> +			      struct wpan_dev *nwpan_dev)
> +{
> +	ASSERT_RTNL();
> +
> +	if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) {
> +		if (wpan_dev->promiscuous_mode != nwpan_dev->promiscuous_mode)
> +			return -EBUSY;
> +	}
> +
> +	if (local->hw.flags & IEEE802154_HW_AFILT) {
> +		if (wpan_dev->pan_id != nwpan_dev->pan_id)
> +			return -EBUSY;
> +
> +		if (wpan_dev->short_addr != nwpan_dev->short_addr)
> +			return -EBUSY;
> +
> +		if (wpan_dev->extended_addr != nwpan_dev->extended_addr)
> +			return -EBUSY;
> +	}
> +
> +	if (local->hw.flags & IEEE802154_HW_CSMA_PARAMS) {
> +		if (wpan_dev->min_be != nwpan_dev->min_be)
> +			return -EBUSY;
> +
> +		if (wpan_dev->max_be != nwpan_dev->max_be)
> +			return -EBUSY;
> +
> +		if (wpan_dev->csma_retries != nwpan_dev->csma_retries)
> +			return -EBUSY;
> +	}
> +
> +	if (local->hw.flags & IEEE802154_HW_FRAME_RETRIES) {
> +		if (wpan_dev->frame_retries != nwpan_dev->frame_retries)
> +			return -EBUSY;
> +	}
> +
> +	if (local->hw.flags & IEEE802154_HW_LBT) {
> +		if (wpan_dev->lbt != nwpan_dev->lbt)
> +			return -EBUSY;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +ieee802154_check_concurrent_iface(struct ieee802154_sub_if_data *sdata,
> +				  enum nl802154_iftype iftype)
> +{
> +	struct ieee802154_local *local = sdata->local;
> +	struct wpan_dev *wpan_dev = &sdata->wpan_dev;
> +	struct ieee802154_sub_if_data *nsdata;
> +
> +	/* we hold the RTNL here so can safely walk the list */
> +	list_for_each_entry(nsdata, &local->interfaces, list) {
> +		if (nsdata != sdata && ieee802154_sdata_running(nsdata)) {
> +			int ret;
> +			/* check all phy mac sublayer settings are the same.
> +			 * We have only one phy, different values makes trouble.
> +			 */
> +

I think this empty line was meant to be above the comment. So that the variable declaration is separated from the code.

> +			ret = ieee802154_check_mac_settings(local, wpan_dev,
> +							    &nsdata->wpan_dev);
> +			if (ret < 0)
> +				return ret;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> static int mac802154_wpan_open(struct net_device *dev)
> {
> 	int rc;
> @@ -183,6 +256,10 @@ static int mac802154_wpan_open(struct net_device *dev)
> 	struct wpan_dev *wpan_dev = &sdata->wpan_dev;
> 	struct wpan_phy *phy = sdata->local->phy;
> 
> +	rc = ieee802154_check_concurrent_iface(sdata, sdata->vif.type);
> +	if (rc < 0)
> +		return rc;
> +
> 	rc = mac802154_slave_open(dev);
> 	if (rc < 0)
> 		return rc;

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-wpan" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux