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