nl802154.c (ce93b9378c306e6bcc4e0bd817acf4195b4a0288) nl802154.c (83fcf26b00d77e4a0ec920524fe85350a27e9c05)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 *
4 * Authors:
5 * Alexander Aring <aar@pengutronix.de>
6 *
7 * Based on: net/wireless/nl80211.c
8 */

--- 221 unchanged lines hidden (view full) ---

230 [NL802154_ATTR_SCAN_DURATION] =
231 NLA_POLICY_MAX(NLA_U8, IEEE802154_MAX_SCAN_DURATION),
232 [NL802154_ATTR_SCAN_DONE_REASON] =
233 NLA_POLICY_RANGE(NLA_U8, NL802154_SCAN_DONE_REASON_FINISHED,
234 NL802154_SCAN_DONE_REASON_ABORTED),
235 [NL802154_ATTR_BEACON_INTERVAL] =
236 NLA_POLICY_MAX(NLA_U8, IEEE802154_ACTIVE_SCAN_DURATION),
237 [NL802154_ATTR_MAX_ASSOCIATIONS] = { .type = NLA_U32 },
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 *
4 * Authors:
5 * Alexander Aring <aar@pengutronix.de>
6 *
7 * Based on: net/wireless/nl80211.c
8 */

--- 221 unchanged lines hidden (view full) ---

230 [NL802154_ATTR_SCAN_DURATION] =
231 NLA_POLICY_MAX(NLA_U8, IEEE802154_MAX_SCAN_DURATION),
232 [NL802154_ATTR_SCAN_DONE_REASON] =
233 NLA_POLICY_RANGE(NLA_U8, NL802154_SCAN_DONE_REASON_FINISHED,
234 NL802154_SCAN_DONE_REASON_ABORTED),
235 [NL802154_ATTR_BEACON_INTERVAL] =
236 NLA_POLICY_MAX(NLA_U8, IEEE802154_ACTIVE_SCAN_DURATION),
237 [NL802154_ATTR_MAX_ASSOCIATIONS] = { .type = NLA_U32 },
238 [NL802154_ATTR_PEER] = { .type = NLA_NESTED },
238
239#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
240 [NL802154_ATTR_SEC_ENABLED] = { .type = NLA_U8, },
241 [NL802154_ATTR_SEC_OUT_LEVEL] = { .type = NLA_U32, },
242 [NL802154_ATTR_SEC_OUT_KEY_ID] = { .type = NLA_NESTED, },
243 [NL802154_ATTR_SEC_FRAME_COUNTER] = { .type = NLA_U32 },
244
245 [NL802154_ATTR_SEC_LEVEL] = { .type = NLA_NESTED },
246 [NL802154_ATTR_SEC_DEVICE] = { .type = NLA_NESTED },
247 [NL802154_ATTR_SEC_DEVKEY] = { .type = NLA_NESTED },
248 [NL802154_ATTR_SEC_KEY] = { .type = NLA_NESTED },
249#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
250};
251
239
240#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
241 [NL802154_ATTR_SEC_ENABLED] = { .type = NLA_U8, },
242 [NL802154_ATTR_SEC_OUT_LEVEL] = { .type = NLA_U32, },
243 [NL802154_ATTR_SEC_OUT_KEY_ID] = { .type = NLA_NESTED, },
244 [NL802154_ATTR_SEC_FRAME_COUNTER] = { .type = NLA_U32 },
245
246 [NL802154_ATTR_SEC_LEVEL] = { .type = NLA_NESTED },
247 [NL802154_ATTR_SEC_DEVICE] = { .type = NLA_NESTED },
248 [NL802154_ATTR_SEC_DEVKEY] = { .type = NLA_NESTED },
249 [NL802154_ATTR_SEC_KEY] = { .type = NLA_NESTED },
250#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
251};
252
252#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
253static int
254nl802154_prepare_wpan_dev_dump(struct sk_buff *skb,
255 struct netlink_callback *cb,
256 struct cfg802154_registered_device **rdev,
257 struct wpan_dev **wpan_dev)
258{
259 const struct genl_dumpit_info *info = genl_dumpit_info(cb);
260 int err;

--- 42 unchanged lines hidden (view full) ---

303 return err;
304}
305
306static void
307nl802154_finish_wpan_dev_dump(struct cfg802154_registered_device *rdev)
308{
309 rtnl_unlock();
310}
253static int
254nl802154_prepare_wpan_dev_dump(struct sk_buff *skb,
255 struct netlink_callback *cb,
256 struct cfg802154_registered_device **rdev,
257 struct wpan_dev **wpan_dev)
258{
259 const struct genl_dumpit_info *info = genl_dumpit_info(cb);
260 int err;

--- 42 unchanged lines hidden (view full) ---

303 return err;
304}
305
306static void
307nl802154_finish_wpan_dev_dump(struct cfg802154_registered_device *rdev)
308{
309 rtnl_unlock();
310}
311#endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
312
313/* message building helper */
314static inline void *nl802154hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
315 int flags, u8 cmd)
316{
317 /* since there is no private header just add the generic one */
318 return genlmsg_put(skb, portid, seq, &nl802154_fam, flags, cmd);
319}

