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

网络

开发平台:

C/C++

  1. /* This class contains helpers for manipulating 802.16 messages
  2.  * and getting the packet size.
  3.  * This software was developed at the National Institute of Standards and
  4.  * Technology by employees of the Federal Government in the course of
  5.  * their official duties. Pursuant to title 17 Section 105 of the United
  6.  * States Code this software is not subject to copyright protection and
  7.  * is in the public domain.
  8.  * NIST assumes no responsibility whatsoever for its use by other parties,
  9.  * and makes no guarantees, expressed or implied, about its quality,
  10.  * reliability, or any other characteristic.
  11.  * <BR>
  12.  * We would appreciate acknowledgement if the software is used.
  13.  * <BR>
  14.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  15.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  16.  * FROM THE USE OF THIS SOFTWARE.
  17.  * </PRE></P>
  18.  * @author  rouil
  19.  */
  20. #include "mac802_16pkt.h"
  21. /**
  22.  * Return the size of the MOB_NBR-ADV frame
  23.  * @param frame The frame 
  24.  */
  25. int Mac802_16pkt::getMOB_NBR_ADV_size(mac802_16_mob_nbr_adv_frame *frame)
  26. {
  27.   int size = 4; //min size
  28.   if ((frame->skip_opt_field & 0x1) == 0)
  29.     size +=3; //add operator id
  30.   
  31.   for (int i = 0 ; i < frame->n_neighbors ; i++) {
  32.     size += 4; //min size for neighbor info
  33.     if (frame->nbr_info[i].phy_profile_id.FAindex & 0x1)
  34.       size++;
  35.     if (frame->nbr_info[i].phy_profile_id.bs_eirp & 0x1)
  36.       size++;
  37.     if ((frame->skip_opt_field & 0x2) == 0)
  38.       size +=3; //contain neighbor bs id
  39.     if ((frame->skip_opt_field & 0x4) == 0)
  40.       size ++; //contain HO process optimization
  41.     if ((frame->skip_opt_field & 0x8) == 0)
  42.       size ++; //contain neighbor bs id
  43.     if (frame->nbr_info[i].dcd_included)
  44.       size += 2+GET_DCD_SIZE (frame->nbr_info[i].dcd_settings.nb_prof); 
  45.     if (frame->nbr_info[i].ucd_included)
  46.       size += 2+GET_UCD_SIZE (frame->nbr_info[i].ucd_settings.nb_prof); 
  47.     if (frame->nbr_info[i].phy_included)
  48.       size += 2;
  49.   }
  50.   return size;
  51. }
  52. /**
  53.  * Return the size of the MOB_SCN-REQ 
  54.  * @param frame The frame 
  55.  */
  56. int Mac802_16pkt::getMOB_SCN_REQ_size(mac802_16_mob_scn_req_frame *frame)
  57. {
  58.   int size=6;
  59.   if (frame->n_recommended_bs_index != 0)
  60.     size ++;
  61.   int tmp = 11*(frame->n_recommended_bs_index+frame->n_recommended_bs_full);
  62.   size += tmp/8;
  63.   if ((tmp%8)!=0)
  64.     size ++;
  65.   return size;
  66. }
  67. /**
  68.  * Return the size of the MOB_SCN-RSP 
  69.  * @param frame The frame 
  70.  */
  71. int Mac802_16pkt::getMOB_SCN_RSP_size(mac802_16_mob_scn_rsp_frame *frame)
  72. {
  73.   int size=6;
  74.   if (frame->scan_duration!=0) {
  75.     size += 3;
  76.     if (frame->n_recommended_bs_index!=0)
  77.       size ++;
  78.     int tmp = 0;
  79.     for (int i = 0 ; i < frame->n_recommended_bs_index ; i++) {
  80.       tmp+=11;
  81.       if (frame->rec_bs_index[i].scanning_type==2 ||
  82.   frame->rec_bs_index[i].scanning_type==3)
  83. tmp+=24;
  84.     }
  85.     for (int i = 0 ; i < frame->n_recommended_bs_index ; i++) {
  86.       tmp+=51;
  87.       if (frame->rec_bs_index[i].scanning_type==2 ||
  88.   frame->rec_bs_index[i].scanning_type==3)
  89. tmp+=24;
  90.     }
  91.     size += tmp/8;
  92.     if ((tmp%8)!=0)
  93.       size ++;  
  94.   }
  95.   return size;
  96. }
  97. /**
  98.  * Return the size of the MOB_MSHO-REQ 
  99.  * @param frame The frame 
  100.  */
  101. int Mac802_16pkt::getMOB_MSHO_REQ_size(mac802_16_mob_msho_req_frame *frame)
  102. {
  103.   int size=4;
  104.   int tmp, tmpB;
  105.   tmp = 0;
  106.   tmpB = 0;
  107.   if (frame->n_new_bs_index !=0) 
  108.     size++;
  109.   if (frame->report_metric & 0x1) tmp++;
  110.   if (frame->report_metric & 0x2) tmp++;
  111.   if (frame->report_metric & 0x4) tmp++;
  112.   for (int i = 0 ; i < frame->n_new_bs_index ; i++) {
  113.     tmpB += 20 + 8*tmp;    
  114.     if (frame->bs_index[i].arrival_time_diff_ind & 0x1)
  115.       tmpB += 4;
  116.   }
  117.   //n_new_bs_full
  118.   for (int i = 0 ; i < frame->n_new_bs_full ; i++) {
  119.     tmpB += 20 + 8*tmp;
  120.     if (frame->bs_full[i].arrival_time_diff_ind & 0x1)
  121.       tmpB += 4;
  122.   }
  123.   tmpB += 4;
  124.   //N_current
  125.   if (frame->report_metric & 0x8) tmp++;
  126.   for (int i = 0 ; i < frame->n_current_bs ; i++) {
  127.     tmpB += 4 + 8*tmp;
  128.   }
  129.   //increase size
  130.   size += tmp/8;
  131.   if ((tmp%8)!=0)
  132.     size ++;  //includes padding
  133.   
  134.   return size;
  135. }
  136. /**
  137.  * Return the size of the MOB_MSHO-REQ 
  138.  * @param frame The frame 
  139.  */
  140. int Mac802_16pkt::getMOB_BSHO_RSP_size(mac802_16_mob_bsho_rsp_frame *frame)
  141. {
  142.   int size=4;
  143.   return size;
  144. }
  145. /**
  146.  * Return the size of the MOB_HO-IND 
  147.  * @param frame The frame 
  148.  */
  149. int Mac802_16pkt::getMOB_HO_IND_size(mac802_16_mob_ho_ind_frame *frame)
  150. {
  151.   int size=4;
  152.   return size;
  153. }