mirror of
https://github.com/dimoniche/changer.git
synced 2026-01-30 09:13:31 +03:00
730 lines
38 KiB
C
730 lines
38 KiB
C
/*
|
||
*********************************************************************************************************
|
||
* uC/TCP-IP
|
||
* The Embedded TCP/IP Suite
|
||
*
|
||
* (c) Copyright 2003-2007; Micrium, Inc.; Weston, FL
|
||
*
|
||
* All rights reserved. Protected by international copyright laws.
|
||
*
|
||
* uC/TCP-IP is provided in source form for FREE evaluation, for educational
|
||
* use or peaceful research. If you plan on using uC/TCP-IP in a commercial
|
||
* product you need to contact Micrium to properly license its use in your
|
||
* product. We provide ALL the source code for your convenience and to help
|
||
* you experience uC/TCP-IP. The fact that the source code is provided does
|
||
* NOT mean that you can use it without paying a licensing fee.
|
||
*
|
||
* Knowledge of the source code may NOT be used to develop a similar product.
|
||
*
|
||
* Please help us continue to provide the Embedded community with the finest
|
||
* software available. Your honesty is greatly appreciated.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
*
|
||
* NETWORK ICMP LAYER
|
||
* (INTERNET CONTROL MESSAGE PROTOCOL)
|
||
*
|
||
* Filename : net_icmp.h
|
||
* Version : V1.89
|
||
* Programmer(s) : ITJ
|
||
*********************************************************************************************************
|
||
* Note(s) : (1) Supports Internet Control Message Protocol as described in RFC #792 with the following
|
||
* restrictions/constraints :
|
||
*
|
||
* (a) Does NOT support IP forwarding/routing RFC #1122, Section 3.3.1
|
||
*
|
||
* (b) Does NOT support IP multicasting RFC #1122, Section 3.3.7
|
||
*
|
||
* (c) Does NOT support ICMP Address Mask Agent/Server RFC #1122, Section 3.2.2.9
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* EXTERNS
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#ifdef NET_ICMP_MODULE
|
||
#define NET_ICMP_EXT
|
||
#else
|
||
#define NET_ICMP_EXT extern
|
||
#endif
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* DEFINES
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP TRANSMIT SOURCE QUENCH DEFINES
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#define NET_ICMP_TX_SRC_QUENCH_TH_MIN 1
|
||
#define NET_ICMP_TX_SRC_QUENCH_TH_MAX 100
|
||
#define NET_ICMP_TX_SRC_QUENCH_TH_DFLT 5
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP FLAG DEFINES
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ------------------ NET ICMP FLAGS ------------------ */
|
||
#define NET_ICMP_FLAG_NONE DEF_BIT_NONE
|
||
#define NET_ICMP_FLAG_USED DEF_BIT_00 /* ICMP entry cur used; i.e. NOT in free pool. */
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP TYPE DEFINES
|
||
*
|
||
* Note(s) : (1) NET_ICMP_TYPE_??? #define values specifically chosen as ASCII representations of the ICMP
|
||
* types. Memory displays of ICMP types will display the ICMP TYPE with the chosen ASCII name.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ------------------ NET ICMP TYPES ------------------ */
|
||
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
|
||
#define NET_ICMP_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
|
||
#define NET_ICMP_TYPE_TX_SRC_QUENCH 0x54585351 /* "TXSQ" in ASCII. */
|
||
|
||
#else
|
||
|
||
#if (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32)
|
||
#define NET_ICMP_TYPE_NONE 0x454E4F4E /* "NONE" in ASCII. */
|
||
#define NET_ICMP_TYPE_TX_SRC_QUENCH 0x51535854 /* "TXSQ" in ASCII. */
|
||
|
||
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16)
|
||
#define NET_ICMP_TYPE_NONE 0x4F4E454E /* "NONE" in ASCII. */
|
||
#define NET_ICMP_TYPE_TX_SRC_QUENCH 0x58545153 /* "TXSQ" in ASCII. */
|
||
|
||
#else /* Dflt CPU_WORD_SIZE_08. */
|
||
#define NET_ICMP_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
|
||
#define NET_ICMP_TYPE_TX_SRC_QUENCH 0x54585351 /* "TXSQ" in ASCII. */
|
||
|
||
#endif
|
||
#endif
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP MESSAGE TYPES & CODES
|
||
*
|
||
* Note(s) : (1) 'DEST_UNREACH' abbreviated to 'DEST' for ICMP 'Destination Unreachable' message
|
||
* error codes to enforce ANSI-compliance of 31-character symbol length uniqueness.
|
||
*
|
||
* (2) ICMP 'Redirect' & 'Router' messages are NOT supported (see 'net_icmp.h Note #1').
|
||
*
|
||
* (3) ICMP 'Address Mask Request' messages received by this host are NOT supported (see
|
||
* 'net_icmp.h Note #3').
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ------------------ ICMP MSG TYPES ------------------ */
|
||
#define NET_ICMP_MSG_TYPE_NONE DEF_INT_08U_MAX_VAL
|
||
|
||
#define NET_ICMP_MSG_TYPE_ECHO_REPLY 0
|
||
#define NET_ICMP_MSG_TYPE_DEST_UNREACH 3
|
||
#define NET_ICMP_MSG_TYPE_SRC_QUENCH 4
|
||
#define NET_ICMP_MSG_TYPE_REDIRECT 5 /* See Note #2. */
|
||
#define NET_ICMP_MSG_TYPE_ECHO_REQ 8
|
||
#define NET_ICMP_MSG_TYPE_ROUTE_AD 9 /* See Note #2. */
|
||
#define NET_ICMP_MSG_TYPE_ROUTE_REQ 10 /* See Note #2. */
|
||
#define NET_ICMP_MSG_TYPE_TIME_EXCEED 11
|
||
#define NET_ICMP_MSG_TYPE_PARAM_PROB 12
|
||
#define NET_ICMP_MSG_TYPE_TS_REQ 13
|
||
#define NET_ICMP_MSG_TYPE_TS_REPLY 14
|
||
#define NET_ICMP_MSG_TYPE_ADDR_MASK_REQ 17
|
||
#define NET_ICMP_MSG_TYPE_ADDR_MASK_REPLY 18
|
||
|
||
|
||
/* ------------------ ICMP MSG CODES ------------------ */
|
||
#define NET_ICMP_MSG_CODE_NONE DEF_INT_08U_MAX_VAL
|
||
|
||
#define NET_ICMP_MSG_CODE_ECHO 0
|
||
#define NET_ICMP_MSG_CODE_ECHO_REQ 0
|
||
#define NET_ICMP_MSG_CODE_ECHO_REPLY 0
|
||
|
||
#define NET_ICMP_MSG_CODE_DEST_NET 0 /* See Note #1. */
|
||
#define NET_ICMP_MSG_CODE_DEST_HOST 1
|
||
#define NET_ICMP_MSG_CODE_DEST_PROTOCOL 2
|
||
#define NET_ICMP_MSG_CODE_DEST_PORT 3
|
||
#define NET_ICMP_MSG_CODE_DEST_FRAG_NEEDED 4
|
||
#define NET_ICMP_MSG_CODE_DEST_ROUTE_FAIL 5
|
||
#define NET_ICMP_MSG_CODE_DEST_NET_UNKNOWN 6
|
||
#define NET_ICMP_MSG_CODE_DEST_HOST_UNKNOWN 7
|
||
#define NET_ICMP_MSG_CODE_DEST_HOST_ISOLATED 8
|
||
#define NET_ICMP_MSG_CODE_DEST_NET_TOS 11
|
||
#define NET_ICMP_MSG_CODE_DEST_HOST_TOS 12
|
||
|
||
#define NET_ICMP_MSG_CODE_SRC_QUENCH 0
|
||
|
||
#define NET_ICMP_MSG_CODE_TIME_EXCEED_TTL 0
|
||
#define NET_ICMP_MSG_CODE_TIME_EXCEED_FRAG_REASM 1
|
||
|
||
#define NET_ICMP_MSG_CODE_PARAM_PROB_IP_HDR 0
|
||
#define NET_ICMP_MSG_CODE_PARAM_PROB_OPT_MISSING 1
|
||
|
||
#define NET_ICMP_MSG_CODE_TS 0
|
||
#define NET_ICMP_MSG_CODE_TS_REQ 0
|
||
#define NET_ICMP_MSG_CODE_TS_REPLY 0
|
||
|
||
#define NET_ICMP_MSG_CODE_ADDR_MASK 0
|
||
#define NET_ICMP_MSG_CODE_ADDR_MASK_REQ 0
|
||
#define NET_ICMP_MSG_CODE_ADDR_MASK_REPLY 0
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP MESSAGE DEFINES
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#define NET_ICMP_HDR_SIZE_DFLT 8
|
||
|
||
#define NET_ICMP_HDR_SIZE_DEST_UNREACH NET_ICMP_HDR_SIZE_DFLT
|
||
#define NET_ICMP_HDR_SIZE_SRC_QUENCH NET_ICMP_HDR_SIZE_DFLT
|
||
#define NET_ICMP_HDR_SIZE_TIME_EXCEED NET_ICMP_HDR_SIZE_DFLT
|
||
#define NET_ICMP_HDR_SIZE_PARAM_PROB NET_ICMP_HDR_SIZE_DFLT
|
||
#define NET_ICMP_HDR_SIZE_ECHO NET_ICMP_HDR_SIZE_DFLT
|
||
#define NET_ICMP_HDR_SIZE_TS 20
|
||
#define NET_ICMP_HDR_SIZE_ADDR_MASK 12
|
||
|
||
|
||
#define NET_ICMP_HDR_NBR_OCTETS_UNUSED 4
|
||
#define NET_ICMP_HDR_NBR_OCTETS_UNUSED_PARAM_PROB 3
|
||
|
||
|
||
#define NET_ICMP_MSG_ERR_HDR_SIZE_MIN NET_IP_HDR_SIZE_MIN
|
||
#define NET_ICMP_MSG_ERR_HDR_SIZE_MAX NET_IP_HDR_SIZE_MAX
|
||
|
||
#define NET_ICMP_MSG_ERR_DATA_SIZE_MIN_BITS 64 /* See RFC #1122, Section 3.2.2. */
|
||
#define NET_ICMP_MSG_ERR_DATA_SIZE_MIN_OCTETS (((NET_ICMP_MSG_ERR_DATA_SIZE_MIN_BITS - 1) / DEF_OCTET_NBR_BITS) + 1)
|
||
|
||
#define NET_ICMP_MSG_ERR_LEN_MIN (NET_ICMP_MSG_ERR_HDR_SIZE_MIN + NET_ICMP_MSG_ERR_DATA_SIZE_MIN_OCTETS)
|
||
#define NET_ICMP_MSG_ERR_LEN_MAX (NET_ICMP_MSG_ERR_HDR_SIZE_MAX + NET_ICMP_MSG_ERR_DATA_SIZE_MIN_OCTETS)
|
||
|
||
|
||
#define NET_ICMP_MSG_LEN_MIN_DFLT NET_ICMP_HDR_SIZE_DFLT
|
||
|
||
#define NET_ICMP_MSG_LEN_MIN_DEST_UNREACH (NET_ICMP_HDR_SIZE_DEST_UNREACH + NET_ICMP_MSG_ERR_LEN_MIN)
|
||
#define NET_ICMP_MSG_LEN_MIN_SRC_QUENCH (NET_ICMP_HDR_SIZE_SRC_QUENCH + NET_ICMP_MSG_ERR_LEN_MIN)
|
||
#define NET_ICMP_MSG_LEN_MIN_TIME_EXCEED (NET_ICMP_HDR_SIZE_TIME_EXCEED + NET_ICMP_MSG_ERR_LEN_MIN)
|
||
#define NET_ICMP_MSG_LEN_MIN_PARAM_PROB (NET_ICMP_HDR_SIZE_PARAM_PROB + NET_ICMP_MSG_ERR_LEN_MIN)
|
||
#define NET_ICMP_MSG_LEN_MIN_ECHO NET_ICMP_HDR_SIZE_ECHO
|
||
#define NET_ICMP_MSG_LEN_MIN_TS NET_ICMP_HDR_SIZE_TS
|
||
#define NET_ICMP_MSG_LEN_MIN_ADDR_MASK NET_ICMP_HDR_SIZE_ADDR_MASK
|
||
|
||
|
||
#define NET_ICMP_MSG_LEN_MAX_NONE 0xFFFF
|
||
|
||
#define NET_ICMP_MSG_LEN_MAX_DEST_UNREACH NET_ICMP_MSG_LEN_MAX_NONE
|
||
#define NET_ICMP_MSG_LEN_MAX_SRC_QUENCH NET_ICMP_MSG_LEN_MAX_NONE
|
||
#define NET_ICMP_MSG_LEN_MAX_TIME_EXCEED NET_ICMP_MSG_LEN_MAX_NONE
|
||
#define NET_ICMP_MSG_LEN_MAX_PARAM_PROB NET_ICMP_MSG_LEN_MAX_NONE
|
||
#define NET_ICMP_MSG_LEN_MAX_ECHO NET_ICMP_MSG_LEN_MAX_NONE
|
||
#define NET_ICMP_MSG_LEN_MAX_TS NET_ICMP_HDR_SIZE_TS
|
||
#define NET_ICMP_MSG_LEN_MAX_ADDR_MASK NET_ICMP_HDR_SIZE_ADDR_MASK
|
||
|
||
|
||
#define NET_ICMP_MSG_PTR_NONE DEF_INT_08U_MAX_VAL
|
||
|
||
#define NET_ICMP_MSG_PTR_MIN_PARAM_PROB NET_ICMP_MSG_LEN_MIN_DFLT
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP POINTER DEFINES
|
||
*
|
||
* Note(s) : (1) RFC #791 & RFC #792 define a pointer (PTR) as an index (IX) into an option or message :
|
||
*
|
||
* (a) RFC #791, Section 3.1 'Options : Loose/Strict Source & Record Route'
|
||
* (b) RFC #791, Section 3.1 'Options : Internet Timestamp'
|
||
* (c) RFC #792, 'Parameter Problem Message'
|
||
*
|
||
* (2) ICMP Parameter Problem Message pointer validation currently ONLY supports the following
|
||
* protocols :
|
||
*
|
||
* (a) IP
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#define NET_ICMP_PTR_IX_BASE 0
|
||
|
||
/* ---------- IP HDR PTR IXs ---------- */
|
||
#define NET_ICMP_PTR_IX_IP_HDR_BASE NET_ICMP_PTR_IX_BASE
|
||
|
||
#define NET_ICMP_PTR_IX_IP_HDR_VER (NET_ICMP_PTR_IX_IP_HDR_BASE + 0)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_HDR_LEN (NET_ICMP_PTR_IX_IP_HDR_BASE + 0)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_TOS (NET_ICMP_PTR_IX_IP_HDR_BASE + 1)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_TOT_LEN (NET_ICMP_PTR_IX_IP_HDR_BASE + 2)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_ID (NET_ICMP_PTR_IX_IP_HDR_BASE + 4)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_FLAGS (NET_ICMP_PTR_IX_IP_HDR_BASE + 6)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_FRAG_OFFSET (NET_ICMP_PTR_IX_IP_HDR_BASE + 6)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_TTL (NET_ICMP_PTR_IX_IP_HDR_BASE + 8)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_PROTOCOL (NET_ICMP_PTR_IX_IP_HDR_BASE + 9)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_CHK_SUM (NET_ICMP_PTR_IX_IP_HDR_BASE + 10)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_ADDR_SRC (NET_ICMP_PTR_IX_IP_HDR_BASE + 12)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_ADDR_DEST (NET_ICMP_PTR_IX_IP_HDR_BASE + 16)
|
||
#define NET_ICMP_PTR_IX_IP_HDR_OPTS (NET_ICMP_PTR_IX_IP_HDR_BASE + 20)
|
||
|
||
/* --------- ICMP MSG PTR IXs --------- */
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_BASE 0
|
||
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_TYPE 0
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_CODE 1
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_CHK_SUM 2
|
||
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_PTR 4
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_UNUSED 4
|
||
#define NET_ICMP_PTR_IX_ICMP_MSG_UNUSED_PARAM_PROB 5
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* DATA TYPES
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP TRANSMIT SOURCE QUENCH QUANTITY DATA TYPE
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
typedef CPU_INT16U NET_ICMP_SRC_QUENCH_QTY; /* Defines max qty of src quench entries to support. */
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP HEADER
|
||
*
|
||
* Note(s) : (1) See RFC #792 for ICMP message header formats.
|
||
*
|
||
* (2) ICMP 'Redirect' & 'Router' messages are NOT supported (see 'net_icmp.h Note #1').
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* --------------- NET ICMP HDR --------------- */
|
||
typedef struct net_icmp_hdr {
|
||
CPU_INT08U Type; /* ICMP msg type. */
|
||
CPU_INT08U Code; /* ICMP msg code. */
|
||
CPU_INT16U ChkSum; /* ICMP msg chk sum. */
|
||
} NET_ICMP_HDR;
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP ERROR HEADER
|
||
*
|
||
* Note(s) : (1) See RFC #792, Sections 'Destination Unreachable Message', 'Source Quench Message', 'Time
|
||
* Exceeded Message' for ICMP 'Error Message' header format.
|
||
*
|
||
* (2) 'Unused' field MUST be cleared (i.e. ALL 'Unused' field octets MUST be set to 0x00).
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ------------- NET ICMP ERR HDR ------------- */
|
||
typedef struct net_icmp_hdr_err {
|
||
CPU_INT08U Type; /* ICMP msg type. */
|
||
CPU_INT08U Code; /* ICMP msg code. */
|
||
CPU_INT16U ChkSum; /* ICMP msg chk sum. */
|
||
|
||
CPU_INT08U Unused[NET_ICMP_HDR_NBR_OCTETS_UNUSED]; /* See Note #2. */
|
||
|
||
CPU_INT08U Data[NET_ICMP_MSG_ERR_LEN_MAX];
|
||
} NET_ICMP_HDR_ERR;
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP PARAMETER PROBLEM HEADER
|
||
*
|
||
* Note(s) : (1) See RFC #792, Section 'Parameter Problem Message' for ICMP 'Parameter Problem Message'
|
||
* header format.
|
||
*
|
||
* (2) 'Unused' field MUST be cleared (i.e. ALL 'Unused' field octets MUST be set to 0x00).
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ---------- NET ICMP PARAM PROB HDR --------- */
|
||
typedef struct net_icmp_hdr_param_prob {
|
||
CPU_INT08U Type; /* ICMP msg type. */
|
||
CPU_INT08U Code; /* ICMP msg code. */
|
||
CPU_INT16U ChkSum; /* ICMP msg chk sum. */
|
||
|
||
CPU_INT08U Ptr; /* Ptr into ICMP err msg. */
|
||
CPU_INT08U Unused[NET_ICMP_HDR_NBR_OCTETS_UNUSED_PARAM_PROB]; /* See Note #2. */
|
||
|
||
CPU_INT08U Data[NET_ICMP_MSG_ERR_LEN_MAX];
|
||
} NET_ICMP_HDR_PARAM_PROB;
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP ECHO REQUEST/REPLY HEADER
|
||
*
|
||
* Note(s) : (1) See RFC #792, Section 'Echo or Echo Reply Message' for ICMP 'Echo Request/Reply Message'
|
||
* header format.
|
||
*
|
||
* (2) 'Data' declared with 1 entry; prevents removal by compiler optimization.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ------- NET ICMP ECHO REQ/REPLY HDR -------- */
|
||
typedef struct net_icmp_hdr_echo {
|
||
CPU_INT08U Type; /* ICMP msg type. */
|
||
CPU_INT08U Code; /* ICMP msg code. */
|
||
CPU_INT16U ChkSum; /* ICMP msg chk sum. */
|
||
|
||
CPU_INT16U ID; /* ICMP msg ID. */
|
||
CPU_INT16U SeqNbr; /* ICMP seq nbr. */
|
||
|
||
CPU_INT08U Data[1]; /* ICMP msg data (see Note #2). */
|
||
} NET_ICMP_HDR_ECHO;
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP INTERNET TIMESTAMP HEADER
|
||
*
|
||
* Note(s) : (1) See RFC #792, Section 'Timestamp or Timestamp Reply Message' for ICMP 'Internet Timestamp
|
||
* Message' header format.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* -------- NET ICMP TS REQ/REPLY HDR --------- */
|
||
typedef struct net_icmp_hdr_ts {
|
||
CPU_INT08U Type; /* ICMP msg type. */
|
||
CPU_INT08U Code; /* ICMP msg code. */
|
||
CPU_INT16U ChkSum; /* ICMP msg chk sum. */
|
||
|
||
CPU_INT16U ID; /* ICMP msg ID. */
|
||
CPU_INT16U SeqNbr; /* ICMP seq nbr. */
|
||
|
||
NET_TS TS_Originate; /* TS @ req tx. */
|
||
NET_TS TS_Rx; /* TS @ target rx. */
|
||
NET_TS TS_Tx; /* TS @ target tx. */
|
||
} NET_ICMP_HDR_TS;
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP ADDRESS MASK REQUEST/REPLY HEADER
|
||
*
|
||
* Note(s) : (1) See RFC #950, Appendix I 'Address Mask ICMP' for ICMP 'Address Mask Request/Reply Message'
|
||
* header format.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ----- NET ICMP ADDR MASK REQ/REPLY HDR ----- */
|
||
typedef struct net_icmp_hdr_addr_mask {
|
||
CPU_INT08U Type; /* ICMP msg type. */
|
||
CPU_INT08U Code; /* ICMP msg code. */
|
||
CPU_INT16U ChkSum; /* ICMP msg chk sum. */
|
||
|
||
CPU_INT16U ID; /* ICMP msg ID. */
|
||
CPU_INT16U SeqNbr; /* ICMP seq nbr. */
|
||
|
||
NET_IP_ADDR AddrMask; /* Addr mask. */
|
||
} NET_ICMP_HDR_ADDR_MASK;
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP REQUEST MESSAGE IDENTIFICATION & SEQUENCE NUMBER DATA TYPE
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* ----------- NET ICMP REQ MSG ID/SEQ NBR ------------ */
|
||
typedef struct net_icmp_req_id_seq {
|
||
CPU_INT16U ID; /* ICMP Req Msg ID. */
|
||
CPU_INT16U SeqNbr; /* ICMP Req Msg Seq Nbr. */
|
||
} NET_ICMP_REQ_ID_SEQ;
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* ICMP TRANSMIT SOURCE QUENCH LIST DATA TYPE
|
||
*
|
||
* NET_ICMP_TX_SRC_QUENCH
|
||
* |-------------|
|
||
* | ICMP Type |
|
||
* Previous |-------------|
|
||
* ICMP <----------O |
|
||
* entry |-------------| Next
|
||
* | O----------> ICMP
|
||
* |-------------| entry
|
||
* | IP Address |
|
||
* |-------------|
|
||
* | Transmit |
|
||
* | Counter |
|
||
* |-------------|
|
||
*
|
||
*
|
||
* Note(s) : (1) Forced word-alignment at start of ICMP entry NOT required since first data member 'Type'
|
||
* is declared as 'CPU_INT32U'.
|
||
*
|
||
* (2) 'PrevPtr'/'NextPtr' ideally declared as 'NET_ICMP_TX_SRC_QUENCH' pointers; declared as
|
||
* 'void' pointers because 'NET_ICMP_TX_SRC_QUENCH' NOT fully defined at time of declaration.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/* -------------- NET ICMP TX SRC QUENCH -------------- */
|
||
typedef struct net_icmp_tx_src_quench {
|
||
NET_TYPE Type; /* Type cfg'd @ init : NET_ICMP_TYPE_TX_SRC_QUENCH. */
|
||
|
||
void *PrevPtr; /* Ptr to PREV ICMP tx src quench entry. */
|
||
void *NextPtr; /* Ptr to NEXT ICMP tx src quench entry. */
|
||
|
||
NET_IP_ADDR Addr; /* IP addr to tx src quench err msg. */
|
||
CPU_INT16U TxCtr; /* Ctr limits tx src quench err msgs. */
|
||
|
||
CPU_INT16U Flags;
|
||
} NET_ICMP_TX_SRC_QUENCH;
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* GLOBAL VARIABLES
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#if (NET_ICMP_CFG_TX_SRC_QUENCH_EN == DEF_ENABLED) /* -------------- ICMP TX SRC QUENCH -------------- */
|
||
|
||
NET_ICMP_EXT NET_ICMP_TX_SRC_QUENCH NetICMP_TxSrcQuenchTbl[NET_ICMP_CFG_TX_SRC_QUENCH_SIZE];
|
||
NET_ICMP_EXT NET_STAT_POOL NetICMP_TxSrcQuenchPoolStat;
|
||
|
||
NET_ICMP_EXT NET_ICMP_TX_SRC_QUENCH *NetICMP_TxSrcQuenchPoolPtr; /* Ptr to pool of free ICMP Tx Src Quench entries. */
|
||
NET_ICMP_EXT NET_ICMP_TX_SRC_QUENCH *NetICMP_TxSrcQuenchListHead; /* Ptr to head of ICMP Tx Src Quench List. */
|
||
NET_ICMP_EXT NET_ICMP_TX_SRC_QUENCH *NetICMP_TxSrcQuenchListTail; /* Ptr to tail of ICMP Tx Src Quench List. */
|
||
|
||
NET_ICMP_EXT CPU_INT16U NetICMP_TxSrcQuenchTxTh_nbr; /* Nbr of rx'd IP pkts to tx ICMP Src Quench Msg. */
|
||
#endif
|
||
|
||
|
||
NET_ICMP_EXT CPU_INT16U NetICMP_TxSeqNbrCtr; /* Global tx seq nbr field ctr. */
|
||
|
||
|
||
|
||
#if (NET_CTR_CFG_STAT_EN == DEF_ENABLED) /* ------------------ NET ICMP STATS ------------------ */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatRxMsgCtr; /* Nbr rx'd msgs. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatRxMsgProcessedCtr; /* Nbr rx'd msgs successfully processed. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatRxMsgErrProcessedCtr; /* Nbr rx'd err msgs successfully processed. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatRxMsgReqProcessedCtr; /* Nbr rx'd req msgs successfully processed. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatRxMsgReplyProcessedCtr;/* Nbr rx'd reply msgs successfully processed. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatTxMsgCtr; /* Nbr tx'd msgs. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatTxMsgErrCtr; /* Nbr tx'd err msgs. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatTxMsgReqCtr; /* Nbr tx'd req msgs. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_StatTxMsgReplyCtr; /* Nbr tx'd reply msgs. */
|
||
#endif
|
||
|
||
|
||
#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED) /* ------------------ NET ICMP ERRS ------------------- */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxHdrTypeCtr; /* Nbr rx'd msgs with unknown/invalid msg type. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxHdrCodeCtr; /* Nbr rx'd msgs with unknown/invalid msg code. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxHdrMsgLenCtr; /* Nbr rx'd msgs with invalid/inconsistent msg len. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxHdrPtrCtr; /* Nbr rx'd msgs with invalid msg ptr. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxHdrChkSumCtr; /* Nbr rx'd msgs with invalid chk sum. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxBroadcastCtr; /* Nbr rx'd msg reqs rx'd via broadcast. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxPktDiscardedCtr; /* Nbr rx'd msgs discarded. */
|
||
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrTxInvalidLenCtr; /* Nbr tx pkts discarded for invalid len. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrTxHdrTypeCtr; /* Nbr tx msgs with unknown/invalid msg type. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrTxHdrCodeCtr; /* Nbr tx msgs with unknown/invalid msg code. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrTxPktDiscardedCtr; /* Nbr tx msgs discarded. */
|
||
|
||
|
||
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrNullPtrCtr; /* Nbr null ICMP ptr accesses. */
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrNotUsedCtr; /* Nbr unused ICMP tx src quench entry accesses. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrInvalidTypeCtr; /* Nbr ICMP tx src quench entry invalid type accesses. */
|
||
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxInvalidBufIxCtr; /* Nbr rx pkts with invalid buf ix. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrRxHdrDataLenCtr; /* Nbr rx'd msgs with invalid msg data len. */
|
||
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrTxInvalidBufIxCtr; /* Nbr tx pkts with invalid buf ix. */
|
||
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrTxHdrPtrCtr; /* Nbr tx msgs with invalid msg ptr. */
|
||
#endif
|
||
|
||
|
||
#if (NET_ICMP_CFG_TX_SRC_QUENCH_EN == DEF_ENABLED)
|
||
NET_ICMP_EXT NET_CTR NetICMP_ErrNoneAvailCtr; /* Nbr tx src quench entry unavail accesses. */
|
||
#endif
|
||
|
||
#endif
|
||
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* MACRO'S
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* NET_ICMP_TX_GET_SEQ_NBR()
|
||
*
|
||
* Description : Get next ICMP transmit message sequence number.
|
||
*
|
||
* Argument(s) : seq_nbr Variable that will receive the returned ICMP transmit message sequence number.
|
||
*
|
||
* Return(s) : none.
|
||
*
|
||
* Caller(s) : NetICMP_TxMsgReq().
|
||
*
|
||
* This macro is an INTERNAL network protocol suite macro & SHOULD NOT be called by
|
||
* application function(s).
|
||
*
|
||
* Note(s) : (1) Return ICMP sequence number is NOT converted from host-order to network-order.
|
||
*
|
||
* (2) ALL functions which call NET_ICMP_TX_GET_SEQ_NBR() MUST declare local variable 'cpu_sr'
|
||
* if critical section method is configured as CPU_CRITICAL_METHOD_STATUS_LOCAL :
|
||
*
|
||
* #if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
|
||
* CPU_SR cpu_sr;
|
||
* #endif
|
||
*
|
||
* (a) #### Macro require critical section for exclusive access?
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#define NET_ICMP_TX_GET_SEQ_NBR(seq_nbr) { CPU_CRITICAL_ENTER(); \
|
||
NET_UTIL_VAL_COPY_16(&(seq_nbr), &NetICMP_TxSeqNbrCtr); \
|
||
NetICMP_TxSeqNbrCtr++; \
|
||
CPU_CRITICAL_EXIT(); }
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* FUNCTION PROTOTYPES
|
||
*
|
||
* Note(s) : (1) See 'net_os.c NetOS_ICMP_TxMsgReq() Note #1' &
|
||
* 'net_icmp.c NetICMP_TxMsgReq() Note #3'.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
void NetICMP_Init (void);
|
||
|
||
|
||
#if (NET_ICMP_CFG_TX_SRC_QUENCH_EN == DEF_ENABLED)
|
||
CPU_BOOLEAN NetICMP_CfgTxSrcQuenchTh(CPU_INT16U th);
|
||
#endif
|
||
|
||
|
||
|
||
void NetICMP_Rx (NET_BUF *pbuf,
|
||
NET_ERR *perr);
|
||
|
||
|
||
|
||
void NetICMP_TxMsgErr (NET_BUF *pbuf,
|
||
CPU_INT08U type,
|
||
CPU_INT08U code,
|
||
CPU_INT08U ptr,
|
||
NET_ERR *perr);
|
||
|
||
NET_ICMP_REQ_ID_SEQ NetICMP_TxMsgReq (CPU_INT08U type, /* See Note #1. */
|
||
CPU_INT08U code,
|
||
CPU_INT16U id,
|
||
NET_IP_TOS TOS,
|
||
NET_IP_TTL TTL,
|
||
NET_IP_ADDR addr_dest,
|
||
CPU_INT16U flags,
|
||
void *popts,
|
||
void *p_data,
|
||
CPU_INT16U data_len,
|
||
NET_ERR *perr);
|
||
|
||
|
||
|
||
void NetICMP_HandlerRx (NET_BUF *pbuf);
|
||
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* FUNCTION PROTOTYPES
|
||
* DEFINED IN OS'S net_os.c
|
||
*
|
||
* Note(s) : (1) See 'net_os.c NetOS_ICMP_TxMsgReq() Note #1' &
|
||
* 'net_icmp.c NetICMP_TxMsgReq() Note #3'.
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
NET_ICMP_REQ_ID_SEQ NetOS_ICMP_TxMsgReq (CPU_INT08U type, /* See Note #1. */
|
||
CPU_INT08U code,
|
||
NET_IP_TOS TOS,
|
||
NET_IP_TTL TTL,
|
||
NET_IP_ADDR addr_dest,
|
||
CPU_INT16U flags,
|
||
void *popts,
|
||
void *p_data,
|
||
CPU_INT16U data_len,
|
||
NET_ERR *perr);
|
||
|
||
/*$PAGE*/
|
||
/*
|
||
*********************************************************************************************************
|
||
* CONFIGURATION ERRORS
|
||
*********************************************************************************************************
|
||
*/
|
||
|
||
#ifndef NET_ICMP_CFG_TX_SRC_QUENCH_EN
|
||
#error "NET_ICMP_CFG_TX_SRC_QUENCH_EN not #define'd in 'net_cfg.h'"
|
||
#error " [MUST be DEF_DISABLED] "
|
||
#error " [ || DEF_ENABLED ] "
|
||
|
||
#elif ((NET_ICMP_CFG_TX_SRC_QUENCH_EN != DEF_DISABLED) && \
|
||
(NET_ICMP_CFG_TX_SRC_QUENCH_EN != DEF_ENABLED ))
|
||
#error "NET_ICMP_CFG_TX_SRC_QUENCH_EN illegally #define'd in 'net_cfg.h'"
|
||
#error " [MUST be DEF_DISABLED] "
|
||
#error " [ || DEF_ENABLED ] "
|
||
|
||
#elif (NET_ICMP_CFG_TX_SRC_QUENCH_EN == DEF_ENABLED)
|
||
|
||
|
||
#ifndef NET_ICMP_CFG_TX_SRC_QUENCH_SIZE
|
||
#error "NET_ICMP_CFG_TX_SRC_QUENCH_SIZE not #define'd in 'net_cfg.h'"
|
||
#error " [MUST be > 0] "
|
||
#error " [ && < 65536] "
|
||
#elif ((NET_ICMP_CFG_TX_SRC_QUENCH_SIZE < 1) || \
|
||
(NET_ICMP_CFG_TX_SRC_QUENCH_SIZE > DEF_INT_16U_MAX_VAL))
|
||
#error "NET_ICMP_CFG_TX_SRC_QUENCH_SIZE illegally #define'd in 'net_cfg.h'"
|
||
#error " [MUST be > 0] "
|
||
#error " [ && < 65536] "
|
||
#endif
|
||
|
||
|
||
#endif
|
||
|