diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-11-26 17:31:40 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-12-05 09:32:58 -0500 |
commit | e60c7744f8aa77bcbcb0b294596d6c87445d1200 (patch) | |
tree | 7039c0906d825b035595a826cd117fd08242d0ad /net/wireless/wext-compat.c | |
parent | fee52678dbda2099a25243e79da98dc390e1939a (diff) |
cfg80211: handle SIOCGIWMODE/SIOCSIWMODE
further reducing wext code in mac80211.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless/wext-compat.c')
-rw-r--r-- | net/wireless/wext-compat.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index a5db4551a31a..58e489fd4aed 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -58,3 +58,82 @@ int cfg80211_wext_giwname(struct net_device *dev, | |||
58 | return 0; | 58 | return 0; |
59 | } | 59 | } |
60 | EXPORT_SYMBOL(cfg80211_wext_giwname); | 60 | EXPORT_SYMBOL(cfg80211_wext_giwname); |
61 | |||
62 | int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, | ||
63 | u32 *mode, char *extra) | ||
64 | { | ||
65 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
66 | struct cfg80211_registered_device *rdev; | ||
67 | struct vif_params vifparams; | ||
68 | enum nl80211_iftype type; | ||
69 | |||
70 | if (!wdev) | ||
71 | return -EOPNOTSUPP; | ||
72 | |||
73 | rdev = wiphy_to_dev(wdev->wiphy); | ||
74 | |||
75 | if (!rdev->ops->change_virtual_intf) | ||
76 | return -EOPNOTSUPP; | ||
77 | |||
78 | /* don't support changing VLANs, you just re-create them */ | ||
79 | if (wdev->iftype == NL80211_IFTYPE_AP_VLAN) | ||
80 | return -EOPNOTSUPP; | ||
81 | |||
82 | switch (*mode) { | ||
83 | case IW_MODE_INFRA: | ||
84 | type = NL80211_IFTYPE_STATION; | ||
85 | break; | ||
86 | case IW_MODE_ADHOC: | ||
87 | type = NL80211_IFTYPE_ADHOC; | ||
88 | break; | ||
89 | case IW_MODE_REPEAT: | ||
90 | type = NL80211_IFTYPE_WDS; | ||
91 | break; | ||
92 | case IW_MODE_MONITOR: | ||
93 | type = NL80211_IFTYPE_MONITOR; | ||
94 | break; | ||
95 | default: | ||
96 | return -EINVAL; | ||
97 | } | ||
98 | |||
99 | memset(&vifparams, 0, sizeof(vifparams)); | ||
100 | |||
101 | return rdev->ops->change_virtual_intf(wdev->wiphy, dev->ifindex, type, | ||
102 | NULL, &vifparams); | ||
103 | } | ||
104 | EXPORT_SYMBOL(cfg80211_wext_siwmode); | ||
105 | |||
106 | int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info, | ||
107 | u32 *mode, char *extra) | ||
108 | { | ||
109 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
110 | |||
111 | if (!wdev) | ||
112 | return -EOPNOTSUPP; | ||
113 | |||
114 | switch (wdev->iftype) { | ||
115 | case NL80211_IFTYPE_AP: | ||
116 | *mode = IW_MODE_MASTER; | ||
117 | break; | ||
118 | case NL80211_IFTYPE_STATION: | ||
119 | *mode = IW_MODE_INFRA; | ||
120 | break; | ||
121 | case NL80211_IFTYPE_ADHOC: | ||
122 | *mode = IW_MODE_ADHOC; | ||
123 | break; | ||
124 | case NL80211_IFTYPE_MONITOR: | ||
125 | *mode = IW_MODE_MONITOR; | ||
126 | break; | ||
127 | case NL80211_IFTYPE_WDS: | ||
128 | *mode = IW_MODE_REPEAT; | ||
129 | break; | ||
130 | case NL80211_IFTYPE_AP_VLAN: | ||
131 | *mode = IW_MODE_SECOND; /* FIXME */ | ||
132 | break; | ||
133 | default: | ||
134 | *mode = IW_MODE_AUTO; | ||
135 | break; | ||
136 | } | ||
137 | return 0; | ||
138 | } | ||
139 | EXPORT_SYMBOL(cfg80211_wext_giwmode); | ||