FreeCalypso > hg > fc-tourmaline
diff src/g23m-gprs/upm/upm_dispatcher.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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/upm/upm_dispatcher.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,186 @@ +/*---------------------------------------------------------------------------- +| Project : 3G PS +| Module : UPM ++----------------------------------------------------------------------------- +| 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: This module implements the process dispatcher +| for the User Plane Manager (UPM) entity. +| For design details, see: +| 8010.939 UPM Detailed Specification ++---------------------------------------------------------------------------*/ + +/*==== DECLARATION CONTROL =================================================*/ + +/*==== INCLUDES =============================================================*/ + +#include "upm.h" +#include "upm_dispatcher.h" + +/*==== CONSTS ===============================================================*/ + +/*==== TYPES ================================================================*/ + +/*==== LOCALS ===============================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : upm_disp_sm_activate_started_ind ++------------------------------------------------------------------------------ +| Description : Dispatch SM_ACTIVATE_STARTED_IND +| +| Parameters : sm_activate_started_ind - received primitive ++------------------------------------------------------------------------------ +*/ +void upm_disp_sm_activate_started_ind(T_SM_ACTIVATE_STARTED_IND *prim) +{ + int nsapi; + struct T_CONTEXT_DATA *ptr_context_data; + + (void)TRACE_FUNCTION("upm_disp_sm_activate_started_ind"); + + nsapi = (int)prim->nsapi; + ptr_context_data = upm_get_context_data_from_nsapi(nsapi); + + /* UPM_DTI_REQ arrived first (or activation override). Use present data structures. */ + if (ptr_context_data != NULL) + { +#ifdef UPM_WITHOUT_USER_PLANE /*T_UPM_USER_PLANE_DATA is not visible for GPRS world*/ + memset(ptr_context_data, 0, sizeof(struct T_CONTEXT_DATA) + /* - sizeof(struct T_UPM_USER_PLANE_DATA)*/); +#else /*#ifndef UPM_WITHOUT_USER_PLANE*/ + memset(ptr_context_data, 0, sizeof(struct T_CONTEXT_DATA) + - sizeof(struct T_UPM_USER_PLANE_DATA)); +#endif /*#ifndef UPM_WITHOUT_USER_PLANE*/ + ptr_context_data->nsapi = (U8)nsapi; + } else { + MALLOC(ptr_context_data, (U32)sizeof(struct T_CONTEXT_DATA)); + + if (ptr_context_data == NULL) + { + (void)TRACE_ERROR("Unable to allocate data structure for new context!"); + return; + } + + memset(ptr_context_data, 0, sizeof(struct T_CONTEXT_DATA)); + + upm_assign_context_data_to_nsapi(ptr_context_data, nsapi); + } + + TRACE_ASSERT(ptr_context_data != NULL); + + upm_link_control_init(ptr_context_data); +#ifdef TI_UMTS + upm_rab_control_init(ptr_context_data); +#endif /* TI_UMTS */ +#ifdef TI_GPRS + upm_sndcp_control_init(ptr_context_data); +#endif /* TI_GPRS */ +#ifdef TI_DUAL_MODE + upm_rat_control_init( (T_PS_rat)prim->rat ); +#endif /* TI_DUAL_MODE */ + upm_link_control(ptr_context_data, UPM_P_SM_ACTIVATE_STARTED_IND, prim); +} + +/* ++------------------------------------------------------------------------------ +| Function : upm_disp_sm_activate_ind ++------------------------------------------------------------------------------ +| Description : Dispatch SM_ACTIVATE_IND +| +| Parameters : sm_activate_ind - received primitive ++------------------------------------------------------------------------------ +*/ +void upm_disp_sm_activate_ind(T_SM_ACTIVATE_IND *sm_activate_ind) +{ + struct T_CONTEXT_DATA *ptr_context_data; + + (void)TRACE_FUNCTION("upm_disp_sm_activate_ind"); + + ptr_context_data = upm_get_context_data_from_nsapi(sm_activate_ind->nsapi); + if (ptr_context_data != NULL) + { + upm_link_control(ptr_context_data, UPM_P_SM_ACTIVATE_IND, sm_activate_ind); + } else { + (void)TRACE_ERROR("Tried to complete activation of non-existent context!"); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : upm_disp_sm_modify_ind ++------------------------------------------------------------------------------ +| Description : Dispatch SM_MODIFY_IND +| +| Parameters : sm_modify_ind - received primitive ++------------------------------------------------------------------------------ +*/ +void upm_disp_sm_modify_ind (T_SM_MODIFY_IND *sm_modify_ind) +{ + struct T_CONTEXT_DATA *ptr_context_data; + + (void)TRACE_FUNCTION("upm_disp_sm_modify_ind"); + + ptr_context_data = upm_get_context_data_from_nsapi(sm_modify_ind->nsapi); + if (ptr_context_data != NULL) + { + upm_link_control(ptr_context_data, UPM_P_SM_MODIFY_IND, sm_modify_ind); + } else { + (void)TRACE_ERROR("Tried to modify non-existent context!"); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : upm_disp_upm_count_req ++------------------------------------------------------------------------------ +| Description : Dispatch UPM_COUNT_REQ +| +| Parameters : prim - received primitive ++------------------------------------------------------------------------------ +*/ +void upm_disp_upm_count_req (T_UPM_COUNT_REQ *prim) +{ + struct T_CONTEXT_DATA *ptr_context_data; + + (void)TRACE_FUNCTION("upm_disp_upm_count_req"); + + ptr_context_data = upm_get_context_data_from_nsapi(prim->nsapi); + + if (ptr_context_data != NULL) { +#ifdef TI_GPRS +#ifdef TI_DUAL_MODE + if (upm_get_current_rat() == PS_RAT_GSM) +#endif /* TI_DUAL_MODE */ + { + upm_sndcp_dispatch_upm_count_req(prim); + } +#endif /* TI_GPRS */ +#ifdef TI_DUAL_MODE + else +#endif /* TI_DUAL_MODE */ +#ifdef TI_UMTS + { + upm_dti_dispatch_upm_count_req(ptr_context_data, prim->reset); + } +#endif + } else { + (void)TRACE_EVENT_P1("Warning: Received COUNT_REQ for undefined " + "NSAPI/context; ignored...", prim->nsapi); + } +} + +/*==== END OF FILE ==========================================================*/