diff options
author | Alexander Aring <alex.aring@gmail.com> | 2014-11-11 21:36:59 -0500 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2014-11-11 23:10:40 -0500 |
commit | 656a999e8701c1e3d17040f051d3a080ec6c710c (patch) | |
tree | a20af2f92a05c2ab17410be17c3b563fd6f72afb /net | |
parent | 9830c62a0b3d57d9d00880989cfe987f581bc03f (diff) |
ieee820154: add backoff exponent setting support
This patch adds support for setting backoff exponents via nl802154
framework.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/ieee802154/nl802154.c | 34 | ||||
-rw-r--r-- | net/ieee802154/rdev-ops.h | 9 | ||||
-rw-r--r-- | net/mac802154/cfg.c | 18 |
3 files changed, 61 insertions, 0 deletions
diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c index 2978c1a78017..d1cf3021ff36 100644 --- a/net/ieee802154/nl802154.c +++ b/net/ieee802154/nl802154.c | |||
@@ -616,6 +616,32 @@ static int nl802154_set_short_addr(struct sk_buff *skb, struct genl_info *info) | |||
616 | return rdev_set_short_addr(rdev, wpan_dev, short_addr); | 616 | return rdev_set_short_addr(rdev, wpan_dev, short_addr); |
617 | } | 617 | } |
618 | 618 | ||
619 | static int | ||
620 | nl802154_set_backoff_exponent(struct sk_buff *skb, struct genl_info *info) | ||
621 | { | ||
622 | struct cfg802154_registered_device *rdev = info->user_ptr[0]; | ||
623 | struct net_device *dev = info->user_ptr[1]; | ||
624 | struct wpan_dev *wpan_dev = dev->ieee802154_ptr; | ||
625 | u8 min_be, max_be; | ||
626 | |||
627 | /* should be set on netif open inside phy settings */ | ||
628 | if (netif_running(dev)) | ||
629 | return -EBUSY; | ||
630 | |||
631 | if (!info->attrs[NL802154_ATTR_MIN_BE] || | ||
632 | !info->attrs[NL802154_ATTR_MAX_BE]) | ||
633 | return -EINVAL; | ||
634 | |||
635 | min_be = nla_get_u8(info->attrs[NL802154_ATTR_MIN_BE]); | ||
636 | max_be = nla_get_u8(info->attrs[NL802154_ATTR_MAX_BE]); | ||
637 | |||
638 | /* check 802.15.4 constraints */ | ||
639 | if (max_be < 3 || max_be > 8 || min_be > max_be) | ||
640 | return -EINVAL; | ||
641 | |||
642 | return rdev_set_backoff_exponent(rdev, wpan_dev, min_be, max_be); | ||
643 | } | ||
644 | |||
619 | #define NL802154_FLAG_NEED_WPAN_PHY 0x01 | 645 | #define NL802154_FLAG_NEED_WPAN_PHY 0x01 |
620 | #define NL802154_FLAG_NEED_NETDEV 0x02 | 646 | #define NL802154_FLAG_NEED_NETDEV 0x02 |
621 | #define NL802154_FLAG_NEED_RTNL 0x04 | 647 | #define NL802154_FLAG_NEED_RTNL 0x04 |
@@ -750,6 +776,14 @@ static const struct genl_ops nl802154_ops[] = { | |||
750 | .internal_flags = NL802154_FLAG_NEED_NETDEV | | 776 | .internal_flags = NL802154_FLAG_NEED_NETDEV | |
751 | NL802154_FLAG_NEED_RTNL, | 777 | NL802154_FLAG_NEED_RTNL, |
752 | }, | 778 | }, |
779 | { | ||
780 | .cmd = NL802154_CMD_SET_BACKOFF_EXPONENT, | ||
781 | .doit = nl802154_set_backoff_exponent, | ||
782 | .policy = nl802154_policy, | ||
783 | .flags = GENL_ADMIN_PERM, | ||
784 | .internal_flags = NL802154_FLAG_NEED_NETDEV | | ||
785 | NL802154_FLAG_NEED_RTNL, | ||
786 | }, | ||
753 | }; | 787 | }; |
754 | 788 | ||
755 | /* initialisation/exit functions */ | 789 | /* initialisation/exit functions */ |
diff --git a/net/ieee802154/rdev-ops.h b/net/ieee802154/rdev-ops.h index 16b0de06c3af..dbccfa9383fd 100644 --- a/net/ieee802154/rdev-ops.h +++ b/net/ieee802154/rdev-ops.h | |||
@@ -41,4 +41,13 @@ rdev_set_short_addr(struct cfg802154_registered_device *rdev, | |||
41 | return rdev->ops->set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr); | 41 | return rdev->ops->set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr); |
42 | } | 42 | } |
43 | 43 | ||
44 | static inline int | ||
45 | rdev_set_backoff_exponent(struct cfg802154_registered_device *rdev, | ||
46 | struct wpan_dev *wpan_dev, const u8 min_be, | ||
47 | const u8 max_be) | ||
48 | { | ||
49 | return rdev->ops->set_backoff_exponent(&rdev->wpan_phy, wpan_dev, | ||
50 | min_be, max_be); | ||
51 | } | ||
52 | |||
44 | #endif /* __CFG802154_RDEV_OPS */ | 53 | #endif /* __CFG802154_RDEV_OPS */ |
diff --git a/net/mac802154/cfg.c b/net/mac802154/cfg.c index df29976d1321..67c96f981693 100644 --- a/net/mac802154/cfg.c +++ b/net/mac802154/cfg.c | |||
@@ -84,6 +84,23 @@ static int ieee802154_set_pan_id(struct wpan_phy *wpan_phy, | |||
84 | } | 84 | } |
85 | 85 | ||
86 | static int | 86 | static int |
87 | ieee802154_set_backoff_exponent(struct wpan_phy *wpan_phy, | ||
88 | struct wpan_dev *wpan_dev, | ||
89 | const u8 min_be, const u8 max_be) | ||
90 | { | ||
91 | struct ieee802154_local *local = wpan_phy_priv(wpan_phy); | ||
92 | |||
93 | ASSERT_RTNL(); | ||
94 | |||
95 | if (!(local->hw.flags & IEEE802154_HW_CSMA_PARAMS)) | ||
96 | return -EOPNOTSUPP; | ||
97 | |||
98 | wpan_dev->min_be = min_be; | ||
99 | wpan_dev->max_be = max_be; | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | static int | ||
87 | ieee802154_set_short_addr(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, | 104 | ieee802154_set_short_addr(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, |
88 | const u16 short_addr) | 105 | const u16 short_addr) |
89 | { | 106 | { |
@@ -114,4 +131,5 @@ const struct cfg802154_ops mac802154_config_ops = { | |||
114 | .set_channel = ieee802154_set_channel, | 131 | .set_channel = ieee802154_set_channel, |
115 | .set_pan_id = ieee802154_set_pan_id, | 132 | .set_pan_id = ieee802154_set_pan_id, |
116 | .set_short_addr = ieee802154_set_short_addr, | 133 | .set_short_addr = ieee802154_set_short_addr, |
134 | .set_backoff_exponent = ieee802154_set_backoff_exponent, | ||
117 | }; | 135 | }; |