Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 May 2012 15:35:10 +0000 (UTC)
From:      Monthadar Al Jaberi <monthadar@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r234874 - head/sys/net80211
Message-ID:  <201205011535.q41FZAH1032079@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: monthadar
Date: Tue May  1 15:35:10 2012
New Revision: 234874
URL: http://svn.freebsd.org/changeset/base/234874

Log:
  Added Self-protected action category (including MPM).
  
  * Added new action category IEEE80211_ACTION_CAT_SELF_PROT which is used by 11s
  for Mesh Peering Management;
  * Updated Self protected enum Action codes to start from 1 instead of 0
  according to the standard spec;
  * Removed old and wrong action categories IEEE80211_ACTION_CAT_MESHPEERING;
  * Modified ieee80211_mesh.c and ieee80211_action.c to use the new action
  category code;
  * Added earlier verification code in ieee80211_input;
  
  Approved by: adrian

Modified:
  head/sys/net80211/ieee80211.h
  head/sys/net80211/ieee80211_action.c
  head/sys/net80211/ieee80211_input.c
  head/sys/net80211/ieee80211_mesh.c
  head/sys/net80211/ieee80211_mesh.h

Modified: head/sys/net80211/ieee80211.h
==============================================================================
--- head/sys/net80211/ieee80211.h	Tue May  1 14:48:51 2012	(r234873)
+++ head/sys/net80211/ieee80211.h	Tue May  1 15:35:10 2012	(r234874)
@@ -333,6 +333,8 @@ struct ieee80211_action {
 #define	IEEE80211_ACTION_CAT_BA		3	/* BA */
 #define	IEEE80211_ACTION_CAT_HT		7	/* HT */
 #define	IEEE80211_ACTION_CAT_MESH	13	/* Mesh */
+#define	IEEE80211_ACTION_CAT_SELF_PROT	15	/* Self-protected */
+/* 16 - 125 reserved */
 #define	IEEE80211_ACTION_CAT_VENDOR	127	/* Vendor Specific */
 
 #define	IEEE80211_ACTION_HT_TXCHWIDTH	0	/* recommended xmit chan width*/

Modified: head/sys/net80211/ieee80211_action.c
==============================================================================
--- head/sys/net80211/ieee80211_action.c	Tue May  1 14:48:51 2012	(r234873)
+++ head/sys/net80211/ieee80211_action.c	Tue May  1 15:35:10 2012	(r234874)
@@ -94,7 +94,7 @@ ieee80211_send_action_register(int cat, 
 			break;
 		ht_send_action[act] = f;
 		return 0;
-	case IEEE80211_ACTION_CAT_MESHPEERING:
+	case IEEE80211_ACTION_CAT_SELF_PROT:
 		if (act >= N(meshpl_send_action))
 			break;
 		meshpl_send_action[act] = f;
@@ -144,7 +144,7 @@ ieee80211_send_action(struct ieee80211_n
 		if (act < N(ht_send_action))
 			f = ht_send_action[act];
 		break;
-	case IEEE80211_ACTION_CAT_MESHPEERING:
+	case IEEE80211_ACTION_CAT_SELF_PROT:
 		if (act < N(meshpl_send_action))
 			f = meshpl_send_action[act];
 		break;
@@ -215,7 +215,7 @@ ieee80211_recv_action_register(int cat, 
 			break;
 		ht_recv_action[act] = f;
 		return 0;
-	case IEEE80211_ACTION_CAT_MESHPEERING:
+	case IEEE80211_ACTION_CAT_SELF_PROT:
 		if (act >= N(meshpl_recv_action))
 			break;
 		meshpl_recv_action[act] = f;
@@ -269,7 +269,7 @@ ieee80211_recv_action(struct ieee80211_n
 		if (ia->ia_action < N(ht_recv_action))
 			f = ht_recv_action[ia->ia_action];
 		break;
-	case IEEE80211_ACTION_CAT_MESHPEERING:
+	case IEEE80211_ACTION_CAT_SELF_PROT:
 		if (ia->ia_action < N(meshpl_recv_action))
 			f = meshpl_recv_action[ia->ia_action];
 		break;

Modified: head/sys/net80211/ieee80211_input.c
==============================================================================
--- head/sys/net80211/ieee80211_input.c	Tue May  1 14:48:51 2012	(r234873)
+++ head/sys/net80211/ieee80211_input.c	Tue May  1 15:35:10 2012	(r234874)
@@ -792,6 +792,24 @@ ieee80211_parse_action(struct ieee80211_
 			return EINVAL;
 		}
 		break;
+	case IEEE80211_ACTION_CAT_SELF_PROT:
+		/* If TA or RA group address discard silently */
+		if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
+			IEEE80211_IS_MULTICAST(wh->i_addr2))
+			return EINVAL;
+		/*
+		 * XXX: Should we verify complete length now or it is
+		 * to varying in sizes?
+		 */
+		switch (ia->ia_action) {
+		case IEEE80211_ACTION_MESHPEERING_CONFIRM:
+		case IEEE80211_ACTION_MESHPEERING_CLOSE:
+			/* is not a peering candidate (yet) */
+			if (ni == vap->iv_bss)
+				return EINVAL;
+			break;
+		}
+		break;
 #endif
 	}
 	return 0;

Modified: head/sys/net80211/ieee80211_mesh.c
==============================================================================
--- head/sys/net80211/ieee80211_mesh.c	Tue May  1 14:48:51 2012	(r234873)
+++ head/sys/net80211/ieee80211_mesh.c	Tue May  1 15:35:10 2012	(r234874)
@@ -430,25 +430,25 @@ ieee80211_mesh_init(void)
 	/*
 	 * Register action frame handlers.
 	 */
-	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING,
+	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT,
 	    IEEE80211_ACTION_MESHPEERING_OPEN,
 	    mesh_recv_action_meshpeering_open);
-	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING,
+	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT,
 	    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 	    mesh_recv_action_meshpeering_confirm);
-	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING,
+	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT,
 	    IEEE80211_ACTION_MESHPEERING_CLOSE,
 	    mesh_recv_action_meshpeering_close);
 	ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESH,
 	    IEEE80211_ACTION_MESH_LMETRIC, mesh_recv_action_meshlmetric);
 
