view src/g23m-fad/ip/ip.h @ 375:e80e43185ca1

doc/Modem-configs update: we now have both Standard Modem and VPM functionality choices
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Jan 2018 07:22:16 +0000
parents 90eb61ecd093
children
line wrap: on
line source

/*
+----------------------------------------------------------------------------
|  Project :  GSM-WAP (8444)
|  Modul   :  IP
+----------------------------------------------------------------------------
|  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 :  Definitions for the Protocol Stack Entity
|             Internet Protocol
+----------------------------------------------------------------------------
*/

#ifndef IP_H
#define IP_H

/*-------------------------------------------------------------------------*/

#if defined WIN32 && ! defined _SIMULATION_
  #define _SIMULATION_
#endif

#ifdef _SIMULATION_
  #undef _TARGET_
#else
  #ifndef _TARGET_
    #define _TARGET_
  #endif
#endif

/* Information for DTI library */

#define IP_DTI_DEF_INSTANCE        0
#define IP_DTI_HL_INTERFACE        0
#define IP_DTI_LL_INTERFACE        1
#define IP_DTI_DEF_CHANNEL         0

#define IP_DTI_UPLINK_QUEUE_SIZE   0
#define IP_DTI_DOWNLINK_QUEUE_SIZE 0

/*==== Types =======================================================*/

/* Instance management */

#ifdef OPTION_MULTI_INSTANCE
  #define GET_INSTANCE(p) (ip_data_base + p->custom.route.inst_no)
  #define IP_INSTANCES MAX_INSTANCES
#else
  #define GET_INSTANCE(p) ip_data_base
  #define IP_INSTANCES 1
#endif

/*==== Constants ============================================================*/

#define MAX_LAYER 1 /* Connected to layers */

/* States for send and receive packets */

/* Constants for the IP packet */

#define MIN_HEADER_LEN    5 /* Min IP header length in 32 bit words */
#define MAX_PACKET_LEN 1500 /* Max packet len from higher layer */

/* Segmenting states and parameter */

#define NO_SEGMENTS          0 /* Normal packet */
#define SEND_SEGMENT         1 /* Sending segments */
#define READ_SEGMENT         2 /* Read segment */
#define GO_ON_SEGMENTING    10 /* Fragmenting ok - go on */
#define NO_SPACE_SEGMENTING 10 /* Not possible to sort cs. of less space */
#define MAX_SEGMENTS        50 /* Max received segments */
#define MAX_SEGM_SERVER      1 /* Max active server by rec. segments */

/* Errors */

#define NO_ERROR          0 /* No errors found */
#define ERR_PACKET_LEN    1 /* Packet length error */
#define CHANGE_PACKET_LEN 2 /* Length desc_list > total len indicated in header */

/* IP addresses */

#define MAX_ADDR_TYPES   15 /* Max field address-types */
#define MCAST_ADDR        0 /* Multicast address or class D address */
#define LINK_LAYER_BCAST  1 /* Link layer broadcast address */
#define LOOP_BACK_ADDR    2 /* Loopback address */
#define CLASS_E_ADDR      3 /* Class E address */
#define NO_DEST_ADDR      4 /* No destination address */
#define BCAST_ADDR_255    5 /* Broadcast address 255.255.255.255 */
#define NETW_ADDR         6 /* Network address */
#define CLASS_A_ADDR      7 /* Class A address */
#define CLASS_B_ADDR      8 /* Class B address */
#define CLASS_C_ADDR      9 /* Class C address */
#define DEFAULT_R_ADDR   10 /* Default route address */
#define BAD_UL_SRC_ADDR  11 /* Indicate bad uplink source address */
#define BAD_DL_SRC_ADDR  12 /* Indicate bad downlink source address */
#define BAD_UL_DEST_ADDR 13 /* Indicate bad uplink destination address */
#define BAD_DL_DEST_ADDR 14 /* Indicate bad uplink destination address */

/* Only for testing */

#define TEST_SRC_ADDR  0x0a0b0c0d /* Source test address */
#define TEST_DEST_ADDR 0x0a0b0c0e /* Destination test address */

/* Type of primitives */

