aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee802154/nl802154.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ieee802154/nl802154.c')
-rw-r--r--net/ieee802154/nl802154.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c
index ccdf33ecee0b..e7224f3c1584 100644
--- a/net/ieee802154/nl802154.c
+++ b/net/ieee802154/nl802154.c
@@ -551,6 +551,32 @@ static int nl802154_get_interface(struct sk_buff *skb, struct genl_info *info)
551 return genlmsg_reply(msg, info); 551 return genlmsg_reply(msg, info);
552} 552}
553 553
554static int nl802154_new_interface(struct sk_buff *skb, struct genl_info *info)
555{
556 struct cfg802154_registered_device *rdev = info->user_ptr[0];
557 enum nl802154_iftype type = NL802154_IFTYPE_UNSPEC;
558
559 /* TODO avoid failing a new interface
560 * creation due to pending removal?
561 */
562
563 if (!info->attrs[NL802154_ATTR_IFNAME])
564 return -EINVAL;
565
566 if (info->attrs[NL802154_ATTR_IFTYPE]) {
567 type = nla_get_u32(info->attrs[NL802154_ATTR_IFTYPE]);
568 if (type > NL802154_IFTYPE_MAX)
569 return -EINVAL;
570 }
571
572 if (!rdev->ops->add_virtual_intf)
573 return -EOPNOTSUPP;
574
575 return rdev_add_virtual_intf(rdev,
576 nla_data(info->attrs[NL802154_ATTR_IFNAME]),
577 type);
578}
579
554static int nl802154_set_channel(struct sk_buff *skb, struct genl_info *info) 580static int nl802154_set_channel(struct sk_buff *skb, struct genl_info *info)
555{ 581{
556 struct cfg802154_registered_device *rdev = info->user_ptr[0]; 582 struct cfg802154_registered_device *rdev = info->user_ptr[0];
@@ -819,6 +845,14 @@ static const struct genl_ops nl802154_ops[] = {
819 NL802154_FLAG_NEED_RTNL, 845 NL802154_FLAG_NEED_RTNL,
820 }, 846 },
821 { 847 {
848 .cmd = NL802154_CMD_NEW_INTERFACE,
849 .doit = nl802154_new_interface,
850 .policy = nl802154_policy,
851 .flags = GENL_ADMIN_PERM,
852 .internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
853 NL802154_FLAG_NEED_RTNL,
854 },
855 {
822 .cmd = NL802154_CMD_SET_CHANNEL, 856 .cmd = NL802154_CMD_SET_CHANNEL,
823 .doit = nl802154_set_channel, 857 .doit = nl802154_set_channel,
824 .policy = nl802154_policy, 858 .policy = nl802154_policy,