FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/sm/sm_aci_output_handler.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/sm/sm_aci_output_handler.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,369 @@ +/*---------------------------------------------------------------------------- +| 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: Output functions for primitives from SM to the ACI entity. +| For design details, see: +| 8010.908 SM Detailed Specification ++---------------------------------------------------------------------------*/ + +/*==== DECLARATION CONTROL =================================================*/ + +/*==== INCLUDES ============================================================*/ + +#include "sm.h" + +#include "sm_aci_output_handler.h" +#include "sm_qos.h" + +/*==== CONSTS ===============================================================*/ + +/*==== TYPES ================================================================*/ + +/*==== LOCALS ===============================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_activate_cnf ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_ACTIVATE_CNF primitive. +| +| Parameters : context - Pointer to context structure ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_activate_cnf(struct T_SM_CONTEXT_DATA *context) +{ + U16 pco_len; + (void)TRACE_FUNCTION("send_smreg_pdp_activate_cnf"); + + pco_len = (context->negotiated_pco != NULL + ? (U16)context->negotiated_pco->c_pco_value + : (U16)0); + + { + U16 pco_bit_len = pco_len << 3; + PALLOC_SDU(prim, SMREG_PDP_ACTIVATE_CNF, pco_bit_len); + + if (prim != NULL) { + prim->nsapi = context->nsapi; + prim->pdp_type = context->pdp_type; + sm_qos_copy_from_sm(&prim->qos, &context->accepted_qos, &prim->ctrl_qos); + memcpy(&prim->comp_params, &context->comp_params, sizeof(T_NAS_comp_params)); + prim->ctrl_ip_address = context->negotiated_address.ctrl_ip_address; + memcpy(&prim->ip_address, &context->negotiated_address.ip_address, sizeof(T_NAS_ip_address)); + if (pco_len > 0 && context->negotiated_pco != NULL) { + U16 offset = prim->sdu.o_buf >> 3; + /* sdu.o_buf and sdu.l_buf already by PALLOC_SDU macro above! */ + memcpy(&prim->sdu.buf[offset], context->negotiated_pco->pco_value, + (size_t)pco_len); + } else { + prim->sdu.l_buf = 0; + } + + (void)PSEND(hCommACI, prim); + } else { + (void)TRACE_ERROR("Unable to allocate SMREG_PDP_ACTIVATE_CNF primitive!"); + } + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_activate_ind ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_ACTIVATE_IND primitive. +| +| Parameters : context - Pointer to context structure ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_activate_ind(struct T_SM_CONTEXT_DATA *context) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_activate_ind"); + + { + PALLOC(prim, SMREG_PDP_ACTIVATE_IND); + + prim->ti = context->ti; + prim->pdp_type = context->pdp_type; + prim->ctrl_ip_address = context->negotiated_address.ctrl_ip_address; + memcpy(&prim->ip_address, &context->negotiated_address.ip_address, sizeof(T_NAS_ip_address)); + if (context->apn != NULL) { /* NOTE: *MUST* be present acc to 3G 24.008, but just in case... */ + memcpy(&prim->apn, context->apn, sizeof(T_SMREG_apn)); + } else { + prim->apn.c_apn_buf = (U8)0; + } + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_activate_rej ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_ACTIVATE_REJ primitive. +| +| Parameters : context - Pointer to context structure ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_activate_rej(U8 nsapi, T_CAUSE_ps_cause *cause) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_activate_rej"); + + { + PALLOC(prim, SMREG_PDP_ACTIVATE_REJ); + + prim->nsapi = nsapi; + prim->ps_cause.ctrl_value = cause->ctrl_value; + prim->ps_cause.value = cause->value; + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_activate_sec_cnf ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_ACTIVATE_SEC_CNF primitive. +| +| Parameters : context - Pointer to context structure ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_activate_sec_cnf(struct T_SM_CONTEXT_DATA *context) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_activate_sec_cnf"); + + { + PALLOC(prim, SMREG_PDP_ACTIVATE_SEC_CNF); + + prim->nsapi = context->nsapi; + + sm_qos_copy_from_sm(&prim->qos, &context->accepted_qos, &prim->ctrl_qos); + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_activate_sec_rej ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_ACTIVATE_SEC_REJ primitive. +| +| Parameters : nsapi - Context identifier +| cause - Rejection cause ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_activate_sec_rej(U8 nsapi, T_CAUSE_ps_cause *cause) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_activate_sec_rej"); + + { + PALLOC(prim, SMREG_PDP_ACTIVATE_SEC_REJ); + + prim->nsapi = nsapi; + prim->ps_cause.ctrl_value = cause->ctrl_value; + prim->ps_cause.value = cause->value; + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_deactivate_cnf ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_DEACTIVATE_CNF primitive. +| +| Parameters : nsapi_set - Set of NSAPIs successfully deactivated ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_deactivate_cnf(U16 nsapi_set) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_deactivate_cnf"); + + { + PALLOC(prim, SMREG_PDP_DEACTIVATE_CNF); + + prim->nsapi_set = nsapi_set; + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_deactivate_ind ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_DEACTIVATE_IND primitive. +| +| Parameters : nsapi_set - Set of NSAPIs being deactivated +| cause - Reason for deactivation ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_deactivate_ind(U16 nsapi_set, T_CAUSE_ps_cause *cause) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_deactivate_ind"); + + { + PALLOC(prim, SMREG_PDP_DEACTIVATE_IND); + + prim->nsapi_set = nsapi_set; + prim->ps_cause.ctrl_value = cause->ctrl_value; + prim->ps_cause.value = cause->value; + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_modify_cnf ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_MODIFY_CNF primitive. +| +| Parameters : None ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_modify_cnf(struct T_SM_CONTEXT_DATA *context, + T_SM_UPDATE_FLAGS update_flags) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_modify_cnf"); + + { + PALLOC(prim, SMREG_PDP_MODIFY_CNF); + + prim->nsapi = context->nsapi; + + if ((update_flags & SM_UPDATE_QOS) != (T_SM_UPDATE_FLAGS)0) { + sm_qos_copy_from_sm(&prim->qos, &context->accepted_qos, &prim->ctrl_qos); + } else { + prim->ctrl_qos = PS_is_qos_not_present; + } + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_modify_ind ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_MODIFY_IND primitive. +| +| Parameters : None ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_modify_ind(struct T_SM_CONTEXT_DATA *context, + T_SM_UPDATE_FLAGS update_flags) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_modify_ind"); + + { + PALLOC(prim, SMREG_PDP_MODIFY_IND); + + prim->nsapi = context->nsapi; + + if ((int)(update_flags & SM_UPDATE_QOS) != 0) { + sm_qos_copy_from_sm(&prim->qos, &context->accepted_qos, &prim->ctrl_qos); + } else { + prim->ctrl_qos = PS_is_qos_not_present; + } + + if ((int)(update_flags & SM_UPDATE_ADDRESS) != 0) { + prim->ctrl_ip_address = context->negotiated_address.ctrl_ip_address; + memcpy(&prim->ip_address, &context->negotiated_address.ip_address, sizeof(T_NAS_ip_address)); + } else { + prim->ctrl_ip_address = NAS_is_ip_not_present; + } + + (void)PSEND(hCommACI, prim); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_modify_ind_multiple ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_MODIFY_IND primitives for +| several NSAPIs. +| +| Parameters : None ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_modify_ind_multiple(U16 nsapi_set, + T_SM_UPDATE_FLAGS update_flags) +{ + int nsapi; + + (void)TRACE_FUNCTION("send_smreg_pdp_modify_ind_multiple"); + + for (nsapi = (int)NAS_NSAPI_5; + nsapi < NAS_SIZE_NSAPI && sm_is_nsapi_in_nsapi_set(nsapi, nsapi_set); + nsapi++) + { + struct T_SM_CONTEXT_DATA *context; + + context = sm_get_context_data_from_nsapi(nsapi); + if (context != NULL) + { + PALLOC(prim, SMREG_PDP_MODIFY_IND); + + prim->nsapi = context->nsapi; + + if ((update_flags & SM_UPDATE_QOS_DOWNGRADE) != (T_SM_UPDATE_FLAGS)0) { + sm_qos_copy_from_sm(&prim->qos, &context->accepted_qos, &prim->ctrl_qos); + /* QoS downgraded to 0kbps */ + prim->qos.qos_r99.max_rate_ul = 0; + prim->qos.qos_r99.max_rate_dl = 0; + } else { + prim->ctrl_qos = PS_is_qos_not_present; + } + + /* IP address is not changed/set using this function */ + prim->ctrl_ip_address = NAS_is_ip_not_present; + + (void)PSEND(hCommACI, prim); + } /* if */ + } /* for */ +} + +/* ++------------------------------------------------------------------------------ +| Function : send_smreg_pdp_modify_rej ++------------------------------------------------------------------------------ +| Description : Allocate, pack and send SMREG_PDP_MODIFY_REJ primitive. +| +| Parameters : None ++------------------------------------------------------------------------------ +*/ +void send_smreg_pdp_modify_rej(U8 nsapi, T_CAUSE_ps_cause *cause) +{ + (void)TRACE_FUNCTION("send_smreg_pdp_modify_rej"); + + { + PALLOC(prim, SMREG_PDP_MODIFY_REJ); + + prim->nsapi = nsapi; + prim->ps_cause.ctrl_value = cause->ctrl_value; + prim->ps_cause.value = cause->value; + + (void)PSEND(hCommACI, prim); + } +} + +/*==== END OF FILE ==========================================================*/