view src/g23m-gprs/upm/upm.c @ 206:6aadfa0d10c4

UPM enabled in the GPF/GPRS config for the hybrid build
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 Oct 2016 06:54:58 +0000
parents 2cf312e56ee7
children
line wrap: on
line source

/*----------------------------------------------------------------------------
|  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:    Utility functions for the UPM entity.
|             For design details, see:
|             8010.939 UPM Detailed Specification
+---------------------------------------------------------------------------*/

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

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

#include "upm.h"

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

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

T_UPM_DATA upm_data;

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

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

/*
+------------------------------------------------------------------------------
| Function    : upm_pfree
+------------------------------------------------------------------------------
| Description : PFREE macro replacement
|
| Parameters  : data                - memory to free
+------------------------------------------------------------------------------
*/
void upm_pfree(/*@only@*/ /*@null@*/ /*@out@*/ void *data)
{
  if (data != NULL)
  {
    vsi_c_pfree((T_VOID_STRUCT **)&data FILE_LINE_MACRO);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : upm_mfree
+------------------------------------------------------------------------------
| Description : Wrapper for MFREE macro.
|
| Parameters  : data                   - memory to free (NULL allowed)
+------------------------------------------------------------------------------
*/
void upm_mfree(/*@only@*/ /*@out@*/ /*@null@*/ void *data)
{
  if (data != NULL) {
    MFREE(data);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : upm_nsapi2nsapi_set
+------------------------------------------------------------------------------
| Description : Return nsapi_set corresponding to NSAPI
|
| Parameters  : nsapi                  - NSAPI
+------------------------------------------------------------------------------
*/
U16 upm_nsapi2nsapi_set(int /*@alt U8@*/ nsapi) /*@*/
{
  TRACE_ASSERT ((T_NAS_nsapi)nsapi >= NAS_NSAPI_5 &&  nsapi <= NAS_NSAPI_15);

  return (U16)(1UL << (U16)nsapi);
}

/*
+------------------------------------------------------------------------------
| Function    : upm_get_context_data_from_nsapi
+------------------------------------------------------------------------------
| Description : Returns context data structure associated with indicated NSAPI.
|
| Parameters  : nsapi                  - NSAPI index
+------------------------------------------------------------------------------
*/
/*@null@*/ /*@exposed@*/
struct T_CONTEXT_DATA *upm_get_context_data_from_nsapi(int /*@alt U8@*/ nsapi)
{
  TRACE_ASSERT (((T_NAS_nsapi)nsapi >= NAS_NSAPI_5 && nsapi <= NAS_NSAPI_15));

  /*lint -e{661} upm_context_array causes out of bounds access, it does not! */
  return (upm_data.upm_context_array[nsapi - (int)NAS_NSAPI_5]);
}

/*
+------------------------------------------------------------------------------
| Function    : upm_assign_context_data_to_nsapi
+------------------------------------------------------------------------------
| Description : Assign context data structure to global context array.
|
| Parameters  : ptr_context_data       - Pointer to context data
|               nsapi                  - NSAPI index
+------------------------------------------------------------------------------
*/
void upm_assign_context_data_to_nsapi(/*@keep@*/
				      struct T_CONTEXT_DATA *ptr_context_data,
				      int /*@alt U8@*/ nsapi)
{
  (void)TRACE_EVENT_P2("upm_assign_context_data_to_nsapi: NSAPI%3d = %p", nsapi, ptr_context_data);

  TRACE_ASSERT ((T_NAS_nsapi)nsapi >= NAS_NSAPI_5 && nsapi <= NAS_NSAPI_15);

  /*lint -e{661} upm_context_array causes out of bounds access, it does not! */
  upm_data.upm_context_array[nsapi - (int)NAS_NSAPI_5] = ptr_context_data;
  ptr_context_data->nsapi = nsapi;
}

/*
+------------------------------------------------------------------------------
| Function    : upm_free_context_data
+------------------------------------------------------------------------------
| Description : Free context data structure associated with indicated NSAPI.
|
| Parameters  : nsapi                  - NSAPI index
+------------------------------------------------------------------------------
*/
void upm_free_context_data(int /*@alt U8@*/ nsapi)
{
  TRACE_ASSERT ((T_NAS_nsapi)nsapi >= NAS_NSAPI_5 && nsapi <= NAS_NSAPI_15);

  /*lint -e661 (upm_context_array causes out of bounds access, it does not!) */
  if ( upm_data.upm_context_array[nsapi - (int)NAS_NSAPI_5] != NULL ) {
    upm_mfree(upm_data.upm_context_array[nsapi - (int)NAS_NSAPI_5]);
    upm_data.upm_context_array[nsapi - (int)NAS_NSAPI_5] = NULL;
  /*lint +e661 (upm_context_array causes out of bounds access, it does not!) */	
  }
}

/*
+------------------------------------------------------------------------------
| Function    : upm_check_for_released_context_and_release
+------------------------------------------------------------------------------
| Description : Check whether a context is released (both link and DTI
|               connections released), and if so, freee context data structure
|               associated with indicated NSAPI.
|
| Parameters  : nsapi                  - NSAPI index
+------------------------------------------------------------------------------
*/
void upm_check_for_released_context_and_release(struct T_CONTEXT_DATA *context)
{
  if (upm_is_link_released(context)
#ifndef UPM_WITHOUT_USER_PLANE
      && upm_is_dti_disconnected(context)
#endif
      )
  {
    U8 nsapi = context->nsapi;

    upm_free_context_data(nsapi);
    (void)TRACE_EVENT_P1("upm_check_for_released_context_and_release on NSAPI %d: Context data freed...", nsapi);
  }
}

/*
+------------------------------------------------------------------------------
| Function    : upm_get_current_rat
+------------------------------------------------------------------------------
| Description : Returns the RAT in which UPM is currently active
|
| Parameters  : None
+------------------------------------------------------------------------------
*/
#ifdef TI_DUAL_MODE
T_PS_rat upm_get_current_rat(void)
{
  return upm_data.upm_rat;
}
#endif /* TI_DUAL_MODE */

/*
+------------------------------------------------------------------------------
| Function    : upm_set_current_rat
+------------------------------------------------------------------------------
| Description : Sets currently active RAT
|
| Parameters  : rat                    - RAT received from SM or MM
+------------------------------------------------------------------------------
*/
#ifdef TI_DUAL_MODE
void upm_set_current_rat(T_PS_rat rat)
     /*@modifies upm_data.upm_rat@*/
{
  upm_data.upm_rat = rat;
}
#endif /* TI_DUAL_MODE */

/*
+------------------------------------------------------------------------------
| Function    : upm_ll_entity_test
+------------------------------------------------------------------------------
| Description : Returns TRUE if upm_ll_entity_test is set in UPM data struct
|
| Parameters  : None
+------------------------------------------------------------------------------
*/
BOOL upm_ll_entity_test(void)
{
  return upm_data.upm_ll_entity_test;
}

/*
+------------------------------------------------------------------------------
| Function    : upm_activate_ll_entity_test
+------------------------------------------------------------------------------
| Description : Enables lower layer stubs for entity test
|
| Parameters  : None
+------------------------------------------------------------------------------
*/
void upm_activate_ll_entity_test(void)
{
  upm_data.upm_ll_entity_test = TRUE;
}

/*
+------------------------------------------------------------------------------
| Function    : upm_set_sequence_number
+------------------------------------------------------------------------------
| Description : Stores the receive sequence number from MM for later retrieval
|
| Parameters  : ptr_context_data    - Context data
|               seq_no              - Receive sequence number
+------------------------------------------------------------------------------
*/
void upm_set_sequence_number(struct T_CONTEXT_DATA *ptr_context_data, U8 seq_no)
{
  (void)TRACE_FUNCTION("upm_set_sequence_number");

  ptr_context_data->seq_nos_valid = (U8)TRUE;
  ptr_context_data->recv_seq_no   = seq_no;
}

/*
+------------------------------------------------------------------------------
| Function    : upm_get_sequence_number
+------------------------------------------------------------------------------
| Description : Retrieves the receive sequence number previously gotten from MM
|
| Parameters  : ptr_context_data    - Context data
+------------------------------------------------------------------------------
*/
U8 upm_get_sequence_number(struct T_CONTEXT_DATA *ptr_context_data)
{
  (void)TRACE_FUNCTION("upm_get_sequence_number");

  if (ptr_context_data->seq_nos_valid != (U8)0)
  {
    ptr_context_data->seq_nos_valid = (U8)0;
    return ptr_context_data->recv_seq_no;
  } else {
    return (U8)0;
  }
}

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