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 --- |