src/devices/wifi/wifi-mac-header.h
changeset 4793 4f6a6772628e
parent 3660 0ae474317c28
child 4794 ddefc6dd6d9b
--- a/src/devices/wifi/wifi-mac-header.h	Wed Feb 25 12:27:00 2009 -0500
+++ b/src/devices/wifi/wifi-mac-header.h	Sat Feb 28 14:21:05 2009 +0300
@@ -44,6 +44,8 @@
   WIFI_MAC_MGT_PROBE_RESPONSE,
   WIFI_MAC_MGT_AUTHENTICATION,
   WIFI_MAC_MGT_DEAUTHENTICATION,
+//Mesh management frames:  
+  WIFI_MAC_MGT_MULTIHOP_ACTION,
 
   WIFI_MAC_DATA,
   WIFI_MAC_DATA_CFACK,
@@ -83,6 +85,7 @@
   void SetProbeResp (void);
   void SetBeacon (void);
   void SetTypeData (void);
+  void SetMultihopAction();
   void SetDsFrom (void);
   void SetDsNotFrom (void);
   void SetDsTo (void);
@@ -129,6 +132,7 @@
   bool IsDisassociation (void) const;
   bool IsAuthentication (void) const;
   bool IsDeauthentication (void) const;
+  bool IsMultihopAction(void) const;
   uint16_t GetRawDuration (void) const;
   Time GetDuration (void) const;
   uint16_t GetSequenceControl (void) const;
@@ -176,7 +180,120 @@
   uint8_t m_qosAckPolicy;
   uint16_t m_qosStuff;
 };
+class WifiMeshHeader : public Header //7.1.3.5b
+{
+	public:
+		WifiMeshHeader ();
+		~WifiMeshHeader ();
+		static TypeId GetTypeId (void);
+		virtual TypeId GetInstanceTypeId (void) const;
+		virtual void Print (std::ostream &os) const;
 
+		void			SetAddr5 (Mac48Address address);
+		void			SetAddr6 (Mac48Address address);
+		void			SetAddr7 (Mac48Address address);
+		Mac48Address		GetAddr5 ();
+		Mac48Address		GetAddr6 ();
+		Mac48Address		GetAddr7 ();
+
+		void			SetMeshSeqno (uint32_t seqno);
+		uint32_t		GetMeshSeqno ();
+
+		void			SetMeshTtl (uint8_t TTL);
+		uint8_t		GetMeshTtl ();
+
+#define MESH_AE_MASK	0xc0
+#define MESH_AE_SHIFT	6
+		void			SetAddressExt (uint8_t num_of_addresses);
+		uint8_t		GetAddressExt ();
+
+		virtual uint32_t	GetSerializedSize (void) const;
+		virtual void		Serialize (Buffer::Iterator start) const;
+		virtual uint32_t	Deserialize (Buffer::Iterator start);
+	private:
+		uint8_t	m_meshFlags;
+		uint8_t	m_meshTtl;
+		uint32_t	m_meshSeqno;
+		Mac48Address	m_addr5;
+		Mac48Address	m_addr6;
+		Mac48Address	m_addr7;
+};
+class WifiMeshMultihopActionHeader : public Header //7.2.3.14
+{
+	//Multichop action frame consists of Mesh header, Action, and
+	//the last information. Mesh header is present within all data
+	//frames and multihop action frames, so Mesh header is a
+	//separate structure. Each MultihopAction frames (frames like
+	//PREQ, PREP and other) start form Category field and Action
+	//value field, so the Multihop Action Frame should containt
+	//three fields: Category, Action Value;
+	public:
+		WifiMeshMultihopActionHeader ();
+		~WifiMeshMultihopActionHeader ();
+		enum CategoryValue //table 7-24 staring from 4
+		{
+			MESH_PEER_LINK_MGT =4,
+			MESH_LINK_METRIC,
+			MESH_PATH_SELECTION,
+			MESH_INTERWORK_ACTION,
+			MESH_RESOURCE_COORDINATION,
+		};
+		enum PeerLinkMgtActionValue
+		{
+			PEER_LINK_OPEN = 0,
+			PEER_LINK_CONFIRM,
+			PEER_LINK_CLOSE,
+		};
+		enum LinkMetricActionValue
+		{
+			LINK_METRIC_REQUEST = 0,
+			LINK_METRIC_REPORT,
+		};
+		enum PathSelectionActionValue
+		{
+			PATH_REQUEST = 0,
+			PATH_REPLY,
+			PATH_ERROR,
+			ROOT_ANNOUNCEMENT,
+		};
+		enum InterworkActionValue
+		{
+			PORTAL_ANNOUNCEMENT = 0,
+		};
+		enum ResourceCoordinationActionValue
+		{
+			CONGESTION_CONTROL_NOTIFICATION = 0,
+			MDA_SETUP_REQUEST,
+			MDA_SETUP_REPLY,
+			MDAOP_ADVERTISMENT_REQUEST,
+			MDAOP_ADVERTISMENTS,
+			MDAOP_SET_TEARDOWN,
+			BEACON_TIMING_REQUEST,
+			BEACON_TIMING_RESPONSE,
+			TBTT_ADJASTMENT_REQUEST,
+			MESH_CHANNEL_SWITCH_ANNOUNCEMENT,
+		};
+		typedef union
+		{
+			enum PeerLinkMgtActionValue		peerLink;
+			enum LinkMetricActionValue		linkMetrtic;
+			enum PathSelectionActionValue		pathSelection;
+			enum InterworkActionValue		interwork;
+			enum ResourceCoordinationActionValue	resourceCoordination;
+		} ACTION_VALUE;
+		void			SetAction(enum CategoryValue type,ACTION_VALUE action);
+		enum CategoryValue	GetCategory();
+		ACTION_VALUE		GetAction();
+		static TypeId		GetTypeId (void);
+		virtual	TypeId		GetInstanceTypeId (void) const;
+		virtual void		Print (std::ostream &os) const;
+		virtual uint32_t	GetSerializedSize (void) const;
+		virtual void		Serialize (Buffer::Iterator start) const;
+		virtual uint32_t	Deserialize (Buffer::Iterator start);
+	private:
+		uint8_t	m_category;
+		uint8_t	m_actionValue;
+};
 } // namespace ns3