1/*
2 * mac80211 configuration hooks for cfg80211
3 *
4 * Copyright 2006	Johannes Berg <johannes@sipsolutions.net>
5 *
6 * This file is GPLv2 as found in COPYING.
7 */
8
9#include <linux/nl80211.h>
10#include <linux/rtnetlink.h>
11#include <net/cfg80211.h>
12#include "ieee80211_i.h"
13#include "ieee80211_cfg.h"
14
15static int ieee80211_add_iface(struct wiphy *wiphy, char *name,
16			       unsigned int type)
17{
18	struct ieee80211_local *local = wiphy_priv(wiphy);
19	int itype;
20
21	if (unlikely(local->reg_state != IEEE80211_DEV_REGISTERED))
22		return -ENODEV;
23
24	switch (type) {
25	case NL80211_IFTYPE_UNSPECIFIED:
26		itype = IEEE80211_IF_TYPE_STA;
27		break;
28	case NL80211_IFTYPE_ADHOC:
29		itype = IEEE80211_IF_TYPE_IBSS;
30		break;
31	case NL80211_IFTYPE_STATION:
32		itype = IEEE80211_IF_TYPE_STA;
33		break;
34	case NL80211_IFTYPE_MONITOR:
35		itype = IEEE80211_IF_TYPE_MNTR;
36		break;
37	default:
38		return -EINVAL;
39	}
40
41	return ieee80211_if_add(local->mdev, name, NULL, itype);
42}
43
44static int ieee80211_del_iface(struct wiphy *wiphy, int ifindex)
45{
46	struct ieee80211_local *local = wiphy_priv(wiphy);
47	struct net_device *dev;
48	char *name;
49
50	if (unlikely(local->reg_state != IEEE80211_DEV_REGISTERED))
51		return -ENODEV;
52
53	dev = dev_get_by_index(ifindex);
54	if (!dev)
55		return 0;
56
57	name = dev->name;
58	dev_put(dev);
59
60	return ieee80211_if_remove(local->mdev, name, -1);
61}
62
63struct cfg80211_ops mac80211_config_ops = {
64	.add_virtual_intf = ieee80211_add_iface,
65	.del_virtual_intf = ieee80211_del_iface,
66};
67