--- ns-2.1b9a/tcl/lib/ns-default.tcl 2002-06-21 00:26:18.000000000 +0200 +++ ns-2.1b9a/tcl/lib/ns-default.tcl 2002-10-21 11:01:29.000000000 +0200 @@ -587,6 +587,10 @@ Mac/Tdma set slot_packet_len_ 1500 Mac/Tdma set max_node_num_ 64 +Mac/802_11 set scan_int_ 0 ;# added by MT +Mac/802_11 set scan_len_ 0 ;# for MAC load scanning +Mac/802_11 set smooth_scan_ 0 ;# smooth the values (0/1) + LL set mindelay_ 50us LL set delay_ 25us LL set bandwidth_ 0 ;# not used --- ns-2.1b9a/mac/mac-timers.h 1999-01-04 20:45:09.000000000 +0100 +++ ns-2.1b9a/mac/mac-timers.h 2002-10-21 10:56:03.000000000 +0200 @@ -119,5 +119,13 @@ void handle(Event *e); }; +//! Timer for scanning the medium - MT +class ScanTimer : public MacTimer { +public: + ScanTimer(Mac802_11 *m) : MacTimer(m) {} + + void handle(Event *e); +}; + #endif /* __mac_timers_h__ */ --- ns-2.1b9a/mac/mac-timers.cc 1999-09-24 05:50:17.000000000 +0200 +++ ns-2.1b9a/mac/mac-timers.cc 2002-10-21 10:58:45.000000000 +0200 @@ -296,3 +296,16 @@ } +/* ====================================================================== + Medium scan Timer - MT + ====================================================================== */ +void +ScanTimer::handle(Event *) +{ + busy_ = 0; + paused_ = 0; + stime = 0.0; + rtime = 0.0; + + mac->scanHandler(); +} --- ns-2.1b9a/mac/mac-802_11.h 2002-03-15 18:26:55.000000000 +0100 +++ ns-2.1b9a/mac/mac-802_11.h 2002-10-21 11:32:52.000000000 +0200 @@ -232,6 +232,7 @@ friend class NavTimer; friend class RxTimer; friend class TxTimer; + friend class ScanTimer; public: Mac802_11(PHY_MIB* p, MAC_MIB *m); void recv(Packet *p, Handler *h); @@ -246,6 +247,7 @@ void recvHandler(void); void sendHandler(void); void txHandler(void); + void scanHandler(void); //!< Scan the medium - MT private: int command(int argc, const char*const* argv); @@ -291,6 +293,7 @@ */ void trace_pkt(Packet *p); void dump(char* fname); + void loadtrace(char* fmt, ...); //!< trace current MAC load in separate file inline int initialized() { return (phymib_ && macmib_ && cache_ && logtarget_ && @@ -346,6 +349,8 @@ DeferTimer mhDefer_; // defer timer BackoffTimer mhBackoff_; // backoff timer + ScanTimer mhScan_; //!< continuously scanning the medium - MT + /* ============================================================ Internal MAC State ============================================================ */ @@ -374,6 +379,18 @@ NsObject* logtarget_; /* ============================================================ + Medium scanning state - MT + ============================================================ */ + double scan_state_[4]; //!< accumulated medium state - MT + int scan_cnt_; //!< medium state scan counter - MT + double scan_int_; //!< parameter for scanning interval - MT + int scan_len_; //!< parameter for maximum scan count - MT + int smooth_scan_; //!< if the scanned values should be smoothed - MT + int macLoad_; //!< current load on MAC layer - MT + + Tcl_Channel ltr_ch; //!< used for logging into file opened through TCL - MT + + /* ============================================================ Duplicate Detection state ============================================================ */ u_int16_t sta_seqno_; // next seqno that I'll use --- ns-2.1b9a/mac/mac-802_11.cc 2002-03-15 18:26:55.000000000 +0100 +++ ns-2.1b9a/mac/mac-802_11.cc 2002-10-21 11:45:59.000000000 +0200 @@ -145,8 +145,7 @@ /* ====================================================================== Mac Class Functions ====================================================================== */ -Mac802_11::Mac802_11(PHY_MIB *p, MAC_MIB *m) : Mac(), mhIF_(this), mhNav_(this), mhRecv_(this), mhSend_(this), mhDefer_(this, p->SlotTime), mhBackoff_(this, p->SlotTime) -{ +Mac802_11::Mac802_11(PHY_MIB *p, MAC_MIB *m) : Mac(), mhIF_(this), mhNav_(this), mhRecv_(this), mhSend_(this), mhDefer_(this, p->SlotTime), mhBackoff_(this, p->SlotTime) , mhScan_(this) { macmib_ = m; phymib_ = p; @@ -191,6 +190,14 @@ bind_bw("dataRate_", &dataRate_); else dataRate_ = bandwidth_; + + // Initialize medium scanning - MT + bind("scan_int_", &scan_int_); + bind("scan_len_", &scan_len_); + bind("smooth_scan_", &smooth_scan_); + scan_cnt_ = 0; + if (scan_int_ > 0) + mhScan_.start(scan_int_); } @@ -210,6 +217,13 @@ assert(cache_); bzero(cache_, sizeof(Host) * (cache_node_count_+1 )); return TCL_OK; + } else if (strcmp(argv[1], "load-trace") == 0) { + if (strcmp(argv[2], "") == 0) { return(TCL_OK); } + int mode; + const char* id = argv[2]; + Tcl& tcl = Tcl::instance(); + ltr_ch = Tcl_GetChannel(tcl.interp(), (char*)id, &mode); + return(TCL_OK); } } return Mac::command(argc, argv); @@ -255,6 +269,16 @@ mhBackoff_.expire()); } +void +Mac802_11::loadtrace(char* fmt, ...) +{ + char buffer[256]; + va_list ap; + va_start(ap, fmt); + vsprintf(buffer, fmt, ap); + (void)Tcl_Write(ltr_ch, buffer, strlen(buffer)); + va_end(ap); +} /* ====================================================================== Packet Headers Routines @@ -533,6 +557,35 @@ tx_active_ = 0; } +// added - MT +void +Mac802_11::scanHandler() +{ + scan_state_[0] += 1 - is_idle(); + scan_cnt_++; + if (scan_cnt_ == scan_len_) { + + scan_state_[0] /= scan_len_; + if (smooth_scan_) { + scan_state_[0] = (scan_state_[0] + 0.8 * scan_state_[1] + 0.5 * scan_state_[2] + 0.2 * scan_state_[3]) / 2.5; + for (int i = 0; i < 3; scan_state_[++i] = scan_state_[i - 1]); + } + macLoad_ = (int) (100 * scan_state_[0]); + + if (ltr_ch != NULL) { + double x, y, z; + ((MobileNode*) netif_->node())->getLoc(&x, &y, &z); + loadtrace("ML %f _%d_ (%.2f/%.2f) %.4f\n", + Scheduler::instance().clock(), addr(), x, y, scan_state_[0]); + } + + scan_cnt_ = 0; + scan_state_[0] = 0; + } + + mhScan_.start(scan_int_); +} + /* ====================================================================== The "real" Timer Handler Routines