From 21ef0caf7ae6304f5c981ec6aa96fd0535a3fa8c Mon Sep 17 00:00:00 2001
From: winckel <winckel@eurecom.fr>
Date: Wed, 8 Jan 2014 12:45:03 +0000
Subject: [PATCH] Created rrc_eNB_send_S1AP_UE_CAPABILITIES_IND() for RRC to
 forward UE capabilities to S1AP.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4827 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair2/RRC/LITE/rrc_eNB.c      |  7 +++++++
 openair2/RRC/LITE/rrc_eNB_S1AP.c | 20 ++++++++++++++++++++
 openair2/RRC/LITE/rrc_eNB_S1AP.h |  8 ++++++++
 3 files changed, 35 insertions(+)

diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c
index 358da43a94..5e9474f93f 100644
--- a/openair2/RRC/LITE/rrc_eNB.c
+++ b/openair2/RRC/LITE/rrc_eNB.c
@@ -2977,6 +2977,13 @@ int rrc_eNB_decode_dcch (u8 Mod_id, u32 frame, u8 Srb_id, u8 UE_index,
                       (void *) UE_EUTRA_Capability);
 #endif
 
+#if defined(ENABLE_USE_MME)
+          if (EPC_MODE_ENABLED == 1)
+          {
+            rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(Mod_id, UE_index, ul_dcch_msg);
+          }
+#endif
+
           rrc_eNB_generate_defaultRRCConnectionReconfiguration (Mod_id, frame,
                                                                 UE_index,
                                                                 eNB_rrc_inst[Mod_id].HO_flag);
diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c
index 17c15e9d5b..54202b0f91 100644
--- a/openair2/RRC/LITE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c
@@ -354,6 +354,26 @@ void rrc_eNB_send_S1AP_UPLINK_NAS(uint8_t mod_id, uint8_t ue_index, UL_DCCH_Mess
 }
 
 /*------------------------------------------------------------------------------*/
+void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(uint8_t mod_id, uint8_t ue_index, UL_DCCH_Message_t *ul_dcch_msg) {
+  UECapabilityInformation_t *ueCapabilityInformation = &ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation;
+
+  if ((ueCapabilityInformation->criticalExtensions.present == UECapabilityInformation__criticalExtensions_PR_c1)
+      && (ueCapabilityInformation->criticalExtensions.choice.c1.present
+          == UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8)
+      && (ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count > 0)) {
+        MessageDef *msg_p;
+        msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_UE_CAPABILITIES_IND);
+        S1AP_UE_CAPABILITIES_IND (msg_p).eNB_ue_s1ap_id = eNB_rrc_inst[mod_id].Info.UE[ue_index].eNB_ue_s1ap_id;
+        S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.length =
+                ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[0]->ueCapabilityRAT_Container.size;
+        S1AP_UE_CAPABILITIES_IND (msg_p).ue_radio_cap.buffer =
+                ueCapabilityInformation->criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[0]->ueCapabilityRAT_Container.buf;
+
+        itti_send_msg_to_task (TASK_S1AP, mod_id, msg_p);
+  }
+}
+
+  /*------------------------------------------------------------------------------*/
 void rrc_eNB_send_S1AP_NAS_FIRST_REQ(uint8_t mod_id, uint8_t ue_index,
                                      RRCConnectionSetupComplete_r8_IEs_t *rrcConnectionSetupComplete) {
 #if defined(ENABLE_ITTI)
diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h
index 1e5827ee13..d3a8f1da6d 100644
--- a/openair2/RRC/LITE/rrc_eNB_S1AP.h
+++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h
@@ -33,6 +33,14 @@ void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t Mod_id, uint8_t UE_ind
  */
 void rrc_eNB_send_S1AP_UPLINK_NAS(uint8_t Mod_id, uint8_t UE_index, UL_DCCH_Message_t *ul_dcch_msg);
 
+/*! \fn void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(uint8_t Mod_id, uint8_t UE_index, UL_DCCH_Message_t *ul_dcch_msg)
+ *\brief create a S1AP_UE_CAPABILITIES_IND to transfer a NAS message to S1AP.
+ *\param mod_id Instance ID of eNB.
+ *\param ue_index Instance ID of UE in the eNB.
+ *\param ul_dcch_msg The message receive by RRC holding the NAS message.
+ */
+void rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(uint8_t mod_id, uint8_t ue_index, UL_DCCH_Message_t *ul_dcch_msg);
+
 /*! \fn rrc_eNB_send_S1AP_NAS_FIRST_REQ(uint8_t Mod_id, uint8_t UE_index, RRCConnectionSetupComplete_r8_IEs_t *rrcConnectionSetupComplete)
  *\brief create a S1AP_NAS_FIRST_REQ to indicate that RRC has completed its first connection setup to S1AP.
  *\brief eventually forward a NAS message to S1AP.
-- 
GitLab