FreeCalypso > hg > fc-tourmaline
view src/g23m-fad/ip/ip_udp.h @ 303:f76436d19a7a default tip
!GPRS config: fix long-standing AT+COPS chance hanging bug
There has been a long-standing bug in FreeCalypso going back years:
sometimes in the AT command bring-up sequence of an ACI-only MS,
the AT+COPS command would produce only a power scan followed by
cessation of protocol stack activity (only L1 ADC traces), instead
of the expected network search sequence. This behaviour was seen
in different FC firmware versions going back to Citrine, and seemed
to follow some law of chance, not reliably repeatable.
This bug has been tracked down and found to be specific to !GPRS
configuration, stemming from our TCS2/TCS3 hybrid and reconstruction
of !GPRS support that was bitrotten in TCS3.2/LoCosto version.
ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3
version and had to be pulled from TCS2 - but as it turns out,
there is a new field in the MMR_REG_REQ primitive that needs to be
set correctly, and that psa_mms.c module is the place where this
initialization needed to be added.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 08 Jun 2023 08:23:37 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +---------------------------------------------------------------------------- | Project: GSM-WAP (8444) | Modul: UDP +---------------------------------------------------------------------------- | 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_UDP_H #define IP_UDP_H /*-------------------------------------------------------------------------*/ #include "typedefs.h" /*---- Macros for the IP header -------------------------------------------*/ #define SET_IP_VERSION(ip_header,value) (\ ((UBYTE*)(ip_header))[0] = (UBYTE) \ ((value)<<4 & 0xF0 | ((UBYTE*)(ip_header))[0] & 0x0F) \ ) #define SET_IP_HEADER_LEN(ip_header,value) (\ ((UBYTE*)(ip_header))[0] = (UBYTE) \ (((UBYTE*)(ip_header))[0] & 0xF0 | (value) & 0x0F) \ ) #define SET_IP_TYPE_OF_SERVICE(ip_header,value) (\ ((UBYTE*)(ip_header))[1] = (UBYTE) (value) \ ) #define SET_IP_TOTAL_LEN(ip_header,value) (\ ((UBYTE*)(ip_header))[2] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[3] = (UBYTE) (value) \ ) #define SET_IP_IDENT(ip_header,value) (\ ((UBYTE*)(ip_header))[4] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[5] = (UBYTE) (value) \ ) #define SET_IP_OFF_FLAG(ip_header,value) (\ ((UBYTE*)(ip_header))[6] = (UBYTE) \ (((UBYTE*)(ip_header))[6] & 0x7F | (value)<<7 & 0x80) \ ) #define SET_IP_DF_FLAG(ip_header,value) (\ ((UBYTE*)(ip_header))[6] = (UBYTE) \ (((UBYTE*)(ip_header))[6] & 0xBF | (value)<<6 & 0x40) \ ) #define SET_IP_MF_FLAG(ip_header,value) (\ ((UBYTE*)(ip_header))[6] = (UBYTE) \ (((UBYTE*)(ip_header))[6] & 0xDF | (value)<<5 & 0x20) \ ) #define SET_IP_FRAG_OFFSET(ip_header,value) (\ ((UBYTE*)(ip_header))[6] = (UBYTE) \ (((UBYTE*)(ip_header))[6] & 0xE0 | (value)>>8 & 0x1F), \ ((UBYTE*)(ip_header))[7] = (UBYTE) (value) \ ) #define SET_IP_TTL(ip_header,value) (\ ((UBYTE*)(ip_header))[8] = (UBYTE) (value) \ ) #define SET_IP_PROT(ip_header,value) (\ ((UBYTE*)(ip_header))[9] = (UBYTE) (value) \ ) #define SET_IP_CHECKSUM(ip_header,value) (\ ((UBYTE*)(ip_header))[10] = (UBYTE) (value), \ ((UBYTE*)(ip_header))[11] = (UBYTE) ((value)>>8) \ ) /* please take note of the reversed byte order */ #define RESET_IP_CHECKSUM(ip_header) (\ ((UBYTE*)(ip_header))[10] = 0, \ ((UBYTE*)(ip_header))[11] = 0 \ ) #define SET_IP_SOURCE_ADDR(ip_header,value) (\ ((UBYTE*)(ip_header))[12] = (UBYTE) ((value)>>24), \ ((UBYTE*)(ip_header))[13] = (UBYTE) ((value)>>16), \ ((UBYTE*)(ip_header))[14] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[15] = (UBYTE) (value) \ ) #define SET_IP_DEST_ADDR(ip_header,value) (\ ((UBYTE*)(ip_header))[16] = (UBYTE) ((value)>>24), \ ((UBYTE*)(ip_header))[17] = (UBYTE) ((value)>>16), \ ((UBYTE*)(ip_header))[18] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[19] = (UBYTE) (value) \ ) #define GET_IP_VERSION(ip_header) (\ ((UBYTE*)(ip_header))[0]>>4 \ ) #define GET_IP_HEADER_LEN(ip_header) (\ ((UBYTE*)(ip_header))[0] & 0xF \ ) #define GET_IP_HEADER_LEN_B(ip_header) (\ GET_IP_HEADER_LEN (ip_header) << 2 \ ) #define GET_IP_TYPE_OF_SERVICE(ip_header) (\ ((UBYTE*)(ip_header))[1] \ ) #define GET_IP_TOTAL_LEN(ip_header) (\ ((UBYTE*)(ip_header))[2]<<8 | ((UBYTE*)(ip_header))[3] \ ) #define GET_IP_IDENT(ip_header) (\ ((UBYTE*)(ip_header))[4]<<8 | ((UBYTE*)(ip_header))[5] \ ) #define GET_IP_OFF_FLAG(ip_header) (\ ((UBYTE*)(ip_header))[6]>>7 & 0x1 \ ) #define GET_IP_DF_FLAG(ip_header) (\ ((UBYTE*)(ip_header))[6]>>6 & 0x1 \ ) #define GET_IP_MF_FLAG(ip_header) (\ ((UBYTE*)(ip_header))[6]>>5 & 0x1 \ ) #define GET_IP_FRAG_OFFSET(ip_header) (\ (((UBYTE*)(ip_header))[6] & 0x1F) << 8 | ((UBYTE*)(ip_header))[7] \ ) #define GET_IP_FRAG_OFFSET_B(ip_header) (\ GET_IP_FRAG_OFFSET (ip_header) << 3 \ ) #define GET_IP_TTL(ip_header) (\ ((UBYTE*)(ip_header))[8] \ ) #define GET_IP_PROT(ip_header) (\ ((UBYTE*)(ip_header))[9] \ ) #define GET_IP_CHECKSUM(ip_header) (\ ((UBYTE*)(ip_header))[10] | ((UBYTE*)(ip_header))[11]<<8 \ ) /* please take note of the reversed byte order */ #define GET_IP_SOURCE_ADDR(ip_header) (\ ((UBYTE*)(ip_header))[12]<<24 | \ ((UBYTE*)(ip_header))[13]<<16 | \ ((UBYTE*)(ip_header))[14]<<8 | \ ((UBYTE*)(ip_header))[15] \ ) #define GET_IP_DEST_ADDR(ip_header) (\ ((UBYTE*)(ip_header))[16]<<24 | \ ((UBYTE*)(ip_header))[17]<<16 | \ ((UBYTE*)(ip_header))[18]<<8 | \ ((UBYTE*)(ip_header))[19] \ ) /*---- Macros for the UDP header ------------------------------------------*/ #define SET_UDP_SRC_PORT(ip_header,value) (\ ((UBYTE*)(ip_header))[20] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[21] = (UBYTE) (value) \ ) #define SET_UDP_DST_PORT(ip_header,value) (\ ((UBYTE*)(ip_header))[22] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[23] = (UBYTE) (value) \ ) #define SET_UDP_LEN(ip_header,value) (\ ((UBYTE*)(ip_header))[24] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[25] = (UBYTE) (value) \ ) #define SET_UDP_CHKSUM(ip_header,offset,value) (\ ((UBYTE*)(ip_header))[(offset)+6] = (UBYTE) (value), \ ((UBYTE*)(ip_header))[(offset)+7] = (UBYTE) ((value)>>8) \ ) /* please take note of the reversed byte order */ #define RESET_UDP_CHKSUM(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+6] = 0, \ ((UBYTE*)(ip_header))[(offset)+7] = 0 \ ) #define GET_UDP_SRC_PORT(ip_header,offset) (\ ((UBYTE*)(ip_header))[offset]<<8 | ((UBYTE*)(ip_header))[(offset)+1] \ ) #define GET_UDP_DST_PORT(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+2]<<8 | ((UBYTE*)(ip_header))[(offset)+3] \ ) #define GET_UDP_LEN(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+4]<<8 | ((UBYTE*)(ip_header))[(offset)+5] \ ) #define GET_UDP_CHK_SUM(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+6] | ((UBYTE*)(ip_header))[(offset)+7]<<8 \ ) /* please take note of the reversed byte order */ /*---- Macros for the UDP pseudo header -----------------------------------*/ #define SET_UDP_PSEUDO_H_SRC_ADDR(ip_header,value) (\ ((UBYTE*)(ip_header))[0] = (UBYTE) ((value)>>24), \ ((UBYTE*)(ip_header))[1] = (UBYTE) ((value)>>16), \ ((UBYTE*)(ip_header))[2] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[3] = (UBYTE) (value) \ ) #define SET_UDP_PSEUDO_H_DEST_ADDR(ip_header,value) (\ ((UBYTE*)(ip_header))[4] = (UBYTE) ((value)>>24), \ ((UBYTE*)(ip_header))[5] = (UBYTE) ((value)>>16), \ ((UBYTE*)(ip_header))[6] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[7] = (UBYTE) (value) \ ) #define SET_UDP_PSEUDO_H_ZERO(ip_header,value) (\ ((UBYTE*)(ip_header))[8] = (UBYTE) (value) \ ) #define SET_UDP_PSEUDO_H_PROT(ip_header,value) (\ ((UBYTE*)(ip_header))[9] = (UBYTE) (value) \ ) #define SET_UDP_PSEUDO_H_LEN(ip_header,value) (\ ((UBYTE*)(ip_header))[10] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[11] = (UBYTE) (value) \ ) /*---- Macros for the ICMP header -----------------------------------------*/ #define SET_ICMP_TYPE(ip_header,value,offset) (\ ((UBYTE*)(ip_header))[offset] = (UBYTE) (value) \ ) #define SET_ICMP_CODE(ip_header,value,offset) (\ ((UBYTE*)(ip_header))[(offset)+1] = (UBYTE) (value) \ ) #define SET_ICMP_CHK_SUM(ip_header,value,offset) (\ ((UBYTE*)(ip_header))[(offset)+2] = (UBYTE) (value), \ ((UBYTE*)(ip_header))[(offset)+3] = (UBYTE) ((value)>>8) \ ) /* please take note of the reversed byte order */ #define RESET_ICMP_CHK_SUM(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+2] = 0, \ ((UBYTE*)(ip_header))[(offset)+3] = 0 \ ) #define SET_ICMP_IDENT(ip_header,value,offset) (\ ((UBYTE*)(ip_header))[(offset)+4] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[(offset)+5] = (UBYTE) (value) \ ) #define SET_ICMP_SEQ_NR(ip_header,value,offset) (\ ((UBYTE*)(ip_header))[(offset)+6] = (UBYTE) ((value)>>8), \ ((UBYTE*)(ip_header))[(offset)+7] = (UBYTE) (value) \ ) #define GET_ICMP_TYPE(ip_header,offset) (\ ((UBYTE*)(ip_header))[offset] \ ) #define GET_ICMP_CODE(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+1] \ ) #define GET_ICMP_CHK_SUM(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+2] | ((UBYTE*)(ip_header))[(offset)+3]<<8 \ ) /* please take note of the reversed byte order */ #define GET_ICMP_IDENT(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+4]<<8 | ((UBYTE*)(ip_header))[(offset)+5] \ ) #define GET_ICMP_SEQ_NR(ip_header,offset) (\ ((UBYTE*)(ip_header))[(offset)+6]<<8 | ((UBYTE*)(ip_header))[(offset)+7] \ ) /*---- Constants ----------------------------------------------------------*/ /* Types of primitives */ #define P_DTI_READY_IND 0 #define P_DTI_DATA_REQ 1 #define P_DTI_GETDATA_REQ 2 #define P_DTI_DATA_IND 3 #define P_IP_ADDR_CNF 4 #define P_UDP_ERROR_RES 5 #define P_UDP_GETDATA_REQ 6 #define P_UDP_BIND_REQ 7 #define P_UDP_CONFIG_REQ 8 #define P_UDPA_CONFIG_REQ 9 #define P_DTI_DATA_TEST_IND 10 #define P_DTI_DATA_TEST_REQ 11 #define P_UDP_CLOSEPORT_REQ 12 #define P_TIMER_REASSEMBLY 13 #define P_UDPA_ACTIVATE_REQ 14 /* For building packets */ #define B_NORMAL_PACKET 1 /* Build normal packet */ #define B_SEGMENT 2 /* Build segment packet */ #define B_ICMP_ECHO 3 /* Build ICMP echo packet */ #define B_ICMP_ECHO_REPLY 4 /* Build ICMP echo reply packet */ #define B_ICMP_TTL_0 5 /* Build TTL packet */ #define B_ICMP_NO_FORWARD 6 /* Build ICMP when no forward */ #define B_IP_FORWARD 7 /* Build packet forward */ #define B_ICMP_TIME_EX 8 /* Time exceeded by segmenting */ #define B_ICMP_PACKET 9 /* ICMP packet */ #define B_NO_DEST_PORT 10 /* No destination port */ #define B_ICMP_REASSEMBLE_TIMEOUT 11 /* Build ICMP when timeout reassembly */ #define BUILD_NO_PACKET 0 /* No packet shall be built */ /* For IP packet header */ #define IP_VERSION 4 /* IP version number */ #define ICMP_PROT 1 /* ICMP protocol */ #define UDP_PROT 17 /* UDP protocol */ #define DL_SEGMENT 1 /* DL segment */ #define NORMAL_SERVICE 0 /* No services */ #define NO_SEGMENT_ID 0 /* No segment ID */ #define START_SEGMENT_ID 0 /* Offset for identity segmenting */ #define IDENTITY_0 0 /* Identity set to zero */ #define FLAG_NOT_SET 0 /* Flag zero */ #define FLAG_SET 1 /* Flag one */ #define NO_OFFSET_FRAG 0 /* No offset for fragmenting */ #define STANDARD_TTL 64 /* Standard TTL by initialisation */ #define LEN_IP_HEADER_B 20 /* Minimum length of IP header in bytes */ /* ICMP messages */ #define ICMP_ECHO_REPLY 0 /* ICMP ping reply */ #define LEN_ICMP_ECHO_REPLY 64 /* Datagram ICMP echo reply in bytes */ #define LEN_ICMP_TIMEOUT 128 /* Datagram ICMP timeout in bytes */ #define ICMP_CODE_ECHO_REPLY 0 /* ICMP ping reply */ #define ICMP_CODE_NO_HOST 1 /* No destination host*/ #define ICMP_CODE_NO_FORWARD 0 /* No forward route */ #define ICMP_CODE_NO_PORT 3 /* No destination port */ #define ICMP_CODE_FRAGM_TIME_EXC 1 /* Reassembly time exceeded */ #define ICMP_TYP_DEST_URECHBL 3 /* Cannot reach the destination */ #define ICMP_TYP_ECHO_REPLY 0 /* Ping request type */ #define ICMP_TYP_ECHO 8 /* Ping */ #define ICMP_TYP_TIME_EXCEDED 11 /* Timeout or TTL is 0 */ /* For UDP packet header */ #define LEN_UDP_HEADER_B 8 /* Length of UDP header in bytes */ /* For init */ #define NO_TUI 0 #define NO_CH_ID 0 #define NO_ADDR 0 #define NO_PORT 0 #define NO_PROT_ID 0 #define NO_MTU 0 #define INIT_NETMASK 0 #define NO_ID_REASSBL 0 #define NO_PROT_REASSBL 0 #define NO_TIMER 0 /*---- Prototypes ---------------------------------------------------------*/ void table_state_tui ( void * primitive, UBYTE typ, UBYTE * akt_layer ); void free_dti_data_req (T_DTI2_DATA_REQ ** dti_data_req); void free_dti_data_ind (T_DTI2_DATA_IND ** dti_data_ind); /* The following functions are actually defined in the UDP module. * Due to unfortunate decisions in the past they must still be * declared here redundantly, but should really be declared in a * common include file. No time to fix this now, though. * [ni 2002-06-18] */ /** Computes the internet checksum [RFC 1071] over a data block. * * @param block pointer to data block * @param len length of the block in octets * @return the checksum */ USHORT inet_checksum (UBYTE * block, USHORT len); /** Computes the internet checksum over a DTI descriptor list. There * may be a value from a previous partial calculation that is added to * the sum as a start value. The function relies on the data length * being at least start_offset. * * @param dlist descriptor list containing the data * @param start_offset beginning position of interesting data * @param start_value value from previous partial checksum calculation * @return the checksum value */ USHORT desc_checksum ( T_desc_list2 * dlist, USHORT start_offset, ULONG start_value ); void del_rest_descs (T_desc_list2 * desc_list, T_desc2 * desc); void put_desc_last_pos (T_desc_list2 * desc_list, T_desc2 * desc); void put_desc_first_pos (T_desc_list2 * desc_list, T_desc2 * desc_new); void build_icmp_with_payload ( T_DTI2_DATA_REQ * data_req, USHORT identity, UBYTE ttl, ULONG src_addr, UBYTE icmp_type, UBYTE icmp_code ); void set_desc_len ( T_desc_list2 * desc_list, T_desc2 * desc, USHORT len_desc ); void copy_from_descs_to_desc ( T_desc2 ** desc, T_desc2 * desc_new, USHORT copy_len, USHORT offset_desc, USHORT offset_desc_new, USHORT * pos_copy, USHORT * total_len_copy ); void del_descs (T_desc2 * p_desc); void build_icmp_packet ( USHORT header_len_b, UBYTE typ, UBYTE code, UBYTE ttl, UBYTE * ip_header, USHORT identity, ULONG dest_addr, ULONG src_addr, T_desc_list2 * desc_list ); void build_ip_header ( UBYTE * ip_header_new, USHORT identity, UBYTE header_len, UBYTE type_of_service, UBYTE ttl, ULONG src_addr, ULONG dest_addr, USHORT total_len, USHORT fragm_offset, UBYTE df_flag, UBYTE mf_flag, UBYTE prot ); void truncate_descs (T_desc_list2 * p_desc_list, USHORT new_length); void free_primitive_data_ind (T_DTI2_DATA_IND ** dti_data_ind); void free_primitive_data_req (T_DTI2_DATA_REQ ** dti_data_req); ULONG partial_checksum (UBYTE * block, USHORT len); /*-------------------------------------------------------------------------*/ #endif /* IP_UDP_H */ /*-------------------------------------------------------------------------*/