rrc_eNB_ral.c 9.88 KB
Newer Older
1 2 3 4 5
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

Lionel Gauthier's avatar
Lionel Gauthier committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35
/*! \file rrc_eNB_ral.c
 * \brief rrc procedures for handling RAL messages
 * \author Lionel GAUTHIER
 * \date 2013
 * \version 1.0
 * \company Eurecom
 * \email: lionel.gauthier@eurecom.fr
 */
#define RRC_ENB
#define RRC_ENB_RAL_C
//-----------------------------------------------------------------------------
#include "rrc_eNB_ral.h"
#include "assertions.h"
#include "collection/hashtable/obj_hashtable.h"
36 37
#include "RRC/LTE/defs.h"
#include "RRC/LTE/extern.h"
Lionel Gauthier's avatar
Lionel Gauthier committed
38 39 40 41 42 43


//-----------------------------------------------------------------------------
int rrc_enb_ral_delete_all_thresholds_type(unsigned int mod_idP, ral_link_param_type_t *param_type_pP)
//-----------------------------------------------------------------------------
{
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
  hashtable_rc_t           rc;
  rrc_ral_threshold_key_t *key;
  rrc_ral_threshold_key_t *keys = NULL;
  unsigned int             num_keys = 0;
  int                      return_code = 0;

  rc =  obj_hashtable_get_keys(eNB_rrc_inst[mod_idP].ral_meas_thresholds, (void*)&keys, &num_keys);

  if (rc == HASH_TABLE_OK) {
    key = keys;

    while (num_keys > 0) {
      if (memcmp(&key->link_param_type, param_type_pP, sizeof(ral_link_param_type_t)) == 0) {
        rc = obj_hashtable_remove (eNB_rrc_inst[mod_idP].ral_meas_thresholds, key, sizeof(rrc_ral_threshold_key_t));

        if (rc != HASH_TABLE_OK) {
          return_code = -1;
Lionel Gauthier's avatar
Lionel Gauthier committed
61
        }
62
      }
Lionel Gauthier's avatar
Lionel Gauthier committed
63

64 65
      key = &key[1];
      num_keys--;
Lionel Gauthier's avatar
Lionel Gauthier committed
66
    }
67 68 69 70 71 72 73 74 75
  } else {
    return_code = -1;
  }

  if (keys != NULL) {
    free(keys);
  }

  return return_code;
Lionel Gauthier's avatar
Lionel Gauthier committed
76 77 78 79 80 81 82
}


