patch-wimax-prerelease-092206
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:477k
源码类别:

网络

开发平台:

C/C++

  1. diff -Naur ns-2.29-org/common/packet.h ns-2.29/common/packet.h
  2. --- ns-2.29-org/common/packet.h 2006-09-22 11:53:10.000000000 -0400
  3. +++ ns-2.29/common/packet.h 2006-09-22 17:27:47.000000000 -0400
  4. @@ -167,6 +167,9 @@
  5.   // HDLC packet
  6.   PT_HDLC,
  7.  
  8. + // WIMAX inter-BS packets
  9. + PT_WIMAXBS,
  10. +
  11.   // insert new packet types here
  12.   PT_NTYPE // This MUST be the LAST one
  13.  };
  14. @@ -263,6 +266,9 @@
  15.   // XCP
  16.   name_[PT_XCP]="xcp";
  17.  
  18. + // WIMAX
  19. + name_[PT_WIMAXBS]="wimaxCtrl";
  20. +
  21.   name_[PT_NTYPE]= "undefined";
  22.   }
  23.   const char* name(packet_t p) const { 
  24. diff -Naur ns-2.29-org/mac/mac-stats.h ns-2.29/mac/mac-stats.h
  25. --- ns-2.29-org/mac/mac-stats.h 1969-12-31 19:00:00.000000000 -0500
  26. +++ ns-2.29/mac/mac-stats.h 2006-09-22 17:27:47.000000000 -0400
  27. @@ -0,0 +1,273 @@
  28. +/* This software was developed at the National Institute of Standards and
  29. + * Technology by employees of the Federal Government in the course of
  30. + * their official duties. Pursuant to title 17 Section 105 of the United
  31. + * States Code this software is not subject to copyright protection and
  32. + * is in the public domain.
  33. + * NIST assumes no responsibility whatsoever for its use by other parties,
  34. + * and makes no guarantees, expressed or implied, about its quality,
  35. + * reliability, or any other characteristic.
  36. + * <BR>
  37. + * We would appreciate acknowledgement if the software is used.
  38. + * <BR>
  39. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  40. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  41. + * FROM THE USE OF THIS SOFTWARE.
  42. + * </PRE></P>
  43. + * @author woon
  44. + */
  45. +
  46. +#ifndef mac_stats_h
  47. +#define mac_stats_h
  48. +
  49. +/** Action to execute on the threshold */
  50. +enum threshold_action_t {
  51. +  NO_ACTION_TH,
  52. +  INIT_ACTION_TH,
  53. +  ROLLBACK_ACTION_TH,
  54. +  EXEC_ACTION_TH
  55. +};
  56. +
  57. +/**
  58. + * NIST: Stats Watch
  59. + * Used to maintain statistics of a particular parameter
  60. + *
  61. + * Positive gradient means that when the value measured increases, it will trigger INIT_ACTION_TH 
  62. + * A positive gradient is used for measurements such as packet loss, where as negative gradient
  63. + * is used for RSSI.
  64. + */
  65. +class StatWatch : public TimerHandler {
  66. +public:
  67. +  StatWatch(double ti=1, double alpha=1, bool pos_gradient=true) : TimerHandler() { 
  68. + timer_interval_ = ti;
  69. + alpha_ = alpha;
  70. + pos_gradient_ = pos_gradient;
  71. + current_ = 0;
  72. + average_ = 0;
  73. + instant_ = 0;
  74. + total_ = 0;
  75. + sample_number_ = 0;
  76. + th_set_ = false;
  77. + init_sent_ = false;
  78. + init_th_ = 0;
  79. + rollback_th_ = 0;
  80. + exec_th_ = 0;
  81. + pending_action_ = NO_ACTION_TH;
  82. + delay_ = 0;
  83. + }
  84. + virtual void expire(Event*) { schedule_next(); }
  85. +
  86. + inline void reset() {
  87. + average_ = 0;
  88. + instant_ = 0;
  89. + total_ = 0;
  90. + sample_number_ = 0;
  91. + }
  92. +
  93. + inline void set_thresholds (double init_th, double rollback_th, double exec_th) {
  94. +   assert ( (pos_gradient_ && rollback_th <= init_th && init_th <= exec_th)
  95. +    || (!pos_gradient_ && rollback_th >= init_th && init_th >= exec_th));
  96. +   init_th_ = init_th;
  97. +   rollback_th_ = rollback_th;
  98. +   exec_th_ = exec_th;
  99. +   th_set_ = true;
  100. + }
  101. +
  102. + inline void set_timer_interval(double ti) { timer_interval_ = ti; }
  103. + inline void set_alpha(double a) { alpha_= a; }
  104. + inline void set_current(double c) { current_= c; }
  105. + inline void set_pos_gradient(bool b) { pos_gradient_ = b; }
  106. + inline void set_delay (double d) { delay_ = d; }
  107. + virtual threshold_action_t update(double new_val) {
  108. +   old_average_ = average_;
  109. +   average_ = alpha_*new_val + (1-alpha_)*average_;
  110. +   total_ += new_val;
  111. +   sample_number_++;
  112. +   instant_ = new_val;
  113. +   
  114. +   //evaluate if threshold has been crossed
  115. +   if (th_set_) {
  116. +     if (pos_gradient_) {
  117. +       //check if threshold is crossed
  118. +       if (old_average_ > rollback_th_ && average_ <= rollback_th_ && init_sent_) {
  119. + pending_action_ = ROLLBACK_ACTION_TH;
  120. + ts_ = NOW+delay_;
  121. +       } else if (old_average_ < exec_th_ && average_ >= exec_th_) {
  122. + pending_action_ = EXEC_ACTION_TH;
  123. + ts_ = NOW+delay_;
  124. +       } else if (old_average_ < init_th_ && average_ >= init_th_) {
  125. + pending_action_ = INIT_ACTION_TH;
  126. + ts_ = NOW+delay_;
  127. +       } else {
  128. + //check if threshold is canceled
  129. + if (pending_action_ == ROLLBACK_ACTION_TH && average_ > rollback_th_
  130. +     || pending_action_ == EXEC_ACTION_TH && average_ < exec_th_
  131. +     || pending_action_ == INIT_ACTION_TH && average_ < init_th_) {
  132. +   pending_action_ = NO_ACTION_TH;
  133. + }
  134. +       }
  135. +       //check if action is still valid
  136. +       if (pending_action_ != NO_ACTION_TH && NOW >= ts_) {
  137. + threshold_action_t tmp = pending_action_;
  138. + pending_action_ = NO_ACTION_TH;
  139. + return tmp;
  140. +       }
  141. +       
  142. +     } else {     
  143. +       //check if threshold is crossed
  144. +       if (old_average_ < rollback_th_ && average_ >= rollback_th_ && init_sent_) {
  145. + pending_action_ = ROLLBACK_ACTION_TH;
  146. + ts_ = NOW+delay_;
  147. +       } else if (old_average_ > exec_th_ && average_ <= exec_th_) {
  148. + pending_action_ = EXEC_ACTION_TH;
  149. + ts_ = NOW+delay_;
  150. +       } else if (old_average_ > init_th_ && average_ <= init_th_) {
  151. + pending_action_ = INIT_ACTION_TH;
  152. + ts_ = NOW+delay_;
  153. +       } else {
  154. + //check if threshold is canceled
  155. + if (pending_action_ == ROLLBACK_ACTION_TH && average_ < rollback_th_
  156. +     || pending_action_ == EXEC_ACTION_TH && average_ > exec_th_
  157. +     || pending_action_ == INIT_ACTION_TH && average_ > init_th_) {
  158. +   pending_action_ = NO_ACTION_TH;
  159. + }
  160. +       }
  161. +       //check if action is still valid
  162. +       if (pending_action_ != NO_ACTION_TH && NOW >= ts_) {
  163. + threshold_action_t tmp = pending_action_;
  164. + pending_action_ = NO_ACTION_TH;
  165. +   return tmp;       
  166. +       }
  167. +     }
  168. +   }
  169. +   return NO_ACTION_TH;
  170. + }
  171. + inline void schedule_next() { resched(timer_interval_); }
  172. +
  173. + inline double current() { return current_; }
  174. + inline double total() { return total_; }
  175. + inline double sample_number() { return sample_number_; }
  176. + inline double average() { return average_; }
  177. + inline double old_average() { return old_average_; }
  178. + inline double instant() { return instant_; }
  179. + inline double simple_average() { return total_/sample_number_; }
  180. +
  181. +protected:
  182. + double timer_interval_;
  183. + double alpha_;
  184. + double current_;
  185. + double average_;
  186. + double old_average_;
  187. + double instant_;
  188. + double total_;
  189. + int sample_number_;
  190. + bool pos_gradient_;
  191. + double delay_;
  192. + threshold_action_t pending_action_;
  193. + double ts_;
  194. + bool th_set_;
  195. + bool init_sent_;
  196. + double init_th_;
  197. + double rollback_th_;
  198. + double exec_th_;
  199. +};
  200. +
  201. +/**
  202. + * Class to handle throughput measurements
  203. + */
  204. +class ThroughputWatch: public StatWatch  {
  205. + public:
  206. +  /**
  207. +   * Constructor
  208. +   */
  209. +  ThroughputWatch() { }
  210. +
  211. +  /**
  212. +   * Virtual desctructor
  213. +   */
  214. +  virtual ~ThroughputWatch() {};
  215. +
  216. +  inline void set_alpha(double a) { size_.set_alpha(a); time_.set_alpha(a); }
  217. +  inline double get_timer_interval () { return 0.01; }
  218. +
  219. +  threshold_action_t update(double size, double time) {
  220. +    size_.update (size);
  221. +    time_.update (time-time_.current());
  222. +    time_.set_current (time);
  223. +    old_average_ = average_;
  224. +    average_ = size_.average()/time_.average();
  225. +
  226. +    //evaluate if threshold has been crossed
  227. +    if (th_set_) {
  228. +      if (pos_gradient_) {
  229. + //check if threshold is crossed
  230. + if (old_average_ > rollback_th_ && average_ <= rollback_th_ && init_sent_) {
  231. +   pending_action_ = ROLLBACK_ACTION_TH;
  232. +   ts_ = NOW+delay_;
  233. + } else if (old_average_ < exec_th_ && average_ >= exec_th_) {
  234. +   pending_action_ = EXEC_ACTION_TH;
  235. +   ts_ = NOW+delay_;
  236. + } else if (old_average_ < init_th_ && average_ >= init_th_) {
  237. +   pending_action_ = INIT_ACTION_TH;
  238. +   ts_ = NOW+delay_;
  239. + } else {
  240. +   //check if threshold is canceled
  241. +   if (pending_action_ == ROLLBACK_ACTION_TH && average_ > rollback_th_
  242. +       || pending_action_ == EXEC_ACTION_TH && average_ < exec_th_
  243. +       || pending_action_ == INIT_ACTION_TH && average_ < init_th_) {
  244. +     pending_action_ = NO_ACTION_TH;
  245. +   }
  246. + }
  247. + //check if action is still valid
  248. + if (pending_action_ != NO_ACTION_TH && NOW >= ts_) {
  249. +   threshold_action_t tmp = pending_action_;
  250. +   pending_action_ = NO_ACTION_TH;
  251. +   return tmp;
  252. + }
  253. +
  254. +      } else {     
  255. + //check if threshold is crossed
  256. + if (old_average_ < rollback_th_ && average_ >= rollback_th_ && init_sent_) {
  257. +   pending_action_ = ROLLBACK_ACTION_TH;
  258. +   ts_ = NOW+delay_;
  259. + } else if (old_average_ > exec_th_ && average_ <= exec_th_) {
  260. +   pending_action_ = EXEC_ACTION_TH;
  261. +   ts_ = NOW+delay_;
  262. + } else if (old_average_ > init_th_ && average_ <= init_th_) {
  263. +   pending_action_ = INIT_ACTION_TH;
  264. +   ts_ = NOW+delay_;
  265. + } else {
  266. +   //check if threshold is canceled
  267. +   if (pending_action_ == ROLLBACK_ACTION_TH && average_ < rollback_th_
  268. +       || pending_action_ == EXEC_ACTION_TH && average_ > exec_th_
  269. +       || pending_action_ == INIT_ACTION_TH && average_ > init_th_) {
  270. +     pending_action_ = NO_ACTION_TH;
  271. +   }
  272. + }
  273. + //check if action is still valid
  274. + if (pending_action_ != NO_ACTION_TH && NOW >= ts_) {
  275. +   threshold_action_t tmp = pending_action_;
  276. +   pending_action_ = NO_ACTION_TH;
  277. +   printf ("Action triggered %dn", tmp);
  278. +   return tmp;       
  279. + }
  280. +      }
  281. +    }
  282. +    return NO_ACTION_TH;
  283. +  }
  284. +
  285. + protected:
  286. +  /**
  287. +   * Watch for packet size
  288. +   */
  289. +  StatWatch size_;
  290. +  
  291. +  /**
  292. +   * Watch for inter arrival time
  293. +   */
  294. +  StatWatch time_;
  295. +
  296. +};
  297. +
  298. +
  299. +
  300. +#endif //mac_stats_h
  301. diff -Naur ns-2.29-org/Makefile.in ns-2.29/Makefile.in
  302. --- ns-2.29-org/Makefile.in 2006-09-22 11:53:09.000000000 -0400
  303. +++ ns-2.29/Makefile.in 2006-09-22 17:27:47.000000000 -0400
  304. @@ -70,6 +70,7 @@
  305.   -I./diffusion3/lib/nr -I./diffusion3/ns 
  306.   -I./diffusion3/filter_core -I./asim/ -I./qs 
  307.   -I./diffserv -I./satellite 
  308. + -I./wimax 
  309.   -I./wpan
  310.  
  311.  
  312. @@ -301,6 +302,37 @@
  313.   wpan/p802_15_4nam.o wpan/p802_15_4phy.o 
  314.   wpan/p802_15_4sscs.o wpan/p802_15_4timer.o 
  315.   wpan/p802_15_4trace.o wpan/p802_15_4transac.o 
  316. +        wimax/ofdmphy.o 
  317. +        wimax/mac802_16pkt.o 
  318. +        wimax/serviceflowqos.o 
  319. +        wimax/serviceflow.o 
  320. +        wimax/serviceflowhandler.o 
  321. +        wimax/connection.o 
  322. +        wimax/connectionmanager.o 
  323. +        wimax/peernode.o 
  324. +        wimax/mac802_16.o 
  325. +        wimax/sduclassifier.o 
  326. +        wimax/destclassifier.o 
  327. +        wimax/mac802_16timer.o 
  328. +        wimax/neighborentry.o 
  329. +        wimax/neighbordb.o 
  330. +        wimax/scheduling/wimaxscheduler.o 
  331. +        wimax/scheduling/bsscheduler.o 
  332. +        wimax/scheduling/ssscheduler.o 
  333. +        wimax/scheduling/ulsubframetimer.o 
  334. +        wimax/scheduling/dlsubframetimer.o 
  335. +        wimax/scheduling/burst.o 
  336. +        wimax/scheduling/contentionslot.o 
  337. +        wimax/scheduling/contentionrequest.o 
  338. +        wimax/scheduling/contentiontimer.o 
  339. +        wimax/scheduling/dlburst.o 
  340. +        wimax/scheduling/ulburst.o 
  341. +        wimax/scheduling/framemap.o 
  342. +        wimax/scheduling/phypdu.o 
  343. +        wimax/scheduling/profile.o 
  344. +        wimax/scheduling/subframe.o 
  345. +        wimax/scheduling/scanningstation.o 
  346. +        wimax/scheduling/wimaxctrlagent.o 
  347.   @V_STLOBJ@
  348.  
  349.  
  350. @@ -456,6 +488,7 @@
  351.   tcl/lib/ns-srcrt.tcl 
  352.   tcl/mcast/ns-lms.tcl 
  353.   tcl/lib/ns-qsnode.tcl 
  354. +        tcl/lib/ns-wimax.tcl 
  355.   @V_NS_TCL_LIB_STL@
  356.  
  357.  $(GEN_DIR)ns_tcl.cc: $(NS_TCL_LIB)
  358. diff -Naur ns-2.29-org/tcl/lib/ns-lib.tcl ns-2.29/tcl/lib/ns-lib.tcl
  359. --- ns-2.29-org/tcl/lib/ns-lib.tcl 2006-09-22 11:53:09.000000000 -0400
  360. +++ ns-2.29/tcl/lib/ns-lib.tcl 2006-09-22 17:27:47.000000000 -0400
  361. @@ -217,6 +217,9 @@
  362.  #LMS
  363.  source ../mcast/ns-lms.tcl
  364.  
  365. +#WIMAX
  366. +source ns-wimax.tcl
  367. +
  368.  # STL dependent modules get included
  369.  # ONLY when STL is found
  370.  
  371. diff -Naur ns-2.29-org/tcl/lib/ns-packet.tcl ns-2.29/tcl/lib/ns-packet.tcl
  372. --- ns-2.29-org/tcl/lib/ns-packet.tcl 2006-09-22 11:53:09.000000000 -0400
  373. +++ ns-2.29/tcl/lib/ns-packet.tcl 2006-09-22 17:27:47.000000000 -0400
  374. @@ -170,6 +170,8 @@
  375.   Encap  # common/encap.cc
  376.          IPinIP  # IP encapsulation 
  377.   HDLC  # High Level Data Link Control
  378. +# WIMAX:
  379. +        802_16  # Mac IEEE 802.16
  380.  } {
  381.   add-packet-header $prot
  382.  }
  383. diff -Naur ns-2.29-org/tcl/lib/ns-wimax.tcl ns-2.29/tcl/lib/ns-wimax.tcl
  384. --- ns-2.29-org/tcl/lib/ns-wimax.tcl 1969-12-31 19:00:00.000000000 -0500
  385. +++ ns-2.29/tcl/lib/ns-wimax.tcl 2006-09-22 17:27:47.000000000 -0400
  386. @@ -0,0 +1,54 @@
  387. +# This class contains default value for tcl
  388. +
  389. +Phy/WirelessPhy/OFDM set g_ 0
  390. +
  391. +Mac/802_16 set queue_length_         50 ;#maximum number of packets
  392. +
  393. +Mac/802_16 set frame_duration_       0.004
  394. +Mac/802_16 set channel_              0
  395. +Mac/802_16 set fbandwidth_           5e+6
  396. +Mac/802_16 set rtg_                  10
  397. +Mac/802_16 set ttg_                  10
  398. +Mac/802_16 set dcd_interval_         5 ;#max 10s
  399. +Mac/802_16 set ucd_interval_         5 ;#max 10s
  400. +Mac/802_16 set init_rng_interval_    1 ;#max 2s
  401. +Mac/802_16 set lost_dlmap_interval_  0.6
  402. +Mac/802_16 set lost_ulmap_interval_  0.6
  403. +Mac/802_16 set t1_timeout_           [expr 5* [Mac/802_16 set dcd_interval_]]
  404. +Mac/802_16 set t2_timeout_           [expr 5* [Mac/802_16 set init_rng_interval_]]
  405. +Mac/802_16 set t3_timeout_           0.2
  406. +Mac/802_16 set t6_timeout_           3
  407. +Mac/802_16 set t12_timeout_          [expr 5* [Mac/802_16 set ucd_interval_]]
  408. +Mac/802_16 set t16_timeout_          3 ;#qos dependant
  409. +Mac/802_16 set t17_timeout_          5 
  410. +Mac/802_16 set t21_timeout_          0.02 ;#max 10s. Use 20ms to replace preamble scanning
  411. +Mac/802_16 set contention_rng_retry_ 16 
  412. +Mac/802_16 set invited_rng_retry_    16 ;#16
  413. +Mac/802_16 set request_retry_        2 ;#16
  414. +Mac/802_16 set reg_req_retry_        3
  415. +Mac/802_16 set tproc_                0.001
  416. +Mac/802_16 set dsx_req_retry_        3 
  417. +Mac/802_16 set dsx_rsp_retry_        3
  418. +
  419. +Mac/802_16 set rng_backoff_start_    2
  420. +Mac/802_16 set rng_backoff_stop_     6
  421. +Mac/802_16 set bw_backoff_start_     2
  422. +Mac/802_16 set bw_backoff_stop_      6
  423. +
  424. +Mac/802_16 set scan_duration_        50
  425. +Mac/802_16 set interleaving_interval_ 50
  426. +Mac/802_16 set scan_iteration_       2
  427. +Mac/802_16 set t44_timeout_          0.1
  428. +Mac/802_16 set max_dir_scan_time_    0.2 ;#max scan for each neighbor BSs
  429. +Mac/802_16 set client_timeout_       0.5 
  430. +Mac/802_16 set nbr_adv_interval_     0.5
  431. +Mac/802_16 set scan_req_retry_       5
  432. +
  433. +Mac/802_16 set lgd_factor_           1
  434. +Mac/802_16 set print_stats_          false ;#true to activate print of statistics
  435. +Mac/802_16 set rxp_avg_alpha_        1
  436. +Mac/802_16 set delay_avg_alpha_      1
  437. +Mac/802_16 set jitter_avg_alpha_     1
  438. +Mac/802_16 set loss_avg_alpha_       1
  439. +Mac/802_16 set throughput_avg_alpha_ 1
  440. +Mac/802_16 set throughput_delay_     0.02
  441. diff -Naur ns-2.29-org/tcl/wimax/datarate/datarate802.16 ns-2.29/tcl/wimax/datarate/datarate802.16
  442. --- ns-2.29-org/tcl/wimax/datarate/datarate802.16 1969-12-31 19:00:00.000000000 -0500
  443. +++ ns-2.29/tcl/wimax/datarate/datarate802.16 2006-09-22 17:27:47.000000000 -0400
  444. @@ -0,0 +1,41 @@
  445. +#!/bin/bash
  446. +
  447. +# Bash file to run datarate simulations for different modulation and cyclic prefix
  448. +# @author rouil
  449. +
  450. +if [ "$1" == "clean" ]; then
  451. +    rm -r res_datarate
  452. +else
  453. +    mkdir res_datarate
  454. +    cd res_datarate
  455. +    for modulation in "OFDM_BPSK_1_2" "OFDM_QPSK_1_2" "OFDM_QPSK_3_4" "OFDM_16QAM_1_2" "OFDM_16QAM_3_4" "OFDM_64QAM_2_3" "OFDM_64QAM_3_4" ; do
  456. +
  457. + if [ "$1" != "" ]; then
  458. +     modulation=$1
  459. + fi
  460. + mkdir $modulation
  461. + cd $modulation
  462. +
  463. + for cp in "0" "0.03125" "0.0625" "0.125" "0.25"; do
  464. +     mkdir cp_$cp
  465. +     cd cp_$cp
  466. +     echo -n "Running for modulation" $modulation " and CP="$cp
  467. +     ns ../../../datarate.tcl $modulation $cp &> log.t
  468. +
  469. +     DATARATE=`grep ^r out.res|grep "1 0 cbr"|awk 'BEGIN{first=-1; last=-1} {if (first==-1) {first=$2}; last=$2; i+=$6-0;} END {print (8*i/(last-first))}'`
  470. +     echo " datarate = " $DATARATE
  471. +     echo $modulation $cp $DATARATE >>../../result$modulation.dat
  472. +     echo $modulation $cp $DATARATE >>../../result.dat
  473. +     #rm out.res
  474. +     #rm log.t
  475. +     cd ..
  476. + done
  477. + cd ..
  478. + if [ "$1" != "" ]; then
  479. +     break
  480. + fi
  481. +    done
  482. +    cd ..
  483. +    gnuplot plot-datarate
  484. +fi
  485. +
  486. diff -Naur ns-2.29-org/tcl/wimax/datarate/datarate802_16.eps ns-2.29/tcl/wimax/datarate/datarate802_16.eps
  487. --- ns-2.29-org/tcl/wimax/datarate/datarate802_16.eps 1969-12-31 19:00:00.000000000 -0500
  488. +++ ns-2.29/tcl/wimax/datarate/datarate802_16.eps 2006-09-22 17:27:47.000000000 -0400
  489. @@ -0,0 +1,606 @@
  490. +%!PS-Adobe-2.0 EPSF-2.0
  491. +%%Title: datarate802_16.eps
  492. +%%Creator: gnuplot 4.0 patchlevel 0
  493. +%%CreationDate: Wed Sep 20 12:10:17 2006
  494. +%%DocumentFonts: (atend)
  495. +%%BoundingBox: 50 50 410 302
  496. +%%Orientation: Portrait
  497. +%%EndComments
  498. +/gnudict 256 dict def
  499. +gnudict begin
  500. +/Color false def
  501. +/Solid false def
  502. +/gnulinewidth 5.000 def
  503. +/userlinewidth gnulinewidth def
  504. +/vshift -46 def
  505. +/dl {10.0 mul} def
  506. +/hpt_ 31.5 def
  507. +/vpt_ 31.5 def
  508. +/hpt hpt_ def
  509. +/vpt vpt_ def
  510. +/Rounded false def
  511. +/M {moveto} bind def
  512. +/L {lineto} bind def
  513. +/R {rmoveto} bind def
  514. +/V {rlineto} bind def
  515. +/N {newpath moveto} bind def
  516. +/C {setrgbcolor} bind def
  517. +/f {rlineto fill} bind def
  518. +/vpt2 vpt 2 mul def
  519. +/hpt2 hpt 2 mul def
  520. +/Lshow { currentpoint stroke M
  521. +  0 vshift R show } def
  522. +/Rshow { currentpoint stroke M
  523. +  dup stringwidth pop neg vshift R show } def
  524. +/Cshow { currentpoint stroke M
  525. +  dup stringwidth pop -2 div vshift R show } def
  526. +/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
  527. +  /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
  528. +/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
  529. + {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
  530. +/BL { stroke userlinewidth 2 mul setlinewidth
  531. +      Rounded { 1 setlinejoin 1 setlinecap } if } def
  532. +/AL { stroke userlinewidth 2 div setlinewidth
  533. +      Rounded { 1 setlinejoin 1 setlinecap } if } def
  534. +/UL { dup gnulinewidth mul /userlinewidth exch def
  535. +      dup 1 lt {pop 1} if 10 mul /udl exch def } def
  536. +/PL { stroke userlinewidth setlinewidth
  537. +      Rounded { 1 setlinejoin 1 setlinecap } if } def
  538. +/LTw { PL [] 1 setgray } def
  539. +/LTb { BL [] 0 0 0 DL } def
  540. +/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
  541. +/LT0 { PL [] 1 0 0 DL } def
  542. +/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
  543. +/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
  544. +/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
  545. +/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
  546. +/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
  547. +/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
  548. +/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
  549. +/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
  550. +/Pnt { stroke [] 0 setdash
  551. +   gsave 1 setlinecap M 0 0 V stroke grestore } def
  552. +/Dia { stroke [] 0 setdash 2 copy vpt add M
  553. +  hpt neg vpt neg V hpt vpt neg V
  554. +  hpt vpt V hpt neg vpt V closepath stroke
  555. +  Pnt } def
  556. +/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
  557. +  currentpoint stroke M
  558. +  hpt neg vpt neg R hpt2 0 V stroke
  559. +  } def
  560. +/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
  561. +  0 vpt2 neg V hpt2 0 V 0 vpt2 V
  562. +  hpt2 neg 0 V closepath stroke
  563. +  Pnt } def
  564. +/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
  565. +  hpt2 vpt2 neg V currentpoint stroke M
  566. +  hpt2 neg 0 R hpt2 vpt2 V stroke } def
  567. +/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
  568. +  hpt neg vpt -1.62 mul V
  569. +  hpt 2 mul 0 V
  570. +  hpt neg vpt 1.62 mul V closepath stroke
  571. +  Pnt  } def
  572. +/Star { 2 copy Pls Crs } def
  573. +/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
  574. +  0 vpt2 neg V  hpt2 0 V  0 vpt2 V
  575. +  hpt2 neg 0 V  closepath fill } def
  576. +/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
  577. +  hpt neg vpt -1.62 mul V
  578. +  hpt 2 mul 0 V
  579. +  hpt neg vpt 1.62 mul V closepath fill } def
  580. +/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
  581. +  hpt neg vpt 1.62 mul V
  582. +  hpt 2 mul 0 V
  583. +  hpt neg vpt -1.62 mul V closepath stroke
  584. +  Pnt  } def
  585. +/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
  586. +  hpt neg vpt 1.62 mul V
  587. +  hpt 2 mul 0 V
  588. +  hpt neg vpt -1.62 mul V closepath fill} def
  589. +/DiaF { stroke [] 0 setdash vpt add M
  590. +  hpt neg vpt neg V hpt vpt neg V
  591. +  hpt vpt V hpt neg vpt V closepath fill } def
  592. +/Pent { stroke [] 0 setdash 2 copy gsave
  593. +  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
  594. +  closepath stroke grestore Pnt } def
  595. +/PentF { stroke [] 0 setdash gsave
  596. +  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
  597. +  closepath fill grestore } def
  598. +/Circle { stroke [] 0 setdash 2 copy
  599. +  hpt 0 360 arc stroke Pnt } def
  600. +/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
  601. +/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450  arc } bind def
  602. +/C1 { BL [] 0 setdash 2 copy        moveto
  603. +       2 copy  vpt 0 90 arc closepath fill
  604. +               vpt 0 360 arc closepath } bind def
  605. +/C2 { BL [] 0 setdash 2 copy moveto
  606. +       2 copy  vpt 90 180 arc closepath fill
  607. +               vpt 0 360 arc closepath } bind def
  608. +/C3 { BL [] 0 setdash 2 copy moveto
  609. +       2 copy  vpt 0 180 arc closepath fill
  610. +               vpt 0 360 arc closepath } bind def
  611. +/C4 { BL [] 0 setdash 2 copy moveto
  612. +       2 copy  vpt 180 270 arc closepath fill
  613. +               vpt 0 360 arc closepath } bind def
  614. +/C5 { BL [] 0 setdash 2 copy moveto
  615. +       2 copy  vpt 0 90 arc
  616. +       2 copy moveto
  617. +       2 copy  vpt 180 270 arc closepath fill
  618. +               vpt 0 360 arc } bind def
  619. +/C6 { BL [] 0 setdash 2 copy moveto
  620. +      2 copy  vpt 90 270 arc closepath fill
  621. +              vpt 0 360 arc closepath } bind def
  622. +/C7 { BL [] 0 setdash 2 copy moveto
  623. +      2 copy  vpt 0 270 arc closepath fill
  624. +              vpt 0 360 arc closepath } bind def
  625. +/C8 { BL [] 0 setdash 2 copy moveto
  626. +      2 copy vpt 270 360 arc closepath fill
  627. +              vpt 0 360 arc closepath } bind def
  628. +/C9 { BL [] 0 setdash 2 copy moveto
  629. +      2 copy  vpt 270 450 arc closepath fill
  630. +              vpt 0 360 arc closepath } bind def
  631. +/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
  632. +       2 copy moveto
  633. +       2 copy vpt 90 180 arc closepath fill
  634. +               vpt 0 360 arc closepath } bind def
  635. +/C11 { BL [] 0 setdash 2 copy moveto
  636. +       2 copy  vpt 0 180 arc closepath fill
  637. +       2 copy moveto
  638. +       2 copy  vpt 270 360 arc closepath fill
  639. +               vpt 0 360 arc closepath } bind def
  640. +/C12 { BL [] 0 setdash 2 copy moveto
  641. +       2 copy  vpt 180 360 arc closepath fill
  642. +               vpt 0 360 arc closepath } bind def
  643. +/C13 { BL [] 0 setdash  2 copy moveto
  644. +       2 copy  vpt 0 90 arc closepath fill
  645. +       2 copy moveto
  646. +       2 copy  vpt 180 360 arc closepath fill
  647. +               vpt 0 360 arc closepath } bind def
  648. +/C14 { BL [] 0 setdash 2 copy moveto
  649. +       2 copy  vpt 90 360 arc closepath fill
  650. +               vpt 0 360 arc } bind def
  651. +/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
  652. +               vpt 0 360 arc closepath } bind def
  653. +/Rec   { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
  654. +       neg 0 rlineto closepath } bind def
  655. +/Square { dup Rec } bind def
  656. +/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
  657. +/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
  658. +/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
  659. +/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
  660. +/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
  661. +/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
  662. +/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
  663. +       exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
  664. +/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
  665. +/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
  666. +       2 copy vpt Square fill
  667. +       Bsquare } bind def
  668. +/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
  669. +/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
  670. +/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
  671. +       Bsquare } bind def
  672. +/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
  673. +       Bsquare } bind def
  674. +/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
  675. +/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
  676. +       2 copy vpt Square fill Bsquare } bind def
  677. +/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
  678. +       2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
  679. +/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
  680. +/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
  681. +/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
  682. +/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
  683. +/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
  684. +/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
  685. +/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
  686. +/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
  687. +/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
  688. +/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
  689. +/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
  690. +/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
  691. +/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
  692. +/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
  693. +/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
  694. +/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
  695. +/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
  696. +/DiaE { stroke [] 0 setdash vpt add M
  697. +  hpt neg vpt neg V hpt vpt neg V
  698. +  hpt vpt V hpt neg vpt V closepath stroke } def
  699. +/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
  700. +  0 vpt2 neg V hpt2 0 V 0 vpt2 V
  701. +  hpt2 neg 0 V closepath stroke } def
  702. +/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
  703. +  hpt neg vpt -1.62 mul V
  704. +  hpt 2 mul 0 V
  705. +  hpt neg vpt 1.62 mul V closepath stroke } def
  706. +/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
  707. +  hpt neg vpt 1.62 mul V
  708. +  hpt 2 mul 0 V
  709. +  hpt neg vpt -1.62 mul V closepath stroke } def
  710. +/PentE { stroke [] 0 setdash gsave
  711. +  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
  712. +  closepath stroke grestore } def
  713. +/CircE { stroke [] 0 setdash 
  714. +  hpt 0 360 arc stroke } def
  715. +/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
  716. +/DiaW { stroke [] 0 setdash vpt add M
  717. +  hpt neg vpt neg V hpt vpt neg V
  718. +  hpt vpt V hpt neg vpt V Opaque stroke } def
  719. +/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
  720. +  0 vpt2 neg V hpt2 0 V 0 vpt2 V
  721. +  hpt2 neg 0 V Opaque stroke } def
  722. +/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
  723. +  hpt neg vpt -1.62 mul V
  724. +  hpt 2 mul 0 V
  725. +  hpt neg vpt 1.62 mul V Opaque stroke } def
  726. +/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
  727. +  hpt neg vpt 1.62 mul V
  728. +  hpt 2 mul 0 V
  729. +  hpt neg vpt -1.62 mul V Opaque stroke } def
  730. +/PentW { stroke [] 0 setdash gsave
  731. +  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
  732. +  Opaque stroke grestore } def
  733. +/CircW { stroke [] 0 setdash 
  734. +  hpt 0 360 arc Opaque stroke } def
  735. +/BoxFill { gsave Rec 1 setgray fill grestore } def
  736. +/BoxColFill {
  737. +  gsave Rec
  738. +  /Fillden exch def
  739. +  currentrgbcolor
  740. +  /ColB exch def /ColG exch def /ColR exch def
  741. +  /ColR ColR Fillden mul Fillden sub 1 add def
  742. +  /ColG ColG Fillden mul Fillden sub 1 add def
  743. +  /ColB ColB Fillden mul Fillden sub 1 add def
  744. +  ColR ColG ColB setrgbcolor
  745. +  fill grestore } def
  746. +%
  747. +% PostScript Level 1 Pattern Fill routine
  748. +% Usage: x y w h s a XX PatternFill
  749. +% x,y = lower left corner of box to be filled
  750. +% w,h = width and height of box
  751. +%   a = angle in degrees between lines and x-axis
  752. +%  XX = 0/1 for no/yes cross-hatch
  753. +%
  754. +/PatternFill { gsave /PFa [ 9 2 roll ] def
  755. +    PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
  756. +    PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
  757. +    gsave 1 setgray fill grestore clip
  758. +    currentlinewidth 0.5 mul setlinewidth
  759. +    /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
  760. +    0 0 M PFa 5 get rotate PFs -2 div dup translate
  761. + 0 1 PFs PFa 4 get div 1 add floor cvi
  762. + { PFa 4 get mul 0 M 0 PFs V } for
  763. +    0 PFa 6 get ne {
  764. + 0 1 PFs PFa 4 get div 1 add floor cvi
  765. + { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
  766. +    } if
  767. +    stroke grestore } def
  768. +%
  769. +/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
  770. +dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
  771. +currentdict end definefont pop
  772. +end
  773. +%%EndProlog
  774. +gnudict begin
  775. +gsave
  776. +50 50 translate
  777. +0.050 0.050 scale
  778. +0 setgray
  779. +newpath
  780. +(Helvetica) findfont 140 scalefont setfont
  781. +1.000 UL
  782. +LTb
  783. +630 420 M
  784. +63 0 V
  785. +6269 0 R
  786. +-63 0 V
  787. +546 420 M
  788. +gsave 0 setgray
  789. +( 0) Rshow
  790. +grestore
  791. +1.000 UL
  792. +LTb
  793. +630 1470 M
  794. +63 0 V
  795. +6269 0 R
  796. +-63 0 V
  797. +-6353 0 R
  798. +gsave 0 setgray
  799. +( 5) Rshow
  800. +grestore
  801. +1.000 UL
  802. +LTb
  803. +630 2520 M
  804. +63 0 V
  805. +6269 0 R
  806. +-63 0 V
  807. +-6353 0 R
  808. +gsave 0 setgray
  809. +( 10) Rshow
  810. +grestore
  811. +1.000 UL
  812. +LTb
  813. +630 3570 M
  814. +63 0 V
  815. +6269 0 R
  816. +-63 0 V
  817. +-6353 0 R
  818. +gsave 0 setgray
  819. +( 15) Rshow
  820. +grestore
  821. +1.000 UL
  822. +LTb
  823. +630 4620 M
  824. +63 0 V
  825. +6269 0 R
  826. +-63 0 V
  827. +-6353 0 R
  828. +gsave 0 setgray
  829. +( 20) Rshow
  830. +grestore
  831. +1.000 UL
  832. +LTb
  833. +630 420 M
  834. +0 63 V
  835. +0 4137 R
  836. +0 -63 V
  837. +630 280 M
  838. +gsave 0 setgray
  839. +( 0) Cshow
  840. +grestore
  841. +1.000 UL
  842. +LTb
  843. +1685 420 M
  844. +0 63 V
  845. +0 4137 R
  846. +0 -63 V
  847. +0 -4277 R
  848. +gsave 0 setgray
  849. +( 0.05) Cshow
  850. +grestore
  851. +1.000 UL
  852. +LTb
  853. +2741 420 M
  854. +0 63 V
  855. +0 4137 R
  856. +0 -63 V
  857. +0 -4277 R
  858. +gsave 0 setgray
  859. +( 0.1) Cshow
  860. +grestore
  861. +1.000 UL
  862. +LTb
  863. +3796 420 M
  864. +0 63 V
  865. +0 4137 R
  866. +0 -63 V
  867. +0 -4277 R
  868. +gsave 0 setgray
  869. +( 0.15) Cshow
  870. +grestore
  871. +1.000 UL
  872. +LTb
  873. +4851 420 M
  874. +0 63 V
  875. +0 4137 R
  876. +0 -63 V
  877. +0 -4277 R
  878. +gsave 0 setgray
  879. +( 0.2) Cshow
  880. +grestore
  881. +1.000 UL
  882. +LTb
  883. +5907 420 M
  884. +0 63 V
  885. +0 4137 R
  886. +0 -63 V
  887. +0 -4277 R
  888. +gsave 0 setgray
  889. +( 0.25) Cshow
  890. +grestore
  891. +1.000 UL
  892. +LTb
  893. +6962 420 M
  894. +0 63 V
  895. +0 4137 R
  896. +0 -63 V
  897. +0 -4277 R
  898. +gsave 0 setgray
  899. +( 0.3) Cshow
  900. +grestore
  901. +1.000 UL
  902. +LTb
  903. +1.000 UL
  904. +LTb
  905. +630 420 M
  906. +6332 0 V
  907. +0 4200 V
  908. +-6332 0 V
  909. +630 420 L
  910. +LTb
  911. +140 2520 M
  912. +gsave 0 setgray
  913. +currentpoint gsave translate 90 rotate 0 0 M
  914. +(Datarate (Mbps)) Cshow
  915. +grestore
  916. +grestore
  917. +LTb
  918. +3796 70 M
  919. +gsave 0 setgray
  920. +(Cyclic prefix) Cshow
  921. +grestore
  922. +LTb
  923. +3796 4830 M
  924. +gsave 0 setgray
  925. +(Exprerimental datarate) Cshow
  926. +grestore
  927. +1.000 UP
  928. +1.000 UP
  929. +1.000 UL
  930. +LT0
  931. +LTb
  932. +6311 4487 M
  933. +gsave 0 setgray
  934. +(BPSK_1_2) Rshow
  935. +grestore
  936. +LT0
  937. +6395 4487 M
  938. +399 0 V
  939. +630 766 M
  940. +660 -11 V
  941. +659 -12 V
  942. +3268 720 L
  943. +5907 685 L
  944. +630 766 Pls
  945. +1290 755 Pls
  946. +1949 743 Pls
  947. +3268 720 Pls
  948. +5907 685 Pls
  949. +6594 4487 Pls
  950. +1.000 UP
  951. +1.000 UL
  952. +LT1
  953. +LTb
  954. +6311 4347 M
  955. +gsave 0 setgray
  956. +(QPSK_1_2) Rshow
  957. +grestore
  958. +LT1
  959. +6395 4347 M
  960. +399 0 V
  961. +630 1148 M
  962. +660 -24 V
  963. +659 -23 V
  964. +1319 -44 V
  965. +5907 985 L
  966. +630 1148 Crs
  967. +1290 1124 Crs
  968. +1949 1101 Crs
  969. +3268 1057 Crs
  970. +5907 985 Crs
  971. +6594 4347 Crs
  972. +1.000 UP
  973. +1.000 UL
  974. +LT2
  975. +LTb
  976. +6311 4207 M
  977. +gsave 0 setgray
  978. +(QPSK_3_4) Rshow
  979. +grestore
  980. +LT2
  981. +6395 4207 M
  982. +399 0 V
  983. +630 1527 M
  984. +660 -35 V
  985. +659 -36 V
  986. +1319 -67 V
  987. +5907 1279 L
  988. +630 1527 Star
  989. +1290 1492 Star
  990. +1949 1456 Star
  991. +3268 1389 Star
  992. +5907 1279 Star
  993. +6594 4207 Star
  994. +1.000 UP
  995. +1.000 UL
  996. +LT3
  997. +LTb
  998. +6311 4067 M
  999. +gsave 0 setgray
  1000. +(16QAM_1_2) Rshow
  1001. +grestore
  1002. +LT3
  1003. +6395 4067 M
  1004. +399 0 V
  1005. +630 1896 M
  1006. +660 -48 V
  1007. +659 -48 V
  1008. +1319 -88 V
  1009. +5907 1565 L
  1010. +630 1896 Box
  1011. +1290 1848 Box
  1012. +1949 1800 Box
  1013. +3268 1712 Box
  1014. +5907 1565 Box
  1015. +6594 4067 Box
  1016. +1.000 UP
  1017. +1.000 UL
  1018. +LT4
  1019. +LTb
  1020. +6311 3927 M
  1021. +gsave 0 setgray
  1022. +(16QAM_3_4) Rshow
  1023. +grestore
  1024. +LT4
  1025. +6395 3927 M
  1026. +399 0 V
  1027. +630 2633 M
  1028. +660 -71 V
  1029. +659 -72 V
  1030. +3268 2357 L
  1031. +5907 2137 L
  1032. +630 2633 BoxF
  1033. +1290 2562 BoxF
  1034. +1949 2490 BoxF
  1035. +3268 2357 BoxF
  1036. +5907 2137 BoxF
  1037. +6594 3927 BoxF
  1038. +1.000 UP
  1039. +1.000 UL
  1040. +LT5
  1041. +LTb
  1042. +6311 3787 M
  1043. +gsave 0 setgray
  1044. +(64QAM_2_3) Rshow
  1045. +grestore
  1046. +LT5
  1047. +6395 3787 M
  1048. +399 0 V
  1049. +630 3283 M
  1050. +660 -92 V
  1051. +659 -93 V
  1052. +3268 2927 L
  1053. +5907 2642 L
  1054. +630 3283 Circle
  1055. +1290 3191 Circle
  1056. +1949 3098 Circle
  1057. +3268 2927 Circle
  1058. +5907 2642 Circle
  1059. +6594 3787 Circle
  1060. +1.000 UP
  1061. +1.000 UL
  1062. +LT6
  1063. +LTb
  1064. +6311 3647 M
  1065. +gsave 0 setgray
  1066. +(64QAM_3_4) Rshow
  1067. +grestore
  1068. +LT6
  1069. +6395 3647 M
  1070. +399 0 V
  1071. +630 3666 M
  1072. +660 -105 V
  1073. +659 -105 V
  1074. +3268 3261 L
  1075. +5907 2937 L
  1076. +630 3666 CircleF
  1077. +1290 3561 CircleF
  1078. +1949 3456 CircleF
  1079. +3268 3261 CircleF
  1080. +5907 2937 CircleF
  1081. +6594 3647 CircleF
  1082. +1.000 UL
  1083. +LTb
  1084. +630 420 M
  1085. +6332 0 V
  1086. +0 4200 V
  1087. +-6332 0 V
  1088. +630 420 L
  1089. +1.000 UP
  1090. +stroke
  1091. +grestore
  1092. +end
  1093. +showpage
  1094. +%%Trailer
  1095. +%%DocumentFonts: Helvetica
  1096. diff -Naur ns-2.29-org/tcl/wimax/datarate/datarate.tcl ns-2.29/tcl/wimax/datarate/datarate.tcl
  1097. --- ns-2.29-org/tcl/wimax/datarate/datarate.tcl 1969-12-31 19:00:00.000000000 -0500
  1098. +++ ns-2.29/tcl/wimax/datarate/datarate.tcl 2006-09-22 17:27:47.000000000 -0400
  1099. @@ -0,0 +1,189 @@
  1100. +# Test script to evaluate datarate in 802.16 networks.
  1101. +# @author rouil
  1102. +# Scenario: Communication between MN and Sink Node with MN attached to BS.
  1103. +
  1104. +#
  1105. +# Topology scenario:
  1106. +#
  1107. +#
  1108. +#         |-----|          
  1109. +#         | MN0 |                 ; 1.0.1 
  1110. +#         |-----|        
  1111. +#
  1112. +#
  1113. +#   (^)
  1114. +#    |
  1115. +#     |--------------|
  1116. +#           | Base Station |  ; 1.0.0
  1117. +#           |--------------|
  1118. +#         |
  1119. +#         |
  1120. +#      |-----------|
  1121. +#            | Sink node |  ; 0.0.0
  1122. +#            |-----------|
  1123. +#
  1124. +
  1125. +#check input parameters
  1126. +if {$argc != 2} {
  1127. + puts ""
  1128. + puts "Wrong Number of Arguments! 2 arguments for this script"
  1129. + puts "Usage: ns datarate.tcl modulation cyclic_prefix "
  1130. +        puts "modulation: OFDM_BPSK_1_2, OFDM_QPSK_1_2, OFDM_QPSK_3_4"
  1131. +        puts "            OFDM_16QAM_1_2, OFDM_16QAM_3_4, OFDM_64QAM_2_3, OFDM_64QAM_3_4"
  1132. +        puts "cyclic_prefix: 0.25, 0.125, 0.0625, 0.03125"
  1133. + exit 
  1134. +}
  1135. +
  1136. +# set global variables
  1137. +set output_dir .
  1138. +set traffic_start 2
  1139. +set traffic_stop  7
  1140. +set simulation_stop 8
  1141. +
  1142. +# Configure Wimax
  1143. +Mac/802_16 set debug_ 0
  1144. +Mac/802_16 set frame_duration_ 0.020
  1145. +
  1146. +#define coverage area for base station: 20m coverage 
  1147. +Phy/WirelessPhy/OFDM set g_ [lindex $argv 1]
  1148. +Phy/WirelessPhy set Pt_ 0.025
  1149. +Phy/WirelessPhy set RXThresh_ 2.025e-12 ;# 500m radius
  1150. +Phy/WirelessPhy set CSThresh_ [expr 0.9*[Phy/WirelessPhy set RXThresh_]]
  1151. +
  1152. +# Parameter for wireless nodes
  1153. +set opt(chan)           Channel/WirelessChannel    ;# channel type
  1154. +set opt(prop)           Propagation/TwoRayGround   ;# radio-propagation model
  1155. +set opt(netif)          Phy/WirelessPhy/OFDM       ;# network interface type
  1156. +set opt(mac)            Mac/802_16                 ;# MAC type
  1157. +set opt(ifq)            Queue/DropTail/PriQueue    ;# interface queue type
  1158. +set opt(ll)             LL                         ;# link layer type
  1159. +set opt(ant)            Antenna/OmniAntenna        ;# antenna model
  1160. +set opt(ifqlen)         50                  ;# max packet in ifq
  1161. +set opt(adhocRouting)   DSDV                       ;# routing protocol
  1162. +
  1163. +set opt(x) 1100    ;# X dimension of the topography
  1164. +set opt(y) 1100    ;# Y dimension of the topography
  1165. +
  1166. +#defines function for flushing and closing files
  1167. +proc finish {} {
  1168. +        global ns tf output_dir nb_mn
  1169. +        $ns flush-trace
  1170. +        close $tf
  1171. + exit 0
  1172. +}
  1173. +
  1174. +#create the simulator
  1175. +set ns [new Simulator]
  1176. +$ns use-newtrace
  1177. +
  1178. +#create the topography
  1179. +set topo [new Topography]
  1180. +$topo load_flatgrid $opt(x) $opt(y)
  1181. +#puts "Topology created"
  1182. +
  1183. +#open file for trace
  1184. +set tf [open $output_dir/out.res w]
  1185. +$ns trace-all $tf
  1186. +#puts "Output file configured"
  1187. +
  1188. +# set up for hierarchical routing (needed for routing over a basestation)
  1189. +$ns node-config -addressType hierarchical
  1190. +AddrParams set domain_num_ 2           ;# domain number
  1191. +lappend cluster_num 1 1             ;# cluster number for each domain 
  1192. +AddrParams set cluster_num_ $cluster_num
  1193. +lappend eilastlevel 1 2  ;# number of nodes for each cluster (1 for sink and one for mobile node + base station
  1194. +AddrParams set nodes_num_ $eilastlevel
  1195. +puts "Configuration of hierarchical addressing done"
  1196. +
  1197. +# Create God
  1198. +create-god 2
  1199. +
  1200. +#creates the sink node in first address space.
  1201. +set sinkNode [$ns node 0.0.0]
  1202. +puts "sink node created"
  1203. +
  1204. +#creates the Access Point (Base station)
  1205. +$ns node-config -adhocRouting $opt(adhocRouting) 
  1206. +                 -llType $opt(ll) 
  1207. +                 -macType $opt(mac) 
  1208. +                 -ifqType $opt(ifq) 
  1209. +                 -ifqLen $opt(ifqlen) 
  1210. +                 -antType $opt(ant) 
  1211. +                 -propType $opt(prop)    
  1212. +                 -phyType $opt(netif) 
  1213. +                 -channel [new $opt(chan)] 
  1214. +                 -topoInstance $topo 
  1215. +                 -wiredRouting ON 
  1216. +                 -agentTrace ON 
  1217. +                 -routerTrace ON 
  1218. +                 -macTrace ON  
  1219. +                 -movementTrace OFF
  1220. +#puts "Configuration of base station"
  1221. +
  1222. +set bstation [$ns node 1.0.0]  
  1223. +$bstation random-motion 0
  1224. +#provide some co-ord (fixed) to base station node
  1225. +$bstation set X_ 550.0
  1226. +$bstation set Y_ 550.0
  1227. +$bstation set Z_ 0.0
  1228. +set clas [new SDUClassifier/Dest]
  1229. +[$bstation set mac_(0)] add-classifier $clas
  1230. +#set the scheduler for the node. Must be changed to -shed [new $opt(sched)]
  1231. +set bs_sched [new WimaxScheduler/BS]
  1232. +$bs_sched set-default-modulation [lindex $argv 0]     ;#OFDM_BPSK_1_2
  1233. +[$bstation set mac_(0)] set-scheduler $bs_sched
  1234. +[$bstation set mac_(0)] set-channel 0
  1235. +puts "Base-Station node created"
  1236. +
  1237. +# creation of the mobile nodes
  1238. +$ns node-config -wiredRouting OFF 
  1239. +                -macTrace ON   ;# Mobile nodes cannot do routing.
  1240. +
  1241. +set wl_node [$ns node 1.0.1]  ;# create the node with given @.
  1242. +$wl_node random-motion 0 ;# disable random motion
  1243. +$wl_node base-station [AddrParams addr2id [$bstation node-addr]] ;#attach mn to basestation
  1244. +#compute position of the node
  1245. +$wl_node set X_ 400.0
  1246. +$wl_node set Y_ 550.0
  1247. +$wl_node set Z_ 0.0
  1248. +puts "wireless node created ..."
  1249. +
  1250. +set clas [new SDUClassifier/Dest]
  1251. +[$wl_node set mac_(0)] add-classifier $clas
  1252. +#set the scheduler for the node. Must be changed to -shed [new $opt(sched)]
  1253. +set ss_sched [new WimaxScheduler/SS]
  1254. +[$wl_node set mac_(0)] set-scheduler $ss_sched
  1255. +[$wl_node set mac_(0)] set-channel 0
  1256. +
  1257. +#create source traffic
  1258. +#Create a UDP agent and attach it to node n0
  1259. +set udp [new Agent/UDP]
  1260. +$udp set packetSize_ 1500
  1261. +$ns attach-agent $wl_node $udp
  1262. +
  1263. +# Create a CBR traffic source and attach it to udp0
  1264. +set cbr [new Application/Traffic/CBR]
  1265. +$cbr set packetSize_ 1500
  1266. +$cbr set interval_ 0.0005
  1267. +$cbr attach-agent $udp
  1268. +
  1269. +#create an sink into the sink node
  1270. +
  1271. +# Create the Null agent to sink traffic
  1272. +set null [new Agent/Null] 
  1273. +$ns attach-agent $sinkNode $null
  1274. +
  1275. +# Attach the 2 agents
  1276. +$ns connect $udp $null
  1277. +
  1278. +# create the link between sink node and base station
  1279. +$ns duplex-link $sinkNode $bstation 100Mb 1ms DropTail
  1280. +
  1281. +#Schedule start/stop of traffic
  1282. +$ns at $traffic_start "$cbr start"
  1283. +$ns at $traffic_stop "$cbr stop"
  1284. +
  1285. +$ns at $simulation_stop "finish"
  1286. +puts "Starts simulation"
  1287. +$ns run
  1288. +puts "Simulation done."
  1289. diff -Naur ns-2.29-org/tcl/wimax/datarate/plot-datarate ns-2.29/tcl/wimax/datarate/plot-datarate
  1290. --- ns-2.29-org/tcl/wimax/datarate/plot-datarate 1969-12-31 19:00:00.000000000 -0500
  1291. +++ ns-2.29/tcl/wimax/datarate/plot-datarate 2006-09-22 17:27:47.000000000 -0400
  1292. @@ -0,0 +1,18 @@
  1293. +reset
  1294. +set terminal post eps
  1295. +set output "datarate802_16.eps"
  1296. +set nogrid
  1297. +#set logscale y
  1298. +set xlabel "Cyclic prefix" 
  1299. +set ylabel "Datarate (Mbps)"
  1300. +set xrange [0:0.3]
  1301. +set yrange [0:20]
  1302. +#set key 45,0.45
  1303. +set title "Exprerimental datarate"
  1304. +plot "res_datarate/resultOFDM_BPSK_1_2.dat" using 2:($3/(1024*1024)) title "BPSK_1_2" with lp, 
  1305. +"res_datarate/resultOFDM_QPSK_1_2.dat" using 2:($3/(1024*1024)) title "QPSK_1_2" with lp, 
  1306. +"res_datarate/resultOFDM_QPSK_3_4.dat" using 2:($3/(1024*1024)) title "QPSK_3_4" with lp, 
  1307. +"res_datarate/resultOFDM_16QAM_1_2.dat" using 2:($3/(1024*1024)) title "16QAM_1_2" with lp, 
  1308. +"res_datarate/resultOFDM_16QAM_3_4.dat" using 2:($3/(1024*1024)) title "16QAM_3_4" with lp, 
  1309. +"res_datarate/resultOFDM_64QAM_2_3.dat" using 2:($3/(1024*1024)) title "64QAM_2_3" with lp, 
  1310. +"res_datarate/resultOFDM_64QAM_3_4.dat" using 2:($3/(1024*1024)) title "64QAM_3_4" with lp
  1311. diff -Naur ns-2.29-org/tcl/wimax/l2handover.tcl ns-2.29/tcl/wimax/l2handover.tcl
  1312. --- ns-2.29-org/tcl/wimax/l2handover.tcl 1969-12-31 19:00:00.000000000 -0500
  1313. +++ ns-2.29/tcl/wimax/l2handover.tcl 2006-09-22 17:27:47.000000000 -0400
  1314. @@ -0,0 +1,205 @@
  1315. +# Script showing a layer 2 handover in 802.16
  1316. +# @author rouil
  1317. +# Scenario: Communication between MN and Sink Node with MN attached to BS.
  1318. +# Notes:- In order to perform layer 2 handover, the BSs must share the same channel
  1319. +#       - Additional mechanisms are required in order to continue a communication after a layer 2 handover
  1320. +#         This is achieved by updating the MN address to simulate layer 3 handovers and traffic redirection.
  1321. +#         We will provide the code as part of our implementation of IEEE 802.21.
  1322. +#
  1323. +
  1324. +#
  1325. +# Topology scenario:
  1326. +#
  1327. +#
  1328. +#         |-----|          
  1329. +#         | MN0 |                 ; 1.0.1 
  1330. +#         |-----|        
  1331. +#
  1332. +#
  1333. +#   (^)                         (^)
  1334. +#    |                           |
  1335. +#     |--------------|            |--------------|
  1336. +#           | Base Station | ; 1.0.0    | Base Station |
  1337. +#           |--------------|            |--------------|
  1338. +#         |                           |
  1339. +#         |                           |
  1340. +#      |-----------|                     |
  1341. +#            | Sink node |---------------------| 
  1342. +#            |-----------|  ; 0.0.0
  1343. +#
  1344. +
  1345. +#check input parameters
  1346. +if {$argc != 0} {
  1347. + puts ""
  1348. + puts "Wrong Number of Arguments! No arguments in this topology"
  1349. + puts ""
  1350. + exit 
  1351. +}
  1352. +
  1353. +# set global variables
  1354. +set output_dir .
  1355. +set traffic_start 5
  1356. +set traffic_stop  15
  1357. +set simulation_stop 60
  1358. +
  1359. +#define debug values
  1360. +Mac/802_16 set debug_ 1
  1361. +Mac/802_16 set t21_timeout_          20 ;#max 10s
  1362. +
  1363. +#define coverage area for base station: 20m coverage 
  1364. +Phy/WirelessPhy set Pt_ 0.025
  1365. +Phy/WirelessPhy set RXThresh_ 6.12277e-09
  1366. +Phy/WirelessPhy set CSThresh_ [expr 0.9 *[Phy/WirelessPhy set RXThresh_]]
  1367. +
  1368. +# Parameter for wireless nodes
  1369. +set opt(chan)           Channel/WirelessChannel    ;# channel type
  1370. +set opt(prop)           Propagation/TwoRayGround   ;# radio-propagation model
  1371. +set opt(netif)          Phy/WirelessPhy/OFDM       ;# network interface type
  1372. +set opt(mac)            Mac/802_16                 ;# MAC type
  1373. +set opt(ifq)            Queue/DropTail/PriQueue    ;# interface queue type
  1374. +set opt(ll)             LL                         ;# link layer type
  1375. +set opt(ant)            Antenna/OmniAntenna        ;# antenna model
  1376. +set opt(ifqlen)         50                  ;# max packet in ifq
  1377. +set opt(adhocRouting)   DSDV                       ;# routing protocol
  1378. +
  1379. +set opt(x) 670    ;# X dimension of the topography
  1380. +set opt(y) 670    ;# Y dimension of the topography
  1381. +
  1382. +#defines function for flushing and closing files
  1383. +proc finish {} {
  1384. +        global ns tf output_dir nb_mn
  1385. +        $ns flush-trace
  1386. +        close $tf
  1387. + exit 0
  1388. +}
  1389. +
  1390. +#create the simulator
  1391. +set ns [new Simulator]
  1392. +$ns use-newtrace
  1393. +
  1394. +#create the topography
  1395. +set topo [new Topography]
  1396. +$topo load_flatgrid $opt(x) $opt(y)
  1397. +
  1398. +#open file for trace
  1399. +set tf [open $output_dir/out.res w]
  1400. +$ns trace-all $tf
  1401. +
  1402. +# set up for hierarchical routing (needed for routing over a basestation)
  1403. +$ns node-config -addressType hierarchical
  1404. +AddrParams set domain_num_ 3           ;# domain number
  1405. +lappend cluster_num 1 1 1            ;# cluster number for each domain 
  1406. +AddrParams set cluster_num_ $cluster_num
  1407. +lappend eilastlevel 1 2 2 ;# number of nodes for each cluster 
  1408. +AddrParams set nodes_num_ $eilastlevel
  1409. +puts "Configuration of hierarchical addressing done"
  1410. +
  1411. +# Create God
  1412. +create-god 3 ;# nb_mn + 2 (base station and sink node)
  1413. +
  1414. +#creates the sink node in first addressing space.
  1415. +set sinkNode [$ns node 0.0.0]
  1416. +puts "sink node created"
  1417. +
  1418. +#create common channel
  1419. +set channel [new $opt(chan)]
  1420. +
  1421. +#creates the Access Point (Base station)
  1422. +$ns node-config -adhocRouting $opt(adhocRouting) 
  1423. +                 -llType $opt(ll) 
  1424. +                 -macType $opt(mac) 
  1425. +                 -ifqType $opt(ifq) 
  1426. +                 -ifqLen $opt(ifqlen) 
  1427. +                 -antType $opt(ant) 
  1428. +                 -propType $opt(prop)    
  1429. +                 -phyType $opt(netif) 
  1430. +                 -channel $channel 
  1431. +                 -topoInstance $topo 
  1432. +                 -wiredRouting ON 
  1433. +                 -agentTrace ON 
  1434. +                 -routerTrace ON 
  1435. +                 -macTrace ON  
  1436. +                 -movementTrace OFF
  1437. +#puts "Configuration of base station"
  1438. +
  1439. +set bstation [$ns node 1.0.0]  
  1440. +$bstation random-motion 0
  1441. +#provide some co-ord (fixed) to base station node
  1442. +$bstation set X_ 50.0
  1443. +$bstation set Y_ 50.0
  1444. +$bstation set Z_ 0.0
  1445. +set clas [new SDUClassifier/Dest]
  1446. +[$bstation set mac_(0)] add-classifier $clas
  1447. +#set the scheduler for the node. 
  1448. +set bs_sched [new WimaxScheduler/BS]
  1449. +[$bstation set mac_(0)] set-scheduler $bs_sched
  1450. +[$bstation set mac_(0)] set-channel 0
  1451. +puts "Base Station 1 created"
  1452. +
  1453. +set bstation2 [$ns node 2.0.0]  
  1454. +$bstation2 random-motion 0
  1455. +#provide some co-ord (fixed) to base station node
  1456. +$bstation2 set X_ 65.0
  1457. +$bstation2 set Y_ 50.0
  1458. +$bstation2 set Z_ 0.0
  1459. +set clas2 [new SDUClassifier/Dest]
  1460. +[$bstation2 set mac_(0)] add-classifier $clas2
  1461. +#set the scheduler for the node.
  1462. +set bs_sched2 [new WimaxScheduler/BS]
  1463. +[$bstation2 set mac_(0)] set-scheduler $bs_sched2
  1464. +[$bstation2 set mac_(0)] set-channel 1
  1465. +puts "Base Station 2 created"
  1466. +
  1467. +# creation of the mobile nodes
  1468. +$ns node-config -wiredRouting OFF 
  1469. +                -macTrace ON   ;# Mobile nodes cannot do routing.
  1470. +
  1471. +set wl_node [$ns node 1.0.1]  ;# create the node with given @.
  1472. +$wl_node random-motion 0 ;# disable random motion
  1473. +$wl_node base-station [AddrParams addr2id [$bstation node-addr]] ;#attach mn to basestation
  1474. +$wl_node set X_ 45.0
  1475. +$wl_node set Y_ 50.0
  1476. +$wl_node set Z_ 0.0
  1477. +$ns at 0.0 "$wl_node setdest 70.0 50.0 2.0"
  1478. +set clas [new SDUClassifier/Dest]
  1479. +[$wl_node set mac_(0)] add-classifier $clas
  1480. +#set the scheduler for the node. Must be changed to -shed [new $opt(sched)]
  1481. +set ss_sched [new WimaxScheduler/SS]
  1482. +[$wl_node set mac_(0)] set-scheduler $ss_sched
  1483. +[$wl_node set mac_(0)] set-channel 0
  1484. +puts "wireless node created ..." ;# debug info
  1485. +#$ns at 6.5 "$ss_sched send-scan"
  1486. +
  1487. +#create source traffic
  1488. +#Create a UDP agent and attach it to node n0
  1489. +set udp [new Agent/UDP]
  1490. +$udp set packetSize_ 1500
  1491. +$ns attach-agent $wl_node $udp
  1492. +
  1493. +# Create a CBR traffic source and attach it to udp0
  1494. +set cbr [new Application/Traffic/CBR]
  1495. +$cbr set packetSize_ 1000
  1496. +$cbr set interval_ 0.1
  1497. +$cbr attach-agent $udp
  1498. +
  1499. +#create an sink into the sink node
  1500. +
  1501. +# Create the Null agent to sink traffic
  1502. +set null [new Agent/Null] 
  1503. +$ns attach-agent $sinkNode $null
  1504. +
  1505. +# Attach the 2 agents
  1506. +$ns connect $udp $null
  1507. +
  1508. +
  1509. +# create the link between sink node and base station
  1510. +$ns duplex-link $sinkNode $bstation 100Mb 1ms DropTail
  1511. +
  1512. +# Traffic scenario: here the all start talking at the same time
  1513. +$ns at $traffic_start "$cbr start"
  1514. +$ns at $traffic_stop "$cbr stop"
  1515. +
  1516. +$ns at $simulation_stop "finish"
  1517. +puts "Running simulation"
  1518. +$ns run
  1519. +puts "Simulation done."
  1520. diff -Naur ns-2.29-org/tcl/wimax/simple.tcl ns-2.29/tcl/wimax/simple.tcl
  1521. --- ns-2.29-org/tcl/wimax/simple.tcl 1969-12-31 19:00:00.000000000 -0500
  1522. +++ ns-2.29/tcl/wimax/simple.tcl 2006-09-22 17:27:47.000000000 -0400
  1523. @@ -0,0 +1,198 @@
  1524. +# Test for IEEE 802.16 nodes.
  1525. +# @author rouil
  1526. +# Test file for wimax
  1527. +# Scenario: Communication between MNs and Sink Node through 802.16 BS.
  1528. +
  1529. +#
  1530. +# Topology scenario:
  1531. +#
  1532. +#
  1533. +#         |-----|          
  1534. +#         | MN  |                 ; 1.0.1 
  1535. +#         |-----|        
  1536. +#
  1537. +#
  1538. +#   (^)
  1539. +#    |
  1540. +#     |--------------|
  1541. +#           | Base Station |  ; 1.0.0
  1542. +#           |--------------|
  1543. +#         |
  1544. +#         |
  1545. +#      |-----------|
  1546. +#            | Sink node |  ; 0.0.0
  1547. +#            |-----------|
  1548. +#
  1549. +
  1550. +#check input parameters
  1551. +if {$argc != 0} {
  1552. + puts ""
  1553. + puts "Wrong Number of Arguments! No arguments in this topology"
  1554. + puts ""
  1555. + exit (1)
  1556. +}
  1557. +
  1558. +# set global variables
  1559. +set nb_mn 50 ;# max number of mobile node
  1560. +set packet_size 1500 ;# packet size in bytes at CBR applications 
  1561. +set gap_size 1 ;#compute gap size between packets
  1562. +puts "gap size=$gap_size"
  1563. +set traffic_start 100
  1564. +set traffic_stop  200
  1565. +set simulation_stop 300
  1566. +
  1567. +#define debug values
  1568. +Mac/802_16 set debug_ 0
  1569. +
  1570. +#define coverage area for base station
  1571. +Phy/WirelessPhy set Pt_ 0.025
  1572. +Phy/WirelessPhy set RXThresh_ 2.025e-12 ;#500m radius
  1573. +Phy/WirelessPhy set CSThresh_ [expr 0.9*[Phy/WirelessPhy set RXThresh_]]
  1574. +
  1575. +# Parameter for wireless nodes
  1576. +set opt(chan)           Channel/WirelessChannel    ;# channel type
  1577. +set opt(prop)           Propagation/TwoRayGround   ;# radio-propagation model
  1578. +set opt(netif)          Phy/WirelessPhy/OFDM       ;# network interface type
  1579. +set opt(mac)            Mac/802_16                 ;# MAC type
  1580. +set opt(ifq)            Queue/DropTail/PriQueue    ;# interface queue type
  1581. +set opt(ll)             LL                         ;# link layer type
  1582. +set opt(ant)            Antenna/OmniAntenna        ;# antenna model
  1583. +set opt(ifqlen)         50                  ;# max packet in ifq
  1584. +set opt(adhocRouting)   DSDV                       ;# routing protocol
  1585. +
  1586. +set opt(x) 1100    ;# X dimension of the topography
  1587. +set opt(y) 1100    ;# Y dimension of the topography
  1588. +
  1589. +#defines function for flushing and closing files
  1590. +proc finish {} {
  1591. +        global ns tf output_dir nb_mn
  1592. +        $ns flush-trace
  1593. +        close $tf
  1594. + exit 0
  1595. +}
  1596. +
  1597. +#create the simulator
  1598. +set ns [new Simulator]
  1599. +$ns use-newtrace
  1600. +
  1601. +#create the topography
  1602. +set topo [new Topography]
  1603. +$topo load_flatgrid $opt(x) $opt(y)
  1604. +
  1605. +#open file for trace
  1606. +set tf [open out.res w]
  1607. +$ns trace-all $tf
  1608. +
  1609. +# set up for hierarchical routing (needed for routing over a basestation)
  1610. +#puts "start hierarchical addressing"
  1611. +$ns node-config -addressType hierarchical
  1612. +AddrParams set domain_num_ 2           ;# domain number
  1613. +lappend cluster_num 1 1             ;# cluster number for each domain 
  1614. +AddrParams set cluster_num_ $cluster_num
  1615. +lappend eilastlevel 1 [expr ($nb_mn+1)]  ;# number of nodes for each cluster (1 for sink and one for mobile nodes + base station
  1616. +AddrParams set nodes_num_ $eilastlevel
  1617. +puts "Configuration of hierarchical addressing done"
  1618. +
  1619. +# Create God
  1620. +create-god [expr ($nb_mn + 2)] ;# nb_mn + 2 (base station and sink node)
  1621. +#puts "God node created"
  1622. +
  1623. +#creates the sink node in first addressing space.
  1624. +set sinkNode [$ns node 0.0.0]
  1625. +#provide some co-ord (fixed) to base station node
  1626. +$sinkNode set X_ 50.0
  1627. +$sinkNode set Y_ 50.0
  1628. +$sinkNode set Z_ 0.0
  1629. +#puts "sink node created"
  1630. +
  1631. +#creates the Access Point (Base station)
  1632. +$ns node-config -adhocRouting $opt(adhocRouting) 
  1633. +                 -llType $opt(ll) 
  1634. +                 -macType $opt(mac) 
  1635. +                 -ifqType $opt(ifq) 
  1636. +                 -ifqLen $opt(ifqlen) 
  1637. +                 -antType $opt(ant) 
  1638. +                 -propType $opt(prop)    
  1639. +                 -phyType $opt(netif) 
  1640. +                 -channel [new $opt(chan)] 
  1641. +                 -topoInstance $topo 
  1642. +                 -wiredRouting ON 
  1643. +                 -agentTrace ON 
  1644. +                 -routerTrace ON 
  1645. +                 -macTrace ON  
  1646. +                 -movementTrace OFF
  1647. +#puts "Configuration of base station"
  1648. +
  1649. +set bstation [$ns node 1.0.0]  
  1650. +$bstation random-motion 0
  1651. +#puts "Base-Station node created"
  1652. +#provide some co-ord (fixed) to base station node
  1653. +$bstation set X_ 550.0
  1654. +$bstation set Y_ 550.0
  1655. +$bstation set Z_ 0.0
  1656. +set clas [new SDUClassifier/Dest]
  1657. +[$bstation set mac_(0)] add-classifier $clas
  1658. +#set the scheduler for the node. Must be changed to -shed [new $opt(sched)]
  1659. +set bs_sched [new WimaxScheduler/BS]
  1660. +[$bstation set mac_(0)] set-scheduler $bs_sched
  1661. +[$bstation set mac_(0)] set-channel 0
  1662. +
  1663. +# creation of the mobile nodes
  1664. +$ns node-config -wiredRouting OFF 
  1665. +                -macTrace ON   ;# Mobile nodes cannot do routing.
  1666. +for {set i 0} {$i < $nb_mn} {incr i} {
  1667. + set wl_node_($i) [$ns node 1.0.[expr $i + 1]]  ;# create the node with given @.
  1668. + $wl_node_($i) random-motion 0 ;# disable random motion
  1669. + $wl_node_($i) base-station [AddrParams addr2id [$bstation node-addr]] ;#attach mn to basestation
  1670. + #compute position of the node
  1671. +        $wl_node_($i) set X_ [expr 340.0+$i]
  1672. +        #$ns at 4.0 "$wl_node_($i) set X_ 80"
  1673. +        #$ns at 6.0 "$wl_node_($i) set X_ 50"
  1674. + $wl_node_($i) set Y_ 550.0
  1675. + $wl_node_($i) set Z_ 0.0
  1676. +        $ns at 0 "$wl_node_($i) setdest 1060.0 550.0 1.0"
  1677. +        puts "wireless node $i created ..." ;# debug info
  1678. +
  1679. + set clas [new SDUClassifier/Dest]
  1680. +        [$wl_node_($i) set mac_(0)] add-classifier $clas
  1681. +        #set the scheduler for the node. Must be changed to -shed [new $opt(sched)]
  1682. +        set ss_sched [new WimaxScheduler/SS]
  1683. +        [$wl_node_($i) set mac_(0)] set-scheduler $ss_sched
  1684. +        [$wl_node_($i) set mac_(0)] set-channel 0
  1685. +
  1686. +        #create source traffic
  1687. + #Create a UDP agent and attach it to node n0
  1688. + set udp_($i) [new Agent/UDP]
  1689. + $udp_($i) set packetSize_ 1500
  1690. + $ns attach-agent $wl_node_($i) $udp_($i)
  1691. +
  1692. + # Create a CBR traffic source and attach it to udp0
  1693. + set cbr_($i) [new Application/Traffic/CBR]
  1694. + $cbr_($i) set packetSize_ $packet_size
  1695. + $cbr_($i) set interval_ $gap_size
  1696. + $cbr_($i) attach-agent $udp_($i)
  1697. +
  1698. + #create an sink into the sink node
  1699. +
  1700. + # Create the Null agent to sink traffic
  1701. + set null_($i) [new Agent/Null] 
  1702. + $ns attach-agent $sinkNode $null_($i)
  1703. +
  1704. + # Attach the 2 agents
  1705. + $ns connect $udp_($i) $null_($i)
  1706. +}
  1707. +
  1708. +# create the link between sink node and base station
  1709. +$ns duplex-link $sinkNode $bstation 100Mb 1ms DropTail
  1710. +
  1711. +# Traffic scenario: here the all start talking at the same time
  1712. +for {set i 0} {$i < $nb_mn} {incr i} {
  1713. + $ns at $traffic_start "$cbr_($i) start"
  1714. + $ns at $traffic_stop "$cbr_($i) stop"
  1715. +}
  1716. +
  1717. +$ns at $simulation_stop "finish"
  1718. +# Run the simulation
  1719. +puts "Running simulation for $nb_mn mobile nodes..."
  1720. +$ns run
  1721. +puts "Simulation done."
  1722. diff -Naur ns-2.29-org/wimax/connection.cc ns-2.29/wimax/connection.cc
  1723. --- ns-2.29-org/wimax/connection.cc 1969-12-31 19:00:00.000000000 -0500
  1724. +++ ns-2.29/wimax/connection.cc 2006-09-22 17:27:47.000000000 -0400
  1725. @@ -0,0 +1,175 @@
  1726. +/* This software was developed at the National Institute of Standards and
  1727. + * Technology by employees of the Federal Government in the course of
  1728. + * their official duties. Pursuant to title 17 Section 105 of the United
  1729. + * States Code this software is not subject to copyright protection and
  1730. + * is in the public domain.
  1731. + * NIST assumes no responsibility whatsoever for its use by other parties,
  1732. + * and makes no guarantees, expressed or implied, about its quality,
  1733. + * reliability, or any other characteristic.
  1734. + * <BR>
  1735. + * We would appreciate acknowledgement if the software is used.
  1736. + * <BR>
  1737. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  1738. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  1739. + * FROM THE USE OF THIS SOFTWARE.
  1740. + * </PRE></P>
  1741. + * @author  rouil
  1742. + */
  1743. +
  1744. +#include "connection.h"
  1745. +#include "connectionmanager.h"
  1746. +#include "mac802_16.h"
  1747. +
  1748. +static int basicIndex = BASIC_CID_START;
  1749. +static int primaryIndex = PRIMARY_CID_START;
  1750. +static int transportIndex = TRANSPORT_SEC_CID_START;
  1751. +static int multicastIndex = MULTICAST_CID_START;
  1752. +
  1753. +/**
  1754. + * Constructor used by BS to automatically assign CIDs
  1755. + * @param type The connection type. 
  1756. + */
  1757. +Connection::Connection (ConnectionType_t type) : peer_(0), 
  1758. +  frag_status_(FRAG_NOFRAG), 
  1759. +  frag_nb_(0), 
  1760. +  frag_byte_proc_(0),
  1761. +  frag_enable_(true)
  1762. +{
  1763. +   switch (type) {
  1764. +   case CONN_INIT_RANGING:
  1765. +     cid_ = INITIAL_RANGING_CID;
  1766. +     break;
  1767. +   case CONN_AAS_INIT_RANGING:
  1768. +     cid_ = AAS_INIT_RANGIN_CID;
  1769. +     break;
  1770. +   case CONN_PADDING:
  1771. +     cid_ = PADDING_CID;
  1772. +     break;
  1773. +   case CONN_BROADCAST:
  1774. +     cid_ = BROADCAST_CID;
  1775. +     break;
  1776. +   case CONN_MULTICAST_POLLING:
  1777. +     cid_ = multicastIndex++;
  1778. +     assert (multicastIndex <= MULTICAST_CID_STOP);
  1779. +     break;
  1780. +   case CONN_BASIC:
  1781. +     cid_ = basicIndex++;
  1782. +     assert (basicIndex <= BASIC_CID_STOP);
  1783. +     break;
  1784. +   case CONN_PRIMARY:
  1785. +     cid_ = primaryIndex++;
  1786. +     assert (primaryIndex <= PRIMARY_CID_STOP);
  1787. +       break;
  1788. +   case CONN_SECONDARY:
  1789. +   case CONN_DATA:
  1790. +     cid_ = transportIndex++;
  1791. +     assert (transportIndex <= TRANSPORT_SEC_CID_STOP);
  1792. +     break;
  1793. +   default:
  1794. +     fprintf (stderr, "Unsupported connection typen");
  1795. +     exit (1);
  1796. +   }
  1797. +   type_ = type;
  1798. +   queue_ = new PacketQueue();
  1799. +
  1800. +}
  1801. +
  1802. +/**
  1803. + * Constructor used by SSs when the CID is already known
  1804. + * @param type The connection type
  1805. + * @param cid The connection cid
  1806. + */
  1807. +Connection::Connection (ConnectionType_t type, int cid) : peer_(0), 
  1808. +   frag_status_(FRAG_NOFRAG), 
  1809. +   frag_nb_(0), 
  1810. +   frag_byte_proc_(0),
  1811. +   frag_enable_(true)
  1812. +{
  1813. +  cid_ = cid;
  1814. +  type_ = type;
  1815. +  queue_ = new PacketQueue();
  1816. +}
  1817. +
  1818. +/**
  1819. + * Destructor
  1820. + */
  1821. +Connection::~Connection ()
  1822. +{
  1823. +  flush_queue ();
  1824. +}
  1825. +
  1826. +/**
  1827. + * Set the connection manager
  1828. + * @param manager The Connection manager 
  1829. + */
  1830. +void Connection::setManager (ConnectionManager *manager)
  1831. +{
  1832. +  manager_ = manager;
  1833. +}
  1834. +
  1835. +/**
  1836. + * Enqueue the given packet
  1837. + * @param p The packet to enqueue
  1838. + */
  1839. +void Connection::enqueue (Packet * p) 
  1840. +{
  1841. +  queue_->enque (p);
  1842. +}
  1843. +
  1844. +/**
  1845. + * Dequeue a packet from the queue
  1846. + * @param p The packet to enqueue
  1847. + */
  1848. +Packet * Connection::dequeue () 
  1849. +{
  1850. +  return queue_->deque ();
  1851. +}
  1852. +
  1853. +/**
  1854. + * Flush the queue and return the number of packets freed
  1855. + * @return The number of packets flushed
  1856. + */
  1857. +int Connection::flush_queue()
  1858. +{
  1859. +  int i=0;
  1860. +  Packet *p;
  1861. +  while ( (p=queue_->deque()) ) {
  1862. +    manager_->getMac()->drop(p, "CON");
  1863. +    i++;
  1864. +  }
  1865. +  return i;
  1866. +}
  1867. +
  1868. +/**
  1869. + * Return queue size in bytes
  1870. +
  1871. + */
  1872. +int Connection::queueByteLength () 
  1873. +{
  1874. +  return queue_->byteLength ();
  1875. +}
  1876. +
  1877. +/**
  1878. + * Return queue size in bytes
  1879. +
  1880. + */
  1881. +int Connection::queueLength () 
  1882. +{
  1883. +  return queue_->length ();
  1884. +}
  1885. +
  1886. +/** 
  1887. + * Update the fragmentation information
  1888. + * @param status The new fragmentation status
  1889. + * @param index The new fragmentation index
  1890. + * @param bytes The number of bytes 
  1891. + */
  1892. +void Connection::updateFragmentation (fragment_status status, int index, int bytes)
  1893. +{
  1894. +  frag_status_ = status;
  1895. +  frag_nb_ = index;
  1896. +  frag_byte_proc_ = bytes;
  1897. +}
  1898. +
  1899. +
  1900. +
  1901. diff -Naur ns-2.29-org/wimax/connection.h ns-2.29/wimax/connection.h
  1902. --- ns-2.29-org/wimax/connection.h 1969-12-31 19:00:00.000000000 -0500
  1903. +++ ns-2.29/wimax/connection.h 2006-09-22 17:27:47.000000000 -0400
  1904. @@ -0,0 +1,286 @@
  1905. +/* This software was developed at the National Institute of Standards and
  1906. + * Technology by employees of the Federal Government in the course of
  1907. + * their official duties. Pursuant to title 17 Section 105 of the United
  1908. + * States Code this software is not subject to copyright protection and
  1909. + * is in the public domain.
  1910. + * NIST assumes no responsibility whatsoever for its use by other parties,
  1911. + * and makes no guarantees, expressed or implied, about its quality,
  1912. + * reliability, or any other characteristic.
  1913. + * <BR>
  1914. + * We would appreciate acknowledgement if the software is used.
  1915. + * <BR>
  1916. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  1917. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  1918. + * FROM THE USE OF THIS SOFTWARE.
  1919. + * </PRE></P>
  1920. + * @author  rouil
  1921. + */
  1922. +
  1923. +#ifndef CONNECTION_H
  1924. +#define CONNECTION_H
  1925. +
  1926. +#include "serviceflow.h"
  1927. +#include "packet.h"
  1928. +#include "queue.h"
  1929. +#include "mac802_16pkt.h"
  1930. +
  1931. +/* CONSTANTS */
  1932. +#define INITIAL_RANGING_CID 0x0000
  1933. +#define BASIC_CID_START     0x0001
  1934. +#define BASIC_CID_STOP      0x2000
  1935. +#define PRIMARY_CID_START   0x2001
  1936. +#define PRIMARY_CID_STOP    0x4000
  1937. +#define TRANSPORT_SEC_CID_START 0x4001
  1938. +#define TRANSPORT_SEC_CID_STOP 0xFEFE
  1939. +#define AAS_INIT_RANGIN_CID 0xFEFF
  1940. +#define MULTICAST_CID_START 0xFF00
  1941. +#define MULTICAST_CID_STOP  0xFFFD
  1942. +#define PADDING_CID         0xFFFE
  1943. +#define BROADCAST_CID       0xFFFF
  1944. +
  1945. +/**
  1946. + * Define the type of the connection
  1947. + */
  1948. +enum ConnectionType_t {
  1949. +  CONN_INIT_RANGING,
  1950. +  CONN_AAS_INIT_RANGING,
  1951. +  CONN_MULTICAST_POLLING,
  1952. +  CONN_PADDING,
  1953. +  CONN_BROADCAST,
  1954. +  CONN_BASIC,
  1955. +  CONN_PRIMARY,
  1956. +  CONN_SECONDARY,
  1957. +  CONN_DATA
  1958. +};
  1959. +
  1960. +class PeerNode;
  1961. +class ConnectionManager;
  1962. +class Connection;
  1963. +LIST_HEAD (connection, Connection);
  1964. +
  1965. +/** 
  1966. + * Class Connection
  1967. + * The class supports LIST.
  1968. + */ 
  1969. +class Connection {
  1970. + public:
  1971. +  /** constructor */
  1972. +  Connection (ConnectionType_t);
  1973. +
  1974. +  /** constructor */
  1975. +  Connection (ConnectionType_t, int cid);    
  1976. +
  1977. +  /** destructor */
  1978. +  ~Connection ();
  1979. +
  1980. +  /**
  1981. +   * Set the connection manager
  1982. +   * @param manager The Connection manager 
  1983. +   */
  1984. +  void setManager (ConnectionManager *manager);
  1985. +
  1986. +  /**
  1987. +   * Enqueue the given packet
  1988. +   * @param p The packet to enqueue
  1989. +   */
  1990. +  void  enqueue (Packet * p);
  1991. +  
  1992. +  /**
  1993. +   * Set the service flow for this connection
  1994. +   * @param sflow The service flow for this connection
  1995. +   */
  1996. +  void  setServiceFlow (ServiceFlow * sflow);
  1997. +  
  1998. +  /**
  1999. +   * Return the service flow for this connection
  2000. +   */
  2001. +  ServiceFlow *  getServiceFlow ();
  2002. +
  2003. +  /**
  2004. +   * Get the value of cid
  2005. +   * The connection id
  2006. +   * @return the value of cid
  2007. +   */
  2008. +  inline int get_cid ( ) { return cid_; }
  2009. +
  2010. +  /**
  2011. +   * Get the value of category_
  2012. +   * The connection id
  2013. +   * @return the value of category_
  2014. +   */
  2015. +  inline ConnectionType_t get_category ( ) { return category_; }
  2016. +      
  2017. +  /**
  2018. +   * Set the value of category_
  2019. +   * The connection id
  2020. +   * @return the value of category_
  2021. +   */
  2022. +  inline void set_category (ConnectionType_t value ) { category_ = value; }
  2023. +    
  2024. +  /**
  2025. +   * Get the value of serviceflow_
  2026. +   * The service flow associated with the connection
  2027. +   * @return the value of serviceflow_
  2028. +   */
  2029. +  inline ServiceFlow * get_serviceflow ( ) { return serviceflow_; }
  2030. +  
  2031. +  /**
  2032. +   * Set the value of serviceflow_
  2033. +   * The service flow associated with the connection
  2034. +   * @return the value of serviceflow_
  2035. +   */
  2036. +  inline void set_serviceflow (ServiceFlow * value ) { serviceflow_ = value; }
  2037. +  
  2038. +  /**
  2039. +   * return the connection type
  2040. +   * @return The connection type
  2041. +   */
  2042. +  inline ConnectionType_t getType () { return type_; }
  2043. +
  2044. +  /**
  2045. +   * Get the value of queue_
  2046. +   * The queue for this connection
  2047. +   * @return the value of queue_
  2048. +   */
  2049. +  inline PacketQueue * get_queue ( ) { return queue_; }
  2050. +    
  2051. +  /**
  2052. +   * Dequeue a packet from the queue
  2053. +   * @param p The packet to enqueue
  2054. +   */
  2055. +  Packet * dequeue ();
  2056. +
  2057. +  /**
  2058. +   * Return queue size in bytes
  2059. +   * @return The queue size in bytes
  2060. +   */
  2061. +  int queueByteLength ();
  2062. +
  2063. +  /**
  2064. +   * Return queue size in number of packets
  2065. +   * @return The number of packet in the queue
  2066. +   */
  2067. +  int queueLength ();
  2068. +
  2069. +  /**
  2070. +   * Flush the queue
  2071. +   */
  2072. +  int flush_queue ();
  2073. +
  2074. +  /**
  2075. +   * Enable/Disable fragmentation
  2076. +   */
  2077. +  void enable_fragmentation (bool enable) { frag_enable_ = enable; }
  2078. +
  2079. +  /**
  2080. +   * Indicates if the connection supports fragmentation
  2081. +   */
  2082. +  bool isFragEnable () { return frag_enable_; }
  2083. +
  2084. +  // Chain element to the list
  2085. +  inline void insert_entry(struct connection *head) {
  2086. +    LIST_INSERT_HEAD(head, this, link);
  2087. +  }
  2088. +  
  2089. +  // Return next element in the chained list
  2090. +  Connection* next_entry(void) const { return link.le_next; }
  2091. +
  2092. +  // Remove the entry from the list
  2093. +  inline void remove_entry() { 
  2094. +    LIST_REMOVE(this, link); 
  2095. +  }
  2096. +
  2097. +  /**
  2098. +   * Return the peer node for this connection
  2099. +   * @return the peer node for this connection
  2100. +   */
  2101. +  inline PeerNode * getPeerNode () { return peer_; }
  2102. +
  2103. +  /**
  2104. +   * Set the peer node for this connection
  2105. +   * @param the peer node for this connection
  2106. +   */
  2107. +  inline void setPeerNode (PeerNode *peer) { peer_=peer; }
  2108. +
  2109. +  /** 
  2110. +   * Update the fragmentation information
  2111. +   * @param status The new fragmentation status
  2112. +   * @param index The new fragmentation index
  2113. +   * @param bytes The number of bytes 
  2114. +   */
  2115. +  void updateFragmentation (fragment_status status, int index, int bytes);
  2116. +
  2117. +  fragment_status getFragmentationStatus () { return frag_status_; }
  2118. +
  2119. +  int getFragmentNumber () { return frag_nb_; }
  2120. +
  2121. +  int getFragmentBytes () { return frag_byte_proc_; }
  2122. +
  2123. + protected:
  2124. +
  2125. +  /**
  2126. +   * Pointer to next in the list
  2127. +   */
  2128. +  LIST_ENTRY(Connection) link;
  2129. +  //LIST_ENTRY(Connection); //for magic draw
  2130. +
  2131. +
  2132. + private:
  2133. +  /**
  2134. +   * The connection manager
  2135. +   */
  2136. +  ConnectionManager* manager_;
  2137. +
  2138. +  /**
  2139. +   * The connection id
  2140. +   */
  2141. +  int cid_;
  2142. +
  2143. +  /**
  2144. +   * The category
  2145. +   */
  2146. +  ConnectionType_t category_;
  2147. +
  2148. +  /**
  2149. +   * The service flow associated with the connection
  2150. +   */
  2151. +  ServiceFlow * serviceflow_;
  2152. +
  2153. +  /**
  2154. +   * The queue for this connection
  2155. +   */
  2156. +  PacketQueue * queue_;
  2157. +
  2158. +  /** 
  2159. +   * The connection type
  2160. +   */
  2161. +  ConnectionType_t type_;
  2162. +  
  2163. +  /**
  2164. +   * Pointer to the peer node data
  2165. +   */
  2166. +  PeerNode *peer_;
  2167. +
  2168. +  /**
  2169. +   * Fragmentation status 
  2170. +   */
  2171. +  fragment_status frag_status_;
  2172. +
  2173. +  /**
  2174. +   * Fragmentation number
  2175. +   */
  2176. +  int frag_nb_;
  2177. +  
  2178. +  /**
  2179. +   * Bytes already processed (i.e sent or received)
  2180. +   */
  2181. +  int frag_byte_proc_;
  2182. +
  2183. +  /**
  2184. +   * Indicates if the connection can use fragmentation
  2185. +   */
  2186. +  bool frag_enable_;
  2187. +
  2188. +};
  2189. +#endif //CONNECTION_H
  2190. +
  2191. diff -Naur ns-2.29-org/wimax/connectionmanager.cc ns-2.29/wimax/connectionmanager.cc
  2192. --- ns-2.29-org/wimax/connectionmanager.cc 1969-12-31 19:00:00.000000000 -0500
  2193. +++ ns-2.29/wimax/connectionmanager.cc 2006-09-22 17:27:47.000000000 -0400
  2194. @@ -0,0 +1,107 @@
  2195. +/* This software was developed at the National Institute of Standards and
  2196. + * Technology by employees of the Federal Government in the course of
  2197. + * their official duties. Pursuant to title 17 Section 105 of the United
  2198. + * States Code this software is not subject to copyright protection and
  2199. + * is in the public domain.
  2200. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2201. + * and makes no guarantees, expressed or implied, about its quality,
  2202. + * reliability, or any other characteristic.
  2203. + * <BR>
  2204. + * We would appreciate acknowledgement if the software is used.
  2205. + * <BR>
  2206. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2207. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2208. + * FROM THE USE OF THIS SOFTWARE.
  2209. + * </PRE></P>
  2210. + * @author  rouil
  2211. + */
  2212. +
  2213. +#include "connectionmanager.h"
  2214. +#include "mac802_16.h"
  2215. +
  2216. +/**
  2217. + * Create the manager for the given mac
  2218. + * @param mac The Mac where the manager is located
  2219. + */
  2220. +ConnectionManager::ConnectionManager (Mac802_16 * mac) 
  2221. +{
  2222. +  assert (mac!=NULL);
  2223. +  mac_ = mac;
  2224. +
  2225. +  //init list
  2226. +  LIST_INIT (&up_con_list_);
  2227. +  LIST_INIT (&down_con_list_);
  2228. +}
  2229. +
  2230. +
  2231. +/**
  2232. + * Add a connection to the list
  2233. + * @param con The connection to add
  2234. + * @param incoming true if it is an uplink connection
  2235. + */
  2236. +void ConnectionManager::add_connection (Connection* con, bool uplink) {
  2237. +  assert (con!=NULL);
  2238. +  assert (!get_connection (con->get_cid(), uplink)); //check duplicate
  2239. +  mac_->debug ("At %f in %d adding %s connection %dn", 
  2240. +        NOW, mac_->addr(), uplink?"uplink":"downlink", con->get_cid());
  2241. +  if (uplink)
  2242. +    con->insert_entry (&up_con_list_);
  2243. +  else
  2244. +    con->insert_entry (&down_con_list_);
  2245. +
  2246. +  con->setManager(this);
  2247. +}
  2248. +
  2249. +/**
  2250. + * Remove a connection
  2251. + * @param The connection to remove
  2252. + */
  2253. +void ConnectionManager::remove_connection (Connection* con) {
  2254. +  assert (con !=NULL);
  2255. +  mac_->debug ("At %f in %d removing connection %dn", 
  2256. +        NOW, mac_->addr(), con->get_cid());
  2257. +  con->remove_entry ();
  2258. +}
  2259. +
  2260. +/**
  2261. + * Remove connection by CID, both directions.
  2262. + * @param cid The connection id
  2263. + */
  2264. +void ConnectionManager::remove_connection (int cid)
  2265. +{
  2266. +  Connection *con = get_connection (cid, true);
  2267. +  if (con)
  2268. +    remove_connection (con);
  2269. +  con = get_connection (cid, false);
  2270. +  if (con)
  2271. +    remove_connection (con);
  2272. +}
  2273. +  
  2274. +
  2275. +/**
  2276. + * Return the connection that has the given CID
  2277. + * @param cid The connection ID
  2278. + * @param uplink The direction
  2279. + * @return the connection or NULL
  2280. + */
  2281. +Connection* ConnectionManager::get_connection (int cid, bool uplink) {
  2282. +  //search throught the list
  2283. +  for (Connection *n=uplink?up_con_list_.lh_first:down_con_list_.lh_first; 
  2284. +       n; n=n->next_entry()) {
  2285. +    if (n->get_cid ()==cid)
  2286. +      return n;
  2287. +  }
  2288. +  return NULL;
  2289. +}
  2290. +
  2291. +/**
  2292. + * Flush the queues. This can be called after switching BS.
  2293. + */
  2294. +void ConnectionManager::flush_queues () {
  2295. +  mac_->debug ("At %f in %d Flushing queuesn", NOW, mac_->addr());
  2296. +  for (Connection *n=down_con_list_.lh_first; n; n=n->next_entry()) {
  2297. +    int i = n->flush_queue();
  2298. +    mac_->debug ("tFreed %d packet in queue for connection %dn", i, n->get_cid());
  2299. +  }
  2300. +}
  2301. +
  2302. diff -Naur ns-2.29-org/wimax/connectionmanager.h ns-2.29/wimax/connectionmanager.h
  2303. --- ns-2.29-org/wimax/connectionmanager.h 1969-12-31 19:00:00.000000000 -0500
  2304. +++ ns-2.29/wimax/connectionmanager.h 2006-09-22 17:27:47.000000000 -0400
  2305. @@ -0,0 +1,113 @@
  2306. +/* This software was developed at the National Institute of Standards and
  2307. + * Technology by employees of the Federal Government in the course of
  2308. + * their official duties. Pursuant to title 17 Section 105 of the United
  2309. + * States Code this software is not subject to copyright protection and
  2310. + * is in the public domain.
  2311. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2312. + * and makes no guarantees, expressed or implied, about its quality,
  2313. + * reliability, or any other characteristic.
  2314. + * <BR>
  2315. + * We would appreciate acknowledgement if the software is used.
  2316. + * <BR>
  2317. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2318. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2319. + * FROM THE USE OF THIS SOFTWARE.
  2320. + * </PRE></P>
  2321. + * @author  rouil
  2322. + */
  2323. +
  2324. +#ifndef CONNECTIONMANAGER_H
  2325. +#define CONNECTIONMANAGER_H
  2326. +
  2327. +#include "connection.h"
  2328. +
  2329. +class Mac802_16;
  2330. +
  2331. +/**
  2332. + * Class ConnectionManager
  2333. + * The class handles the list of connections for a Mac 802.16
  2334. + */ 
  2335. +class ConnectionManager {
  2336. +  friend class Connection;
  2337. + public:
  2338. +  /**
  2339. +   * 
  2340. +   * @param mac The mac where the manager belongs
  2341. +   */
  2342. +  ConnectionManager (Mac802_16 * mac);
  2343. +  
  2344. +  /**
  2345. +   * Add a connection
  2346. +   * @param con The connection to add
  2347. +   * @param incoming true if it is an uplink connection
  2348. +   */
  2349. +  void add_connection (Connection* con, bool uplink);
  2350. +  
  2351. +  /**
  2352. +   * Remove the given connection
  2353. +   * @param connection Remove the given connection
  2354. +   */
  2355. +  void remove_connection (Connection* connection);
  2356. +
  2357. +  /**
  2358. +   * Remove connection by CID, both directions.
  2359. +   * @param cid The connection id
  2360. +   */
  2361. +  void remove_connection (int cid);
  2362. +  
  2363. +  /**
  2364. +   * Return the connection with the given cid and direction
  2365. +   * @param cid The connection id
  2366. +   * @param incoming specifies the direction of the connection
  2367. +   */
  2368. +  Connection*  get_connection (int cid, bool uplink);
  2369. +  
  2370. +  /**
  2371. +   * Return the head of the incoming connection list
  2372. +   */
  2373. +  Connection* get_up_connection () { return up_con_list_.lh_first; }
  2374. +
  2375. +  /**
  2376. +   * Return the head of the outgoing connection list
  2377. +   */
  2378. +  Connection* get_down_connection () { return down_con_list_.lh_first; }
  2379. +
  2380. +
  2381. +  /**
  2382. +   * Flush the queues. This can be called after switching BS.
  2383. +   */
  2384. +  void  flush_queues ();
  2385. +  
  2386. + protected:
  2387. +  /**
  2388. +   * Get the value of mac_
  2389. +   * The Mac where this object is located
  2390. +   * @return the value of mac_
  2391. +   */
  2392. +  inline Mac802_16 * getMac ( ) { return mac_; }
  2393. +  
  2394. + private:
  2395. +  /**
  2396. +   * The list of available connections
  2397. +   */
  2398. +  Connection* connections_;
  2399. +  
  2400. +  /**
  2401. +   * The Mac where this object is located
  2402. +   */
  2403. +  Mac802_16 * mac_;
  2404. +  
  2405. +  /**
  2406. +   * The list of uplink connections
  2407. +   */
  2408. +  struct connection up_con_list_;
  2409. +
  2410. +  /**
  2411. +   * The list of downlink connections
  2412. +   */
  2413. +  struct connection down_con_list_;
  2414. +
  2415. +  
  2416. +};
  2417. +#endif //CONNECTIONMANAGER_H
  2418. +
  2419. diff -Naur ns-2.29-org/wimax/destclassifier.cc ns-2.29/wimax/destclassifier.cc
  2420. --- ns-2.29-org/wimax/destclassifier.cc 1969-12-31 19:00:00.000000000 -0500
  2421. +++ ns-2.29/wimax/destclassifier.cc 2006-09-22 17:27:47.000000000 -0400
  2422. @@ -0,0 +1,93 @@
  2423. +/* This software was developed at the National Institute of Standards and
  2424. + * Technology by employees of the Federal Government in the course of
  2425. + * their official duties. Pursuant to title 17 Section 105 of the United
  2426. + * States Code this software is not subject to copyright protection and
  2427. + * is in the public domain.
  2428. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2429. + * and makes no guarantees, expressed or implied, about its quality,
  2430. + * reliability, or any other characteristic.
  2431. + * <BR>
  2432. + * We would appreciate acknowledgement if the software is used.
  2433. + * <BR>
  2434. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2435. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2436. + * FROM THE USE OF THIS SOFTWARE.
  2437. + * </PRE></P>
  2438. + * @author  rouil
  2439. + */
  2440. +
  2441. +#include "destclassifier.h"
  2442. +#include "mac802_16.h"
  2443. +#include "scheduling/wimaxscheduler.h"
  2444. +  
  2445. +/**
  2446. + * TCL Hooks for the simulator for classifier
  2447. + */
  2448. +static class DestClassifierClass : public TclClass {
  2449. +public:
  2450. +  DestClassifierClass() : TclClass("SDUClassifier/Dest") {}
  2451. +  TclObject* create(int, const char*const*) {
  2452. +    return (new DestClassifier());
  2453. +    
  2454. +  }
  2455. +} class_destclassifier;
  2456. +
  2457. +/**
  2458. + * Create a classifier in the given mac
  2459. + * Constructor to be used by TCL
  2460. + */
  2461. +DestClassifier::DestClassifier (): SDUClassifier () {
  2462. +  
  2463. +}
  2464. +
  2465. +
  2466. +/**
  2467. + * Classify a packet and return the CID to use (or -1 if unknown)
  2468. + * @param p The packet to classify
  2469. + * @return The CID or -1
  2470. + */
  2471. +int DestClassifier::classify (Packet * p) 
  2472. +{
  2473. +  struct hdr_mac *dh = HDR_MAC(p);
  2474. +  int dst = dh->macDA();
  2475. +  mac_->debug ("At %f in Mac %d DestClassifier classifying packet for %d(size=%d, type=%s)n",
  2476. +        NOW, mac_->addr(), dst, HDR_CMN(p)->size(), packet_info.name(HDR_CMN(p)->ptype()));
  2477. +  //here we look at the list of peer nodes until we find the one with 
  2478. +  //the same destination address. Then we return its data communication
  2479. +
  2480. +  //if broadcast, then send to broadcast CID
  2481. +  if (dst == -1) {
  2482. +    if (mac_->getScheduler()->getNodeType ()==STA_BS)
  2483. +      return BROADCAST_CID;
  2484. +    else {
  2485. +      //I am a MN, check if I am connected
  2486. +      PeerNode *n = mac_->getPeerNode_head ();
  2487. +      //i should classify depending on the packet type.TBD
  2488. +      if (n && n->getSecondary())
  2489. + return n->getSecondary()->get_cid();
  2490. +    }
  2491. +  }
  2492. +  
  2493. +  for (PeerNode *n = mac_->getPeerNode_head (); n ; n=n->next_entry()) {
  2494. +    //printf ("Checking peer %d for %dn", n->getPeerNode(), dst);
  2495. +    if (dst == n->getPeerNode ()) {
  2496. +      switch (HDR_CMN(p)->ptype()) {
  2497. +      case PT_ARP:
  2498. +#ifdef USE_802_21
  2499. +      case PT_RRED:
  2500. +      case PT_RADS:
  2501. +      case PT_RSOL:
  2502. +#endif
  2503. + if (n->getSecondary())
  2504. +   return n->getSecondary()->get_cid();
  2505. + break;
  2506. +      default:
  2507. + if (n->getOutData())
  2508. +   return n->getOutData()->get_cid();
  2509. + else //this node is not ready to send data
  2510. +   break;
  2511. +      }
  2512. +    }
  2513. +  }
  2514. +  return -1;
  2515. +}
  2516. diff -Naur ns-2.29-org/wimax/destclassifier.h ns-2.29/wimax/destclassifier.h
  2517. --- ns-2.29-org/wimax/destclassifier.h 1969-12-31 19:00:00.000000000 -0500
  2518. +++ ns-2.29/wimax/destclassifier.h 2006-09-22 17:27:47.000000000 -0400
  2519. @@ -0,0 +1,60 @@
  2520. +/* This software was developed at the National Institute of Standards and
  2521. + * Technology by employees of the Federal Government in the course of
  2522. + * their official duties. Pursuant to title 17 Section 105 of the United
  2523. + * States Code this software is not subject to copyright protection and
  2524. + * is in the public domain.
  2525. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2526. + * and makes no guarantees, expressed or implied, about its quality,
  2527. + * reliability, or any other characteristic.
  2528. + * <BR>
  2529. + * We would appreciate acknowledgement if the software is used.
  2530. + * <BR>
  2531. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2532. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2533. + * FROM THE USE OF THIS SOFTWARE.
  2534. + * </PRE></P>
  2535. + * @author  rouil
  2536. + */
  2537. +
  2538. +#ifndef DESTCLASSIFIER_H
  2539. +#define DESTCLASSIFIER_H
  2540. +
  2541. +#include "sduclassifier.h"
  2542. +
  2543. +/**
  2544. + * This class classifies the packet based on the destination address
  2545. + */
  2546. +class DestClassifier : public SDUClassifier
  2547. +{
  2548. + public:
  2549. +
  2550. +  /**
  2551. +   * Create a classifier in the given mac
  2552. +   */
  2553. +  DestClassifier ();
  2554. +
  2555. +  /**
  2556. +   * Create a classifier in the given mac
  2557. +   * @param mac The mac where it is located
  2558. +   */
  2559. +  DestClassifier (Mac802_16 *mac);
  2560. +
  2561. +  /**
  2562. +   * Create a classifier in the given mac
  2563. +   * @param mac The mac where it is located
  2564. +   * @param priority The classifier's priority
  2565. +   */
  2566. +  DestClassifier (Mac802_16 *mac, int priority_);
  2567. +
  2568. +  /**
  2569. +   * Classify a packet and return the CID to use (or -1 if unknown)
  2570. +   * @param p The packet to classify
  2571. +   * @return The CID or -1
  2572. +   */
  2573. +  int classify (Packet * p);
  2574. +
  2575. + protected:
  2576. +
  2577. +};
  2578. +
  2579. +#endif
  2580. diff -Naur ns-2.29-org/wimax/mac802_16.cc ns-2.29/wimax/mac802_16.cc
  2581. --- ns-2.29-org/wimax/mac802_16.cc 1969-12-31 19:00:00.000000000 -0500
  2582. +++ ns-2.29/wimax/mac802_16.cc 2006-09-22 17:27:47.000000000 -0400
  2583. @@ -0,0 +1,1168 @@
  2584. +/* This software was developed at the National Institute of Standards and
  2585. + * Technology by employees of the Federal Government in the course of
  2586. + * their official duties. Pursuant to title 17 Section 105 of the United
  2587. + * States Code this software is not subject to copyright protection and
  2588. + * is in the public domain.
  2589. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2590. + * and makes no guarantees, expressed or implied, about its quality,
  2591. + * reliability, or any other characteristic.
  2592. + * <BR>
  2593. + * We would appreciate acknowledgement if the software is used.
  2594. + * <BR>
  2595. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2596. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2597. + * FROM THE USE OF THIS SOFTWARE.
  2598. + * </PRE></P>
  2599. + * @author  rouil
  2600. + */
  2601. +
  2602. +#include "mac802_16.h"
  2603. +#include "scheduling/wimaxscheduler.h"
  2604. +#include "scheduling/ssscheduler.h" //TBR
  2605. +//we use mac 802_11 for trace
  2606. +#include "mac-802_11.h"
  2607. +
  2608. +/* Defines frequencies for 3.5 GHz band and 7 Mhz freqency bandwidth */
  2609. +/* Will be removed when a dynamic way is added */
  2610. +static const int nbFreq = 5;
  2611. +static const double frequencies[] = { 3.486e+9, 3.493e+9, 3.5e+9, 3.507e+9, 3.514e+9};
  2612. +
  2613. +
  2614. +int hdr_mac802_16::offset_;
  2615. +/**
  2616. + * TCL Hooks for the simulator for wimax packets
  2617. + */
  2618. +static class Mac802_16HeaderClass : public PacketHeaderClass
  2619. +{
  2620. +public:
  2621. + Mac802_16HeaderClass() : PacketHeaderClass("PacketHeader/802_16",
  2622. +      sizeof(hdr_mac802_16))
  2623. + {
  2624. + bind_offset(&hdr_mac802_16::offset_);
  2625. + }
  2626. +} class_hdr_mac802_16;
  2627. +
  2628. +/**
  2629. + * TCL Hooks for the simulator for wimax mac
  2630. + */
  2631. +static class Mac802_16Class : public TclClass {
  2632. +public:
  2633. +  Mac802_16Class() : TclClass("Mac/802_16") {}
  2634. +  TclObject* create(int, const char*const*) {
  2635. +    return (new Mac802_16());
  2636. +    
  2637. +  }
  2638. +} class_mac802_16;
  2639. +
  2640. +Phy802_16MIB::Phy802_16MIB(Mac802_16 *parent)
  2641. +{
  2642. +  parent->bind ("channel_", &channel );
  2643. +  parent->bind ("fbandwidth_", &fbandwidth );
  2644. +  parent->bind ("ttg_", &ttg );
  2645. +  parent->bind ("rtg_", &rtg );
  2646. +}
  2647. +
  2648. +Mac802_16MIB::Mac802_16MIB(Mac802_16 *parent)
  2649. +{
  2650. +  parent->bind ("queue_length_", &queue_length );
  2651. +  parent->bind ("frame_duration_", &frame_duration );
  2652. +  parent->bind ("dcd_interval_", &dcd_interval );
  2653. +  parent->bind ("ucd_interval_", &ucd_interval );
  2654. +  parent->bind ("init_rng_interval_", &init_rng_interval );
  2655. +  parent->bind ("lost_dlmap_interval_", &lost_dlmap_interval );
  2656. +  parent->bind ("lost_ulmap_interval_", &lost_ulmap_interval );
  2657. +  parent->bind ("t1_timeout_", &t1_timeout );
  2658. +  parent->bind ("t2_timeout_", &t2_timeout );
  2659. +  parent->bind ("t3_timeout_", &t3_timeout );
  2660. +  parent->bind ("t6_timeout_", &t6_timeout );
  2661. +  parent->bind ("t12_timeout_", &t12_timeout );
  2662. +  parent->bind ("t16_timeout_", &t16_timeout );
  2663. +  parent->bind ("t17_timeout_", &t17_timeout );
  2664. +  parent->bind ("t21_timeout_", &t21_timeout );
  2665. +  parent->bind ("contention_rng_retry_", &contention_rng_retry );
  2666. +  parent->bind ("invited_rng_retry_", &invited_rng_retry );
  2667. +  parent->bind ("request_retry_", &request_retry );
  2668. +  parent->bind ("reg_req_retry_", &reg_req_retry );
  2669. +  parent->bind ("tproc_", &tproc );
  2670. +  parent->bind ("dsx_req_retry_", &dsx_req_retry );
  2671. +  parent->bind ("dsx_rsp_retry_", &dsx_rsp_retry );
  2672. +
  2673. +  parent->bind ("rng_backoff_start_", &rng_backoff_start);
  2674. +  parent->bind ("rng_backoff_stop_", &rng_backoff_stop);
  2675. +  parent->bind ("bw_backoff_start_", &bw_backoff_start);
  2676. +  parent->bind ("bw_backoff_stop_", &bw_backoff_stop);
  2677. +  //mobility extension
  2678. +  parent->bind ("scan_duration_", &scan_duration );
  2679. +  parent->bind ("interleaving_interval_", &interleaving );
  2680. +  parent->bind ("scan_iteration_", &scan_iteration );
  2681. +  parent->bind ("t44_timeout_", &t44_timeout );
  2682. +  parent->bind ("max_dir_scan_time_", &max_dir_scan_time );
  2683. +  parent->bind ("nbr_adv_interval_", &nbr_adv_interval );
  2684. +  parent->bind ("scan_req_retry_", &scan_req_retry );
  2685. +
  2686. +  parent->bind ("client_timeout_", &client_timeout );
  2687. +  parent->bind ("rxp_avg_alpha_", &rxp_avg_alpha);
  2688. +  parent->bind ("lgd_factor_", &lgd_factor_);
  2689. +}
  2690. +
  2691. +/**
  2692. + * Creates a Mac 802.16
  2693. + */
  2694. +Mac802_16::Mac802_16() : Mac (), macmib_(this), phymib_(this), rxTimer_(this)
  2695. +{
  2696. +  //init variable
  2697. +  LIST_INIT(&classifier_list_);
  2698. +  peer_list_ = (struct peerNode *) malloc (sizeof(struct peerNode));
  2699. +  LIST_INIT(peer_list_);
  2700. +  
  2701. +  collision_ = false;
  2702. +  pktRx_ = NULL;
  2703. +  pktBuf_ = NULL;
  2704. +
  2705. +  connectionManager_ = new ConnectionManager (this);
  2706. +  scheduler_ = NULL;
  2707. +  /* the following will be replaced by dynamic adding of service flow */
  2708. +  serviceFlowHandler_ = new ServiceFlowHandler ();
  2709. +  serviceFlowHandler_->setMac (this);
  2710. +  bs_id_ = BS_NOT_CONNECTED;
  2711. +  type_ = STA_UNKNOWN;
  2712. +  frame_number_ = 0;
  2713. +  state_ = MAC802_16_DISCONNECTED;
  2714. +  notify_upper_ = true;
  2715. +
  2716. +  last_tx_time_ = 0;
  2717. +  last_tx_duration_ = 0;
  2718. +
  2719. +  Tcl& tcl = Tcl::instance();
  2720. +  tcl.evalf ("Phy/WirelessPhy set RXThresh_");
  2721. +  macmib_.RXThreshold_ = atof (tcl.result());
  2722. +
  2723. +
  2724. +  /* Initialize Stats variables */
  2725. +  bind_bool ("print_stats_", &print_stats_);
  2726. +  last_tx_delay_ = 0;
  2727. +  double tmp;
  2728. +  bind ("delay_avg_alpha_", &tmp);
  2729. +  delay_watch_.set_alpha(tmp);
  2730. +  bind ("jitter_avg_alpha_", &tmp);
  2731. +  jitter_watch_.set_alpha(tmp);
  2732. +  bind ("loss_avg_alpha_", &tmp);
  2733. +  loss_watch_.set_alpha(tmp);
  2734. +  bind ("throughput_avg_alpha_", &tmp);
  2735. +  rx_data_watch_.set_alpha(tmp);
  2736. +  rx_data_watch_.set_pos_gradient (false);
  2737. +  rx_traffic_watch_.set_alpha(tmp);
  2738. +  rx_traffic_watch_.set_pos_gradient (false);
  2739. +  tx_data_watch_.set_alpha(tmp);
  2740. +  tx_data_watch_.set_pos_gradient (false);
  2741. +  tx_traffic_watch_.set_alpha(tmp);
  2742. +  tx_traffic_watch_.set_pos_gradient (false);
  2743. +  bind ("throughput_delay_", &tmp);
  2744. +  rx_data_watch_.set_delay (tmp);
  2745. +  rx_traffic_watch_.set_delay (tmp);
  2746. +  tx_data_watch_.set_delay (tmp);
  2747. +  tx_traffic_watch_.set_delay (tmp);
  2748. +  //timers for stats
  2749. +  rx_data_timer_ = new StatTimer (this, &rx_data_watch_);
  2750. +  rx_traffic_timer_ = new StatTimer (this, &rx_traffic_watch_);
  2751. +  tx_data_timer_ = new StatTimer (this, &tx_data_watch_);
  2752. +  tx_traffic_timer_ = new StatTimer (this, &tx_traffic_watch_);
  2753. +
  2754. +}
  2755. +
  2756. +/*
  2757. + * Interface with the TCL script
  2758. + * @param argc The number of parameter
  2759. + * @param argv The list of parameters
  2760. + */
  2761. +int Mac802_16::command(int argc, const char*const* argv)
  2762. +{
  2763. +  if (argc == 2) {
  2764. +    if (strcmp(argv[1], "dump-classifiers") == 0) {
  2765. +      for (SDUClassifier *n=classifier_list_.lh_first;n;n=n->next_entry()) {
  2766. + //printf ("Classifier %x priority=%dn", (int)n, n->getPriority());
  2767. +      }
  2768. +      return TCL_OK;
  2769. +    }
  2770. +  }
  2771. +  else if (argc == 3) {
  2772. +    /*
  2773. +    if (strcmp(argv[1], "set-bs") == 0) {
  2774. +      bs_id_ = atoi (argv[2]);
  2775. +    }
  2776. +    else*/
  2777. +    if (strcmp(argv[1], "add-classifier") == 0) {
  2778. +      SDUClassifier *clas = (SDUClassifier*) TclObject::lookup(argv[2]);
  2779. +      if (clas == 0)
  2780. + return TCL_ERROR;
  2781. +      //add classifier to the list
  2782. +      addClassifier (clas);
  2783. +      return TCL_OK;
  2784. +    } else if (strcmp(argv[1], "set-scheduler") == 0) {
  2785. +      scheduler_ = (WimaxScheduler*) TclObject::lookup(argv[2]);
  2786. +      if (scheduler_ == 0)
  2787. + return TCL_ERROR;
  2788. +      scheduler_->setMac (this); //register the mac
  2789. +      setStationType (scheduler_->getNodeType()); //get the node type (BS or MN)
  2790. +      return TCL_OK;
  2791. +    } else if (strcmp(argv[1], "set-servicehandler") == 0) {
  2792. +      serviceFlowHandler_ = (ServiceFlowHandler*) TclObject::lookup(argv[2]);
  2793. +      if (serviceFlowHandler_ == 0)
  2794. + return TCL_ERROR;
  2795. +      serviceFlowHandler_->setMac (this);
  2796. +      return TCL_OK;
  2797. +    } else if (strcmp(argv[1], "set-channel") == 0) {
  2798. +      assert (netif_); //to make sure we can update the phy
  2799. +      phymib_.channel = atoi (argv[2]);
  2800. +      double tmp = frequencies[phymib_.channel];
  2801. +      getPhy ()->setFrequency (tmp);
  2802. +      return TCL_OK;
  2803. +    }
  2804. +  }
  2805. +  return Mac::command(argc, argv);
  2806. +}
  2807. +
  2808. +/**
  2809. + * Set the type of STA. This will be called when adding the scheduler
  2810. + * It is used to create the default connections
  2811. + * @param type The station type
  2812. + */
  2813. +void Mac802_16::setStationType (station_type_t type)
  2814. +{
  2815. +  assert (type_ == STA_UNKNOWN && type != STA_UNKNOWN);
  2816. +  type_ = type;
  2817. +
  2818. +  init_default_connections ();
  2819. +}
  2820. +
  2821. +/**
  2822. + * Initialize default connections
  2823. + */
  2824. +void Mac802_16::init_default_connections ()
  2825. +{
  2826. +  Connection * con;
  2827. +
  2828. +  //create initial ranging and padding connection
  2829. +  con = new Connection (CONN_INIT_RANGING);
  2830. +  connectionManager_->add_connection (con, true); //uplink
  2831. +  con = new Connection (CONN_INIT_RANGING);
  2832. +  connectionManager_->add_connection (con, false); //downlink
  2833. +  con = new Connection (CONN_PADDING);
  2834. +  connectionManager_->add_connection (con, true);
  2835. +  con = new Connection (CONN_PADDING);
  2836. +  connectionManager_->add_connection (con, false);
  2837. +
  2838. +  if (type_ == STA_BS) {
  2839. +    //the BS is always connected
  2840. +    setMacState (MAC802_16_CONNECTED);
  2841. +    //we need to create a Broadcast connection and AAS init ranging CIDs
  2842. +    con = new Connection (CONN_BROADCAST);
  2843. +    connectionManager_->add_connection (con, false);
  2844. +    con = new Connection (CONN_AAS_INIT_RANGING);
  2845. +    connectionManager_->add_connection (con, true);
  2846. +  } else if (type_ == STA_MN) {
  2847. +    //create connection to receive broadcast packets from BS
  2848. +    con = new Connection (CONN_BROADCAST);
  2849. +    connectionManager_->add_connection (con, false);
  2850. +  }
  2851. +}
  2852. +
  2853. +/**
  2854. + * Return the peer node that has the given address
  2855. + * @param index The address of the peer
  2856. + * @return The peer node that has the given address
  2857. + */
  2858. +PeerNode* Mac802_16::getPeerNode (int index)
  2859. +{
  2860. +  for (PeerNode *p=peer_list_->lh_first;p;p=p->next_entry()) {
  2861. +    if (p->getPeerNode ()==index)
  2862. +      return p;
  2863. +  }
  2864. +  return NULL;
  2865. +}
  2866. +
  2867. +/**
  2868. + * Add the peer node
  2869. + * @param The peer node to add
  2870. + */
  2871. +void Mac802_16::addPeerNode (PeerNode *node)
  2872. +{
  2873. +  node->insert_entry (peer_list_);
  2874. +  //update Rx time so for default value
  2875. +  node->setRxTime(NOW);
  2876. +  node->getStatWatch()->set_alpha(macmib_.rxp_avg_alpha);
  2877. +}
  2878. +
  2879. +/**
  2880. + * Remove the peer node
  2881. + * @param The peer node to remove
  2882. + */
  2883. +void Mac802_16::removePeerNode (PeerNode *peer)
  2884. +{
  2885. +  if (peer->getBasic()) {
  2886. +    getCManager()->remove_connection (peer->getBasic()->get_cid());
  2887. +    delete (peer->getBasic());
  2888. +  }
  2889. +  if (peer->getPrimary()) {
  2890. +    getCManager()->remove_connection (peer->getPrimary()->get_cid());
  2891. +    delete (peer->getPrimary());
  2892. +  }
  2893. +  if (peer->getSecondary()) {
  2894. +    getCManager()->remove_connection (peer->getSecondary()->get_cid());
  2895. +    delete (peer->getSecondary());
  2896. +  }
  2897. +  if (peer->getInData()) {
  2898. +    getCManager()->remove_connection (peer->getInData()->get_cid());
  2899. +    delete (peer->getInData());
  2900. +  }
  2901. +  if (peer->getOutData()) {
  2902. +    getCManager()->remove_connection (peer->getOutData()->get_cid());
  2903. +    delete (peer->getOutData());
  2904. +  }
  2905. +  peer->remove_entry ();
  2906. +  delete (peer);
  2907. +}
  2908. +
  2909. +/**
  2910. + * Set the mac state
  2911. + * @param state The new mac state
  2912. + */  
  2913. +void Mac802_16::setMacState (Mac802_16State state)
  2914. +{
  2915. +  state_ = state;
  2916. +}
  2917. +
  2918. +/**
  2919. + * Return the mac state
  2920. + * @return The new mac state
  2921. + */  
  2922. +Mac802_16State Mac802_16::getMacState ()
  2923. +{
  2924. +  return state_;
  2925. +}
  2926. +
  2927. +/**
  2928. + * Return the PHY layer
  2929. + * @return The PHY layer
  2930. + */
  2931. +OFDMPhy* Mac802_16::getPhy () { 
  2932. +  return (OFDMPhy*) netif_;
  2933. +}
  2934. +
  2935. +/**
  2936. + * Change the channel
  2937. + * @param channel The new channel
  2938. + */
  2939. +void Mac802_16::setChannel (int channel)
  2940. +{
  2941. +  assert (channel < nbFreq);
  2942. +  phymib_.channel = channel;
  2943. +  double tmp = frequencies[phymib_.channel];
  2944. +  getPhy ()->setFrequency (tmp);
  2945. +}
  2946. +
  2947. +/**
  2948. + * Return the channel number for the given frequency
  2949. + * @param freq The frequency
  2950. + * @return The channel number of -1 if the frequency does not match
  2951. + */
  2952. +int Mac802_16::getChannel (double freq)
  2953. +{
  2954. +  for (int i = 0 ; i < nbFreq ; i++) {
  2955. +    if (frequencies[i]==freq)
  2956. +      return i;
  2957. +  }
  2958. +  return -1;
  2959. +}
  2960. +
  2961. +/**
  2962. + * Return the channel index
  2963. + * @return The channel
  2964. + */
  2965. +int Mac802_16::getChannel ()
  2966. +{
  2967. +  return phymib_.channel;
  2968. +}
  2969. +
  2970. +/**
  2971. + * Set the channel to the next from the list
  2972. + * Used at initialisation and when loosing signal
  2973. + */
  2974. +void Mac802_16::nextChannel ()
  2975. +{
  2976. +  debug ("At %f in Mac %d Going to channel %dn", NOW, index_, (phymib_.channel+1)%nbFreq);
  2977. +  setChannel ((phymib_.channel+1)%nbFreq);
  2978. +}
  2979. +
  2980. +/**
  2981. + * Add a flow
  2982. + * @param qos The QoS required
  2983. + * @param handler The entity that requires to add a flow
  2984. + */
  2985. +void Mac802_16::addFlow (ServiceFlowQoS * qos, void * handler) 
  2986. +{
  2987. +
  2988. +}
  2989. +
  2990. +/**
  2991. + * Backup the state of the Mac
  2992. + */
  2993. +state_info* Mac802_16::backup_state ()
  2994. +{
  2995. +  state_info *backup_state = (state_info*) malloc (sizeof (state_info));
  2996. +  backup_state->bs_id = bs_id_;
  2997. +  backup_state->state = state_;
  2998. +  backup_state->frameduration = getFrameDuration();
  2999. +  backup_state->frame_number = frame_number_;
  3000. +  backup_state->channel = getChannel();
  3001. +  backup_state->connectionManager = connectionManager_;
  3002. +  connectionManager_ = new ConnectionManager (this);
  3003. +  init_default_connections ();
  3004. +  backup_state->serviceFlowHandler = serviceFlowHandler_;
  3005. +  serviceFlowHandler_ = new ServiceFlowHandler();
  3006. +  backup_state->peer_list = peer_list_;
  3007. +  peer_list_ = (struct peerNode *) malloc (sizeof(struct peerNode));
  3008. +  LIST_INIT(peer_list_);
  3009. +  return backup_state;
  3010. +}
  3011. +
  3012. +/**
  3013. + * Restore the state of the Mac
  3014. + */
  3015. +void Mac802_16::restore_state (state_info *backup_state)
  3016. +{
  3017. +  bs_id_ = backup_state->bs_id;
  3018. +  state_ = backup_state->state;
  3019. +  setFrameDuration(backup_state->frameduration);
  3020. +  frame_number_ = backup_state->frame_number;
  3021. +  setChannel (backup_state->channel);
  3022. +  delete (connectionManager_);
  3023. +  connectionManager_ = backup_state->connectionManager;
  3024. +  delete (serviceFlowHandler_);
  3025. +  serviceFlowHandler_ = backup_state->serviceFlowHandler;
  3026. +  while (getPeerNode_head()!=NULL) {
  3027. +    removePeerNode (getPeerNode_head());
  3028. +  }
  3029. +  peer_list_ = backup_state->peer_list;
  3030. +}
  3031. +  
  3032. +/**
  3033. + * Set the variable used to find out if upper layers
  3034. + * must be notified to send packets. During scanning we
  3035. + * do not want upper layers to send packet to the mac.
  3036. + */
  3037. +void Mac802_16::setNotify_upper (bool notify) { 
  3038. +  notify_upper_ = notify; 
  3039. +  if (notify_upper_ && pktBuf_) {
  3040. +    sendDown (pktBuf_);
  3041. +    pktBuf_ = NULL;
  3042. +  }
  3043. +}
  3044. +
  3045. +/**** Packet processing methods ****/
  3046. +
  3047. +/*
  3048. + * Process packets going out
  3049. + * @param p The packet to send out
  3050. + */
  3051. +void Mac802_16::sendDown(Packet *p)
  3052. +{
  3053. +  //We first send it through the CS
  3054. +  int cid = -1;
  3055. +
  3056. +  if (!notify_upper_) {
  3057. +    assert (!pktBuf_);
  3058. +    pktBuf_ = p;
  3059. +    return;
  3060. +  } 
  3061. +
  3062. +  for (SDUClassifier *n=classifier_list_.lh_first; n && cid==-1; n=n->next_entry()) {
  3063. +    cid = n->classify (p);
  3064. +  }
  3065. +
  3066. +  if (cid == -1) {
  3067. +    debug ("At %f in Mac %d drop packet because no classification were foundn", 
  3068. +     NOW, index_);
  3069. +    drop(p, "CID");
  3070. +    //Packet::free (p);
  3071. +  } else {
  3072. +    //enqueue the packet 
  3073. +    Connection *connection = connectionManager_->get_connection (cid, type_ == STA_MN);
  3074. +    if (connection == NULL) {
  3075. +      debug ("Warning: At %f in Mac %d connection with cid = %d does not exist. Please check classifiersn",
  3076. +       NOW, index_, cid);
  3077. +      //Packet::free (p);
  3078. +      update_watch (&loss_watch_, 1);
  3079. +      drop(p, "CID");
  3080. +    }
  3081. +    else {
  3082. +      if (connection->queueLength ()==macmib_.queue_length) {
  3083. + //queue full 
  3084. + update_watch (&loss_watch_, 1);
  3085. + drop (p, "QWI");
  3086. +      } else {
  3087. + //update mac header information
  3088. + //set header information
  3089. + hdr_mac802_16 *wimaxHdr = HDR_MAC802_16(p);
  3090. + wimaxHdr->header.ht = 0;
  3091. + wimaxHdr->header.ec = 1;
  3092. + wimaxHdr->header.type = 0; //no subheader
  3093. + wimaxHdr->header.ci = 0;
  3094. + wimaxHdr->header.eks = 0;
  3095. + wimaxHdr->header.cid = cid; //default
  3096. + wimaxHdr->header.hcs = 0;
  3097. + HDR_CMN(p)->size() += HDR_MAC802_16_SIZE;
  3098. + HDR_CMN(p)->timestamp() = NOW; //set timestamp for delay
  3099. + connection ->enqueue (p);
  3100. + //printf ("At %f in Mac %d Enqueue packet to cid=%d queue size=%d(max=%d)n", NOW, index_, cid,connection->queueLength (), macmib_.queue_length);
  3101. +      }
  3102. +    }
  3103. +  }
  3104. +
  3105. +  //inform upper layer that it can send another packet
  3106. +  //if (notify_upper_) 
  3107. +  resume (NULL);  
  3108. +}
  3109. +
  3110. +/*
  3111. + * Transmit a packet to the physical layer
  3112. + * @param p The packet to send out
  3113. + */
  3114. +void Mac802_16::transmit(Packet *p)
  3115. +{
  3116. +  if (NOW < last_tx_time_+last_tx_duration_) {
  3117. +    //still sending
  3118. +    //printf ("MAC is already transmitting. Drop packet.n");
  3119. +    Packet::free (p);
  3120. +    return;
  3121. +  }
  3122. +
  3123. +  struct hdr_cmn *ch = HDR_CMN(p);
  3124. +  /*
  3125. +  debug ("At %f in Mac %d sending packet (type=%s, size=%d) ", NOW, index_, packet_info.name(ch->ptype()), ch->size());
  3126. +  if (ch->ptype()==PT_MAC) {
  3127. +    if (HDR_MAC802_16(p)->header.ht == 0)
  3128. +      debug ("mngt=%dn", ((mac802_16_dl_map_frame*) p->accessdata())->type);
  3129. +    else
  3130. +      debug ("bwreqn");
  3131. +  } else {
  3132. +    debug ("n");
  3133. +  }
  3134. +  */
  3135. +  //update stats for delay and jitter
  3136. +  double delay = NOW-ch->timestamp();
  3137. +  update_watch (&delay_watch_, delay);
  3138. +  double jitter = fabs (delay - last_tx_delay_);
  3139. +  update_watch (&jitter_watch_, jitter);
  3140. +  last_tx_delay_ = delay;
  3141. +  if (ch->ptype()!=PT_MAC) {
  3142. +    update_throughput (&tx_data_watch_, 8*ch->size());
  3143. +  } 
  3144. +  update_throughput (&tx_traffic_watch_, 8*ch->size());
  3145. +  
  3146. +  last_tx_time_ = NOW;
  3147. +  last_tx_duration_ = ch->txtime();
  3148. +  downtarget_->recv (p, (Handler*)NULL);
  3149. +}
  3150. +
  3151. +/*
  3152. + * Process incoming packets
  3153. + * @param p The incoming packet
  3154. + */
  3155. +void Mac802_16::sendUp (Packet *p)
  3156. +{
  3157. +  struct hdr_cmn *ch = HDR_CMN(p);
  3158. +
  3159. +#ifdef DEBUG_WIMAX
  3160. +  debug ("At %f in Mac %d receive first bit..over at %f(txtime=%f) (type=%s) ", NOW, index_, NOW+ch->txtime(),ch->txtime(), packet_info.name(ch->ptype()));
  3161. +  if (ch->ptype()==PT_MAC) {
  3162. +    if (HDR_MAC802_16(p)->header.ht == 0)
  3163. +      debug ("mngt=%dn", ((mac802_16_dl_map_frame*) p->accessdata())->type);
  3164. +    else
  3165. +      debug ("bwreqn");
  3166. +  } else {
  3167. +    debug ("n");
  3168. +  }
  3169. +#endif
  3170. +
  3171. +  if (pktRx_ !=NULL) {
  3172. +    /*
  3173. +     *  If the power of the incoming packet is smaller than the
  3174. +     *  power of the packet currently being received by at least
  3175. +     *  the capture threshold, then we ignore the new packet.
  3176. +     */
  3177. +    if(pktRx_->txinfo_.RxPr / p->txinfo_.RxPr >= p->txinfo_.CPThresh) {
  3178. +      Packet::free(p);
  3179. +    } else {
  3180. +      /*
  3181. +       *  Since a collision has occurred, figure out
  3182. +       *  which packet that caused the collision will
  3183. +       *  "last" the longest.  Make this packet,
  3184. +       *  pktRx_ and reset the Recv Timer if necessary.
  3185. +       */
  3186. +      if(txtime(p) > rxTimer_.expire()) {
  3187. + rxTimer_.stop();
  3188. + //printf ("t drop pktRx..collisionn");
  3189. + drop(pktRx_, "COL");
  3190. + update_watch (&loss_watch_, 1);
  3191. + pktRx_ = p;
  3192. + //mark the packet with error
  3193. + ch->error() = 1;
  3194. + collision_ = true;
  3195. + rxTimer_.start(ch->txtime()-0.000000001);
  3196. +      }
  3197. +      else {
  3198. + //printf ("t drop new packet..collisionn");
  3199. + drop(p, "COL");
  3200. + //mark the packet with error
  3201. + HDR_CMN(pktRx_)->error() = 1;
  3202. + collision_ = true;
  3203. +      }
  3204. +    }
  3205. +    return;
  3206. +  }
  3207. +  assert (pktRx_==NULL);
  3208. +  assert (rxTimer_.busy()==0);
  3209. +  pktRx_ = p;
  3210. +  //create a timer to wait for the end of reception
  3211. +  //since the packets are received by burst, the beginning of the new packet 
  3212. +  //is the same time as the end of this packet..we process this packet 1ns 
  3213. +  //earlier to make room for the new packet.
  3214. +  rxTimer_.start(ch->txtime()-0.000000001);
  3215. +}
  3216. +
  3217. +/**
  3218. + * Process the fully received packet
  3219. + */
  3220. +void Mac802_16::receive ()
  3221. +{
  3222. +  assert (pktRx_);
  3223. +  struct hdr_cmn *ch = HDR_CMN(pktRx_);
  3224. +
  3225. +#ifdef DEBUG_WIMAX
  3226. +  printf ("At %f in Mac %d packet received (type=%s) ", NOW, index_, packet_info.name(ch->ptype()));
  3227. +  if (ch->ptype()==PT_MAC) {
  3228. +    if (HDR_MAC802_16(pktRx_)->header.ht == 0)
  3229. +      printf ("mngt=%dn", ((mac802_16_dl_map_frame*) pktRx_->accessdata())->type);
  3230. +    else
  3231. +      printf ("bwreqn");
  3232. +  } else {
  3233. +    printf ("n");
  3234. +  }
  3235. +#endif
  3236. +    
  3237. +
  3238. +  //drop the packet if corrupted
  3239. +  if (ch->error()) {
  3240. +    if (collision_) {
  3241. +      //printf ("t drop new pktRx..collisionn");
  3242. +      drop (pktRx_, "COL");
  3243. +      collision_ = false;
  3244. +    } else {
  3245. +      //error in the packet, the Mac does not process
  3246. +      Packet::free(pktRx_);
  3247. +    }
  3248. +    //update drop stat
  3249. +    update_watch (&loss_watch_, 1);
  3250. +    pktRx_ = NULL;
  3251. +    return;
  3252. +  }
  3253. +
  3254. +  //process packet
  3255. +  hdr_mac802_16 *wimaxHdr = HDR_MAC802_16(pktRx_);
  3256. +  gen_mac_header_t header = wimaxHdr->header;
  3257. +  int cid = header.cid;
  3258. +  Connection *con = connectionManager_->get_connection (cid, type_==STA_BS);
  3259. +  mac802_16_dl_map_frame *frame;
  3260. +
  3261. +  if (con == NULL) {
  3262. +    //This packet is not for us
  3263. +    //printf ("At %f in Mac %d Connection nulln", NOW, index_);
  3264. +    update_watch (&loss_watch_, 1);
  3265. +    Packet::free(pktRx_);
  3266. +    pktRx_=NULL;
  3267. +    return;
  3268. +  }
  3269. +  //printf ("CID=%dn", cid);
  3270. +
  3271. +  //update rx time of last packet received
  3272. +  PeerNode *peer;
  3273. +  if (type_ == STA_MN)
  3274. +    peer = getPeerNode_head(); //MN only has one peer
  3275. +  else
  3276. +    peer = con->getPeerNode(); //BS can have multiple peers
  3277. +
  3278. +  if (peer) {
  3279. +    peer->setRxTime (NOW);
  3280. +    
  3281. +    //collect receive signal strength stats
  3282. +    peer->getStatWatch()->update(10*log10(pktRx_->txinfo_.RxPr*1e3));
  3283. +    //debug ("At %f in Mac %d weighted RXThresh: %e rxp average %en", NOW, index_, macmib_.lgd_factor_*macmib_.RXThreshold_, pow(10,peer->getStatWatch()->average()/10)/1e3);
  3284. +    double avg_w = pow(10,(peer->getStatWatch()->average()/10))/1e3;
  3285. +    
  3286. +    if ( avg_w < (macmib_.lgd_factor_*macmib_.RXThreshold_)) {
  3287. +      if (!peer->isGoingDown () && type_ == STA_MN && state_==MAC802_16_CONNECTED) {
  3288. + ((SSscheduler*) scheduler_)->send_scan_request ();
  3289. +      }
  3290. +      peer->setGoingDown (true);
  3291. +      debug ("At %f Mac %d link going down triggern", NOW, index_);
  3292. +#ifdef USE_802_21
  3293. +      double probability = 1;
  3294. +      if(type_ == STA_MN) {
  3295. + Mac::send_link_going_down (addr(), getPeerNode_head()->getPeerNode(), -1, (int)(100*probability), eventId_++);
  3296. +      } else {
  3297. + Mac::send_link_going_down (peer->getPeerNode(), addr(), -1, (int)(100*probability), eventId_++);
  3298. +      }
  3299. +#endif
  3300. +    }
  3301. +    else {
  3302. +      if (peer->isGoingDown()) {
  3303. +#ifdef USE_802_21
  3304. + Mac::send_link_rollback (addr(), eventId_-1);
  3305. +#endif
  3306. + peer->setGoingDown (false);
  3307. +      }
  3308. +    }
  3309. +  }
  3310. +  
  3311. +  //process reassembly
  3312. +  if (wimaxHdr->frag_subheader) {
  3313. +    bool drop_pkt = true;
  3314. +    //printf ("Frag type = %dn",wimaxHdr->fc & 0x3);
  3315. +    switch (wimaxHdr->fc & 0x3) {
  3316. +    case FRAG_NOFRAG: 
  3317. +      if (con->getFragmentationStatus()!=FRAG_NOFRAG)
  3318. + con->updateFragmentation (FRAG_NOFRAG, 0, 0); //reset
  3319. +      drop_pkt = false;
  3320. +      break; 
  3321. +    case FRAG_FIRST: 
  3322. +      //when it is the first fragment, it does not matter if we previously
  3323. +      //received other fragments, since we reset the information
  3324. +      assert (wimaxHdr->fsn == 0);
  3325. +      //printf ("tReceived first fragmentn");
  3326. +      con->updateFragmentation (FRAG_FIRST, 0, ch->size()-(HDR_MAC802_16_SIZE+HDR_MAC802_16_FRAGSUB_SIZE));
  3327. +      break; 
  3328. +    case FRAG_CONT: 
  3329. +      if ( (con->getFragmentationStatus()!=FRAG_FIRST
  3330. +     && con->getFragmentationStatus()!=FRAG_CONT)
  3331. +    || ((wimaxHdr->fsn&0x7) != (con->getFragmentNumber ()+1)%8) ) {
  3332. + con->updateFragmentation (FRAG_NOFRAG, 0, 0); //reset
  3333. +      } else {
  3334. + //printf ("tReceived cont fragmentn");
  3335. + con->updateFragmentation (FRAG_CONT, wimaxHdr->fsn&0x7, con->getFragmentBytes()+ch->size()-(HDR_MAC802_16_SIZE+HDR_MAC802_16_FRAGSUB_SIZE));
  3336. +      }
  3337. +      break; 
  3338. +    case FRAG_LAST: 
  3339. +      if ( (con->getFragmentationStatus()==FRAG_FIRST
  3340. +     || con->getFragmentationStatus()==FRAG_CONT)
  3341. +    && ((wimaxHdr->fsn&0x7) == (con->getFragmentNumber ()+1)%8) ) {
  3342. + //printf ("tReceived last fragmentn");
  3343. + ch->size() += con->getFragmentBytes()-HDR_MAC802_16_FRAGSUB_SIZE;
  3344. + drop_pkt = false;
  3345. +      } else {
  3346. + //printf ("Error with last frag seq=%d (expected=%d)n", wimaxHdr->fsn&0x7, (con->getFragmentNumber ()+1)%8);
  3347. +      }     
  3348. +      con->updateFragmentation (FRAG_NOFRAG, 0, 0); //reset
  3349. +      break; 
  3350. +    default:
  3351. +      fprintf (stderr,"Error, unknown fragmentation typen");
  3352. +      exit (-1);
  3353. +    }
  3354. +    //if we got an error, or it is a fragment that is not the last, free the packet
  3355. +    if (drop_pkt) {
  3356. +      //update drop stat
  3357. +      update_watch (&loss_watch_, 1);
  3358. +      Packet::free(pktRx_);
  3359. +      pktRx_=NULL;
  3360. +      return;
  3361. +    } 
  3362. +  }
  3363. +
  3364. +  switch (con->getType()) {
  3365. +  case CONN_INIT_RANGING:
  3366. +    scheduler_->process (pktRx_);
  3367. +    break;
  3368. +  case CONN_AAS_INIT_RANGING:
  3369. +    break;
  3370. +  case CONN_MULTICAST_POLLING: 
  3371. +    break;
  3372. +  case CONN_PADDING:
  3373. +    //padding is sent by a SS that does not have data
  3374. +    //to send is required to send a signal.
  3375. +    //TBD: Find the SS that sent the padding
  3376. +    scheduler_->process (pktRx_);
  3377. +    break; 
  3378. +  case CONN_BROADCAST:
  3379. +    if (HDR_CMN(pktRx_)->ptype()==PT_MAC)
  3380. +      scheduler_->process (pktRx_);
  3381. +    else {
  3382. +      //Richard: only send to upper layer if connected
  3383. +      if (state_ == MAC802_16_CONNECTED)
  3384. + goto send_upper;
  3385. +      else {
  3386. + //update drop stat, could be used to detect deconnection
  3387. + update_watch (&loss_watch_, 1);
  3388. + Packet::free(pktRx_);
  3389. + pktRx_=NULL;
  3390. + return;
  3391. +      }
  3392. +    }
  3393. +    break; 
  3394. +  case CONN_BASIC:
  3395. +    scheduler_->process (pktRx_);
  3396. +    break; 
  3397. +  case CONN_PRIMARY:
  3398. +    assert (HDR_CMN(pktRx_)->ptype()==PT_MAC);
  3399. +    //we cast to this frame because all management frame start with a type
  3400. +    if (wimaxHdr->header.ht==1) {
  3401. +      //bw request
  3402. +      scheduler_->process (pktRx_);
  3403. +    } else {
  3404. +      frame = (mac802_16_dl_map_frame*) pktRx_->accessdata();
  3405. +      switch (frame->type) {
  3406. +      case MAC_DSA_REQ: 
  3407. +      case MAC_DSA_RSP: 
  3408. +      case MAC_DSA_ACK: 
  3409. + serviceFlowHandler_->process (pktRx_);
  3410. + break;
  3411. +      default:
  3412. + scheduler_->process (pktRx_);
  3413. +      }
  3414. +    }
  3415. +    break;   
  3416. +  case CONN_SECONDARY:
  3417. +    //fall through
  3418. +  case CONN_DATA:
  3419. +    //send to upper layer
  3420. +    goto send_upper;
  3421. +    break; 
  3422. +  default:
  3423. +    fprintf (stderr,"Error: unknown connection typen");
  3424. +    exit (0);
  3425. +  }
  3426. +  goto sent_mac; //default jump
  3427. +
  3428. + send_upper:
  3429. +  update_throughput (&rx_data_watch_, 8*ch->size());    
  3430. +  update_throughput (&rx_traffic_watch_, 8*ch->size());
  3431. +  ch->size() -= HDR_MAC802_16_SIZE;
  3432. +  uptarget_->recv(pktRx_, (Handler*) 0);
  3433. +  goto done;
  3434. +
  3435. + sent_mac:
  3436. +  update_throughput (&rx_traffic_watch_, 8*ch->size());
  3437. +  //fall through
  3438. +
  3439. +  //should not free it here because we don't know if other modules
  3440. +  //kept a copy of it.
  3441. +  //Packet::free(pktRx_);
  3442. +  //update Rx stat
  3443. + done:
  3444. +  update_watch (&loss_watch_, 0);
  3445. +  pktRx_=NULL;
  3446. +}
  3447. +
  3448. +/**** Helper methods ****/
  3449. +
  3450. +/**
  3451. + * Return the frame number
  3452. + * @return the frame number
  3453. + */
  3454. +int Mac802_16::getFrameNumber () {
  3455. +  return frame_number_;
  3456. +}
  3457. +
  3458. +/*
  3459. + * Return the code for the frame duration
  3460. + * @return the code for the frame duration
  3461. + */
  3462. +int Mac802_16::getFrameDurationCode () {
  3463. +  if (macmib_.frame_duration == 0.0025)
  3464. +    return 0;
  3465. +  else if (macmib_.frame_duration == 0.004)
  3466. +    return 1;
  3467. +  else if (macmib_.frame_duration == 0.005)
  3468. +    return 2;
  3469. +  else if (macmib_.frame_duration == 0.008)
  3470. +    return 3;
  3471. +  else if (macmib_.frame_duration == 0.01)
  3472. +    return 4;
  3473. +  else if (macmib_.frame_duration == 0.0125)
  3474. +    return 5;
  3475. +  else if (macmib_.frame_duration == 0.02)
  3476. +    return 6;
  3477. +  else {
  3478. +    fprintf (stderr, "Invalid frame duration %fn", macmib_.frame_duration);
  3479. +    exit (1);
  3480. +  }
  3481. +}
  3482. +
  3483. +/*
  3484. + * Set the frame duration using code
  3485. + * @param code The frame duration code
  3486. + */
  3487. +void Mac802_16::setFrameDurationCode (int code) 
  3488. +{
  3489. +  switch (code) {
  3490. +  case 0:
  3491. +    macmib_.frame_duration = 0.0025;
  3492. +    break;
  3493. +  case 1:
  3494. +    macmib_.frame_duration = 0.004;
  3495. +    break;
  3496. +  case 2:
  3497. +    macmib_.frame_duration = 0.005;
  3498. +    break;
  3499. +  case 3:
  3500. +    macmib_.frame_duration = 0.008;
  3501. +    break;
  3502. +  case 4:
  3503. +    macmib_.frame_duration = 0.01;
  3504. +    break;
  3505. +  case 5:
  3506. +    macmib_.frame_duration = 0.0125;
  3507. +    break;
  3508. +  case 6:
  3509. +    macmib_.frame_duration = 0.02;
  3510. +    break;
  3511. +  default:
  3512. +  fprintf (stderr, "Invalid frame duration code %dn", code);
  3513. +    exit (1);
  3514. +  }
  3515. +}
  3516. +
  3517. +
  3518. +/**
  3519. + * Return a packet 
  3520. + * @return a new packet
  3521. + */
  3522. +Packet *Mac802_16::getPacket ()
  3523. +{
  3524. +  Packet *p = Packet::alloc ();
  3525. +  
  3526. +  hdr_mac802_16 *wimaxHdr= HDR_MAC802_16(p);
  3527. +
  3528. +  //set header information
  3529. +  wimaxHdr->header.ht = 0;
  3530. +  wimaxHdr->header.ec = 1;
  3531. +  wimaxHdr->header.type = 0; //no subheader
  3532. +  wimaxHdr->header.ci = 0;
  3533. +  wimaxHdr->header.eks = 0;
  3534. +  wimaxHdr->header.cid = BROADCAST_CID; //default
  3535. +  wimaxHdr->header.hcs = 0;
  3536. +  HDR_CMN(p)->ptype() = PT_MAC;
  3537. +
  3538. +  HDR_CMN(p)->size() = HDR_MAC802_16_SIZE;
  3539. +
  3540. +  return p;
  3541. +}
  3542. +
  3543. +/**** Internal methods ****/
  3544. +
  3545. +
  3546. +/*
  3547. + * Add a classifier
  3548. + * @param clas The classifier to add
  3549. + */
  3550. +void Mac802_16::addClassifier (SDUClassifier *clas) 
  3551. +{
  3552. +  SDUClassifier *n=classifier_list_.lh_first;
  3553. +  SDUClassifier *prev=NULL;
  3554. +  int i = 0;
  3555. +  if (!n || (n->getPriority () >= clas->getPriority ())) {
  3556. +    //the first element
  3557. +    //debug ("Add first classifiern");
  3558. +    clas->insert_entry_head (&classifier_list_);
  3559. +  } else {
  3560. +    while ( n && (n->getPriority () < clas->getPriority ()) ) {
  3561. +      prev=n;
  3562. +      n=n->next_entry();
  3563. +      i++;
  3564. +    }
  3565. +    //debug ("insert entry at position %dn", i);
  3566. +    clas->insert_entry (prev);
  3567. +  }
  3568. +  //Register this mac with the classifier
  3569. +  clas->setMac (this);
  3570. +}
  3571. +
  3572. +#ifdef USE_802_21
  3573. +
  3574. +/* 
  3575. + * Configure/Request configuration
  3576. + * The upper layer sends a config object with the required 
  3577. + * new values for the parameters (or PARAMETER_UNKNOWN_VALUE).
  3578. + * The MAC tries to set the values and return the new setting.
  3579. + * For examples if a MAC does not support a parameter it will
  3580. + * return  PARAMETER_UNKNOWN_VALUE
  3581. + * @param config The configuration object
  3582. + */ 
  3583. +void Mac802_16::link_configure (link_parameter_config_t* config)
  3584. +{
  3585. + assert (config);
  3586. + config->bandwidth = 15000000; //TBD use phy (but depend on modulation)
  3587. + config->type = LINK_802_16;
  3588. + //we set the rest to PARAMETER_UNKNOWN_VALUE
  3589. + config->ber = PARAMETER_UNKNOWN_VALUE;
  3590. + config->delay = PARAMETER_UNKNOWN_VALUE;
  3591. + config->macPoA = PARAMETER_UNKNOWN_VALUE;
  3592. +}
  3593. +
  3594. +/*
  3595. + * Disconnect from the PoA
  3596. + */
  3597. +void Mac802_16::link_disconnect ()
  3598. +{
  3599. +  if (type_ == STA_MN) {
  3600. +    //force losing synchronization
  3601. +    ((SSscheduler*) scheduler_)->lost_synch ();
  3602. +    getPhy()->node_off();
  3603. +  }
  3604. +}
  3605. +
  3606. +/*
  3607. + * Connect to the PoA
  3608. + */
  3609. +void Mac802_16::link_connect (int poa)
  3610. +{
  3611. +  if (type_ == STA_MN) {
  3612. +    getPhy()->node_on();
  3613. +  }
  3614. +}
  3615. +
  3616. +/* 
  3617. + * Configure the threshold values for the given parameters
  3618. + * @param numLinkParameter number of parameter configured
  3619. + * @param linkThresholds list of parameters and thresholds
  3620. + */
  3621. +struct link_param_th_status * Mac802_16::link_configure_thresholds (int numLinkParameter, struct link_param_th *linkThresholds)
  3622. +{
  3623. +  struct link_param_th_status *result = (struct link_param_th_status *) malloc(numLinkParameter * sizeof (struct link_param_th_status));
  3624. +  StatWatch *watch=NULL;
  3625. +  for (int i=0 ; i < numLinkParameter ; i++) {
  3626. +    result[i].parameter = linkThresholds[i].parameter;
  3627. +    result[i].status = 1; //accepted..default
  3628. +    switch (linkThresholds[i].parameter){
  3629. +    case LINK_PACKET_LOSS: 
  3630. +      watch = &loss_watch_;
  3631. +      break;
  3632. +    case LINK_PACKET_DELAY:
  3633. +      watch = &delay_watch_;
  3634. +      break;
  3635. +    case LINK_PACKET_JITTER:
  3636. +      watch = &jitter_watch_;
  3637. +      break;
  3638. +    case LINK_RX_DATA_THROUGHPUT:
  3639. +      watch = &rx_data_watch_;
  3640. +      break;
  3641. +    case LINK_RX_TRAFFIC_THROUGHPUT:
  3642. +      watch = &rx_traffic_watch_;
  3643. +      break;
  3644. +    case LINK_TX_DATA_THROUGHPUT:
  3645. +      watch = &tx_data_watch_;
  3646. +      break;
  3647. +    case LINK_TX_TRAFFIC_THROUGHPUT:
  3648. +      watch = &tx_traffic_watch_;
  3649. +      break;
  3650. +    default:
  3651. +      fprintf (stderr, "Parameter type not supported %dn", linkThresholds[i].parameter);
  3652. +      result[i].status = 0; //rejected
  3653. +    }
  3654. +    watch->set_thresholds (linkThresholds[i].initActionTh.data_d, 
  3655. +    linkThresholds[i].rollbackActionTh.data_d ,
  3656. +    linkThresholds[i].exectActionTh.data_d);
  3657. +  }
  3658. +  return result;
  3659. +}
  3660. +#endif
  3661. +
  3662. +/**
  3663. + * Update the given timer and check if thresholds are crossed
  3664. + * @param watch the stat watch to update
  3665. + * @param value the stat value
  3666. + */
  3667. +void Mac802_16::update_watch (StatWatch *watch, double value)
  3668. +{
  3669. +  char *name;
  3670. +
  3671. +#ifdef USE_802_21 //Switch to activate when using 802.21 modules (external package)
  3672. +  threshold_action_t action = watch->update (value);
  3673. +
  3674. +  if (action != NO_ACTION_TH) {
  3675. +    link_parameter_t param;
  3676. +    union param_value old_value, new_value;
  3677. +
  3678. +    if (watch == &loss_watch_) {
  3679. +      param = LINK_PACKET_LOSS;
  3680. +    } else if (watch == &delay_watch_) {
  3681. +      param = LINK_PACKET_DELAY;
  3682. +    } else if (watch == &jitter_watch_) {
  3683. +      param = LINK_PACKET_JITTER;
  3684. +    }
  3685. +    old_value.data_d = watch->old_average();
  3686. +    new_value.data_d = watch->average();
  3687. +    send_link_parameter_change (addr(), param, old_value, new_value);      
  3688. +  }
  3689. +#endif
  3690. +
  3691. +  if (watch == &loss_watch_) {
  3692. +    name = "loss";
  3693. +  } else if (watch == &delay_watch_) {
  3694. +    name = "delay";
  3695. +  } else if (watch == &jitter_watch_) {
  3696. +    name = "jitter";
  3697. +  } else {
  3698. +    name = "other";
  3699. +  }
  3700. +  if (print_stats_)
  3701. +    printf ("At %f in Mac %d, updating stats %s: %fn", NOW, addr(), name, watch->average());
  3702. +}
  3703. +
  3704. +/**
  3705. + * Update the given timer and check if thresholds are crossed
  3706. + * @param watch the stat watch to update
  3707. + * @param value the stat value
  3708. + */
  3709. +void Mac802_16::update_throughput (ThroughputWatch *watch, double size)
  3710. +{
  3711. +  char *name;
  3712. +
  3713. +#ifdef USE_802_21 //Switch to activate when using 802.21 modules (external package)
  3714. +  threshold_action_t action = watch->update (size, NOW);
  3715. +  if (action != NO_ACTION_TH) {
  3716. +    link_parameter_t param;
  3717. +    union param_value old_value, new_value;
  3718. +    if (watch == &rx_data_watch_) {
  3719. +      param = LINK_RX_DATA_THROUGHPUT;
  3720. +    } else if (watch == &rx_traffic_watch_) {
  3721. +      param = LINK_RX_TRAFFIC_THROUGHPUT;
  3722. +    } else if (watch == &tx_data_watch_) {
  3723. +      param = LINK_TX_DATA_THROUGHPUT;
  3724. +    } else if (watch == &tx_traffic_watch_) {
  3725. +      param = LINK_TX_TRAFFIC_THROUGHPUT;
  3726. +    }
  3727. +    old_value.data_d = watch->old_average();
  3728. +    new_value.data_d = watch->average();
  3729. +    send_link_parameter_change (addr(), param, old_value, new_value);      
  3730. +  }
  3731. +#endif 
  3732. +
  3733. +  if (watch == &rx_data_watch_) {
  3734. +    name = "rx_data";
  3735. +    rx_data_timer_->resched (watch->get_timer_interval());
  3736. +  } else if (watch == &rx_traffic_watch_) {
  3737. +    rx_traffic_timer_->resched (watch->get_timer_interval());
  3738. +    name = "rx_traffic";
  3739. +  } else if (watch == &tx_data_watch_) {
  3740. +    tx_data_timer_->resched (watch->get_timer_interval());
  3741. +    name = "tx_data";
  3742. +  } else if (watch == &tx_traffic_watch_) {
  3743. +    tx_traffic_timer_->resched (watch->get_timer_interval());
  3744. +    name = "tx_traffic";
  3745. +  }
  3746. +
  3747. +  if (print_stats_)
  3748. +    printf ("At %f in Mac %d, updating stats %s: %fn", NOW, addr(), name, watch->average());
  3749. +}
  3750. diff -Naur ns-2.29-org/wimax/mac802_16.h ns-2.29/wimax/mac802_16.h
  3751. --- ns-2.29-org/wimax/mac802_16.h 1969-12-31 19:00:00.000000000 -0500
  3752. +++ ns-2.29/wimax/mac802_16.h 2006-09-22 17:27:47.000000000 -0400
  3753. @@ -0,0 +1,591 @@
  3754. +/* This software was developed at the National Institute of Standards and
  3755. + * Technology by employees of the Federal Government in the course of
  3756. + * their official duties. Pursuant to title 17 Section 105 of the United
  3757. + * States Code this software is not subject to copyright protection and
  3758. + * is in the public domain.
  3759. + * NIST assumes no responsibility whatsoever for its use by other parties,
  3760. + * and makes no guarantees, expressed or implied, about its quality,
  3761. + * reliability, or any other characteristic.
  3762. + * <BR>
  3763. + * We would appreciate acknowledgement if the software is used.
  3764. + * <BR>
  3765. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  3766. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  3767. + * FROM THE USE OF THIS SOFTWARE.
  3768. + * </PRE></P>
  3769. + * @author  rouil
  3770. + */
  3771. +
  3772. +#ifndef MAC802_16_H
  3773. +#define MAC802_16_H
  3774. +
  3775. +#include "sduclassifier.h"
  3776. +#include "connectionmanager.h"
  3777. +#include "serviceflowhandler.h"
  3778. +#include "serviceflowqos.h"
  3779. +#include "peernode.h"
  3780. +#include "mac.h"
  3781. +#include "mac802_16pkt.h"
  3782. +#include "mac802_16timer.h"
  3783. +
  3784. +//Define new debug function for cleaner code
  3785. +#ifdef DEBUG_WIMAX
  3786. +#define debug2 printf 
  3787. +#else
  3788. +#define debug2(arg1,...) 
  3789. +#endif
  3790. +
  3791. +#define BS_NOT_CONNECTED -1 //bs_id when MN is not connected
  3792. +
  3793. +#define DL_PREAMBLE 3  //preamble+fch
  3794. +#define INIT_RNG_PREAMBLE 2
  3795. +#define BW_REQ_PREAMBLE 1
  3796. +
  3797. +
  3798. +/** Defines different types of nodes */
  3799. +enum station_type_t {
  3800. +  STA_UNKNOWN,
  3801. +  STA_MN,
  3802. +  STA_BS
  3803. +};
  3804. +
  3805. +/** Defines the state of the MAC */
  3806. +enum Mac802_16State {
  3807. +  MAC802_16_DISCONNECTED,
  3808. +  MAC802_16_WAIT_DL_SYNCH,
  3809. +  MAC802_16_WAIT_DL_SYNCH_DCD,
  3810. +  MAC802_16_UL_PARAM,
  3811. +  MAC802_16_RANGING,
  3812. +  MAC802_16_WAIT_RNG_RSP,
  3813. +  MAC802_16_REGISTER,
  3814. +  MAC802_16_SCANNING,
  3815. +  MAC802_16_CONNECTED
  3816. +};
  3817. +
  3818. +/** Data structure to store MAC state */
  3819. +struct state_info {
  3820. +  Mac802_16State state; 
  3821. +  int bs_id;
  3822. +  double frameduration;
  3823. +  int frame_number;
  3824. +  int channel;
  3825. +  ConnectionManager * connectionManager;
  3826. +  ServiceFlowHandler * serviceFlowHandler;
  3827. +  struct peerNode *peer_list;
  3828. +};
  3829. +
  3830. +/** Defines profiles */
  3831. +struct phyprofile {
  3832. +  int nb_channel; //number of valid channel in the array
  3833. +  int current; //index of the channel currently used
  3834. +  double freq[]; //list of channel frequencies
  3835. +};
  3836. +
  3837. +/** MAC MIB */
  3838. +class Mac802_16MIB {
  3839. + public: 
  3840. +  Mac802_16MIB (Mac802_16 *parent);
  3841. +  int queue_length;
  3842. +  double frame_duration;
  3843. +
  3844. +  double dcd_interval;
  3845. +  double ucd_interval;
  3846. +  double init_rng_interval;
  3847. +  double lost_dlmap_interval;
  3848. +  double lost_ulmap_interval;
  3849. +  
  3850. +  double t1_timeout;
  3851. +  double t2_timeout;
  3852. +  double t3_timeout;
  3853. +  double t6_timeout;
  3854. +  double t12_timeout;
  3855. +  double t16_timeout;
  3856. +  double t17_timeout;
  3857. +  double t21_timeout;
  3858. +  double t44_timeout;
  3859. +
  3860. +  u_int32_t contention_rng_retry;
  3861. +  u_int32_t invited_rng_retry;
  3862. +  u_int32_t request_retry;
  3863. +  u_int32_t reg_req_retry;
  3864. +  double    tproc;
  3865. +  u_int32_t dsx_req_retry;
  3866. +  u_int32_t dsx_rsp_retry;
  3867. +
  3868. +  u_int32_t rng_backoff_start;
  3869. +  u_int32_t rng_backoff_stop;
  3870. +  u_int32_t bw_backoff_start;
  3871. +  u_int32_t bw_backoff_stop;
  3872. +
  3873. +  //mobility extension
  3874. +  u_int32_t scan_duration;
  3875. +  u_int32_t interleaving;
  3876. +  u_int32_t scan_iteration;
  3877. +  u_int32_t max_dir_scan_time;
  3878. +  double    nbr_adv_interval;
  3879. +  u_int32_t scan_req_retry;
  3880. +
  3881. +  //miscalleous
  3882. +  double rxp_avg_alpha;  //for measurements
  3883. +  double lgd_factor_; 
  3884. +  double RXThreshold_;
  3885. +  double client_timeout; //used to clear information on BS side
  3886. +};
  3887. +
  3888. +/** PHY MIB */
  3889. +class Phy802_16MIB {
  3890. + public: 
  3891. +  Phy802_16MIB (Mac802_16 *parent);
  3892. +  int channel; //current channel
  3893. +  double fbandwidth;
  3894. +  u_int32_t ttg; 
  3895. +  u_int32_t rtg;
  3896. +};
  3897. +
  3898. +class WimaxScheduler;
  3899. +class FrameMap;
  3900. +class StatTimer;
  3901. +/**
  3902. + * Class implementing IEEE 802_16
  3903. + */ 
  3904. +class Mac802_16 : public Mac {
  3905. +
  3906. +  friend class PeerNode;
  3907. +  friend class SDUClassifier;
  3908. +  friend class WimaxFrameTimer;
  3909. +  friend class FrameMap;
  3910. +  friend class WimaxScheduler;
  3911. +  friend class BSScheduler;
  3912. +  friend class SSscheduler;
  3913. +  friend class ServiceFlowHandler;
  3914. +  friend class Connection;
  3915. +  friend class StatTimer;
  3916. + public:
  3917. +
  3918. +  Mac802_16();
  3919. +
  3920. +  /**
  3921. +   * Return the connection manager
  3922. +   * @return the connection manager
  3923. +   */
  3924. +  inline ConnectionManager *  getCManager () { return connectionManager_; }
  3925. +  
  3926. +  /**
  3927. +   * Return The Service Flow handler
  3928. +   * @return The Service Flow handler
  3929. +   */
  3930. +  inline ServiceFlowHandler *  getServiceHandler () { return serviceFlowHandler_; }
  3931. +  
  3932. +  /**
  3933. +   * Return the Scheduler
  3934. +   * @return the Scheduler
  3935. +   */
  3936. +  inline WimaxScheduler * getScheduler () { return scheduler_; }
  3937. +
  3938. +  /**
  3939. +   * Return the frame duration (in s)
  3940. +   * @return the frame duration (in s)
  3941. +   */
  3942. +  double  getFrameDuration () { return macmib_.frame_duration; }
  3943. +  
  3944. +  /**
  3945. +   * Set the frame duration
  3946. +   * @param duration The frame duration (in s)
  3947. +   */
  3948. +  void  setFrameDuration (double duration) { macmib_.frame_duration = duration; }
  3949. +  
  3950. +  /**
  3951. +   * Return the current frame number
  3952. +   * @return the current frame number
  3953. +   */
  3954. +  int getFrameNumber ();
  3955. +
  3956. +  /**
  3957. +   * Add a flow
  3958. +   * @param qos The QoS required
  3959. +   * @param handler The entity that requires to add a flow
  3960. +   */
  3961. +  void  addFlow (ServiceFlowQoS * qos, void * handler);
  3962. +
  3963. +  /**
  3964. +   * Return the head of the peer nodes list
  3965. +   * @return the head of the peer nodes list
  3966. +   */
  3967. +  PeerNode * getPeerNode_head () { return peer_list_->lh_first; }
  3968. +
  3969. +  /**
  3970. +   * Return the peer node that has the given address
  3971. +   * @param index The address of the peer
  3972. +   * @return The peer node that has the given address
  3973. +   */
  3974. +  PeerNode *getPeerNode (int index);
  3975. +
  3976. +  /**
  3977. +   * Add the peer node
  3978. +   * @param The peer node to add
  3979. +   */
  3980. +  void addPeerNode (PeerNode *node);
  3981. +
  3982. +  /**
  3983. +   * Remove a peer node
  3984. +   * @param The peer node to remove
  3985. +   */
  3986. +  void removePeerNode (PeerNode *node);
  3987. +
  3988. +  /**
  3989. +   * Interface with the TCL script
  3990. +   * @param argc The number of parameter
  3991. +   * @param argv The list of parameters
  3992. +   */
  3993. +  int command(int argc, const char*const* argv);
  3994. +
  3995. +  /**
  3996. +   * Set the mac state
  3997. +   * @param state The new mac state
  3998. +   */  
  3999. +  void setMacState (Mac802_16State state);
  4000. +
  4001. +  /**
  4002. +   * Return the mac state
  4003. +   * @return The new mac state
  4004. +   */  
  4005. +  Mac802_16State getMacState ();
  4006. +
  4007. +  /**
  4008. +   * Change the channel
  4009. +   * @param channel The new channel
  4010. +   */
  4011. +  void setChannel (int channel);
  4012. +
  4013. +  /**
  4014. +   * Return the channel index
  4015. +   * @return The channel
  4016. +   */
  4017. +  int getChannel ();
  4018. +
  4019. +  /**
  4020. +   * Return the channel number for the given frequency
  4021. +   * @param freq The frequency
  4022. +   * @return The channel number of -1 if the frequency does not match
  4023. +   */
  4024. +  int getChannel (double freq);
  4025. +
  4026. +  /**
  4027. +   * Set the channel to the next from the list
  4028. +   * Used at initialisation and when loosing signal
  4029. +   */
  4030. +  void nextChannel ();
  4031. +
  4032. +  /**
  4033. +   * Process packets going out
  4034. +   * @param p The packet to transmit
  4035. +   */
  4036. +  void sendDown(Packet *p);
  4037. +
  4038. +  /**
  4039. +   * Process packets going out
  4040. +   * @param p The packet to transmit
  4041. +   */
  4042. +  void transmit(Packet *p);
  4043. +        
  4044. +  /**
  4045. +   * Process incoming packets 
  4046. +   * @param p The received packet
  4047. +   */
  4048. +  void sendUp(Packet *p);
  4049. +
  4050. +  /**
  4051. +   * Process the packet after receiving last bit
  4052. +   */
  4053. +  void receive();
  4054. +
  4055. +  /**
  4056. +   * Creates a snapshot of the MAC's state and reset it
  4057. +   * @return The snapshot of the MAC's state
  4058. +   */
  4059. +  state_info *backup_state ();
  4060. +
  4061. +  /**
  4062. +   * Restore the state of the Mac
  4063. +   * @param state The state to restore
  4064. +   */
  4065. +  void restore_state (state_info *state);  
  4066. +
  4067. +  /**
  4068. +   * Set the variable used to find out if upper layers
  4069. +   * must be notified to send packets. During scanning we
  4070. +   * do not want upper layers to send packet to the mac.
  4071. +   * @param notify Value indicating if we want to receive packets 
  4072. +   * from upper layers
  4073. +   */
  4074. +  void setNotify_upper (bool notify);
  4075. +
  4076. +  /**
  4077. +   * Return the PHY layer
  4078. +   * @return The physical layer
  4079. +   */
  4080. +  OFDMPhy* getPhy ();
  4081. +
  4082. +  /**
  4083. +   * The MAC MIB
  4084. +   */
  4085. +   Mac802_16MIB macmib_;
  4086. +
  4087. +   /**
  4088. +    * The Physical layer MIB
  4089. +    */
  4090. +   Phy802_16MIB phymib_;
  4091. +
  4092. +#ifdef USE_802_21 //Switch to activate when using 802.21 modules (external package)
  4093. +   /* 
  4094. +    * Configure/Request configuration
  4095. +    * The upper layer sends a config object with the required 
  4096. +    * new values for the parameters (or PARAMETER_UNKNOWN_VALUE).
  4097. +    * The MAC tries to set the values and return the new setting.
  4098. +    * For examples if a MAC does not support a parameter it will
  4099. +    * return  PARAMETER_UNKNOWN_VALUE
  4100. +    * @param config The configuration object
  4101. +    */ 
  4102. +   void link_configure (link_parameter_config_t* config);
  4103. +
  4104. +   /* 
  4105. +    * Configure the threshold values for the given parameters
  4106. +    * @param numLinkParameter number of parameter configured
  4107. +    * @param linkThresholds list of parameters and thresholds
  4108. +    */
  4109. +   struct link_param_th_status * link_configure_thresholds (int numLinkParameter, struct link_param_th *linkThresholds); //configure threshold
  4110. +        
  4111. +   /*
  4112. +    * Disconnect from the PoA
  4113. +    */
  4114. +   void link_disconnect ();
  4115. +
  4116. +   /*
  4117. +    * Connect to the PoA
  4118. +    * @param poa The address of PoA
  4119. +    */
  4120. +   void link_connect (int poa);
  4121. +     
  4122. +#endif
  4123. +   
  4124. + protected:
  4125. +   /**
  4126. +    * Initialize default connection
  4127. +    */
  4128. +   void init_default_connections ();
  4129. +
  4130. +   /**
  4131. +    * The packet scheduler
  4132. +    */
  4133. +   WimaxScheduler * scheduler_;
  4134. +   
  4135. +   /**
  4136. +    * Return a new allocated packet
  4137. +    * @return A newly allocated packet 
  4138. +    */
  4139. +   Packet * getPacket();
  4140. +   
  4141. +   /*
  4142. +    * Return the code for the frame duration
  4143. +    * @return the code for the frame duration
  4144. +    */
  4145. +   int getFrameDurationCode ();
  4146. +   
  4147. +   /*
  4148. +    * Set the frame duration using code
  4149. +    * @param code The frame duration code
  4150. +    */
  4151. +   void setFrameDurationCode (int code);
  4152. +   
  4153. +   /**
  4154. +    * Current frame number
  4155. +    */
  4156. +   int frame_number_;
  4157. +   
  4158. +   /**
  4159. +    * Statistics for queueing delay
  4160. +    */
  4161. +   StatWatch delay_watch_; 
  4162. +   
  4163. +   /**
  4164. +    * Delay for last packet
  4165. +    */
  4166. +   double last_tx_delay_;
  4167. +
  4168. +   /**
  4169. +    * Statistics for delay jitter 
  4170. +    */
  4171. +   StatWatch jitter_watch_;
  4172. +   
  4173. +   /**
  4174. +    * Stats for packet loss
  4175. +    */
  4176. +   StatWatch loss_watch_;
  4177. +
  4178. +   /**
  4179. +    * Stats for incoming data throughput
  4180. +    */
  4181. +   ThroughputWatch rx_data_watch_;
  4182. +
  4183. +   /**
  4184. +    * Stats for incoming traffic throughput (data+management)
  4185. +    */
  4186. +   ThroughputWatch rx_traffic_watch_;
  4187. +
  4188. +
  4189. +   /**
  4190. +    * Stats for outgoing data throughput
  4191. +    */
  4192. +   ThroughputWatch tx_data_watch_;
  4193. +
  4194. +   /**
  4195. +    * Stats for outgoing traffic throughput (data+management)
  4196. +    */
  4197. +   ThroughputWatch tx_traffic_watch_;
  4198. +
  4199. +   /**
  4200. +    * Timers to continuously poll stats in case it is not updated by
  4201. +    * sending or receiving packets
  4202. +    */
  4203. +   StatTimer *rx_data_timer_;
  4204. +   StatTimer *rx_traffic_timer_;
  4205. +   StatTimer *tx_data_timer_;
  4206. +   StatTimer *tx_traffic_timer_;
  4207. +
  4208. +   /**
  4209. +    * Indicates if the stats must be printed
  4210. +    */
  4211. +   int print_stats_;
  4212. +   
  4213. +   /**
  4214. +    * Update the given timer and check if thresholds are crossed
  4215. +    * @param watch the stat watch to update
  4216. +    * @param value the stat value
  4217. +    */
  4218. +   void update_watch (StatWatch *watch, double value);
  4219. +
  4220. +   /**
  4221. +    * Update the given timer and check if thresholds are crossed
  4222. +    * @param watch the stat watch to update
  4223. +    * @param size the size of packet received
  4224. +    */
  4225. +   void update_throughput (ThroughputWatch *watch, double size);
  4226. +
  4227. +#ifdef USE_802_21 //Switch to activate when using 802.21 modules (external package)
  4228. +   /**
  4229. +    * Poll the given stat variable to check status
  4230. +    * @param type The link parameter type
  4231. +    */
  4232. +   void poll_stat (link_parameter_t type);
  4233. +#endif
  4234. +
  4235. + private:
  4236. +   /**
  4237. +    * The list of classifier
  4238. +    */
  4239. +   struct sduClassifier classifier_list_;
  4240. +   
  4241. +   /**
  4242. +    * List of connected peer nodes. Only one for SSs.
  4243. +    */
  4244. +   struct peerNode *peer_list_;
  4245. +   
  4246. +   /**
  4247. +    * The class to handle connections
  4248. +    */
  4249. +   ConnectionManager * connectionManager_;
  4250. +   
  4251. +   /**
  4252. +    * The module that handles flow requests
  4253. +    */
  4254. +   ServiceFlowHandler * serviceFlowHandler_;
  4255. +
  4256. +   /**
  4257. +    * Packet being received
  4258. +    */
  4259. +   Packet *pktRx_;
  4260. +
  4261. +   /**
  4262. +    * A packet buffer used to temporary store a packet 
  4263. +    * received by upper layer. Used during scanning
  4264. +    */
  4265. +   Packet *pktBuf_;
  4266. +
  4267. +   /**
  4268. +    * Add a classifier
  4269. +    */
  4270. +   void addClassifier (SDUClassifier *);
  4271. +
  4272. +   /**
  4273. +    * Set the node type
  4274. +    * @param type The station type
  4275. +    */
  4276. +   void setStationType (station_type_t type);
  4277. +
  4278. +   /*
  4279. +    * The type of station (MN or BS) 
  4280. +    */