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

Rui Paulo rpaulo at FreeBSD.org
Tue May 26 17:56:45 UTC 2009


Author: rpaulo
Date: Tue May 26 17:56:43 2009
New Revision: 192824
URL: http://svn.freebsd.org/changeset/base/192824

Log:
  * checkpoint HWMP preq processing
  * rename link metric function/variables to something more meaningful.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/mesh11s/sys/net80211/ieee80211_hwmp.c
  projects/mesh11s/sys/net80211/ieee80211_input.c
  projects/mesh11s/sys/net80211/ieee80211_mesh.c
  projects/mesh11s/sys/net80211/ieee80211_mesh.h
  projects/mesh11s/sys/net80211/ieee80211_node.h

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Tue May 26 17:54:55 2009	(r192823)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Tue May 26 17:56:43 2009	(r192824)
@@ -64,6 +64,27 @@ __FBSDID("$FreeBSD$");
 #include <net80211/ieee80211_input.h>
 
 
+/*
+ * HWMP Forwarding Information table.
+ */
+struct ieee80211_hwmp_forwardinfo {
+	TAILQ_ENTRY(ieee80211_hwmp_path) hp_list;
+	uint8_t		hp_target[IEEE80211_ADDR_LEN];
+	ieee80211_seq	hp_seq;			/* HWMP sequence number */
+        uint8_t		hp_mnxthop[IEEE80211_ADDR_LEN];
+	uint32_t	hp_metric;		/* Path Metric */
+	uint32_t	hp_nhops;		/* Number of Hops */
+	/* XXX percursor list */
+	uint32_t	hp_lifetime;
+};
+
+static void	hwmp_recv_preq(struct ieee80211vap *, struct ieee80211_node *,
+    const struct ieee80211_meshpreq_ie *);
+static void	hwmp_recv_prep(struct ieee80211vap *, struct ieee80211_node *,
+    const struct ieee80211_meshprep_ie *);
+static void	hwmp_recv_perr(struct ieee80211vap *, struct ieee80211_node *,
+    const struct ieee80211_meshperr_ie *);
+
 static int	ieee80211_hwmp_maxhops = 31;	
 #ifdef notyet
 static int	ieee80211_hwmp_maxhopstime = 500;
@@ -76,29 +97,36 @@ static int	ieee80211_hwmp_rootmode = 0;
 static int	ieee80211_hwmp_pathtoroottimeout = 5000;
 static int	ieee80211_hmwp_rootint = 2000;
 static int	ieee80211_hwmp_rannint = 1000;
+#endif
 static int	ieee80211_hwmp_targetonly = 1;/* reply to PREQs automatically */
 static int	ieee80211_hwmp_replyforward = 1; /* propagate PREQs */
+#ifdef notyet
 static int	ieee80211_hwmp_pathmaintenance = 2000;
 static int	ieee80211_hwmp_confirmint = 2000;
 #endif
 
-extern int	ieee80211_mesh_ttl;
+/*
+ * Target Address set in a Proactive PREQ.
+ */
+static const uint8_t	proactiveaddr[IEEE80211_ADDR_LEN] =
+	{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
 SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD, 0,
     "IEEE 802.11s HWMP parameters");
 SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, maxhops, CTLTYPE_INT | CTLFLAG_RW,
     &ieee80211_hwmp_maxhops, 0, "Maximum number of hops for paths");
+SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, targetonly, CTLTYPE_INT | CTLFLAG_RW,
+    &ieee80211_hwmp_targetonly, 0, "TBD");
+SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, replyforward, CTLTYPE_INT | CTLFLAG_RW,
+    &ieee80211_hwmp_replyforward, 0, "TBD");
 #ifdef notyet
 SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, rootmode, CTLTYPE_INT | CTLFLAG_RW,
     &ieee80211_hwmp_rootmode, 0, "Root Mesh Point Node");
 #endif
 