#define P_DTI_READY       0
#define P_DTI_DATA_REQ    1
#define P_DTI_GETDATA_REQ 2
#define P_DTI_DATA_IND    3

/* Bit offset for encoding/decoding */

#define ENCODE_OFFSET 0

/* Timer */

#define TREASSEMBLY 0 /* Reassembly timer */

/* Timeout for reassembly segments */

#define TIME_REASSEMBLY 30000 /* 30 - 60 seconds is the correct value */

/* Dynamic configuration numbers */

#define RESET       0
#define FRAME_TRACE 6

/* State index for the entity process/services */

#define KER   ker.
#define HILA hila.
#define LOLA lola.

/* States of the entity process kernel */

#define DEACTIVATED 0
#define ACTIVE_NC   1 /* Not configured */
#define CONNECTED   2

/* States for send and receive packet services */

#define DOWN       0 /* State not active */
#define CONNECTING 1 /* State is connecting */
#define IDLE       2 /* State no incoming signals */
#define SEND       3 /* State sending packet */
#define WAIT       4 /* State waiting for packet */

/* For trace purposes */

#ifndef NTRACE
  #define SERVICE_NAME_KER   "KER"
  #define SERVICE_NAME_HILA "HILA"
  #define SERVICE_NAME_LOLA "LOLA"
#endif

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

/* Global variable-structure for uplink */

typedef struct
{
  UBYTE state; /* State uplink */
#ifndef NTRACE
  char * name;
  char * state_name;
#endif
  T_DTI2_DATA_REQ * dti_data_req; /* Data primitive uplink */
  BOOL drop_packet; /* TRUE: not sending packet to lower layer */
  UBYTE ttl; /* Time to live */
  USHORT segment_id; /* Number of the segment packet */
  USHORT header_len; /* Header length */
  UBYTE state_segment; /* State segmenting uplink */
  ULONG next_segment_desc; /* Pointer to next segment desc */
  USHORT last_segment_pos; /* Last position for copy in next_segment_desc */
  USHORT segment_offset; /* Offset for segmenting */
  USHORT sended_segment_len; /* Sended segment length include header */
  USHORT list_len_segment; /* Listlength of the income datagram */
  UBYTE segment_prot; /* Protokoll higher layer by fragmenting */
  T_desc2 * first_desc_segment; /* First desc for sending */
  USHORT identity; /* Sets the identity */
} T_HILA;

/* Global variable-structure for downlink */

typedef struct
{
  UBYTE state; /* State downlink */
#ifndef NTRACE
  char * name;
  char * state_name;
#endif
  T_DTI2_DATA_IND * dti_data_ind; /* Inputbuffer from higher layer */
  T_DTI2_DATA_IND * data_ind_reassembly [MAX_SEGM_SERVER]; /* For receiving segments */
  BOOL drop_packet; /* TRUE: not sending packet to lower layer */
  USHORT header_len; /* Header length */
  UBYTE state_reassembly [MAX_SEGM_SERVER]; /* State segmenting uplink */
  BOOL got_first_segment [MAX_SEGM_SERVER]; /* Got first segment by reassembling */
  BOOL got_last_segment [MAX_SEGM_SERVER]; /* Got last segment */
  ULONG ip_source_addr_segment [MAX_SEGM_SERVER]; /* IP source address for segment */
  USHORT pos_server; /* Position of fragmenting server */
  USHORT id_reassemble [MAX_SEGM_SERVER]; /* Identity of the reassemble fragments */
  UBYTE prot_reassemble [MAX_SEGM_SERVER]; /* Protocol reassembly */
  UBYTE timer_reass_running [MAX_SEGM_SERVER]; /* Timer is running */
  ULONG sort_reass_array [2] [MAX_SEGMENTS]; /* Used to sort the incoming fragments */
} T_LOLA;

/* Entity data for each IP instance */

