diff src/g23m-fad/ppp/ppp_ftxf.c @ 174:90eb61ecd093

src/g23m-fad: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Oct 2016 05:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-fad/ppp/ppp_ftxf.c	Wed Oct 12 05:40:46 2016 +0000
@@ -0,0 +1,537 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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
+|             procedures and functions as described in the
+|             SDL-documentation (FTX-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#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 */
+/*lint -efile(766,gsm.h) */
+#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_arbf.h"   /* to get function interface from arb */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+#ifndef PPP_INT_RAM
+/*
++------------------------------------------------------------------------------
+| Function    : ftx_init
++------------------------------------------------------------------------------
+| Description : The function ftx_init() initializes Frame Transmit (FTX)
+|
+| Parameters  : no parameters
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void ftx_init ()
+{
+  USHORT i;
+
+  TRACE_FUNCTION( "ftx_init" );
+
+  ppp_data->ftx.acfc         = PPP_ACFC_DEFAULT;
+  ppp_data->ftx.pfc          = PPP_PFC_DEFAULT;
+
+  /*
+   * inititialise ACCMTAB
+   */
+  for(i=0;i<=255;i++)
+  {
+    if(i<0x20)
+    {
+      ppp_data->ftx.accmtab[i] = (PPP_ACCM_DEFAULT & (1UL << i)) ? 0xFF : 0x00;
+    }
+    else if((i EQ PPP_HDLC_FLAG) ||
+            (i EQ PPP_HDLC_ESCAPE) ||
+            (i EQ PPP_ASCII_DEL))
+    {
+      ppp_data->ftx.accmtab[i] = 0xFF;
+    }
+    else
+    {
+      ppp_data->ftx.accmtab[i] = 0x00;
+    }
+  }
+
+
+  INIT_STATE( PPP_SERVICE_FTX , FTX_DEAD );
+} /* ftx_init() */
+#endif  /* PPP_INT_RAM */
+
+
+
+#ifndef PPP_FLASH_ROM
+/*
++------------------------------------------------------------------------------
+| Function    : ftx_get_frame
++------------------------------------------------------------------------------
+| Description : The function ftx_get_frame() puts the given packet into a HDLC
+|               frame. A FCS is calculated and put at the the end of the
+|               packet. After that every byte is examined and preceeded with an
+|               escape character when certain condiitions are met.
+|
+|               This function has been optimized - FCS calculation and escaping
+|               are done in the same loop.
+|
+| Parameters  : ptype     - packet type
+|               packet    - pointer to a generic data descriptor
+|               ptr_frame - returns a list of generic data descriptors
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void ftx_get_frame (USHORT ptype, T_desc2* packet, T_desc_list2* ptr_frame)
+{
+  T_desc2 *temp_desc1, *temp_desc2;
+  USHORT  calc_fcs;
+  USHORT  i;
+  UBYTE   currentByte;
+  UBYTE   escape;
+
+  TRACE_FUNCTION( "ftx_get_frame" );
+
+  /*
+   * create a new descriptor for address, control and protocol field and put
+   * it in front of the linked descriptor list
+   */
+    /*
+     * 1 octet address field
+     * 1 octet control field
+     * 2 octets protocol field (uncompressed)
+     *----------
+     * 4 octets
+     */
+  MALLOC (temp_desc1, (USHORT)(sizeof(T_desc2) - 1 + 4));
+  temp_desc1->next = (ULONG)packet;
+  packet           = temp_desc1;
+  packet->len      = 0;
+    /*
+     * if no address and control field compression add both
+     * in LCP packets we need always address and control field
+     */
+  if((ppp_data->ftx.acfc EQ FALSE) ||
+     (ptype EQ DTI_PID_LCP))
+  {
+    packet->buffer[packet->len] = 0xff;
+    packet->len++;
+    packet->buffer[packet->len] = 0x03;
+    packet->len++;
+  }
+    /*
+     * if no protocol field compression add most significant octet
+     * of the protocol field
+     * in LCP packets we need always uncompressed protocol field
+     */
+  if((ppp_data->ftx.pfc EQ FALSE) ||
+     (ptype > 0x00ff) ||
+     (ptype EQ DTI_PID_LCP))
+  {
+    packet->buffer[packet->len] = (UBYTE)(ptype >> 8);
+    packet->len++;
+  }
+    /*
+     * add protocol field least significant octet
+     */
+  packet->buffer[packet->len] = (UBYTE)(ptype & 0xff);
+  packet->len++;
+
+
+  /*
+   * create complete frame
+   * use async-control-character-map and copy the packet into descriptor with
+   * a size of FTX_GET_DESC_SIZE
+   */
+  MALLOC (temp_desc1, (USHORT)(sizeof(T_desc2) - 1 + FTX_GET_DESC_SIZE));
+  temp_desc1->next = (ULONG)NULL;
+  ptr_frame->first = (ULONG)temp_desc1;
+
+
+  /*
+   * reset ptr_frame->list_len, it will be incremented by temp_desc1->len
+   * when the packet is completely processed, at the end it will contain
+   * the length of the whole frame in bytes
+   */
+  ptr_frame->list_len   = 0;
+
+
+  /*
+   * insert HDLC-Flag - to mark the start of the frame
+   */
+  temp_desc1->len       = 1;
+  temp_desc1->size      = 1;
+  temp_desc1->offset    = 1;
+  temp_desc1->buffer[0] = PPP_HDLC_FLAG;
+  escape=FALSE;
+
+
+  /*
+   * init FCS
+   */
+  calc_fcs   = PPP_INITFCS;
+
+
+  /*
+   * ATTENTION: the following two while loops contain equivalent
+   * code - if you edit the code make sure you edit BOTH loops
+   */
+  if(ptype EQ DTI_PID_LCP)
+  {
+    while(packet NEQ NULL)
+    {
+      i=0;
+      while(i < packet->len)
+      {
+        currentByte = packet->buffer[i];
+
+        if(escape EQ TRUE)
+        {
+          temp_desc1->buffer[temp_desc1->len] = currentByte ^ 0x20;
+
+          calc_fcs=(calc_fcs >> 8) ^
+            ppp_data->fcstab[(calc_fcs ^ currentByte) & 0xff];
+
+          escape=FALSE;
+          i++;
+        }
+
+        /*
+         * In LCP packets we escape ALL characters below 0x20.
+         * In addition to that PPP_HDLC_FLAG, PPP_HDLC_ESCAPE,
+         * PPP_ASCII_DEL are escaped too. These characters are marked in
+         * in the ACCM table
+         */
+        else if((currentByte < 0x20) || ppp_data->ftx.accmtab[currentByte])
+        {
+          temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_ESCAPE;
+          escape = TRUE;
+        }
+
+        else
+        {
+          temp_desc1->buffer[temp_desc1->len] = currentByte;
+
+          calc_fcs=(calc_fcs >> 8) ^
+            ppp_data->fcstab[(calc_fcs ^ currentByte) & 0xff];
+
+          i++;
+        }
+
+        temp_desc1->len++;
+
+        if(temp_desc1->len >= FTX_GET_DESC_SIZE)
+        {
+          ptr_frame->list_len +=temp_desc1->len;
+
+          temp_desc2=temp_desc1;
+          MALLOC (temp_desc1,
+            (USHORT)(sizeof(T_desc2) - 1 + FTX_GET_DESC_SIZE));
+
+          temp_desc1->len=0;
+          temp_desc1->next = (ULONG)NULL;
+
+          temp_desc2->next=(ULONG)temp_desc1;
+        }
+      }
+
+      temp_desc2=packet;
+      packet=(T_desc2*)packet->next;
+      MFREE(temp_desc2);
+    }
+    ptr_frame->list_len +=temp_desc1->len;
+  }
+  else
+  {
+    while(packet NEQ NULL)
+    {
+      i=0;
+      while(i < packet->len)
+      {
+        currentByte = packet->buffer[i];
+
+        if(escape EQ TRUE)
+        {
+          temp_desc1->buffer[temp_desc1->len] = currentByte ^ 0x20;
+
+          calc_fcs=(calc_fcs >> 8) ^
+            ppp_data->fcstab[(calc_fcs ^ currentByte) & 0xff];
+
+          escape=FALSE;
+          i++;
+        }
+
+        /*
+         * In packets other than LCP we escape only those characters
+         * below 0x20 that are marked in the ACCM table.
+         * In addition to that PPP_HDLC_FLAG, PPP_HDLC_ESCAPE,
+         * PPP_ASCII_DEL are escaped too. These characters are marked in
+         * in the same table.
+         */
+        else if(ppp_data->ftx.accmtab[currentByte])
+        {
+          temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_ESCAPE;
+          escape = TRUE;
+        }
+
+        else
+        {
+          temp_desc1->buffer[temp_desc1->len] = currentByte;
+
+          calc_fcs=(calc_fcs >> 8) ^
+            ppp_data->fcstab[(calc_fcs ^ currentByte) & 0xff];
+
+          i++;
+        }
+
+        temp_desc1->len++;
+
+        if(temp_desc1->len >= FTX_GET_DESC_SIZE)
+        {
+          ptr_frame->list_len +=temp_desc1->len;
+
+          temp_desc2=temp_desc1;
+          MALLOC (temp_desc1,
+            (USHORT)(sizeof(T_desc2) - 1 + FTX_GET_DESC_SIZE));
+          temp_desc1->len=0;
+          temp_desc1->next = (ULONG)NULL;
+
+          temp_desc2->next=(ULONG)temp_desc1;
+        }
+      }
+
+      temp_desc2=packet;
+      packet=(T_desc2*)packet->next;
+      MFREE(temp_desc2);
+    }
+    ptr_frame->list_len +=temp_desc1->len;
+  }
+
+  /*
+   * finish FCS calculation
+   */
+  calc_fcs ^= 0xffff;
+
+
+  /*
+   * create a new descriptor for FCS and HDLC-Flag
+   * put the descriptor at the end of the descriptor list
+   *
+   * FCS must be escaped too, allocate two bytes more - just in case
+   * 2 for FCS, 2 for PPP_HDLC_ESCAPE, 1 for PPP_HDLC_FLAG
+   *
+   */
+  if(temp_desc1->len + 5 >= FTX_GET_DESC_SIZE)
+  {
+    MALLOC (temp_desc2, (USHORT)(sizeof(T_desc2) - 1 + 5));
+    temp_desc2->len    = 0;
+    temp_desc2->size   = 0;
+    temp_desc2->offset = 0;
+    temp_desc2->next   = (ULONG)NULL;
+
+    temp_desc1->next = (ULONG)temp_desc2;
+    temp_desc1 = temp_desc2;
+  }
+
+  /*
+   * insert the FCS, escape when necessary
+   */
+#ifdef _SIMULATION_
+  temp_desc1->buffer[temp_desc1->len]=(UBYTE)(PPP_GOODFCS >> 8);
+  temp_desc1->buffer[temp_desc1->len+1]=(UBYTE)(PPP_GOODFCS & 0x00ff);
+  temp_desc1->len      += 2;
+  ptr_frame->list_len  += 2;
+#else /* _SIMULATION_ */
+  /*
+   * least significant octet first
+   */
+  if(ptype EQ DTI_PID_LCP)
+  {
+    currentByte = (UBYTE)(calc_fcs & 0x00ff);
+    if((currentByte < 0x20) || ppp_data->ftx.accmtab[currentByte])
+    {
+      temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_ESCAPE;
+      temp_desc1->buffer[temp_desc1->len+1] = currentByte ^ 0x20;
+      temp_desc1->len      += 2;
+      ptr_frame->list_len  += 2;
+    }
+    else
+    {
+      temp_desc1->buffer[temp_desc1->len] = currentByte;
+      temp_desc1->len++;
+      ptr_frame->list_len++;
+    }
+
+    currentByte = (UBYTE)(calc_fcs >> 8);
+    if((currentByte < 0x20) || ppp_data->ftx.accmtab[currentByte])
+    {
+      temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_ESCAPE;
+      temp_desc1->buffer[temp_desc1->len+1] = currentByte ^ 0x20;
+      temp_desc1->len      += 2;
+      ptr_frame->list_len  += 2;
+    }
+    else
+    {
+      temp_desc1->buffer[temp_desc1->len] = currentByte;
+      temp_desc1->len++;
+      ptr_frame->list_len++;
+    }
+  }
+  else
+  {
+    currentByte = (UBYTE)(calc_fcs & 0x00ff);
+    if(ppp_data->ftx.accmtab[currentByte])
+    {
+      temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_ESCAPE;
+      temp_desc1->buffer[temp_desc1->len+1] = currentByte ^ 0x20;
+      temp_desc1->len      += 2;
+      ptr_frame->list_len  += 2;
+    }
+    else
+    {
+      temp_desc1->buffer[temp_desc1->len] = currentByte;
+      temp_desc1->len++;
+      ptr_frame->list_len++;
+    }
+
+    currentByte = (UBYTE)(calc_fcs >> 8);
+    if(ppp_data->ftx.accmtab[currentByte])
+    {
+      temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_ESCAPE;
+      temp_desc1->buffer[temp_desc1->len+1] = currentByte ^ 0x20;
+      temp_desc1->len      += 2;
+      ptr_frame->list_len  += 2;
+    }
+    else
+    {
+      temp_desc1->buffer[temp_desc1->len] = currentByte;
+      temp_desc1->len++;
+      ptr_frame->list_len++;
+    }
+  }
+
+#endif /* _SIMULATION_ */
+
+  /*
+   * insert HDLC-Flag - to mark the start of the frame
+   */
+  temp_desc1->buffer[temp_desc1->len] = PPP_HDLC_FLAG;
+  temp_desc1->len++;
+  temp_desc1->size = temp_desc1->len;
+  ptr_frame->list_len++;
+
+
+} /* ftx_get_frame() */
+#endif  /* PPP_FLASH_ROM */
+
+
+
+#ifndef PPP_INT_RAM
+/*
++------------------------------------------------------------------------------
+| Function    : ftx_check_frame
++------------------------------------------------------------------------------
+| Description : The function ftx_check_frame() checks for flag at begin and end
+|               of the frame and calculates length of frame.
+|
+| Parameters  : ptr_frame - gives just a frame and returns a frame with length
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void ftx_check_frame (T_desc_list2* ptr_frame)
+{
+  T_desc2* frame;
+  T_desc2* temp_desc;
+  UBYTE    last_byte;
+
+  TRACE_FUNCTION( "ftx_check_frame" );
+
+  frame = (T_desc2*)ptr_frame->first;
+
+  while((frame) && (frame->len EQ 0))
+    frame = (T_desc2*)frame->next;
+
+  if(frame)
+  {
+    /*
+     * if the first character isnt the HDLC flag then
+     * create a new first data descriptor containing just the HDLC flag
+     */
+    if(frame->buffer[0] NEQ PPP_HDLC_FLAG)
+    {
+      MALLOC (frame, (USHORT)(sizeof(T_desc2) - 1 + 1));
+      frame->next      = ptr_frame->first;
+      frame->len       = 1;
+      frame->buffer[0] = PPP_HDLC_FLAG;
+      ptr_frame->first = (ULONG)frame;
+    }
+    /*
+     * search for the last character and if it isnt the HDLC flag then
+     * create a new last data descriptor containing just the HDLC flag.
+     * calculate length of whole data.
+     */
+    ptr_frame->list_len = 0;
+    for(frame = (T_desc2*)ptr_frame->first;
+        frame;
+        frame = (T_desc2*)frame->next)
+    {
+      if(frame->len)
+      {
+        ptr_frame->list_len+= frame->len;
+        last_byte           = frame->buffer[frame->len - 1];
+      }
+      temp_desc = frame;
+    }
+    if(last_byte NEQ PPP_HDLC_FLAG) /*lint !e644 last_byte may not have been initialized */
+    {
+      MALLOC (frame, (USHORT)(sizeof(T_desc2) - 1 + 1));
+      frame->next      = (ULONG)NULL;
+      frame->len       = 1;
+      frame->buffer[0] = PPP_HDLC_FLAG;
+      temp_desc->next  = (ULONG)frame; /*lint !e771 temp_desc conceivably not initialized */
+    }
+  }
+  else
+  {
+    /*
+     * free the empty frame
+     */
+    arb_discard_packet((T_desc2*)ptr_frame->first);
+    ptr_frame->first    = (ULONG)NULL;
+    ptr_frame->list_len = 0;
+  }
+} /* ftx_check_frame() */
+#endif  /* PPP_INT_RAM */