--- 1392 unchanged lines hidden (view full) ---

1712
1713 mutex_lock(&wpan_dev->association_lock);
1714 cfg802154_set_max_associations(wpan_dev, max_assoc);
1715 mutex_unlock(&wpan_dev->association_lock);
1716
1717 return 0;
1718}
1719
311
312/* message building helper */
313static inline void *nl802154hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
314 int flags, u8 cmd)
315{
316 /* since there is no private header just add the generic one */
317 return genlmsg_put(skb, portid, seq, &nl802154_fam, flags, cmd);
318}

--- 1392 unchanged lines hidden (view full) ---

1711
1712 mutex_lock(&wpan_dev->association_lock);
1713 cfg802154_set_max_associations(wpan_dev, max_assoc);
1714 mutex_unlock(&wpan_dev->association_lock);
1715
1716 return 0;
1717}
1718
1719static int nl802154_send_peer_info(struct sk_buff *msg,
1720 struct netlink_callback *cb,
1721 u32 seq, int flags,
1722 struct cfg802154_registered_device *rdev,
1723 struct wpan_dev *wpan_dev,
1724 struct ieee802154_pan_device *peer,
1725 enum nl802154_peer_type type)
1726{
1727 struct nlattr *nla;
1728 void *hdr;
1729
1730 ASSERT_RTNL();
1731
1732 hdr = nl802154hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
1733 NL802154_CMD_LIST_ASSOCIATIONS);
1734 if (!hdr)
1735 return -ENOBUFS;
1736
1737 genl_dump_check_consistent(cb, hdr);
1738
1739 nla = nla_nest_start_noflag(msg, NL802154_ATTR_PEER);
1740 if (!nla)
1741 goto nla_put_failure;
1742
1743 if (nla_put_u8(msg, NL802154_DEV_ADDR_ATTR_PEER_TYPE, type))
1744 goto nla_put_failure;
1745
1746 if (nla_put_u8(msg, NL802154_DEV_ADDR_ATTR_MODE, peer->mode))
1747 goto nla_put_failure;
1748
1749 if (nla_put(msg, NL802154_DEV_ADDR_ATTR_SHORT,
1750 IEEE802154_SHORT_ADDR_LEN, &peer->short_addr))
1751 goto nla_put_failure;
1752
1753 if (nla_put(msg, NL802154_DEV_ADDR_ATTR_EXTENDED,
1754 IEEE802154_EXTENDED_ADDR_LEN, &peer->extended_addr))
1755 goto nla_put_failure;
1756
1757 nla_nest_end(msg, nla);
1758
1759 genlmsg_end(msg, hdr);
1760
1761 return 0;
1762
1763 nla_put_failure:
1764 genlmsg_cancel(msg, hdr);
1765 return -EMSGSIZE;
1766}
1767
1768static int nl802154_list_associations(struct sk_buff *skb,
1769 struct netlink_callback *cb)
1770{
1771 struct cfg802154_registered_device *rdev;
1772 struct ieee802154_pan_device *child;
1773 struct wpan_dev *wpan_dev;
1774 int err;
1775
1776 err = nl802154_prepare_wpan_dev_dump(skb, cb, &rdev, &wpan_dev);
1777 if (err)
1778 return err;
1779
1780 mutex_lock(&wpan_dev->association_lock);
1781
1782 if (cb->args[2])
1783 goto out;
1784
1785 if (wpan_dev->parent) {
1786 err = nl802154_send_peer_info(skb, cb, cb->nlh->nlmsg_seq,
1787 NLM_F_MULTI, rdev, wpan_dev,
1788 wpan_dev->parent,
1789 NL802154_PEER_TYPE_PARENT);
1790 if (err < 0)
1791 goto out_err;
1792 }
1793
1794 list_for_each_entry(child, &wpan_dev->children, node) {
1795 err = nl802154_send_peer_info(skb, cb, cb->nlh->nlmsg_seq,
1796 NLM_F_MULTI, rdev, wpan_dev,
1797 child,
1798 NL802154_PEER_TYPE_CHILD);
1799 if (err < 0)
1800 goto out_err;
1801 }
1802
1803 cb->args[2] = 1;
1804out:
1805 err = skb->len;
1806out_err:
1807 mutex_unlock(&wpan_dev->association_lock);
1808
1809 nl802154_finish_wpan_dev_dump(rdev);
1810
1811 return err;
1812}
1813
1720#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
1721static const struct nla_policy nl802154_dev_addr_policy[NL802154_DEV_ADDR_ATTR_MAX + 1] = {
1722 [NL802154_DEV_ADDR_ATTR_PAN_ID] = { .type = NLA_U16 },
1723 [NL802154_DEV_ADDR_ATTR_MODE] = { .type = NLA_U32 },
1724 [NL802154_DEV_ADDR_ATTR_SHORT] = { .type = NLA_U16 },
1725 [NL802154_DEV_ADDR_ATTR_EXTENDED] = { .type = NLA_U64 },
1726};
1727

