diff options
Diffstat (limited to 'net/ieee802154/nl802154.c')
-rw-r--r-- | net/ieee802154/nl802154.c | 34 |
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 | ||
554 | static 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 | |||
554 | static int nl802154_set_channel(struct sk_buff *skb, struct genl_info *info) | 580 | static 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, |