Deleted Added
full compact
ieee80211_ioctl.c (184205) ieee80211_ioctl.c (184210)
1/*-
2 * Copyright (c) 2001 Atsushi Onoe
3 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 11 unchanged lines hidden (view full) ---

20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2001 Atsushi Onoe
3 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 11 unchanged lines hidden (view full) ---

20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ioctl.c 184205 2008-10-23 15:53:51Z des $");
28__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_ioctl.c 184210 2008-10-23 19:57:13Z des $");
29
30/*
31 * IEEE 802.11 ioctl support (FreeBSD-specific)
32 */
33
34#include "opt_inet.h"
35#include "opt_ipx.h"
36#include "opt_wlan.h"

--- 278 unchanged lines hidden (view full) ---

315 if (req.space > ireq->i_len)
316 req.space = ireq->i_len;
317 if (req.space > 0) {
318 size_t space;
319 void *p;
320
321 space = req.space;
322 /* XXX M_WAITOK after driver lock released */
29
30/*
31 * IEEE 802.11 ioctl support (FreeBSD-specific)
32 */
33
34#include "opt_inet.h"
35#include "opt_ipx.h"
36#include "opt_wlan.h"

--- 278 unchanged lines hidden (view full) ---

315 if (req.space > ireq->i_len)
316 req.space = ireq->i_len;
317 if (req.space > 0) {
318 size_t space;
319 void *p;
320
321 space = req.space;
322 /* XXX M_WAITOK after driver lock released */
323 p = malloc(space, M_TEMP, M_NOWAIT | M_ZERO);
323 MALLOC(p, void *, space, M_TEMP, M_NOWAIT | M_ZERO);
324 if (p == NULL)
325 return ENOMEM;
326 req.sr = p;
327 ieee80211_scan_iterate(vap, get_scan_result, &req);
328 ireq->i_len = space - req.space;
329 error = copyout(p, ireq->i_data, ireq->i_len);
324 if (p == NULL)
325 return ENOMEM;
326 req.sr = p;
327 ieee80211_scan_iterate(vap, get_scan_result, &req);
328 ireq->i_len = space - req.space;
329 error = copyout(p, ireq->i_data, ireq->i_len);
330 free(p, M_TEMP);
330 FREE(p, M_TEMP);
331 } else
332 ireq->i_len = 0;
333
334 return error;
335}
336
337struct stainforeq {
338 struct ieee80211vap *vap;

--- 123 unchanged lines hidden (view full) ---

462 ieee80211_iterate_nodes(&ic->ic_sta, get_sta_space, &req);
463 else
464 get_sta_space(&req, ni);
465 if (req.space > ireq->i_len)
466 req.space = ireq->i_len;
467 if (req.space > 0) {
468 space = req.space;
469 /* XXX M_WAITOK after driver lock released */
331 } else
332 ireq->i_len = 0;
333
334 return error;
335}
336
337struct stainforeq {
338 struct ieee80211vap *vap;

--- 123 unchanged lines hidden (view full) ---

462 ieee80211_iterate_nodes(&ic->ic_sta, get_sta_space, &req);
463 else
464 get_sta_space(&req, ni);
465 if (req.space > ireq->i_len)
466 req.space = ireq->i_len;
467 if (req.space > 0) {
468 space = req.space;
469 /* XXX M_WAITOK after driver lock released */
470 p = malloc(space, M_TEMP, M_NOWAIT | M_ZERO);
470 MALLOC(p, void *, space, M_TEMP, M_NOWAIT | M_ZERO);
471 if (p == NULL) {
472 error = ENOMEM;
473 goto bad;
474 }
475 req.si = p;
476 if (ni == NULL)
477 ieee80211_iterate_nodes(&ic->ic_sta, get_sta_info, &req);
478 else
479 get_sta_info(&req, ni);
480 ireq->i_len = space - req.space;
481 error = copyout(p, (uint8_t *) ireq->i_data+off, ireq->i_len);
471 if (p == NULL) {
472 error = ENOMEM;
473 goto bad;
474 }
475 req.si = p;
476 if (ni == NULL)
477 ieee80211_iterate_nodes(&ic->ic_sta, get_sta_info, &req);
478 else
479 get_sta_info(&req, ni);
480 ireq->i_len = space - req.space;
481 error = copyout(p, (uint8_t *) ireq->i_data+off, ireq->i_len);
482 free(p, M_TEMP);
482 FREE(p, M_TEMP);
483 } else
484 ireq->i_len = 0;
485bad:
486 if (ni != NULL)
487 ieee80211_free_node(ni);
488 return error;
489}
490