--- 1128 unchanged lines hidden (view full) ---

2856 },
2857 {
2858 .cmd = NL802154_CMD_SET_MAX_ASSOCIATIONS,
2859 .doit = nl802154_set_max_associations,
2860 .flags = GENL_ADMIN_PERM,
2861 .internal_flags = NL802154_FLAG_NEED_NETDEV |
2862 NL802154_FLAG_NEED_RTNL,
2863 },
1814#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
1815static const struct nla_policy nl802154_dev_addr_policy[NL802154_DEV_ADDR_ATTR_MAX + 1] = {
1816 [NL802154_DEV_ADDR_ATTR_PAN_ID] = { .type = NLA_U16 },
1817 [NL802154_DEV_ADDR_ATTR_MODE] = { .type = NLA_U32 },
1818 [NL802154_DEV_ADDR_ATTR_SHORT] = { .type = NLA_U16 },
1819 [NL802154_DEV_ADDR_ATTR_EXTENDED] = { .type = NLA_U64 },
1820};
1821

--- 1128 unchanged lines hidden (view full) ---

2950 },
2951 {
2952 .cmd = NL802154_CMD_SET_MAX_ASSOCIATIONS,
2953 .doit = nl802154_set_max_associations,
2954 .flags = GENL_ADMIN_PERM,
2955 .internal_flags = NL802154_FLAG_NEED_NETDEV |
2956 NL802154_FLAG_NEED_RTNL,
2957 },
2958 {
2959 .cmd = NL802154_CMD_LIST_ASSOCIATIONS,
2960 .dumpit = nl802154_list_associations,
2961 /* can be retrieved by unprivileged users */
2962 },
2864#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
2865 {
2866 .cmd = NL802154_CMD_SET_SEC_PARAMS,
2867 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
2868 .doit = nl802154_set_llsec_params,
2869 .flags = GENL_ADMIN_PERM,
2870 .internal_flags = NL802154_FLAG_NEED_NETDEV |
2871 NL802154_FLAG_NEED_RTNL,

--- 138 unchanged lines hidden ---
2963#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
2964 {
2965 .cmd = NL802154_CMD_SET_SEC_PARAMS,
2966 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
2967 .doit = nl802154_set_llsec_params,
2968 .flags = GENL_ADMIN_PERM,
2969 .internal_flags = NL802154_FLAG_NEED_NETDEV |
2970 NL802154_FLAG_NEED_RTNL,

--- 138 unchanged lines hidden ---