mac802_16pkt.h
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:24k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #ifndef MAC802_16PKT_H
  19. #define MAC802_16PKT_H
  20. #include "packet.h"
  21. #include "ofdmphy.h"
  22. //#define HDR_MAC802_16(p) ((hdr_mac802_16 *)hdr_mac::access(p))
  23. #define HDR_MAC802_16(p) (hdr_mac802_16::access(p))
  24. #define HDR_MAC802_16_SIZE 6
  25. #define HDR_MAC802_16_FRAGSUB_SIZE 2
  26. /** Define fragmentation encoding */
  27. enum fragment_status {
  28.   FRAG_NOFRAG = 0,
  29.   FRAG_LAST,
  30.   FRAG_FIRST,
  31.   FRAG_CONT
  32. };
  33.   
  34. /** Define Mac management type */
  35. enum mngmt_type {
  36.   MAC_UCD = 0,
  37.   MAC_DCD,
  38.   MAC_DL_MAP,
  39.   MAC_UL_MAP,
  40.   MAC_RNG_REQ,
  41.   MAC_RNG_RSP,
  42.   MAC_REG_REQ,
  43.   MAC_REG_RSP,
  44.   // 8: reserved
  45.   // 9-10: Privacy key, not used 
  46.   MAC_DSA_REQ=11,
  47.   MAC_DSA_RSP,
  48.   MAC_DSA_ACK,
  49.   
  50.   MAC_MOB_NBR_ADV=53,
  51.   MAC_MOB_SCN_REQ,
  52.   MAC_MOB_SCN_RSP,
  53.   MAC_MOB_BSHO_REQ,
  54.   MAC_MOB_MSHO_REQ,
  55.   MAC_MOB_BSHO_RSP,
  56.   MAC_MOB_HO_IND,
  57.   MAC_MOB_SCN_REP,
  58.   MAC_MOB_ASC_REP=66
  59. };
  60. /** Enumeration of scanning types */
  61. enum wimax_scanning_type {
  62.   SCAN_WITHOUT_ASSOC,
  63.   SCAN_ASSOC_LVL0,
  64.   SCAN_ASSOC_LVL1,
  65.   SCAN_ASSOC_LVL2
  66. };
  67. /** Structure containing physical layer information */
  68. struct phy_info_t {
  69.   double freq_;              //the frequency at which it is sent
  70.   Ofdm_mod_rate modulation_; //modulation at which the packet was sent
  71.   double g_; //The cyclic prefix information. Used for synchronization
  72. };
  73. /** Define generic MAC header */
  74. struct gen_mac_header_t {
  75.   u_char ht : 1;
  76.   u_char ec : 1;
  77.   u_char type : 6;
  78.   u_char rsv1: 1;
  79.   u_char ci: 1;
  80.   u_char eks: 2;
  81.   u_char rsv2: 1;
  82.   u_int16_t len: 11;
  83.   u_int16_t cid;
  84.   u_char hcs;
  85. };
  86. /** Define bandwidth request header */
  87. struct bw_req_header_t {
  88.   u_char ht : 1;
  89.   u_char ec : 1;
  90.   u_char type : 3;  
  91.   u_int32_t br : 19;
  92.   u_int16_t cid;
  93.   u_char hcs;  
  94. };
  95. /** Define structure for packet information */
  96. struct hdr_mac802_16
  97. {
  98.   //virtual info for physical layer
  99.   phy_info_t phy_info;
  100.   
  101.   //generic mac header or bw request header
  102.   gen_mac_header_t header;
  103.   //check how to put the subheaders (piggyback)
  104.   bool frag_subheader; //set to true if there is a fragmentation subheader
  105.   char fc : 2;  //00:no fragmentation, 01:last, 10: first, 11: middle 
  106.   char fsn : 3; //fragmentation number 
  107.   //for management frames, we put 
  108.   //payload in the packet payload
  109.   //because the size changes
  110.   //Packet header access functions
  111.   static int offset_;
  112.   inline static int& offset() {return offset_;}
  113.   inline static hdr_mac802_16* access(const Packet* p)
  114.   {
  115.     return (hdr_mac802_16*) p->access(offset_);
  116.   }
  117. };
  118. /**** Defines some constant for the maximum size of messages ****/
  119. /* When sending a packet, the message is copied for each 
  120.  * destination. In that case, we need to store all the information
  121.  * in the packet itself and not use pointer. We then use arrays.
  122.  */
  123. #define MAX_MAP_IE  10
  124. #define MAX_PROFILE 10
  125. #define MAX_NBR     10
  126. /**** Defines IEs ****/
  127. /** Defines DL_MAP IE (see p462.) */
  128. struct mac802_16_dlmap_ie {
  129.   u_int16_t cid;
  130.   u_char diuc : 4;            //p463
  131.   u_char preamble : 1;
  132.   u_int16_t start_time : 11;
  133.   //may contain extended info
  134. };
  135. #define DL_MAP_IE_SIZE 4
  136. /** fast Ranging IE (802.16e) */
  137. struct mac802_16_fast_ranging_ie {
  138.   int mac_addr;  //48 bits
  139.   u_char uiuc : 4; 
  140.   u_int16_t duration : 12; //in OFDM symbols
  141. };
  142. #define FAST_RANGING_IE_SIZE 9
  143. /** Defines UL_MAP IE (see p464.) */
  144. struct mac802_16_ulmap_ie {
  145.   u_int16_t cid;
  146.   u_int16_t start_time : 11;
  147.   u_char sub_channel_index : 5;
  148.   u_char uiuc : 4;
  149.   u_int16_t duration : 11;
  150.   u_char midamble_rep : 2;
  151.   //may contain additional info depending on uiuc
  152.   u_char extended_uiuc : 4;
  153.   u_char length : 4;
  154.   mac802_16_fast_ranging_ie fast_ranging;
  155. };
  156. #define UL_MAP_IE_SIZE 6
  157. /**** Defines burst profiles ****/
  158. /* Burst profiles are TLV encoded...we just pick the info we 
  159.  * are interested in.
  160.  */
  161. /** Defines DCD profile */
  162. struct mac802_16_dcd_profile {
  163.   u_char diuc : 4;
  164.   u_int32_t frequency;
  165.   u_char fec;
  166.   //may have more info
  167. };
  168. #define DCD_PROFILE_SIZE 12
  169. /** Defines UCD profile */
  170. struct mac802_16_ucd_profile {
  171.   u_char uiuc : 4;
  172.   u_char fec;
  173.   //may have more info
  174. };
  175. #define UCD_PROFILE_SIZE 6
  176. /**** Defines frames ****/
  177. /** DCD frame */
  178. struct mac802_16_dcd_frame {
  179.   u_char type;
  180.   u_char dcid;
  181.   u_char config_change_count;
  182.   //info for all channels: TLV encoded
  183.   u_char frame_duration_code;
  184.   u_int32_t frame_number : 24;
  185.   u_char ttg;
  186.   u_char rtg;
  187.   u_int32_t frequency;
  188.   //downlink burst profiles
  189.   u_int32_t nb_prof;
  190.   mac802_16_dcd_profile profiles[MAX_PROFILE];
  191. };
  192. //+3 for the end of map profile
  193. #define GET_DCD_SIZE(X) 22+X*DCD_PROFILE_SIZE+3
  194. /** DL_MAP frame */
  195. struct mac802_16_dl_map_frame {
  196.   u_char type;
  197.   u_char dcd_count;
  198.   int bsid; //normaly 48 bits
  199.   //DL_MAP IEs
  200.   u_int32_t nb_ies;
  201.   mac802_16_dlmap_ie ies[MAX_MAP_IE]; 
  202. };
  203. //there is X IEs 
  204. #define GET_DL_MAP_SIZE(X) 8+X*DL_MAP_IE_SIZE
  205. /** UCD frame */
  206. struct mac802_16_ucd_frame {
  207.   u_char type;
  208.   u_char config_change_count;
  209.   u_char rng_backoff_start;
  210.   u_char rng_backoff_end;
  211.   u_char req_backoff_start;
  212.   u_char req_backoff_end;
  213.   //info for overall channel
  214.   /*
  215.   u_int16_t rsv_timeout;
  216.   */
  217.   u_int16_t bw_req_size;
  218.   u_int16_t rng_req_size;
  219.   //uplink burst profile
  220.   u_int32_t nb_prof;
  221.   mac802_16_ucd_profile profiles[MAX_PROFILE];
  222. };
  223. //+3 for the end of map profile
  224. #define GET_UCD_SIZE(X) 14+X*UCD_PROFILE_SIZE+3
  225. /** UL_MAP frame */
  226. struct mac802_16_ul_map_frame {
  227.   u_char type;
  228.   u_char ucid;
  229.   u_char ucd_count;
  230.   u_int32_t allocation_start;
  231.   //UL_MAP IEs
  232.   u_int32_t nb_ies;
  233.   mac802_16_ulmap_ie ies[MAX_MAP_IE];
  234. };
  235. #define GET_UL_MAP_SIZE(X) 7+X*UL_MAP_IE_SIZE
  236. /**** Defines ranging messages ****/
  237. /** Ranging request frame */
  238. struct mac802_16_rng_req_frame {
  239.   u_char type;
  240.   u_char dc_id;
  241.   /*TLV values*/
  242.   /* Requested Downlink Burst Profile
  243.    * bits 0-3: DIUC of the downlink burst profile
  244.    * bits 4-7: LSB of Configuration Change Count value
  245.    * of DCD defining the burst profile assocciated with DIUC
  246.    */
  247.   u_char req_dl_burst_profile;
  248.   int ss_mac_address; //should be 6 bytes
  249.   //u_char aas_bc_cap; //broadcast capability. optional
  250. };
  251. #define RNG_REQ_SIZE 13 //max value
  252. /** Ranging status */
  253. enum ranging_status {
  254.   RNG_CONTINUE = 1,
  255.   RNG_ABORT,
  256.   RNG_SUCCESS,
  257.   RNG_RERANGE
  258. };
  259. /** Ranging response frame */
  260. struct mac802_16_rng_rsp_frame {
  261.   u_char type;
  262.   u_char uc_id;
  263.   /*TLV values*/
  264.   u_char pw_adjust;
  265.   u_int32_t freq_adjust;
  266.   u_char rng_status;
  267.   /* byte 0: the least robust DIUC that may be used by BS for 
  268.    * transmissions to the SS
  269.    * byte 1: Configuration Change Count of DCD defining the burst profile
  270.    * associated with DIUC 
  271.    */
  272.   u_int16_t dl_op_burst_profile;
  273.   int ss_mac_address; //6 bytes
  274.   u_int16_t basic_cid;
  275.   u_int16_t primary_cid;
  276.   u_char aas_bc_perm; 
  277. };
  278. #define RNG_RSP_SIZE 28
  279. /**** Defines registration messages ****/
  280. /** Registration request frame */
  281. struct mac802_16_reg_req_frame {
  282.   u_char type;
  283.   /*TLV values*/
  284.   u_char ss_mngmt_support;
  285.   u_char ip_mngmt_support;
  286.   u_int16_t uplink_cid_support;
  287.   
  288. };
  289. #define REG_REQ_SIZE 12
  290. /** Registration response frame */
  291. struct mac802_16_reg_rsp_frame {
  292.   u_char type;
  293.   u_char response;
  294.   /*TLV values*/
  295.   u_char ss_mngmt_support;
  296.   u_int16_t sec_mngmt_cid;
  297. };
  298. #define REG_RSP_SIZE 12
  299. /**** Defines Dynamic Service Addition messages ****/
  300. /** DSA request frame */
  301. struct mac802_16_dsa_req_frame {
  302.   u_char type; //11
  303.   u_int16_t transaction_id;
  304.   /*TLV values*/
  305.   bool uplink; //direction of the flow, normaly coded in TLV with
  306.                //type 145 or 146 (see p647).
  307.   u_int16_t cid;
  308. };
  309. //parameter X indicates if cid is present (i.e request from BS)
  310. #define GET_DSA_REQ_SIZE(X) 6+4*X
  311. /** DSA response frame */
  312. struct mac802_16_dsa_rsp_frame {
  313.   u_char type; //12
  314.   u_int16_t transaction_id;
  315.   u_char confirmation_code;
  316.   /*TLV values*/
  317.   bool uplink; //direction of the flow, normaly coded in TLV with
  318.                //type 145 or 146 (see p647).
  319.   u_int16_t cid;
  320. };
  321. //parameter X indicates if cid is present (i.e response from BS)
  322. #define GET_DSA_RSP_SIZE(X) 6+4*X
  323. /** DSA Acknowledgement frame */
  324. struct mac802_16_dsa_ack_frame {
  325.   u_char type; //13
  326.   u_int16_t transaction_id;
  327.   u_char confirmation_code;
  328.   /*TLV values*/
  329.   bool uplink; //direction of the flow, normaly coded in TLV with
  330.                //type 145 or 146 (see p647).
  331. };
  332. #define DSA_ACK_SIZE 6
  333. /**** Defines Mobility messages (802.16e) ****/
  334. /** Structure of physical profile ID */
  335. struct mac802_16_phy_profile_id {
  336.   u_char colocatedFA: 1;
  337.   u_char FAconfig: 1;
  338.   u_char timefreq_synch: 2;
  339.   u_char bs_eirp: 1;
  340.   u_char dcducd_ref: 1;
  341.   u_char FAindex: 1;
  342.   u_char trigger_ref: 1;
  343. };
  344. /** Structure of physical mode ID */
  345. struct mac802_16_phy_mode_id {
  346.   u_char bandwidth: 7;
  347.   u_char fttsize: 3;
  348.   u_char cp: 2;
  349.   u_char duration_code: 4;
  350. };
  351. /** Information about a neighbor BS */
  352. struct mac802_16_nbr_adv_info {
  353.   u_char length;
  354.   mac802_16_phy_profile_id phy_profile_id;
  355.   u_char fa_index; //if FA index indicator=1 in phy_profile_id
  356.   u_char bs_eirp;
  357.   int nbr_bsid;    
  358.   u_char preamble_index; //in OFDM, 5lsb=
  359.   u_char ho_process_opt;
  360.   u_char sched_srv_supported;
  361.   u_char dcd_ccc: 4;
  362.   u_char ucd_ccc: 4;
  363.   /* other TLV information */
  364.   bool dcd_included; //tell if the dcd is included
  365.   mac802_16_dcd_frame dcd_settings;
  366.   bool ucd_included; //tell if the ucd is included
  367.   mac802_16_ucd_frame ucd_settings;
  368.   bool phy_included; //tell if the phy mode ID is included
  369.   mac802_16_phy_mode_id phy_mode_id;
  370. };
  371. /** Neighbor advertisment frame */
  372. struct mac802_16_mob_nbr_adv_frame {
  373.   u_char type; //53
  374.   u_char skip_opt_field;
  375.   u_int32_t operatorID: 24;
  376.   u_char ccc;
  377.   u_char frag_index: 4;
  378.   u_char total_frag: 4;
  379.   u_char n_neighbors; //number of neighbors
  380.   mac802_16_nbr_adv_info nbr_info[MAX_NBR];
  381. };
  382. /** Code BS using index in scan request */
  383. struct mac802_16_mob_scn_req_bs_index {
  384.   u_char neighbor_bs_index;
  385.   u_char scanning_type: 3; //0: scanning without association
  386.                            //1: scanning+assoc level 0
  387.                            //2: scanning+assoc level 1
  388.                            //3: scanning+assoc level 2
  389.                            //4-7: reserved
  390. };
  391.  
  392. /** Code BS using full address in scan request */
  393. struct mac802_16_mob_scn_req_bs_full {
  394.   int recommended_bs_id;   /* 6 bytes */
  395.   u_char scanning_type: 3; //0: scanning without association
  396.                            //1: scanning+assoc level 0
  397.                            //2: scanning+assoc level 1
  398.                            //3: scanning+assoc level 2
  399.                            //4-7: reserved
  400. };
  401. /** Scan request frame */
  402. struct mac802_16_mob_scn_req_frame {
  403.   u_char type; //54
  404.   u_char scan_duration; //units of frames
  405.   u_char interleaving_interval; //units of frames
  406.   u_char scan_iteration; //in frame
  407.   u_char n_recommended_bs_index; //number of BS recommended
  408.   u_char ccc; //present if n_recommended_bs_index!= 0
  409.   mac802_16_mob_scn_req_bs_index rec_bs_index[MAX_NBR];
  410.   u_char n_recommended_bs_full;
  411.   mac802_16_mob_scn_req_bs_full rec_bs_full[MAX_NBR];
  412.   /* TLV info*/
  413. };
  414. /** Code BS using index in scan response */
  415. struct mac802_16_mob_scn_rsp_bs_index {
  416.   u_char neighbor_bs_index;
  417.   u_char scanning_type: 3; //0: scanning without association
  418.                            //1: scanning+assoc level 0
  419.                            //2: scanning+assoc level 1
  420.                            //3: scanning+assoc level 2
  421.                            //4-7: reserved
  422.   /* next present if scanning is 2 or 3*/
  423.   u_char rdv_time;
  424.   u_char cdma_code;
  425.   u_char transmission_opp_offset;
  426. };
  427. /** Code BS using full address in scan response */
  428. struct mac802_16_mob_scn_rsp_bs_full {
  429.   int recommended_bs_id;   /* 6 bytes */
  430.   u_char scanning_type: 3; //0: scanning without association
  431.                            //1: scanning+assoc level 0
  432.                            //2: scanning+assoc level 1
  433.                            //3: scanning+assoc level 2
  434.                            //4-7: reserved
  435.   /* next present if scanning is 2 or 3*/
  436.   u_char rdv_time;
  437.   u_char cdma_code;
  438.   u_char transmission_opp_offset;
  439. };
  440. /** Scan response frame */
  441. struct mac802_16_mob_scn_rsp_frame {
  442.   u_char type; //55
  443.   u_char scan_duration; //units of frames
  444.   u_char report_mode: 2;
  445.   u_char report_period;
  446.   u_char report_metric;
  447.   /*next information present only if scan duration !=0*/
  448.   u_char start_frame: 4;
  449.   u_char interleaving_interval;
  450.   u_char scan_iteration;
  451.   u_char n_recommended_bs_index;
  452.   //next if n_recommended_bs_index !=0
  453.   u_char ccc_mob_nbr_adv;
  454.   mac802_16_mob_scn_rsp_bs_index rec_bs_index[MAX_NBR];
  455.   u_char n_recommended_bs_full;
  456.   mac802_16_mob_scn_rsp_bs_full rec_bs_full[MAX_NBR];
  457.   /* end if scan duration !=0 */
  458.   /* TLV information */
  459. };
  460. /** Measurements about current BS */
  461. struct mac802_16_mob_scn_rep_current_bs {
  462.   u_char temp_bsid: 4;
  463.   u_char bs_cinr_mean; //if report_metric[0]==1
  464.   u_char bs_rssi_mean; //if report_metric[1]==1
  465.   u_char relative_delay; //if report_metric[2]==1
  466.   u_char bs_rtd; //if report_metric[3]==1
  467. };
  468. /** Measurements about neighbor BS using index */
  469. struct mac802_16_mob_scn_rep_bs_index {
  470.   u_char neighbor_bs_index;
  471.   u_char bs_cinr_mean; //if report_metric[0]==1
  472.   u_char bs_rssi_mean; //if report_metric[1]==1
  473.   u_char relative_delay; //if report_metric[2]==1
  474. };
  475. /** Measurements about neighbor BS using full address */
  476. struct mac802_16_mob_scn_rep_bs_full {
  477.   int neighbor_bs_id; /* 6 bytes */
  478.   u_char bs_cinr_mean; //if report_metric[0]==1
  479.   u_char bs_rssi_mean; //if report_metric[1]==1
  480.   u_char relative_delay; //if report_metric[2]==1
  481. };
  482. /** Scan report frame */
  483. struct mac802_16_mob_scn_rep_frame {
  484.   u_char type; //60
  485.   u_char report_mode: 1;
  486.   u_char comp_nbr_bsid_ind: 1;
  487.   u_char n_current_bs: 3;
  488.   u_char report_metric: 8;
  489.   mac802_16_mob_scn_rep_current_bs current_bs[MAX_NBR];
  490.   u_char n_neighbor_bs_index;
  491.   //next if n_recommended_bs_index !=0
  492.   u_char ccc_mob_nbr_adv;
  493.   mac802_16_mob_scn_rep_bs_index nbr_bs_index[MAX_NBR];
  494.   u_char n_recommended_bs_full;
  495.   mac802_16_mob_scn_rep_bs_full nbr_bs_full[MAX_NBR];
  496.   /* other TLV information */
  497. };
  498. /** Code BS using index in association result report */
  499. struct mac802_16_mob_asc_rep_bs_index {
  500.   u_char neighbor_bs_index;
  501.   uint32_t timing_adjust;
  502.   u_char power_level_adjust;
  503.   uint32_t offset_freq_adjust;
  504.   u_char rng_status;
  505.   u_char service_level_prediction;
  506. };
  507. /** Code BS using address in association result report */
  508. struct mac802_16_mob_asc_rep_bs_full {
  509.   int neighbor_bs_id; /* 6 bytes */
  510.   uint32_t timing_adjust;
  511.   u_char power_level_adjust;
  512.   uint32_t offset_freq_adjust;
  513.   u_char rng_status;
  514.   u_char service_level_prediction;
  515. };
  516. /** Association result report frame */
  517. struct mac802_16_mob_asc_rep_frame {
  518.   u_char type; //66
  519.   u_char n_recommended_bs_index;
  520.   //next if n_recommended_bs_index !=0
  521.   u_char ccc_mob_nbr_adv;
  522.   mac802_16_mob_asc_rep_bs_index rec_bs_index[MAX_NBR];
  523.   u_char n_recommended_bs_full;
  524.   mac802_16_mob_asc_rep_bs_full rec_bs_full[MAX_NBR];
  525. }; 
  526. /** Code request in mode 000 (HO request) */
  527. struct mac802_16_mob_bsho_req_mode_000 {
  528.   int neighbor_bsid; /* 6 bytes */
  529.   u_char service_level_prediction;
  530.   u_char preamble_index;
  531.   u_char ho_process_optimization;
  532.   u_char net_assisted_ho_supported: 1;
  533.   u_char ho_id_included_indicator: 1;
  534.   u_char ho_autho_policy_indicator: 1;
  535.   //if ho_id_included_indicator==1
  536.   u_char ho_id;
  537.   //if ho_autho_policy_indicator==1
  538.   u_char ho_autho_policy_support;
  539. };
  540. /** Structure for BSHO request */
  541. struct mac802_16_mob_bsho_req_mode_new_bs {
  542.   int neighbor_bsid; /* 6 bytes */
  543.   u_char temp_bsid: 3;
  544.  
  545. };
  546. /** Structure for BSHO request */
  547. struct mac802_16_mob_bsho_req_mode_new_bs2 {
  548.   int neighbor_bsid; /* 6 bytes */
  549.   u_char temp_bsid: 3;
  550.   uint16_t new_cid[MAX_NBR];
  551.   uint16_t new_said[MAX_NBR];
  552.  
  553. };
  554. /** Structure for BSHO request */
  555. struct mac802_16_mob_bsho_req_mode_new_bs3 {
  556.   int neighbor_bsid; /* 6 bytes */
  557.   u_char temp_bsid: 3;
  558.   uint16_t new_cid[MAX_NBR];
  559.   uint16_t new_said[MAX_NBR];
  560.   int cqich_id; //variable 
  561.   u_char feedback_channel_off: 6;
  562.   u_char period: 2;
  563.   u_char frame_offset: 3;
  564.   u_char duration: 3;
  565.   u_char mimo_permutation_feedback: 2; 
  566. };
  567. /** Structure for BSHO request */
  568. struct mac802_16_mob_bsho_req_mode_current_bs {
  569.   u_char temp_bsid: 3;
  570. };
  571. /** BSHO request frame */
  572. struct mac802_16_mob_bsho_req_frame {
  573.   u_char type; //56
  574.   u_char net_assisted_ho_supported: 1;
  575.   u_char mode: 3;
  576.   //if mode == 0b000
  577.   u_char ho_op_mode: 1;
  578.   u_char n_recommended;
  579.   u_char resource_retain_flag: 1;
  580.   mac802_16_mob_bsho_req_mode_000 n_rec[];
  581.   //if mode == 0b001
  582.   u_char tmp_bsid: 3;
  583.   u_char ak_change_indicator: 1;
  584.   u_char n_cids;
  585.   uint16_t cids[MAX_NBR];
  586.   u_char n_saids;
  587.   uint16_t saids[MAX_NBR];
  588.   
  589.   //if mode == 0b010: attribute defined in mode 0b001
  590.   //u_char tmp_bsid: 3;
  591.   //u_char ak_change_indicator: 1;
  592.   
  593.   //if mode == 0b011
  594.   u_char n_new_bs: 3;
  595.   mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  596.   u_char n_current_bs: 3;
  597.   mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  598.   //also include the following elements defined in mode 0b001
  599.   //u_char tmp_bsid: 3;
  600.   //u_char ak_change_indicator: 1;
  601.   //u_char n_cids;
  602.   //uint16_t cids[MAX_NBR];
  603.   //u_char n_saids;
  604.   //uint16_t saids[MAX_NBR];
  605.   
  606.   //if mode == 0b100, include the following attributes (already defined)
  607.   //u_char n_new_bs: 3;
  608.   //mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  609.   //u_char n_current_bs: 3;
  610.   //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  611.   //u_char tmp_bsid: 3;
  612.   //u_char ak_change_indicator: 1;
  613.   
  614.   //if mode == 0b101
  615.   //u_char n_new_bs: 3;
  616.   //u_char n_cids;
  617.   //u_char n_saids;
  618.   mac802_16_mob_bsho_req_mode_new_bs2 new_bs2[MAX_NBR];
  619.   //u_char n_current_bs: 3;
  620.   //mac802_16_mob_bsho_req_mode_current_bs current_bs[];
  621.   //u_char tmp_bsid: 3;
  622.   //u_char ak_change_indicator: 1;
  623.   
  624.   //if mode == 0b110
  625.   //u_char n_new_bs: 3;
  626.   //u_char n_cids;
  627.   //u_char n_saids;
  628.   mac802_16_mob_bsho_req_mode_new_bs3 new_bs3[MAX_NBR];
  629.   //u_char n_current_bs: 3;
  630.   //mac802_16_mob_bsho_req_mode_current_bs current_bs[];
  631.   //u_char tmp_bsid: 3;
  632.   //u_char ak_change_indicator: 1;
  633.   u_char action_time: 7;
  634.   /* TLV information */
  635. };
  636. /** Structure for MSHO request */
  637. struct mac802_16_mob_msho_req_bs_index {
  638.   u_char neighbor_bs_index;
  639.   u_char preamble_index;
  640.   u_char bs_cinr_mean; //if report_metric[0]==1
  641.   u_char bs_rssi_mean; //if report_metric[1]==1
  642.   u_char relative_delay; //if report_metric[2]==1
  643.   u_char service_level_prediction: 3;
  644.   u_char arrival_time_diff_ind: 1;
  645.   //next if arrival_time_diff_ind==1
  646.   u_char arrival_time_diff: 4;
  647. };
  648. /** Structure for MSHO request */
  649. struct mac802_16_mob_msho_req_current_bs {
  650.   u_char temp_bsid: 4;
  651.   u_char bs_cinr_mean; //if report_metric[0]==1
  652.   u_char bs_rssi_mean; //if report_metric[1]==1
  653.   u_char relative_delay; //if report_metric[2]==1
  654.   u_char bs_rtd; //if report_metric[3]==1
  655. };
  656. /** MSHO request frame */
  657. struct mac802_16_mob_msho_req_frame {
  658.   u_char type; //57
  659.   u_char report_metric;
  660.   u_char n_new_bs_index;
  661.   //next if n_recommended_bs_index !=0
  662.   u_char ccc_mob_nbr_adv;
  663.   mac802_16_mob_msho_req_bs_index bs_index[MAX_NBR];
  664.   //end 
  665.   u_char n_new_bs_full;
  666.   mac802_16_mob_msho_req_bs_index bs_full[MAX_NBR];
  667.   u_char n_current_bs;
  668.   mac802_16_mob_msho_req_current_bs bs_current[MAX_NBR];
  669.   /* other TLV information */
  670. };
  671. /** Structure for BSHO response */
  672. struct mac802_16_mob_bsho_rsp_rec {
  673.   int neighbor_bsid; /* 6 bytes */
  674.   u_char preamble_index;
  675.   u_char service_level_prediction;
  676.   u_char ho_process_optimization;
  677.   u_char net_assisted_ho_supported: 1;
  678.   u_char ho_id_included_indicator: 1;
  679.   //if ho_id_included_indicator==1
  680.   u_char ho_id;
  681.   //end if
  682.   u_char ho_autho_policy_indicator: 1;
  683.   //if ho_autho_policy_indicator==1
  684.   u_char ho_autho_policy_support;
  685.   //end if
  686.   
  687. };
  688. /** Structure for BSHO response */
  689. struct mac802_16_mob_bsho_rsp_mode_new_bs2 {
  690.   int neighbor_bsid; /* 6 bytes */
  691.   u_char temp_bsid: 3;
  692.   uint16_t new_cid[];
  693. };
  694. /** BSHO response frame */
  695. struct mac802_16_mob_bsho_rsp_frame {
  696.   u_char type; //58
  697.   u_char mode: 3;
  698.   
  699.   //if mode == 0b000
  700.   u_char ho_operation_mode: 1;
  701.   u_char n_recommended;
  702.   u_char resource_retain_flag: 1;
  703.   mac802_16_mob_bsho_rsp_rec n_rec[MAX_NBR];
  704.   //if mode == 0b001
  705.   u_char tmp_bsid: 3;
  706.   u_char ak_change_indicator: 1;
  707.   u_char n_cids;
  708.   uint16_t cids[MAX_NBR];
  709.   u_char n_saids;
  710.   uint16_t saids[MAX_NBR];
  711.   //if mode == 0b010
  712.   //u_char tmp_bsid: 3;
  713.   //u_char ak_change_indicator: 1;
  714.   //if mode == 0b011
  715.   u_char n_new_bs: 3;
  716.   mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR];
  717.   u_char n_current_bs: 3;
  718.   mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  719.   //also include the following elements defined in mode 0b001
  720.   //u_char tmp_bsid: 3;
  721.   //u_char ak_change_indicator: 1;
  722.   //u_char n_cids;
  723.   //uint16_t cids[MAX_NBR];
  724.   //u_char n_saids;
  725.   //uint16_t saids[MAX_NBR];
  726.   //if mode == 0b100
  727.   //u_char n_new_bs: 3;
  728.   //mac802_16_mob_bsho_req_mode_new_bs new_bs[MAX_NBR]; //same struct as req
  729.   //u_char n_current_bs: 3;
  730.   //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR]; //same as req
  731.   //u_char tmp_bsid: 3;
  732.   //u_char ak_change_indicator: 1;
  733.   //if mode == 0b101
  734.   //u_char n_new_bs: 3;
  735.   //u_char n_cids;
  736.   mac802_16_mob_bsho_rsp_mode_new_bs2 new_bs2[MAX_NBR];
  737.   //u_char n_current_bs: 3;
  738.   //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  739.   //u_char tmp_bsid: 3;
  740.   //u_char ak_change_indicator: 1;
  741.   
  742.   //if mode == 0b110
  743.   //u_char n_new_bs: 3;
  744.   //u_char n_cids;
  745.   //u_char n_saids;
  746.   mac802_16_mob_bsho_req_mode_new_bs3 new_bs3[MAX_NBR]; //same as request
  747.   //u_char n_current_bs: 3;
  748.   //mac802_16_mob_bsho_req_mode_current_bs current_bs[MAX_NBR];
  749.   //u_char tmp_bsid: 3;
  750.   //u_char ak_change_indicator: 1;
  751.   u_char action_time: 7;
  752.   /* TLV information */
  753. };
  754. /** Structure for Handover indication */
  755. struct mac802_16_mob_ho_ind_bs {
  756.   u_char temp_bsid: 3;
  757. };
  758. /** HO indication frame */
  759. struct mac802_16_mob_ho_ind_frame {
  760.   u_char type; //59
  761.   u_char mode: 2;
  762.   //if mode==0b00
  763.   u_char ho_ind_type: 2;
  764.   u_char rng_param_valid_ind: 2;
  765.   //next valid if ho_ind_type==0b00
  766.   int target_bsid; /* 6 bytes */
  767.   
  768.   //if mode==0b01
  769.   u_char mdhofbss_ind_type: 2;
  770.   //next valid if mdhofbss_ind_type==0b00
  771.   u_char bsid: 3;
  772.   u_char action_time;
  773.   //end valid if mdhofbss_ind_type==0b00
  774.   //if mode==0b10
  775.   //u_char mdhofbss_ind_type: 2;
  776.   //next valid if mdhofbss_ind_type==0b00
  777.   u_char diversity_set_included;
  778.   //next valid if diversity_set_included==1
  779.   u_char anchor_bsid: 3;
  780.   u_char n_bs;
  781.   mac802_16_mob_ho_ind_bs bs[MAX_NBR];
  782.   //end valid if diversity_set_included==1
  783.   //u_char action_time;
  784.   //end valid if mdhofbss_ind_type==0b00
  785.   u_char preamble_index;
  786.   
  787.   /* TLV information */
  788. };
  789. /** This class contains helpers for manipulating 802.16 messages
  790.  *  and getting the packet size 
  791.  */
  792. class Mac802_16pkt {
  793.  public:
  794.   /**
  795.    * Return the size of the MOB_NBR-ADV frame
  796.    * @param frame The frame 
  797.    */
  798.   static int getMOB_NBR_ADV_size(mac802_16_mob_nbr_adv_frame *frame);
  799.   /**
  800.    * Return the size of the MOB_SCN-REQ 
  801.    * @param frame The frame 
  802.    */
  803.   static int getMOB_SCN_REQ_size(mac802_16_mob_scn_req_frame *frame);
  804.   /**
  805.    * Return the size of the MOB_SCN-RSP 
  806.    * @param frame The frame 
  807.    */
  808.   static int getMOB_SCN_RSP_size(mac802_16_mob_scn_rsp_frame *frame);
  809.   /**
  810.    * Return the size of the MOB_MSHO-REQ 
  811.    * @param frame The frame 
  812.    */
  813.   static int getMOB_MSHO_REQ_size(mac802_16_mob_msho_req_frame *frame);
  814.   /**
  815.    * Return the size of the MOB_BSHO-RSP 
  816.    * @param frame The frame 
  817.    */
  818.   static int getMOB_BSHO_RSP_size(mac802_16_mob_bsho_rsp_frame *frame);
  819.   /**
  820.    * Return the size of the MOB_HO-IND 
  821.    * @param frame The frame 
  822.    */
  823.   static int getMOB_HO_IND_size(mac802_16_mob_ho_ind_frame *frame);
  824. };
  825. #endif