typedef struct
{
  UBYTE state; /* State variables for each process */
#ifndef NTRACE
  char * name;
  char * state_name;
#endif
  ULONG source_addr;/* Source IP address */
  ULONG dst_addr; /* Destination address */
  ULONG peer_addr; /* Destination address for routing */
  ULONG netmask; /* Netmask for the routing table */
  char entity_name_hl [IPA_ENTITY_NAME_LEN]; /* Entity name higher layer */
  char entity_name_ll [IPA_ENTITY_NAME_LEN]; /* Entity name lower layer */
  ULONG link_id_hl;
  ULONG link_id_ll;
  USHORT mtu; /* Maximum transfer unit */
  BOOL send_icmp; /* ICMP message shall be sent */
  T_DTI2_DATA_REQ * icmp_dti_data_req; /* For sending ICMP message to uplink */
} T_KER;

typedef struct
{
  T_HILA hila; /* Data for each higher layer */
  T_LOLA lola; /* Data for each lower layer */
  T_KER ker;
} T_IP_DATA;

#ifdef GPRS
  typedef enum
  {
    UNIT_INVALID = -1,
    UNIT_SNDCP,
    UNIT_ACI,
    UNIT_UART,
    UNIT_PPPS,
    UNIT_PPPC,
    UNIT_L2R,
    UNIT_T30,
    UNIT_IP,
    UNIT_TRA,
    UNIT_UDP,
    UNIT_WAP,
    UNIT_MTST,
    UNIT_BLUETOOTH,
    UNIT_NULL,
    UNIT_MAX
  } IP_UNIT_ID;
#endif

/*==== EXPORT =====================================================*/

/* Data base */

extern DTI_HANDLE ip_hDTI;

/* Instance data base */

extern T_IP_DATA ip_data_base [], * ip_data;

/* DTI data base. The data base is allocated in function dti_init(). */

extern DTI_HANDLE udp_hDTI;

#define ENTITY_DATA ip_data

/* Prototypes timer */

#ifdef OPTION_MULTITHREAD
  #define tim_init_timer       _ENTITY_PREFIXED (tim_init_timer)
  #define tim_set_timeout_flag _ENTITY_PREFIXED (tim_set_timeout_flag)
  #define tim_handle_timeout   _ENTITY_PREFIXED (tim_handle_timeout)
  #define tim_flush_fifo       _ENTITY_PREFIXED (tim_flush_fifo)
  #define tim_reassembly       _ENTITY_PREFIXED (tim_reassembly)
#endif

BOOL tim_init_timer (void);

/* Timer specific timeout handling routines */

void tim_reassembly (/* USHORT layer, USHORT segm_server */);

/* Prototypes customer specific functions */

#ifdef OPTION_MULTITHREAD
  #define csf_init_timer  _ENTITY_PREFIXED (csf_init_timer)
  #define csf_close_timer _ENTITY_PREFIXED (csf_close_timer)
#endif

BOOL csf_init_timer (void);
void csf_close_timer (void);
void csf_stop_timer (USHORT index);
BOOL csf_timer_expired (
  USHORT index,
  USHORT * layer,
  USHORT * segm_server,
  USHORT * timer
);

/*==== Prototypes ==================================================*/

/* Prototypes
 *
 * IP KERNEL
 *
 * KERNEL primitive processing
 */

