[Epic-ID: ODUHIGH-510][Task-ID: ODUHIGH-514] DU-initiated E2 Reset Procedure
[o-du/l2.git] / src / du_app / du_e2ap_mgr.c
diff --git a/src/du_app/du_e2ap_mgr.c b/src/du_app/du_e2ap_mgr.c
new file mode 100644 (file)
index 0000000..83ab35a
--- /dev/null
@@ -0,0 +1,166 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2017-2019] [Radisys]                                        #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   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.                                             #
+################################################################################
+*******************************************************************************/
+#include "common_def.h"
+#include "lrg.h"
+#include "lkw.x"
+#include "lrg.x"
+#include "legtp.h"
+#include "du_app_mac_inf.h"
+#include "du_app_rlc_inf.h"
+#include "du_e2ap_mgr.h"
+#include "du_e2ap_msg_hdl.h"
+#include "du_cfg.h"
+#include "du_sctp.h"
+#include "du_mgr.h"
+#include "du_mgr_main.h"
+#include "du_utils.h"
+
+/*******************************************************************
+ *
+ * @brief Assigns new transaction id to DU initiated procedure
+ *
+ * @details
+ *
+ *    Function : assignTransactionId
+ *
+ *    Functionality: Assigns new transaction id to a DU initiated
+ *       procedure
+ *
+ * @params[in] Region region
+ *             Pool pool
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t assignTransactionId()
+{
+   uint8_t currTransId = duCb.e2apDb.transIdCounter;
+
+   /* Update to next valid value */
+   duCb.e2apDb.transIdCounter++;
+   if(duCb.e2apDb.transIdCounter == MAX_NUM_TRANSACTION)
+      duCb.e2apDb.transIdCounter = 0;
+
+   return currTransId;
+}
+
+/*******************************************************************
+ *
+ * @brief Sends E2 msg over SCTP
+ *
+ * @details
+ *
+ *    Function : SendE2APMsg
+ *
+ *    Functionality: Sends E2 msg over SCTP
+ *
+ * @params[in] Region region
+ *             Pool pool
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t SendE2APMsg(Region region, Pool pool, char *encBuf, int encBufSize)
+{
+   Buffer *mBuf=NULLP;
+
+   if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
+   {
+      if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
+      {
+         ODU_PRINT_MSG(mBuf, 0,0);
+
+         if(sctpSend(mBuf, E2_INTERFACE) != ROK)
+         {
+            DU_LOG("\nERROR  -->  E2AP : SCTP Send for E2  failed");
+            ODU_PUT_MSG_BUF(mBuf);
+            return RFAILED;
+         }
+      }
+      else
+      {
+         DU_LOG("\nERROR  -->  E2AP : ODU_ADD_POST_MSG_MULT failed");
+         ODU_PUT_MSG_BUF(mBuf);
+         return RFAILED;
+      }
+      ODU_PUT_MSG_BUF(mBuf);
+   }
+   else
+   {
+      DU_LOG("\nERROR  -->  E2AP : Failed to allocate memory");
+      return RFAILED;
+   }
+
+   return ROK;
+} /* SendE2APMsg */
+
+/*******************************************************************
+ *
+ * @brief Resets E2 
+ *
+ * @details
+ *
+ *    Function : ResetE2Request
+ *
+ *    Functionality: This function resets E2.
+ *       As per ORAN WG3 E2GAP v3.0 Spec, section 5.5.3
+ *       If E2 node initates reset procedure then:
+ *        a. Send reset request to RIC
+ *        b. Delete any pre-established RIC subscriptions
+ *        c. Gracefully terminates any ongoing RIC services
+ *       If RIC initiates reset procedure then :
+ *        a. Delete any pre-established RIC subscriptions
+ *        b. Gracefully terminates any ongoing RIC services
+ *        c. Send reset response to RIC
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t ResetE2Request(E2ProcedureDirection dir, E2CauseType type, E2Cause cause)
+{
+   /* Send Reset Request to RIC if DU detects any abnormal failure */
+   if(dir == E2_NODE_INITIATED)
+   {
+      if(BuildAndSendE2ResetRequest(type, cause) != ROK)
+      {
+         DU_LOG("\nERROR  -->  E2AP : BuildAndSendE2ResetRequest failed");
+         return RFAILED;
+      }
+   }
+
+   /* TODO when RIC subscription service model is implemented
+      Process following steps of resetting E2
+      1. Deletes any pre-established RIC subscriptions
+      2. Gracefully terminates any ongoing RIC services
+    */
+
+   /* Send Reset Response if RIC initiated Reset request is received at DU */
+   if(dir == RIC_INITIATED)
+   {
+      //BuildAndSendE2ResetResponse();
+   }   
+   return ROK;
+}
+
+/**********************************************************************
+  End of file
+ **********************************************************************/
+