//-----------------------------------------------------------------------------
int rrc_enb_ral_delete_threshold(unsigned int mod_idP, ral_link_param_type_t *param_type_pP, ral_threshold_t *threshold_pP)
//-----------------------------------------------------------------------------
{
83 84 85 86 87 88 89 90 91 92 93 94
  hashtable_rc_t           rc;
  rrc_ral_threshold_key_t  ref_key;

  memcpy(&ref_key.link_param_type, param_type_pP, sizeof(ral_link_param_type_t));
  memcpy(&ref_key.threshold,       threshold_pP,  sizeof(ral_threshold_t));
  rc = obj_hashtable_remove (eNB_rrc_inst[mod_idP].ral_meas_thresholds, (void*)&ref_key, sizeof(rrc_ral_threshold_key_t));

  if (rc == HASH_TABLE_OK) {
    return 0;
  } else {
    return -1;
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
95 96 97 98 99 100 101
}


//-----------------------------------------------------------------------------
int rrc_enb_ral_handle_configure_threshold_request(unsigned int mod_idP, MessageDef *msg_pP)
//-----------------------------------------------------------------------------
{
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
  ral_transaction_id_t               transaction_id            = 0;
  rrc_ral_configure_threshold_req_t *configure_threshold_req_p = NULL;
  ral_link_cfg_param_t              *link_cfg_param_p          = NULL;
  ral_threshold_t                   *threshold_p               = NULL;
  MessageDef                        *message_p                 = NULL;
  unsigned int                       ix_param                  = 0;
  unsigned int                       ix_thresholds             = 0;

  DevAssert(msg_pP != NULL);

  LOG_I(RRC, "[eNB %d] Received %s\n", mod_idP, ITTI_MSG_NAME (msg_pP));
  configure_threshold_req_p = &RRC_RAL_CONFIGURE_THRESHOLD_REQ(msg_pP);

  transaction_id = configure_threshold_req_p->transaction_id;

  for (ix_param = 0; ix_param < configure_threshold_req_p->num_link_cfg_params; ix_param++) {
    link_cfg_param_p = &configure_threshold_req_p->link_cfg_params[ix_param];

    switch (link_cfg_param_p->th_action) {
    case RAL_TH_ACTION_SET_NORMAL_THRESHOLD:
    case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD:
      switch (link_cfg_param_p->link_param_type.choice) {

      case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
        switch (link_cfg_param_p->link_param_type._union.link_param_gen) {
        case RAL_LINK_PARAM_GEN_DATA_RATE:
        case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH:
        case RAL_LINK_PARAM_GEN_SINR:
        case RAL_LINK_PARAM_GEN_THROUGHPUT:
        case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE:
          message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ);
          PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id  = transaction_id;
          memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t));
          itti_send_msg_to_task (TASK_PHY_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p);
          break;

        default:
          LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_gen %d\n", link_cfg_param_p->link_param_type._union.link_param_gen);
          return -1;
        }

        break;

      case RAL_LINK_PARAM_TYPE_CHOICE_QOS:
        switch (link_cfg_param_p->link_param_type._union.link_param_qos) {
        case RAL_LINK_PARAM_QOS_MAX_NUM_DIF_COS_SUPPORTED:
        case RAL_LINK_PARAM_QOS_MIN_PACKET_TRANSFER_DELAY_ALL_COS:
        case RAL_LINK_PARAM_QOS_AVG_PACKET_TRANSFER_DELAY_ALL_COS:
        case RAL_LINK_PARAM_QOS_MAX_PACKET_TRANSFER_DELAY_ALL_COS:
        case RAL_LINK_PARAM_QOS_STD_DEVIATION_PACKET_TRANSFER_DELAY:
        case RAL_LINK_PARAM_QOS_PACKET_LOSS_RATE_ALL_COS_FRAME_RATIO:
          message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ);
          PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id  = transaction_id;
          memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t));
          itti_send_msg_to_task (TASK_MAC_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p);
          break;

        default:
          LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_qos %d\n", link_cfg_param_p->link_param_type._union.link_param_qos);
          return -1;
        }

        break;

      case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
        switch (link_cfg_param_p->link_param_type._union.link_param_lte) {
          // group by dest task id
        case RAL_LINK_PARAM_LTE_UE_RSRP:
        case RAL_LINK_PARAM_LTE_UE_RSRQ:
        case RAL_LINK_PARAM_LTE_UE_CQI:
          message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ);
          PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id  = transaction_id;
          memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t));
          itti_send_msg_to_task (TASK_PHY_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p);
          break;

        case RAL_LINK_PARAM_LTE_AVAILABLE_BW:
        case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE:
        case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS:
        case RAL_LINK_PARAM_LTE_PACKET_DELAY:
          message_p = itti_alloc_new_message (TASK_RRC_ENB, PHY_MEAS_THRESHOLD_REQ);
          PHY_MEAS_THRESHOLD_REQ(message_p).transaction_id  = transaction_id;
          memcpy (&PHY_MEAS_THRESHOLD_REQ(message_p).cfg_param, (void *) link_cfg_param_p, sizeof(ral_link_cfg_param_t));
          itti_send_msg_to_task (TASK_MAC_ENB, ITTI_MSG_INSTANCE(msg_pP), message_p);
          break;

        case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES:
        case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY:
        case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY:
        case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS:
        case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW:
Lionel Gauthier's avatar
Lionel Gauthier committed
193
#warning "TO DO MIH LTE LINK PARAMS IN RRC ENB"
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
          break;

        default:
          LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_lte %d\n", link_cfg_param_p->link_param_type._union.link_param_lte);
          return -1;
        }

        break;

      default:
        LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown link_param_type choice %d\n", link_cfg_param_p->link_param_type.choice);
        return -1;
      }

      for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) {
        threshold_p = &link_cfg_param_p->thresholds[ix_thresholds];
      }

      break;

    case RAL_TH_ACTION_CANCEL_THRESHOLD:

      // IEEE Std 802.21-2008, Table F4, Data type name=LINK_CFG_PARAM (page 228):
      // When “Cancel threshold” is selected and no thresholds are specified, then all
      // currently configured thresholds for the given LINK_PARAM_TYPE are cancelled.
      if (link_cfg_param_p->num_thresholds == 0) {
        rrc_enb_ral_delete_all_thresholds_type(mod_idP, &link_cfg_param_p->link_param_type);
      } else {
        //
        // When “Cancel threshold” is selected and thresholds are specified only those
        // configured thresholds for the given LINK_PARAM_TYPE and whose threshold value match what was
        // specified are cancelled.
        for (ix_thresholds=0; ix_thresholds < link_cfg_param_p->num_thresholds; ix_thresholds++) {
          threshold_p = &link_cfg_param_p->thresholds[ix_thresholds];
          rrc_enb_ral_delete_threshold(mod_idP, &link_cfg_param_p->link_param_type, threshold_p);
Lionel Gauthier's avatar
Lionel Gauthier committed
229
        }
230 231 232 233 234 235 236
      }

      break;

    default:
      LOG_E(RRC, "Message RRC_RAL_CONFIGURE_THRESHOLD_REQ malformed, unknown th_action %d\n", link_cfg_param_p->th_action);
      return -1;
Lionel Gauthier's avatar
Lionel Gauthier committed
237
    }
238 239 240
  }

  return 0;
Lionel Gauthier's avatar
Lionel Gauthier committed
241 242
}