-static void	hwmp_recv_preq(struct ieee80211vap *,
-    const struct ieee80211_meshpreq_ie *);
-static void	hwmp_recv_prep(struct ieee80211vap *,
-    const struct ieee80211_meshprep_ie *);
-static void	hwmp_recv_perr(struct ieee80211vap *,
-    const struct ieee80211_meshperr_ie *);
+extern int	ieee80211_mesh_ttl;
+extern int	ieee80211_mesh_forwarding;
+
 
 void
 ieee80211_hwmp_recv_action(struct ieee80211vap *vap, struct ieee80211_node *ni,
@@ -110,7 +138,6 @@ ieee80211_hwmp_recv_action(struct ieee80
 	struct ieee80211_meshpreq_ie *meshpreq = NULL;
 	struct ieee80211_meshprep_ie *meshprep = NULL;
 	struct ieee80211_meshperr_ie *meshperr = NULL;
-	union ieee80211_send_action_args vargs;                 
 
 	wh = mtod(m0, struct ieee80211_frame *);
 	ia = (struct ieee80211_action *) &wh[1];
@@ -156,43 +183,31 @@ ieee80211_hwmp_recv_action(struct ieee80
 		if (meshpreq == NULL) {
 			IEEE80211_DISCARD(vap,
 			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
-			    wh, NULL, "%s", "preq without IE");
+			    wh, NULL, "%s", "PREQ without IE");
 			vap->iv_stats.is_rx_mgtdiscard++;
 			return;
 		}
-		hwmp_recv_preq(vap, meshpreq);
-		/*
-		 * Is the peer trying to find us?
-		 */
-		if (IEEE80211_ADDR_EQ(vap->iv_myaddr,
-		    meshpreq->preq_targets[0].target_addr)) {
-			struct ieee80211_meshprep_ie prep;
-			/*
-			 * Build and send a path reply frame.
-			 */
-			prep.prep_flags = 0;
-			prep.prep_hopcount = 0;
-			prep.prep_ttl = ieee80211_mesh_ttl;
-			IEEE80211_ADDR_COPY(prep.prep_targetaddr,
-			    meshpreq->preq_targets[0].target_addr);
-			prep.prep_targetseq = meshpreq->preq_origseq;
-			prep.prep_lifetime = 5000;
-			prep.prep_metric = 0;
-			IEEE80211_ADDR_COPY(prep.prep_origaddr,
-			    vap->iv_myaddr);
-			prep.prep_origseq = 1;
-			vargs.ptrarg = &prep;
-			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHPATH,
-			    IEEE80211_ACTION_MESHPATH_REP,
-			    vargs);
-		}
+		hwmp_recv_preq(vap, ni, meshpreq);
 		break;
 	case IEEE80211_ACTION_MESHPATH_REP:
-		hwmp_recv_prep(vap, meshprep);
+		if (meshprep == NULL) {
+			IEEE80211_DISCARD(vap,
+			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
+			    wh, NULL, "%s", "PREP without IE");
+			vap->iv_stats.is_rx_mgtdiscard++;
+			return;
+		}
+		hwmp_recv_prep(vap, ni, meshprep);
 		break;
 	case IEEE80211_ACTION_MESHPATH_ERR:
-		hwmp_recv_perr(vap, meshperr);
+		if (meshperr == NULL) {
+			IEEE80211_DISCARD(vap,
+			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
+			    wh, NULL, "%s", "PERR without IE");
+			vap->iv_stats.is_rx_mgtdiscard++;
+			return;
+		}
+		hwmp_recv_perr(vap, ni, meshperr);
 		break;
 	default:
 		IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_MESH,
@@ -214,7 +229,7 @@ ieee80211_hwmp_recv_action(struct ieee80
  * Add a Mesh Path Reply IE to a frame.
  */
 uint8_t *
-ieee80211_add_meshprep(uint8_t *frm, const struct ieee80211_meshprep_ie *prep)
+ieee80211_add_meshprep(uint8_t *frm, struct ieee80211_meshprep_ie *prep)
 {
 
 	*frm++ = IEEE80211_ELEMID_MESHPREP;
@@ -234,21 +249,140 @@ ieee80211_add_meshprep(uint8_t *frm, con
 	return frm;
 }
 
+#define	PREQ_TFLAGS(n)	preq->preq_targets[n].target_flags
+#define	PREQ_TADDR(n)	preq->preq_targets[n].target_addr
+#define	PREQ_TSEQ(n)	preq->preq_targets[n].target_seq
 static void
-hwmp_recv_preq(struct ieee80211vap *vap,
+hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_meshpreq_ie *preq)
 {
+	union ieee80211_send_action_args vargs;                 
+
+	/*
+	 * Acceptance criteria: if the PREQ is not for us and
+	 * forwarding is disabled, discard this PREQ.
+	 */
+	if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0)) &&
+	    !ieee80211_mesh_forwarding)
+		return;
+
+	/*
+	 * Step 1. Record the PREQ ID and the originator MAC address.
+	 */
+
+	/*
+	 * Step 2.
+	 */
+
+	/*
+	 * Step 3. Check if the PREQ is addressed to us.
+	 * XXX: check if this is part of a proxy address.
+	 */
+	if (IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0))) {
+		struct ieee80211_meshprep_ie prep;
+		/*
+		 * Build and send a PREP frame.
+		 */
+		prep.prep_flags = 0;
+		prep.prep_hopcount = 0;
+		prep.prep_ttl = ieee80211_mesh_ttl;
+		IEEE80211_ADDR_COPY(prep.prep_targetaddr,
+		    preq->preq_targets[0].target_addr);
+		prep.prep_targetseq = preq->preq_origseq;
+		prep.prep_lifetime = preq->preq_lifetime;
+		prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
+		IEEE80211_ADDR_COPY(prep.prep_origaddr, vap->iv_myaddr);
+		/* XXX */
+		prep.prep_origseq = 1;
+		vargs.ptrarg = &prep;
+		ieee80211_send_action(ni,
+		    IEEE80211_ACTION_CAT_MESHPATH,
+		    IEEE80211_ACTION_MESHPATH_REP,
+		    vargs);
+		return;
+	}
+
+	/* XXX: Step 4. Check for AE bit and update proxy information */
+
+	/*
+	 * Step 5. Intermediate reply: check if we have this path on our
+	 * table and the TO bit is unset.
+	 */
+	if (!(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) {
+
+		/*
+		 * XXX: Step 6. Update the percursor table
+		 */
+	}
+
+	/*
+	 * XXX: Step 8. Proactive PREQ: reply with a proactive PREP to the
+	 * root STA if requested.
+	 */
+	if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), proactiveaddr) &&
+	    (PREQ_TFLAGS(0) &
+	    ((IEEE80211_MESHPREQ_TFLAGS_TO|IEEE80211_MESHPREQ_TFLAGS_RF) ==
+	    (IEEE80211_MESHPREQ_TFLAGS_TO|IEEE80211_MESHPREQ_TFLAGS_RF)))) {
+		/*
+		 * Does the root want a proactive PREP ?
+		 */
+		if (preq->preq_flags & IEEE80211_MESHPREQ_FLAGS_PP) {
+
+		}
+	}
 }