#ifdef OPTION_MULTITHREAD
  #define ker_ipa_activate_req   _ENTITY_PREFIXED (ker_ipa_activate_req)
  #define ker_ipa_deactivate_req _ENTITY_PREFIXED (ker_ipa_deactivate_req)
  #define ker_ipa_config_req     _ENTITY_PREFIXED (ker_ipa_config_req)
  #define ker_ip_addr_req        _ENTITY_PREFIXED (ker_ip_addr_req)

  #define sig_dti_ker_connection_opened_hl_ind \
    _ENTITY_PREFIXED (sig_dti_ker_connection_opened_hl_ind)
  #define sig_dti_ker_connection_opened_ll_ind \
    _ENTITY_PREFIXED (sig_dti_ker_connection_opened_ll_ind)
  #define sig_dti_ker_connection_closed_hl_ind \
    _ENTITY_PREFIXED (sig_dti_ker_connection_closed_hl_ind)
  #define sig_dti_ker_connection_closed_ll_ind \
    _ENTITY_PREFIXED (sig_dti_ker_connection_closed_ll_ind)
  #define sig_dti_ker_data_received_hl_ind \
    _ENTITY_PREFIXED (sig_dti_ker_data_received_hl_ind)
  #define sig_dti_ker_tx_buffer_ready_ll_ind \
    _ENTITY_PREFIXED (sig_dti_ker_tx_buffer_ready_ll_ind)
  #define sig_dti_ker_tx_buffer_full_hl_ind \
    _ENTITY_PREFIXED (sig_dti_ker_tx_buffer_full_hl_ind)
  #define sig_dti_ker_data_received_ll_ind \
    _ENTITY_PREFIXED (sig_dti_ker_data_received_ll_ind)
  #define sig_dti_ker_tx_buffer_ready_hl_ind \
    _ENTITY_PREFIXED (sig_dti_ker_tx_buffer_ready_hl_ind)
  #define sig_dti_ker_tx_buffer_full_ll_ind \
    _ENTITY_PREFIXED (sig_dti_ker_tx_buffer_full_ll_ind)

  #define pei_dti_dti_connect_req    _ENTITY_PREFIXED (pei_dti_dti_connect_req)
  #define pei_dti_dti_connect_cnf    _ENTITY_PREFIXED (pei_dti_dti_connect_cnf)
  #define pei_dti_dti_connect_ind    _ENTITY_PREFIXED (pei_dti_dti_connect_ind)
  #define pei_dti_dti_connect_res    _ENTITY_PREFIXED (pei_dti_dti_connect_res)
  #define pei_dti_dti_disconnect_req _ENTITY_PREFIXED (pei_dti_dti_disconnect_req)
  #define pei_dti_dti_disconnect_ind _ENTITY_PREFIXED (pei_dti_dti_disconnect_ind)
  #define pei_dti_dti_ready_ind      _ENTITY_PREFIXED (pei_dti_dti_ready_ind)
  #define pei_dti_dti_data_req       _ENTITY_PREFIXED (pei_dti_dti_data_req)
  #define pei_dti_dti_data_ind       _ENTITY_PREFIXED (pei_dti_dti_data_ind)
  #define pei_dti_dti_getdata_req    _ENTITY_PREFIXED (pei_dti_dti_getdata_req)

  #ifdef _SIMULATION_
    #define pei_dti_dti_data_test_req _ENTITY_PREFIXED (pei_dti_dti_data_test_req)
    #define pei_dti_dti_data_test_ind _ENTITY_PREFIXED (pei_dti_dti_data_test_ind)
  #endif

  #define pei_sig_callback _ENTITY_PREFIXED (pei_sig_callback)

  #define ip_packet_validator  _ENTITY_PREFIXED (ip_packet_validator)
  #define check_ip_address     _ENTITY_PREFIXED (check_ip_address)
  #define chk_packet_len       _ENTITY_PREFIXED (chk_packet_len)
  #define ip_addr_int_to_byte  _ENTITY_PREFIXED (ip_addr_int_to_byte)
  #define build_ip_packet      _ENTITY_PREFIXED (build_ip_packet)
  #define init_ip              _ENTITY_PREFIXED (init_ip)
  #define sort_descs_id_up     _ENTITY_PREFIXED (sort_descs_id_up)
  #define reassemble_fragments _ENTITY_PREFIXED (reassemble_fragments)
  #define config_down_ll       _ENTITY_PREFIXED (config_down_ll)
  #define terminate_ip         _ENTITY_PREFIXED (terminate_ip)
#endif

/* IPA SAP */

void ker_ipa_dti_req (T_IPA_DTI_REQ * ipa_dti_req);
void ker_ipa_config_req (T_IPA_CONFIG_REQ * ipa_config_req);

/* IP SAP */

void ker_ip_addr_req (T_IP_ADDR_REQ * ip_addr_req);

/* Wrapping functions for DTI library primitives */