--- 200 unchanged lines hidden (view full) ---

691 const struct ieee80211req *ireq)
692{
693 struct ieee80211_devcaps_req *dc;
694 struct ieee80211req_chaninfo *ci;
695 int error;
696
697 if (ireq->i_len != sizeof(struct ieee80211_devcaps_req))
698 return EINVAL;
483 } else
484 ireq->i_len = 0;
485bad:
486 if (ni != NULL)
487 ieee80211_free_node(ni);
488 return error;
489}
490

--- 200 unchanged lines hidden (view full) ---

691 const struct ieee80211req *ireq)
692{
693 struct ieee80211_devcaps_req *dc;
694 struct ieee80211req_chaninfo *ci;
695 int error;
696
697 if (ireq->i_len != sizeof(struct ieee80211_devcaps_req))
698 return EINVAL;
699 dc = malloc( sizeof(struct ieee80211_devcaps_req), M_TEMP, M_NOWAIT | M_ZERO);
699 MALLOC(dc, struct ieee80211_devcaps_req *,
700 sizeof(struct ieee80211_devcaps_req), M_TEMP, M_NOWAIT | M_ZERO);
700 if (dc == NULL)
701 return ENOMEM;
702 dc->dc_drivercaps = ic->ic_caps;
703 dc->dc_cryptocaps = ic->ic_cryptocaps;
704 dc->dc_htcaps = ic->ic_htcaps;
705 ci = &dc->dc_chaninfo;
706 ic->ic_getradiocaps(ic, &ci->ic_nchans, ci->ic_chans);
707 ieee80211_sort_channels(ci->ic_chans, ci->ic_nchans);
708 error = copyout(dc, ireq->i_data, sizeof(*dc));
701 if (dc == NULL)
702 return ENOMEM;
703 dc->dc_drivercaps = ic->ic_caps;
704 dc->dc_cryptocaps = ic->ic_cryptocaps;
705 dc->dc_htcaps = ic->ic_htcaps;
706 ci = &dc->dc_chaninfo;
707 ic->ic_getradiocaps(ic, &ci->ic_nchans, ci->ic_chans);
708 ieee80211_sort_channels(ci->ic_chans, ci->ic_nchans);
709 error = copyout(dc, ireq->i_data, sizeof(*dc));
709 free(dc, M_TEMP);
710 FREE(dc, M_TEMP);
710 return error;
711}
712
713static __noinline int
714ieee80211_ioctl_getstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
715{
716 struct ieee80211_node *ni;
717 struct ieee80211req_sta_vlan vlan;

--- 1269 unchanged lines hidden (view full) ---

1987ieee80211_ioctl_setregdomain(struct ieee80211vap *vap,
1988 const struct ieee80211req *ireq)
1989{
1990 struct ieee80211_regdomain_req *reg;
1991 int error;
1992
1993 if (ireq->i_len != sizeof(struct ieee80211_regdomain_req))
1994 return EINVAL;
711 return error;
712}
713
714static __noinline int
715ieee80211_ioctl_getstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
716{
717 struct ieee80211_node *ni;
718 struct ieee80211req_sta_vlan vlan;

--- 1269 unchanged lines hidden (view full) ---

1988ieee80211_ioctl_setregdomain(struct ieee80211vap *vap,
1989 const struct ieee80211req *ireq)
1990{
1991 struct ieee80211_regdomain_req *reg;
1992 int error;
1993
1994 if (ireq->i_len != sizeof(struct ieee80211_regdomain_req))
1995 return EINVAL;
1995 reg = malloc( sizeof(struct ieee80211_regdomain_req), M_TEMP, M_NOWAIT);
1996 MALLOC(reg, struct ieee80211_regdomain_req *,
1997 sizeof(struct ieee80211_regdomain_req), M_TEMP, M_NOWAIT);
1996 if (reg == NULL)
1997 return ENOMEM;
1998 error = copyin(ireq->i_data, reg, sizeof(*reg));
1999 if (error == 0)
2000 error = ieee80211_setregdomain(vap, reg);
1998 if (reg == NULL)
1999 return ENOMEM;
2000 error = copyin(ireq->i_data, reg, sizeof(*reg));
2001 if (error == 0)
2002 error = ieee80211_setregdomain(vap, reg);
2001 free(reg, M_TEMP);
2003 FREE(reg, M_TEMP);
2002
2003 return (error == 0 ? ENETRESET : error);
2004}
2005
2006static int
2007ieee80211_ioctl_setroam(struct ieee80211vap *vap,
2008 const struct ieee80211req *ireq)
2009{

--- 122 unchanged lines hidden (view full) ---

2132{
2133 struct ieee80211_appie *app = *aie;
2134 struct ieee80211_appie *napp;
2135 int error;
2136
2137 if (ireq->i_len == 0) { /* delete any existing ie */
2138 if (app != NULL) {
2139 *aie = NULL; /* XXX racey */
2004
2005 return (error == 0 ? ENETRESET : error);
2006}
2007
2008static int
2009ieee80211_ioctl_setroam(struct ieee80211vap *vap,
2010 const struct ieee80211req *ireq)
2011{

--- 122 unchanged lines hidden (view full) ---

2134{
2135 struct ieee80211_appie *app = *aie;
2136 struct ieee80211_appie *napp;
2137 int error;
2138
2139 if (ireq->i_len == 0) { /* delete any existing ie */
2140 if (app != NULL) {
2141 *aie = NULL; /* XXX racey */
2140 free(app, M_80211_NODE_IE);
2142 FREE(app, M_80211_NODE_IE);
2141 }
2142 return 0;
2143 }
2144 if (!(2 <= ireq->i_len && ireq->i_len <= IEEE80211_MAX_APPIE))
2145 return EINVAL;
2146 /*
2147 * Allocate a new appie structure and copy in the user data.
2148 * When done swap in the new structure. Note that we do not
2149 * guard against users holding a ref to the old structure;
2150 * this must be handled outside this code.
2151 *
2152 * XXX bad bad bad
2153 */
2143 }
2144 return 0;
2145 }
2146 if (!(2 <= ireq->i_len && ireq->i_len <= IEEE80211_MAX_APPIE))
2147 return EINVAL;
2148 /*
2149 * Allocate a new appie structure and copy in the user data.
2150 * When done swap in the new structure. Note that we do not
2151 * guard against users holding a ref to the old structure;
2152 * this must be handled outside this code.
2153 *
2154 * XXX bad bad bad
2155 */
2154 napp = malloc( sizeof(struct ieee80211_appie) + ireq->i_len, M_80211_NODE_IE, M_NOWAIT);
2156 MALLOC(napp, struct ieee80211_appie *,
2157 sizeof(struct ieee80211_appie) + ireq->i_len, M_80211_NODE_IE, M_NOWAIT);
2155 if (napp == NULL)
2156 return ENOMEM;
2157 /* XXX holding ic lock */
2158 error = copyin(ireq->i_data, napp->ie_data, ireq->i_len);
2159 if (error) {
2158 if (napp == NULL)
2159 return ENOMEM;
2160 /* XXX holding ic lock */
2161 error = copyin(ireq->i_data, napp->ie_data, ireq->i_len);
2162 if (error) {
2160 free(napp, M_80211_NODE_IE);
2163 FREE(napp, M_80211_NODE_IE);
2161 return error;
2162 }
2163 napp->ie_len = ireq->i_len;
2164 *aie = napp;
2165 if (app != NULL)
2164 return error;
2165 }
2166 napp->ie_len = ireq->i_len;
2167 *aie = napp;
2168 if (app != NULL)
2166 free(app, M_80211_NODE_IE);
2169 FREE(app, M_80211_NODE_IE);
2167 return 0;
2168}
2169
2170static void
2171setwparsnie(struct ieee80211vap *vap, uint8_t *ie, int space)
2172{
2173 /* validate data is present as best we can */
2174 if (space == 0 || 2+ie[1] > space)

--- 1137 unchanged lines hidden ---
2170 return 0;
2171}
2172
2173static void
2174setwparsnie(struct ieee80211vap *vap, uint8_t *ie, int space)
2175{
2176 /* validate data is present as best we can */
2177 if (space == 0 || 2+ie[1] > space)

--- 1137 unchanged lines hidden ---