svn commit: r195520 - projects/mesh11s/sys/net80211

Sam Leffler sam at FreeBSD.org
Thu Jul 9 23:12:49 UTC 2009


Author: sam
Date: Thu Jul  9 23:12:47 2009
New Revision: 195520
URL: http://svn.freebsd.org/changeset/base/195520

Log:
  Give mac acl's some tlc:
  o use the linker set mechanism for ioctls and remove the aclator hooks;
    this pushes more code out of ieee80211_ioctl.c and allows further
    simplifications in the future
  o mark ieee80211req_maclist __packed to fix list mac on arm

Modified:
  projects/mesh11s/sys/net80211/ieee80211_acl.c
  projects/mesh11s/sys/net80211/ieee80211_ioctl.c
  projects/mesh11s/sys/net80211/ieee80211_ioctl.h
  projects/mesh11s/sys/net80211/ieee80211_proto.h

Modified: projects/mesh11s/sys/net80211/ieee80211_acl.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_acl.c	Thu Jul  9 22:21:18 2009	(r195519)
+++ projects/mesh11s/sys/net80211/ieee80211_acl.c	Thu Jul  9 23:12:47 2009	(r195520)
@@ -277,20 +277,18 @@ acl_getpolicy(struct ieee80211vap *vap)
 }
 
 static int
-acl_setioctl(struct ieee80211vap *vap, struct ieee80211req *ireq)
+acl_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
 {
-
-	return EINVAL;
-}
-
-static int
-acl_getioctl(struct ieee80211vap *vap, struct ieee80211req *ireq)
-{
-	struct aclstate *as = vap->iv_as;
+	struct aclstate *as;
 	struct acl *acl;
 	struct ieee80211req_maclist *ap;
 	int error, space, i;
 
+	if (ireq->i_type != IEEE80211_IOC_MACCMD)
+		return ENOSYS;
+	if (vap->iv_acl == NULL)
+		return EINVAL;
+	as = vap->iv_as;
 	switch (ireq->i_val) {
 	case IEEE80211_MACCMD_POLICY:
 		ireq->i_val = as->as_policy;
@@ -322,6 +320,85 @@ acl_getioctl(struct ieee80211vap *vap, s
 	}
 	return EINVAL;
 }
+IEEE80211_IOCTL_GET(acl, acl_ioctl_get80211);
+
+static int
+acl_ioctl_macmac(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	uint8_t mac[IEEE80211_ADDR_LEN];
+	const struct ieee80211_aclator *acl = vap->iv_acl;
+	int error;
+
+	if (ireq->i_len != sizeof(mac))
+		return EINVAL;
+	error = copyin(ireq->i_data, mac, ireq->i_len);
+	if (error)
+		return error;
+	if (acl == NULL) {
+		acl = ieee80211_aclator_get("mac");
+		if (acl == NULL || !acl_attach(vap))
+			return EINVAL;
+		vap->iv_acl = acl;
+	}
+	if (ireq->i_type == IEEE80211_IOC_ADDMAC)
+		acl_add(vap, mac);
+	else
+		acl_remove(vap, mac);
+	return 0;
+}
+
+static int
+acl_ioctl_setmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	const struct ieee80211_aclator *acl = vap->iv_acl;
+
+	switch (ireq->i_val) {
+	case IEEE80211_MACCMD_POLICY_OPEN:
+	case IEEE80211_MACCMD_POLICY_ALLOW:
+	case IEEE80211_MACCMD_POLICY_DENY:
+	case IEEE80211_MACCMD_POLICY_RADIUS:
+		if (acl == NULL) {
+			acl = ieee80211_aclator_get("mac");
+			if (acl == NULL || !acl_attach(vap))
+				return EINVAL;
+			vap->iv_acl = acl;
+		}
+		acl_setpolicy(vap, ireq->i_val);
+		break;
+	case IEEE80211_MACCMD_FLUSH:
+		if (acl != NULL)
+			acl_free_all(vap);
+		/* NB: silently ignore when not in use */
+		break;
+	case IEEE80211_MACCMD_DETACH:
+		if (acl != NULL) {
+			vap->iv_acl = NULL;
+			acl_detach(vap);
+		}
+		break;
+	default:
+		return EINVAL;
+	}
+	return 0;
+}
+
+static int
+acl_ioctl_set80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	switch (ireq->i_type) {
+	case IEEE80211_IOC_ADDMAC:
+	case IEEE80211_IOC_DELMAC:
+		return acl_ioctl_macmac(vap, ireq);
+		break;
+	case IEEE80211_IOC_MACCMD:
+		return acl_ioctl_setmaccmd(vap, ireq);
+		break;
+	default:
+		return ENOSYS;
+	}
+	return 0;
+}
+IEEE80211_IOCTL_SET(acl, acl_ioctl_set80211);
 
 static const struct ieee80211_aclator mac = {
 	.iac_name	= "mac",
@@ -333,7 +410,5 @@ static const struct ieee80211_aclator ma
 	.iac_flush	= acl_free_all,
 	.iac_setpolicy	= acl_setpolicy,
 	.iac_getpolicy	= acl_getpolicy,
-	.iac_setioctl	= acl_setioctl,
-	.iac_getioctl	= acl_getioctl,
 };
 IEEE80211_ACL_MODULE(wlan_acl, mac, 1);

Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.c	Thu Jul  9 22:21:18 2009	(r195519)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.c	Thu Jul  9 23:12:47 2009	(r195520)
@@ -585,14 +585,6 @@ ieee80211_ioctl_getwmeparam(struct ieee8
 }
 
 static __noinline int