-	ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING,
+	ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT,
 	    IEEE80211_ACTION_MESHPEERING_OPEN,
 	    mesh_send_action_meshpeering_open);
-	ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING,
+	ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT,
 	    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 	    mesh_send_action_meshpeering_confirm);
-	ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING,
+	ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT,
 	    IEEE80211_ACTION_MESHPEERING_CLOSE,
 	    mesh_send_action_meshpeering_close);
 	ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESH,
@@ -485,7 +485,7 @@ mesh_vdetach_peers(void *arg, struct iee
 		args[1] = ni->ni_mllid;
 		args[2] = IEEE80211_REASON_PEER_LINK_CANCELED;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CLOSE,
 		    args);
 	}
@@ -1440,7 +1440,7 @@ mesh_recv_mgmt(struct ieee80211_node *ni
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT);
 			args[0] = ni->ni_mlpid;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_OPEN, args);
 			ni->ni_mlrcnt = 0;
 			mesh_peer_timeout_setup(ni);
@@ -1602,7 +1602,7 @@ mesh_parse_meshpeering_action(struct iee
 			memset(mp, 0, sizeof(*mp));
 			mp->peer_llinkid = LE_READ_2(&mpie->peer_llinkid);
 			/* NB: peer link ID is optional on these frames */
-			if (subtype == IEEE80211_MESH_PEER_LINK_CLOSE &&
+			if (subtype == IEEE80211_ACTION_MESHPEERING_CLOSE &&
 			    mpie->peer_len == 8) {
 				mp->peer_linkid = 0;
 				mp->peer_rcode = LE_READ_2(&mpie->peer_linkid);
@@ -1646,7 +1646,7 @@ mesh_parse_meshpeering_action(struct iee
 			args[1] = ni->ni_mllid;
 			args[2] = IEEE80211_REASON_PEER_LINK_CANCELED;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE,
 			    args);
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -1689,13 +1689,13 @@ mesh_recv_action_meshpeering_open(struct
 		args[0] = ni->ni_mlpid;
 		/* Announce we're open too... */
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_OPEN, args);
 		/* ...and confirm the link. */
 		args[0] = ni->ni_mlpid;
 		args[1] = ni->ni_mllid;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 		    args);
 		mesh_peer_timeout_setup(ni);
@@ -1707,7 +1707,7 @@ mesh_recv_action_meshpeering_open(struct
 			args[1] = ni->ni_mlpid;
 			args[2] = IEEE80211_REASON_PEER_LINK_CANCELED;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE,
 			    args);
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -1718,7 +1718,7 @@ mesh_recv_action_meshpeering_open(struct
 		args[0] = ni->ni_mlpid;
 		args[1] = ni->ni_mllid;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 		    args);
 		break;
@@ -1728,7 +1728,7 @@ mesh_recv_action_meshpeering_open(struct
 		args[0] = ni->ni_mlpid;
 		args[1] = ni->ni_mllid;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 		    args);
 		/* NB: don't setup/clear any timeout */
@@ -1740,7 +1740,7 @@ mesh_recv_action_meshpeering_open(struct
 			args[1] = ni->ni_mllid;
 			args[2] = IEEE80211_REASON_PEER_LINK_CANCELED;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE,
 			    args);
 			mesh_linkchange(ni,
@@ -1753,7 +1753,7 @@ mesh_recv_action_meshpeering_open(struct
 		args[0] = ni->ni_mlpid;
 		args[1] = ni->ni_mllid;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 		    args);
 		mesh_peer_timeout_stop(ni);
@@ -1764,7 +1764,7 @@ mesh_recv_action_meshpeering_open(struct
 			args[1] = ni->ni_mlpid;
 			args[2] = IEEE80211_REASON_PEER_LINK_CANCELED;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE,
 			    args);
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -1774,7 +1774,7 @@ mesh_recv_action_meshpeering_open(struct
 		args[0] = ni->ni_mlpid;
 		args[1] = ni->ni_mllid;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 		    args);
 		break;
@@ -1783,7 +1783,7 @@ mesh_recv_action_meshpeering_open(struct
 		args[1] = meshpeer->peer_llinkid;
 		args[2] = IEEE80211_REASON_MESH_MAX_RETRIES;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CLOSE,
 		    args);
 		break;
@@ -1825,7 +1825,7 @@ mesh_recv_action_meshpeering_confirm(str
 		args[1] = meshpeer->peer_llinkid;
 		args[2] = IEEE80211_REASON_MESH_MAX_RETRIES;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CLOSE,
 		    args);
 		break;
@@ -1835,7 +1835,7 @@ mesh_recv_action_meshpeering_confirm(str
 			args[1] = ni->ni_mllid;
 			args[2] = IEEE80211_REASON_PEER_LINK_CANCELED;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE,
 			    args);
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -1875,7 +1875,7 @@ mesh_recv_action_meshpeering_close(struc
 		args[1] = ni->ni_mllid;
 		args[2] = IEEE80211_REASON_MESH_CLOSE_RCVD;
 		ieee80211_send_action(ni,
-		    IEEE80211_ACTION_CAT_MESHPEERING,
+		    IEEE80211_ACTION_CAT_SELF_PROT,
 		    IEEE80211_ACTION_MESHPEERING_CLOSE,
 		    args);
 		mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -1991,7 +1991,7 @@ mesh_send_action_meshpeering_open(struct
 		frm = ieee80211_add_xrates(frm, rs);
 		frm = ieee80211_add_meshid(frm, vap);
 		frm = ieee80211_add_meshconf(frm, vap);
-		frm = ieee80211_add_meshpeer(frm, IEEE80211_MESH_PEER_LINK_OPEN,
+		frm = ieee80211_add_meshpeer(frm, IEEE80211_ACTION_MESHPEERING_OPEN,
 		    args[0], 0, 0);
 		m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *);
 		return mesh_send_action(ni, m);
@@ -2059,7 +2059,7 @@ mesh_send_action_meshpeering_confirm(str
 		frm = ieee80211_add_meshid(frm, vap);
 		frm = ieee80211_add_meshconf(frm, vap);
 		frm = ieee80211_add_meshpeer(frm,
-		    IEEE80211_MESH_PEER_LINK_CONFIRM,
+		    IEEE80211_ACTION_MESHPEERING_CONFIRM,
 		    args[0], args[1], 0);
 		m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *);
 		return mesh_send_action(ni, m);
@@ -2110,7 +2110,7 @@ mesh_send_action_meshpeering_close(struc
 		ADDSHORT(frm, args[2]);		/* reason code */
 		frm = ieee80211_add_meshid(frm, vap);
 		frm = ieee80211_add_meshpeer(frm,
-		    IEEE80211_MESH_PEER_LINK_CLOSE,
+		    IEEE80211_ACTION_MESHPEERING_CLOSE,
 		    args[0], args[1], args[2]);
 		m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *);
 		return mesh_send_action(ni, m);
@@ -2234,7 +2234,7 @@ mesh_peer_timeout_cb(void *arg)
 			args[0] = ni->ni_mlpid;
 			args[2] = IEEE80211_REASON_MESH_MAX_RETRIES;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE, args);
 			ni->ni_mlrcnt = 0;
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -2242,7 +2242,7 @@ mesh_peer_timeout_cb(void *arg)
 		} else {
 			args[0] = ni->ni_mlpid;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_OPEN, args);
 			ni->ni_mlrcnt++;
 			mesh_peer_timeout_backoff(ni);
@@ -2253,7 +2253,7 @@ mesh_peer_timeout_cb(void *arg)
 			args[0] = ni->ni_mlpid;
 			args[2] = IEEE80211_REASON_MESH_CONFIRM_TIMEOUT;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPEERING,
+			    IEEE80211_ACTION_CAT_SELF_PROT,
 			    IEEE80211_ACTION_MESHPEERING_CLOSE, args);
 			ni->ni_mlrcnt = 0;
 			mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING);
@@ -2341,15 +2341,15 @@ mesh_verify_meshpeer(struct ieee80211vap
 	    meshpeer->peer_len > 10)
 		return 1;
 	switch (subtype) {
-	case IEEE80211_MESH_PEER_LINK_OPEN:
+	case IEEE80211_ACTION_MESHPEERING_OPEN:
 		if (meshpeer->peer_len != 6)
 			return 1;
 		break;
-	case IEEE80211_MESH_PEER_LINK_CONFIRM:
+	case IEEE80211_ACTION_MESHPEERING_CONFIRM:
 		if (meshpeer->peer_len != 8)
 			return 1;
 		break;
-	case IEEE80211_MESH_PEER_LINK_CLOSE:
+	case IEEE80211_ACTION_MESHPEERING_CLOSE:
 		if (meshpeer->peer_len < 8)
 			return 1;
 		if (meshpeer->peer_len == 8 && meshpeer->peer_linkid != 0)
@@ -2425,13 +2425,13 @@ ieee80211_add_meshpeer(uint8_t *frm, uin
 
 	*frm++ = IEEE80211_ELEMID_MESHPEER;
 	switch (subtype) {
-	case IEEE80211_MESH_PEER_LINK_OPEN:
+	case IEEE80211_ACTION_MESHPEERING_OPEN:
 		*frm++ = 6;		/* length */
 		memcpy(frm, meshpeerproto, 4);
 		frm += 4;
 		ADDSHORT(frm, localid);	/* local ID */
 		break;
-	case IEEE80211_MESH_PEER_LINK_CONFIRM:
+	case IEEE80211_ACTION_MESHPEERING_CONFIRM:
 		KASSERT(peerid != 0, ("sending peer confirm without peer id"));
 		*frm++ = 8;		/* length */
 		memcpy(frm, meshpeerproto, 4);
@@ -2439,7 +2439,7 @@ ieee80211_add_meshpeer(uint8_t *frm, uin
 		ADDSHORT(frm, localid);	/* local ID */
 		ADDSHORT(frm, peerid);	/* peer ID */
 		break;
-	case IEEE80211_MESH_PEER_LINK_CLOSE:
+	case IEEE80211_ACTION_MESHPEERING_CLOSE:
 		if (peerid)
 			*frm++ = 10;	/* length */
 		else

Modified: head/sys/net80211/ieee80211_mesh.h
==============================================================================
--- head/sys/net80211/ieee80211_mesh.h	Tue May  1 14:48:51 2012	(r234873)
+++ head/sys/net80211/ieee80211_mesh.h	Tue May  1 15:35:10 2012	(r234874)
@@ -149,13 +149,6 @@ struct ieee80211_meshpeer_ie {
 	uint16_t	peer_rcode;
 } __packed;
 
-enum {
-	IEEE80211_MESH_PEER_LINK_OPEN		= 0,
-	IEEE80211_MESH_PEER_LINK_CONFIRM	= 1,
-	IEEE80211_MESH_PEER_LINK_CLOSE		= 2,
-	/* values 3-255 are reserved */
-};
-
 /* Mesh Peering Management Protocol */
 #define	IEEE80211_MESH_PEER_PROTO_OUI		0x00, 0x0f, 0xac
 #define	IEEE80211_MESH_PEER_PROTO_VALUE		0x2a
@@ -331,9 +324,9 @@ struct ieee80211_meshpuc_ie {
 
 /*
  * 802.11s Action Frames
+ * XXX: these are wrong, and some of them should be
+ * under MESH category while PROXY is under MULTIHOP category.
  */
-#define	IEEE80211_ACTION_CAT_MESHPEERING	30	/* XXX Linux */
-/* XXX: these need to be looked into */
 #define	IEEE80211_ACTION_CAT_INTERWORK		15
 #define	IEEE80211_ACTION_CAT_RESOURCE		16
 #define	IEEE80211_ACTION_CAT_PROXY		17
@@ -342,10 +335,11 @@ struct ieee80211_meshpuc_ie {
  * Mesh Peering Action codes.
  */
 enum {
-	IEEE80211_ACTION_MESHPEERING_OPEN	= 0,
-	IEEE80211_ACTION_MESHPEERING_CONFIRM	= 1,
-	IEEE80211_ACTION_MESHPEERING_CLOSE	= 2,
-	/* 3-255 reserved */
+	/* 0 reserved */
+	IEEE80211_ACTION_MESHPEERING_OPEN	= 1,
+	IEEE80211_ACTION_MESHPEERING_CONFIRM	= 2,
+	IEEE80211_ACTION_MESHPEERING_CLOSE	= 3,
+	/* 4-255 reserved */
 };
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205011535.q41FZAH1032079>