view src/g23m-gprs/sm/sm_context_control.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line source

/*----------------------------------------------------------------------------
|  Project :  3G PS
|  Module  :  SM
+-----------------------------------------------------------------------------
|             Copyright 2003 Texas Instruments.
|             All rights reserved. 
| 
|             This file is confidential and a trade secret of Texas 
|             Instruments .
|             The receipt of or possession of this file does not convey 
|             any rights to reproduce or disclose its contents or to 
|             manufacture, use, or sell anything it may describe, in 
|             whole, or in part, without the specific written consent of 
|             Texas Instruments. 
+-----------------------------------------------------------------------------
| Purpose:    Context Control state machine implementation in the SM entity.
|             For design details, see:
|             8010.908 SM Detailed Specification
+---------------------------------------------------------------------------*/

/*==== DECLARATION CONTROL =================================================*/

/*==== INCLUDES =============================================================*/

#include "sm.h"

#include "sm_context_control.h"
#include "sm_network_control.h"
#include "sm_user_plane_control.h"
#include "sm_sequencer.h"

#include "sm_aci_output_handler.h"

/*==== CONSTS ===============================================================*/

/*==== TYPES ================================================================*/

typedef void (*T_SM_CONTEXT_CONTROL_TRANSITION_FUNC)(struct T_SM_CONTEXT_DATA *ptr_context_data, /*@null@*/ void *data);

typedef struct {
#ifdef DEBUG
  T_SM_CONTEXT_CONTROL_EVENT            event;
#endif /* DEBUG */
  T_SM_CONTEXT_CONTROL_TRANSITION_FUNC  func;
} T_SM_CONTEXT_CONTROL_TRANSITION;

/*==== LOCALS ===============================================================*/

static void state_event_error(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void go_to_S5         (struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void go_to_S15        (struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_smreg_pdp_activate_req(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_smreg_pdp_activate_sec_req(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_smreg_pdp_activate_rej_res(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_smreg_pdp_modify_req(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_network_request_activation_in_S0(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_request_activation_in_S1(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_request_activation_override(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_request_deactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_network_activate_completed_in_S2(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_activate_completed_in_S6(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_activate_completed_in_S12(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_activate_rejected_in_S2(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_activate_rejected_in_S6(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_activate_rejected_in_S12(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_network_modify_completed_in_S7(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_modify_completed_in_S10(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_modify_rejected_in_S7(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_modify_rejected_in_S10(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_network_request_modify(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_network_request_modify_failed(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_user_plane_activated_in_S3(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_user_plane_activated_in_S13(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_user_plane_error_in_S3(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_user_plane_error_while_active(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_user_plane_modified_in_S8(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_user_plane_deactivated_in_S11(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_deactivate_completed_in_S0(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_deactivate_completed_in_S4(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_deactivate_completed_in_S14(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_deactivate_completed_in_S15(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_context_upgrade(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void handle_context_deactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_context_deactivate_in_S0(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_context_reactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void handle_local_deactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

static void forward_network_deactivate_completed(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);
static void forward_user_plane_deactivated(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data);

/***********************************************************************
 * State/Transition Table
 */
static const T_SM_CONTEXT_CONTROL_TRANSITION
transition[SM_CONTEXT_CONTROL_NUMBER_OF_STATES][SM_CONTEXT_CONTROL_NUMBER_OF_EVENTS] =
{
  {  /* S0: SM_CONTEXT_DEACTIVATED */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              handle_smreg_pdp_activate_req),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          handle_smreg_pdp_activate_sec_req),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate_in_S0),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_context_deactivate_in_S0),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  handle_context_reactivate),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          handle_network_request_activation_in_S0),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              forward_user_plane_deactivated),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                handle_deactivate_completed_in_S0)
  },
  {  /* S1: SM_CONTEXT_ACTIVATING_MT */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              handle_smreg_pdp_activate_req),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          handle_smreg_pdp_activate_rej_res),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          handle_network_request_activation_in_S1),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S2: SM_CONTEXT_ACTIVATING_NETWORK */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          handle_network_activate_completed_in_S2),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           handle_network_activate_rejected_in_S2),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S3: SM_CONTEXT_ACTIVATING_USER_PLANE */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_in_S3),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                handle_user_plane_activated_in_S3),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S4: SM_CONTEXT_ACTIVATE_FAILED_DEACTIVATING */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        forward_network_deactivate_completed),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              forward_user_plane_deactivated),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                handle_deactivate_completed_in_S4)
  },
  {  /* S5: SM_CONTEXT_ACTIVATED */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                handle_smreg_pdp_modify_req),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     handle_context_upgrade),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, handle_network_request_activation_override),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          handle_network_request_deactivate),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              handle_network_request_modify),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       handle_network_request_modify_failed),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S6: SM_CONTEXT_ACTIVATION_OVERRIDE */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          handle_network_activate_completed_in_S6),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           handle_network_activate_rejected_in_S6),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, handle_network_request_activation_override),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S7: SM_CONTEXT_MODIFYING_IN_NETWORK */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             handle_network_modify_rejected_in_S7),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            handle_network_modify_completed_in_S7),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       handle_network_request_modify_failed),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S8: SM_CONTEXT_MODIFYING_USER_PLANE */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 handle_user_plane_modified_in_S8),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S9: SM_CONTEXT_MODIFYING_USER_PLANE_MT */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 go_to_S5),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S10: SM_CONTEXT_UPGRADING_IN_NETWORK */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             handle_network_modify_rejected_in_S10),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            handle_network_modify_completed_in_S10),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S11: SM_CONTEXT_REACTIVATING_DEACTIVATING_USER_PLANE */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              forward_user_plane_deactivated),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                handle_user_plane_deactivated_in_S11)
  },
  {  /* S12: SM_CONTEXT_REACTIVATING_IN_NETWORK */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          handle_network_activate_completed_in_S12),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           handle_network_activate_rejected_in_S12),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S13: SM_CONTEXT_REACTIVATING_USER_PLANE */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  handle_context_deactivate),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            handle_user_plane_error_while_active),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                handle_user_plane_activated_in_S13),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                state_event_error)
  },
  {  /* S14: SM_CONTEXT_DEACTIVATING */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  go_to_S15),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            state_event_error),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        forward_network_deactivate_completed),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              forward_user_plane_deactivated),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                handle_deactivate_completed_in_S14)
  },
  {  /* S15: SM_CONTEXT_DEACTIVATING_SEQUENCED */
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REQ,              state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_REJ_RES,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_ACTIVATE_SEC_REQ,          state_event_error),
    M_TRANSITION(SM_P_SMREG_PDP_MODIFY_REQ,                state_event_error),
    M_TRANSITION(SM_I_CONTEXT_DEACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_LOCAL_DEACTIVATE,            handle_local_deactivate),
    M_TRANSITION(SM_I_CONTEXT_REACTIVATE,                  state_event_error),
    M_TRANSITION(SM_I_CONTEXT_UPGRADE,                     state_event_error),
    M_TRANSITION(SM_I_CONTEXT_USER_PLANE_ERROR,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_COMPLETED,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_ACTIVATE_REJECTED,           state_event_error),
    M_TRANSITION(SM_I_NETWORK_DEACTIVATE_COMPLETED,        forward_network_deactivate_completed),
    M_TRANSITION(SM_I_NETWORK_MODIFY_REJECTED,             state_event_error),
    M_TRANSITION(SM_I_NETWORK_MODIFY_COMPLETED,            state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE, state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_DEACTIVATE,          state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY,              state_event_error),
    M_TRANSITION(SM_I_NETWORK_REQUEST_MODIFY_FAILED,       state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_ACTIVATED,                state_event_error),
    M_TRANSITION(SM_I_USER_PLANE_DEACTIVATED,              forward_user_plane_deactivated),
    M_TRANSITION(SM_I_USER_PLANE_MODIFIED,                 state_event_error),
    M_TRANSITION(SM_I_DEACTIVATE_COMPLETED,                handle_deactivate_completed_in_S15)
  }
};