-ieee80211_ioctl_getmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
-{
-	const struct ieee80211_aclator *acl = vap->iv_acl;
-
-	return (acl == NULL ? EINVAL : acl->iac_getioctl(vap, ireq));
-}
-
-static __noinline int
 ieee80211_ioctl_getcurchan(struct ieee80211vap *vap, struct ieee80211req *ireq)
 {
 	struct ieee80211com *ic = vap->iv_ic;
@@ -985,9 +977,6 @@ ieee80211_ioctl_get80211(struct ieee8021
 	case IEEE80211_IOC_FRAGTHRESHOLD:
 		ireq->i_val = vap->iv_fragthreshold;
 		break;
-	case IEEE80211_IOC_MACCMD:
-		error = ieee80211_ioctl_getmaccmd(vap, ireq);
-		break;
 	case IEEE80211_IOC_BURST:
 		ireq->i_val = (vap->iv_flags & IEEE80211_F_BURST) != 0;
 		break;
@@ -1514,69 +1503,6 @@ ieee80211_ioctl_setmlme(struct ieee80211
 }
 
 static __noinline int
-ieee80211_ioctl_macmac(struct ieee80211vap *vap, struct ieee80211req *ireq)
-{
-	uint8_t mac[IEEE80211_ADDR_LEN];
-	const struct ieee80211_aclator *acl = vap->iv_acl;
-	int error;
-
-	if (ireq->i_len != sizeof(mac))
-		return EINVAL;
-	error = copyin(ireq->i_data, mac, ireq->i_len);
-	if (error)
-		return error;
-	if (acl == NULL) {
-		acl = ieee80211_aclator_get("mac");
-		if (acl == NULL || !acl->iac_attach(vap))
-			return EINVAL;
-		vap->iv_acl = acl;
-	}
-	if (ireq->i_type == IEEE80211_IOC_ADDMAC)
-		acl->iac_add(vap, mac);
-	else
-		acl->iac_remove(vap, mac);
-	return 0;
-}
-
-static __noinline int
-ieee80211_ioctl_setmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
-{
-	const struct ieee80211_aclator *acl = vap->iv_acl;
-
-	switch (ireq->i_val) {
-	case IEEE80211_MACCMD_POLICY_OPEN:
-	case IEEE80211_MACCMD_POLICY_ALLOW:
-	case IEEE80211_MACCMD_POLICY_DENY:
-	case IEEE80211_MACCMD_POLICY_RADIUS:
-		if (acl == NULL) {
-			acl = ieee80211_aclator_get("mac");
-			if (acl == NULL || !acl->iac_attach(vap))
-				return EINVAL;
-			vap->iv_acl = acl;
-		}
-		acl->iac_setpolicy(vap, ireq->i_val);
-		break;
-	case IEEE80211_MACCMD_FLUSH:
-		if (acl != NULL)
-			acl->iac_flush(vap);
-		/* NB: silently ignore when not in use */
-		break;
-	case IEEE80211_MACCMD_DETACH:
-		if (acl != NULL) {
-			vap->iv_acl = NULL;
-			acl->iac_detach(vap);
-		}
-		break;
-	default:
-		if (acl == NULL)
-			return EINVAL;
-		else
-			return acl->iac_setioctl(vap, ireq);
-	}
-	return 0;
-}
-
-static __noinline int
 ieee80211_ioctl_setchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
 {
 	struct ieee80211com *ic = vap->iv_ic;
@@ -2833,13 +2759,6 @@ ieee80211_ioctl_set80211(struct ieee8021
 			ieee80211_syncflag_ht(vap, -IEEE80211_FHT_USEHT40);
 		error = ENETRESET;
 		break;
-	case IEEE80211_IOC_ADDMAC:
-	case IEEE80211_IOC_DELMAC:
-		error = ieee80211_ioctl_macmac(vap, ireq);
-		break;
-	case IEEE80211_IOC_MACCMD:
-		error = ieee80211_ioctl_setmaccmd(vap, ireq);
-		break;
 	case IEEE80211_IOC_STA_STATS:
 		error = ieee80211_ioctl_setstastats(vap, ireq);
 		break;

Modified: projects/mesh11s/sys/net80211/ieee80211_ioctl.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_ioctl.h	Thu Jul  9 22:21:18 2009	(r195519)
+++ projects/mesh11s/sys/net80211/ieee80211_ioctl.h	Thu Jul  9 23:12:47 2009	(r195520)
@@ -315,7 +315,7 @@ enum {
 
 struct ieee80211req_maclist {
 	uint8_t		ml_macaddr[IEEE80211_ADDR_LEN];
-};
+} __packed;
 
 /*
  * Mesh Routing Table Operations.

Modified: projects/mesh11s/sys/net80211/ieee80211_proto.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_proto.h	Thu Jul  9 22:21:18 2009	(r195519)
+++ projects/mesh11s/sys/net80211/ieee80211_proto.h	Thu Jul  9 23:12:47 2009	(r195520)
@@ -177,7 +177,6 @@ void	ieee80211_authenticator_register(in
 void	ieee80211_authenticator_unregister(int type);
 const struct ieee80211_authenticator *ieee80211_authenticator_get(int auth);
 
-struct ieee80211req;
 /*
  * Template for an MAC ACL policy module.  Such modules
  * register with the protocol code and are passed the sender's
@@ -196,8 +195,6 @@ struct ieee80211_aclator {
 	int	(*iac_flush)(struct ieee80211vap *);
 	int	(*iac_setpolicy)(struct ieee80211vap *, int);
 	int	(*iac_getpolicy)(struct ieee80211vap *);
-	int	(*iac_setioctl)(struct ieee80211vap *, struct ieee80211req *);
-	int	(*iac_getioctl)(struct ieee80211vap *, struct ieee80211req *);
 };
 void	ieee80211_aclator_register(const struct ieee80211_aclator *);
 void	ieee80211_aclator_unregister(const struct ieee80211_aclator *);


More information about the svn-src-projects mailing list