+#undef PREQ_TFLAGS
+#undef PREQ_TADDR
+#undef PREQ_TSEQ
 
 static void
-hwmp_recv_prep(struct ieee80211vap *vap,
+hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni,
     const struct ieee80211_meshprep_ie *prep)
 {
 
 }
+
 static void
-hwmp_recv_perr(struct ieee80211vap *vap,
-    const struct ieee80211_meshprep_ie *perr)
+hwmp_recv_perr(struct ieee80211vap *vap, struct ieee80211_node *ni,
+    const struct ieee80211_meshperr_ie *perr)
 {
 
 }
+
+static int
+hwmp_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	int error;
+
+	error = 0;
+	switch (ireq->i_type) {
+#ifdef notyet
+	case IEEE80211_IOC_HWMPFI:
+		if (vap->iv_opmode != IEEE80211_M_MBSS)
+			return EINVAL;
+#endif
+	default:
+		return ENOSYS;
+	}
+
+	return error;
+}
+IEEE80211_IOCTL_GET(hwmp, hwmp_ioctl_get80211);
+
+static int
+hwmp_ioctl_set80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
+{
+	int error;
+
+	error = 0;
+	switch (ireq->i_type) {
+#ifdef notyet
+	case IEEE80211_IOC_HWMPFI:
+#endif
+	default:
+		return ENOSYS;
+	}
+
+	return error;
+}
+IEEE80211_IOCTL_SET(hwmp, hwmp_ioctl_set80211);

Modified: projects/mesh11s/sys/net80211/ieee80211_input.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_input.c	Tue May 26 17:54:55 2009	(r192823)
+++ projects/mesh11s/sys/net80211/ieee80211_input.c	Tue May 26 17:56:43 2009	(r192824)
@@ -807,9 +807,9 @@ ieee80211_recv_action(struct ieee80211_n
 		}
 		break;
 	case IEEE80211_ACTION_CAT_MESHPEERING:
-	case IEEE80211_ACTION_CAT_MESHLINK:
+	case IEEE80211_ACTION_CAT_MESHLMETRIC:
 	case IEEE80211_ACTION_CAT_MESHPATH:
-		/* handled by ieee80211_mesh.c */
+		/* handled by ieee80211_mesh.c and ieee80211_hwmp.c */
 		break;
 	default:
 		IEEE80211_NOTE(vap,

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c	Tue May 26 17:54:55 2009	(r192823)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Tue May 26 17:56:43 2009	(r192824)
@@ -848,29 +848,31 @@ mesh_recv_action(struct ieee80211_node *
 		ieee80211_hwmp_recv_action(vap, ni, m0);
 		break;
 	/*
-	 * Airtime link metric handling.
+	 * Link Metric handling.
 	 */
-	case IEEE80211_ACTION_CAT_MESHLINK:
+	case IEEE80211_ACTION_CAT_MESHLMETRIC:
 		switch (ia->ia_action) {
-		case IEEE80211_ACTION_MESHLINK_REQ:
+		case IEEE80211_ACTION_MESHLMETRIC_REQ:
 		{
 			uint32_t metric;
 
+			/* XXX: check if we are using airtime or
+			   aother algorithm */
 			metric = ieee80211_airtime_calc(vap, ni);
 			vargs.ptrarg = &metric;
 			ieee80211_send_action(ni,
-			    IEEE80211_ACTION_CAT_MESHLINK,
-			    IEEE80211_ACTION_MESHLINK_REP,
+			    IEEE80211_ACTION_CAT_MESHLMETRIC,
+			    IEEE80211_ACTION_MESHLMETRIC_REP,
 			    vargs);
 		}
 			break;
-		case IEEE80211_ACTION_MESHLINK_REP:
+		case IEEE80211_ACTION_MESHLMETRIC_REP:
 			break;
 		default:
 			IEEE80211_DISCARD(vap,
 			    IEEE80211_MSG_ACTION | IEEE80211_MSG_MESH,
-			    wh, NULL, "mesh link using reserved action %d",
-			    ia->ia_action);
+			    wh, NULL, "mesh link metric using reserved "
+			    "action %d", ia->ia_action);
 			vap->iv_stats.is_rx_mgtdiscard++;
 		}
 		break;
@@ -1137,7 +1139,7 @@ ieee80211_airtime_calc(struct ieee80211v
  * Add a Mesh Link Metric report IE to a frame.
  */
 uint8_t *
-ieee80211_add_meshlink(uint8_t *frm, uint32_t metric)
+ieee80211_add_meshlmetric(uint8_t *frm, uint32_t metric)
 {
 
 	*frm++ = IEEE80211_ELEMID_MESHLINK;

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.h	Tue May 26 17:54:55 2009	(r192823)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.h	Tue May 26 17:56:43 2009	(r192824)
@@ -86,10 +86,11 @@ struct ieee80211_meshid_ie {
 #define	IEEE80211_MESHID_LEN	IEEE80211_NWID_LEN
 
 /* Link Metric Report */
-struct ieee80211_meshlink_ie {
-	uint8_t		link_ie;	/* IEEE80211_ELEMID_MESHLINK */
-	uint8_t		link_len;
-	/* XXXRP: missing  variable metric */
+struct ieee80211_meshlmetric_ie {
+	uint8_t		lm_ie;	/* IEEE80211_ELEMID_MESHLINK */
+	uint8_t		lm_len;
+	uint32_t	lm_metric;
+#define	IEEE80211_MESHLMETRIC_INITIALVAL	0
 } __packed;
 
 /* Congestion Notification */
@@ -216,6 +217,9 @@ struct ieee80211_meshpreq_ie {
 	uint8_t		preq_ie;	/* IEEE80211_ELEMID_MESHPREQ */
 	uint8_t		preq_len;
 	uint8_t		preq_flags;
+#define	IEEE80211_MESHPREQ_FLAGS_PR	0x01	/* Portal Role */
+#define	IEEE80211_MESHPREQ_FLAGS_AE	0x02	/* Address Extension */
+#define	IEEE80211_MESHPREQ_FLAGS_PP	0x04	/* Proactive PREP */
 	uint8_t		preq_hopcount;
 	uint8_t		preq_ttl;
 	uint32_t	preq_id;
@@ -227,6 +231,9 @@ struct ieee80211_meshpreq_ie {
 	uint8_t		preq_tcount;	/* target count */
 	struct {
 		uint8_t		target_flags;
+#define	IEEE80211_MESHPREQ_TFLAGS_TO	0x01	/* Target Only */
+#define	IEEE80211_MESHPREQ_TFLAGS_RF	0x02	/* Reply and Forward */
+#define	IEEE80211_MESHPREQ_TFLAGS_USN	0x04	/* Unknown HWMP seq number */
 		uint8_t		target_addr[IEEE80211_ADDR_LEN];
 		uint32_t	target_seq;	/* HWMP Sequence Number */
 	} preq_targets[1] __packed;	/* NB: variable size */
@@ -282,7 +289,7 @@ struct ieee80211_meshpuc_ie {
  * 802.11s Action Frames
  */
 #define	IEEE80211_ACTION_CAT_MESHPEERING	30	/* XXX Linux */
-#define	IEEE80211_ACTION_CAT_MESHLINK		13
+#define	IEEE80211_ACTION_CAT_MESHLMETRIC	13
 #define	IEEE80211_ACTION_CAT_MESHPATH		32	/* XXX Linux */
 #define	IEEE80211_ACTION_CAT_INTERWORK		15
 #define	IEEE80211_ACTION_CAT_RESOURCE		16
@@ -312,8 +319,8 @@ enum {
  * Mesh Link Metric Action codes.
  */
 enum {
-	IEEE80211_ACTION_MESHLINK_REQ	= 0,	/* Link Metric Request */
-	IEEE80211_ACTION_MESHLINK_REP	= 1,	/* Link Metric Report */
+	IEEE80211_ACTION_MESHLMETRIC_REQ = 0,	/* Link Metric Request */
+	IEEE80211_ACTION_MESHLMETRIC_REP = 1,	/* Link Metric Report */
 	/* 2-255 reserved */
 };
 
@@ -334,7 +341,7 @@ uint8_t *	ieee80211_add_meshpeer(uint8_t
 		    uint16_t);
 uint32_t	ieee80211_airtime_calc(struct ieee80211vap *,
 		    struct ieee80211_node *);
-uint8_t *	ieee80211_add_meshlink(uint8_t *, uint32_t);
+uint8_t *	ieee80211_add_meshlmetric(uint8_t *, uint32_t);
 void		ieee80211_create_mbss(struct ieee80211vap *, struct
 		    ieee80211_channel *);
 uint32_t	ieee80211_mesh_getseq(void);

Modified: projects/mesh11s/sys/net80211/ieee80211_node.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_node.h	Tue May 26 17:54:55 2009	(r192823)
+++ projects/mesh11s/sys/net80211/ieee80211_node.h	Tue May 26 17:56:43 2009	(r192824)
@@ -88,7 +88,7 @@ struct ieee80211_ies {
 	int	len;		/* data size in bytes */
 };
 
-enum ieee80211_mesh_state {
+enum ieee80211_mesh_mlstate {
 	IEEE80211_NODE_MESH_IDLE	= 0,
 	IEEE80211_NODE_MESH_OPENSNT	= 1,	/* open frame received */
 	IEEE80211_NODE_MESH_OPENRCV	= 2,	/* open frame sent */
@@ -184,15 +184,12 @@ struct ieee80211_node {
 	uint8_t			ni_dtim_count;	/* DTIM count for last bcn */
 
 	/* 11s state */
-	enum ieee80211_mesh_state ni_mlstate;	/* peering management state */
+	enum ieee80211_mesh_mlstate ni_mlstate;	/* peering management state */
 	uint16_t		ni_mllid;	/* link local ID */
 	uint16_t		ni_mlpid;	/* link peer ID */
 	struct callout		ni_mltimer;	/* link mesh timer */
 	uint8_t			ni_mlrcnt;	/* link mesh retry counter */
 	uint8_t			ni_mltval;	/* link mesh timer value */
-	uint8_t			ni_mnxthop[IEEE80211_ADDR_LEN];
-	uint32_t		ni_mpmetric;	/* path metric */
-	ieee80211_seq		ni_mhwmpseq;	/* HWMP path seq number */
 
 	/* 11n state */
 	uint16_t		ni_htcap;	/* HT capabilities */


More information about the svn-src-projects mailing list