⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac-802_11e.h

📁 在网络仿真模拟工具下实现支持QoS的MAC层EDCF协议
💻 H
字号:
/* * * Ported from CMU/Monarch's code, nov'98 -Padma. * wireless-mac-802_11.h */#ifndef ns_mac_80211e_h#define ns_mac_80211e_h#include "priq.h"#include "mac-timers_802_11e.h"//#include "mac/mac-802_11.h"#include "mac-802_11_226.h"#include "marshall.h"#include "iostream.h"#define DEBUG 0#define MAX_PRI 4 //max number of priority queues#define GET_ETHER_TYPE(x)		GET2BYTE((x))#define SET_ETHER_TYPE(x,y)            {u_int16_t t = (y); STORE2BYTE(x,&t);}#define LEVEL(p) HDR_IP(p)->prio()/* ======================================================================   Frame Formats   ====================================================================== *//*#define	MAC_ProtocolVersion	0x00#define MAC_Type_Management	0x00#define MAC_Type_Control	0x01#define MAC_Type_Data		0x02#define MAC_Type_Reserved	0x03#define MAC_Subtype_RTS		0x0B#define MAC_Subtype_CTS		0x0C#define MAC_Subtype_ACK		0x0D#define MAC_Subtype_Data	0x00*//*struct frame_control {	u_char		fc_subtype		: 4;	u_char		fc_type			: 2;	u_char		fc_protocol_version	: 2;	u_char		fc_order		: 1;	u_char		fc_wep			: 1;	u_char		fc_more_data		: 1;	u_char		fc_pwr_mgt		: 1;	u_char		fc_retry		: 1;	u_char		fc_more_frag		: 1;	u_char		fc_from_ds		: 1;	u_char		fc_to_ds		: 1;};struct rts_frame {	struct frame_control	rf_fc;	u_int16_t		rf_duration;	u_char			rf_ra[ETHER_ADDR_LEN];	u_char			rf_ta[ETHER_ADDR_LEN];	u_char			rf_fcs[ETHER_FCS_LEN];};struct cts_frame {	struct frame_control	cf_fc;	u_int16_t		cf_duration;	u_char			cf_ra[ETHER_ADDR_LEN];	u_char			cf_fcs[ETHER_FCS_LEN];};struct ack_frame {	struct frame_control	af_fc;	u_int16_t		af_duration;	u_char			af_ra[ETHER_ADDR_LEN];	u_char			af_fcs[ETHER_FCS_LEN];};// XXX This header does not have its header access function because it shares// the same header space with hdr_mac.struct hdr_mac802_11 {	struct frame_control	dh_fc;	u_int16_t		dh_duration;	u_char			dh_da[ETHER_ADDR_LEN];	u_char			dh_sa[ETHER_ADDR_LEN];	u_char			dh_bssid[ETHER_ADDR_LEN];	u_int16_t		dh_scontrol;	u_char			dh_body[0]; // XXX Non-ANSI};*//* ======================================================================   Definitions   ====================================================================== *//*#define PLCP_HDR_LEN                            \  	((phymib_->PreambleLength >> 3) +        \ 	 (phymib_->PLCPHeaderLength >> 3))#define ETHER_HDR_LEN11				\	(PLCP_HDR_LEN +				\	 sizeof(struct hdr_mac802_11) +		\	 ETHER_FCS_LEN)#define ETHER_RTS_LEN				\        (PLCP_HDR_LEN +				\	 sizeof(struct rts_frame))#define ETHER_CTS_LEN				\         (PLCP_HDR_LEN +			\         sizeof(struct cts_frame))#define ETHER_ACK_LEN				\         (PLCP_HDR_LEN +			\	 sizeof(struct ack_frame))*//* * IEEE 802.11 Spec, section 15.3.2 *	- default values for the DSSS PHY MIB * * not taken from mac-802_11.h to have own PHY and MAC parameters * own class EDCF_PHY_MIB necessary, due to lack of CWmin and max values */#define DSSS_EDCF_SlotTime			0.000020	// 20us#define	DSSS_EDCF_CCATime		        0.000015	// 15us#define DSSS_EDCF_RxTxTurnaroundTime		0.000005	// 5us#define DSSS_EDCF_SIFSTime			0.000010	// 10us#define DSSS_EDCF_PreambleLength	        144		// 144 bits#define DSSS_EDCF_PLCPHeaderLength		48		// 48 bits#define DSSS_EDCF_PLCPDataRate		1.0e6		// 1Mbps/* Must account for propagation delays added by the channel model when * calculating tx timeouts (as set in tcl/lan/ns-mac.tcl). *   -- Gavin Holland, March 2002 */#define DSSS_EDCF_MaxPropagationDelay        0.000002        // 2us   XXXXclass EDCF_PHY_MIB {public:        double          SlotTime;        double          CCATime;        double          RxTxTurnaroundTime;        double          SIFSTime;        u_int32_t       PreambleLength;        u_int32_t       PLCPHeaderLength;        double          PLCPDataRate;};/* * IEEE 802.11 Spec, section 11.4.4.2 *      - default values for the MAC Attributes */#define MAC_EDCF_RTSThreshold		3000		// bytes//#define MAC_EDCF_RTSThreshold		0		// bytes#define MAC_EDCF_ShortRetryLimit	7		// retransmittions#define MAC_EDCF_LongRetryLimit		4		// retransmissions#define MAC_EDCF_FragmentationThreshold	2346		// bytes#define MAC_EDCF_MaxTransmitMSDULifetime	512		// time units#define MAC_EDCF_MaxReceiveLifetime		512		// time units/* ======================================================================   The actual 802.11e MAC class.   ====================================================================== */class Mac802_11e : public Mac {	friend class DeferTimer_802_11e;	friend class SIFSTimer_802_11e;	friend class BackoffTimer_802_11e;	friend class IFTimer_802_11e;	friend class NavTimer_802_11e;	friend class RxTimer_802_11e;	friend class TxTimer_802_11e;	friend class AkaroaTimer; public:	Mac802_11e(EDCF_PHY_MIB* p, MAC_MIB *m);	void		recv(Packet *p, Handler *h);	inline int	hdr_dst(char* hdr, int dst = -2);	inline int	hdr_src(char* hdr, int src = -2);	inline int	hdr_type(char* hdr, u_int16_t type = 0);	void setQ(PriQ* priqueue);		PriQ* queue_;  // for pointer to Queues in priq.cc	double     getAIFS(int pri);	void       defer_stop(int pri);	void       calc_throughput();	double     idle_time;		int 	  rst_cw_mode_;	 protected:	inline void transmit(Packet *p, double t);	void	backoffHandler(int pri);	void	deferHandler(int pri);	void	navHandler(void);	void	recvHandler(void);	void	sendHandler(void);	void	txHandler(void);        // methods for priority-parameters	int     getCW(int level);	double interval_;private:	int   	command(int argc, const char*const* argv);	bool     AIFSset;	bool     CWset;	int     cw_[MAX_PRI];	int     cwmin_[MAX_PRI];	int     cwmax_[MAX_PRI];	double  txop_limit_[MAX_PRI];	Handler*  callback_[MAX_PRI];                /*	 * Called by the timers.	 */	void		recv_timer(void);	void		send_timer(void);	int		check_pktCTRL(int pri);	int		check_pktRTS(int pri);	int		check_pktTx(int pri);	int             levels;	int             slotnum;	double          aifs_[MAX_PRI];	Packet*          packets_[MAX_PRI];                /*	 * Packet Transmission Functions.	 */	void	send(Packet *p, Handler *h);	void 	sendRTS(int pri, int dst);	void	sendCTS(int pri, int dst, double duration);	void	sendACK(int pri, int dst);	void	sendDATA(int pri, Packet *p);	void	RetransmitRTS(int pri);	void	RetransmitDATA(int pri);	/*	 * Packet Reception Functions.	 */	void	recvRTS(Packet *p);	void	recvCTS(Packet *p);	void	recvACK(Packet *p);	void	recvDATA(Packet *p);	void		capture(Packet *p);	void		collision(Packet *p);	void		discard(Packet *p, const char* why);	void		rx_resume(void);	void		tx_resume(void);	inline int	is_idle(void);		/*	 * Debugging Functions.	 */	void		trace_pkt(Packet *p);	void		dump(char* fname);	inline int initialized() {	    	return (phymib_ && macmib_ && cache_ && logtarget_ && Mac::initialized());	}	void mac_log(Packet *p) {		logtarget_->recv(p, (Handler*) 0);	}	double txtime(Packet *p);	double txtime(double psz, double drt);	double txtime(int bytes) { /* clobber inherited txtime() */ abort(); }	inline void inc_cw(int level) {	    //get persistence factor	    pf = queue_->pri_[level].getPF();	    cw_old = cw_[level];	    //calculate new cw_[pri] 	    cw_[level] = ((cw_old + 1) * pf) - 1;	    if(cw_[level] > cwmax_[level]) cw_[level] = cwmax_[level];	}	inline void rst_cw(int level) { 		if(rst_cw_mode_==0)			cw_[level] = cwmin_[level];		else			cw_[level] = int(0.9 * (cw_[level] - cwmin_[level]) * (cw_[level] - cwmin_[level])/ (cwmax_[level] - cwmin_[level])) + cwmin_[level];        }	inline double sec(double t) { return(t *= 1.0e-6); }	inline u_int16_t usec(double t) {		u_int16_t us = (u_int16_t)floor((t *= 1e6) + 0.5);		/* u_int16_t us = (u_int16_t)rint(t *= 1e6); */		return us;	}	inline void set_nav(u_int16_t us) {		double now = Scheduler::instance().clock();		double t = us * 1e-6;		if((now + t) > nav_) {			nav_ = now + t;			if(mhNav_.busy()){				mhNav_.stop();							}			mhNav_.start(t);		}	}	inline void reset_eifs_nav();	    protected:	EDCF_PHY_MIB   	*phymib_;	MAC_MIB		*macmib_;private:	double          eifs_nav_;	double		basicRate_; 	double		dataRate_;	int             numbytes_[MAX_PRI]; // for Akaroa Observation	double          throughput;	double          jitter;	int             rtx_[MAX_PRI];        int    pf;	int cw_old;		/*	 * Contention Free Burst	 */	int     cfb_;	int     cfb_broadcast;	double  cfb_dur; 	int     cfb_active;	void    cfb(int pri);	/*	 * Mac Timers	 */	IFTimer_802_11e		mhIF_;          	// interface timer	NavTimer_802_11e	mhNav_;		        // NAV timer	RxTimer_802_11e		mhRecv_;		// incoming packets	TxTimer_802_11e 	mhSend_;         	// outgoing packets	DeferTimer_802_11e	mhDefer_;       	// defer timer	SIFSTimer_802_11e       mhSifs_;                // defer timer for sifs, not stoppable!	BackoffTimer_802_11e	mhBackoff_;	        // backoff timer	AkaroaTimer             AK;	/* ============================================================	   Internal MAC State	   ============================================================ */	double		nav_;		// Network Allocation Vector	MacState	rx_state_;	// incoming state (MAC_RECV or MAC_IDLE)	MacState	tx_state_[MAX_PRI];	// outgoint state	int		tx_active_;          	// transmitter is ACTIVE	int		sending;          	// transmitter is ACTIVE	Packet		*pktRTS_[MAX_PRI];	// outgoing RTS packet	Packet		*pktCTRL_[MAX_PRI];	// outgoing non-RTS packet        Packet          *pktTx_[MAX_PRI];	//u_int32_t	cw_;		 // Contention Window	u_int32_t	ssrc_[MAX_PRI];  // STA Short Retry Count	u_int32_t	slrc_[MAX_PRI];  // STA Long Retry Count	double		sifs_;		 // Short Interface Space	double		pifs_;		 // PCF Interframe Space	double		difs_;		 // DCF Interframe Space	double		eifs_;  // Extended Interframe Space	        //double		tx_sifs_;	//double		tx_pifs_;	//double		tx_difs_;	//int		min_frame_len_;	NsObject*	logtarget_;	/* ============================================================	   Duplicate Detection state	   ============================================================ */	u_int16_t	sta_seqno_;	// next seqno that I'll use	int		cache_node_count_;	Host		*cache_;};#endif /* __mac_80211e_h__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -