FreeCalypso > hg > fc-magnetite
diff src/g23m-gsm/cc/cc_ffk.c @ 104:27a4235405c6
src/g23m-gsm: import from LoCosto source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 04 Oct 2016 18:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gsm/cc/cc_ffk.c Tue Oct 04 18:24:05 2016 +0000 @@ -0,0 +1,494 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : CC_FFK ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| 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 Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This Modul defines the functions called by the primitive +| processing functions of the SDL process FORMATTER. ++----------------------------------------------------------------------------- +*/ + +#ifndef CC_FFK_C +#define CC_FFK_C + +#define ENTITY_CC +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include "typedefs.h" +#include "pcm.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "message.h" +#include "ccdapi.h" +#include "prim.h" +#include "cnf_cc.h" +#include "mon_cc.h" +#include "pei.h" +#include "tok.h" +#include "cc.h" + +/*==== EXPORT =====================================================*/ + +/*==== PRIVAT =====================================================*/ + +/*==== VARIABLES ==================================================*/ + +/*==== FUNCTIONS ==================================================*/ +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_called_party_bcd | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a called party bcd information + element. + +*/ + +GLOBAL BOOL for_check_called_party_bcd (UBYTE ton, UBYTE npi) +{ + TRACE_FUNCTION ("for_check_called_party_bcd()"); + + /* + * Check numbering type + */ + if (ton <= M_CC_TON_DEDICATED) + { + /* + * Check numbering plan + */ + switch (npi) + { + case M_CC_NPI_UNKNOWN: + case M_CC_NPI_ISDN: + case M_CC_NPI_X121: + case M_CC_NPI_F69: + case M_CC_NPI_NATIONAL: + case M_CC_NPI_PRIVATE: + return TRUE; + default: + break; + } + } + return FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_called_party_sub | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a called party sub information + element. + +*/ + +GLOBAL BOOL for_check_called_party_sub (T_M_CC_called_subaddr * called_subaddr) +{ + TRACE_FUNCTION ("for_check_called_party_sub()"); + + switch (called_subaddr->tos) + { + case M_CC_TOS_NSAP: + case M_CC_TOS_USER: + return TRUE; + default: + return FALSE; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_calling_party_bcd| ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a calling party bcd information + element. + +*/ + +GLOBAL BOOL for_check_calling_party_bcd (T_M_CC_calling_num * calling_num) +{ + TRACE_FUNCTION ("for_check_calling_party_bcd()"); + + /* + * Check numbering type + */ + if (calling_num->ton <= M_CC_TON_DEDICATED) + { + /* + * Check numbering plan + */ + switch (calling_num->npi) + { + case M_CC_NPI_UNKNOWN: + case M_CC_NPI_ISDN: + case M_CC_NPI_X121: + case M_CC_NPI_F69: + case M_CC_NPI_NATIONAL: + case M_CC_NPI_PRIVATE: + break; + default: + return FALSE; + } + /* + * Check Present Indicator + */ + if (calling_num->v_present AND + (calling_num->present > M_CC_PRES_NOT_AVAIL)) + return FALSE; + else + return TRUE; + } + return FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_calling_party_sub | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a calling party sub information + element. + +*/ + +GLOBAL BOOL for_check_calling_party_sub (T_M_CC_calling_subaddr * calling_subaddr) +{ + TRACE_FUNCTION ("for_check_calling_party_sub()"); + + switch (calling_subaddr->tos) + { + case M_CC_TOS_NSAP: + case M_CC_TOS_USER: + return TRUE; + default: + return FALSE; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_callstate | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a callstate information + element. + +*/ + +GLOBAL void for_check_call_state (T_M_CC_call_state * call_state) +{ + TRACE_FUNCTION ("for_check_call_state()"); + + if ( call_state->cs NEQ M_CC_CS_GSM_PLMN ) /* VK 04-jul-97 */ + call_state->state = M_CC_CS_10; /* VK 04-jul-97 */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_cc_cause | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a cc cause information + element. + +*/ + +GLOBAL BOOL for_check_cc_cause (T_M_CC_cc_cause* cc_cause) +{ + TRACE_FUNCTION ("for_check_cc_cause()"); +//TISH patch for OMAPS00129223 +#if 0 + /* + * this is a (dirty) "trick" to detect that the cause IE was not present + * although mandatory (for some messages): value 0 is reserved, i.e. it is not + * expected that it will be sent by a network; CCD/the frame ensures that the + * memory contents is 0 which will be seen as value if the cause IE was not present + */ + if (cc_cause->cause EQ 0) + return FALSE; +#endif + /* + * coding standards other than GSM are not supported (which is a valid option); + * map the cause value to interworking, unspecified then, skip further checks + */ + if (cc_cause->cs NEQ M_CC_CS_GSM_PLMN ) + { + cc_cause->cause = M_CC_CAUSE_INTERWORKING; + return TRUE; + } + + /* check for reserved Location (octet 3) */ + switch (cc_cause->loc) + { + case M_CC_LOC_USER: + case M_CC_LOC_PRIV_NET_LOCAL_USER: + case M_CC_LOC_PUB_NET_LOCAL_USER: + case M_CC_LOC_TRANSIT_NET: + case M_CC_LOC_PRIV_NET_REMOTE_USER: + case M_CC_LOC_PUB_NET_REMOTE_USER: + case M_CC_LOC_INTERNATIONAL_NET: + case M_CC_LOC_BEYOND_POINT: + break; + default: + return FALSE; + } + + /* check Recommendation (octet 3a) */ + /* + * the condition below also checks the value of octet 3a (if present); + * this stems from GSM 04.08 of Ph1 were the value 1 was defined as indicating + * GSM; since Ph2 there is the requirement that octet 3a shall not be included + * for coding standard being equal to GSM; however, the design decision is + * to keep the Ph1 behaviour in order to be a "tolerant" MS and to avoid + * interworking problems with Ph1 infrastructure, especially as this case is + * not treated in GSM 09.90 + */ + if (cc_cause->v_rec AND + (cc_cause->rec NEQ 1)) + return FALSE; + else + return TRUE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_progress_indicator| ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a progress indicator information + element. + +*/ + +GLOBAL BOOL for_check_progress_indicator (T_M_CC_progress * progress) +{ + TRACE_FUNCTION ("for_check_progress_indicator()"); + + /* coding standard and progress description are not in optional octets (3 and 4) */ + if ((progress->v_cs EQ FALSE) OR + (progress->v_progress_desc EQ FALSE)) + return FALSE; + + /* + * map progress description to "Unspecific" if coding standard other than + * GSM is used; note that it is an option to not support coding standards + * other than GSM (which Condat takes) + */ + if (progress->cs NEQ M_CC_CS_GSM_PLMN) + { + progress->progress_desc = MNCC_PROG_UNSPECIFIC; + return TRUE; /* don't care about reserved values for Location anymore of other standards */ + } + + /* check for reserved Location values */ + switch (progress->loc) + { + case M_CC_LOC_USER: + case M_CC_LOC_PRIV_NET_LOCAL_USER: + case M_CC_LOC_PUB_NET_LOCAL_USER: + case M_CC_LOC_PRIV_NET_REMOTE_USER: + case M_CC_LOC_PUB_NET_REMOTE_USER: + case M_CC_LOC_BEYOND_POINT: + break; + default: + return FALSE; + } + + return TRUE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_repeat_indicator | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a repeat indicator information + element. + +*/ + +GLOBAL BOOL for_check_repeat_indicator (UBYTE repeat) +{ + TRACE_FUNCTION ("for_check_repeat_indicator()"); + + if ((repeat EQ M_CC_REPEAT_CIRCULAR) + OR + (repeat EQ M_CC_REPEAT_SEQUENTIAL) + ) + return TRUE; + else + return FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_check_signal | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the content of a signal information + element. + +*/ + +GLOBAL BOOL for_check_signal (UBYTE signal) +{ + TRACE_FUNCTION ("for_check_signal()"); + + if ((signal <= M_CC_SIGNAL_HOOK_OFF_ON) + OR + (signal EQ M_CC_SIGNAL_TONES_OFF) + OR + (signal EQ M_CC_SIGNAL_ALERT_OFF)) + return TRUE; + else + return FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_set_conditional_error | ++--------------------------------------------------------------------+ + + PURPOSE : Stores a detected conditional error. + +*/ + +GLOBAL void for_set_conditional_error (UBYTE iei) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("for_set_conditional_error()"); + + switch (cc_data->error) + { + case M_CC_CAUSE_INFO_ELEM_NOT_IMPLEM: + case M_CC_CAUSE_INVALID_MAND_INFO: + break; + + default: + cc_data->error = M_CC_CAUSE_COND_INFO_ELEM; + if (cc_data->error_count < MAX_ERROR_TAGS) + cc_data->error_inf [cc_data->error_count++] = iei; + break; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_set_mandatory_error | ++--------------------------------------------------------------------+ + + PURPOSE : Stores a detected mandatory error. + +*/ + +GLOBAL void for_set_mandatory_error ( UBYTE iei) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("for_set_mandatory_error()"); + + switch (cc_data->error) + { + case M_CC_CAUSE_INFO_ELEM_NOT_IMPLEM: + case M_CC_CAUSE_COND_INFO_ELEM: + cc_data->error_count = 0; + /*FALLTHROUGH*/ /*lint -fallthrough*/ + + default: + cc_data->error = M_CC_CAUSE_INVALID_MAND_INFO; + if (cc_data->error_count < MAX_ERROR_TAGS) + cc_data->error_inf [cc_data->error_count++] = iei; + break; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CC_FFK | +| STATE : code ROUTINE : for_set_optional_error | ++--------------------------------------------------------------------+ + + PURPOSE : Stores a detected optional error. + +*/ + +GLOBAL void for_set_optional_error ( UBYTE iei) +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION ("for_set_optional_error()"); + + switch (cc_data->error) + { + case M_CC_CAUSE_INVALID_MAND_INFO: + break; + + case M_CC_CAUSE_COND_INFO_ELEM: + cc_data->error_count = 0; + /*FALLTHROUGH*/ /*lint -fallthrough*/ + + default: + /* + * Check whether the iei is compression required + */ + if ((iei & 0xF0) EQ 0) + for_set_mandatory_error (iei); + else + { + cc_data->error = M_CC_CAUSE_INFO_ELEM_NOT_IMPLEM; + if (cc_data->error_count < MAX_ERROR_TAGS) + cc_data->error_inf [cc_data->error_count++] = iei; + } + break; + } +} + +/* ++--------------------------------------------------------------------+ +| | STATE : code ROUTINE : cc_check_critical_error | ++--------------------------------------------------------------------+ + + PURPOSE : This function checks wheter a critical error has been + detected in the air message. Critical errors which prevent + the treatment of an air message are + - invalid Message ID + - mandatory IE missing + - IE coded as comprehension required missing +*/ + +GLOBAL BOOL cc_check_critical_error (UBYTE cc_err) +{ + TRACE_FUNCTION ("cc_check_critical_error ()"); + if (cc_err EQ M_CC_CAUSE_INVALID_MAND_INFO OR + cc_err EQ M_CC_CAUSE_MESSAGE_TYPE_NOT_IMPLEM OR + cc_err EQ M_CC_CAUSE_COND_INFO_ELEM OR + cc_err EQ M_CC_CAUSE_SERVICE_NOT_IMPLEM ) + return (TRUE); + else + return (FALSE); +} + +#endif