diff src/g23m-fad/ppp/ppp_caps.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-fad/ppp/ppp_caps.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,347 @@
+/*
++-----------------------------------------------------------------------------
+|  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 (CHAP-statemachine)
++-----------------------------------------------------------------------------
+*/
+
+#ifndef PPP_CHAPS_C
+#define PPP_CHAPS_C
+#endif /* !PPP_CAPS_C */
+
+#define ENTITY_PPP
+
+/*==== 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 */
+#include "cnf_ppp.h"    /* to get cnf-definitions */
+#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_capf.h"   /* to get function interface from chap */
+#include "ppp_arbf.h"   /* to get function interface from arb */
+#include "ppp_ftxs.h"   /* to get signal interface from ftx */
+#include "ppp_arbs.h"   /* to get signal interface from arb */
+#include "ppp_rts.h"    /* to get the rt signal interface */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_arb_chap_packet_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_ARB_CHAP_PACKET_REQ
+|
+| Parameters  : packet - pointer to a generic data descriptor
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_arb_chap_packet_req (T_desc2* packet)
+{
+
+  T_desc2* temp_desc;
+  UBYTE   forward;
+
+  TRACE_ISIG( "sig_arb_chap_packet_req" );
+
+  /*
+   * depend on the code-field call appropriate function
+   */
+  switch(packet->buffer[0])
+  {
+    case CODE_CHALLENGE:
+      chap_rc(&packet, &forward);
+      break;
+    case CODE_RESPONSE:
+      chap_rr(&packet, &forward);
+      break;
+    case CODE_SUCCESS:
+      chap_rs(packet, &forward);
+      break;
+    case CODE_FAILURE:
+      chap_rf(packet, &forward);
+      break;
+    default:
+      forward = FORWARD_DISCARD;
+      break;
+  }
+  switch(forward)
+  {
+    case FORWARD_RC:  /* Received Challenge */
+      /*
+       * send Response packet and wait for an appropriate answer
+       */
+      SET_STATE( PPP_SERVICE_CHAP, CHAP_UP );
+      ppp_data->chap.counter = ppp_data->mc;
+      sig_any_ftx_packet_req(DTI_PID_CHAP, packet); /* Response */
+      if(ppp_data->chap.counter > 0)
+        ppp_data->chap.counter--;
+      sig_any_rt_rrt_req();
+      break;
+    case FORWARD_RRP:  /* Received Response Positive */
+      /*
+       * send Success packets until receive a stop signal from arb
+       * or the counter becomes zero
+       */
+      SET_STATE( PPP_SERVICE_CHAP, CHAP_UP );
+      ppp_data->chap.counter = ppp_data->mc;
+      sig_any_ftx_packet_req(DTI_PID_CHAP, packet); /* Success */
+      if(ppp_data->chap.counter > 0)
+        ppp_data->chap.counter--;
+      sig_any_rt_rrt_req();
+      sig_any_arb_tlu_ind();
+      break;
+    case FORWARD_RRN:  /* Received Response Negative  */
+      /*
+       * send Failure packet
+       */
+      sig_any_ftx_packet_req(DTI_PID_CHAP, packet); /* Failure */
+      if(ppp_data->chap.fails > 0)
+      {
+        /*
+         * if failure counter is not zero then create a new Challenge packet
+         */
+        ppp_data->chap.fails--;
+        ppp_data->chap.counter = ppp_data->mc;
+        chap_get_sc(&temp_desc);
+        sig_any_ftx_packet_req(DTI_PID_CHAP, temp_desc); /* Challenge */
+        if(ppp_data->chap.counter > 0)
+          ppp_data->chap.counter--;
+        sig_any_rt_rrt_req();
+      }
+      else
+      {
+        /*
+         * if failure counter expired then set error code
+         */
+        sig_any_rt_srt_req();
+        if(ppp_data->ppp_cause EQ 0)
+          ppp_data->ppp_cause = PPP_TERM_USE_AUTHED_FAILED;
+        sig_any_arb_tlf_ind();
+      }
+      break;
+    case FORWARD_RS:  /* Received Success */
+      sig_any_rt_srt_req();
+      sig_any_arb_tlu_ind();
+      break;
+    case FORWARD_RF:  /* Received Failure */
+      /*
+       * restart timer and wait for new challenge packet
+       */
+      SET_STATE( PPP_SERVICE_CHAP, CHAP_DOWN );
+      ppp_data->chap.counter = ppp_data->mc;
+      if(ppp_data->chap.counter > 0)
+        ppp_data->chap.counter--;
+      sig_any_rt_rrt_req();
+      break;
+    default:
+      arb_discard_packet(packet);
+      break;
+  }
+} /* sig_arb_chap_packet_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_arb_chap_open_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_ARB_CHAP_OPEN_REQ
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_arb_chap_open_req ()
+{
+  T_desc2* packet;
+
+  TRACE_ISIG( "sig_arb_chap_open_req" );
+
+  SET_STATE( PPP_SERVICE_CHAP, CHAP_DOWN );
+  ppp_data->chap.sc      = FALSE;
+  ppp_data->chap.counter = ppp_data->mc;
+  ppp_data->chap.fails   = ppp_data->mf;
+
+  if(ppp_data->mode EQ PPP_SERVER)
+  {
+    /*
+     * create and send challenge packet
+     */
+    chap_get_sc(&packet);
+    sig_any_ftx_packet_req(DTI_PID_CHAP, packet); /* Challenge */
+  }
+
+  /*
+   * start timer (client and server)
+   */
+  if(ppp_data->chap.counter > 0)
+    ppp_data->chap.counter--;
+  sig_any_rt_rrt_req();
+} /* sig_arb_chap_open_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_arb_chap_down_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_ARB_CHAP_DOWN_REQ
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_arb_chap_down_req ()
+{
+  TRACE_ISIG( "sig_arb_chap_down_req" );
+
+  sig_any_rt_srt_req();
+  arb_discard_packet(ppp_data->chap.c_packet);
+  ppp_data->chap.c_packet = NULL;
+  arb_discard_packet(ppp_data->chap.r_packet);
+  ppp_data->chap.r_packet = NULL;
+} /* sig_arb_chap_down_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_arb_chap_stop_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_ARB_CHAP_STOP_REQ
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_arb_chap_stop_req ()
+{
+  TRACE_ISIG( "sig_arb_chap_stop_req" );
+
+  sig_any_rt_srt_req();
+} /* sig_arb_chap_down_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_arb_chap_to_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_ARB_CHAP_TO_REQ
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_arb_chap_to_req ()
+{
+  T_desc2* packet = NULL;
+
+  TRACE_ISIG( "sig_arb_chap_to_req" );
+
+  if (ppp_data->chap.counter EQ 0)
+  {
+    /*
+     * authentication failed (client and server mode)
+     */
+    if((ppp_data->ppp_cause EQ 0) && (ppp_data->mode EQ PPP_CLIENT))
+      ppp_data->ppp_cause = PPP_TERM_NO_RESPONSE;
+    sig_any_arb_tlf_ind();
+  }
+  else
+  {
+    if(ppp_data->mode EQ PPP_SERVER)
+    {
+      switch( GET_STATE( PPP_SERVICE_CHAP ) )
+      {
+        case CHAP_UP:
+          /*
+           * create Success packet
+           */
+          chap_get_ss(&packet);
+          break;
+        case CHAP_DOWN:
+          /*
+           * create Challenge packet
+           */
+          chap_get_sc(&packet);
+          break;
+        default:
+          TRACE_EVENT("WARNING: unexpected chap time out request in server mode");
+          break;
+      }
+      /*
+       * send packet
+       */
+      sig_any_ftx_packet_req(DTI_PID_CHAP, packet);
+    }
+    else if(ppp_data->mode EQ PPP_CLIENT)
+    {
+      switch( GET_STATE( PPP_SERVICE_CHAP ) )
+      {
+        case CHAP_UP:
+          if(ppp_data->chap.sr)
+          {
+            /*
+             * Retransmit Response packet.
+             */
+            packet = ppp_data->chap.c_packet;
+            chap_get_sr(&packet);
+            /*
+             * Send Response packet.
+             */
+            sig_any_ftx_packet_req(DTI_PID_CHAP, packet);
+          } else {
+            TRACE_EVENT("WARNING: CHAP_UP state, but no Response transmitted");
+          }
+          break;
+        case CHAP_DOWN:
+          /*
+           * Wait for CHAP Challenge,
+           * GET_DATA_REQ will be sent after time out by FTX service.
+           */
+          break;
+        default:
+          TRACE_EVENT("WARNING: unexpected chap time out request in client mode");
+          break;
+      }
+    } else {
+      TRACE_EVENT_P1("ERROR: undefined PPP mode - chap_caps.c (%d)", __LINE__);
+    }
+    /*
+     * restart timer
+     */
+    ppp_data->chap.counter--;
+    sig_any_rt_rrt_req();
+  }
+} /* sig_arb_chap_to_req() */