view src/g23m-fad/ppp/ppp_ptxs.c @ 683:81394dcdf4d3

uartfax.c: OM-style wakeup interrupt implemented for Tango
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 26 Jun 2020 03:06:16 +0000
parents 90eb61ecd093
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  
|  Modul   :  
+----------------------------------------------------------------------------- 
|  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 is part of the entity PPP and implements all
|             functions to handles the incoming process internal signals as
|             described in the SDL-documentation (PTX-statemachine)
+----------------------------------------------------------------------------- 
*/ 

#define ENTITY_PPP

/*
 * define for ptxs debug traces
 */
/* #define PTXS_DEBUG */

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

#include "typedefs.h"   /* to get Condat data types */
#include "vsi.h"        /* to get a lot of macros */
#include "macdef.h"     /* to get a lot of macros */
#include "custom.h"     /* to get a lot of macros */
#include "gsm.h"        /* to get a lot of macros */
/*lint -efile(766,cnf_ppp.h) */
#include "cnf_ppp.h"    /* to get cnf-definitions */
/*lint -efile(766,mon_ppp.h) */
#include "mon_ppp.h"    /* to get mon-definitions */
#include "prim.h"       /* to get the definitions of used SAP and directions */
#include "dti.h"        /* to get the DTILIB definitions */
#include "ppp.h"        /* to get the global entity definitions */

#include "ppp_dti.h"    /* to get the local DTILIB definitions */
#include "ppp_frxs.h"   /* to get signal interface from frx */
#include "ppp_arbs.h"   /* to get signal interface from arb */

#include "ppp_arbf.h"   /* to get arb functions */

/*==== CONST ================================================================*/

/*==== LOCAL VARS ===========================================================*/

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

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



/*
+------------------------------------------------------------------------------
| Function    : sig_arb_ptx_dead_mode_req
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_ARB_PTX_DEAD_MODE_REQ. It sets
|               the frame-reception-packet-transission direction to DEAD mode.
|               That means these two services will not receive or send any more
|               data.
|
| Parameters  : no parameters
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_arb_ptx_dead_mode_req ()
{
  TRACE_ISIG( "sig_arb_ptx_dead_mode_req" );

  ppp_data->ptx.ftx_buffer_state = PTX_FTX_BUFFER_FULL;
  ppp_data->ptx.ptx_buffer_state = PTX_BUFFER_FULL;

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_READY:
    case PTX_BLOCKED:
      SET_STATE( PPP_SERVICE_PTX, PTX_DEAD );
      sig_ptx_frx_stop_flow_req();
      break;

    default:
      TRACE_ERROR( "SIG_ARB_PTX_DEAD_MODE_REQ unexpected" );
      break;
  }
  
  /*
   * set FRX to dead mode
   */
  sig_ptx_frx_dead_mode_req();

} /* sig_arb_ptx_dead_mode_req() */



/*
+------------------------------------------------------------------------------
| Function    : sig_arb_ptx_ready_mode_req
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_ARB_PTX_READY_MODE_REQ. It sets
|               the frame-reception-packet-transission direction to READY mode.
|               That means these two services will receive and send data.
|
| Parameters  : no parameters
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_arb_ptx_ready_mode_req ()
{
  TRACE_ISIG( "sig_arb_ptx_ready_mode_req" );

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_BLOCKED:
      SET_STATE( PPP_SERVICE_PTX, PTX_READY );
      /*
       * incoming data flow had not been stopped but redirected to
       * ARB, so normally don't need to start, but it is possible that the data flow  
       * has been stopped bacause of ftx_buffer_full_ind
       */
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND
         ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY        )
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(READY_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      /* 
       * data is to be sent directly to the peer, and the dtilib buffer is
       * full, so stop incoming data flow.
       */
      if(ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_FULL)
      {
        sig_ptx_frx_stop_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("INFO(READY_MODE_REQ): UL data flow wasn't stopped, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    case PTX_DEAD:
      /*
       * incoming data is to be redirected to ARB
       */
      SET_STATE( PPP_SERVICE_PTX, PTX_READY);
      sig_ptx_frx_ready_mode_req();
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND
         ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY        )
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(READY_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    default:
      TRACE_ERROR( "SIG_ARB_PTX_READY_MODE_REQ unexpected" );
      break;
  }
} /* sig_arb_ptx_ready_mode_req() */



/*
+------------------------------------------------------------------------------
| Function    : sig_arb_ptx_blocked_mode_req
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_ARB_PTX_BLOCKED_MODE_REQ. It
|               sets the frame-reception-packet-transission direction to
|               BLOCKED mode. That means PPP receives frames, but it dos not
|               send packts.
|
| Parameters  : no parameters
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_arb_ptx_blocked_mode_req ()
{
  TRACE_ISIG( "sig_arb_ptx_blocked_mode_req" );

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_DEAD:
      /* 
       * Start incoming data flow - data will be sent to ARB.
       */
      SET_STATE( PPP_SERVICE_PTX, PTX_BLOCKED);
      sig_ptx_frx_ready_mode_req();
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY)
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(BLOCKED_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    case PTX_READY:
      /*
       * Do not stop incoming data flow, just redirect it to ARB
       * Restart incoming data flow if it should be now redirected to ARB
       */
      SET_STATE( PPP_SERVICE_PTX, PTX_BLOCKED );
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND
         ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_FULL         )
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(BLOCKED_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    default:
      TRACE_ERROR( "SIG_ARB_PTX_BLOCKED_MODE_REQ unexpected" );
      break;
  }
} /* sig_arb_ptx_blocked_mode_req() */



