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

网络

开发平台:

C/C++

  1. +   station_type_t type_;
  2. +
  3. +   /*
  4. +    * Address of the Base Station. If STA is BS then equal index_
  5. +    */
  6. +   int bs_id_;
  7. +
  8. +   /*
  9. +    * The state of the MAC
  10. +    */
  11. +   Mac802_16State state_;
  12. +
  13. +   /**
  14. +    * Receiving timer
  15. +    */
  16. +   WimaxRxTimer rxTimer_;
  17. +
  18. +   /**
  19. +    * Indicates if a collision occured
  20. +    */
  21. +   bool collision_;
  22. +
  23. +   /**
  24. +    * Indicate if upper layer must be notified to send more packets
  25. +    */
  26. +   bool notify_upper_;
  27. +
  28. +   /**
  29. +    * Last time a packet was sent
  30. +    */
  31. +   double last_tx_time_;
  32. +
  33. +   /**
  34. +    * Last transmission duration
  35. +    */
  36. +   double last_tx_duration_;
  37. +
  38. +};
  39. +
  40. +/** Class to poll stats */
  41. +class StatTimer : public TimerHandler {
  42. + public:
  43. +  StatTimer (Mac802_16 *mac, ThroughputWatch *watch) : TimerHandler() {
  44. +    mac_ = mac;
  45. +    watch_ = watch;
  46. +    timer_interval_ = 0.1; //default 100ms
  47. +    resched (timer_interval_);
  48. +  }
  49. +    void expire (Event *) {
  50. +      mac_->update_throughput (watch_, 0);
  51. +      //double tmp = watch_->get_timer_interval();
  52. +      //resched(tmp > 0? tmp: timer_interval_);
  53. +    }
  54. +    inline void set_timer_interval(double ti) { timer_interval_ = ti; }
  55. + private:
  56. +    Mac802_16 *mac_;
  57. +    ThroughputWatch *watch_;
  58. +    double timer_interval_;
  59. +};
  60. +
  61. +#endif //MAC802_16_H
  62. +
  63. diff -Naur ns-2.29-org/wimax/mac802_16pkt.cc ns-2.29/wimax/mac802_16pkt.cc
  64. --- ns-2.29-org/wimax/mac802_16pkt.cc 1969-12-31 19:00:00.000000000 -0500
  65. +++ ns-2.29/wimax/mac802_16pkt.cc 2006-09-22 17:27:47.000000000 -0400
  66. @@ -0,0 +1,171 @@
  67. +/* This class contains helpers for manipulating 802.16 messages
  68. + * and getting the packet size.
  69. + * This software was developed at the National Institute of Standards and
  70. + * Technology by employees of the Federal Government in the course of
  71. + * their official duties. Pursuant to title 17 Section 105 of the United
  72. + * States Code this software is not subject to copyright protection and
  73. + * is in the public domain.
  74. + * NIST assumes no responsibility whatsoever for its use by other parties,
  75. + * and makes no guarantees, expressed or implied, about its quality,
  76. + * reliability, or any other characteristic.
  77. + * <BR>
  78. + * We would appreciate acknowledgement if the software is used.
  79. + * <BR>
  80. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  81. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  82. + * FROM THE USE OF THIS SOFTWARE.
  83. + * </PRE></P>
  84. + * @author  rouil
  85. + */
  86. +
  87. +#include "mac802_16pkt.h"
  88. +
  89. +/**
  90. + * Return the size of the MOB_NBR-ADV frame
  91. + * @param frame The frame 
  92. + */
  93. +int Mac802_16pkt::getMOB_NBR_ADV_size(mac802_16_mob_nbr_adv_frame *frame)
  94. +{
  95. +  int size = 4; //min size
  96. +  if ((frame->skip_opt_field & 0x1) == 0)
  97. +    size +=3; //add operator id
  98. +  
  99. +  for (int i = 0 ; i < frame->n_neighbors ; i++) {
  100. +    size += 4; //min size for neighbor info
  101. +    if (frame->nbr_info[i].phy_profile_id.FAindex & 0x1)
  102. +      size++;
  103. +    if (frame->nbr_info[i].phy_profile_id.bs_eirp & 0x1)
  104. +      size++;
  105. +    if ((frame->skip_opt_field & 0x2) == 0)
  106. +      size +=3; //contain neighbor bs id
  107. +    if ((frame->skip_opt_field & 0x4) == 0)
  108. +      size ++; //contain HO process optimization
  109. +    if ((frame->skip_opt_field & 0x8) == 0)
  110. +      size ++; //contain neighbor bs id
  111. +    if (frame->nbr_info[i].dcd_included)
  112. +      size += 2+GET_DCD_SIZE (frame->nbr_info[i].dcd_settings.nb_prof); 
  113. +    if (frame->nbr_info[i].ucd_included)
  114. +      size += 2+GET_UCD_SIZE (frame->nbr_info[i].ucd_settings.nb_prof); 
  115. +    if (frame->nbr_info[i].phy_included)
  116. +      size += 2;
  117. +  }
  118. +
  119. +  return size;
  120. +}
  121. +
  122. +/**
  123. + * Return the size of the MOB_SCN-REQ 
  124. + * @param frame The frame 
  125. + */
  126. +int Mac802_16pkt::getMOB_SCN_REQ_size(mac802_16_mob_scn_req_frame *frame)
  127. +{
  128. +  int size=6;
  129. +
  130. +  if (frame->n_recommended_bs_index != 0)
  131. +    size ++;
  132. +  int tmp = 11*(frame->n_recommended_bs_index+frame->n_recommended_bs_full);
  133. +  size += tmp/8;
  134. +  if ((tmp%8)!=0)
  135. +    size ++;
  136. +
  137. +  return size;
  138. +}
  139. +
  140. +/**
  141. + * Return the size of the MOB_SCN-RSP 
  142. + * @param frame The frame 
  143. + */
  144. +int Mac802_16pkt::getMOB_SCN_RSP_size(mac802_16_mob_scn_rsp_frame *frame)
  145. +{
  146. +  int size=6;
  147. +
  148. +  if (frame->scan_duration!=0) {
  149. +    size += 3;
  150. +    if (frame->n_recommended_bs_index!=0)
  151. +      size ++;
  152. +    int tmp = 0;
  153. +    for (int i = 0 ; i < frame->n_recommended_bs_index ; i++) {
  154. +      tmp+=11;
  155. +      if (frame->rec_bs_index[i].scanning_type==2 ||
  156. +   frame->rec_bs_index[i].scanning_type==3)
  157. + tmp+=24;
  158. +    }
  159. +    for (int i = 0 ; i < frame->n_recommended_bs_index ; i++) {
  160. +      tmp+=51;
  161. +      if (frame->rec_bs_index[i].scanning_type==2 ||
  162. +   frame->rec_bs_index[i].scanning_type==3)
  163. + tmp+=24;
  164. +    }
  165. +    size += tmp/8;
  166. +    if ((tmp%8)!=0)
  167. +      size ++;  
  168. +  }
  169. +
  170. +  return size;
  171. +}
  172. +
  173. +/**
  174. + * Return the size of the MOB_MSHO-REQ 
  175. + * @param frame The frame 
  176. + */
  177. +int Mac802_16pkt::getMOB_MSHO_REQ_size(mac802_16_mob_msho_req_frame *frame)
  178. +{
  179. +  int size=4;
  180. +  int tmp, tmpB;
  181. +
  182. +  tmp = 0;
  183. +  tmpB = 0;
  184. +
  185. +  if (frame->n_new_bs_index !=0) 
  186. +    size++;
  187. +
  188. +  if (frame->report_metric & 0x1) tmp++;
  189. +  if (frame->report_metric & 0x2) tmp++;
  190. +  if (frame->report_metric & 0x4) tmp++;
  191. +
  192. +  for (int i = 0 ; i < frame->n_new_bs_index ; i++) {
  193. +    tmpB += 20 + 8*tmp;    
  194. +    if (frame->bs_index[i].arrival_time_diff_ind & 0x1)
  195. +      tmpB += 4;
  196. +  }
  197. +  //n_new_bs_full
  198. +  for (int i = 0 ; i < frame->n_new_bs_full ; i++) {
  199. +    tmpB += 20 + 8*tmp;
  200. +    if (frame->bs_full[i].arrival_time_diff_ind & 0x1)
  201. +      tmpB += 4;
  202. +  }
  203. +  tmpB += 4;
  204. +  //N_current
  205. +  if (frame->report_metric & 0x8) tmp++;
  206. +  for (int i = 0 ; i < frame->n_current_bs ; i++) {
  207. +    tmpB += 4 + 8*tmp;
  208. +  }
  209. +  //increase size
  210. +  size += tmp/8;
  211. +  if ((tmp%8)!=0)
  212. +    size ++;  //includes padding
  213. +  
  214. +  return size;
  215. +}
  216. +
  217. +/**
  218. + * Return the size of the MOB_MSHO-REQ 
  219. + * @param frame The frame 
  220. + */
  221. +int Mac802_16pkt::getMOB_BSHO_RSP_size(mac802_16_mob_bsho_rsp_frame *frame)
  222. +{
  223. +  int size=4;
  224. +
  225. +  return size;
  226. +}
  227. +
  228. +/**
  229. + * Return the size of the MOB_HO-IND 
  230. + * @param frame The frame 
  231. + */
  232. +int Mac802_16pkt::getMOB_HO_IND_size(mac802_16_mob_ho_ind_frame *frame)
  233. +{
  234. +  int size=4;
  235. +
  236. +  return size;
  237. +}
  238. diff -Naur ns-2.29-org/wimax/mac802_16pkt.h ns-2.29/wimax/mac802_16pkt.h
  239. --- ns-2.29-org/wimax/mac802_16pkt.h 1969-12-31 19:00:00.000000000 -0500
  240. +++ ns-2.29/wimax/mac802_16pkt.h 2006-09-22 17:27:47.000000000 -0400
  241. @@ -0,0 +1,908 @@
  242. +/* This software was developed at the National Institute of Standards and
  243. + * Technology by employees of the Federal Government in the course of
  244. + * their official duties. Pursuant to title 17 Section 105 of the United
  245. + * States Code this software is not subject to copyright protection and
  246. + * is in the public domain.
  247. + * NIST assumes no responsibility whatsoever for its use by other parties,
  248. + * and makes no guarantees, expressed or implied, about its quality,
  249. + * reliability, or any other characteristic.
  250. + * <BR>
  251. + * We would appreciate acknowledgement if the software is used.
  252. + * <BR>
  253. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  254. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  255. + * FROM THE USE OF THIS SOFTWARE.
  256. + * </PRE></P>
  257. + * @author  rouil
  258. + */
  259. +
  260. +#ifndef MAC802_16PKT_H
  261. +#define MAC802_16PKT_H
  262. +
  263. +#include "packet.h"
  264. +#include "ofdmphy.h"
  265. +
  266. +//#define HDR_MAC802_16(p) ((hdr_mac802_16 *)hdr_mac::access(p))
  267. +#define HDR_MAC802_16(p) (hdr_mac802_16::access(p))
  268. +#define HDR_MAC802_16_SIZE 6
  269. +#define HDR_MAC802_16_FRAGSUB_SIZE 2
  270. +
  271. +/** Define fragmentation encoding */
  272. +enum fragment_status {
  273. +  FRAG_NOFRAG = 0,
  274. +  FRAG_LAST,
  275. +  FRAG_FIRST,
  276. +  FRAG_CONT
  277. +};
  278. +  
  279. +/** Define Mac management type */
  280. +enum mngmt_type {
  281. +  MAC_UCD = 0,
  282. +  MAC_DCD,
  283. +  MAC_DL_MAP,
  284. +  MAC_UL_MAP,
  285. +  MAC_RNG_REQ,
  286. +  MAC_RNG_RSP,
  287. +  MAC_REG_REQ,
  288. +  MAC_REG_RSP,
  289. +  // 8: reserved
  290. +  // 9-10: Privacy key, not used 
  291. +  MAC_DSA_REQ=11,
  292. +  MAC_DSA_RSP,
  293. +  MAC_DSA_ACK,
  294. +  
  295. +  MAC_MOB_NBR_ADV=53,
  296. +  MAC_MOB_SCN_REQ,
  297. +  MAC_MOB_SCN_RSP,
  298. +  MAC_MOB_BSHO_REQ,
  299. +  MAC_MOB_MSHO_REQ,
  300. +  MAC_MOB_BSHO_RSP,
  301. +  MAC_MOB_HO_IND,
  302. +  MAC_MOB_SCN_REP,
  303. +  MAC_MOB_ASC_REP=66
  304. +};
  305. +
  306. +/** Enumeration of scanning types */
  307. +enum wimax_scanning_type {
  308. +  SCAN_WITHOUT_ASSOC,
  309. +  SCAN_ASSOC_LVL0,
  310. +  SCAN_ASSOC_LVL1,
  311. +  SCAN_ASSOC_LVL2
  312. +};
  313. +
  314. +/** Structure containing physical layer information */
  315. +struct phy_info_t {
  316. +  double freq_;              //the frequency at which it is sent
  317. +  Ofdm_mod_rate modulation_; //modulation at which the packet was sent
  318. +  double g_; //The cyclic prefix information. Used for synchronization
  319. +};
  320. +
  321. +/** Define generic MAC header */
  322. +struct gen_mac_header_t {
  323. +  u_char ht : 1;
  324. +  u_char ec : 1;
  325. +  u_char type : 6;
  326. +  u_char rsv1: 1;
  327. +  u_char ci: 1;
  328. +  u_char eks: 2;
  329. +  u_char rsv2: 1;
  330. +  u_int16_t len: 11;
  331. +  u_int16_t cid;
  332. +  u_char hcs;
  333. +};
  334. +
  335. +/** Define bandwidth request header */
  336. +struct bw_req_header_t {
  337. +  u_char ht : 1;
  338. +  u_char ec : 1;
  339. +  u_char type : 3;  
  340. +  u_int32_t br : 19;
  341. +  u_int16_t cid;
  342. +  u_char hcs;  
  343. +};
  344. +
  345. +/** Define structure for packet information */
  346. +struct hdr_mac802_16
  347. +{
  348. +  //virtual info for physical layer
  349. +  phy_info_t phy_info;
  350. +  
  351. +  //generic mac header or bw request header
  352. +  gen_mac_header_t header;
  353. +
  354. +  //check how to put the subheaders (piggyback)
  355. +  bool frag_subheader; //set to true if there is a fragmentation subheader
  356. +  char fc : 2;  //00:no fragmentation, 01:last, 10: first, 11: middle 
  357. +  char fsn : 3; //fragmentation number 
  358. +
  359. +  //for management frames, we put 
  360. +  //payload in the packet payload
  361. +  //because the size changes
  362. +
  363. +  //Packet header access functions
  364. +  static int offset_;
  365. +  inline static int& offset() {return offset_;}
  366. +  inline static hdr_mac802_16* access(const Packet* p)
  367. +  {
  368. +    return (hdr_mac802_16*) p->access(offset_);
  369. +  }
  370. +};
  371. +
  372. +/**** Defines some constant for the maximum size of messages ****/
  373. +/* When sending a packet, the message is copied for each 
  374. + * destination. In that case, we need to store all the information
  375. + * in the packet itself and not use pointer. We then use arrays.
  376. + */
  377. +#define MAX_MAP_IE  10
  378. +#define MAX_PROFILE 10
  379. +#define MAX_NBR     10
  380. +
  381. +/**** Defines IEs ****/
  382. +/** Defines DL_MAP IE (see p462.) */
  383. +struct mac802_16_dlmap_ie {
  384. +  u_int16_t cid;
  385. +  u_char diuc : 4;            //p463
  386. +  u_char preamble : 1;
  387. +  u_int16_t start_time : 11;
  388. +  //may contain extended info
  389. +};
  390. +#define DL_MAP_IE_SIZE 4
  391. +
  392. +/** fast Ranging IE (802.16e) */
  393. +struct mac802_16_fast_ranging_ie {
  394. +  int mac_addr;  //48 bits
  395. +  u_char uiuc : 4; 
  396. +  u_int16_t duration : 12; //in OFDM symbols
  397. +};
  398. +#define FAST_RANGING_IE_SIZE 9
  399. +
  400. +/** Defines UL_MAP IE (see p464.) */
  401. +struct mac802_16_ulmap_ie {
  402. +  u_int16_t cid;
  403. +  u_int16_t start_time : 11;
  404. +  u_char sub_channel_index : 5;
  405. +  u_char uiuc : 4;
  406. +  u_int16_t duration : 11;
  407. +  u_char midamble_rep : 2;
  408. +  //may contain additional info depending on uiuc
  409. +  u_char extended_uiuc : 4;
  410. +  u_char length : 4;
  411. +  mac802_16_fast_ranging_ie fast_ranging;
  412. +};
  413. +#define UL_MAP_IE_SIZE 6
  414. +
  415. +/**** Defines burst profiles ****/
  416. +
  417. +/* Burst profiles are TLV encoded...we just pick the info we 
  418. + * are interested in.
  419. + */
  420. +/** Defines DCD profile */
  421. +struct mac802_16_dcd_profile {
  422. +  u_char diuc : 4;
  423. +  u_int32_t frequency;
  424. +  u_char fec;
  425. +  //may have more info
  426. +};
  427. +#define DCD_PROFILE_SIZE 12
  428. +
  429. +/** Defines UCD profile */
  430. +struct mac802_16_ucd_profile {
  431. +  u_char uiuc : 4;
  432. +  u_char fec;
  433. +  //may have more info
  434. +};
  435. +#define UCD_PROFILE_SIZE 6
  436. +
  437. +/**** Defines frames ****/
  438. +/** DCD frame */
  439. +struct mac802_16_dcd_frame {
  440. +  u_char type;
  441. +  u_char dcid;
  442. +  u_char config_change_count;
  443. +  //info for all channels: TLV encoded
  444. +  u_char frame_duration_code;
  445. +  u_int32_t frame_number : 24;
  446. +  u_char ttg;
  447. +  u_char rtg;
  448. +  u_int32_t frequency;
  449. +  //downlink burst profiles
  450. +  u_int32_t nb_prof;
  451. +  mac802_16_dcd_profile profiles[MAX_PROFILE];
  452. +};
  453. +
  454. +//+3 for the end of map profile
  455. +#define GET_DCD_SIZE(X) 22+X*DCD_PROFILE_SIZE+3
  456. +
  457. +/** DL_MAP frame */
  458. +struct mac802_16_dl_map_frame {
  459. +  u_char type;
  460. +  u_char dcd_count;
  461. +  int bsid; //normaly 48 bits
  462. +  //DL_MAP IEs
  463. +  u_int32_t nb_ies;
  464. +  mac802_16_dlmap_ie ies[MAX_MAP_IE]; 
  465. +};
  466. +
  467. +//there is X IEs 
  468. +#define GET_DL_MAP_SIZE(X) 8+X*DL_MAP_IE_SIZE
  469. +
  470. +/** UCD frame */
  471. +struct mac802_16_ucd_frame {
  472. +  u_char type;
  473. +  u_char config_change_count;
  474. +  u_char rng_backoff_start;
  475. +  u_char rng_backoff_end;
  476. +  u_char req_backoff_start;
  477. +  u_char req_backoff_end;
  478. +  //info for overall channel
  479. +  /*
  480. +  u_int16_t rsv_timeout;
  481. +  */
  482. +  u_int16_t bw_req_size;
  483. +  u_int16_t rng_req_size;
  484. +  //uplink burst profile
  485. +  u_int32_t nb_prof;
  486. +  mac802_16_ucd_profile profiles[MAX_PROFILE];
  487. +};
  488. +
  489. +//+3 for the end of map profile
  490. +#define GET_UCD_SIZE(X) 14+X*UCD_PROFILE_SIZE+3
  491. +
  492. +/** UL_MAP frame */
  493. +struct mac802_16_ul_map_frame {
  494. +  u_char type;
  495. +  u_char ucid;
  496. +  u_char ucd_count;
  497. +  u_int32_t allocation_start;
  498. +  //UL_MAP IEs
  499. +  u_int32_t nb_ies;
  500. +  mac802_16_ulmap_ie ies[MAX_MAP_IE];
  501. +};
  502. +
  503. +#define GET_UL_MAP_SIZE(X) 7+X*UL_MAP_IE_SIZE
  504. +
  505. +/**** Defines ranging messages ****/
  506. +/** Ranging request frame */
  507. +struct mac802_16_rng_req_frame {
  508. +  u_char type;
  509. +  u_char dc_id;
  510. +  /*TLV values*/
  511. +  /* Requested Downlink Burst Profile
  512. +   * bits 0-3: DIUC of the downlink burst profile
  513. +   * bits 4-7: LSB of Configuration Change Count value
  514. +   * of DCD defining the burst profile assocciated with DIUC
  515. +   */
  516. +  u_char req_dl_burst_profile;
  517. +  int ss_mac_address; //should be 6 bytes
  518. +  //u_char aas_bc_cap; //broadcast capability. optional
  519. +};
  520. +#define RNG_REQ_SIZE 13 //max value
  521. +
  522. +/** Ranging status */
  523. +enum ranging_status {
  524. +  RNG_CONTINUE = 1,
  525. +  RNG_ABORT,
  526. +  RNG_SUCCESS,
  527. +  RNG_RERANGE
  528. +};
  529. +
  530. +/** Ranging response frame */
  531. +struct mac802_16_rng_rsp_frame {
  532. +  u_char type;
  533. +  u_char uc_id;
  534. +  /*TLV values*/
  535. +  u_char pw_adjust;
  536. +  u_int32_t freq_adjust;
  537. +  u_char rng_status;
  538. +  /* byte 0: the least robust DIUC that may be used by BS for 
  539. +   * transmissions to the SS
  540. +   * byte 1: Configuration Change Count of DCD defining the burst profile
  541. +   * associated with DIUC 
  542. +   */
  543. +  u_int16_t dl_op_burst_profile;
  544. +  int ss_mac_address; //6 bytes
  545. +  u_int16_t basic_cid;
  546. +  u_int16_t primary_cid;
  547. +  u_char aas_bc_perm; 
  548. +};
  549. +#define RNG_RSP_SIZE 28
  550. +
  551. +/**** Defines registration messages ****/
  552. +/** Registration request frame */
  553. +struct mac802_16_reg_req_frame {
  554. +  u_char type;
  555. +  /*TLV values*/
  556. +  u_char ss_mngmt_support;
  557. +  u_char ip_mngmt_support;
  558. +  u_int16_t uplink_cid_support;
  559. +  
  560. +};
  561. +#define REG_REQ_SIZE 12
  562. +
  563. +/** Registration response frame */
  564. +struct mac802_16_reg_rsp_frame {
  565. +  u_char type;
  566. +  u_char response;
  567. +  /*TLV values*/
  568. +  u_char ss_mngmt_support;
  569. +  u_int16_t sec_mngmt_cid;
  570. +};
  571. +#define REG_RSP_SIZE 12
  572. +
  573. +/**** Defines Dynamic Service Addition messages ****/
  574. +/** DSA request frame */
  575. +struct mac802_16_dsa_req_frame {
  576. +  u_char type; //11
  577. +  u_int16_t transaction_id;
  578. +  /*TLV values*/
  579. +  bool uplink; //direction of the flow, normaly coded in TLV with
  580. +               //type 145 or 146 (see p647).
  581. +  u_int16_t cid;
  582. +};
  583. +//parameter X indicates if cid is present (i.e request from BS)
  584. +#define GET_DSA_REQ_SIZE(X) 6+4*X
  585. +
  586. +/** DSA response frame */
  587. +struct mac802_16_dsa_rsp_frame {
  588. +  u_char type; //12
  589. +  u_int16_t transaction_id;
  590. +  u_char confirmation_code;
  591. +  /*TLV values*/
  592. +  bool uplink; //direction of the flow, normaly coded in TLV with
  593. +               //type 145 or 146 (see p647).
  594. +  u_int16_t cid;
  595. +};
  596. +//parameter X indicates if cid is present (i.e response from BS)
  597. +#define GET_DSA_RSP_SIZE(X) 6+4*X
  598. +
  599. +/** DSA Acknowledgement frame */
  600. +struct mac802_16_dsa_ack_frame {
  601. +  u_char type; //13
  602. +  u_int16_t transaction_id;
  603. +  u_char confirmation_code;
  604. +  /*TLV values*/
  605. +  bool uplink; //direction of the flow, normaly coded in TLV with
  606. +               //type 145 or 146 (see p647).
  607. +};
  608. +#define DSA_ACK_SIZE 6
  609. +
  610. +
  611. +/**** Defines Mobility messages (802.16e) ****/
  612. +/** Structure of physical profile ID */
  613. +struct mac802_16_phy_profile_id {
  614. +  u_char colocatedFA: 1;
  615. +  u_char FAconfig: 1;
  616. +  u_char timefreq_synch: 2;
  617. +  u_char bs_eirp: 1;
  618. +  u_char dcducd_ref: 1;
  619. +  u_char FAindex: 1;
  620. +  u_char trigger_ref: 1;
  621. +};
  622. +
  623. +/** Structure of physical mode ID */
  624. +struct mac802_16_phy_mode_id {
  625. +  u_char bandwidth: 7;
  626. +  u_char fttsize: 3;
  627. +  u_char cp: 2;
  628. +  u_char duration_code: 4;
  629. +};
  630. +
  631. +/** Information about a neighbor BS */
  632. +struct mac802_16_nbr_adv_info {
  633. +  u_char length;
  634. +  mac802_16_phy_profile_id phy_profile_id;
  635. +  u_char fa_index; //if FA index indicator=1 in phy_profile_id
  636. +  u_char bs_eirp;
  637. +  int nbr_bsid;    
  638. +  u_char preamble_index; //in OFDM, 5lsb=
  639. +  u_char ho_process_opt;
  640. +  u_char sched_srv_supported;
  641. +  u_char dcd_ccc: 4;
  642. +  u_char ucd_ccc: 4;
  643. +  /* other TLV information */
  644. +  bool dcd_included; //tell if the dcd is included
  645. +  mac802_16_dcd_frame dcd_settings;
  646. +  bool ucd_included; //tell if the ucd is included
  647. +  mac802_16_ucd_frame ucd_settings;
  648. +  bool phy_included; //tell if the phy mode ID is included
  649. +  mac802_16_phy_mode_id phy_mode_id;
  650. +};
  651. +
  652. +/** Neighbor advertisment frame */
  653. +struct mac802_16_mob_nbr_adv_frame {
  654. +  u_char type; //53
  655. +  u_char skip_opt_field;
  656. +  u_int32_t operatorID: 24;
  657. +  u_char ccc;
  658. +  u_char frag_index: 4;
  659. +  u_char total_frag: 4;
  660. +  u_char n_neighbors; //number of neighbors
  661. +  mac802_16_nbr_adv_info nbr_info[MAX_NBR];
  662. +};
  663. +
  664. +/** Code BS using index in scan request */
  665. +struct mac802_16_mob_scn_req_bs_index {
  666. +  u_char neighbor_bs_index;
  667. +  u_char scanning_type: 3; //0: scanning without association
  668. +                           //1: scanning+assoc level 0
  669. +                           //2: scanning+assoc level 1
  670. +                           //3: scanning+assoc level 2
  671. +                           //4-7: reserved
  672. +};
  673. +/** Code BS using full address in scan request */
  674. +struct mac802_16_mob_scn_req_bs_full {
  675. +  int recommended_bs_id;   /* 6 bytes */
  676. +  u_char scanning_type: 3; //0: scanning without association
  677. +                           //1: scanning+assoc level 0
  678. +                           //2: scanning+assoc level 1
  679. +                           //3: scanning+assoc level 2
  680. +                           //4-7: reserved
  681. +};
  682. +
  683. +/** Scan request frame */
  684. +struct mac802_16_mob_scn_req_frame {
  685. +  u_char type; //54
  686. +  u_char scan_duration; //units of frames
  687. +  u_char interleaving_interval; //units of frames
  688. +  u_char scan_iteration; //in frame
  689. +  u_char n_recommended_bs_index; //number of BS recommended
  690. +  u_char ccc; //present if n_recommended_bs_index!= 0
  691. +  mac802_16_mob_scn_req_bs_index rec_bs_index[MAX_NBR];
  692. +  u_char n_recommended_bs_full;
  693. +  mac802_16_mob_scn_req_bs_full rec_bs_full[MAX_NBR];
  694. +  /* TLV info*/
  695. +};
  696. +
  697. +/** Code BS using index in scan response */
  698. +struct mac802_16_mob_scn_rsp_bs_index {
  699. +  u_char neighbor_bs_index;
  700. +  u_char scanning_type: 3; //0: scanning without association
  701. +                           //1: scanning+assoc level 0
  702. +                           //2: scanning+assoc level 1
  703. +                           //3: scanning+assoc level 2
  704. +                           //4-7: reserved
  705. +  /* next present if scanning is 2 or 3*/
  706. +  u_char rdv_time;
  707. +  u_char cdma_code;
  708. +  u_char transmission_opp_offset;
  709. +};
  710. +
  711. +/** Code BS using full address in scan response */
  712. +struct mac802_16_mob_scn_rsp_bs_full {
  713. +  int recommended_bs_id;   /* 6 bytes */
  714. +  u_char scanning_type: 3; //0: scanning without association
  715. +                           //1: scanning+assoc level 0
  716. +                           //2: scanning+assoc level 1
  717. +                           //3: scanning+assoc level 2
  718. +                           //4-7: reserved
  719. +  /* next present if scanning is 2 or 3*/
  720. +  u_char rdv_time;
  721. +  u_char cdma_code;
  722. +  u_char transmission_opp_offset;
  723. +};
  724. +
  725. +/** Scan response frame */
  726. +struct mac802_16_mob_scn_rsp_frame {
  727. +  u_char type; //55
  728. +  u_char scan_duration; //units of frames
  729. +  u_char report_mode: 2;
  730. +  u_char report_period;
  731. +  u_char report_metric;
  732. +  /*next information present only if scan duration !=0*/
  733. +  u_char start_frame: 4;
  734. +  u_char interleaving_interval;
  735. +  u_char scan_iteration;
  736. +  u_char n_recommended_bs_index;
  737. +  //next if n_recommended_bs_index !=0
  738. +  u_char ccc_mob_nbr_adv;
  739. +  mac802_16_mob_scn_rsp_bs_index rec_bs_index[MAX_NBR];
  740. +  u_char n_recommended_bs_full;
  741. +  mac802_16_mob_scn_rsp_bs_full rec_bs_full[MAX_NBR];
  742. +  /* end if scan duration !=0 */
  743. +  /* TLV information */
  744. +};
  745. +
  746. +/** Measurements about current BS */
  747. +struct mac802_16_mob_scn_rep_current_bs {
  748. +  u_char temp_bsid: 4;
  749. +  u_char bs_cinr_mean; //if report_metric[0]==1
  750. +  u_char bs_rssi_mean; //if report_metric[1]==1
  751. +  u_char relative_delay; //if report_metric[2]==1
  752. +  u_char bs_rtd; //if report_metric[3]==1
  753. +};
  754. +
  755. +/** Measurements about neighbor BS using index */
  756. +struct mac802_16_mob_scn_rep_bs_index {
  757. +  u_char neighbor_bs_index;
  758. +  u_char bs_cinr_mean; //if report_metric[0]==1
  759. +  u_char bs_rssi_mean; //if report_metric[1]==1
  760. +  u_char relative_delay; //if report_metric[2]==1
  761. +};
  762. +
  763. +/** Measurements about neighbor BS using full address */
  764. +struct mac802_16_mob_scn_rep_bs_full {
  765. +  int neighbor_bs_id; /* 6 bytes */
  766. +  u_char bs_cinr_mean; //if report_metric[0]==1
  767. +  u_char bs_rssi_mean; //if report_metric[1]==1
  768. +  u_char relative_delay; //if report_metric[2]==1
  769. +};
  770. +
  771. +/** Scan report frame */
  772. +struct mac802_16_mob_scn_rep_frame {
  773. +  u_char type; //60
  774. +  u_char report_mode: 1;
  775. +  u_char comp_nbr_bsid_ind: 1;
  776. +  u_char n_current_bs: 3;
  777. +  u_char report_metric: 8;
  778. +  mac802_16_mob_scn_rep_current_bs current_bs[MAX_NBR];
  779. +  u_char n_neighbor_bs_index;
  780. +  //next if n_recommended_bs_index !=0
  781. +  u_char ccc_mob_nbr_adv;
  782. +  mac802_16_mob_scn_rep_bs_index nbr_bs_index[MAX_NBR];
  783. +  u_char n_recommended_bs_full;
  784. +  mac802_16_mob_scn_rep_bs_full nbr_bs_full[MAX_NBR];
  785. +  /* other TLV information */
  786. +};
  787. +
  788. +/** Code BS using index in association result report */
  789. +struct mac802_16_mob_asc_rep_bs_index {
  790. +  u_char neighbor_bs_index;
  791. +  uint32_t timing_adjust;
  792. +  u_char power_level_adjust;
  793. +  uint32_t offset_freq_adjust;
  794. +  u_char rng_status;
  795. +  u_char service_level_prediction;
  796. +};
  797. +
  798. +/** Code BS using address in association result report */
  799. +struct mac802_16_mob_asc_rep_bs_full {
  800. +  int neighbor_bs_id; /* 6 bytes */
  801. +  uint32_t timing_adjust;
  802. +  u_char power_level_adjust;
  803. +  uint32_t offset_freq_adjust;
  804. +  u_char rng_status;
  805. +  u_char service_level_prediction;
  806. +};
  807. +
  808. +/** Association result report frame */
  809. +struct mac802_16_mob_asc_rep_frame {
  810. +  u_char type; //66
  811. +  u_char n_recommended_bs_index;
  812. +  //next if n_recommended_bs_index !=0
  813. +  u_char ccc_mob_nbr_adv;
  814. +  mac802_16_mob_asc_rep_bs_index rec_bs_index[MAX_NBR];
  815. +  u_char n_recommended_bs_full;
  816. +  mac802_16_mob_asc_rep_bs_full rec_bs_full[MAX_NBR];
  817. +}; 
  818. +
  819. +/** Code request in mode 000 (HO request) */
  820. +struct mac802_16_mob_bsho_req_mode_000 {
  821. +  int neighbor_bsid; /* 6 bytes */
  822. +  u_char service_level_prediction;
  823. +  u_char preamble_index;
  824. +  u_char ho_process_optimization;
  825. +  u_char net_assisted_ho_supported: 1;
  826. +  u_char ho_id_included_indicator: 1;
  827. +  u_char ho_autho_policy_indicator: 1;
  828. +  //if ho_id_included_indicator==1
  829. +  u_char ho_id;
  830. +  //if ho_autho_policy_indicator==1
  831. +  u_char ho_autho_policy_support;
  832. +};
  833. +
  834. +/** Structure for BSHO request */
  835. +struct mac802_16_mob_bsho_req_mode_new_bs {
  836. +  int neighbor_bsid; /* 6 bytes */
  837. +  u_char temp_bsid: 3;
  838. +};
  839. +
  840. +/** Structure for BSHO request */
  841. +struct mac802_16_mob_bsho_req_mode_new_bs2 {
  842. +  int neighbor_bsid; /* 6 bytes */
  843. +  u_char temp_bsid: 3;
  844. +  uint16_t new_cid[MAX_NBR];
  845. +  uint16_t new_said[MAX_NBR];
  846. +};
  847. +
  848. +/** Structure for BSHO request */
  849. +struct mac802_16_mob_bsho_req_mode_new_bs3 {
  850. +  int neighbor_bsid; /* 6 bytes */
  851. +  u_char temp_bsid: 3;
  852. +  uint16_t new_cid[MAX_NBR];
  853. +  uint16_t new_said[MAX_NBR];
  854. +  int cqich_id; //variable 
  855. +  u_char feedback_channel_off: 6;
  856. +  u_char period: 2;
  857. +  u_char frame_offset: 3;
  858. +  u_char duration: 3;
  859. +  u_char mimo_permutation_feedback: 2; 
  860. +};
  861. +
  862. +/** Structure for BSHO request */
  863. +struct mac802_16_mob_bsho_req_mode_current_bs {
  864. +  u_char temp_bsid: 3;
  865. +};
  866. +
  867. +/** BSHO request frame */
  868. +struct mac802_16_mob_bsho_req_frame {
  869. +  u_char type; //56
  870. +  u_char net_assisted_ho_supported: 1;
  871. +  u_char mode: 3;
  872. +  //if mode == 0b000
  873. +  u_char ho_op_mode: 1;
  874. +  u_char n_recommended;
  875. +  u_char resource_retain_flag: 1;
  876. +  mac802_16_mob_bsho_req_mode_000 n_rec[];
  877. +  //if mode == 0b001
  878. +  u_char tmp_bsid: 3;
  879. +  u_char ak_change_indicator: 1;
  880. +  u_char n_cids;
  881. +  uint16_t cids[MAX_NBR];
  882. +  u_char n_saids;
  883. +  uint16_t saids[MAX_NBR];
  884. +  
  885. +  //if mode == 0b010: attribute defined in mode 0b001
  886. +  //u_char tmp_bsid: 3;
  887. +  //u_char ak_change_indicator: 1;
  888. +  
  889. +  //if mode == 0b011
  890. +  u_char n_new_bs: 3;
  891. +  mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  892. +  u_char n_current_bs: 3;
  893. +  mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  894. +  //also include the following elements defined in mode 0b001
  895. +  //u_char tmp_bsid: 3;
  896. +  //u_char ak_change_indicator: 1;
  897. +  //u_char n_cids;
  898. +  //uint16_t cids[MAX_NBR];
  899. +  //u_char n_saids;
  900. +  //uint16_t saids[MAX_NBR];
  901. +  
  902. +  //if mode == 0b100, include the following attributes (already defined)
  903. +  //u_char n_new_bs: 3;
  904. +  //mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  905. +  //u_char n_current_bs: 3;
  906. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  907. +  //u_char tmp_bsid: 3;
  908. +  //u_char ak_change_indicator: 1;
  909. +  
  910. +  //if mode == 0b101
  911. +  //u_char n_new_bs: 3;
  912. +  //u_char n_cids;
  913. +  //u_char n_saids;
  914. +  mac802_16_mob_bsho_req_mode_new_bs2 new_bs2[MAX_NBR];
  915. +  //u_char n_current_bs: 3;
  916. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[];
  917. +  //u_char tmp_bsid: 3;
  918. +  //u_char ak_change_indicator: 1;
  919. +  
  920. +  //if mode == 0b110
  921. +  //u_char n_new_bs: 3;
  922. +  //u_char n_cids;
  923. +  //u_char n_saids;
  924. +  mac802_16_mob_bsho_req_mode_new_bs3 new_bs3[MAX_NBR];
  925. +  //u_char n_current_bs: 3;
  926. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[];
  927. +  //u_char tmp_bsid: 3;
  928. +  //u_char ak_change_indicator: 1;
  929. +
  930. +  u_char action_time: 7;
  931. +  /* TLV information */
  932. +};
  933. +
  934. +/** Structure for MSHO request */
  935. +struct mac802_16_mob_msho_req_bs_index {
  936. +  u_char neighbor_bs_index;
  937. +  u_char preamble_index;
  938. +  u_char bs_cinr_mean; //if report_metric[0]==1
  939. +  u_char bs_rssi_mean; //if report_metric[1]==1
  940. +  u_char relative_delay; //if report_metric[2]==1
  941. +  u_char service_level_prediction: 3;
  942. +  u_char arrival_time_diff_ind: 1;
  943. +  //next if arrival_time_diff_ind==1
  944. +  u_char arrival_time_diff: 4;
  945. +};
  946. +
  947. +/** Structure for MSHO request */
  948. +struct mac802_16_mob_msho_req_current_bs {
  949. +  u_char temp_bsid: 4;
  950. +  u_char bs_cinr_mean; //if report_metric[0]==1
  951. +  u_char bs_rssi_mean; //if report_metric[1]==1
  952. +  u_char relative_delay; //if report_metric[2]==1
  953. +  u_char bs_rtd; //if report_metric[3]==1
  954. +};
  955. +
  956. +/** MSHO request frame */
  957. +struct mac802_16_mob_msho_req_frame {
  958. +  u_char type; //57
  959. +  u_char report_metric;
  960. +  u_char n_new_bs_index;
  961. +  //next if n_recommended_bs_index !=0
  962. +  u_char ccc_mob_nbr_adv;
  963. +  mac802_16_mob_msho_req_bs_index bs_index[MAX_NBR];
  964. +  //end 
  965. +  u_char n_new_bs_full;
  966. +  mac802_16_mob_msho_req_bs_index bs_full[MAX_NBR];
  967. +  u_char n_current_bs;
  968. +  mac802_16_mob_msho_req_current_bs bs_current[MAX_NBR];
  969. +  /* other TLV information */
  970. +};
  971. +
  972. +/** Structure for BSHO response */
  973. +struct mac802_16_mob_bsho_rsp_rec {
  974. +  int neighbor_bsid; /* 6 bytes */
  975. +  u_char preamble_index;
  976. +  u_char service_level_prediction;
  977. +  u_char ho_process_optimization;
  978. +  u_char net_assisted_ho_supported: 1;
  979. +  u_char ho_id_included_indicator: 1;
  980. +  //if ho_id_included_indicator==1
  981. +  u_char ho_id;
  982. +  //end if
  983. +  u_char ho_autho_policy_indicator: 1;
  984. +  //if ho_autho_policy_indicator==1
  985. +  u_char ho_autho_policy_support;
  986. +  //end if
  987. +  
  988. +};
  989. +
  990. +/** Structure for BSHO response */
  991. +struct mac802_16_mob_bsho_rsp_mode_new_bs2 {
  992. +  int neighbor_bsid; /* 6 bytes */
  993. +  u_char temp_bsid: 3;
  994. +  uint16_t new_cid[];
  995. +};
  996. +
  997. +/** BSHO response frame */
  998. +struct mac802_16_mob_bsho_rsp_frame {
  999. +  u_char type; //58
  1000. +  u_char mode: 3;
  1001. +  
  1002. +  //if mode == 0b000
  1003. +  u_char ho_operation_mode: 1;
  1004. +  u_char n_recommended;
  1005. +  u_char resource_retain_flag: 1;
  1006. +  mac802_16_mob_bsho_rsp_rec n_rec[MAX_NBR];
  1007. +
  1008. +  //if mode == 0b001
  1009. +  u_char tmp_bsid: 3;
  1010. +  u_char ak_change_indicator: 1;
  1011. +  u_char n_cids;
  1012. +  uint16_t cids[MAX_NBR];
  1013. +  u_char n_saids;
  1014. +  uint16_t saids[MAX_NBR];
  1015. +
  1016. +  //if mode == 0b010
  1017. +  //u_char tmp_bsid: 3;
  1018. +  //u_char ak_change_indicator: 1;
  1019. +
  1020. +  //if mode == 0b011
  1021. +  u_char n_new_bs: 3;
  1022. +  mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  1023. +  u_char n_current_bs: 3;
  1024. +  mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1025. +  //also include the following elements defined in mode 0b001
  1026. +  //u_char tmp_bsid: 3;
  1027. +  //u_char ak_change_indicator: 1;
  1028. +  //u_char n_cids;
  1029. +  //uint16_t cids[MAX_NBR];
  1030. +  //u_char n_saids;
  1031. +  //uint16_t saids[MAX_NBR];
  1032. +
  1033. +  //if mode == 0b100
  1034. +  //u_char n_new_bs: 3;
  1035. +  //mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR]; //same struct as req
  1036. +  //u_char n_current_bs: 3;
  1037. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR]; //same as req
  1038. +  //u_char tmp_bsid: 3;
  1039. +  //u_char ak_change_indicator: 1;
  1040. +
  1041. +  //if mode == 0b101
  1042. +  //u_char n_new_bs: 3;
  1043. +  //u_char n_cids;
  1044. +  mac802_16_mob_bsho_rsp_mode_new_bs2 new_bs2[MAX_NBR];
  1045. +  //u_char n_current_bs: 3;
  1046. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1047. +  //u_char tmp_bsid: 3;
  1048. +  //u_char ak_change_indicator: 1;
  1049. +  
  1050. +  //if mode == 0b110
  1051. +  //u_char n_new_bs: 3;
  1052. +  //u_char n_cids;
  1053. +  //u_char n_saids;
  1054. +  mac802_16_mob_bsho_req_mode_new_bs3 new_bs3[MAX_NBR]; //same as request
  1055. +  //u_char n_current_bs: 3;
  1056. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1057. +  //u_char tmp_bsid: 3;
  1058. +  //u_char ak_change_indicator: 1;
  1059. +
  1060. +  u_char action_time: 7;
  1061. +  /* TLV information */
  1062. +
  1063. +};
  1064. +
  1065. +/** Structure for Handover indication */
  1066. +struct mac802_16_mob_ho_ind_bs {
  1067. +  u_char temp_bsid: 3;
  1068. +};
  1069. +
  1070. +/** HO indication frame */
  1071. +struct mac802_16_mob_ho_ind_frame {
  1072. +  u_char type; //59
  1073. +  u_char mode: 2;
  1074. +  //if mode==0b00
  1075. +  u_char ho_ind_type: 2;
  1076. +  u_char rng_param_valid_ind: 2;
  1077. +  //next valid if ho_ind_type==0b00
  1078. +  int target_bsid; /* 6 bytes */
  1079. +  
  1080. +  //if mode==0b01
  1081. +  u_char mdhofbss_ind_type: 2;
  1082. +  //next valid if mdhofbss_ind_type==0b00
  1083. +  u_char bsid: 3;
  1084. +  u_char action_time;
  1085. +  //end valid if mdhofbss_ind_type==0b00
  1086. +
  1087. +  //if mode==0b10
  1088. +  //u_char mdhofbss_ind_type: 2;
  1089. +  //next valid if mdhofbss_ind_type==0b00
  1090. +  u_char diversity_set_included;
  1091. +  //next valid if diversity_set_included==1
  1092. +  u_char anchor_bsid: 3;
  1093. +  u_char n_bs;
  1094. +  mac802_16_mob_ho_ind_bs bs[MAX_NBR];
  1095. +  //end valid if diversity_set_included==1
  1096. +  //u_char action_time;
  1097. +  //end valid if mdhofbss_ind_type==0b00
  1098. +  u_char preamble_index;
  1099. +  
  1100. +  /* TLV information */
  1101. +};
  1102. +
  1103. +/** This class contains helpers for manipulating 802.16 messages
  1104. + *  and getting the packet size 
  1105. + */
  1106. +class Mac802_16pkt {
  1107. + public:
  1108. +  /**
  1109. +   * Return the size of the MOB_NBR-ADV frame
  1110. +   * @param frame The frame 
  1111. +   */
  1112. +  static int getMOB_NBR_ADV_size(mac802_16_mob_nbr_adv_frame *frame);
  1113. +
  1114. +  /**
  1115. +   * Return the size of the MOB_SCN-REQ 
  1116. +   * @param frame The frame 
  1117. +   */
  1118. +  static int getMOB_SCN_REQ_size(mac802_16_mob_scn_req_frame *frame);
  1119. +
  1120. +  /**
  1121. +   * Return the size of the MOB_SCN-RSP 
  1122. +   * @param frame The frame 
  1123. +   */
  1124. +  static int getMOB_SCN_RSP_size(mac802_16_mob_scn_rsp_frame *frame);
  1125. +
  1126. +  /**
  1127. +   * Return the size of the MOB_MSHO-REQ 
  1128. +   * @param frame The frame 
  1129. +   */
  1130. +  static int getMOB_MSHO_REQ_size(mac802_16_mob_msho_req_frame *frame);
  1131. +
  1132. +  /**
  1133. +   * Return the size of the MOB_BSHO-RSP 
  1134. +   * @param frame The frame 
  1135. +   */
  1136. +  static int getMOB_BSHO_RSP_size(mac802_16_mob_bsho_rsp_frame *frame);
  1137. +
  1138. +  /**
  1139. +   * Return the size of the MOB_HO-IND 
  1140. +   * @param frame The frame 
  1141. +   */
  1142. +  static int getMOB_HO_IND_size(mac802_16_mob_ho_ind_frame *frame);
  1143. +};
  1144. +
  1145. +
  1146. +#endif
  1147. diff -Naur ns-2.29-org/wimax/mac802_16pkt.h~ ns-2.29/wimax/mac802_16pkt.h~
  1148. --- ns-2.29-org/wimax/mac802_16pkt.h~ 1969-12-31 19:00:00.000000000 -0500
  1149. +++ ns-2.29/wimax/mac802_16pkt.h~ 2006-09-22 17:27:47.000000000 -0400
  1150. @@ -0,0 +1,908 @@
  1151. +/* This software was developed at the National Institute of Standards and
  1152. + * Technology by employees of the Federal Government in the course of
  1153. + * their official duties. Pursuant to title 17 Section 105 of the United
  1154. + * States Code this software is not subject to copyright protection and
  1155. + * is in the public domain.
  1156. + * NIST assumes no responsibility whatsoever for its use by other parties,
  1157. + * and makes no guarantees, expressed or implied, about its quality,
  1158. + * reliability, or any other characteristic.
  1159. + * <BR>
  1160. + * We would appreciate acknowledgement if the software is used.
  1161. + * <BR>
  1162. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  1163. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  1164. + * FROM THE USE OF THIS SOFTWARE.
  1165. + * </PRE></P>
  1166. + * @author  rouil
  1167. + */
  1168. +
  1169. +#ifndef MAC802_16PKT_H
  1170. +#define MAC802_16PKT_H
  1171. +
  1172. +#include "packet.h"
  1173. +#include "ofdmphy.h"
  1174. +
  1175. +//#define HDR_MAC802_16(p) ((hdr_mac802_16 *)hdr_mac::access(p))
  1176. +#define HDR_MAC802_16(p) (hdr_mac802_16::access(p))
  1177. +#define HDR_MAC802_16_SIZE 6
  1178. +#define HDR_MAC802_16_FRAGSUB_SIZE 2
  1179. +
  1180. +/** Define fragmentation encoding */
  1181. +enum fragment_status {
  1182. +  FRAG_NOFRAG = 0,
  1183. +  FRAG_LAST,
  1184. +  FRAG_FIRST,
  1185. +  FRAG_CONT
  1186. +};
  1187. +  
  1188. +/** Define Mac management type */
  1189. +enum mngmt_type {
  1190. +  MAC_UCD = 0,
  1191. +  MAC_DCD,
  1192. +  MAC_DL_MAP,
  1193. +  MAC_UL_MAP,
  1194. +  MAC_RNG_REQ,
  1195. +  MAC_RNG_RSP,
  1196. +  MAC_REG_REQ,
  1197. +  MAC_REG_RSP,
  1198. +  // 8: reserved
  1199. +  // 9-10: Privacy key, not used 
  1200. +  MAC_DSA_REQ=11,
  1201. +  MAC_DSA_RSP,
  1202. +  MAC_DSA_ACK,
  1203. +  
  1204. +  MAC_MOB_NBR_ADV=53,
  1205. +  MAC_MOB_SCN_REQ,
  1206. +  MAC_MOB_SCN_RSP,
  1207. +  MAC_MOB_BSHO_REQ,
  1208. +  MAC_MOB_MSHO_REQ,
  1209. +  MAC_MOB_BSHO_RSP,
  1210. +  MAC_MOB_HO_IND,
  1211. +  MAC_MOB_SCN_REP,
  1212. +  MAC_MOB_ASC_REP=66
  1213. +};
  1214. +
  1215. +/** Enumeration of scanning types */
  1216. +enum wimax_scanning_type {
  1217. +  SCAN_WITHOUT_ASSOC,
  1218. +  SCAN_ASSOC_LVL0,
  1219. +  SCAN_ASSOC_LVL1,
  1220. +  SCAN_ASSOC_LVL2
  1221. +};
  1222. +
  1223. +/** Structure containing physical layer information */
  1224. +struct phy_info_t {
  1225. +  double freq_;              //the frequency at which it is sent
  1226. +  Ofdm_mod_rate modulation_; //modulation at which the packet was sent
  1227. +  double g_; //The cyclic prefix information. Used for synchronization
  1228. +};
  1229. +
  1230. +/** Define generic MAC header */
  1231. +struct gen_mac_header_t {
  1232. +  u_char ht : 1;
  1233. +  u_char ec : 1;
  1234. +  u_char type : 6;
  1235. +  u_char rsv1: 1;
  1236. +  u_char ci: 1;
  1237. +  u_char eks: 2;
  1238. +  u_char rsv2: 1;
  1239. +  u_int16_t len: 11;
  1240. +  u_int16_t cid;
  1241. +  u_char hcs;
  1242. +};
  1243. +
  1244. +/** Define bandwidth request header */
  1245. +struct bw_req_header_t {
  1246. +  u_char ht : 1;
  1247. +  u_char ec : 1;
  1248. +  u_char type : 3;  
  1249. +  u_int32_t br : 19;
  1250. +  u_int16_t cid;
  1251. +  u_char hcs;  
  1252. +};
  1253. +
  1254. +/** Define structure for packet information */
  1255. +struct hdr_mac802_16
  1256. +{
  1257. +  //virtual info for physical layer
  1258. +  phy_info_t phy_info;
  1259. +  
  1260. +  //generic mac header or bw request header
  1261. +  gen_mac_header_t header;
  1262. +
  1263. +  //check how to put the subheaders (piggyback)
  1264. +  bool frag_subheader; //set to true if there is a fragmentation subheader
  1265. +  char fc : 2;  //00:no fragmentation, 01:last, 10: first, 11: middle 
  1266. +  char fsn : 3; //fragmentation number 
  1267. +
  1268. +  //for management frames, we put 
  1269. +  //payload in the packet payload
  1270. +  //because the size changes
  1271. +
  1272. +  //Packet header access functions
  1273. +  static int offset_;
  1274. +  inline static int& offset() {return offset_;}
  1275. +  inline static hdr_mac802_16* access(const Packet* p)
  1276. +  {
  1277. +    return (hdr_mac802_16*) p->access(offset_);
  1278. +  }
  1279. +};
  1280. +
  1281. +/**** Defines some constant for the maximum size of messages ****/
  1282. +/* When sending a packet, the message is copied for each 
  1283. + * destination. In that case, we need to store all the information
  1284. + * in the packet itself and not use pointer. We then use arrays.
  1285. + */
  1286. +#define MAX_MAP_IE  10
  1287. +#define MAX_PROFILE 10
  1288. +#define MAX_NBR     10
  1289. +
  1290. +/**** Defines IEs ****/
  1291. +/** Defines DL_MAP IE (see p462.) */
  1292. +struct mac802_16_dlmap_ie {
  1293. +  u_int16_t cid;
  1294. +  u_char diuc : 4;            //p463
  1295. +  u_char preamble : 1;
  1296. +  u_int16_t start_time : 11;
  1297. +  //may contain extended info
  1298. +};
  1299. +#define DL_MAP_IE_SIZE 4
  1300. +
  1301. +/** fast Ranging IE (802.16e) */
  1302. +struct mac802_16_fast_ranging_ie {
  1303. +  int mac_addr;  //48 bits
  1304. +  u_char uiuc : 4; 
  1305. +  u_int16_t duration : 12; //in OFDM symbols
  1306. +};
  1307. +#define FAST_RANGING_IE_SIZE 9
  1308. +
  1309. +/** Defines UL_MAP IE (see p464.) */
  1310. +struct mac802_16_ulmap_ie {
  1311. +  u_int16_t cid;
  1312. +  u_int16_t start_time : 11;
  1313. +  u_char sub_channel_index : 5;
  1314. +  u_char uiuc : 4;
  1315. +  u_int16_t duration : 11;
  1316. +  u_char midamble_rep : 2;
  1317. +  //may contain additional info depending on uiuc
  1318. +  u_char extended_uiuc : 4;
  1319. +  u_char length : 4;
  1320. +  mac802_16_fast_ranging_ie fast_ranging;
  1321. +};
  1322. +#define UL_MAP_IE_SIZE 6
  1323. +
  1324. +/**** Defines burst profiles ****/
  1325. +
  1326. +/* Burst profiles are TLV encoded...we just pick the info we 
  1327. + * are interested in.
  1328. + */
  1329. +/** Defines DCD profile */
  1330. +struct mac802_16_dcd_profile {
  1331. +  u_char diuc : 4;
  1332. +  u_int32_t frequency;
  1333. +  u_char fec;
  1334. +  //may have more info
  1335. +};
  1336. +#define DCD_PROFILE_SIZE 12
  1337. +
  1338. +/** Defines UCD profile */
  1339. +struct mac802_16_ucd_profile {
  1340. +  u_char uiuc : 4;
  1341. +  u_char fec;
  1342. +  //may have more info
  1343. +};
  1344. +#define UCD_PROFILE_SIZE 6
  1345. +
  1346. +/**** Defines frames ****/
  1347. +/** DCD frame */
  1348. +struct mac802_16_dcd_frame {
  1349. +  u_char type;
  1350. +  u_char dcid;
  1351. +  u_char config_change_count;
  1352. +  //info for all channels: TLV encoded
  1353. +  u_char frame_duration_code;
  1354. +  u_int32_t frame_number : 24;
  1355. +  u_char ttg;
  1356. +  u_char rtg;
  1357. +  u_int32_t frequency;
  1358. +  //downlink burst profiles
  1359. +  u_int32_t nb_prof;
  1360. +  mac802_16_dcd_profile profiles[MAX_PROFILE];
  1361. +};
  1362. +
  1363. +//+3 for the end of map profile
  1364. +#define GET_DCD_SIZE(X) 22+X*DCD_PROFILE_SIZE+3
  1365. +
  1366. +/** DL_MAP frame */
  1367. +struct mac802_16_dl_map_frame {
  1368. +  u_char type;
  1369. +  u_char dcd_count;
  1370. +  int bsid; //normaly 48 bits
  1371. +  //DL_MAP IEs
  1372. +  u_int32_t nb_ies;
  1373. +  mac802_16_dlmap_ie ies[MAX_MAP_IE]; 
  1374. +};
  1375. +
  1376. +//there is X IEs 
  1377. +#define GET_DL_MAP_SIZE(X) 8+X*DL_MAP_IE_SIZE
  1378. +
  1379. +/** UCD frame */
  1380. +struct mac802_16_ucd_frame {
  1381. +  u_char type;
  1382. +  u_char config_change_count;
  1383. +  u_char rng_backoff_start;
  1384. +  u_char rng_backoff_end;
  1385. +  u_char req_backoff_start;
  1386. +  u_char req_backoff_end;
  1387. +  //info for overall channel
  1388. +  /*
  1389. +  u_int16_t rsv_timeout;
  1390. +  */
  1391. +  u_int16_t bw_req_size;
  1392. +  u_int16_t rng_req_size;
  1393. +  //uplink burst profile
  1394. +  u_int32_t nb_prof;
  1395. +  mac802_16_ucd_profile profiles[MAX_PROFILE];
  1396. +};
  1397. +
  1398. +//+3 for the end of map profile
  1399. +#define GET_UCD_SIZE(X) 14+X*UCD_PROFILE_SIZE+3
  1400. +
  1401. +/** UL_MAP frame */
  1402. +struct mac802_16_ul_map_frame {
  1403. +  u_char type;
  1404. +  u_char ucid;
  1405. +  u_char ucd_count;
  1406. +  u_int32_t allocation_start;
  1407. +  //UL_MAP IEs
  1408. +  u_int32_t nb_ies;
  1409. +  mac802_16_ulmap_ie ies[MAX_MAP_IE];
  1410. +};
  1411. +
  1412. +#define GET_UL_MAP_SIZE(X) 7+X*UL_MAP_IE_SIZE
  1413. +
  1414. +/**** Defines ranging messages ****/
  1415. +/** Ranging request frame */
  1416. +struct mac802_16_rng_req_frame {
  1417. +  u_char type;
  1418. +  u_char dc_id;
  1419. +  /*TLV values*/
  1420. +  /* Requested Downlink Burst Profile
  1421. +   * bits 0-3: DIUC of the downlink burst profile
  1422. +   * bits 4-7: LSB of Configuration Change Count value
  1423. +   * of DCD defining the burst profile assocciated with DIUC
  1424. +   */
  1425. +  u_char req_dl_burst_profile;
  1426. +  int ss_mac_address; //should be 6 bytes
  1427. +  //u_char aas_bc_cap; //broadcast capability. optional
  1428. +};
  1429. +#define RNG_REQ_SIZE 13 //max value
  1430. +
  1431. +/** Ranging status */
  1432. +enum ranging_status {
  1433. +  RNG_CONTINUE = 1,
  1434. +  RNG_ABORT,
  1435. +  RNG_SUCCESS,
  1436. +  RNG_RERANGE
  1437. +};
  1438. +
  1439. +/** Ranging response frame */
  1440. +struct mac802_16_rng_rsp_frame {
  1441. +  u_char type;
  1442. +  u_char uc_id;
  1443. +  /*TLV values*/
  1444. +  u_char pw_adjust;
  1445. +  u_int32_t freq_adjust;
  1446. +  u_char rng_status;
  1447. +  /* byte 0: the least robust DIUC that may be used by BS for 
  1448. +   * transmissions to the SS
  1449. +   * byte 1: Configuration Change Count of DCD defining the burst profile
  1450. +   * associated with DIUC 
  1451. +   */
  1452. +  u_int16_t dl_op_burst_profile;
  1453. +  int ss_mac_address; //6 bytes
  1454. +  u_int16_t basic_cid;
  1455. +  u_int16_t primary_cid;
  1456. +  u_char aas_bc_perm; 
  1457. +};
  1458. +#define RNG_RSP_SIZE 28
  1459. +
  1460. +/**** Defines registration messages ****/
  1461. +/** Registration request frame */
  1462. +struct mac802_16_reg_req_frame {
  1463. +  u_char type;
  1464. +  /*TLV values*/
  1465. +  u_char ss_mngmt_support;
  1466. +  u_char ip_mngmt_support;
  1467. +  u_int16_t uplink_cid_support;
  1468. +  
  1469. +};
  1470. +#define REG_REQ_SIZE 12
  1471. +
  1472. +/** Registration response frame */
  1473. +struct mac802_16_reg_rsp_frame {
  1474. +  u_char type;
  1475. +  u_char response;
  1476. +  /*TLV values*/
  1477. +  u_char ss_mngmt_support;
  1478. +  u_int16_t sec_mngmt_cid;
  1479. +};
  1480. +#define REG_RSP_SIZE 12
  1481. +
  1482. +/**** Defines Dynamic Service Addition messages ****/
  1483. +/** DSA request frame */
  1484. +struct mac802_16_dsa_req_frame {
  1485. +  u_char type; //11
  1486. +  u_int16_t transaction_id;
  1487. +  /*TLV values*/
  1488. +  bool uplink; //direction of the flow, normaly coded in TLV with
  1489. +               //type 145 or 146 (see p647).
  1490. +  u_int16_t cid;
  1491. +};
  1492. +//parameter X indicates if cid is present (i.e request from BS)
  1493. +#define GET_DSA_REQ_SIZE(X) 6+4*X
  1494. +
  1495. +/** DSA response frame */
  1496. +struct mac802_16_dsa_rsp_frame {
  1497. +  u_char type; //12
  1498. +  u_int16_t transaction_id;
  1499. +  u_char confirmation_code;
  1500. +  /*TLV values*/
  1501. +  bool uplink; //direction of the flow, normaly coded in TLV with
  1502. +               //type 145 or 146 (see p647).
  1503. +  u_int16_t cid;
  1504. +};
  1505. +//parameter X indicates if cid is present (i.e response from BS)
  1506. +#define GET_DSA_RSP_SIZE(X) 6+4*X
  1507. +
  1508. +/** DSA Acknowledgement frame */
  1509. +struct mac802_16_dsa_ack_frame {
  1510. +  u_char type; //13
  1511. +  u_int16_t transaction_id;
  1512. +  u_char confirmation_code;
  1513. +  /*TLV values*/
  1514. +  bool uplink; //direction of the flow, normaly coded in TLV with
  1515. +               //type 145 or 146 (see p647).
  1516. +};
  1517. +#define DSA_ACK_SIZE 6
  1518. +
  1519. +
  1520. +/**** Defines Mobility messages (802.16e) ****/
  1521. +/** Structure of physical profile ID */
  1522. +struct mac802_16_phy_profile_id {
  1523. +  u_char colocatedFA: 1;
  1524. +  u_char FAconfig: 1;
  1525. +  u_char timefreq_synch: 2;
  1526. +  u_char bs_eirp: 1;
  1527. +  u_char dcducd_ref: 1;
  1528. +  u_char FAindex: 1;
  1529. +  u_char trigger_ref: 1;
  1530. +};
  1531. +
  1532. +/** Structure of physical mode ID */
  1533. +struct mac802_16_phy_mode_id {
  1534. +  u_char bandwidth: 7;
  1535. +  u_char fttsize: 3;
  1536. +  u_char cp: 2;
  1537. +  u_char duration_code: 4;
  1538. +};
  1539. +
  1540. +/** Information about a neighbor BS */
  1541. +struct mac802_16_nbr_adv_info {
  1542. +  u_char length;
  1543. +  mac802_16_phy_profile_id phy_profile_id;
  1544. +  u_char fa_index; //if FA index indicator=1 in phy_profile_id
  1545. +  u_char bs_eirp;
  1546. +  int nbr_bsid;    
  1547. +  u_char preamble_index; //in OFDM, 5lsb=
  1548. +  u_char ho_process_opt;
  1549. +  u_char sched_srv_supported;
  1550. +  u_char dcd_ccc: 4;
  1551. +  u_char ucd_ccc: 4;
  1552. +  /* other TLV information */
  1553. +  bool dcd_included; //tell if the dcd is included
  1554. +  mac802_16_dcd_frame dcd_settings;
  1555. +  bool ucd_included; //tell if the ucd is included
  1556. +  mac802_16_ucd_frame ucd_settings;
  1557. +  bool phy_included; //tell if the phy mode ID is included
  1558. +  mac802_16_phy_mode_id phy_mode_id;
  1559. +};
  1560. +
  1561. +/** Neighbor advertisment frame */
  1562. +struct mac802_16_mob_nbr_adv_frame {
  1563. +  u_char type; //53
  1564. +  u_char skip_opt_field;
  1565. +  u_int32_t operatorID: 24;
  1566. +  u_char ccc;
  1567. +  u_char frag_index: 4;
  1568. +  u_char total_frag: 4;
  1569. +  u_char n_neighbors; //number of neighbors
  1570. +  mac802_16_nbr_adv_info nbr_info[MAX_NBR];
  1571. +};
  1572. +
  1573. +/** Code BS using index in scan request */
  1574. +struct mac802_16_mob_scn_req_bs_index {
  1575. +  u_char neighbor_bs_index;
  1576. +  u_char scanning_type: 3; //0: scanning without association
  1577. +                           //1: scanning+assoc level 0
  1578. +                           //2: scanning+assoc level 1
  1579. +                           //3: scanning+assoc level 2
  1580. +                           //4-7: reserved
  1581. +};
  1582. +/** Code BS using full address in scan request */
  1583. +struct mac802_16_mob_scn_req_bs_full {
  1584. +  int recommended_bs_id;   /* 6 bytes */
  1585. +  u_char scanning_type: 3; //0: scanning without association
  1586. +                           //1: scanning+assoc level 0
  1587. +                           //2: scanning+assoc level 1
  1588. +                           //3: scanning+assoc level 2
  1589. +                           //4-7: reserved
  1590. +};
  1591. +
  1592. +/** Scan request frame */
  1593. +struct mac802_16_mob_scn_req_frame {
  1594. +  u_char type; //54
  1595. +  u_char scan_duration; //units of frames
  1596. +  u_char interleaving_interval; //units of frames
  1597. +  u_char scan_iteration; //in frame
  1598. +  u_char n_recommended_bs_index; //number of BS recommended
  1599. +  u_char ccc; //present if n_recommended_bs_index!= 0
  1600. +  mac802_16_mob_scn_req_bs_index rec_bs_index[MAX_NBR];
  1601. +  u_char n_recommended_bs_full;
  1602. +  mac802_16_mob_scn_req_bs_full rec_bs_full[MAX_NBR];
  1603. +  /* TLV info*/
  1604. +};
  1605. +
  1606. +/** Code BS using index in scan response */
  1607. +struct mac802_16_mob_scn_rsp_bs_index {
  1608. +  u_char neighbor_bs_index;
  1609. +  u_char scanning_type: 3; //0: scanning without association
  1610. +                           //1: scanning+assoc level 0
  1611. +                           //2: scanning+assoc level 1
  1612. +                           //3: scanning+assoc level 2
  1613. +                           //4-7: reserved
  1614. +  /* next present if scanning is 2 or 3*/
  1615. +  u_char rdv_time;
  1616. +  u_char cdma_code;
  1617. +  u_char transmission_opp_offset;
  1618. +};
  1619. +
  1620. +/** Code BS using full address in scan response */
  1621. +struct mac802_16_mob_scn_rsp_bs_full {
  1622. +  int recommended_bs_id;   /* 6 bytes */
  1623. +  u_char scanning_type: 3; //0: scanning without association
  1624. +                           //1: scanning+assoc level 0
  1625. +                           //2: scanning+assoc level 1
  1626. +                           //3: scanning+assoc level 2
  1627. +                           //4-7: reserved
  1628. +  /* next present if scanning is 2 or 3*/
  1629. +  u_char rdv_time;
  1630. +  u_char cdma_code;
  1631. +  u_char transmission_opp_offset;
  1632. +};
  1633. +
  1634. +/** Scan response frame */
  1635. +struct mac802_16_mob_scn_rsp_frame {
  1636. +  u_char type; //55
  1637. +  u_char scan_duration; //units of frames
  1638. +  u_char report_mode: 2;
  1639. +  u_char report_period;
  1640. +  u_char report_metric;
  1641. +  /*next information present only if scan duration !=0*/
  1642. +  u_char start_frame: 4;
  1643. +  u_char interleaving_interval;
  1644. +  u_char scan_iteration;
  1645. +  u_char n_recommended_bs_index;
  1646. +  //next if n_recommended_bs_index !=0
  1647. +  u_char ccc_mob_nbr_adv;
  1648. +  mac802_16_mob_scn_rsp_bs_index rec_bs_index[MAX_NBR];
  1649. +  u_char n_recommended_bs_full;
  1650. +  mac802_16_mob_scn_rsp_bs_full rec_bs_full[MAX_NBR];
  1651. +  /* end if scan duration !=0 */
  1652. +  /* TLV information */
  1653. +};
  1654. +
  1655. +/** Measurements about current BS */
  1656. +struct mac802_16_mob_scn_rep_current_bs {
  1657. +  u_char temp_bsid: 4;
  1658. +  u_char bs_cinr_mean; //if report_metric[0]==1
  1659. +  u_char bs_rssi_mean; //if report_metric[1]==1
  1660. +  u_char relative_delay; //if report_metric[2]==1
  1661. +  u_char bs_rtd; //if report_metric[3]==1
  1662. +};
  1663. +
  1664. +/** Measurements about neighbor BS using index */
  1665. +struct mac802_16_mob_scn_rep_bs_index {
  1666. +  u_char neighbor_bs_index;
  1667. +  u_char bs_cinr_mean; //if report_metric[0]==1
  1668. +  u_char bs_rssi_mean; //if report_metric[1]==1
  1669. +  u_char relative_delay; //if report_metric[2]==1
  1670. +};
  1671. +
  1672. +/** Measurements about neighbor BS using full address */
  1673. +struct mac802_16_mob_scn_rep_bs_full {
  1674. +  int neighbor_bs_id; /* 6 bytes */
  1675. +  u_char bs_cinr_mean; //if report_metric[0]==1
  1676. +  u_char bs_rssi_mean; //if report_metric[1]==1
  1677. +  u_char relative_delay; //if report_metric[2]==1
  1678. +};
  1679. +
  1680. +/** Scan report frame */
  1681. +struct mac802_16_mob_scn_rep_frame {
  1682. +  u_char type; //60
  1683. +  u_char report_mode: 1;
  1684. +  u_char comp_nbr_bsid_ind: 1;
  1685. +  u_char n_current_bs: 3;
  1686. +  u_char report_metric: 8;
  1687. +  mac802_16_mob_scn_res_current_bs current_bs[MAX_NBR];
  1688. +  u_char n_neighbor_bs_index;
  1689. +  //next if n_recommended_bs_index !=0
  1690. +  u_char ccc_mob_nbr_adv;
  1691. +  mac802_16_mob_scn_rep_bs_index nbr_bs_index[MAX_NBR];
  1692. +  u_char n_recommended_bs_full;
  1693. +  mac802_16_mob_scn_rep_bs_full nbr_bs_full[MAX_NBR];
  1694. +  /* other TLV information */
  1695. +};
  1696. +
  1697. +/** Code BS using index in association result report */
  1698. +struct mac802_16_mob_asc_rep_bs_index {
  1699. +  u_char neighbor_bs_index;
  1700. +  uint32_t timing_adjust;
  1701. +  u_char power_level_adjust;
  1702. +  uint32_t offset_freq_adjust;
  1703. +  u_char rng_status;
  1704. +  u_char service_level_prediction;
  1705. +};
  1706. +
  1707. +/** Code BS using address in association result report */
  1708. +struct mac802_16_mob_asc_rep_bs_full {
  1709. +  int neighbor_bs_id; /* 6 bytes */
  1710. +  uint32_t timing_adjust;
  1711. +  u_char power_level_adjust;
  1712. +  uint32_t offset_freq_adjust;
  1713. +  u_char rng_status;
  1714. +  u_char service_level_prediction;
  1715. +};
  1716. +
  1717. +/** Association result report frame */
  1718. +struct mac802_16_mob_asc_rep_frame {
  1719. +  u_char type; //66
  1720. +  u_char n_recommended_bs_index;
  1721. +  //next if n_recommended_bs_index !=0
  1722. +  u_char ccc_mob_nbr_adv;
  1723. +  mac802_16_mob_asc_rep_bs_index rec_bs_index[MAX_NBR];
  1724. +  u_char n_recommended_bs_full;
  1725. +  mac802_16_mob_asc_rep_bs_full rec_bs_full[MAX_NBR];
  1726. +}; 
  1727. +
  1728. +/** Code request in mode 000 (HO request) */
  1729. +struct mac802_16_mob_bsho_req_mode_000 {
  1730. +  int neighbor_bsid; /* 6 bytes */
  1731. +  u_char service_level_prediction;
  1732. +  u_char preamble_index;
  1733. +  u_char ho_process_optimization;
  1734. +  u_char net_assisted_ho_supported: 1;
  1735. +  u_char ho_id_included_indicator: 1;
  1736. +  u_char ho_autho_policy_indicator: 1;
  1737. +  //if ho_id_included_indicator==1
  1738. +  u_char ho_id;
  1739. +  //if ho_autho_policy_indicator==1
  1740. +  u_char ho_autho_policy_support;
  1741. +};
  1742. +
  1743. +/** Structure for BSHO request */
  1744. +struct mac802_16_mob_bsho_req_mode_new_bs {
  1745. +  int neighbor_bsid; /* 6 bytes */
  1746. +  u_char temp_bsid: 3;
  1747. +};
  1748. +
  1749. +/** Structure for BSHO request */
  1750. +struct mac802_16_mob_bsho_req_mode_new_bs2 {
  1751. +  int neighbor_bsid; /* 6 bytes */
  1752. +  u_char temp_bsid: 3;
  1753. +  uint16_t new_cid[MAX_NBR];
  1754. +  uint16_t new_said[MAX_NBR];
  1755. +};
  1756. +
  1757. +/** Structure for BSHO request */
  1758. +struct mac802_16_mob_bsho_req_mode_new_bs3 {
  1759. +  int neighbor_bsid; /* 6 bytes */
  1760. +  u_char temp_bsid: 3;
  1761. +  uint16_t new_cid[MAX_NBR];
  1762. +  uint16_t new_said[MAX_NBR];
  1763. +  int cqich_id; //variable 
  1764. +  u_char feedback_channel_off: 6;
  1765. +  u_char period: 2;
  1766. +  u_char frame_offset: 3;
  1767. +  u_char duration: 3;
  1768. +  u_char mimo_permutation_feedback: 2; 
  1769. +};
  1770. +
  1771. +/** Structure for BSHO request */
  1772. +struct mac802_16_mob_bsho_req_mode_current_bs {
  1773. +  u_char temp_bsid: 3;
  1774. +};
  1775. +
  1776. +/** BSHO request frame */
  1777. +struct mac802_16_mob_bsho_req_frame {
  1778. +  u_char type; //56
  1779. +  u_char net_assisted_ho_supported: 1;
  1780. +  u_char mode: 3;
  1781. +  //if mode == 0b000
  1782. +  u_char ho_op_mode: 1;
  1783. +  u_char n_recommended;
  1784. +  u_char resource_retain_flag: 1;
  1785. +  mac802_16_mob_bsho_req_mode_000 n_rec[];
  1786. +  //if mode == 0b001
  1787. +  u_char tmp_bsid: 3;
  1788. +  u_char ak_change_indicator: 1;
  1789. +  u_char n_cids;
  1790. +  uint16_t cids[MAX_NBR];
  1791. +  u_char n_saids;
  1792. +  uint16_t saids[MAX_NBR];
  1793. +  
  1794. +  //if mode == 0b010: attribute defined in mode 0b001
  1795. +  //u_char tmp_bsid: 3;
  1796. +  //u_char ak_change_indicator: 1;
  1797. +  
  1798. +  //if mode == 0b011
  1799. +  u_char n_new_bs: 3;
  1800. +  mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  1801. +  u_char n_current_bs: 3;
  1802. +  mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1803. +  //also include the following elements defined in mode 0b001
  1804. +  //u_char tmp_bsid: 3;
  1805. +  //u_char ak_change_indicator: 1;
  1806. +  //u_char n_cids;
  1807. +  //uint16_t cids[MAX_NBR];
  1808. +  //u_char n_saids;
  1809. +  //uint16_t saids[MAX_NBR];
  1810. +  
  1811. +  //if mode == 0b100, include the following attributes (already defined)
  1812. +  //u_char n_new_bs: 3;
  1813. +  //mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  1814. +  //u_char n_current_bs: 3;
  1815. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1816. +  //u_char tmp_bsid: 3;
  1817. +  //u_char ak_change_indicator: 1;
  1818. +  
  1819. +  //if mode == 0b101
  1820. +  //u_char n_new_bs: 3;
  1821. +  //u_char n_cids;
  1822. +  //u_char n_saids;
  1823. +  mac802_16_mob_bsho_req_mode_new_bs2 new_bs2[MAX_NBR];
  1824. +  //u_char n_current_bs: 3;
  1825. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[];
  1826. +  //u_char tmp_bsid: 3;
  1827. +  //u_char ak_change_indicator: 1;
  1828. +  
  1829. +  //if mode == 0b110
  1830. +  //u_char n_new_bs: 3;
  1831. +  //u_char n_cids;
  1832. +  //u_char n_saids;
  1833. +  mac802_16_mob_bsho_req_mode_new_bs3 new_bs3[MAX_NBR];
  1834. +  //u_char n_current_bs: 3;
  1835. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[];
  1836. +  //u_char tmp_bsid: 3;
  1837. +  //u_char ak_change_indicator: 1;
  1838. +
  1839. +  u_char action_time: 7;
  1840. +  /* TLV information */
  1841. +};
  1842. +
  1843. +/** Structure for MSHO request */
  1844. +struct mac802_16_mob_msho_req_bs_index {
  1845. +  u_char neighbor_bs_index;
  1846. +  u_char preamble_index;
  1847. +  u_char bs_cinr_mean; //if report_metric[0]==1
  1848. +  u_char bs_rssi_mean; //if report_metric[1]==1
  1849. +  u_char relative_delay; //if report_metric[2]==1
  1850. +  u_char service_level_prediction: 3;
  1851. +  u_char arrival_time_diff_ind: 1;
  1852. +  //next if arrival_time_diff_ind==1
  1853. +  u_char arrival_time_diff: 4;
  1854. +};
  1855. +
  1856. +/** Structure for MSHO request */
  1857. +struct mac802_16_mob_msho_req_current_bs {
  1858. +  u_char temp_bsid: 4;
  1859. +  u_char bs_cinr_mean; //if report_metric[0]==1
  1860. +  u_char bs_rssi_mean; //if report_metric[1]==1
  1861. +  u_char relative_delay; //if report_metric[2]==1
  1862. +  u_char bs_rtd; //if report_metric[3]==1
  1863. +};
  1864. +
  1865. +/** MSHO request frame */
  1866. +struct mac802_16_mob_msho_req_frame {
  1867. +  u_char type; //57
  1868. +  u_char report_metric;
  1869. +  u_char n_new_bs_index;
  1870. +  //next if n_recommended_bs_index !=0
  1871. +  u_char ccc_mob_nbr_adv;
  1872. +  mac802_16_mob_msho_req_bs_index bs_index[MAX_NBR];
  1873. +  //end 
  1874. +  u_char n_new_bs_full;
  1875. +  mac802_16_mob_msho_req_bs_index bs_full[MAX_NBR];
  1876. +  u_char n_current_bs;
  1877. +  mac802_16_mob_msho_req_current_bs bs_current[MAX_NBR];
  1878. +  /* other TLV information */
  1879. +};
  1880. +
  1881. +/** Structure for BSHO response */
  1882. +struct mac802_16_mob_bsho_rsp_rec {
  1883. +  int neighbor_bsid; /* 6 bytes */
  1884. +  u_char preamble_index;
  1885. +  u_char service_level_prediction;
  1886. +  u_char ho_process_optimization;
  1887. +  u_char net_assisted_ho_supported: 1;
  1888. +  u_char ho_id_included_indicator: 1;
  1889. +  //if ho_id_included_indicator==1
  1890. +  u_char ho_id;
  1891. +  //end if
  1892. +  u_char ho_autho_policy_indicator: 1;
  1893. +  //if ho_autho_policy_indicator==1
  1894. +  u_char ho_autho_policy_support;
  1895. +  //end if
  1896. +  
  1897. +};
  1898. +
  1899. +/** Structure for BSHO response */
  1900. +struct mac802_16_mob_bsho_rsp_mode_new_bs2 {
  1901. +  int neighbor_bsid; /* 6 bytes */
  1902. +  u_char temp_bsid: 3;
  1903. +  uint16_t new_cid[];
  1904. +};
  1905. +
  1906. +/** BSHO response frame */
  1907. +struct mac802_16_mob_bsho_rsp_frame {
  1908. +  u_char type; //58
  1909. +  u_char mode: 3;
  1910. +  
  1911. +  //if mode == 0b000
  1912. +  u_char ho_operation_mode: 1;
  1913. +  u_char n_recommended;
  1914. +  u_char resource_retain_flag: 1;
  1915. +  mac802_16_mob_bsho_rsp_rec n_rec[MAX_NBR];
  1916. +
  1917. +  //if mode == 0b001
  1918. +  u_char tmp_bsid: 3;
  1919. +  u_char ak_change_indicator: 1;
  1920. +  u_char n_cids;
  1921. +  uint16_t cids[MAX_NBR];
  1922. +  u_char n_saids;
  1923. +  uint16_t saids[MAX_NBR];
  1924. +
  1925. +  //if mode == 0b010
  1926. +  //u_char tmp_bsid: 3;
  1927. +  //u_char ak_change_indicator: 1;
  1928. +
  1929. +  //if mode == 0b011
  1930. +  u_char n_new_bs: 3;
  1931. +  mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  1932. +  u_char n_current_bs: 3;
  1933. +  mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1934. +  //also include the following elements defined in mode 0b001
  1935. +  //u_char tmp_bsid: 3;
  1936. +  //u_char ak_change_indicator: 1;
  1937. +  //u_char n_cids;
  1938. +  //uint16_t cids[MAX_NBR];
  1939. +  //u_char n_saids;
  1940. +  //uint16_t saids[MAX_NBR];
  1941. +
  1942. +  //if mode == 0b100
  1943. +  //u_char n_new_bs: 3;
  1944. +  //mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR]; //same struct as req
  1945. +  //u_char n_current_bs: 3;
  1946. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR]; //same as req
  1947. +  //u_char tmp_bsid: 3;
  1948. +  //u_char ak_change_indicator: 1;
  1949. +
  1950. +  //if mode == 0b101
  1951. +  //u_char n_new_bs: 3;
  1952. +  //u_char n_cids;
  1953. +  mac802_16_mob_bsho_rsp_mode_new_bs2 new_bs2[MAX_NBR];
  1954. +  //u_char n_current_bs: 3;
  1955. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1956. +  //u_char tmp_bsid: 3;
  1957. +  //u_char ak_change_indicator: 1;
  1958. +  
  1959. +  //if mode == 0b110
  1960. +  //u_char n_new_bs: 3;
  1961. +  //u_char n_cids;
  1962. +  //u_char n_saids;
  1963. +  mac802_16_mob_bsho_req_mode_new_bs3 new_bs3[MAX_NBR]; //same as request
  1964. +  //u_char n_current_bs: 3;
  1965. +  //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  1966. +  //u_char tmp_bsid: 3;
  1967. +  //u_char ak_change_indicator: 1;
  1968. +
  1969. +  u_char action_time: 7;
  1970. +  /* TLV information */
  1971. +
  1972. +};
  1973. +
  1974. +/** Structure for Handover indication */
  1975. +struct mac802_16_mob_ho_ind_bs {
  1976. +  u_char temp_bsid: 3;
  1977. +};
  1978. +
  1979. +/** HO indication frame */
  1980. +struct mac802_16_mob_ho_ind_frame {
  1981. +  u_char type; //59
  1982. +  u_char mode: 2;
  1983. +  //if mode==0b00
  1984. +  u_char ho_ind_type: 2;
  1985. +  u_char rng_param_valid_ind: 2;
  1986. +  //next valid if ho_ind_type==0b00
  1987. +  int target_bsid; /* 6 bytes */
  1988. +  
  1989. +  //if mode==0b01
  1990. +  u_char mdhofbss_ind_type: 2;
  1991. +  //next valid if mdhofbss_ind_type==0b00
  1992. +  u_char bsid: 3;
  1993. +  u_char action_time;
  1994. +  //end valid if mdhofbss_ind_type==0b00
  1995. +
  1996. +  //if mode==0b10
  1997. +  //u_char mdhofbss_ind_type: 2;
  1998. +  //next valid if mdhofbss_ind_type==0b00
  1999. +  u_char diversity_set_included;
  2000. +  //next valid if diversity_set_included==1
  2001. +  u_char anchor_bsid: 3;
  2002. +  u_char n_bs;
  2003. +  mac802_16_mob_ho_ind_bs bs[MAX_NBR];
  2004. +  //end valid if diversity_set_included==1
  2005. +  //u_char action_time;
  2006. +  //end valid if mdhofbss_ind_type==0b00
  2007. +  u_char preamble_index;
  2008. +  
  2009. +  /* TLV information */
  2010. +};
  2011. +
  2012. +/** This class contains helpers for manipulating 802.16 messages
  2013. + *  and getting the packet size 
  2014. + */
  2015. +class Mac802_16pkt {
  2016. + public:
  2017. +  /**
  2018. +   * Return the size of the MOB_NBR-ADV frame
  2019. +   * @param frame The frame 
  2020. +   */
  2021. +  static int getMOB_NBR_ADV_size(mac802_16_mob_nbr_adv_frame *frame);
  2022. +
  2023. +  /**
  2024. +   * Return the size of the MOB_SCN-REQ 
  2025. +   * @param frame The frame 
  2026. +   */
  2027. +  static int getMOB_SCN_REQ_size(mac802_16_mob_scn_req_frame *frame);
  2028. +
  2029. +  /**
  2030. +   * Return the size of the MOB_SCN-RSP 
  2031. +   * @param frame The frame 
  2032. +   */
  2033. +  static int getMOB_SCN_RSP_size(mac802_16_mob_scn_rsp_frame *frame);
  2034. +
  2035. +  /**
  2036. +   * Return the size of the MOB_MSHO-REQ 
  2037. +   * @param frame The frame 
  2038. +   */
  2039. +  static int getMOB_MSHO_REQ_size(mac802_16_mob_msho_req_frame *frame);
  2040. +
  2041. +  /**
  2042. +   * Return the size of the MOB_BSHO-RSP 
  2043. +   * @param frame The frame 
  2044. +   */
  2045. +  static int getMOB_BSHO_RSP_size(mac802_16_mob_bsho_rsp_frame *frame);
  2046. +
  2047. +  /**
  2048. +   * Return the size of the MOB_HO-IND 
  2049. +   * @param frame The frame 
  2050. +   */
  2051. +  static int getMOB_HO_IND_size(mac802_16_mob_ho_ind_frame *frame);
  2052. +};
  2053. +
  2054. +
  2055. +#endif
  2056. diff -Naur ns-2.29-org/wimax/mac802_16timer.cc ns-2.29/wimax/mac802_16timer.cc
  2057. --- ns-2.29-org/wimax/mac802_16timer.cc 1969-12-31 19:00:00.000000000 -0500
  2058. +++ ns-2.29/wimax/mac802_16timer.cc 2006-09-22 17:27:47.000000000 -0400
  2059. @@ -0,0 +1,318 @@
  2060. +/* This software was developed at the National Institute of Standards and
  2061. + * Technology by employees of the Federal Government in the course of
  2062. + * their official duties. Pursuant to title 17 Section 105 of the United
  2063. + * States Code this software is not subject to copyright protection and
  2064. + * is in the public domain.
  2065. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2066. + * and makes no guarantees, expressed or implied, about its quality,
  2067. + * reliability, or any other characteristic.
  2068. + * <BR>
  2069. + * We would appreciate acknowledgement if the software is used.
  2070. + * <BR>
  2071. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2072. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2073. + * FROM THE USE OF THIS SOFTWARE.
  2074. + * </PRE></P>
  2075. + * @author  rouil
  2076. + */
  2077. +
  2078. +#include "mac802_16timer.h"
  2079. +#include "mac802_16.h"
  2080. +#include "scheduling/wimaxscheduler.h"
  2081. +
  2082. +/* 
  2083. + * Starts a timer for the given duration
  2084. + * @param time The timer duration
  2085. + */
  2086. +void WimaxTimer::start(double time)
  2087. +{
  2088. +  Scheduler &s = Scheduler::instance();
  2089. +  assert(busy_ == 0);
  2090. +  busy_ = 1;
  2091. +  paused_ = 0;
  2092. +  stime = s.clock();
  2093. +  rtime = time;
  2094. +  assert(rtime >= 0.0);
  2095. +  s.schedule(this, &intr, rtime); //schedule the event
  2096. +}
  2097. +
  2098. +/*
  2099. + * Stop the timer
  2100. + */
  2101. +void WimaxTimer::stop(void)
  2102. +{
  2103. +  Scheduler &s = Scheduler::instance();
  2104. +  
  2105. +  assert(busy_);
  2106. +  
  2107. +  if(paused_ == 0)
  2108. +    s.cancel(&intr); //cancel the event
  2109. +  
  2110. +  busy_ = 0;
  2111. +  paused_ = 0;
  2112. +  stime = 0.0;
  2113. +  rtime = 0.0;
  2114. +}
  2115. +
  2116. +void WimaxTimer::pause(void)
  2117. +{
  2118. + Scheduler &s = Scheduler::instance();
  2119. +
  2120. + assert(busy_ && ! paused_);
  2121. +
  2122. + paused_ = 1;
  2123. + rtime -= s.clock()-stime;
  2124. +
  2125. + assert(rtime >= 0.0);
  2126. +
  2127. + s.cancel(&intr);
  2128. +}
  2129. +
  2130. +
  2131. +void WimaxTimer::resume(void)
  2132. +{
  2133. + Scheduler &s = Scheduler::instance();
  2134. +
  2135. + assert(busy_ && paused_);
  2136. +
  2137. + paused_ = 0;
  2138. + stime = s.clock();
  2139. +
  2140. + assert(rtime >= 0.0);
  2141. +        s.schedule(this, &intr, rtime );
  2142. +}
  2143. +
  2144. +
  2145. +
  2146. +/*
  2147. + * Handling function for WimaxFrameTimer
  2148. + * @param e The event that occured
  2149. + */
  2150. +void WimaxRxTimer::handle(Event *e)
  2151. +{
  2152. +  busy_ = 0;
  2153. +  paused_ = 0;
  2154. +  stime = 0.0;
  2155. +  rtime = 0.0;
  2156. +
  2157. +  mac->receive ();
  2158. +}
  2159. +
  2160. +/*
  2161. + * Handling function for WimaxFrameTimer
  2162. + * @param e The event that occured
  2163. + */
  2164. +void WimaxT1Timer::handle(Event *e)
  2165. +{
  2166. +  busy_ = 0;
  2167. +  paused_ = 0;
  2168. +  stime = 0.0;
  2169. +  rtime = 0.0;
  2170. +
  2171. +  mac->getScheduler()->expire(WimaxT1TimerID);
  2172. +}
  2173. +
  2174. +/*
  2175. + * Handling function for WimaxFrameTimer
  2176. + * @param e The event that occured
  2177. + */
  2178. +void WimaxT2Timer::handle(Event *e)
  2179. +{
  2180. +  busy_ = 0;
  2181. +  paused_ = 0;
  2182. +  stime = 0.0;
  2183. +  rtime = 0.0;
  2184. +
  2185. +  mac->getScheduler()->expire(WimaxT2TimerID);
  2186. +}
  2187. +
  2188. +/*
  2189. + * Handling function for WimaxT3Timer
  2190. + * @param e The event that occured
  2191. + */
  2192. +void WimaxT3Timer::handle(Event *e)
  2193. +{
  2194. +  busy_ = 0;
  2195. +  paused_ = 0;
  2196. +  stime = 0.0;
  2197. +  rtime = 0.0;
  2198. +
  2199. +  mac->getScheduler()->expire(WimaxT3TimerID);
  2200. +}
  2201. +
  2202. +/*
  2203. + * Handling function for WimaxT6Timer
  2204. + * @param e The event that occured
  2205. + */
  2206. +void WimaxT6Timer::handle(Event *e)
  2207. +{
  2208. +  busy_ = 0;
  2209. +  paused_ = 0;
  2210. +  stime = 0.0;
  2211. +  rtime = 0.0;
  2212. +
  2213. +  mac->getScheduler()->expire(WimaxT6TimerID);
  2214. +}
  2215. +
  2216. +/*
  2217. + * Handling function for WimaxT12Timer
  2218. + * @param e The event that occured
  2219. + */
  2220. +void WimaxT12Timer::handle(Event *e)
  2221. +{
  2222. +  busy_ = 0;
  2223. +  paused_ = 0;
  2224. +  stime = 0.0;
  2225. +  rtime = 0.0;
  2226. +
  2227. +  mac->getScheduler()->expire(WimaxT12TimerID);
  2228. +}
  2229. +
  2230. +/*
  2231. + * Handling function for WimaxT17Timer
  2232. + * @param e The event that occured
  2233. + */
  2234. +void WimaxT17Timer::handle(Event *e)
  2235. +{
  2236. +  busy_ = 0;
  2237. +  paused_ = 0;
  2238. +  stime = 0.0;
  2239. +  rtime = 0.0;
  2240. +
  2241. +  /** The node did not send a registration: release and
  2242. +   *  age out Basic and Primary CIDs
  2243. +   */
  2244. +  PeerNode * peer = mac->getPeerNode (peerIndex_);
  2245. +  mac->debug ("At %f in Mac %d did not register on time...release CIDsn", NOW, mac->addr(),peerIndex_);
  2246. +  mac->removePeerNode (peer);
  2247. +}
  2248. +
  2249. +
  2250. +/*
  2251. + * Handling function for WimaxT21Timer
  2252. + * @param e The event that occured
  2253. + */
  2254. +void WimaxT21Timer::handle(Event *e)
  2255. +{
  2256. +  busy_ = 0;
  2257. +  paused_ = 0;
  2258. +  stime = 0.0;
  2259. +  rtime = 0.0;
  2260. +
  2261. +  mac->getScheduler()->expire(WimaxT21TimerID);
  2262. +}
  2263. +
  2264. +/*
  2265. + * Handling function for WimaxFrameTimer
  2266. + * @param e The event that occured
  2267. + */
  2268. +void WimaxLostDLMAPTimer::handle(Event *e)
  2269. +{
  2270. +  busy_ = 0;
  2271. +  paused_ = 0;
  2272. +  stime = 0.0;
  2273. +  rtime = 0.0;
  2274. +
  2275. +  mac->getScheduler()->expire(WimaxLostDLMAPTimerID);
  2276. +}
  2277. +
  2278. +/*
  2279. + * Handling function for WimaxFrameTimer
  2280. + * @param e The event that occured
  2281. + */
  2282. +void WimaxLostULMAPTimer::handle(Event *e)
  2283. +{
  2284. +  busy_ = 0;
  2285. +  paused_ = 0;
  2286. +  stime = 0.0;
  2287. +  rtime = 0.0;
  2288. +
  2289. +  mac->getScheduler()->expire(WimaxLostULMAPTimerID);
  2290. +}
  2291. +
  2292. +/*
  2293. + * Handling function for WimaxDCDTimer
  2294. + * @param e The event that occured
  2295. + */
  2296. +void WimaxDCDTimer::handle(Event *e)
  2297. +{
  2298. +  busy_ = 0;
  2299. +  paused_ = 0;
  2300. +  stime = 0.0;
  2301. +  rtime = 0.0;
  2302. +
  2303. +  mac->getScheduler()->expire(WimaxDCDTimerID);
  2304. +}
  2305. +
  2306. +/*
  2307. + * Handling function for WimaxUCDTimer
  2308. + * @param e The event that occured
  2309. + */
  2310. +void WimaxUCDTimer::handle(Event *e)
  2311. +{
  2312. +  busy_ = 0;
  2313. +  paused_ = 0;
  2314. +  stime = 0.0;
  2315. +  rtime = 0.0;
  2316. +
  2317. +  mac->getScheduler()->expire(WimaxUCDTimerID);
  2318. +}
  2319. +
  2320. +/*
  2321. + * Handling function for WimaxScanIntervalTimer
  2322. + * @param e The event that occured
  2323. + */
  2324. +void WimaxScanIntervalTimer::handle(Event *e)
  2325. +{
  2326. +  busy_ = 0;
  2327. +  paused_ = 0;
  2328. +  stime = 0.0;
  2329. +  rtime = 0.0;
  2330. +
  2331. +  mac->getScheduler()->expire(WimaxScanIntervalTimerID);
  2332. +}
  2333. +
  2334. +/*
  2335. + * Handling function for WimaxT44Timer
  2336. + * @param e The event that occured
  2337. + */
  2338. +void WimaxT44Timer::handle(Event *e)
  2339. +{
  2340. +  busy_ = 0;
  2341. +  paused_ = 0;
  2342. +  stime = 0.0;
  2343. +  rtime = 0.0;
  2344. +
  2345. +  mac->getScheduler()->expire(WimaxT44TimerID);
  2346. +}
  2347. +
  2348. +/*
  2349. + * Handling function for WimaxMobNbrAdvTimer
  2350. + * @param e The event that occured
  2351. + */
  2352. +void WimaxMobNbrAdvTimer::handle(Event *e)
  2353. +{
  2354. +  busy_ = 0;
  2355. +  paused_ = 0;
  2356. +  stime = 0.0;
  2357. +  rtime = 0.0;
  2358. +
  2359. +  mac->getScheduler()->expire(WimaxMobNbrAdvTimerID);
  2360. +}
  2361. +
  2362. +/*
  2363. + * Handling function for WimaxRdvTimer
  2364. + * @param e The event that occured
  2365. + */
  2366. +void WimaxRdvTimer::handle(Event *e)
  2367. +{
  2368. +  busy_ = 0;
  2369. +  paused_ = 0;
  2370. +  stime = 0.0;
  2371. +  rtime = 0.0;
  2372. +
  2373. +  mac->getScheduler()->expire(WimaxRdvTimerID);
  2374. +  printf ("Rdv timeout going to channel %dn", channel_);
  2375. +  mac->setChannel (channel_);
  2376. +}
  2377. +
  2378. diff -Naur ns-2.29-org/wimax/mac802_16timer.h ns-2.29/wimax/mac802_16timer.h
  2379. --- ns-2.29-org/wimax/mac802_16timer.h 1969-12-31 19:00:00.000000000 -0500
  2380. +++ ns-2.29/wimax/mac802_16timer.h 2006-09-22 17:27:47.000000000 -0400
  2381. @@ -0,0 +1,243 @@
  2382. +/* This software was developed at the National Institute of Standards and
  2383. + * Technology by employees of the Federal Government in the course of
  2384. + * their official duties. Pursuant to title 17 Section 105 of the United
  2385. + * States Code this software is not subject to copyright protection and
  2386. + * is in the public domain.
  2387. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2388. + * and makes no guarantees, expressed or implied, about its quality,
  2389. + * reliability, or any other characteristic.
  2390. + * <BR>
  2391. + * We would appreciate acknowledgement if the software is used.
  2392. + * <BR>
  2393. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2394. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2395. + * FROM THE USE OF THIS SOFTWARE.
  2396. + * </PRE></P>
  2397. + * @author  rouil
  2398. + */
  2399. +
  2400. +#ifndef MAC802_16TIMER_H
  2401. +#define MAC802_16TIMER_H
  2402. +
  2403. +#include "scheduler.h"
  2404. +
  2405. +/** Define the ID for each timer **/
  2406. +enum timer_id {
  2407. +  WimaxFrameTimerID,
  2408. +  WimaxRxTimerID,
  2409. +  WimaxDCDTimerID,
  2410. +  WimaxUCDTimerID,
  2411. +  WimaxRngIntTimerID,
  2412. +  WimaxLostDLMAPTimerID,
  2413. +  WimaxLostULMAPTimerID,
  2414. +  WimaxT1TimerID,
  2415. +  WimaxT2TimerID,
  2416. +  WimaxT3TimerID,
  2417. +  WimaxT6TimerID,
  2418. +  WimaxT9TimerID,
  2419. +  WimaxT12TimerID,
  2420. +  WimaxT16TimerID,
  2421. +  WimaxT17TimerID,
  2422. +  WimaxT21TimerID,
  2423. +  WimaxT44TimerID,
  2424. +  //mobility extension
  2425. +  WimaxMobNbrAdvTimerID,
  2426. +
  2427. +  WimaxScanIntervalTimerID,
  2428. +  WimaxRdvTimerID
  2429. +};
  2430. +
  2431. +
  2432. +class Mac802_16;
  2433. +
  2434. +/**
  2435. + * Super class for timers used in wimax 
  2436. + */
  2437. +class WimaxTimer : public Handler {
  2438. +public:
  2439. + WimaxTimer(Mac802_16* m) : mac(m) {
  2440. + busy_ = paused_ = 0; stime = rtime = 0.0;
  2441. + }
  2442. +
  2443. + virtual void handle(Event *e) = 0;
  2444. +
  2445. + virtual void start(double time);
  2446. + virtual void stop(void);
  2447. + void pause(void); /*{ assert(0); }*/
  2448. + void resume(void);/* { assert(0); }*/
  2449. +
  2450. + inline int busy(void) { return busy_; }
  2451. + inline int paused(void) { return paused_; }
  2452. + inline double expire(void) {
  2453. + return ((stime + rtime) - Scheduler::instance().clock());
  2454. + }
  2455. +
  2456. +protected:
  2457. + Mac802_16 *mac;
  2458. + int busy_;
  2459. + int paused_;
  2460. + Event intr;
  2461. + double stime; // start time
  2462. + double rtime; // remaining time
  2463. +};
  2464. +
  2465. +/** Timer for receiving a packet */
  2466. +class WimaxRxTimer : public WimaxTimer {
  2467. + public:
  2468. +  WimaxRxTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2469. +  
  2470. +  void handle(Event *e);
  2471. +};
  2472. +
  2473. +/** Timer for DCD interval */
  2474. +class WimaxDCDTimer : public WimaxTimer {
  2475. + public:
  2476. +  WimaxDCDTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2477. +  
  2478. +  void handle(Event *e);
  2479. +};
  2480. +
  2481. +/** Timer for UCD interval */
  2482. +class WimaxUCDTimer : public WimaxTimer {
  2483. + public:
  2484. +  WimaxUCDTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2485. +  
  2486. +  void handle(Event *e);
  2487. +};
  2488. +
  2489. +/** Timer for initial ranging regions interval */
  2490. +class WimaxRngIntTimer : public WimaxTimer {
  2491. + public:
  2492. +  WimaxRngIntTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2493. +  
  2494. +  void handle(Event *e);
  2495. +};
  2496. +
  2497. +/** Timer for Lost DL-MAP interval */
  2498. +class WimaxLostDLMAPTimer : public WimaxTimer {
  2499. + public:
  2500. +  WimaxLostDLMAPTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2501. +  
  2502. +  void handle(Event *e);
  2503. +};
  2504. +
  2505. +/** Timer for Lost UL-MAP interval */
  2506. +class WimaxLostULMAPTimer : public WimaxTimer {
  2507. + public:
  2508. +  WimaxLostULMAPTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2509. +  
  2510. +  void handle(Event *e);
  2511. +};
  2512. +
  2513. +/** Timer for T1 : wait for DCD timeout */
  2514. +class WimaxT1Timer : public WimaxTimer {
  2515. + public:
  2516. +  WimaxT1Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2517. +  
  2518. +  void handle(Event *e);
  2519. +};
  2520. +
  2521. +/** Timer for T2 : wait for broadcast ranging timeout */
  2522. +class WimaxT2Timer : public WimaxTimer {
  2523. + public:
  2524. +  WimaxT2Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2525. +  
  2526. +  void handle(Event *e);
  2527. +};
  2528. +
  2529. +/** Timer for T3 : ranging response timeout */
  2530. +class WimaxT3Timer : public WimaxTimer {
  2531. + public:
  2532. +  WimaxT3Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2533. +  
  2534. +  void handle(Event *e);
  2535. +};
  2536. +
  2537. +/** Timer for T6 : wait for registration response */
  2538. +class WimaxT6Timer : public WimaxTimer {
  2539. + public:
  2540. +  WimaxT6Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2541. +  
  2542. +  void handle(Event *e);
  2543. +};
  2544. +
  2545. +/** Timer for T9 : registration timeout */
  2546. +class WimaxT9Timer : public WimaxTimer {
  2547. + public:
  2548. +  WimaxT9Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2549. +  
  2550. +  void handle(Event *e);
  2551. +};
  2552. +
  2553. +/** Timer for T12 : wait for UCD descriptor */
  2554. +class WimaxT12Timer : public WimaxTimer {
  2555. + public:
  2556. +  WimaxT12Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2557. +  
  2558. +  void handle(Event *e);
  2559. +};
  2560. +
  2561. +/** Timer for T16 : wait for bw request grant */
  2562. +class WimaxT16Timer : public WimaxTimer {
  2563. + public:
  2564. +  WimaxT16Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2565. +  
  2566. +  void handle(Event *e);
  2567. +};
  2568. +
  2569. +/** Timer for T17 : wait for SS to register */
  2570. +class WimaxT17Timer : public WimaxTimer {
  2571. + public:
  2572. +  WimaxT17Timer(Mac802_16 *m, int peerIndex) : WimaxTimer(m) { peerIndex_ = peerIndex;}
  2573. +  
  2574. +  void handle(Event *e);
  2575. + private:
  2576. +  int peerIndex_;
  2577. +};
  2578. +
  2579. +/** Timer for T21 : time the station searches for DL-MAP on a channel */
  2580. +class WimaxT21Timer : public WimaxTimer {
  2581. + public:
  2582. +  WimaxT21Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2583. +  
  2584. +  void handle(Event *e);
  2585. +};
  2586. +
  2587. +/** Timer for T44 : wait for BS to send MOB_SCN-REP */
  2588. +class WimaxT44Timer : public WimaxTimer {
  2589. + public:
  2590. +  WimaxT44Timer(Mac802_16 *m) : WimaxTimer(m) {}
  2591. +  
  2592. +  void handle(Event *e);
  2593. +};
  2594. +
  2595. +/** Timer for scan interval : timer for scanning */
  2596. +class WimaxScanIntervalTimer : public WimaxTimer {
  2597. + public:
  2598. +  WimaxScanIntervalTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2599. +  
  2600. +  void handle(Event *e);
  2601. +};
  2602. +
  2603. +/** Timer for neighbor advertisement interval */
  2604. +class WimaxMobNbrAdvTimer : public WimaxTimer {
  2605. + public:
  2606. +  WimaxMobNbrAdvTimer(Mac802_16 *m) : WimaxTimer(m) {}
  2607. +  
  2608. +  void handle(Event *e);
  2609. +};
  2610. +
  2611. +/** Timer for rendez-vous with target BSs */
  2612. +class WimaxRdvTimer : public WimaxTimer {
  2613. + public:
  2614. +  WimaxRdvTimer(Mac802_16 *m, int channel) : WimaxTimer(m) 
  2615. +    {
  2616. +      channel_ = channel;
  2617. +    }
  2618. +  
  2619. +  void handle(Event *e);
  2620. + private:
  2621. +  int channel_;
  2622. +};
  2623. +
  2624. +#endif
  2625. diff -Naur ns-2.29-org/wimax/neighbordb.cc ns-2.29/wimax/neighbordb.cc
  2626. --- ns-2.29-org/wimax/neighbordb.cc 1969-12-31 19:00:00.000000000 -0500
  2627. +++ ns-2.29/wimax/neighbordb.cc 2006-09-22 17:27:47.000000000 -0400
  2628. @@ -0,0 +1,103 @@
  2629. +/* This software was developed at the National Institute of Standards and
  2630. + * Technology by employees of the Federal Government in the course of
  2631. + * their official duties. Pursuant to title 17 Section 105 of the United
  2632. + * States Code this software is not subject to copyright protection and
  2633. + * is in the public domain.
  2634. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2635. + * and makes no guarantees, expressed or implied, about its quality,
  2636. + * reliability, or any other characteristic.
  2637. + * <BR>
  2638. + * We would appreciate acknowledgement if the software is used.
  2639. + * <BR>
  2640. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2641. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2642. + * FROM THE USE OF THIS SOFTWARE.
  2643. + * </PRE></P>
  2644. + * @author  rouil
  2645. + */
  2646. +
  2647. +#include "neighbordb.h"
  2648. +
  2649. +/** 
  2650. + * Constructor
  2651. + */
  2652. +NeighborDB::NeighborDB ()
  2653. +{
  2654. +  nbentry_ = 0;
  2655. +  nbs_ = (NeighborEntry **) malloc (DEFAULT_DB_SIZE*sizeof (NeighborEntry *));
  2656. +}
  2657. +
  2658. +/**
  2659. + * Destructor
  2660. + */
  2661. +NeighborDB::~NeighborDB ()
  2662. +{
  2663. +  for (int i=0 ; i < nbentry_ ; i++) {
  2664. +    delete (nbs_[i]);
  2665. +  }
  2666. +}
  2667. +
  2668. +/**
  2669. + * Add an entry in the database
  2670. + * @param nb The neighbor to add
  2671. + */
  2672. +void NeighborDB::addNeighbor (NeighborEntry *nb)
  2673. +{
  2674. +  if (nbentry_ == DEFAULT_DB_SIZE) {
  2675. +    printf ("Default size for neighbor database is too small. Update DEFAULT_DB_SIZE attributen");
  2676. +    exit (0);
  2677. +  }
  2678. +  nbs_[nbentry_++] = nb;
  2679. +}
  2680. +
  2681. +/**
  2682. + * Remove the entry associated with the given node
  2683. + * @param nbid The neighbor id
  2684. + */
  2685. +void NeighborDB::removeNeighbor (int nbid)
  2686. +{
  2687. +  assert (getNeighbor (nbid)==NULL);
  2688. +
  2689. +  for (int i = 0 ; i < nbentry_ ; i++) {
  2690. +    if (nbs_[i]->getID() == nbid) {
  2691. +      delete (nbs_[i]);
  2692. +      for (int j = i+1 ; j < nbentry_ ; j++, i++)
  2693. + nbs_[i]=nbs_[j];
  2694. +      nbentry_--;
  2695. +      break;
  2696. +    }
  2697. +  }
  2698. +}
  2699. +
  2700. +/**
  2701. + * Return the number of neighbor in the list
  2702. + * @return the number of neighbor in the list
  2703. + */
  2704. +int NeighborDB::getNbNeighbor ()
  2705. +{
  2706. +  return nbentry_;
  2707. +}
  2708. +
  2709. +/**
  2710. + * Return the entry associated with the given node
  2711. + * @param nbid The neighbor id
  2712. + * @return the entry for the given node or NULL
  2713. + */
  2714. +NeighborEntry * NeighborDB::getNeighbor (int nbid)
  2715. +{
  2716. +  for (int i = 0 ; i < nbentry_ ; i++) {
  2717. +    if (nbs_[i]->getID() == nbid) {
  2718. +      return (nbs_[i]);
  2719. +    }
  2720. +  }
  2721. +  return NULL;
  2722. +}
  2723. +
  2724. +/**
  2725. + * Return a pointer to the list of all neighbors
  2726. + * @return a pointer to the list of all neighbors
  2727. + */
  2728. +NeighborEntry ** NeighborDB::getNeighbors ()
  2729. +{
  2730. +  return nbs_;
  2731. +}
  2732. diff -Naur ns-2.29-org/wimax/neighbordb.h ns-2.29/wimax/neighbordb.h
  2733. --- ns-2.29-org/wimax/neighbordb.h 1969-12-31 19:00:00.000000000 -0500
  2734. +++ ns-2.29/wimax/neighbordb.h 2006-09-22 17:27:47.000000000 -0400
  2735. @@ -0,0 +1,93 @@
  2736. +/* This software was developed at the National Institute of Standards and
  2737. + * Technology by employees of the Federal Government in the course of
  2738. + * their official duties. Pursuant to title 17 Section 105 of the United
  2739. + * States Code this software is not subject to copyright protection and
  2740. + * is in the public domain.
  2741. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2742. + * and makes no guarantees, expressed or implied, about its quality,
  2743. + * reliability, or any other characteristic.
  2744. + * <BR>
  2745. + * We would appreciate acknowledgement if the software is used.
  2746. + * <BR>
  2747. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2748. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2749. + * FROM THE USE OF THIS SOFTWARE.
  2750. + * </PRE></P>
  2751. + * @author  rouil
  2752. + */
  2753. +
  2754. +#ifndef NEIGHBORDB_H
  2755. +#define NEIGHBORDB_H
  2756. +
  2757. +#include "neighborentry.h"
  2758. +#include "mac802_16pkt.h"
  2759. +
  2760. +/* This is the size of database allocated. Needs to be modified if 
  2761. + * a node could have more entries
  2762. + */
  2763. +#define DEFAULT_DB_SIZE 10
  2764. +
  2765. +/**
  2766. + * The class is used to store and manipulate the list 
  2767. + * of neighbors in a given node
  2768. + */
  2769. +class NeighborDB {
  2770. + public:
  2771. +  /** 
  2772. +   * Constructor
  2773. +   */
  2774. +  NeighborDB ();
  2775. +
  2776. +  /**
  2777. +   * Destructor
  2778. +   */
  2779. +  ~NeighborDB ();
  2780. +
  2781. +  /**
  2782. +   * Add an entry in the database
  2783. +   * @param nb The neighbor to add
  2784. +   */
  2785. +  void addNeighbor (NeighborEntry *nb);
  2786. +
  2787. +  /**
  2788. +   * Remove the entry associated with the given node
  2789. +   * @param nbid The neighbor id
  2790. +   */
  2791. +  void removeNeighbor (int nbid);
  2792. +
  2793. +  /**
  2794. +   * Return the number of neighbor in the list
  2795. +   * @return the number of neighbor in the list
  2796. +   */
  2797. +  int getNbNeighbor ();
  2798. +
  2799. +  /**
  2800. +   * Return the entry associated with the given node
  2801. +   * @param nbid The neighbor id
  2802. +   * @return the entry for the given node or NULL
  2803. +   */
  2804. +  NeighborEntry * getNeighbor (int nbid);
  2805. +
  2806. +  /**
  2807. +   * Return a pointer to the list of all neighbors
  2808. +   * @return a pointer to the list of all neighbors
  2809. +   */
  2810. +  NeighborEntry ** getNeighbors ();
  2811. +
  2812. + protected:
  2813. +
  2814. + private:
  2815. +  /**
  2816. +   * Current number of neighbor
  2817. +   */
  2818. +  int nbentry_;
  2819. +
  2820. +  /**
  2821. +   * Array of neighbors
  2822. +   */
  2823. +  NeighborEntry **nbs_;
  2824. +  
  2825. +};
  2826. +
  2827. +
  2828. +#endif
  2829. diff -Naur ns-2.29-org/wimax/neighborentry.cc ns-2.29/wimax/neighborentry.cc
  2830. --- ns-2.29-org/wimax/neighborentry.cc 1969-12-31 19:00:00.000000000 -0500
  2831. +++ ns-2.29/wimax/neighborentry.cc 2006-09-22 17:27:47.000000000 -0400
  2832. @@ -0,0 +1,159 @@
  2833. +/* This software was developed at the National Institute of Standards and
  2834. + * Technology by employees of the Federal Government in the course of
  2835. + * their official duties. Pursuant to title 17 Section 105 of the United
  2836. + * States Code this software is not subject to copyright protection and
  2837. + * is in the public domain.
  2838. + * NIST assumes no responsibility whatsoever for its use by other parties,
  2839. + * and makes no guarantees, expressed or implied, about its quality,
  2840. + * reliability, or any other characteristic.
  2841. + * <BR>
  2842. + * We would appreciate acknowledgement if the software is used.
  2843. + * <BR>
  2844. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  2845. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  2846. + * FROM THE USE OF THIS SOFTWARE.
  2847. + * </PRE></P>
  2848. + * @author  rouil
  2849. + */
  2850. +
  2851. +#include "neighborentry.h"
  2852. +
  2853. +/** 
  2854. + * Constructor
  2855. + */
  2856. +NeighborEntry::NeighborEntry (int id) : nbr_adv_(0), dcd_(0), ucd_ (0), rng_rsp_(0)
  2857. +{
  2858. +  id_ = id;
  2859. +  memset (&state_, 0, sizeof (struct sched_state_info));
  2860. +  detected_ = false;
  2861. +}
  2862. +
  2863. +/**
  2864. + * Destructor
  2865. + */
  2866. +NeighborEntry::~NeighborEntry ()
  2867. +{
  2868. +  free (nbr_adv_);
  2869. +  free (dcd_);
  2870. +  free (ucd_);
  2871. +  free (rng_rsp_);
  2872. +}
  2873. +
  2874. +
  2875. +/**
  2876. + * Return the address of the neighbor of this entry
  2877. + * @return the address of the neighbor of this entry
  2878. + */
  2879. +int NeighborEntry::getID ()
  2880. +{
  2881. +  return id_;
  2882. +}
  2883. +
  2884. +/**
  2885. + * Set the neighbor advertisement message
  2886. + * @param frame The advertisment message
  2887. + */
  2888. +void NeighborEntry::setNbrAdvMessage (mac802_16_nbr_adv_info *frame)
  2889. +{
  2890. +  nbr_adv_ = frame;
  2891. +}
  2892. +  
  2893. +/**
  2894. + * Return the neighbor advertisement message
  2895. + * @param frame The advertisment message
  2896. + */
  2897. +mac802_16_nbr_adv_info * NeighborEntry::getNbrAdvMessage ()
  2898. +{
  2899. +  return nbr_adv_;
  2900. +}
  2901. +
  2902. +/**
  2903. + * Set the DCD message received during scanning
  2904. + * @param dcd the DCD message received
  2905. + */
  2906. +void NeighborEntry::setDCD (mac802_16_dcd_frame *frame)
  2907. +{
  2908. +  dcd_ = frame;
  2909. +}
  2910. +
  2911. +/**
  2912. + * Get the DCD message received during scanning
  2913. + * @return the DCD message received
  2914. + */
  2915. +mac802_16_dcd_frame * NeighborEntry::getDCD ()
  2916. +{
  2917. +  return dcd_;
  2918. +}
  2919. +
  2920. +/**
  2921. + * Set the UCD message received during scanning
  2922. + * @param dcd the DCD message received
  2923. + */
  2924. +void NeighborEntry::setUCD (mac802_16_ucd_frame *frame)
  2925. +{
  2926. +  ucd_ = frame;
  2927. +}
  2928. +
  2929. +/**
  2930. + * Get the DCD message received during scanning
  2931. + * @return the DCD message received
  2932. + */
  2933. +mac802_16_ucd_frame * NeighborEntry::getUCD ()
  2934. +{
  2935. +  return ucd_;
  2936. +}
  2937. +
  2938. +/**
  2939. + * Set the MAC state associated with this neighbor
  2940. + * @param state
  2941. + */
  2942. +/*void NeighborEntry::setState (sched_state_info *state)
  2943. +{
  2944. +  state_ = state;
  2945. +}*/
  2946. +
  2947. +/**
  2948. + * Get the MAC state associated with this neighbor
  2949. + * @return the MAC state associated with this neighbor
  2950. + */
  2951. +sched_state_info * NeighborEntry::getState ()
  2952. +{
  2953. +  return &state_;
  2954. +}
  2955. +
  2956. +/**
  2957. + * Mark the neighbor as being detected
  2958. + * @param detected indicate if the neighbor has been detected
  2959. + */
  2960. +void NeighborEntry::setDetected (bool detected)
  2961. +{
  2962. +  detected_ = detected;
  2963. +}
  2964. +
  2965. +/**
  2966. + * Indicates the neighbor as being detected
  2967. + * @return indication if the neighbor has been detected
  2968. + */
  2969. +bool NeighborEntry::isDetected ()
  2970. +{
  2971. +  return detected_;
  2972. +}
  2973. +
  2974. +/**
  2975. + * Set the UCD message received during scanning
  2976. + * @param dcd the DCD message received
  2977. + */
  2978. +void NeighborEntry::setRangingRsp (mac802_16_rng_rsp_frame *frame)
  2979. +{
  2980. +  rng_rsp_ = frame;
  2981. +}
  2982. +
  2983. +/**
  2984. + * Get the DCD message received during scanning
  2985. + * @return the DCD message received
  2986. + */
  2987. +mac802_16_rng_rsp_frame *NeighborEntry::getRangingRsp ()
  2988. +{
  2989. +  return rng_rsp_;
  2990. +}
  2991. +
  2992. diff -Naur ns-2.29-org/wimax/neighborentry.h ns-2.29/wimax/neighborentry.h
  2993. --- ns-2.29-org/wimax/neighborentry.h 1969-12-31 19:00:00.000000000 -0500
  2994. +++ ns-2.29/wimax/neighborentry.h 2006-09-22 17:27:47.000000000 -0400
  2995. @@ -0,0 +1,168 @@
  2996. +/* This software was developed at the National Institute of Standards and
  2997. + * Technology by employees of the Federal Government in the course of
  2998. + * their official duties. Pursuant to title 17 Section 105 of the United
  2999. + * States Code this software is not subject to copyright protection and
  3000. + * is in the public domain.
  3001. + * NIST assumes no responsibility whatsoever for its use by other parties,
  3002. + * and makes no guarantees, expressed or implied, about its quality,
  3003. + * reliability, or any other characteristic.
  3004. + * <BR>
  3005. + * We would appreciate acknowledgement if the software is used.
  3006. + * <BR>
  3007. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  3008. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  3009. + * FROM THE USE OF THIS SOFTWARE.
  3010. + * </PRE></P>
  3011. + * @author  rouil
  3012. + */
  3013. +
  3014. +#ifndef NEIGHBORENTRY_H
  3015. +#define NEIGHBORENTRY_H
  3016. +
  3017. +#include "scheduling/framemap.h"
  3018. +
  3019. +/** Data structure used to store Mac state information during scanning */
  3020. +struct sched_state_info {
  3021. +  struct state_info *state_info; 
  3022. +  FrameMap *map;
  3023. +  WimaxT1Timer  *t1timer;
  3024. +  WimaxT2Timer  *t2timer;
  3025. +  WimaxT6Timer  *t6timer;
  3026. +  WimaxT12Timer *t12timer;
  3027. +  WimaxT21Timer *t21timer;
  3028. +  WimaxLostDLMAPTimer *lostDLMAPtimer;
  3029. +  WimaxLostULMAPTimer *lostULMAPtimer;
  3030. +  WimaxT44Timer *t44timer;
  3031. +};
  3032. +
  3033. +/**
  3034. + * Store information about a neighboring BS.
  3035. + */
  3036. +class NeighborEntry {
  3037. + public:
  3038. +  /** 
  3039. +   * Constructor
  3040. +   */
  3041. +  NeighborEntry (int id);
  3042. +
  3043. +  /**
  3044. +   * Destructor
  3045. +   */
  3046. +  ~NeighborEntry ();
  3047. +
  3048. +  /**
  3049. +   * Return the address of the neighbor of this entry
  3050. +   * @return the address of the neighbor of this entry
  3051. +   */
  3052. +  int getID ();
  3053. +
  3054. +  /**
  3055. +   * Set the neighbor advertisement message
  3056. +   * @param frame The advertisment message
  3057. +   */
  3058. +  void setNbrAdvMessage (mac802_16_nbr_adv_info *frame);
  3059. +  
  3060. +  /**
  3061. +   * Return the neighbor advertisement message
  3062. +   * @param frame The advertisment message
  3063. +   */
  3064. +  mac802_16_nbr_adv_info * getNbrAdvMessage ();
  3065. +
  3066. +  /**
  3067. +   * Set the DCD message received during scanning
  3068. +   * @param dcd the DCD message received
  3069. +   */
  3070. +  void setDCD (mac802_16_dcd_frame *frame);
  3071. +
  3072. +  /**
  3073. +   * Get the DCD message received during scanning
  3074. +   * @return the DCD message received
  3075. +   */
  3076. +  mac802_16_dcd_frame *getDCD ();  
  3077. +
  3078. +  /**
  3079. +   * Set the UCD message received during scanning
  3080. +   * @param dcd the DCD message received
  3081. +   */
  3082. +  void setUCD (mac802_16_ucd_frame *frame);
  3083. +
  3084. +  /**
  3085. +   * Get the DCD message received during scanning
  3086. +   * @return the DCD message received
  3087. +   */
  3088. +  mac802_16_ucd_frame *getUCD ();  
  3089. +
  3090. +  /**
  3091. +   * Set the UCD message received during scanning
  3092. +   * @param dcd the DCD message received
  3093. +   */
  3094. +  void setRangingRsp (mac802_16_rng_rsp_frame *frame);
  3095. +
  3096. +  /**
  3097. +   * Get the DCD message received during scanning
  3098. +   * @return the DCD message received
  3099. +   */
  3100. +  mac802_16_rng_rsp_frame *getRangingRsp ();  
  3101. +
  3102. +  /**
  3103. +   * Mark the neighbor as being detected
  3104. +   * @param detected indicate if the neighbor has been detected
  3105. +   */
  3106. +  void setDetected (bool detected);
  3107. +
  3108. +  /**
  3109. +   * Indicates the neighbor as being detected
  3110. +   * @return indication if the neighbor has been detected
  3111. +   */
  3112. +  bool isDetected ();
  3113. +
  3114. +  /**
  3115. +   * Set the MAC state associated with this neighbor
  3116. +   * @param state
  3117. +   */
  3118. +  //void setState (sched_state_info *state);
  3119. +
  3120. +  /**
  3121. +   * Get the MAC state associated with this neighbor
  3122. +   * @return the MAC state associated with this neighbor
  3123. +   */
  3124. +  sched_state_info * getState ();
  3125. +
  3126. + private:
  3127. +  /**
  3128. +   * The MAC address of neighbor
  3129. +   */
  3130. +  int id_;
  3131. +
  3132. +  /**
  3133. +   * The neighbor info adv message
  3134. +   */
  3135. +  struct mac802_16_nbr_adv_info *nbr_adv_;
  3136. +
  3137. +  /**
  3138. +   * The DCD message received during scanning
  3139. +   */
  3140. +  mac802_16_dcd_frame *dcd_;
  3141. +
  3142. +  /**
  3143. +   * The DCD message received during scanning
  3144. +   */
  3145. +  mac802_16_ucd_frame *ucd_;
  3146. +
  3147. +  /** 
  3148. +   * The ranging response received during scanning
  3149. +   */
  3150. +  mac802_16_rng_rsp_frame *rng_rsp_;
  3151. +
  3152. +  /**
  3153. +   * Save the state
  3154. +   */
  3155. +  struct sched_state_info state_;
  3156. +
  3157. +  /**
  3158. +   * Indicate if the neighbor has been detected
  3159. +   */
  3160. +  bool detected_;
  3161. +};
  3162. +  
  3163. +#endif
  3164. diff -Naur ns-2.29-org/wimax/ofdmphy.cc ns-2.29/wimax/ofdmphy.cc
  3165. --- ns-2.29-org/wimax/ofdmphy.cc 1969-12-31 19:00:00.000000000 -0500
  3166. +++ ns-2.29/wimax/ofdmphy.cc 2006-09-22 17:27:47.000000000 -0400
  3167. @@ -0,0 +1,304 @@
  3168. +/* This software was developed at the National Institute of Standards and
  3169. + * Technology by employees of the Federal Government in the course of
  3170. + * their official duties. Pursuant to title 17 Section 105 of the United
  3171. + * States Code this software is not subject to copyright protection and
  3172. + * is in the public domain.
  3173. + * NIST assumes no responsibility whatsoever for its use by other parties,
  3174. + * and makes no guarantees, expressed or implied, about its quality,
  3175. + * reliability, or any other characteristic.
  3176. + * <BR>
  3177. + * We would appreciate acknowledgement if the software is used.
  3178. + * <BR>
  3179. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  3180. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  3181. + * FROM THE USE OF THIS SOFTWARE.
  3182. + * </PRE></P>
  3183. + * @author  rouil
  3184. + */
  3185. +
  3186. +#include "ofdmphy.h"
  3187. +#include "mac802_16pkt.h"
  3188. +
  3189. +//#define DEBUG_WIMAX 1
  3190. +
  3191. +/**
  3192. + * Tcl hook for creating the physical layer
  3193. + */
  3194. +static class OFDMPhyClass: public TclClass {
  3195. +public:
  3196. +        OFDMPhyClass() : TclClass("Phy/WirelessPhy/OFDM") {}
  3197. +        TclObject* create(int, const char*const*) {
  3198. +                return (new OFDMPhy);
  3199. +        }
  3200. +} class_OfdmPhy;
  3201. +
  3202. +OFDMPhy::OFDMPhy() : WirelessPhy()
  3203. +{
  3204. +  //bind attributes
  3205. +  bind ("g_", &g_);
  3206. +  //bind ("rtg_", &rtg_);
  3207. +  //bind ("ttg_", &ttg_);
  3208. +  //bind ("fbandwidth_", &fbandwidth_);
  3209. +
  3210. +  //default modulation is BPSK
  3211. +  modulation_ = OFDM_BPSK_1_2;
  3212. +  Tcl& tcl = Tcl::instance();
  3213. +  tcl.evalf("Mac/802_16 set fbandwidth_");
  3214. +  fbandwidth_ = atof (tcl.result()); 
  3215. +  state_ = OFDM_IDLE;
  3216. +  activated_ = true;
  3217. +
  3218. +  updateFs ();
  3219. +}
  3220. +
  3221. +/*
  3222. + * Activate node
  3223. + */
  3224. +void OFDMPhy::node_on ()
  3225. +{
  3226. +  activated_ = true;
  3227. +}
  3228. +
  3229. +/*
  3230. + * Deactivate node
  3231. + */
  3232. +void OFDMPhy::node_off ()
  3233. +{
  3234. +  activated_ = false;
  3235. +}
  3236. +
  3237. +
  3238. +/**
  3239. + * Change the frequency at which the phy is operating
  3240. + * @param freq The new frequency
  3241. + */
  3242. +void OFDMPhy::setFrequency (double freq)
  3243. +{
  3244. +  freq_ = freq;
  3245. +  lambda_ = SPEED_OF_LIGHT / freq_;
  3246. +}
  3247. +
  3248. +/**
  3249. + * Set the new modulation for the physical layer
  3250. + */
  3251. +void OFDMPhy::setModulation (Ofdm_mod_rate modulation) {
  3252. +  modulation_ = modulation;
  3253. +}
  3254. +/**
  3255. + * Return the current modulation
  3256. + */
  3257. +Ofdm_mod_rate OFDMPhy::getModulation () {
  3258. +  return modulation_;
  3259. +}
  3260. +/**
  3261. + * Set the new transmitting power
  3262. + */
  3263. +void OFDMPhy::setTxPower (double power) {
  3264. +  Pt_ = power;
  3265. +}
  3266. +/**
  3267. + * Return the current transmitting power
  3268. + */
  3269. +double OFDMPhy::getTxPower () {
  3270. +  return getPt();
  3271. +}
  3272. +
  3273. +/** 
  3274. + * Update the PS information
  3275. + */
  3276. +void OFDMPhy::updateFs () {
  3277. +  /* The PS=4*Fs with Fs=floor (n.BW/8000)*8000
  3278. +   * and n=8/7 is channel bandwidth multiple of 1.75Mhz
  3279. +   * n=86/75 is channel bandwidth multiple of 1.5Mhz
  3280. +   * n=144/125 is channel bandwidth multiple of 1.25Mhz
  3281. +   * n=316/275 is channel bandwidth multiple of 2.75Mhz
  3282. +   * n=57/50 is channel bandwidth multiple of 2.0Mhz
  3283. +   * n=8/7 for all other cases
  3284. +   */
  3285. +  double n; 
  3286. +
  3287. +  if (((int) (fbandwidth_ / 1.75)) * 1.75 == fbandwidth_) {
  3288. +    n = 8.0/7;
  3289. +  } else if (((int) (fbandwidth_ / 1.5)) * 1.5 == fbandwidth_) {
  3290. +    n = 86.0/75;
  3291. +  } else if (((int) (fbandwidth_ / 1.25)) * 1.25 == fbandwidth_) {
  3292. +    n = 144.0/125;
  3293. +  } else if (((int) (fbandwidth_ / 2.75)) * 2.75 == fbandwidth_) {
  3294. +    n = 316.0/275;
  3295. +  } else if (((int) (fbandwidth_ / 2.0)) * 2.0 == fbandwidth_) {
  3296. +    n = 57.0/50;
  3297. +  } else {
  3298. +    n = 8.0/7;
  3299. +  }
  3300. +
  3301. +  fs_ = floor (n*fbandwidth_/8000) * 8000;
  3302. +#ifdef DEBUG_WIMAX
  3303. +  printf ("Fs updated. Bw=%f, n=%f, new value is %en", fbandwidth_, n, fs_);
  3304. +#endif
  3305. +}
  3306. +
  3307. +/*
  3308. + * Compute the transmission time for a packet of size sdusize and
  3309. + * using the given modulation
  3310. + * @param sdusize Size in bytes of the data to send
  3311. + * @param mod The modulation to use
  3312. + */
  3313. +double OFDMPhy::getTrxTime (int sdusize, Ofdm_mod_rate mod) {
  3314. +  //we compute the number of symbols required
  3315. +  int nb_symbols, bpsymb;
  3316. +
  3317. +  switch (mod) {
  3318. +  case OFDM_BPSK_1_2:
  3319. +    bpsymb = OFDM_BPSK_1_2_bpsymb;
  3320. +    break;
  3321. +  case OFDM_QPSK_1_2:
  3322. +    bpsymb = OFDM_QPSK_1_2_bpsymb;
  3323. +    break;
  3324. +  case OFDM_QPSK_3_4:
  3325. +    bpsymb = OFDM_QPSK_3_4_bpsymb;
  3326. +    break;
  3327. +  case OFDM_16QAM_1_2:
  3328. +    bpsymb = OFDM_16QAM_1_2_bpsymb;
  3329. +    break;
  3330. +  case OFDM_16QAM_3_4:
  3331. +    bpsymb = OFDM_16QAM_3_4_bpsymb;
  3332. +    break;
  3333. +  case OFDM_64QAM_2_3:
  3334. +    bpsymb = OFDM_64QAM_2_3_bpsymb;
  3335. +    break;
  3336. +  case OFDM_64QAM_3_4:
  3337. +    bpsymb = OFDM_64QAM_3_4_bpsymb;
  3338. +    break;
  3339. +  default:
  3340. +    printf ("Error: unknown modulation: method getTrxTime in file ofdmphy.ccn");
  3341. +    exit (1);
  3342. +  }
  3343. +
  3344. +#ifdef DEBUG_WIMAX
  3345. +  printf ("Nb symbols=%dn", (int) (ceil(((double)sdusize*8)/bpsymb)));
  3346. +#endif
  3347. +
  3348. +  nb_symbols = (int) (ceil(((double)sdusize*8)/bpsymb));
  3349. +  return (nb_symbols*getSymbolTime ());
  3350. +}
  3351. +
  3352. +/*
  3353. + * Return the maximum size in bytes that can be sent for the given 
  3354. + * nb symbols and modulation
  3355. + */
  3356. +int OFDMPhy::getMaxPktSize (double nbsymbols, Ofdm_mod_rate mod)
  3357. +{
  3358. +  int bpsymb;
  3359. +
  3360. +  switch (mod) {
  3361. +  case OFDM_BPSK_1_2:
  3362. +    bpsymb = OFDM_BPSK_1_2_bpsymb;
  3363. +    break;
  3364. +  case OFDM_QPSK_1_2:
  3365. +    bpsymb = OFDM_QPSK_1_2_bpsymb;
  3366. +    break;
  3367. +  case OFDM_QPSK_3_4:
  3368. +    bpsymb = OFDM_QPSK_3_4_bpsymb;
  3369. +    break;
  3370. +  case OFDM_16QAM_1_2:
  3371. +    bpsymb = OFDM_16QAM_1_2_bpsymb;
  3372. +    break;
  3373. +  case OFDM_16QAM_3_4:
  3374. +    bpsymb = OFDM_16QAM_3_4_bpsymb;
  3375. +    break;
  3376. +  case OFDM_64QAM_2_3:
  3377. +    bpsymb = OFDM_64QAM_2_3_bpsymb;
  3378. +    break;
  3379. +  case OFDM_64QAM_3_4:
  3380. +    bpsymb = OFDM_64QAM_3_4_bpsymb;
  3381. +    break;
  3382. +  default:
  3383. +    printf ("Error: unknown modulation: method getTrxTime in file ofdmphy.ccn");
  3384. +    exit (1);
  3385. +  }
  3386. +
  3387. +  return (int)(nbsymbols*bpsymb)/8;
  3388. +}
  3389. +
  3390. +/**
  3391. + * Return the OFDM symbol duration time
  3392. + */
  3393. +double OFDMPhy::getSymbolTime () 
  3394. +{ 
  3395. +  //printf ("fs=%e, Subcarrier spacing=%en", fs_, fs_/((double)NFFT));
  3396. +  return (1+g_)*((double)NFFT)/fs_; 
  3397. +}
  3398. +
  3399. +
  3400. +/*
  3401. + * Set the mode for physical layer
  3402. + * The Mac layer is in charge of know when to change the state by 
  3403. + * request the delay for the Rx2Tx and Tx2Rx
  3404. + */
  3405. +void OFDMPhy::setMode (Ofdm_phy_state mode)
  3406. +{
  3407. +  state_ = mode;
  3408. +}
  3409. +
  3410. +/* Redefine the method for sending a packet
  3411. + * Add physical layer information
  3412. + * @param p The packet to be sent
  3413. + */
  3414. +void OFDMPhy::sendDown(Packet *p)
  3415. +{
  3416. +  hdr_mac802_16* wph = HDR_MAC802_16(p);
  3417. +
  3418. +  /* Check phy status */
  3419. +  if (state_ != OFDM_SEND) {
  3420. +    printf ("Warning: OFDM not in sending state. Drop packet.n");
  3421. +    Packet::free (p);
  3422. +    return;
  3423. +  }
  3424. +
  3425. +#ifdef DEBUG_WIMAX
  3426. +  printf ("OFDM phy sending packet. Modulation is %d, cyclic prefix is %fn", 
  3427. +   modulation_, g_);
  3428. +#endif 
  3429. +
  3430. +  wph->phy_info.freq_ = freq_;
  3431. +  wph->phy_info.modulation_ = modulation_;
  3432. +  wph->phy_info.g_ = g_;
  3433. +
  3434. +  //the packet can be sent
  3435. +  WirelessPhy::sendDown (p);
  3436. +}
  3437. +
  3438. +/* Redefine the method for receiving a packet
  3439. + * Add physical layer information
  3440. + * @param p The packet to be sent
  3441. + */
  3442. +int OFDMPhy::sendUp(Packet *p)
  3443. +{
  3444. +  hdr_mac802_16* wph = HDR_MAC802_16(p);
  3445. +
  3446. +  if (!activated_)
  3447. +    return 0;
  3448. +
  3449. +  if (freq_ != wph->phy_info.freq_) {
  3450. +#ifdef DEBUG_WIMAX
  3451. +    printf ("drop packet because frequency is different (%f, %f)n", freq_,wph->phy_info.freq_);
  3452. +#endif 
  3453. +    return 0;
  3454. +  }
  3455. +
  3456. +  /* Check phy status */
  3457. +  if (state_ != OFDM_RECV) {
  3458. +#ifdef DEBUG_WIMAX
  3459. +    printf ("Warning: OFDM phy not in receiving state. Drop packet.n");
  3460. +#endif 
  3461. +    return 0;
  3462. +  }
  3463. +
  3464. +#ifdef DEBUG_WIMAX
  3465. +  printf ("OFDM phy receiving packet with mod=%d and cp=%fn", wph->phy_info.modulation_,wph->phy_info.g_);
  3466. +#endif 
  3467. +  
  3468. +  //the packet can be received
  3469. +  return WirelessPhy::sendUp (p);
  3470. +}
  3471. +
  3472. diff -Naur ns-2.29-org/wimax/ofdmphy.h ns-2.29/wimax/ofdmphy.h
  3473. --- ns-2.29-org/wimax/ofdmphy.h 1969-12-31 19:00:00.000000000 -0500
  3474. +++ ns-2.29/wimax/ofdmphy.h 2006-09-22 17:27:47.000000000 -0400
  3475. @@ -0,0 +1,214 @@
  3476. +/* This software was developed at the National Institute of Standards and
  3477. + * Technology by employees of the Federal Government in the course of
  3478. + * their official duties. Pursuant to title 17 Section 105 of the United
  3479. + * States Code this software is not subject to copyright protection and
  3480. + * is in the public domain.
  3481. + * NIST assumes no responsibility whatsoever for its use by other parties,
  3482. + * and makes no guarantees, expressed or implied, about its quality,
  3483. + * reliability, or any other characteristic.
  3484. + * <BR>
  3485. + * We would appreciate acknowledgement if the software is used.
  3486. + * <BR>
  3487. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  3488. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  3489. + * FROM THE USE OF THIS SOFTWARE.
  3490. + * </PRE></P>
  3491. + * @author  rouil
  3492. + */
  3493. +
  3494. +#ifndef OFDMPHY_H
  3495. +#define OFDMPHY_H
  3496. +
  3497. +#include <packet.h>
  3498. +#include "wireless-phy.h"
  3499. +
  3500. +/* Define subcarrier information */
  3501. +#define NFFT 256
  3502. +#define NUSED 200 //number of subcarrier used
  3503. +
  3504. +/** Status of physical layer */
  3505. +enum Ofdm_phy_state {
  3506. +  OFDM_IDLE,  /* Module is not doing anything */
  3507. +  OFDM_SEND,  /* Module is ready to send or sending */
  3508. +  OFDM_RECV,  /* Module is can receive or is receiving */
  3509. +  OFDM_RX2TX, /* Module is transitioning from receiving mode to sending mode */
  3510. +  OFDM_TX2RX  /* Module is transitioning from sending mode to receiving mode */
  3511. +};
  3512. +
  3513. +/** Definition of supported rate */
  3514. +enum Ofdm_mod_rate {
  3515. +  OFDM_BPSK_1_2,   /* Efficiency is 1 bps/Hz */
  3516. +  OFDM_QPSK_1_2,   /* Efficiency is 2 bps/Hz */
  3517. +  OFDM_QPSK_3_4,   /* Efficiency is 2 bps/Hz */
  3518. +  OFDM_16QAM_1_2,  /* Efficiency is 4 bps/Hz */
  3519. +  OFDM_16QAM_3_4,  /* Efficiency is 4 bps/Hz */
  3520. +  OFDM_64QAM_2_3,  /* Efficiency is 6 bps/Hz */
  3521. +  OFDM_64QAM_3_4,  /* Efficiency is 6 bps/Hz */
  3522. +};
  3523. +
  3524. +/**
  3525. + * How to compute the number of information bit per symbol:
  3526. + * - Each symbol has 192 data subcarrier (200-8 for pilots)
  3527. + * - A modulation has a coding rate (1/2, 2/3, or 3/4)
  3528. + * - A modulation has an efficiency (1, 2, 4, or 6)
  3529. + * - There is a 0x00 tail byte at the end of each OFDM symbol
  3530. + * So for BPSK, 192*1*1/2-8=88
  3531. + */
  3532. +enum Ofdm_bit_per_symbol {
  3533. +  OFDM_BPSK_1_2_bpsymb = 88,   
  3534. +  OFDM_QPSK_1_2_bpsymb = 184,   
  3535. +  OFDM_QPSK_3_4_bpsymb = 280,   
  3536. +  OFDM_16QAM_1_2_bpsymb = 376,  
  3537. +  OFDM_16QAM_3_4_bpsymb = 578,  
  3538. +  OFDM_64QAM_2_3_bpsymb = 760,  
  3539. +  OFDM_64QAM_3_4_bpsymb = 856,  
  3540. +};
  3541. +
  3542. +/** 
  3543. + * Class OFDMPhy
  3544. + * Physical layer implementing OFDM
  3545. + */ 
  3546. +class OFDMPhy : public WirelessPhy {
  3547. +
  3548. +public:
  3549. +  OFDMPhy();
  3550. +
  3551. +  /**
  3552. +   * Change the frequency at which the phy is operating
  3553. +   * @param freq The new frequency
  3554. +   */
  3555. +  void setFrequency (double freq);
  3556. +
  3557. +  /**
  3558. +   * Set the new modulation for the physical layer
  3559. +   * @param modulation The new physical modulation
  3560. +   */
  3561. +  void  setModulation (Ofdm_mod_rate modulation);    
  3562. +  
  3563. +  /**
  3564. +   * Return the current modulation
  3565. +   */
  3566. +  Ofdm_mod_rate  getModulation ();
  3567. +    
  3568. +  /**
  3569. +   * Set the new transmitting power
  3570. +   * @param power The new transmitting power
  3571. +   */
  3572. +  void  setTxPower (double power);
  3573. +  
  3574. +  /**
  3575. +   * Return the current transmitting power
  3576. +   */
  3577. +  double  getTxPower ();
  3578. +  
  3579. +  /**
  3580. +   * Return the duration of a PS (physical slot), unit for allocation time.
  3581. +   * Use Frame duration / PS to find the number of available slot per frame
  3582. +   */
  3583. +  inline double  getPS () { return (4/fs_); }
  3584. +    
  3585. +  /**
  3586. +   * Return the OFDM symbol duration time
  3587. +   */
  3588. +  double getSymbolTime ();
  3589. +
  3590. +  /**
  3591. +   * Compute the transmission time for a packet of size sdusize and
  3592. +   * using the given modulation
  3593. +   */
  3594. +  double getTrxTime (int, Ofdm_mod_rate);
  3595. +
  3596. +  /**
  3597. +   * Return the maximum size in bytes that can be sent for the given 
  3598. +   * nb of symbols and modulation
  3599. +   */
  3600. +  int getMaxPktSize (double nbsymbols, Ofdm_mod_rate);
  3601. +
  3602. +  /**
  3603. +   * Return the number of PS used by an OFDM symbol
  3604. +   */
  3605. +  inline int getSymbolPS () { return (int) (ceil (getSymbolTime() / getPS())); }
  3606. +
  3607. +  /** 
  3608. +   * Set the mode for physical layer
  3609. +   */
  3610. +  void setMode (Ofdm_phy_state mode);
  3611. +
  3612. +  /**
  3613. +   * Activate node
  3614. +   */
  3615. +  void node_on ();
  3616. +  
  3617. +  /**
  3618. +   * Deactivate node
  3619. +   */
  3620. +  void node_off ();
  3621. +
  3622. +protected:
  3623. +
  3624. +  /**
  3625. +   * Update the sampling frequency. Called after changing frequency BW
  3626. +   */
  3627. +  void updateFs ();
  3628. +
  3629. +  /* 
  3630. +   * Return the delay required for switching for Rx to Tx mode
  3631. +   */
  3632. +  //inline double getRx2TxDelay () { return getPS () * rtg_; }
  3633. +
  3634. +  /* 
  3635. +   * Return the delay required for switching for Tx to Rx mode
  3636. +   */
  3637. +  //inline double getTx2RxDelay () { return getPS () * ttg_; }
  3638. +
  3639. +
  3640. +  /* Overwritten methods for handling packets */
  3641. +  void sendDown(Packet *p);
  3642. +  int sendUp(Packet *p);
  3643. +
  3644. +private:
  3645. +
  3646. +  /**
  3647. +   * The current modulation
  3648. +   */
  3649. +   Ofdm_mod_rate modulation_;
  3650. +  /**
  3651. +   * The current transmitting power
  3652. +   */
  3653. +   int tx_power_;
  3654. +  /**
  3655. +   * Ratio of CP time over useful time
  3656. +   */
  3657. +   double g_;
  3658. +  /**
  3659. +   * The number of PS required to switch from Receiver to Transmitter
  3660. +   */
  3661. +   //int rtg_;
  3662. +  /**
  3663. +   * The number of PS required to switch from Transmitter to Receiver
  3664. +   */
  3665. +   //int ttg_;
  3666. +
  3667. +   /**
  3668. +    * The sampling frequency 
  3669. +    */
  3670. +   double fs_;
  3671. +   
  3672. +   /**
  3673. +    * The frequency bandwidth (Hz)
  3674. +    */
  3675. +   double fbandwidth_;
  3676. +   
  3677. +   /**
  3678. +    * The state of the OFDM
  3679. +    */
  3680. +   Ofdm_phy_state state_;
  3681. +   
  3682. +   /**
  3683. +    * Indicates if the node is activated
  3684. +    */
  3685. +   bool activated_;
  3686. +      
  3687. +};
  3688. +#endif //OFDMPHY_H
  3689. +
  3690. diff -Naur ns-2.29-org/wimax/peernode.cc ns-2.29/wimax/peernode.cc
  3691. --- ns-2.29-org/wimax/peernode.cc 1969-12-31 19:00:00.000000000 -0500
  3692. +++ ns-2.29/wimax/peernode.cc 2006-09-22 17:27:47.000000000 -0400
  3693. @@ -0,0 +1,123 @@
  3694. +/* This software was developed at the National Institute of Standards and
  3695. + * Technology by employees of the Federal Government in the course of
  3696. + * their official duties. Pursuant to title 17 Section 105 of the United
  3697. + * States Code this software is not subject to copyright protection and
  3698. + * is in the public domain.
  3699. + * NIST assumes no responsibility whatsoever for its use by other parties,
  3700. + * and makes no guarantees, expressed or implied, about its quality,
  3701. + * reliability, or any other characteristic.
  3702. + * <BR>
  3703. + * We would appreciate acknowledgement if the software is used.
  3704. + * <BR>
  3705. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  3706. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  3707. + * FROM THE USE OF THIS SOFTWARE.
  3708. + * </PRE></P>
  3709. + * @author  rouil
  3710. + */
  3711. +
  3712. +#include "peernode.h"
  3713. +
  3714. +/**
  3715. + * Constructor
  3716. + * @param index The Mac address of the peer node
  3717. + */
  3718. +PeerNode::PeerNode (int index): basic_(0), primary_(0), secondary_(0), indata_(0),
  3719. + outdata_(0), rxtime_ (0.0), rxp_watch_()
  3720. +{
  3721. +  peerIndex_ = index;
  3722. +  going_down_ = false;
  3723. +}
  3724. +    
  3725. +/**
  3726. + * Set the basic connection
  3727. + * @param connection The basic connection
  3728. + */
  3729. +void PeerNode::setBasic (Connection* connection ) 
  3730. +{
  3731. +  assert (connection != NULL);
  3732. +
  3733. +  basic_ = connection;
  3734. +  connection->set_category (CONN_BASIC);
  3735. +  connection->setPeerNode (this);
  3736. +}
  3737. +
  3738. +/**
  3739. + * Set the primary connection
  3740. + * @param connection The primary connection
  3741. + */
  3742. +void PeerNode::setPrimary (Connection* connection ) 
  3743. +{
  3744. +  assert (connection != NULL);
  3745. +
  3746. +  primary_ = connection;
  3747. +  connection->set_category (CONN_PRIMARY);
  3748. +  connection->setPeerNode (this);
  3749. +}
  3750. +
  3751. +/**
  3752. + * Set the secondary connection
  3753. + * @param connection The secondary connection
  3754. + */
  3755. +void PeerNode::setSecondary (Connection* connection ) 
  3756. +{
  3757. +  assert (connection != NULL);
  3758. +  
  3759. +  secondary_ = connection;
  3760. +  connection->set_category (CONN_SECONDARY);
  3761. +  connection->setPeerNode (this);
  3762. +}
  3763. +
  3764. +/**
  3765. + * Set the incoming data connection
  3766. + * @param connection The connection
  3767. + */
  3768. +void PeerNode::setInData (Connection* connection ) 
  3769. +{
  3770. +  assert (connection != NULL);
  3771. +  
  3772. +  indata_ = connection;
  3773. +  connection->set_category (CONN_DATA);
  3774. +  connection->setPeerNode (this);
  3775. +}
  3776. +
  3777. +/**
  3778. + * Set the outgoing data connection
  3779. + * @param connection The connection
  3780. + */
  3781. +void PeerNode::setOutData (Connection* connection ) 
  3782. +{
  3783. +  assert (connection != NULL);
  3784. +  
  3785. +  outdata_ = connection;
  3786. +  connection->set_category (CONN_DATA);
  3787. +  connection->setPeerNode (this);
  3788. +}
  3789. +
  3790. +/**
  3791. + * Set the time the last packet was received
  3792. + * @param time The time the last packet was received
  3793. + */
  3794. +void PeerNode::setRxTime (double time)
  3795. +{
  3796. +  assert (time >=0.0);
  3797. +  rxtime_ = time;
  3798. +}
  3799. +
  3800. +/**
  3801. + * Get the time the last packet was received
  3802. + * @return The time the last packet was received
  3803. +   */
  3804. +double PeerNode::getRxTime ()
  3805. +{
  3806. +  return rxtime_;
  3807. +}
  3808. +
  3809. +/**
  3810. + * Return the stat watch
  3811. + * @return The stat watch
  3812. + */
  3813. +StatWatch * PeerNode::getStatWatch()
  3814. +{
  3815. +  return &rxp_watch_;
  3816. +}
  3817. diff -Naur ns-2.29-org/wimax/peernode.h ns-2.29/wimax/peernode.h
  3818. --- ns-2.29-org/wimax/peernode.h 1969-12-31 19:00:00.000000000 -0500
  3819. +++ ns-2.29/wimax/peernode.h 2006-09-22 17:27:47.000000000 -0400
  3820. @@ -0,0 +1,197 @@
  3821. +/* This software was developed at the National Institute of Standards and
  3822. + * Technology by employees of the Federal Government in the course of
  3823. + * their official duties. Pursuant to title 17 Section 105 of the United
  3824. + * States Code this software is not subject to copyright protection and
  3825. + * is in the public domain.
  3826. + * NIST assumes no responsibility whatsoever for its use by other parties,
  3827. + * and makes no guarantees, expressed or implied, about its quality,
  3828. + * reliability, or any other characteristic.
  3829. + * <BR>
  3830. + * We would appreciate acknowledgement if the software is used.
  3831. + * <BR>
  3832. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  3833. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  3834. + * FROM THE USE OF THIS SOFTWARE.
  3835. + * </PRE></P>
  3836. + * @author  rouil
  3837. + */
  3838. +
  3839. +#ifndef PEERNODE_H
  3840. +#define PEERNODE_H
  3841. +
  3842. +#include "connection.h"
  3843. +#include "mac-stats.h"
  3844. +
  3845. +class PeerNode;
  3846. +LIST_HEAD (peerNode, PeerNode);
  3847. +/**
  3848. + * Class PeerNode
  3849. + * Supports list
  3850. + */ 
  3851. +class PeerNode {
  3852. +
  3853. +public:
  3854. +
  3855. +  /**
  3856. +   * Constructor
  3857. +   * @param index The Mac address of the peer node
  3858. +   */
  3859. +  PeerNode (int index);
  3860. +  
  3861. +  /**
  3862. +   * Return the address of the peer node
  3863. +   * @return The address of the peer node
  3864. +   */
  3865. +  int getPeerNode () { return peerIndex_; }
  3866. +
  3867. +  /**
  3868. +   * Set the connection for delay-intolerant management messages
  3869. +   * @param connection The connection used as basic 
  3870. +   */
  3871. +  void  setBasic (Connection * connection);
  3872. +  
  3873. +  /**
  3874. +   * Return the connection used for delay-intolerant messages
  3875. +   */
  3876. +  Connection*  getBasic () { return basic_; }
  3877. +  
  3878. +  /**
  3879. +   * Set the connection for delay-tolerant management messages
  3880. +   * @param connection 
  3881. +   */
  3882. +  void  setPrimary (Connection * connection);
  3883. +  
  3884. +  /**
  3885. +   * Return the connection used for delay-tolerant messages
  3886. +   */
  3887. +  inline Connection*  getPrimary () { return primary_; }
  3888. +  
  3889. +  /**
  3890. +   * Set the channel used for standard-based messages
  3891. +   * @param connection 
  3892. +   */
  3893. +  void  setSecondary (Connection * connection);
  3894. +  
  3895. +  /**
  3896. +   * Return the connection used for standard-based messages
  3897. +   */
  3898. +  Connection*  getSecondary () { return secondary_; }
  3899. +
  3900. +  /**
  3901. +   * Set the channel used for data messages
  3902. +   * @param connection 
  3903. +   */
  3904. +  void  setInData (Connection * connection);
  3905. +  
  3906. +  /**
  3907. +   * Set the channel used for data messages
  3908. +   * @param connection 
  3909. +   */
  3910. +  void  setOutData (Connection * connection);
  3911. +  
  3912. +  /**
  3913. +   * Return the connection used for data messages
  3914. +   */
  3915. +  Connection*  getOutData () { return outdata_; }
  3916. +
  3917. +  /**
  3918. +   * Return the connection used for data messages
  3919. +   */
  3920. +  Connection*  getInData () { return indata_; }
  3921. +
  3922. +  /**
  3923. +   * Set the time the last packet was received
  3924. +   * @param time The time the last packet was received
  3925. +   */
  3926. +  void setRxTime (double time);
  3927. +
  3928. +  /**
  3929. +   * Get the time the last packet was received
  3930. +   * @return The time the last packet was received
  3931. +   */
  3932. +  double getRxTime ();  
  3933. +
  3934. +  /**
  3935. +   * Return the stat watch
  3936. +   * @return The stat watch
  3937. +   */
  3938. +  StatWatch * getStatWatch();
  3939. +
  3940. +  /**
  3941. +   * Return true if the peer is going down
  3942. +   * @return true if the peer is going down
  3943. +   */
  3944. +  inline bool isGoingDown () { return going_down_; }
  3945. +
  3946. +  /**
  3947. +   * Set the status of going down
  3948. +   * @param status The link going down status
  3949. +   */
  3950. +  inline void setGoingDown (bool status) { going_down_ = status; }
  3951. +
  3952. +  // Chain element to the list
  3953. +  inline void insert_entry(struct peerNode *head) {
  3954. +    LIST_INSERT_HEAD(head, this, link);
  3955. +  }
  3956. +  
  3957. +  // Return next element in the chained list
  3958. +  PeerNode* next_entry(void) const { return link.le_next; }
  3959. +
  3960. +  // Remove the entry from the list
  3961. +  inline void remove_entry() { 
  3962. +    LIST_REMOVE(this, link); 
  3963. +  }  
  3964. +protected:
  3965. +
  3966. +  /*
  3967. +   * Pointer to next in the list
  3968. +   */
  3969. +  LIST_ENTRY(PeerNode) link;
  3970. +  //LIST_ENTRY(PeerNode); //for magic draw
  3971. +
  3972. +private:
  3973. +  /**
  3974. +   * Mac address of peer node
  3975. +   */
  3976. +  int peerIndex_;
  3977. +
  3978. +  /**
  3979. +   * Used to send delay intolerant management messages
  3980. +   */
  3981. +   Connection* basic_;
  3982. +  /**
  3983. +   * Used to send delay tolerant mac messages
  3984. +   */
  3985. +   Connection* primary_;
  3986. +  /**
  3987. +   * Used to transport standard-based protocol (DHCP...)
  3988. +   */
  3989. +   Connection* secondary_;
  3990. +  /**
  3991. +   * Incomfing data connection to this client
  3992. +   */
  3993. +   Connection* indata_;  
  3994. +   
  3995. +  /**
  3996. +   * Outgoing data connection to this client
  3997. +   */
  3998. +   Connection* outdata_;  
  3999. +   
  4000. +   /**
  4001. +    * Time last packet was received for this peer
  4002. +    */
  4003. +   double rxtime_;
  4004. +
  4005. +   /**
  4006. +    * Received signal strength stats
  4007. +    */
  4008. +   StatWatch rxp_watch_;
  4009. +
  4010. +   /**
  4011. +    * Inidicate the link going down status of the peer node
  4012. +    */
  4013. +   bool going_down_;
  4014. +
  4015. +};
  4016. +#endif //PEERNODE_H
  4017. +
  4018. diff -Naur ns-2.29-org/wimax/plot-data ns-2.29/wimax/plot-data
  4019. --- ns-2.29-org/wimax/plot-data 1969-12-31 19:00:00.000000000 -0500
  4020. +++ ns-2.29/wimax/plot-data 2006-09-22 17:27:47.000000000 -0400
  4021. @@ -0,0 +1,17 @@
  4022. +reset
  4023. +set terminal post eps
  4024. +set output "synch.eps"
  4025. +set nogrid
  4026. +#set logscale y
  4027. +set xlabel "dcd interval (s)" 
  4028. +set ylabel "Synchronization latency (s)"
  4029. +set xrange [0:10]
  4030. +set yrange [0:11]
  4031. +#set key 45,0.45
  4032. +set title "Thoeratical synchronization latency"
  4033. +plot "result1.dat" using 1:3 title "ucd interval=1s" with lp, 
  4034. +"result2.dat" using 1:3 title "ucd interval=2s" with lp, 
  4035. +"result5.dat" using 1:3 title "ucd interval=5s" with lp, 
  4036. +"result10.dat" using 1:3 title "ucd interval=10s" with lp
  4037. +
  4038. +
  4039. diff -Naur ns-2.29-org/wimax/scheduling/bsscheduler.cc ns-2.29/wimax/scheduling/bsscheduler.cc
  4040. --- ns-2.29-org/wimax/scheduling/bsscheduler.cc 1969-12-31 19:00:00.000000000 -0500
  4041. +++ ns-2.29/wimax/scheduling/bsscheduler.cc 2006-09-22 17:27:47.000000000 -0400
  4042. @@ -0,0 +1,1003 @@
  4043. +/* This software was developed at the National Institute of Standards and
  4044. + * Technology by employees of the Federal Government in the course of
  4045. + * their official duties. Pursuant to title 17 Section 105 of the United
  4046. + * States Code this software is not subject to copyright protection and
  4047. + * is in the public domain.
  4048. + * NIST assumes no responsibility whatsoever for its use by other parties,
  4049. + * and makes no guarantees, expressed or implied, about its quality,
  4050. + * reliability, or any other characteristic.
  4051. + * <BR>
  4052. + * We would appreciate acknowledgement if the software is used.
  4053. + * <BR>
  4054. + * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  4055. + * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  4056. + * FROM THE USE OF THIS SOFTWARE.
  4057. + * </PRE></P>
  4058. + * @author  rouil
  4059. + */
  4060. +
  4061. +#include "bsscheduler.h"
  4062. +#include "burst.h"
  4063. +#include "dlburst.h"
  4064. +#include "ulburst.h"
  4065. +#include "random.h"
  4066. +#include "wimaxctrlagent.h"
  4067. +
  4068. +/**
  4069. + * Bridge to TCL for BSScheduler
  4070. + */
  4071. +static class BSSchedulerClass : public TclClass {
  4072. +public:
  4073. +  BSSchedulerClass() : TclClass("WimaxScheduler/BS") {}
  4074. +  TclObject* create(int, const char*const*) {
  4075. +    return (new BSScheduler());
  4076. +    
  4077. +  }
  4078. +} class_bsscheduler;
  4079. +
  4080. +/*
  4081. + * Create a scheduler
  4082. + */
  4083. +BSScheduler::BSScheduler () : cl_head_(0), cl_tail_(0), ctrlagent_(0)
  4084. +{
  4085. +  debug2 ("BSScheduler createdn");
  4086. +  LIST_INIT (&t17_head_);
  4087. +  LIST_INIT (&scan_stations_);
  4088. +  LIST_INIT (&fast_ranging_head_);
  4089. +  bw_peer_ = NULL;
  4090. +  bw_node_index_ = 0;
  4091. +  default_mod_ = OFDM_BPSK_1_2;
  4092. +  contention_size_ = MIN_CONTENTION_SIZE;
  4093. +  sendDCD = false;
  4094. +  dlccc_ = 0;
  4095. +  sendUCD = false;
  4096. +  ulccc_ = 0;
  4097. +}
  4098. +/*
  4099. + * Interface with the TCL script
  4100. + * @param argc The number of parameter
  4101. + * @param argv The list of parameters
  4102. + */
  4103. +int BSScheduler::command(int argc, const char*const* argv)
  4104. +{
  4105. +  if (argc == 3) {
  4106. +    if (strcmp(argv[1], "set-default-modulation") == 0) {
  4107. +      if (strcmp(argv[2], "OFDM_BPSK_1_2") == 0)
  4108. + default_mod_ = OFDM_BPSK_1_2;
  4109. +      else if (strcmp(argv[2], "OFDM_QPSK_1_2") == 0)
  4110. + default_mod_ = OFDM_QPSK_1_2;
  4111. +      else if (strcmp(argv[2], "OFDM_QPSK_3_4") == 0)
  4112. + default_mod_ = OFDM_QPSK_3_4;
  4113. +      else if (strcmp(argv[2], "OFDM_16QAM_1_2") == 0)
  4114. + default_mod_ = OFDM_16QAM_1_2;
  4115. +      else if (strcmp(argv[2], "OFDM_16QAM_3_4") == 0)
  4116. + default_mod_ = OFDM_16QAM_3_4;
  4117. +      else if (strcmp(argv[2], "OFDM_64QAM_2_3") == 0)
  4118. + default_mod_ = OFDM_64QAM_2_3;
  4119. +      else if (strcmp(argv[2], "OFDM_64QAM_3_4") == 0)
  4120. + default_mod_ = OFDM_64QAM_3_4;
  4121. +      else
  4122. + return TCL_ERROR;
  4123. +      return TCL_OK;
  4124. +    }
  4125. +    else if (strcmp(argv[1], "set-contention-size") == 0) {
  4126. +      contention_size_ = atoi (argv[2]);
  4127. +      assert (contention_size_>=0);
  4128. +      return TCL_OK;
  4129. +    }
  4130. +  }
  4131. +  return TCL_ERROR;
  4132. +}
  4133. +
  4134. +/**
  4135. + * Initializes the scheduler
  4136. + */
  4137. +void BSScheduler::init ()
  4138. +{
  4139. +  WimaxScheduler::init();
  4140. +
  4141. +  /*print debug information */
  4142. +  int nbPS = (int) round((mac_->getFrameDuration()/mac_->getPhy()->getPS()));
  4143. +  debug2 ("duration=%f, PStime=%f, nbPS=%d,Symbol time=%f, %d n",mac_->getFrameDuration(), mac_->getPhy()->getPS(), nbPS, mac_->getPhy()->getSymbolTime (), mac_->getPhy()->getSymbolPS());
  4144. +
  4145. +  //At initialization, allocate one DL burst 
  4146. +  //and contention windows
  4147. +  //1-create one profile to be used for broadcast 
  4148. +  //  packets (and DL_MAP...)
  4149. +  Profile *p = map_->getDlSubframe()->addProfile ((int)round((mac_->getPhy()->getFreq()/1000)), default_mod_);
  4150. +  p->setIUC (DIUC_PROFILE_1);
  4151. +  map_->getDlSubframe()->getPdu ()->setPreamble (DL_PREAMBLE); //preamble + fch
  4152. +  //2-add the burst to carry the broadcast message
  4153. +  DlBurst *b = (DlBurst*) map_->getDlSubframe()->getPdu ()->addBurst (0);
  4154. +  b->setCid ( BROADCAST_CID );
  4155. +  b->setIUC (p->getIUC());
  4156. +  b->setStarttime (0); //after preamble and fch
  4157. +  b->setDuration (INIT_DL_DURATION); //enough to send DL_MAP...
  4158. +  b->setPreamble(true); //this is the first burst after preamble
  4159. +  //3-Add the End of map element
  4160. +  b = (DlBurst*) map_->getDlSubframe()->getPdu ()->addBurst (1);
  4161. +  b->setIUC (DIUC_END_OF_MAP);
  4162. +  b->setStarttime (INIT_DL_DURATION);
  4163. +
  4164. +  //create uplink 
  4165. +  //start of UL subframe is after DL and TTG and unit is PS
  4166. +  int starttime = (INIT_DL_DURATION+DL_PREAMBLE)*mac_->getPhy()->getSymbolPS()+mac_->phymib_.ttg;
  4167. +  map_->getUlSubframe()->setStarttime (starttime);
  4168. +  int slotleft = nbPS - starttime - mac_->phymib_.rtg;
  4169. +  //duration is in unit of ofdm symbols
  4170. +  int rangingslot = slotleft/2;
  4171. +  int rangingduration =(int) round(((mac_->getPhy()->getPS()*rangingslot)/mac_->getPhy()->getSymbolTime()));
  4172. +  int bwduration = (int) round(((mac_->getPhy()->getPS()*(slotleft - rangingslot))/mac_->getPhy()->getSymbolTime()));
  4173. +
  4174. +  //we open the uplink to initial ranging and bw requests
  4175. +  //add profile for the ranging burst
  4176. +  p = map_->getUlSubframe()->addProfile (0, default_mod_);
  4177. +  p->setIUC (UIUC_INITIAL_RANGING);
  4178. +  ContentionSlot *slot = map_->getUlSubframe()->getRanging ();
  4179. +  slot->setSize (getInitRangingopportunity ());
  4180. +  slot->setBackoff_start (mac_->macmib_.rng_backoff_start);
  4181. +  slot->setBackoff_stop (mac_->macmib_.rng_backoff_stop);
  4182. +  //create burst to represent the contention slot
  4183. +  Burst* b2 = map_->getUlSubframe()->addPhyPdu (0,0)->addBurst (0);
  4184. +  b2->setIUC (UIUC_INITIAL_RANGING);
  4185. +  b2->setDuration (rangingduration);
  4186. +  b2->setStarttime (0); //we put the contention at the begining
  4187. +
  4188. +  //now the bw request
  4189. +  //add profile for the bw burst
  4190. +  p = map_->getUlSubframe()->addProfile (0, default_mod_);
  4191. +  p->setIUC (UIUC_REQ_REGION_FULL);  
  4192. +  slot = map_->getUlSubframe()->getBw_req ();
  4193. +  slot->setSize (getBWopportunity ());
  4194. +  slot->setBackoff_start (mac_->macmib_.bw_backoff_start);
  4195. +  slot->setBackoff_stop (mac_->macmib_.rng_backoff_stop);
  4196. +  b2 = map_->getUlSubframe()->addPhyPdu (1,0)->addBurst (0);
  4197. +  b2->setIUC (UIUC_REQ_REGION_FULL);
  4198. +  b2->setDuration (bwduration);
  4199. +  b2->setStarttime (rangingduration); //start after the ranging slot
  4200. +
  4201. +  //end of map
  4202. +  b2 = map_->getUlSubframe()->addPhyPdu (2,0)->addBurst (0);
  4203. +  b2->setIUC (UIUC_END_OF_MAP);
  4204. +  b2->setStarttime (rangingduration+bwduration);
  4205. +
  4206. +  //schedule the first frame by using a random backoff to avoid
  4207. +  //synchronization between BSs.
  4208. +  double stime = Random::uniform(0, mac_->getFrameDuration ());
  4209. +  dl_timer_->sched (stime);
  4210. +
  4211. +  ul_timer_->sched (stime+starttime*mac_->getPhy()->getPS());
  4212. +
  4213. +  //also start the DCD and UCD timer
  4214. +  dcdtimer_ = new WimaxDCDTimer (mac_);
  4215. +  ucdtimer_ = new WimaxUCDTimer (mac_);
  4216. +  nbradvtimer_ = new WimaxMobNbrAdvTimer (mac_);
  4217. +  dcdtimer_->start (mac_->macmib_.dcd_interval);
  4218. +  ucdtimer_->start (mac_->macmib_.ucd_interval);
  4219. +  nbradvtimer_->start (mac_->macmib_.nbr_adv_interval+stime);
  4220. +}
  4221. +
  4222. +/**
  4223. + * Compute and return the bandwidth request opportunity size
  4224. + * @return The bandwidth request opportunity size
  4225. + */
  4226. +int BSScheduler::getBWopportunity ()
  4227. +{
  4228. +  int nbPS = BW_REQ_PREAMBLE * mac_->getPhy()->getSymbolPS();
  4229. +  //add PS for carrying header
  4230. +  nbPS += (int) round((mac_->getPhy()->getTrxTime (HDR_MAC802_16_SIZE, map_->getUlSubframe()->getProfile(UIUC_REQ_REGION_FULL)->getEncoding())/mac_->getPhy()->getPS ()));
  4231. +  //printf ("BWopportunity size=%dn", nbPS);
  4232. +  return nbPS;
  4233. +}
  4234. +
  4235. +/**
  4236. + * Compute and return the initial ranging opportunity size
  4237. + * @return The initial ranging opportunity size
  4238. + */
  4239. +int BSScheduler::getInitRangingopportunity ()
  4240. +{
  4241. +  int nbPS = INIT_RNG_PREAMBLE * mac_->getPhy()->getSymbolPS();
  4242. +  //add PS for carrying header
  4243. +  nbPS += (int) round((mac_->getPhy()->getTrxTime (RNG_REQ_SIZE+HDR_MAC802_16_SIZE, map_->getUlSubframe()->getProfile(UIUC_INITIAL_RANGING)->getEncoding())/mac_->getPhy()->getPS ()));
  4244. +  //printf ("Init ranging opportunity size=%dn", nbPS);
  4245. +  return nbPS;  
  4246. +}
  4247. +
  4248. +/**
  4249. + * Called when a timer expires
  4250. + * @param The timer ID
  4251. + */
  4252. +void BSScheduler::expire (timer_id id)
  4253. +{
  4254. +  switch (id) {
  4255. +  case WimaxDCDTimerID:
  4256. +    sendDCD = true;
  4257. +    mac_->debug ("At %f in Mac %d DCDtimer expiredn", NOW, mac_->addr());
  4258. +    dcdtimer_->start (mac_->macmib_.dcd_interval);
  4259. +    break;
  4260. +  case WimaxUCDTimerID:
  4261. +    sendUCD = true;
  4262. +    mac_->debug ("At %f in Mac %d UCDtimer expiredn", NOW, mac_->addr());
  4263. +    ucdtimer_->start (mac_->macmib_.ucd_interval);
  4264. +    break;
  4265. +  case WimaxMobNbrAdvTimerID:
  4266. +    send_nbr_adv();
  4267. +    nbradvtimer_->start (mac_->macmib_.nbr_adv_interval);
  4268. +    break;
  4269. +  default:
  4270. +    mac_->debug ("Warning: unknown timer expired in BSSchedulern");
  4271. +  }
  4272. +}
  4273. +
  4274. +/**
  4275. + * Set the control agent
  4276. + */
  4277. +void BSScheduler::setCtrlAgent (WimaxCtrlAgent *agent)