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

📄 p802_15_4field.h

📁 Low Rate Wireless Personal Area Networks (LR-WPANs)in C
💻 H
字号:
/********************************************//*     NS2 Simulator for IEEE 802.15.4      *//*           (per P802.15.4/D18)            *//*------------------------------------------*//* by:        Jianliang Zheng               *//*        (zheng@ee.ccny.cuny.edu)          *//*              Myung J. Lee                *//*          (lee@ccny.cuny.edu)             *//*        ~~~~~~~~~~~~~~~~~~~~~~~~~         *//*           SAIT-CUNY Joint Lab            *//********************************************/// File:  p802_15_4field.h// Mode:  C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t// $Header: p802_15_4field.h,v 1.1 2004/10/15 17:32:08 zheng Exp $/* * Copyright (c) 2003-2004 Samsung Advanced Institute of Technology and * The City University of New York. 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 Joint Lab of Samsung  *      Advanced Institute of Technology and The City University of New York. * 4. Neither the name of Samsung Advanced Institute of Technology nor of  *    The City University of New York may be used to endorse or promote  *    products derived from this software without specific prior written  *    permission. * * THIS SOFTWARE IS PROVIDED BY THE JOINT LAB OF SAMSUNG ADVANCED INSTITUTE * OF TECHNOLOGY AND THE CITY UNIVERSITY OF NEW YORK ``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 SAMSUNG ADVANCED INSTITUTE OR THE CITY UNIVERSITY OF NEW YORK  * 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. */#ifndef p802_15_4field_h#define p802_15_4field_h#include "p802_15_4def.h"/*#define STORELADDR(value,addr)	((*((unsigned char *)addr)) = ((*value) & 255 ,\				 (*((unsigned char *)addr+1)) = ((*value) >> 8) & 255 ,\				 (*((unsigned char *)addr+2)) = ((*value) >> 16) & 255 ,\				 (*((unsigned char *)addr+3)) = ((*value) >> 24) & 255 ,\				 (*((unsigned char *)addr+4)) = ((*value) >> 32) & 255 ,\				 (*((unsigned char *)addr+5)) = ((*value) >> 40) & 255 ,\				 (*((unsigned char *)addr+6)) = ((*value) >> 48) & 255 ,\				 (*((unsigned char *)addr+7)) = ((*value) >> 56) & 255))#define GETLADDR(addr)		 ((*(unsigned char *)(addr)) |\				(*(((unsigned char *)(addr))+1) << 8) |\				(*(((unsigned char *)(addr))+2) << 16) |\				(*(((unsigned char *)(addr))+3) << 24) |\				(*(((unsigned char *)(addr))+4) << 32) |\				(*(((unsigned char *)(addr))+5) << 40) |\				(*(((unsigned char *)(addr))+6) << 48) |\				(*(((unsigned char *)(addr))+7) << 56))#define STORESADDR(value,addr)	((*((unsigned char *)addr)) = ((*value) & 255 ,\				 (*((unsigned char *)addr+1)) = ((*value) >> 8) & 255))#define GETSADDR(addr)		((*(unsigned char *)(addr)) |\				(*(((unsigned char *)(addr))+1) << 8))*/	//--MAC frame control field (leftmost bit numbered 0)---//types (3 bits) -- we reverse the bit order for convenient operation#define defFrmCtrl_Type_Beacon		0x00#define defFrmCtrl_Type_Data		0x04#define defFrmCtrl_Type_Ack		0x02#define defFrmCtrl_Type_MacCmd		0x06//dest/src addressing mode (2 bits) -- we reverse the bit order for convenient operation#define defFrmCtrl_AddrModeNone		0x00#define defFrmCtrl_AddrMode16		0x01#define defFrmCtrl_AddrMode64		0x03struct FrameCtrl{	UINT_16 FrmCtrl;		//(PSDU/MPDU) Frame Control (Figure 35)					// --leftmost bit numbered 0 and transmitted first					// --(012):	Frame type (Table 65)					//		 --(210)=000:		Beacon					//		 --(210)=001:		Data					//		 --(210)=010:		Ack.					//		 --(210)=011:		MAC command					//		 --(210)=others:	Reserved					// --(3):	Security enabled					// --(4):	Frame pending					// --(5):	Ack. req.					// --(6):	Intra PAN					// --(789):	Reserved					// --(ab):	Dest. addressing mode (Table 66)					//		 --(ba)=00:	PAN ID and Addr. field not present					//		 --(ba)=01:	Reserved					//		 --(ba)=10:	16-bit short address					//		 --(ba)=11:	64-bit extended address					// --(cd):	Reserved					// --(ef):	Source addressing mode (see Dest. addressing mode)	UINT_8 frmType;	bool secu;	bool frmPending;	bool ackReq;	bool intraPan;	UINT_8 dstAddrMode;	UINT_8 srcAddrMode;		void parse(void)	{		frmType = (FrmCtrl & 0xe000) >> 13;		secu = ((FrmCtrl & 0x1000) == 0)?false:true;		frmPending = ((FrmCtrl & 0x0800) == 0)?false:true;		ackReq = ((FrmCtrl & 0x0400) == 0)?false:true;		intraPan = ((FrmCtrl & 0x0200) == 0)?false:true;		dstAddrMode = (FrmCtrl & 0x0030) >> 4;		srcAddrMode = (FrmCtrl & 0x0003);	}	void setFrmType(UINT_8 frmtype)	{		frmType = frmtype;		FrmCtrl = (FrmCtrl & 0x1fff) + (frmtype << 13);	}	void setSecu(bool sc)	{		secu = sc;		FrmCtrl = (FrmCtrl & 0xefff);		if (sc) FrmCtrl += 0x1000;	}	void setFrmPending(bool pending)	{		frmPending = pending;		FrmCtrl = (FrmCtrl & 0xf7ff);		if (pending) FrmCtrl += 0x0800;	}	void setAckReq(bool ack)	{		ackReq = ack;		FrmCtrl = (FrmCtrl & 0xfbff);		if (ack) FrmCtrl += 0x0400;	}	void setIntraPan(bool intrapan)	{		intraPan = intrapan;		FrmCtrl = (FrmCtrl & 0xfdff);		if (intrapan) FrmCtrl += 0x0200;	}	void setDstAddrMode(UINT_8 dstmode)	{		dstAddrMode = dstmode;		FrmCtrl = (FrmCtrl & 0xffcf) + (dstmode << 4);	}	void setSrcAddrMode(UINT_8 srcmode)	{		srcAddrMode = srcmode;		FrmCtrl = (FrmCtrl & 0xfffc) + srcmode;	}};struct SuperframeSpec			//refer to Figures 40,59{	UINT_16 SuperSpec;		//(MSDU) Superframe Specification (Figure 40)					// --(0123):	Beacon order					// --(4567):	Superframe order					// --(89ab):	Final CAP slot					// --(c):	Battery life extension					// --(d):	Reserved					// --(e):	PAN Coordinator					// --(f):	Association permit	UINT_8 BO;	UINT_32 BI;	UINT_8 SO;	UINT_32 SD;	UINT_32 sd;	UINT_8 FinCAP;	bool BLE;	bool PANCoor;	bool AssoPmt;	void parse(void)	{		BO = (SuperSpec & 0xf000) >> 12;		BI = aBaseSuperframeDuration * (1 << BO);		SO = (SuperSpec & 0x0f00) >> 8;		SD = aBaseSuperframeDuration * (1 << SO);	//superframe duration		sd = aBaseSlotDuration * (1 << SO);		//slot duration		FinCAP = (SuperSpec & 0x00f0) >> 4;		BLE = ((SuperSpec & 0x0008) == 0)?false:true;		PANCoor = ((SuperSpec & 0x0002) == 0)?false:true;		AssoPmt = ((SuperSpec & 0x0001) == 0)?false:true;	}	void setBO(UINT_8 bo)	{		BO = bo;		BI = aBaseSuperframeDuration * (1 << BO);		SuperSpec = (SuperSpec & 0x0fff) + (bo << 12);	}	void setSO(UINT_8 so)	{		SO = so;		SD = aBaseSuperframeDuration * (1 << SO);		sd = aBaseSlotDuration * (1 << SO);		SuperSpec = (SuperSpec & 0xf0ff) + (so << 8);	}	void setFinCAP(UINT_8 fincap)	{		FinCAP = fincap;		SuperSpec = (SuperSpec & 0xff0f) + (fincap << 4);	}	void setBLE(bool ble)	{		BLE = ble;		SuperSpec = (SuperSpec & 0xfff7);		if (ble) SuperSpec += 8;	}	void setPANCoor(bool pancoor)	{		PANCoor = pancoor;		SuperSpec = (SuperSpec & 0xfffd);		if (pancoor) SuperSpec += 2;	}	void setAssoPmt(bool assopmt)	{		AssoPmt = assopmt;		SuperSpec = (SuperSpec & 0xfffe);		if (assopmt) SuperSpec += 1;	}	};struct GTSDescriptor{	UINT_16 devAddr16;	UINT_8 slotSpec;	// --(0123):	GTS starting slot				// --(4567):	GTS length};struct GTSFields{	UINT_8 spec;		//GTS specification				// --(012):	GTS descriptor count				// --(3456):	reserved				// --(7):	GTS permit	UINT_8 dir;		//GTS directions				// --(0123456):	for up to 7 descriptors:				//		1 = receive only (w.r.t. data transmission by the device)				//		0 = transmit only (w.r.t. data transmission by the device)				// --(7):	reserved	GTSDescriptor list[7];	//GTS descriptor list};struct GTSSpec{	GTSFields fields;	UINT_8 count;		//GTS descriptor count	bool permit;		//GTS permit	bool recvOnly[7];	//reception only	UINT_8 slotStart[7];	//starting slot	UINT_8 length[7];	//length in slots	void parse(void)	{		int i;		count = (fields.spec & 0xe0) >> 5;		permit = ((fields.spec & 0x01) != 0)?true:false;		for (i=0;i<count;i++)		{			recvOnly[i] = ((fields.dir & (1<<(7-i))) != 0);			slotStart[i] = (fields.list[i].slotSpec & 0xf0) >> 4;			length[i] = (fields.list[i].slotSpec & 0x0f);		}	}	void setCount(UINT_8 cnt)	{		count = cnt;		fields.spec = (fields.spec & 0x1f) + (cnt << 5);	}	void setPermit(bool pmt)	{		permit = pmt;		fields.spec = (fields.spec & 0xfe);		if (pmt) fields.spec += 1;	}	void setRecvOnly(UINT_8 ith,bool rvonly)	{		recvOnly[ith] = rvonly;		fields.dir = fields.dir & ((1<<(7-ith))^0xff);		if (rvonly) fields.dir += (1<<(7-ith));	}	void setSlotStart(UINT_8 ith,UINT_8 st)	{		slotStart[ith] = st;		slotStart[ith] = (fields.list[ith].slotSpec & 0x0f) + (st << 4);	}	void setLength(UINT_8 ith,UINT_8 len)	{		length[ith] = len;		length[ith] = (fields.list[ith].slotSpec & 0xf0) + len;	}	int size(void)	{		count = (fields.spec & 0xe0) >> 5;		return (1 + 1 + 3 * count);	}};struct PendAddrFields{	UINT_8 spec;		//Pending address specification field (refer to Figure 44)				// --(012):	num of short addresses pending				// --(3):	reserved				// --(456):	num of extended addresses pending				// --(7):	reserved	IE3ADDR addrList[7];	//pending address list (shared by short/extended addresses)};struct PendAddrSpec{	PendAddrFields fields;	UINT_8 numShortAddr;	//num of short addresses pending	UINT_8 numExtendedAddr;	//num of extended addresses pending	//for constructing the fields	UINT_8 addShortAddr(UINT_16 sa)	{		int i;		if (numShortAddr + numExtendedAddr >= 7)			return (numShortAddr + numExtendedAddr);		//only unique address added		for (i=0;i<numShortAddr;i++)		if (fields.addrList[i] == sa)			return (numShortAddr + numExtendedAddr);		fields.addrList[numShortAddr] = sa;		numShortAddr++;		return (numShortAddr + numExtendedAddr);	}	UINT_8 addExtendedAddr(IE3ADDR ea)	{		int i;		if (numShortAddr + numExtendedAddr >= 7)			return (numShortAddr + numExtendedAddr);		//only unique address added		for (i=6;i>6-numExtendedAddr;i--)		if (fields.addrList[i] == ea)			return (numShortAddr + numExtendedAddr);		//save the extended address in reverse order		fields.addrList[6-numExtendedAddr] = ea;		numExtendedAddr++;		return (numShortAddr + numExtendedAddr);	}	void format(void)	{		//realign the addresses		int i;		IE3ADDR tmpAddr;		//restore the order of extended addresses		for (i=0;i<numExtendedAddr;i++)		{			if ((7 - numExtendedAddr + i) < (6 - i))			{				tmpAddr = fields.addrList[7 - numExtendedAddr + i];				fields.addrList[7 - numExtendedAddr + i] = fields.addrList[6 - i];				fields.addrList[6 - i] = tmpAddr;			}		}		//attach the extended addresses to short addresses		for (i=0;i<numExtendedAddr;i++)			fields.addrList[numShortAddr + i] = fields.addrList[7 - numExtendedAddr + i];		//update address specification		fields.spec = ((numShortAddr) << 5) + (numExtendedAddr << 1);	}	//for parsing the received fields	void parse(void)	{		numShortAddr = (fields.spec & 0xe0) >> 5;		numExtendedAddr = (fields.spec & 0x0e) >> 1;	}	int size(void)	{		parse();		return (1 + numShortAddr * 2 + numExtendedAddr * 8);	}};struct DevCapability{	UINT_8 cap;		//refer to Figure 49				// --(0):	alternate PAN coordinator				// --(1):	device type (1=FFD,0=RFD)				// --(2):	power source (1=mains powered,0=non mains powered)				// --(3):	receiver on when idle				// --(45):	reserved				// --(6):	security capability				// --(7):	allocate address (asking for allocation of a short address during association)	bool alterPANCoor;	bool FFD;	bool mainsPower;	bool recvOnWhenIdle;	bool secuCapable;	bool alloShortAddr;	void parse(void)	{		alterPANCoor = ((cap & 0x80) != 0)?true:false;		FFD = ((cap & 0x40) != 0)?true:false;		mainsPower = ((cap & 0x20) != 0)?true:false;		recvOnWhenIdle = ((cap & 0x10) != 0)?true:false;		secuCapable = ((cap & 0x02) != 0)?true:false;		alloShortAddr = ((cap & 0x01) != 0)?true:false;	}	void setAlterPANCoor(bool alterPC)	{		alterPANCoor = alterPC;		cap = (cap & 0x7f);		if (alterPC) cap += 0x80;	}	void setFFD(bool ffd)	{		FFD = ffd;		cap = (cap & 0xbf);		if (ffd) cap += 0x40;	}	void setMainPower(bool mp)	{		mainsPower = mp;		cap = (cap & 0xdf);		if (mp) cap += 0x20;	}	void setRecvOnWhenIdle(bool onidle)	{		recvOnWhenIdle = onidle;		cap = (cap & 0xef);		if (onidle) cap += 0x10;	}	void setSecuCapable(bool sc)	{		secuCapable = sc;		cap = (cap & 0xfd);		if (sc) cap += 0x02;	}	void setAlloShortAddr(bool alloc)	{		alloShortAddr = alloc;		cap = (cap & 0xfe);		if (alloc) cap += 0x01;	}};#endif// End of file: p802_15_4field.h

⌨️ 快捷键说明

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