From owner-svn-src-head@FreeBSD.ORG Thu Feb 19 05:03:11 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4C0621065670; Thu, 19 Feb 2009 05:03:11 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3A05E8FC0A; Thu, 19 Feb 2009 05:03:11 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1J53B3U084979; Thu, 19 Feb 2009 05:03:11 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1J53BrE084978; Thu, 19 Feb 2009 05:03:11 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200902190503.n1J53BrE084978@svn.freebsd.org> From: Sam Leffler Date: Thu, 19 Feb 2009 05:03:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188781 - head/sys/net80211 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Feb 2009 05:03:11 -0000 Author: sam Date: Thu Feb 19 05:03:10 2009 New Revision: 188781 URL: http://svn.freebsd.org/changeset/base/188781 Log: o looseen abi dependencies on IEEE80211_MODE_MAX by accepting smaller parameters for IEEE80211_IOC_ROAM and IEEE80211_IOC_TXPARAMS; this lets us add more modes and still have old apps work o consolidate loops to remote assumptions about mode ordering Modified: head/sys/net80211/ieee80211_ioctl.c Modified: head/sys/net80211/ieee80211_ioctl.c ============================================================================== --- head/sys/net80211/ieee80211_ioctl.c Thu Feb 19 04:52:03 2009 (r188780) +++ head/sys/net80211/ieee80211_ioctl.c Thu Feb 19 05:03:10 2009 (r188781) @@ -675,19 +675,22 @@ static __noinline int ieee80211_ioctl_getroam(struct ieee80211vap *vap, const struct ieee80211req *ireq) { - if (ireq->i_len != sizeof(vap->iv_roamparms)) - return EINVAL; - return copyout(vap->iv_roamparms, ireq->i_data, - sizeof(vap->iv_roamparms)); + size_t len = ireq->i_len; + /* NB: accept short requests for backwards compat */ + if (len > sizeof(vap->iv_roamparms)) + len = sizeof(vap->iv_roamparms); + return copyout(vap->iv_roamparms, ireq->i_data, len); } static __noinline int ieee80211_ioctl_gettxparams(struct ieee80211vap *vap, const struct ieee80211req *ireq) { - if (ireq->i_len != sizeof(vap->iv_txparms)) - return EINVAL; - return copyout(vap->iv_txparms, ireq->i_data, sizeof(vap->iv_txparms)); + size_t len = ireq->i_len; + /* NB: accept short requests for backwards compat */ + if (len > sizeof(vap->iv_txparms)) + len = sizeof(vap->iv_txparms); + return copyout(vap->iv_txparms, ireq->i_data, len); } static __noinline int @@ -2082,61 +2085,40 @@ ieee80211_ioctl_settxparams(struct ieee8 struct ieee80211_txparams_req parms; /* XXX stack use? */ struct ieee80211_txparam *src, *dst; const struct ieee80211_rateset *rs; - int error, i, changed; + int error, mode, changed, is11n, nmodes; - if (ireq->i_len != sizeof(parms)) + /* NB: accept short requests for backwards compat */ + if (ireq->i_len > sizeof(parms)) return EINVAL; - error = copyin(ireq->i_data, &parms, sizeof(parms)); + error = copyin(ireq->i_data, &parms, ireq->i_len); if (error != 0) return error; + nmodes = ireq->i_len / sizeof(struct ieee80211_txparam); changed = 0; /* validate parameters and check if anything changed */ - for (i = IEEE80211_MODE_11A; i < IEEE80211_MODE_11NA; i++) { - if (isclr(ic->ic_modecaps, i)) - continue; - src = &parms.params[i]; - dst = &vap->iv_txparms[i]; - rs = &ic->ic_sup_rates[i]; - if (src->ucastrate != dst->ucastrate) { - if (!checkrate(rs, src->ucastrate)) - return EINVAL; - changed++; - } - if (src->mcastrate != dst->mcastrate) { - if (!checkrate(rs, src->mcastrate)) - return EINVAL; - changed++; - } - if (src->mgmtrate != dst->mgmtrate) { - if (!checkrate(rs, src->mgmtrate)) - return EINVAL; - changed++; - } - if (src->maxretry != dst->maxretry) /* NB: no bounds */ - changed++; - } - /* 11n parameters are handled differently */ - for (; i < IEEE80211_MODE_MAX; i++) { - if (isclr(ic->ic_modecaps, i)) + for (mode = IEEE80211_MODE_11A; mode < nmodes; mode++) { + if (isclr(ic->ic_modecaps, mode)) continue; - src = &parms.params[i]; - dst = &vap->iv_txparms[i]; - rs = &ic->ic_sup_rates[i]; + src = &parms.params[mode]; + dst = &vap->iv_txparms[mode]; + rs = &ic->ic_sup_rates[mode]; /* NB: 11n maps to legacy */ + is11n = (mode == IEEE80211_MODE_11NA || + mode == IEEE80211_MODE_11NG); if (src->ucastrate != dst->ucastrate) { - if (!checkmcs(src->ucastrate) && - !checkrate(rs, src->ucastrate)) + if (!checkrate(rs, src->ucastrate) && + (!is11n || !checkmcs(src->ucastrate))) return EINVAL; changed++; } if (src->mcastrate != dst->mcastrate) { - if (!checkmcs(src->mcastrate) && - !checkrate(rs, src->mcastrate)) + if (!checkrate(rs, src->mcastrate) && + (!is11n || !checkmcs(src->mcastrate))) return EINVAL; changed++; } if (src->mgmtrate != dst->mgmtrate) { - if (!checkmcs(src->mgmtrate) && - !checkrate(rs, src->mgmtrate)) + if (!checkrate(rs, src->mgmtrate) && + (!is11n || !checkmcs(src->mgmtrate))) return EINVAL; changed++; } @@ -2148,9 +2130,9 @@ ieee80211_ioctl_settxparams(struct ieee8 * Copy new parameters in place and notify the * driver so it can push state to the device. */ - for (i = IEEE80211_MODE_11A; i < IEEE80211_MODE_MAX; i++) { - if (isset(ic->ic_modecaps, i)) - vap->iv_txparms[i] = parms.params[i]; + for (mode = IEEE80211_MODE_11A; mode < nmodes; mode++) { + if (isset(ic->ic_modecaps, mode)) + vap->iv_txparms[mode] = parms.params[mode]; } /* XXX could be more intelligent, e.g. don't reset if setting not being used */