void pei_dti_dti_connect_req (T_DTI2_CONNECT_REQ * dti_connect_req);
void pei_dti_dti_connect_cnf (T_DTI2_CONNECT_CNF * dti_connect_cnf);
void pei_dti_dti_connect_ind (T_DTI2_CONNECT_IND * dti_connect_ind);
void pei_dti_dti_connect_res (T_DTI2_CONNECT_RES * dti_connect_res);
void pei_dti_dti_disconnect_req (T_DTI2_DISCONNECT_REQ * dti_disconnect_req);
void pei_dti_dti_disconnect_ind (T_DTI2_DISCONNECT_IND * dti_disconnect_ind);
void pei_dti_dti_data_req (T_DTI2_DATA_REQ * dti_data_req);
void pei_dti_dti_getdata_req (T_DTI2_GETDATA_REQ * dti_getdata_req);
void pei_dti_dti_data_ind (T_DTI2_DATA_IND * dti_data_ind);
void pei_dti_dti_ready_ind (T_DTI2_READY_IND * dti_ready_ind);
#ifdef _SIMULATION_
  void pei_dti_dti_data_test_req (T_DTI2_DATA_TEST_REQ * dti_data_test_req);
  void pei_dti_dti_data_test_ind (T_DTI2_DATA_TEST_IND * dti_data_test_ind);
#endif

/* UP DTI */

void sig_dti_ker_data_received_hl_ind (T_DTI2_DATA_REQ * dti_data_req);
void sig_dti_ker_connection_opened_hl_ind ();
void sig_dti_ker_connection_closed_hl_ind ();
void sig_dti_ker_tx_buffer_ready_ll_ind ();
void sig_dti_ker_tx_buffer_full_hl_ind ();

/* DN DTI */

void sig_dti_ker_data_received_ll_ind (T_DTI2_DATA_IND * dti_data_ind);
void sig_dti_ker_connection_opened_ll_ind ();
void sig_dti_ker_connection_closed_ll_ind ();
void sig_dti_ker_tx_buffer_ready_hl_ind ();
void sig_dti_ker_tx_buffer_full_ll_ind ();

/* DTILIB callback function */

void pei_sig_callback (
  U8 instance,
  U8 interfac,
  U8 channel,
  U8 reason,
  T_DTI2_DATA_IND * dti_data_ind
);

/* Functions in ip_kerf.c */

BOOL ip_packet_validator (T_desc_list2 * desc_list);
void build_ip_packet (BOOL uplink, UBYTE select);
void init_ip (void);
void terminate_ip (void);
void config_down_ll (void);
void check_ip_address (
  BOOL * addr_type_dest,
  BOOL * addr_type_src,
  ULONG dest_addr,
  ULONG src_addr
);
void ip_addr_int_to_byte (UBYTE * b_values, ULONG ul_value);
UBYTE chk_packet_len (UBYTE * ip_header, T_desc_list2 * desc_list);
USHORT sort_descs_id_up (
  T_desc_list2 * desc_list,
  ULONG sort_array[2][MAX_SEGMENTS]
);
void reassemble_fragments (
  T_DTI2_DATA_IND ** dti_data_ind,
  T_LOLA * p_dl,
  UBYTE * ip_header,
  BOOL first_segment,
  /* BOOL middle_segment, */
  BOOL last_segment /*,*/
  /* USHORT fragm_offset */
);

/* Communication handles */

#ifdef OPTION_MULTITHREAD
  #define hCommMMI _ENTITY_PREFIXED (hCommMMI)
  #define hCommDL _ENTITY_PREFIXED (hCommDL)
  #define hCommIP _ENTITY_PREFIXED (hCommIP)
  #define hCommHL _ENTITY_PREFIXED (hCommHL)
#endif

extern T_HANDLE hCommMMI; /* ACI communication */
extern T_HANDLE hCommDL; /* HL communication */
extern T_HANDLE hCommIP; /* IP communication */
extern T_HANDLE hCommHL; /* HL communication */
extern T_HANDLE ip_handle;

/* Entity common buffer for the decoded air interface message */

#ifdef OPTION_MULTITHREAD
  #define _decodedMsg _ENTITY_PREFIXED (_decodedMsg)
#endif

extern UBYTE _decodedMsg [];

#ifndef NCONFIG
  #ifdef OPTION_MULTITHREAD
    #define partab _ENTITY_PREFIXED (partab)
  #endif
  extern KW_DATA partab [];
#endif

#ifdef _SIMULATION_
  #define Sprintf sprintf
#endif

/* Number of signals (maximal signalNum which occurs in pei_signal) */

#define MAX_SIGNALS 10

/*-------------------------------------------------------------------------*/

#endif /* IP_H */

/*-------------------------------------------------------------------------*/