/*
+------------------------------------------------------------------------------
| Function    : sig_arb_ptx_transparent_mode_req
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_ARB_PTX_TRANSPARENT_MODE_REQ.
|               It sets the frame-reception-packet-transission direction to
|               TRANSPARENT mode. That means PPP receives frames and sends
|               these frame transparent to the upper layer.
|
| Parameters  : no parameters
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_arb_ptx_transparent_mode_req ()
{
  TRACE_ISIG( "sig_arb_ptx_transparent_mode_req" );

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_DEAD:
      /*
       * Set ptx to transparent mode and enable incoming data flow.
       * The dti connection has been newly opened so that its buffers
       * are empty and data can be received
       */
      SET_STATE( PPP_SERVICE_PTX, PTX_READY );
      sig_ptx_frx_transparent_mode_req();
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND
         ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY        )
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(TRANSP_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    default:
      TRACE_ERROR( "SIG_ARB_PTX_TRANSPARENT_MODE_REQ unexpected" );
      break;
  }
} /* sig_arb_ptx_transparent_mode_req() */

/*
+------------------------------------------------------------------------------
| Function    : sig_frx_ptx_packet_ind
+------------------------------------------------------------------------------
| Description : Handles the internal signal SIG_FRX_PTX_PACKET_IND. The service
|               FRX received a complete frame and forwards the encapsulated
|               packet to PTX.
|
| Parameters  : ptype      - type of packet
|               packet_len - length of packet
|               packet     - pointer to a generic data descriptor
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_frx_ptx_packet_ind (USHORT ptype,
                                    USHORT packet_len,
                                    T_desc2* packet)
{
  TRACE_ISIG( "sig_frx_ptx_packet_ind" );

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_READY:
      switch(ptype)
      {
        case DTI_PID_CTCP:
        case DTI_PID_UTCP:
          /*
           * if Van Jacobson Header Compression is not negotiated such packets
           * will not be sent to upper layer
           */
          if(ppp_data->n_hc NEQ PPP_HC_VJ)
          {
            sig_ptx_arb_packet_ind(ptype, packet);
            if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_FULL)
            {
              sig_ptx_frx_stop_flow_req();
              #ifdef PTXS_DEBUG
              TRACE_EVENT_P2("INFO(PTX_PACKET_IND): UL data flow was stopped, %s(%d)", __FILE__, __LINE__);
              #endif /* PTXS_DEBUG */
            }
            break;
          }
          /* fall through */
        case DTI_PID_IP:
        case DTI_PID_UOS:
          /*
           * send packet to upper layer
           */
          {
            PALLOC_DESC2 (dti_data_ind, DTI2_DATA_IND);

            dti_data_ind->desc_list2.list_len = packet_len;
            dti_data_ind->desc_list2.first    = (ULONG)packet;

            /*
             *  Send the DTI data primitive
             */

            sig_any_dti_data_ind(ppp_data->ppphDTI,
                                 dti_data_ind,
                                 PPP_INSTANCE, PROT_LAYER,
                                 PROT_CHANNEL,(UBYTE)ptype);
          }
          break;

        default:
          /*
           * received packet is nether an IP packet nor
           * a PPP frame (transparent mode), so we forward it to ARB
           */
          sig_ptx_arb_packet_ind(ptype, packet);
          if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_FULL)
          {
            sig_ptx_frx_stop_flow_req();
            #ifdef PTXS_DEBUG
            TRACE_EVENT_P2("INFO(PTX_PACKET_IND): UL data flow was stopped, %s(%d)", __FILE__, __LINE__);
            #endif /* PTXS_DEBUG */
          }
          break;
      }
    break;

    case PTX_BLOCKED:
      /*
       * In BLOCKED mode we forward each packet to ARB
       */
      sig_ptx_arb_packet_ind(ptype, packet);
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_FULL)
      {
        sig_ptx_frx_stop_flow_req();
        #ifdef PTXS_DEBUG
        TRACE_EVENT_P2("INFO(PTX_PACKET_IND): UL data flow was stopped, %s(%d)", __FILE__, __LINE__);
        #endif /* PTXS_DEBUG */
      }
      break;

    default:
      TRACE_ERROR( "SIG_FRX_PTX_PACKET_IND unexpected" );
      arb_discard_packet(packet);
      break;
  }
} /* sig_frx_ptx_packet_ind() */