/*==== PRIVATE FUNCTIONS ====================================================*/

/*
+------------------------------------------------------------------------------
| Function    : state_event_error
+------------------------------------------------------------------------------
| Description : General function used to report state event errors.
|
| Parameters  : context          - Not used
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void state_event_error(/*@unused@*/ struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  (void)TRACE_ERROR("SM Context Control: STATE EVENT ERROR!");
}

/*
+------------------------------------------------------------------------------
| Function    : go_to_S*
+------------------------------------------------------------------------------
| Description : General function used for simple state transitions with no
|               actions.
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void go_to_S5(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  context->context_control_state = SM_CONTEXT_ACTIVATED;
}

static void go_to_S15(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  context->context_control_state = SM_CONTEXT_DEACTIVATING_SEQUENCED;
}

/*
+------------------------------------------------------------------------------
| Function    : forward_network_deactivate_completed,
|               forward_user_plane_deactivated
+------------------------------------------------------------------------------
| Description : Functions used for forwarding deactivation primitives to
|               Context Deactivate Control
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void forward_network_deactivate_completed(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_NETWORK_COMPLETED, NULL);
}

static void forward_user_plane_deactivated(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_USER_PLANE_COMPLETED, NULL);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_smreg_pdp_activate_req
+------------------------------------------------------------------------------
| Description : Handle event SM_P_SMREG_PDP_ACTIVATE_REQ in S0 and S1
|
| Parameters  : context          - Context data
|               data             - T_SMREG_PDP_ACTIVATE_REQ *
+------------------------------------------------------------------------------
*/
static void handle_smreg_pdp_activate_req(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_smreg_pdp_activate_req");

  /* Go to state SM CONTEXT ACTIVATING NETWORK */
  context->context_control_state = SM_CONTEXT_ACTIVATING_NETWORK;

  /* Start primary context activation towards network */
  sm_network_control(context, SM_I_NETWORK_ACTIVATE_PRIMARY, data);

  /* Inform User Plane Control of pending context activation */
  sm_user_plane_control(context, SM_I_USER_PLANE_ACTIVATE_START, data);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_smreg_pdp_activate_sec_req
+------------------------------------------------------------------------------
| Description : Handle event SM_P_SMREG_PDP_ACTIVATE_SEC_REQ
|
| Parameters  : context          - Context data
|               data             - T_SMREG_PDP_ACTIVATE_SEC_REQ *
+------------------------------------------------------------------------------
*/
static void handle_smreg_pdp_activate_sec_req(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_smreg_pdp_activate_sec_req");

  /* Go to state SM CONTEXT ACTIVATING NETWORK */
  context->context_control_state = SM_CONTEXT_ACTIVATING_NETWORK;

  /* Start secondary context activation towards network */
  sm_network_control(context, SM_I_NETWORK_ACTIVATE_SECONDARY, data);

  /* Inform User Plane Control of pending context activation */
  sm_user_plane_control(context, SM_I_USER_PLANE_ACTIVATE_START, data);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_smreg_pdp_activate_rej_res
+------------------------------------------------------------------------------
| Description : Handle event SM_P_SMREG_PDP_ACTIVATE_REJ_RES
|
| Parameters  : context          - Context data
|               data             - T_SMREG_PDP_ACTIVATE_REJ_RES *
+------------------------------------------------------------------------------
*/
static void handle_smreg_pdp_activate_rej_res(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SMREG_PDP_ACTIVATE_REJ_RES *prim = (T_SMREG_PDP_ACTIVATE_REJ_RES *)data;
  (void)TRACE_FUNCTION("handle_smreg_pdp_activate_rej_res");

  TRACE_ASSERT(prim != NULL);
  /*lint -e613 (Possible use of null pointer 'prim' in left argument to operator '->') */
  sm_set_nw_cause(context, prim->ps_cause.ctrl_value, prim->ps_cause.value.nwsm_cause);
  
  /* Reject MT activation attempt towards the network */
  sm_network_control(context, SM_I_NETWORK_REQUEST_ACTIVATION_REJECT, NULL);
  /*lint +e613 (Possible use of null pointer 'prim' in left argument to operator '->') */
}

/*
+------------------------------------------------------------------------------
| Function    : handle_smreg_pdp_modify_req
+------------------------------------------------------------------------------
| Description : Handle event SM_P_SMREG_PDP_MODIFY_REQ
|
| Parameters  : context          - Context data
|               data             - T_SMREG_PDP_MODIFY_REQ *
+------------------------------------------------------------------------------
*/
static void handle_smreg_pdp_modify_req(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SMREG_PDP_MODIFY_REQ *prim = (T_SMREG_PDP_MODIFY_REQ *)data;
  (void)TRACE_FUNCTION("handle_smreg_pdp_modify_req");

  TRACE_ASSERT(prim != NULL);

  /* Go to state SM CONTEXT MODIFYING IN NETWORK */
  context->context_control_state = SM_CONTEXT_MODIFYING_IN_NETWORK;

/*lint +e613 (Possible use of null pointer 'prim' in left argument to operator '->') */
  /* Start modification in network */
  sm_network_control(context, SM_I_NETWORK_MODIFY, prim);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_request_activation_in_S0
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_REQUEST_ACTIVATION in state S0
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_network_request_activation_in_S0(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_network_request_activation_in_S0");

  /* Go to state SM CONTEXT ACTIVATING MT */
  context->context_control_state = SM_CONTEXT_ACTIVATING_MT;

  /* Send SMREG_PDP_ACTIVATE_IND to ACI */
  send_smreg_pdp_activate_ind(context);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_request_activation_in_S1
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_REQUEST_ACTIVATION in state S1
|
| Parameters  : context          - Context data
|               data             - T_REQUEST_PDP_CONTEXT_ACTIVATION *
+------------------------------------------------------------------------------
*/
static void handle_network_request_activation_in_S1(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  T_REQUEST_PDP_CONTEXT_ACTIVATION *msg = (T_REQUEST_PDP_CONTEXT_ACTIVATION *)data;
  (void)TRACE_FUNCTION("handle_network_request_activation_in_S1");

  TRACE_ASSERT(msg != NULL);

  /* Check whether PDP type, APN, and address match */
  /*lint -e613 (Possible use of null pointer 'msg' in left argument to operator '->') */
  if (sm_nw_is_address_and_apn_equal(context, &context->requested_address,
                                     &msg->address, msg->v_apn, &msg->apn))
  {
    /* Ignore incoming request - proceed with current activation */
  } else {
    sm_set_nw_cause(context, CAUSE_is_from_nwsm, (U16)CAUSE_NWSM_INSUFFICIENT_RESOURCES);
    sm_network_control(context, SM_I_NETWORK_REQUEST_ACTIVATION_REJECT, NULL);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_request_activation_override
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE in S5
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_network_request_activation_override(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_network_request_activation_override");

  /* Go to state SM CONTEXT ACTIVATION OVERRIDE */
  context->context_control_state = SM_CONTEXT_ACTIVATION_OVERRIDE;

  /* Inform Sequencer of activation override */
  sm_sequencer(SM_I_CONTEXT_ACTIVATION_OVERRIDE, (void *)(T_NAS_ti)context->ti);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_request_deactivate
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_REQUEST_DEACTIVATE
|
| Parameters  : context          - Context data
|               data             - Tear-down indicator
+------------------------------------------------------------------------------
*/
static void handle_network_request_deactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  U32               tear_down    = (U32)data;
  T_CAUSE_ps_cause *cause        = sm_get_aci_cause(context);
  U16               nsapi_as_set = sm_nsapi2nsapi_set(context->nsapi);
  U16               nsapis_to_deactivate;

  (void)TRACE_FUNCTION("handle_network_request_deactivate");

  if (cause->ctrl_value       == CAUSE_is_from_nwsm &&
      cause->value.nwsm_cause == (U16)CAUSE_NWSM_REACTIVATION_REQUESTED)
  {
    /* Go to state SM CONTEXT REACTIVATING DEACTIVATING USER PLANE */
    context->context_control_state = SM_CONTEXT_REACTIVATING_DEACTIVATING_USER_PLANE;

    nsapis_to_deactivate = 0;
  } else {
    /* Go to state SM CONTEXT DEACTIVATED */
    context->context_control_state = SM_CONTEXT_DEACTIVATED;

    nsapis_to_deactivate = nsapi_as_set;
  }

  if (tear_down != 0)
  {
    nsapis_to_deactivate |= sm_linked_nsapis(context->ti);

    /* Inform Sequencer of tear-down deactivation */
    sm_sequencer(SM_I_CONTEXT_TEAR_DOWN_DEACTIVATE,
                 (void *)(T_NAS_ti)context->ti);

    /* Send SMREG_PDP_DEACTIVATE_IND for all context being deactivated */
    if (nsapis_to_deactivate != 0)
    {
      send_smreg_pdp_deactivate_ind(nsapis_to_deactivate,
                                    sm_get_aci_cause(context));
    }
  } else {
    /* Send SMREG_PDP_DEACTIVATE_IND for this single context. */
    if (nsapis_to_deactivate != 0)
    {
      send_smreg_pdp_deactivate_ind(nsapi_as_set, sm_get_aci_cause(context));
    }
  }

  /* Deactivate user plane */
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_USER_PLANE,
                                (void *)PS_REL_IND_NO);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_activate_completed_in_S2
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_ACTIVATE_COMPLETED in state S2
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_network_activate_completed_in_S2(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/void *data)
{
  (void)TRACE_FUNCTION("handle_network_activate_completed_in_S2");

  /* Go to state SM CONTEXT ACTIVATING USER PLANE */
  context->context_control_state = SM_CONTEXT_ACTIVATING_USER_PLANE;

  /* Activate User Plane */
  sm_user_plane_control(context, SM_I_USER_PLANE_ACTIVATE_COMPLETE, NULL);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_activate_completed_in_S6
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_ACTIVATE_COMPLETED in state S6
|
| Parameters  : context          - Context data
|               data             - (enum) T_SM_UPDATE_FLAGS
+------------------------------------------------------------------------------
*/
static void handle_network_activate_completed_in_S6(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SM_UPDATE_FLAGS update_flags = (T_SM_UPDATE_FLAGS)((UINT)data);
  (void)TRACE_FUNCTION("handle_network_activate_completed_in_S6");

  if (sm_is_aci_update_required(update_flags))
  {
    /* Inform ACI of new parameters */
    send_smreg_pdp_modify_ind(context, update_flags);
  }

  if (sm_is_user_plane_update_required(update_flags))
  {
    /* Go to state SM CONTEXT MODIFYING USER PLANE MT */
    context->context_control_state = SM_CONTEXT_MODIFYING_USER_PLANE_MT;

    /* Modify User Plane */
    sm_user_plane_control(context, SM_I_USER_PLANE_MODIFY, NULL);
  } else {
    /* Go to state SM CONTEXT ACTIVATED */
    context->context_control_state = SM_CONTEXT_ACTIVATED;
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_activate_completed_in_S12
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_ACTIVATE_COMPLETED in state S12
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_network_activate_completed_in_S12(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/void *data)
{
  (void)TRACE_FUNCTION("handle_network_activate_completed_in_S12");

  /* Go to state SM CONTEXT REACTIVATING USER PLANE */
  context->context_control_state = SM_CONTEXT_REACTIVATING_USER_PLANE;

  /* Activate User Plane */
  sm_user_plane_control(context, SM_I_USER_PLANE_ACTIVATE_COMPLETE, NULL);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_activate_rejected_in_S2
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_ACTIVATE_REJECTED in state S2
|
| Parameters  : context          - Context data
|               data             - Deactivate network trigger (BOOL)
+------------------------------------------------------------------------------
*/
static void handle_network_activate_rejected_in_S2(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  BOOL  deactivate_network = (data != NULL ? TRUE : FALSE);
  (void)TRACE_FUNCTION("handle_network_activate_rejected_in_S2");

  /* Go to state SM CONTEXT ACTIVATE FAILED DEACTIVATING */
  context->context_control_state = SM_CONTEXT_ACTIVATE_FAILED_DEACTIVATING;

  if (deactivate_network)
  {
    /* Deactivate user plane.  Also, network is being deactivated;
     * Deactivation Control should anticipate NETWORK_DEACTIVATE_COMPLETED. */
    sm_context_deactivate_control(context,
                                  SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE,
                                  sm_get_nw_cause(context));
  } else {
    /* Dectivate User Plane */
    sm_context_deactivate_control(context, SM_I_DEACTIVATE_USER_PLANE,
                                  (void *)PS_REL_IND_NO);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_activate_rejected_in_S6
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_ACTIVATE_REJECTED in state S6
|
| Parameters  : context          - Context data
|               data             - Deactivate network trigger (BOOL)
+------------------------------------------------------------------------------
*/
static void handle_network_activate_rejected_in_S6(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_network_activate_rejected_in_S6");

  /* Inform ACI of failure and deactivation */
  send_smreg_pdp_deactivate_ind(sm_nsapi2nsapi_set(context->nsapi),
                                sm_get_aci_cause(context));

  /* Go to state SM CONTEXT DEACTIVATING */
  context->context_control_state = SM_CONTEXT_DEACTIVATING;

  /* Deactivate User Plane */
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_USER_PLANE,
                                (void *)PS_REL_IND_NO);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_activate_rejected_in_S12
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_ACTIVATE_REJECTED in state S12
|
| Parameters  : context          - Context data
|               data             - Deactivate network trigger (BOOL)
+------------------------------------------------------------------------------
*/
static void handle_network_activate_rejected_in_S12(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_network_activate_rejected_in_S12");

  /* Inform ACI of failure and deactivation */
  send_smreg_pdp_deactivate_ind(sm_nsapi2nsapi_set(context->nsapi),
                                sm_get_aci_cause(context));

  /* Go to state SM CONTEXT DEACTIVATING */
  context->context_control_state = SM_CONTEXT_DEACTIVATING;

  /* Deactivate User Plane */
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_USER_PLANE,
                                (void *)PS_REL_IND_NO);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_modify_rejected_in_S7
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_MODIFY_REJECTED in state S7
|
| Parameters  : context          - Context data
|               data             - BOOL (Deactivate context due to T3381)
+------------------------------------------------------------------------------
*/
static void handle_network_modify_rejected_in_S7(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  BOOL               deactivate_context = (BOOL)((UINT)data);
  T_CAUSE_ps_cause  *cause = sm_get_aci_cause(context);
  (void)TRACE_FUNCTION("handle_network_modify_rejected_in_S7");

  TRACE_ASSERT(cause != NULL);

  /*lint -e613 (Possible use of null pointer 'cause' in left argument to operator '->') */
  /* Inform ACI of failed modification attempt */
  send_smreg_pdp_modify_rej(context->nsapi, cause);

  /* In case of modify collisions or timeouts, the context remains active */
  if (deactivate_context       != TRUE &&
      (cause->ctrl_value       == CAUSE_is_from_sm &&
       cause->value.sm_cause   == (U16)CAUSE_SM_MODIFY_COLLISION
       ||
       cause->ctrl_value       == CAUSE_is_from_nwsm &&
       cause->value.nwsm_cause == (U16)CAUSE_NWSM_NETWORK_FAILURE))
  {
    /* Go to state SM CONTEXT ACTIVATED */
    context->context_control_state = SM_CONTEXT_ACTIVATED;
  } else {
    /* Other errors: Context is deactivated */
    send_smreg_pdp_deactivate_ind(sm_nsapi2nsapi_set(context->nsapi), cause);

    /* Go to state SM CONTEXT DEACTIVATING */
    context->context_control_state = SM_CONTEXT_DEACTIVATING;

    /* Deactivate Network and User Plane (Network deactivation in progress) */
    sm_context_deactivate_control(context, SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE, cause);
    /*lint +e613 (Possible use of null pointer 'cause' in left argument to operator '->') */
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_modify_rejected_in_S10
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_MODIFY_REJECTED in state S10
|
| Parameters  : context          - Context data
|               data             - BOOL (Deactivate context due to T3381)
+------------------------------------------------------------------------------
*/
static void handle_network_modify_rejected_in_S10(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  BOOL               deactivate_context = (BOOL)((UINT)data);
  T_CAUSE_ps_cause  *cause = sm_get_aci_cause(context);
  (void)TRACE_FUNCTION("handle_network_modify_rejected_in_S10");

  TRACE_ASSERT(cause != NULL);

  /* In case of modify collision, timeout, or temporary out-of-resources
   * the context remains active */
 /*lint -e613 (Possible use of null pointer 'cause' in left argument to operator '->') */
  if (deactivate_context       != TRUE &&
      (cause->ctrl_value       == CAUSE_is_from_sm &&
       cause->value.sm_cause   == (U16)CAUSE_SM_MODIFY_COLLISION
       ||
       cause->ctrl_value       == CAUSE_is_from_nwsm &&
       cause->value.nwsm_cause == (U16)CAUSE_NWSM_NETWORK_FAILURE
       ||
       cause->ctrl_value       == CAUSE_is_from_nwsm &&
       cause->value.nwsm_cause == (U16)CAUSE_NWSM_INSUFFICIENT_RESOURCES))
  {
    /* Go to state SM CONTEXT ACTIVATED */
    context->context_control_state = SM_CONTEXT_ACTIVATED;
  } else {
    /* Other errors: Context is deactivated */
    send_smreg_pdp_deactivate_ind(sm_nsapi2nsapi_set(context->nsapi), cause);
    /*lint +e613 (Possible use of null pointer 'cause' in left argument to operator '->') */	

    /* Go to state SM CONTEXT DEACTIVATING */
    context->context_control_state = SM_CONTEXT_DEACTIVATING;

    /* Deactivate Network and User Plane (Network deactivation in progress) */ 
    sm_context_deactivate_control(context, SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE, sm_get_nw_cause(context));
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_modify_completed_in_S7
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_MODIFY_COMPLETED in state S7
|
| Parameters  : context          - Context data
|               data             - T_SM_UPDATE_FLAGS
+------------------------------------------------------------------------------
*/
static void handle_network_modify_completed_in_S7(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SM_UPDATE_FLAGS  update_flags = (T_SM_UPDATE_FLAGS)((UINT)data);
  (void)TRACE_FUNCTION("handle_network_modify_completed_in_S7");

  if (sm_is_user_plane_update_required(update_flags))
  {
    /* Go to state SM CONTEXT MODIFYING USER PLANE */
    context->context_control_state = SM_CONTEXT_MODIFYING_USER_PLANE;

    /* Start user plane modification */
    sm_user_plane_control(context, SM_I_USER_PLANE_MODIFY, (void *)update_flags);
  } else {
    /* Inform ACI of the successful modification and altered fields */
    send_smreg_pdp_modify_cnf(context, update_flags);

    /* Go to state SM CONTEXT ACTIVATED */
    context->context_control_state = SM_CONTEXT_ACTIVATED;
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_modify_completed_in_S10
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_MODIFY_COMPLETED in state S10
|
| Parameters  : context          - Context data
|               data             - (enum) T_SM_UPDATE_FLAGS
+------------------------------------------------------------------------------
*/
static void handle_network_modify_completed_in_S10(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SM_UPDATE_FLAGS update_flags = (T_SM_UPDATE_FLAGS)((UINT)data);
  (void)TRACE_FUNCTION("handle_network_modify_completed_in_S10");

  if (sm_is_aci_update_required(update_flags))
  {
    /* Inform ACI of new parameters */
    send_smreg_pdp_modify_ind(context, update_flags);
  }

  if (sm_is_user_plane_update_required(update_flags))
  {
    /* Go to state SM CONTEXT MODIFYING USER PLANE MT */
    context->context_control_state = SM_CONTEXT_MODIFYING_USER_PLANE_MT;

    /* Modify User Plane */
    sm_user_plane_control(context, SM_I_USER_PLANE_MODIFY, NULL);
  } else {
    /* Go to state SM CONTEXT ACTIVATED */
    context->context_control_state = SM_CONTEXT_ACTIVATED;
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_user_plane_activated_in_S3
+------------------------------------------------------------------------------
| Description : Handle event SM_I_USER_PLANE_ACTIVATED in state S3
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_user_plane_activated_in_S3(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_user_plane_activated_in_S3");

  /* Go to state SM CONTEXT ACTIVATED */
  context->context_control_state = SM_CONTEXT_ACTIVATED;

  /* Confirm activation towards ACI; response depends on primary/secondary */
  if (!sm_is_secondary(context))
  {
    /* Primary context: send SMREG_PDP_ACTIVATE_CNF */
    send_smreg_pdp_activate_cnf(context);
  } else {
    /* Secondary context: send SMREG_PDP_ACTIVATE_SEC_CNF */
    send_smreg_pdp_activate_sec_cnf(context);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_user_plane_activated_in_S13
+------------------------------------------------------------------------------
| Description : Handle event SM_I_USER_PLANE_ACTIVATED in state S13
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_user_plane_activated_in_S13(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_user_plane_activated_in_S13");

  /* Go to state SM CONTEXT ACTIVATED */
  context->context_control_state = SM_CONTEXT_ACTIVATED;

  /* For primary contexts: Inform sequencer that reactivation was successful */
  if (!sm_is_secondary(context))
  {
    sm_sequencer(SM_I_CONTEXT_REACTIVATE_COMPLETED,
                 (void *)(T_NAS_ti)context->ti);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_user_plane_error_in_S3
+------------------------------------------------------------------------------
| Description : Handle event SM_I_USER_PLANE_ERROR in state S3
|
| Parameters  : context          - Context data
|               data             - BOOL
+------------------------------------------------------------------------------
*/
static void handle_user_plane_error_in_S3(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_user_plane_error_in_S3");

  /* Go to state SM CONTEXT ACTIVATE FAILED DEACTIVATING */
  context->context_control_state = SM_CONTEXT_ACTIVATE_FAILED_DEACTIVATING;

  /* Dectivate User Plane locally */
  sm_user_plane_control(context, SM_I_USER_PLANE_DEACTIVATE_LOCAL, data);

  /* Deactivate towards network */
  sm_set_nw_cause(context, CAUSE_is_from_nwsm, (U16)CAUSE_NWSM_REGULAR_DEACTIVATION);
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_NETWORK,
                                sm_get_nw_cause(context));
}

/*
+------------------------------------------------------------------------------
| Function    : handle_user_plane_error_while_active
+------------------------------------------------------------------------------
| Description : Handle event SM_I_USER_PLANE_ERROR in states S5 - S13
|
| Parameters  : context          - Context data
|               data             - BOOL
+------------------------------------------------------------------------------
*/
static void handle_user_plane_error_while_active(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_user_plane_error_while_active");

  /* Inform ACI that the context will now be deactivated due to user plane error */
  send_smreg_pdp_deactivate_ind(sm_nsapi2nsapi_set(context->nsapi),
                                sm_get_aci_cause(context));

  /* Go to state SM CONTEXT DEACTIVATING */
  context->context_control_state = SM_CONTEXT_DEACTIVATING;

  /* Dectivate User Plane locally */
  sm_user_plane_control(context, SM_I_USER_PLANE_DEACTIVATE_LOCAL, data);

  /* Deactivate towards network */
  sm_set_nw_cause(context, CAUSE_is_from_nwsm, (U16)CAUSE_NWSM_REGULAR_DEACTIVATION);
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_NETWORK,
                                sm_get_nw_cause(context));
}

/*
+------------------------------------------------------------------------------
| Function    : handle_user_plane_modified_in_S8
+------------------------------------------------------------------------------
| Description : Handle event SM_I_USER_PLANE_MODIFIED in states S8
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_user_plane_modified_in_S8(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_user_plane_modified_in_S8");

  /* Inform ACI of the successful modification and altered QoS */
  send_smreg_pdp_modify_cnf(context, SM_UPDATE_QOS);

  /* Go to state SM CONTEXT ACTIVATED */
  context->context_control_state = SM_CONTEXT_ACTIVATED;
}

/*
+------------------------------------------------------------------------------
| Function    : handle_user_plane_deactivated_in_S11
+------------------------------------------------------------------------------
| Description : Handle event SM_I_USER_PLANE_DEACTIVATED in S11
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_user_plane_deactivated_in_S11(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_user_plane_deactivated_in_S11");

  /* Go to state SM CONTEXT REACTIVATING IN NETWORK */
  context->context_control_state = SM_CONTEXT_REACTIVATING_IN_NETWORK;

  /* Start primary context activation towards network */
  sm_network_control(context, SM_I_NETWORK_ACTIVATE_PRIMARY, NULL);

  /* Inform User Plane Control of pending context activation */
  sm_user_plane_control(context, SM_I_USER_PLANE_ACTIVATE_START, NULL);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_deactivate_completed_in_S0
+------------------------------------------------------------------------------
| Description : Handle event SM_I_DEACTIVATE_COMPLETED in state S0
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_deactivate_completed_in_S0(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_deactivate_completed_in_S0");

  /* Mark context for deallocation after call returns */
  sm_mark_context_for_deallocation(context);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_deactivate_completed_in_S4
+------------------------------------------------------------------------------
| Description : Handle event SM_I_DEACTIVATE_COMPLETED in state S4
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_deactivate_completed_in_S4(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_deactivate_completed_in_S4");

  /* Go to state SM CONTEXT DEACTIVATED */
  context->context_control_state = SM_CONTEXT_DEACTIVATED;

  /* Report failed activation to ACI: Response depends on primary/secondary */
  if (!sm_is_secondary(context))
  {
    /* Primary context: send SMREG_PDP_ACTIVATE_REJ */
    send_smreg_pdp_activate_rej(context->nsapi, sm_get_aci_cause(context));
  } else {
    /* Secondary context: send SMREG_PDP_ACTIVATE_SEC_REJ */
    send_smreg_pdp_activate_sec_rej(context->nsapi, sm_get_aci_cause(context));
  }

  /* Mark context for deallocation after call returns */
  sm_mark_context_for_deallocation(context);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_deactivate_completed_in_S14
+------------------------------------------------------------------------------
| Description : Handle event SM_I_DEACTIVATE_COMPLETED in state S14
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_deactivate_completed_in_S14(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_deactivate_completed_in_S14");

  /* Go to state SM CONTEXT DEACTIVATED */
  context->context_control_state = SM_CONTEXT_DEACTIVATED;

  /* Mark context for deallocation */
  sm_mark_context_for_deallocation(context);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_deactivate_completed_in_S15
+------------------------------------------------------------------------------
| Description : Handle event SM_I_DEACTIVATE_COMPLETED in state S15
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_deactivate_completed_in_S15(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_deactivate_completed_in_S15");

  /* Go to state SM CONTEXT DEACTIVATED */
  context->context_control_state = SM_CONTEXT_DEACTIVATED;

  /* Mark context for deallocation */
  sm_mark_context_for_deallocation(context);

  /* Confirm deactivation towards Sequencer */
  sm_sequencer(SM_I_CONTEXT_DEACTIVATE_COMPLETED, (void *)(T_NAS_nsapi)context->nsapi);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_request_modify
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_REQUEST_MODIFY in state S4
|
| Parameters  : context          - Context data
|               data             - Update flags
+------------------------------------------------------------------------------
*/
static void handle_network_request_modify(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SM_UPDATE_FLAGS  update_flags = (T_SM_UPDATE_FLAGS)((UINT)data);
  (void)TRACE_FUNCTION("handle_network_request_modify");

  if (sm_is_aci_update_required(update_flags))
  {
    /* Send SMREG_PDP_MODIFY_IND if required */
    send_smreg_pdp_modify_ind(context, update_flags);
  }

  if (sm_is_user_plane_update_required(update_flags))
  {
    /* Go to state SM CONTEXT MODIFYING USER PLANE MT */
    context->context_control_state = SM_CONTEXT_MODIFYING_USER_PLANE_MT;

    /* Update User Plane */
    sm_user_plane_control(context, SM_I_USER_PLANE_MODIFY, (void *)update_flags);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : handle_network_request_modify_failed
+------------------------------------------------------------------------------
| Description : Handle event SM_I_NETWORK_REQUEST_MODIFY_FAILED
|
| Parameters  : context          - Context data
|               data             - Not used (cause set in context data)
+------------------------------------------------------------------------------
*/
static void handle_network_request_modify_failed(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_network_request_modify_failed");

  /* Inform ACI of failed modification and deactivation */
  send_smreg_pdp_deactivate_ind(sm_nsapi2nsapi_set(context->nsapi),
                                sm_get_aci_cause(context));

  /* Go to state SM CONTEXT DEACTIVATING */
  context->context_control_state = SM_CONTEXT_DEACTIVATING;

  /* Start user plane deactivation */
  sm_context_deactivate_control(context, SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE, sm_get_nw_cause(context));
}

/*
+------------------------------------------------------------------------------
| Function    : handle_context_upgrade
+------------------------------------------------------------------------------
| Description : Handle event SM_I_CONTEXT_UPGRADE in S5
|
| Parameters  : context          - Context data
|               data             - Not used
+------------------------------------------------------------------------------
*/
static void handle_context_upgrade(struct T_SM_CONTEXT_DATA *context, /*@null@*/ /*@unused@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_context_upgrade");

  /* Go to state SM CONTEXT UPGRADING IN NETWORK */
  context->context_control_state = SM_CONTEXT_UPGRADING_IN_NETWORK;

  /* Start a network modify procedure in order to re-upgrade QoS */
  sm_network_control(context, SM_I_NETWORK_MODIFY, NULL);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_context_reactivate
+------------------------------------------------------------------------------
| Description : Handle event SM_I_CONTEXT_REACTIVATE in deactivate(d) states
|
| Parameters  : context          - Context data
|               data             - not used
+------------------------------------------------------------------------------
*/
void handle_context_reactivate(struct T_SM_CONTEXT_DATA *context, /*@unused@*/ /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_context_reactivate");

  /* Go to state SM CONTEXT DEACTIVATING SEQUENCED */
  context->context_control_state = SM_CONTEXT_REACTIVATING_IN_NETWORK;

  /* Start primary or secondary activation depending on context type */
  if (sm_is_secondary(context)) {
    sm_network_control(context, SM_I_NETWORK_ACTIVATE_SECONDARY, NULL);
  } else {
    sm_network_control(context, SM_I_NETWORK_ACTIVATE_PRIMARY, NULL);
  }
  /* (Re)start user plane */
  sm_user_plane_control(context, SM_I_USER_PLANE_ACTIVATE_START, NULL);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_context_deactivate_in_S0
+------------------------------------------------------------------------------
| Description : Handle event SM_I_CONTEXT_DEACTIVATE in S0
|               Note: User Plane is deactivating in this state
|
| Parameters  : context          - Context data
|               data             - deactivation type
+------------------------------------------------------------------------------
*/
static void handle_context_deactivate_in_S0(/*@unused@*/ struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  int nsapi;
  
  T_SM_CONTEXT_DEACTIVATE_CONTROL_EVENT event = (T_SM_CONTEXT_DEACTIVATE_CONTROL_EVENT)((UINT)data);
  (void)TRACE_FUNCTION("SM Context Control: handle_context_deactivate_in_S0");

  if (event == SM_I_DEACTIVATE_USER_PLANE ||
      event == SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE)
  {
    /* Network deactivation ignored - already deactivated */
    sm_context_deactivate_control(context, SM_I_DEACTIVATE_USER_PLANE,
                                  (void *)PS_REL_IND_NO); 
    /*ACI requested deactivation of an already inactive context. Acknowledge*/
    send_smreg_pdp_deactivate_cnf(sm_data.sm_nsapis_requested_deactivated);

   /* If the context is not freed, clear it here so that future SMREG_PDP_ACTIVATE_REQ
     * served properly 
     */
    for (nsapi = (int)NAS_NSAPI_5; nsapi < NAS_SIZE_NSAPI; nsapi++)
    {
      if (sm_is_nsapi_in_nsapi_set(nsapi, sm_data.sm_nsapis_requested_deactivated)) 
      {
        sm_free_context_data_by_nsapi(nsapi);
      }
    }
  }
  /* Network-only deactivation ignored - already deactivated */
}

/*
+------------------------------------------------------------------------------
| Function    : handle_context_deactivate
+------------------------------------------------------------------------------
| Description : Handle event SM_I_CONTEXT_DEACTIVATE in active states
|
| Parameters  : context          - Context data
|               data             - deactivation type
+------------------------------------------------------------------------------
*/
void handle_context_deactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  T_SM_CONTEXT_DEACTIVATE_CONTROL_EVENT event = (T_SM_CONTEXT_DEACTIVATE_CONTROL_EVENT)((UINT)data);
  void *param;

  (void)TRACE_FUNCTION("handle_context_deactivate");

  /* Go to state SM CONTEXT DEACTIVATING SEQUENCED */
  context->context_control_state = SM_CONTEXT_DEACTIVATING_SEQUENCED;

  /* Set cause to be sent to the network (if indicated by deactivation type) */
  sm_set_nw_cause(context, CAUSE_is_from_nwsm,
                  (U16)CAUSE_NWSM_REGULAR_DEACTIVATION);

  switch (event)
  {
  case SM_I_DEACTIVATE_USER_PLANE:
    param = (void *)PS_REL_IND_NO;
    break;
  case SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE:
  default:
    event = SM_I_DEACTIVATE_NETWORK_AND_USER_PLANE;
    /*lint -fallthrough*/
  case SM_I_DEACTIVATE_NETWORK:
    param = sm_get_nw_cause(context);
    break;
  }

  /* Forward deactivation event to Context Deactivate Control */
  sm_context_deactivate_control(context, event, param);
}

/*
+------------------------------------------------------------------------------
| Function    : handle_local_deactivate
+------------------------------------------------------------------------------
| Description : Handle event SM_I_CONTEXT_LOCAL_DEACTIVATE
|
| Parameters  : context          - Context data
|               data             - UPM signalling switch
+------------------------------------------------------------------------------
*/
static void handle_local_deactivate(struct T_SM_CONTEXT_DATA *context, /*@null@*/ void *data)
{
  (void)TRACE_FUNCTION("handle_local_deactivate");

  /* Go to state SM CONTEXT DEACTIVATED */
  context->context_control_state = SM_CONTEXT_DEACTIVATED;

  /* Locally deactivate Network Control */
  sm_network_control(context, SM_I_NETWORK_DEACTIVATE_LOCAL, NULL);

  /* Locally deactivate user plane (with UPM signalling) */
  sm_user_plane_control(context, SM_I_USER_PLANE_DEACTIVATE_LOCAL, data);

  /* Mark context for deallocation after call returns (unless context
   * is pending reactivation) */
  if (!sm_is_context_pending_reactivation(context)) {
    sm_mark_context_for_deallocation(context);
  }
}

/*==== PUBLIC FUNCTIONS =====================================================*/

/*
+------------------------------------------------------------------------------
| Function    : sm_context_control_init
+------------------------------------------------------------------------------
| Description : Context Control state machine initialization function

| Parameters  : context  - Context data
+------------------------------------------------------------------------------
*/
void sm_context_control_init(struct T_SM_CONTEXT_DATA *context)
{
  (void)TRACE_FUNCTION("sm_context_control_init");

  sm_set_context_pending_reactivation(context, FALSE);
  context->context_control_state = SM_CONTEXT_DEACTIVATED;
}

/*
+------------------------------------------------------------------------------
| Function    : sm_context_control_exit
+------------------------------------------------------------------------------
| Description : Context Control state machine exit function

| Parameters  : context  - Context data
+------------------------------------------------------------------------------
*/
void sm_context_control_exit(struct T_SM_CONTEXT_DATA *context)
{
  (void)TRACE_FUNCTION("sm_context_control_exit");

  sm_set_context_pending_reactivation(context, FALSE);
  context->context_control_state = SM_CONTEXT_DEACTIVATED;
}

/*
+------------------------------------------------------------------------------
| Function    : sm_context_control_state
+------------------------------------------------------------------------------
| Description : Returns a read-only string with the name of the active state.

| Parameters  : context  - Context data
+------------------------------------------------------------------------------
*/
#ifdef DEBUG
/*@observer@*/const char *
sm_context_control_state(struct T_SM_CONTEXT_DATA *context)
{
  /*@observer@*/
  static const char *state_name[SM_CONTEXT_CONTROL_NUMBER_OF_STATES] = {
    "S0_SM_CONTEXT_DEACTIVATED",
    "S1_SM_CONTEXT_ACTIVATING_MT",
    "S2_SM_CONTEXT_ACTIVATING_NETWORK",
    "S3_SM_CONTEXT_ACTIVATING_USER_PLANE",
    "S4_SM_CONTEXT_ACTIVATE_FAILED_DEACTIVATING",
    "S5_SM_CONTEXT_ACTIVATED",
    "S6_SM_CONTEXT_ACTIVATION_OVERRIDE",
    "S7_SM_CONTEXT_MODIFYING_IN_NETWORK",
    "S8_SM_CONTEXT_MODIFYING_USER_PLANE",
    "S9_SM_CONTEXT_MODIFYING_USER_PLANE_MT",
    "S10_SM_CONTEXT_UPGRADING_IN_NETWORK",
    "S11_SM_CONTEXT_REACTIVATING_DEACTIVATING_USER_PLANE",
    "S12_SM_CONTEXT_REACTIVATING_IN_NETWORK",
    "S13_SM_CONTEXT_REACTIVATING_USER_PLANE",
    "S14_SM_CONTEXT_DEACTIVATING",
    "S15_SM_CONTEXT_DEACTIVATING_SEQUENCED"
  };

  TRACE_ASSERT(context->context_control_state < SM_CONTEXT_CONTROL_NUMBER_OF_STATES);

  return state_name[(U16)context->context_control_state];
}
#endif
/*
+------------------------------------------------------------------------------
| Function    : sm_context_control
+------------------------------------------------------------------------------
| Description : Context Control state machine
|
| Parameters  : context          - Context data
|               event            - Internal event (see sm_context_control.h)
|               data             - Event dependent parameter
+------------------------------------------------------------------------------
*/
void sm_context_control(struct T_SM_CONTEXT_DATA *context,
                           T_SM_CONTEXT_CONTROL_EVENT event,
                           /*@null@*/ void *data)
{
#ifdef DEBUG
  const char *old_state_name, *new_state_name;
  T_SM_CONTEXT_CONTROL_STATE old_state;
  /*@observer@*/
  static const char *event_name[SM_CONTEXT_CONTROL_NUMBER_OF_EVENTS] = {
    "SM_P_SMREG_PDP_ACTIVATE_REQ",
    "SM_P_SMREG_PDP_ACTIVATE_REJ_RES",
    "SM_P_SMREG_PDP_ACTIVATE_SEC_REQ",
    "SM_P_SMREG_PDP_MODIFY_REQ",
    "SM_I_CONTEXT_DEACTIVATE",
    "SM_I_CONTEXT_LOCAL_DEACTIVATE",
    "SM_I_CONTEXT_REACTIVATE",
    "SM_I_CONTEXT_UPGRADE",
    "SM_I_CONTEXT_USER_PLANE_ERROR",
    "SM_I_NETWORK_ACTIVATE_COMPLETED",
    "SM_I_NETWORK_ACTIVATE_REJECTED",
    "SM_I_NETWORK_DEACTIVATE_COMPLETED",
    "SM_I_NETWORK_MODIFY_REJECTED",
    "SM_I_NETWORK_MODIFY_COMPLETED",
    "SM_I_NETWORK_REQUEST_ACTIVATION",
    "SM_I_NETWORK_REQUEST_ACTIVATION_OVERRIDE",
    "SM_I_NETWORK_REQUEST_DEACTIVATE",
    "SM_I_NETWORK_REQUEST_MODIFY",
    "SM_I_NETWORK_REQUEST_MODIFY_FAILED",
    "SM_I_USER_PLANE_ACTIVATED",
    "SM_I_USER_PLANE_DEACTIVATED",
    "SM_I_USER_PLANE_MODIFIED",
    "SM_I_DEACTIVATE_COMPLETED"
  };

  TRACE_ASSERT(event < SM_CONTEXT_CONTROL_NUMBER_OF_EVENTS);

  old_state = context->context_control_state;
  old_state_name = sm_context_control_state(context);

  if (transition[(U16)old_state][(U16)event].event != event)
  {
    (void)TRACE_ERROR("Event table error in sm_context_control!");
  }
#endif /* DEBUG */

  transition[(U16)context->context_control_state][(U16)event].func(context, data);

#ifdef DEBUG
  new_state_name = sm_context_control_state(context);

  (void)TRACE_EVENT_P4("SM CONTEXT #%d: %s => %s to %s", context->nsapi,
                       event_name[(U16)event], old_state_name, new_state_name);
#endif /* DEBUG */
}

/*==== END OF FILE ==========================================================*/