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

📄 ll-nodeb.h

📁 对ns2软件进行UMTS扩展
💻 H
字号:
/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* By Pablo Martin and Paula Ballester, * Strathclyde University, Glasgow. * June, 2003.*//* Copyright (c) 2003 Strathclyde University of Glasgow, Scotland. * 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 and binary code must contain * the above copyright notice, this list of conditions and the following * disclaimer. * * 2. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed at Strathclyde University of * Glasgow, Scotland. * * 3. The name of the University may not be used to endorse or promote * products derived from this software without specific prior written * permission. * STRATHCLYDE UNIVERSITY OF GLASGOW, MAKES NO REPRESENTATIONS * CONCERNING EITHER THE MERCHANTABILITY OF THIS SOFTWARE OR THE * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE.  The software * is provided "as is" without express or implied warranty of any kind.*/#ifndef ns_ll_nodeb_h#define ns_ll_nodeb_h#include "marshall.h"#include <connector.h>#include <random.h>#include <mac.h>#include "packet.h"#include "delay.h"#include "queue.h"#include "rlc-umts-nodeb.h"#include "phy-umts-nodeb.h"#include "linked-list.h"#include "ll-flows.h"#include "tree.h"#include "bsfc-queue.h"#include <ll.h>#include <arp.h>#include <classifier.h>#include <lanRouter.h>#include <varp.h>/*************************** Timers *****************************/class LLNodeb;class AppsNodebTimer : public Handler {public:	AppsNodebTimer(LLNodeb* m, double s = 0) : ll(m), Next(0) {		busy_ = paused_ = 0;stime = rtime = 0.0; src_ = -1; dest_ = -1; size_ = 0; flow_ = -1;}	virtual void handle(Event *e);	virtual void start(double time);	virtual void stop(void);	virtual void pause(void) { assert(0); }	virtual void resume(void) { assert(0); }	LLNodeb	*ll;  	int 		flow_;	nsaddr_t	src_;	nsaddr_t	dest_;	int 		size_;	int		busy_;	int		paused_;	Event		intr;	double	stime;	// start time	double	rtime;	// remaining time	AppsNodebTimer* 	Next;};typedef AppsNodebTimer* TimerNodebPtr;class TNodebList{ public:  TNodebList(LLNodeb* m) : ll(m) {   	Head = new AppsNodebTimer(ll); Tail=Head; CurrentPtr = Head;  }  ~TNodebList();  TimerNodebPtr Previous(TimerNodebPtr);  void AddANode(nsaddr_t src, nsaddr_t dest, int size, int flow);  void DeleteANode(TimerNodebPtr);  void DeleteANode(nsaddr_t src, int flow);  TimerNodebPtr GetNode(nsaddr_t src, int flow);  void start(nsaddr_t src, int flow, double time);  void stop(nsaddr_t src, int flow);  LLNodeb *ll;  TimerNodebPtr Head,Tail,CurrentPtr;};class ReleaseUETimer : public Handler {public:	ReleaseUETimer(LLNodeb* m, double s = 0) : ll(m), Next(0) {		busy_ = paused_ = 0; stime = rtime = 0.0; addr_ = -1;	}	void handle(Event *e);	void start(double time);	void stop(void);	virtual void pause(void) { assert(0); }	virtual void resume(void) { assert(0); }	inline int busy(void) { return busy_; }	inline int paused(void) { return paused_; }	LLNodeb	*ll;	int	busy_;	int	paused_;	Event intr;	double stime;	// start time	double rtime;	// remaining time  	int addr_;	ReleaseUETimer* 	Next;};typedef ReleaseUETimer* RTimerNodebPtr;class RTNodebList{ public:  RTNodebList(LLNodeb* m) : ll(m) {   	Head = new ReleaseUETimer(ll); Tail=Head; CurrentPtr = Head;  }  ~RTNodebList();  RTimerNodebPtr Previous(RTimerNodebPtr);  void AddANode(int addr);  void DeleteANode(RTimerNodebPtr);  void DeleteANode(int addr);  RTimerNodebPtr GetNode(int addr);  void start(int addr, double time);  void stop(int addr);  LLNodeb *ll;  RTimerNodebPtr Head,Tail,CurrentPtr;};////////////////////////////////////////////////////////////////////////////////*                             Class LLNodeb                                 *////////////////////////////////////////////////////////////////////////////////struct location {		// for the static matrix	nsaddr_t ue_;	// UE IP address	nsaddr_t nodeb_;	// Node B IP address at which is attached the UE};struct loc {	// for internal purposes	nsaddr_t ipaddr_;		// UE IP address	int phyaddr_;		// UE physical address	int dltempsf_;		// spreading factor temporal storage	int dlsf_;			// downlink spreading factor assigned to that UE	int dlfreq_;		// downlink frequence assigned to that UE	double dltotalr_;		// downlink total physical rate to that UE};class LLNodeb : public LL {	friend class ReleaseUETimer;	friend class AppsNodebTimer;	friend class TNodebList;	friend class RTNodebList;public:	LLNodeb();	virtual void recv(Packet* p, Handler* h);	int register_ue(Packet* p);	// registers the new UE in its internal structure	int alloc_res(Packet* p, int sf); // allocate resources in the OSVF trees	int getcode(nsaddr_t src, int flow);// returns the code for applications originated in fixed nodes	int cal_sf(Packet* p);		// calculates the spreading factor for a given packet	int cal_sf(double rate);	// calculates the spreading factor for a given physical rate	double get_bytes(int pos);    // gets bytes per tti for a specific user in IFQ	int remove_res(int pos);	// remove resources in the OSVF trees	void update_db(Packet* p);	// update the static structure registry_	void send_setup_reply(Packet* p);   // send SETUP REPLY message for setup procedure and handover	void send_release_reply(Packet* p);	// send release reply message	int getip(nsaddr_t addr);	// get the IP address	void pag_proc(Packet* p, int pos); // send paging message to the destination of the incoming flow	void send_to_ra(Packet* p);	// send the packet to the routing agent	void send_res_reply(Packet* p, int state);	// send the resource reply message or a failure	void send_msg(Packet* p, int loc);	// send data packets downwards	int free_res(Packet* p);// allocate downlink resources in this layer and OSVF trees if there are					// enough available (returns 1) and returns 0 if not.	double phy_rate(double rate, int code, int psize); // returns the physical rate corresponding for the user rate,									   // channel coding and packet size passed	int look_for(nsaddr_t ad);	// returns the position in ue_info_[] for that UE	int ue_node(nsaddr_t source);	void update_nodeb(Packet* p, nsaddr_t addr); // send a HANDOVER message to the former Nodeb for the incoming UE	virtual void update_flow(int acked, int fraged, int flowid, nsaddr_t src, int handover); // give resources												// in RLC layer for the flow	virtual void configure_flow(int flow, const char*const& type , double rate) {} //	void remove_flow_ul(Packet* p, int pos);	// remove the uplink resources allocated for that flow	void remove_flow_dl(Packet* p);	// remove downlink resources allocated for that flow	void filltype(Packet* p);	// fill rlc header fields: frag_ and ack_ depending on the flow	void update_phy_bytes_slot(int pos);	// calculate and update bytes in physical layer	void RemoveUEHandler(int addr); // handler for ReleaseUETimer, release resources in physical layer and mac layer	void RemoveFlowHandler(nsaddr_t src, nsaddr_t dest, int size, int flow); // handler for AppsNodebTimer								// (contained in TNodebList), send a Connection release message      inline PhyUmtsNodeb *phy() { return phy_; }protected:	int command(int argc, const char*const* argv);	PhyUmtsNodeb* phy_;			// physical layer	RlcUmtsNodeb* rlc_;			// rlc layer	BsFCQueue* ifq_;				// ifq	static location registry_[MAX_NUM_NODES];	// matrix with all UE location in every moment.	loc ue_info_[MAX_NUM_UE];	// information about the UEs in our cell	tree *dl_sftree[MAX_NUM_FREQ];	// OVSF trees	nsaddr_t ip_nodeb_;		// our IP address	FlowList *flows_; 		// information about stored flows	PacketQueue *fl_;			// temporary storage of the fixed flows waiting for paging response	linked_list *refused;		// list with the refused flows	TNodebList	*removeflow_;	// list of timers to detect when an application has finished	RTNodebList	*remove_;	// list of timers to release physical resources for a UE	static int verbose_;	Event intr;};#endif

⌨️ 快捷键说明

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