/*
+------------------------------------------------------------------------------
| Function    : sig_dti_ptx_tx_buffer_ready_ind
+------------------------------------------------------------------------------
| Description : Handles the signal sig_dti_ptx_tx_buffer_ready_ind
|
| Parameters  : no parameter
|
+------------------------------------------------------------------------------
*/

GLOBAL void sig_dti_ptx_tx_buffer_ready_ind ()
{
  TRACE_FUNCTION( "sig_dti_ptx_tx_buffer_ready_ind" );

  ppp_data->ptx.ptx_buffer_state = PTX_BUFFER_READY;

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_READY:
      if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY)
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(BUFFER_READY_IND): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    case PTX_BLOCKED:
    case PTX_DEAD:
      /* wait for sig_arb_ptx_blocked/ready/transparent_mode_req */
      break;

    default:
      TRACE_ERROR( "DTI signal unexpected" );
      break;
  }
} /* sig_dti_ptx_tx_buffer_ready_ind() */



/*
+------------------------------------------------------------------------------
| Function    : sig_dti_ptx_tx_buffer_full_ind
+------------------------------------------------------------------------------
| Description : This function handle the signal sig_dti_ptx_tx_buffer_full_ind
|
| Parameters  : no parameter
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_dti_ptx_tx_buffer_full_ind ()
{
  TRACE_FUNCTION ("sig_dti_ptx_tx_buffer_full_ind()");

  ppp_data->ptx.ptx_buffer_state = PTX_BUFFER_FULL;

  switch( GET_STATE( PPP_SERVICE_PTX ) )
    {
      case PTX_READY:
        sig_ptx_frx_stop_flow_req();
        break;

      case PTX_DEAD:
        break;

      case PTX_BLOCKED:
        /*
         * do not stop incoming data flow here since data is not sent
         * to the peer but to ARB, not having to be buffered in dtilib
         */
        break;

      default:
        TRACE_ERROR("Wrong state");
        break;
    }
} /* sig_dti_ptx_tx_buffer_full_ind() */


/*
+------------------------------------------------------------------------------
| Function    : sig_ftx_ptx_tx_buffer_full_ind
+------------------------------------------------------------------------------
| Description : This function handle the signal sig_ftx_ptx_tx_buffer_full_ind
|
| Parameters  : no parameter
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_ftx_ptx_buffer_full_ind ()
{
  TRACE_FUNCTION ("sig_ftx_ptx_tx_buffer_full_ind()");

  ppp_data->ptx.ftx_buffer_state = PTX_FTX_BUFFER_FULL;

} /* sig_ftx_ptx_tx_buffer_full_ind() */


/*
+------------------------------------------------------------------------------
| Function    : sig_ftx_ptx_tx_buffer_ready_ind
+------------------------------------------------------------------------------
| Description : This function handle the signal sig_ftx_ptx_tx_buffer_ready_ind
|
| Parameters  : no parameter
|
+------------------------------------------------------------------------------
*/
GLOBAL void sig_ftx_ptx_buffer_ready_ind ()
{
  TRACE_FUNCTION ("sig_ftx_ptx_tx_buffer_ready_ind()");

  ppp_data->ptx.ftx_buffer_state = PTX_FTX_BUFFER_READY;

  switch( GET_STATE( PPP_SERVICE_PTX ) )
  {
    case PTX_READY:
      if(ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY)
      {
        sig_ptx_frx_start_flow_req();
      }
      #ifdef PTXS_DEBUG
      else
      {
        TRACE_EVENT_P2("WARNING(FTX_BUFFER_READY_IND): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__);
      }
      #endif /* PTXS_DEBUG */
      break;

    case PTX_BLOCKED:
        /*
         * Start data flow also if PTX buffer is full,
         * because the data will be redirected to ARB.
         */
        sig_ptx_frx_start_flow_req();
      break;

    case PTX_DEAD:
      /* wait for sig_arb_ptx_blocked/ready/transparent_mode_req */
      break;

    default:
      TRACE_ERROR( "DTI signal unexpected" );
      break;
  }


} /* sig_ftx_ptx_tx_buffer_ready_ind() */