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

📄 mac.h

📁 ns2 中802.11 mac层的实现代码!
💻 H
字号:
/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * Copyright (c) 1997 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the Daedalus Research *	Group at the University of California Berkeley. * 4. Neither the name of the University nor of the Laboratory may be used *    to endorse or promote products derived from this software without *    specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * Contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen * * @(#) $Header: /u23/ns-user/cvsroot/ns-2/mac.h,v 1.1.1.1.6.2 2001/08/20 12:04:15 dugdale Exp $ (UCB) *//* * Code contained within lines such as the below *  // wqos - <date> - dugdale  // wqos - changes by dugdale ends * * or *  // wqos - <date> - almquist  // wqos - changes by almquist ends * * have been changed or added to implement the PCF mode of IEEE 802.11 and is * Copyright (c) 2001 Anders Lindgren and Andreas Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the above disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the above disclaimer in the *    documentation and/or other materials provided with the distribution. * *    The disclaimer above apply to the modifications made to the source code *    by Anders Lindgren and Andreas Almquist as well as to the rest of the code. */#ifndef ns_mac_h#define ns_mac_h#include <assert.h>#include "bi-connector.h"#include "packet.h"#include "ip.h"#include "route.h"#include "ll.h"#include "phy.h"#include "marshall.h"#include "channel.h"class Channel;#define ZERO	0.00000/* * Medium Access Control (MAC) */#define EF_COLLISION 2		// collision error flag/* ======================================================================   Defines / Macros used by all MACs.   ====================================================================== */#define ETHER_ADDR(x)	(GET4BYTE(x))#define MAC_HDR_LEN	64#define MAC_BROADCAST	((u_int32_t) 0xffffffff)#define BCAST_ADDR -1#define ETHER_ADDR_LEN	6#define ETHER_TYPE_LEN	2#define ETHER_FCS_LEN	4#define ETHERTYPE_IP	0x0800#define ETHERTYPE_ARP	0x0806enum MacState {	MAC_IDLE	= 0x0000,	MAC_POLLING	= 0x0001,	MAC_RECV 	= 0x0010,	MAC_SEND 	= 0x0100,	MAC_RTS		= 0x0200,	MAC_CTS		= 0x0400,	MAC_ACK		= 0x0800,	MAC_COLL	= 0x1000,	// wqos - Thu 26 Oct 00, 16:13 - dugdale	MAC_BEACONING   = 0x2000 // Beaconing...	// wqos - changes by dugdale ends};enum MacFrameType {	MF_BEACON	= 0x0008, // beaconing	MF_CONTROL	= 0x0010, // used as mask for control frame	MF_SLOTS	= 0x001a, // announce slots open for contention	MF_RTS		= 0x001b, // request to send	MF_CTS		= 0x001c, // clear to send, grant	MF_ACK		= 0x001d, // acknowledgement	MF_CF_END	= 0x001e, // contention free period end	MF_POLL		= 0x001f, // polling	MF_DATA		= 0x0020, // also used as mask for data frame	MF_DATA_ACK	= 0x0021  // ack for data frames};struct hdr_mac {	MacFrameType ftype_;	// frame type	int macSA_;		// source MAC address	int macDA_;		// destination MAC address	u_int16_t hdr_type_;     // mac_hdr type	double txtime_;		// transmission time	double sstime_;		// slot start time	int padding_;	inline void set(MacFrameType ft, int sa, int da=-1) {		ftype_ = ft;		macSA_ = sa;		if (da != -1)  macDA_ = da;	}	inline MacFrameType& ftype() { return ftype_; }	inline int& macSA() { return macSA_; }	inline int& macDA() { return macDA_; }	inline u_int16_t& hdr_type() {return hdr_type_; }	inline double& txtime() { return txtime_; }	inline double& sstime() { return sstime_; }	// Header access methods	static int offset_;	inline static int& offset() { return offset_; }	inline static hdr_mac* access(const Packet* p) {		return (hdr_mac*) p->access(offset_);	}};/* ===================================================================   Objects that want to promiscously listen to the packets before   address filtering must inherit from class Tap in order to plug into   the tap   =================================================================*/class Tap {public:	virtual void tap(const Packet *p) = 0;	// tap is given all packets received by the host.	// it must not alter or free the pkt.  If you want to frob it, copy it.};class MacHandlerResume : public Handler {public:	MacHandlerResume(Mac* m) : mac_(m) {}	void handle(Event*);protected:	Mac* mac_;};class MacHandlerSend : public Handler {public:	MacHandlerSend(Mac* m) : mac_(m) {}	void handle(Event*);protected:	Mac* mac_;};/* ==================================================================   MAC data structure   ================================================================*/class Mac : public BiConnector {public:	Mac();	virtual void recv(Packet* p, Handler* h);	virtual void sendDown(Packet* p);	virtual void sendUp(Packet *p);	virtual void resume(Packet* p = 0);	virtual void installTap(Tap *t) { tap_ = t; }		inline double txtime(int bytes) {		return (8. * bytes / bandwidth_);	} 	inline double txtime(Packet* p) {		return 8. * (MAC_HDR_LEN + \			     (HDR_CMN(p))->size()) / bandwidth_;	}	inline double bandwidth() const { return bandwidth_; }		inline int addr() { return index_; }	inline MacState state() { return state_; }	inline MacState state(int m) { return state_ = (MacState) m; }	        //mac methods to set dst, src and hdt_type in pkt hdrs.	// note: -1 is the broadcast mac addr.	virtual inline int hdr_dst(char* hdr, int dst = -2) {		struct hdr_mac *dh = (struct hdr_mac*) hdr;		if(dst > -2)			dh->macDA_ = dst;		return dh->macDA();	}	virtual inline int hdr_src(char* hdr, int src = -2) {		struct hdr_mac *dh = (struct hdr_mac*) hdr;		if(src > -2)			dh->macSA_ = src;		return dh->macSA();	}	virtual inline int hdr_type(char *hdr, u_int16_t type = 0) {		struct hdr_mac *dh = (struct hdr_mac*) hdr;		if (type)			dh->hdr_type_ = type;		return dh->hdr_type();	}	// wqos - Fri 13 Oct 00, 12:50 - dugdale	inline void setll(LL *ll) {ll_ = ll;}	// wqos - changes by dugdale ends	private:        void mac_log(Packet *p) {                logtarget_->recv(p, (Handler*) 0);        }        NsObject*       logtarget_;protected:	int command(int argc, const char*const* argv);	virtual int initialized() { 		return (netif_ && uptarget_ && downtarget_); 	}	int index_;		// MAC address	double bandwidth_;      // channel bitrate	double delay_;		// MAC overhead	int abstract_;         //   MAC support for abstract LAN         	Phy *netif_;            // network interface        Tap *tap_;              // tap agent	LL *ll_;             	// LL this MAC is connected to	Channel *channel_;	// channel this MAC is connected to	Handler* callback_;	// callback for end-of-transmission	MacHandlerResume hRes_;	// resume handler	MacHandlerSend hSend_;	// handle delay send due to busy channel	Event intr_;	/*	 * Internal MAC State	 */	MacState state_;	// MAC's current state	Packet *pktRx_;	Packet *pktTx_;};#endif

⌨️ 快捷键说明

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