Moyka/OS/uc/tcpip/Source/net_buf.h
dimoniche f74fdcceac первый коммит
первый коммит
2019-05-27 23:42:26 +03:00

747 lines
43 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************************************
* 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 BUFFER MANAGEMENT
*
* Filename : net_buf.h
* Version : V1.89
* Programmer(s) : ITJ
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* EXTERNS
*********************************************************************************************************
*/
#ifdef NET_BUF_MODULE
#define NET_BUF_EXT
#else
#define NET_BUF_EXT extern
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NETWORK BUFFER FLAG DEFINES
*********************************************************************************************************
*/
/* ------------------- NET BUF FLAGS ------------------ */
#define NET_BUF_FLAG_NONE DEF_BIT_NONE
#define NET_BUF_FLAG_USED DEF_BIT_00 /* Buf cur used; i.e. NOT in free buf pool. */
#define NET_BUF_FLAG_CLR_MEM DEF_BIT_01
#define NET_BUF_FLAG_BROADCAST_RX DEF_BIT_04 /* Set by Net IF, chk'd by IP. */
#define NET_BUF_FLAG_BROADCAST_TX DEF_BIT_05 /* Set by IP, chk'd by Net IF. */
#define NET_BUF_FLAG_UDP_RX_CHK_SUM_VALID DEF_BIT_08 /* Indicates UDP rx chk sum valid. */
/*
*********************************************************************************************************
* NETWORK BUFFER TYPE DEFINES
*
* Note(s) : (1) NET_BUF_TYPE_??? #define values specifically chosen as ASCII representations of the network
* buffer types. Memory displays of network buffers will display the buffer TYPEs with their
* chosen ASCII names.
**********************************************************************************************************/
/* ------------------ NET BUF TYPES ------------------- */
#if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG)
#define NET_BUF_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
#define NET_BUF_TYPE_SMALL 0x534D414C /* "SMAL" in ASCII. */
#define NET_BUF_TYPE_LARGE 0x4C415247 /* "LARG" in ASCII. */
#else
#if (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32)
#define NET_BUF_TYPE_NONE 0x454E4F4E /* "NONE" in ASCII. */
#define NET_BUF_TYPE_SMALL 0x4C414D53 /* "SMAL" in ASCII. */
#define NET_BUF_TYPE_LARGE 0x4752414C /* "LARG" in ASCII. */
#elif (CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16)
#define NET_BUF_TYPE_NONE 0x4F4E454E /* "NONE" in ASCII. */
#define NET_BUF_TYPE_SMALL 0x4D534C41 /* "SMAL" in ASCII. */
#define NET_BUF_TYPE_LARGE 0x414C4752 /* "LARG" in ASCII. */
#else /* Dflt CPU_WORD_SIZE_08. */
#define NET_BUF_TYPE_NONE 0x4E4F4E45 /* "NONE" in ASCII. */
#define NET_BUF_TYPE_SMALL 0x534D414C /* "SMAL" in ASCII. */
#define NET_BUF_TYPE_LARGE 0x4C415247 /* "LARG" in ASCII. */
#endif
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK BUFFER INDEX & SIZE DEFINES
*
* Note(s) : (1) NET_BUF_DATA_PROTOCOL_HDR_SIZE_MAX's value is pre-#define'd in 'net_cfg_net.h' :
*
* (a) NET_BUF_DATA_PROTOCOL_HDR_SIZE_MAX's ideal #define'tion :
*
* (A) IF Hdr + max(Protocol Headers)
*
* (b) NET_BUF_DATA_PROTOCOL_HDR_SIZE_MAX #define'd with hard-coded knowledge that IF, IP &
* TCP headers have the largest combined maximum size of all the protocol headers :
*
* IP Hdr 60 ARP Hdr 68 IP Hdr 60 IP Hdr 60
* ICMP Hdr 0 UDP Hdr 8 TCP Hdr 60
* ------------- ------------ ------------ ------------
* Total 60 Total 68 Total 68 Total 120
*
* (c) Assumes maximum ARP header size of 68 octets based on maximum length hardware & protocol
* addresses. Actual ARP header size depends on actual hardware & protocol address lengths.
* See 'net_arp.h Note #2' for supported hardware & protocol types.
*
* (d) The minimum network buffer size MUST be configured greater than the maximum network packet
* header sizes so that the first of any fragmented packets always contains a complete receipt
* of all frame & network packet headers.
*
* (2) (a) Since network data value macro's appropriately convert data values from any CPU addresses,
* word-aligned or not; network receive & transmit packets are NOT required to ensure that
* network packet headers (ARP/IP/UDP/TCP/etc.) & header members will locate on CPU word-
* aligned addresses. Therefore, network receive & transmit packets are NOT required to
* start on any specific network buffer indices.
*
* See also 'net_util.h NETWORK DATA VALUE MACRO'S Note #2b'.
*
* (b) However, many processors may be more efficient & may even REQUIRE that memory transfers
* occur on CPU word-aligned addresses [e.g. processors or NICs with direct memory access
* (DMA) capability]. Therefore, network receive & transmit packets SHOULD start on CPU
* word-aligned network buffer indices.
*
* (1) Receive packet index SHOULD be configured for the first CPU word-aligned
* network buffer index.
*
* (2) Transmit data index SHOULD be configured to ensure that the transmit packet
* network buffer index is CPU word-aligned.
*
* (A) However, this assumes that a single data index may be configured that can handle
* all possible combinations of network packet header lengths while still ensuring
* that each transmit packet's network buffer index is CPU word-aligned.
*
* This assumption is valid if & only if all combinations of network packet header
* lengths are multiples of the CPU's word size.
*
* See also Note #1d.
*
* See also 'lib_mem.h MEMORY DATA VALUE MACRO'S Note #1a'.
*********************************************************************************************************
*/
/* --------------- NET BUF HDR/DATA IXs --------------- */
#define NET_BUF_DATA_BASE 0
/* See Note #2b1. */
#define NET_BUF_DATA_RX_IX NET_BUF_DATA_BASE
/* Tx ix/sizes based on max pkt hdr sizes ... */
/* ... (see Note #2b2). */
#define NET_BUF_DATA_PROTOCOL_HDR_BASE NET_BUF_DATA_BASE
#define NET_BUF_DATA_TX_IX (NET_BUF_DATA_PROTOCOL_HDR_BASE + NET_BUF_DATA_PROTOCOL_HDR_SIZE_MAX)
#define NET_BUF_DATA_SIZE_MIN NET_BUF_DATA_TX_IX
#define NET_BUF_DATA_PROTOCOL_HDR_SIZE NET_BUF_DATA_TX_IX
/*$PAGE*/
/*
*********************************************************************************************************
* DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* NETWORK BUFFER QUANTITY DATA TYPE
*********************************************************************************************************
*/
typedef CPU_INT16U NET_BUF_QTY; /* Defines max qty of net bufs to support. */
/*
*********************************************************************************************************
* NETWORK BUFFER SIZE DATA TYPE
*
* Note(s) : (1) NET_BUF_IX_NONE SHOULD be globally #define'd AFTER 'NET_BUF_SIZE' data type declared.
*********************************************************************************************************
*/
typedef CPU_INT16U NET_BUF_SIZE; /* Defines max size of net buf data. */
#define NET_BUF_IX_NONE DEF_INT_16U_MAX_VAL /* Define as max unsigned val (see Note #1). */
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK BUFFER HEADER DATA TYPE
*
* NET_BUF_HDR
* |-------------|
* | Buffer Type |
* |-------------|
* | Buffer Size |
* |-------------|
* | Flags |
* Previous |-------------|
* Buffer <----------O |
* Lists |-------------| Next
* | O----------> Buffer
* Previous |-------------| Lists
* Buffer <----------O |
* |-------------| Next
* | O----------> Buffer
* |-------------|
* | O----------> Buffer
* |-------------| Timer
* | |
* | O----------> Unlink Fnct
* | | & Obj Ptrs
* |-------------|
* | Reference |
* | Counter |
* |-------------|
* | |
* | |
* | Protocol |
* | Header |
* | Indices/ |
* | Lengths |
* | |
* | |
* |-------------|
* | |
* | Protocol |
* | Controls |
* | |
* | ----------- |
* | ARP |
* | ----------- |
* | IP |
* | ----------- |
* | TCP/UDP |
* | ----------- |
* | TCP |
* | ----------- |
* | Conn |
* |-------------|
*
*$PAGE*
* Note(s) : (1) (a) 'PrevPrimListPtr'/'NextPrimListPtr'/'PrevSecListPtr'/'NextSecListPtr'/'PrevBufPtr'/
* 'NextBufPtr'/'IP_OptPtr' ideally declared as 'NET_BUF' pointers; declared as 'void'
* pointers because 'NET_BUF' NOT defined at time of declaration.
*
* (b) 'UnlinkFnctPtr' ideally declared as pointer to a function whose argument is a pointer
* to a 'NET_BUF'; declared as a function whose argument is a pointer to a 'void' object
* because 'NET_BUF' NOT defined at time of declaration.
*
* (2) Protocol Header & Data indices into DATA area declared as 'CPU_INT16U' because current
* TCP/IPv4 header sizes do NOT exceed 'CPU_INT16U' index space.
*
* (3) 'TotLen'/'DataLen' calculate total buffer data length & 'Application' data length.
*
* For received buffers, total buffer data length is set to the incoming packet length;
* 'Application' data length (& index) is calculated as total buffer data lengths minus
* all protocol header lengths found in the buffer.
*
* For transmitted buffers, 'Application' data length (& index) is set by higher-layer
* network protocols or the application layer; total buffer data length is calculated
* as the 'Application' data length plus all protocol header lengths inserted into the
* buffer.
*
* (4) The following variables ideally declared as specific IP data types; declared as CPU
* data types because IP data types NOT defined until 'net_ip.h' (see 'net.h NETWORK
* INCLUDE FILES') :
*
* (a) IP address variables ideally declared as 'NET_IP_ADDR'; declared as 'CPU_INT32U'.
*
* (5) The following variables ideally declared as specific TCP data types; declared as CPU
* data types because TCP data types NOT defined until 'net_tcp.h' (see 'net.h NETWORK
* INCLUDE FILES') :
*
* (a) TCP segment size variables ideally declared as 'NET_TCP_SEG_SIZE';
* declared as 'CPU_INT16U'.
*
* (b) TCP window size variables ideally declared as 'NET_TCP_WIN_SIZE';
* declared as 'CPU_INT16U'.
*
* (c) TCP sequence variables ideally declared as 'NET_TCP_SEQ_NBR';
* declared as 'CPU_INT32U'.
*
* (d) TCP transmit acknowledgement code variables ideally declared as 'NET_TCP_ACK_CODE';
* declared as 'CPU_INT08U'.
*
* (e) TCP transmit RTT timestamp variables ideally declared as 'NET_TCP_TX_RTT_TS_MS';
* declared as 'CPU_INT32U'.
*
* (6) The following variables ideally declared as specific network connection data types;
* declared as CPU data types because network connection data types NOT defined until
* 'net_conn.h' (see 'net.h NETWORK INCLUDE FILES') :
*
* (a) Connection identification variables ideally declared as 'NET_CONN_ID';
* declared as 'CPU_INT16S'.
*********************************************************************************************************
*/
/*$PAGE*/
/* ------------------------- NET BUF HDR -------------------------- */
typedef struct net_buf_hdr {
NET_TYPE Type; /* Buf type cfg'd @ init : NET_BUF_TYPE_SMALL / NET_BUF_TYPE_LARGE. */
NET_BUF_SIZE Size; /* Buf size cfg'd @ init : NET_BUF_SIZE_SMALL / NET_BUF_SIZE_LARGE. */
CPU_INT16U Flags; /* Buf flags. */
void *PrevPrimListPtr; /* Ptr to PREV prim list. */
void *NextPrimListPtr; /* Ptr to NEXT prim list. */
void *PrevSecListPtr; /* Ptr to PREV sec list. */
void *NextSecListPtr; /* Ptr to NEXT sec list. */
void *PrevBufPtr; /* Ptr to PREV buf. */
void *NextBufPtr; /* Ptr to NEXT buf. */
NET_TMR *TmrPtr; /* Ptr to buf TMR. */
CPU_FNCT_PTR UnlinkFnctPtr; /* Ptr to fnct used to unlink buf from multiple refs (see Note #1b).*/
void *UnlinkObjPtr; /* Ptr to obj to unlink buf from. */
NET_BUF_QTY ID; /* Buf id. */
CPU_INT08U RefCtr; /* Nbr of external references pointing to this buf. */
NET_PROTOCOL_TYPE ProtocolHdrType; /* Hdr protocol type. */
CPU_INT16U IF_HdrIx; /* IF hdr ix (in DATA area). */
CPU_INT16U IF_HdrLen; /* IF hdr len (in octets ). */
CPU_INT16U IF_DataLenMin; /* IF data len min. */
#ifdef NET_ARP_MODULE_PRESENT
CPU_INT16U ARP_MsgIx; /* ARP msg ix (in DATA area). */
CPU_INT16U ARP_MsgLen; /* ARP msg len (in octets ). */
#endif
CPU_INT16U IP_HdrIx; /* IP hdr ix (in DATA area). */
CPU_INT16U IP_HdrLen; /* IP hdr len (in octets ). */
CPU_INT16U ICMP_MsgIx; /* ICMP msg ix (in DATA area). */
CPU_INT16U ICMP_MsgLen; /* ICMP msg len (in octets ). */
CPU_INT16U ICMP_HdrLen; /* ICMP hdr len (in octets ). */
CPU_INT16U TCP_UDP_HdrDataIx; /* TCP/UDP pkt ix (in DATA area). */
CPU_INT16U TCP_UDP_HdrLen; /* TCP/UDP hdr len (in octets ). */
CPU_INT16U DataIx; /* App DATA ix. */
NET_BUF_SIZE DataLen; /* App DATA len (in octets ). */
NET_BUF_SIZE TotLen; /* ALL DATA len (in DATA area). */
#ifdef NET_ARP_MODULE_PRESENT
CPU_INT08U *ARP_AddrHW_Ptr; /* Ptr to ARP hw addr. */
CPU_INT08U *ARP_AddrProtocolPtr; /* Ptr to ARP protocol addr. */
#endif
CPU_INT16U IP_TotLen; /* IP tot len. */
CPU_INT16U IP_DataLen; /* IP data len. */
CPU_INT16U IP_DatagramLen; /* IP complete datagram data len. */
CPU_INT16U IP_ID; /* IP datagram id. */
CPU_INT16U IP_Flags_FragOffset; /* IP rx flags/frag offset. */
CPU_INT16U IP_FragSizeTot; /* Tot IP rx frag size. */
CPU_INT16U IP_FragSizeCur; /* Cur IP rx frag size. */
/* IP addrs (see Note #4a) : */
CPU_INT32U IP_AddrSrc; /* IP src addr. */
CPU_INT32U IP_AddrDest; /* IP dest addr. */
CPU_INT32U IP_AddrNextHop; /* IP tx 'Next-Hop' addr. */
CPU_INT32U IP_AddrNextHopNetOrder; /* IP tx 'Next-Hop' addr in net-order. */
void *IP_OptPtr; /* Ptr to IP rx opts. */
/*$PAGE*/
CPU_INT16U TCP_UDP_TotLen; /* TCP/UDP tot len. */
CPU_INT16U TCP_UDP_DataLen; /* TCP/UDP tot data len. */
NET_PORT_NBR TCP_UDP_PortSrc; /* TCP/UDP rx src port. */
NET_PORT_NBR TCP_UDP_PortDest; /* TCP/UDP rx dest port. */
#ifdef NET_TCP_MODULE_PRESENT
CPU_INT16U TCP_HdrLen_Flags; /* TCP hdr len/flags. */
CPU_INT16U TCP_SegLenInit; /* TCP init seg len (see Note #5a). */
CPU_INT16U TCP_SegLen; /* TCP seg len [i.e. data len & possible sync/close ctrl(s)]. */
CPU_INT16U TCP_SegLenLast; /* TCP last seg len [i.e. last len tx'd]. */
CPU_INT16U TCP_SegLenData; /* TCP data seg len [i.e. data len]. */
CPU_INT16U TCP_SegReTxCtr; /* Indicates nbr seg re-tx's. */
CPU_BOOLEAN TCP_SegSync; /* Indicates TCP sync seg. */
CPU_BOOLEAN TCP_SegClose; /* Indicates TCP close seg. */
CPU_BOOLEAN TCP_SegReset; /* Indicates TCP reset seg. */
CPU_BOOLEAN TCP_SegAck; /* Indicates TCP ack seg. */
CPU_BOOLEAN TCP_SegAckTxd; /* Indicates TCP ack tx'd for rx'd seg. */
CPU_INT08U TCP_SegAckTxReqCode; /* Indicates TCP ack tx req code for rx'd seg (see Note #5d). */
CPU_INT32U TCP_SeqNbrInit; /* TCP init seq nbr (see Note #5c). */
CPU_INT32U TCP_SeqNbrLast; /* TCP last seq nbr */
CPU_INT32U TCP_SeqNbr; /* TCP seq nbr */
CPU_INT32U TCP_AckNbr; /* TCP ack nbr */
CPU_INT32U TCP_AckNbrLast; /* TCP last ack nbr */
CPU_INT16U TCP_MaxSegSize; /* TCP max seg size (see Note #5a). */
CPU_INT16U TCP_WinSize; /* TCP win size (see Note #5b). */
CPU_INT16U TCP_WinSizeLast; /* TCP last win size. */
CPU_INT32U TCP_RTT_TS_Rxd_ms; /* TCP RTT TS @ seg rx'd (in ms) [see Note #5e]. */
CPU_INT32U TCP_RTT_TS_Txd_ms; /* TCP RTT TS @ seg tx'd (in ms). */
CPU_INT16U TCP_Flags; /* TCP tx flags. */
#endif
#ifdef NET_CONN_MODULE_PRESENT
CPU_INT16S Conn_ID; /* Conn id (see Note #6a). */
CPU_INT16S Conn_ID_Transport; /* Transport layer conn id. */
CPU_INT16S Conn_ID_App; /* App layer conn id. */
CPU_INT08U ConnType; /* Conn type. */
#endif
} NET_BUF_HDR;
/*$PAGE*/
/*
*********************************************************************************************************
* NETWORK BUFFER DATA TYPE
*
* NET_BUF
* |-------------|
* | |
* | |
* | Buffer |
* | Header |
* | |
* | |
* |-------------|
* | Alignment |
* | Word |
* |-------------|
* | |
* | |
* | |
* | Buffer |
* | Data |
* | |
* | |
* | |
* | |
* |-------------|
*
*
* Note(s) : (1) Forced word-alignment at start of network buffer NOT required since first data member
* 'Hdr.Type' is declared as 'CPU_INT32U'.
*
* (2) 'Dummy' declared to force 'Data' buffer word-alignment.
*
* (3) NET_BUF_CFG_DATA_SIZE_SMALL & NET_BUF_CFG_DATA_SIZE_LARGE MUST be declared with values ...
*
* (a) that are greater than or equal to NET_BUF_DATA_SIZE_MIN (see 'NETWORK BUFFER INDEX & SIZE DEFINES')
* (b) such that NET_BUF_CFG_DATA_SIZE_LARGE has a value greater than NET_BUF_CFG_DATA_SIZE_SMALL
*
* ... and SHOULD be declared with values ...
*
* (c) that are integer multiples of 'CPU_ALIGN' word size (to force word-alignment of buffer arrays)
*
* (4) (a) 'Data' buffer is storage for both Protocol Headers & Application data.
*
* (b) 'NET_BUF_SMALL'/'NET_BUF_LARGE' 'Data' buffer declared with an additional CPU data word size so
* that NICs may efficiently & safely read or write data without overflowing the 'Data' buffer.
*
* This additional CPU data word size does NOT increase the overall useable network buffer 'Data'
* size (see also 'net_buf.c NetBuf_GetMaxSize() Note #3').
*
* (c) 'NET_BUF's 'Data' declared with 1 entry; prevents removal by compiler optimization.
*
* (5) Whenever generic 'NET_BUF' pointer 'pbuf' is used to index NetBuf_SmallTbl[] or NetBuf_LargeTbl[],
* 'pbuf' CANNOT be pointer-incremented to access consecutive table buffers; 'pbuf' MUST load the
* address of each table buffer entry.
*********************************************************************************************************
*/
/* ---------------------- NET BUF SMALL ----------------------- */
typedef struct net_buf_small {
NET_BUF_HDR Hdr;
CPU_ALIGN Dummy; /* See Note #2. */
CPU_INT08U Data[NET_BUF_CFG_DATA_SIZE_SMALL /* See Notes #4a & #3. */
+ sizeof(CPU_DATA)]; /* See Note #4b. */
} NET_BUF_SMALL;
/* ---------------------- NET BUF LARGE ----------------------- */
typedef struct net_buf_large {
NET_BUF_HDR Hdr;
CPU_ALIGN Dummy; /* See Note #2. */
CPU_INT08U Data[NET_BUF_CFG_DATA_SIZE_LARGE /* See Notes #4a & #3. */
+ sizeof(CPU_DATA)]; /* See Note #4b. */
} NET_BUF_LARGE;
/* ------------------------- NET BUF -------------------------- */
typedef struct net_buf {
NET_BUF_HDR Hdr;
CPU_ALIGN Dummy; /* See Note #2. */
CPU_INT08U Data[1]; /* See Note #4c. */
} NET_BUF; /* NET_BUF used to point to _SMALL/_LARGE bufs (see Note #5). */
/*$PAGE*/
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
#if (NET_BUF_CFG_NBR_SMALL > 0) /* ---------------- SMALL NET BUFS ---------------- */
NET_BUF_EXT NET_BUF_SMALL NetBuf_SmallTbl[NET_BUF_CFG_NBR_SMALL];
NET_BUF_EXT NET_BUF_SMALL *NetBuf_SmallPoolPtr; /* Ptr to pool of free small net bufs. */
NET_BUF_EXT NET_STAT_POOL NetBuf_SmallPoolStat;
#endif
#if (NET_BUF_CFG_NBR_LARGE > 0) /* ---------------- LARGE NET BUFS ---------------- */
NET_BUF_EXT NET_BUF_LARGE NetBuf_LargeTbl[NET_BUF_CFG_NBR_LARGE];
NET_BUF_EXT NET_BUF_LARGE *NetBuf_LargePoolPtr; /* Ptr to pool of free large net bufs. */
NET_BUF_EXT NET_STAT_POOL NetBuf_LargePoolStat;
#endif
#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED) /* ----------------- NET BUF ERRS ----------------- */
NET_BUF_EXT NET_CTR NetBuf_ErrNoneAvailCtr; /* Nbr net buf unavail accesses. */
NET_BUF_EXT NET_CTR NetBuf_ErrInvalidTypeCtr; /* Nbr net buf invalid type accesses. */
NET_BUF_EXT NET_CTR NetBuf_ErrSizeCtr; /* Nbr net bufs with invalid size. */
NET_BUF_EXT NET_CTR NetBuf_ErrLenCtr; /* Nbr net bufs with invalid len. */
NET_BUF_EXT NET_CTR NetBuf_ErrLostCtr; /* Nbr net bufs lost/discarded. */
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
NET_BUF_EXT NET_CTR NetBuf_ErrNullPtrCtr; /* Nbr null net buf accesses. */
NET_BUF_EXT NET_CTR NetBuf_ErrNotUsedCtr; /* Nbr unused net buf accesses. */
NET_BUF_EXT NET_CTR NetBuf_ErrIxCtr; /* Nbr net bufs with invalid ix. */
#endif
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void NetBuf_Init (void);
/* --------- BUF ALLOCATION FNCTS --------- */
NET_BUF_SIZE NetBuf_GetMaxSize (NET_BUF *pbuf,
NET_BUF_SIZE ix_start);
NET_BUF *NetBuf_Get (NET_BUF_SIZE size,
NET_BUF_SIZE ix_start,
CPU_INT16U flags,
NET_ERR *perr);
void NetBuf_Free (NET_BUF *pbuf);
void NetBuf_FreeBuf (NET_BUF *pbuf,
NET_CTR *pctr);
void NetBuf_FreeBufList (NET_BUF *pbuf_list,
NET_CTR *pctr);
void NetBuf_FreeBufQ_PrimList (NET_BUF *pbuf_q,
NET_CTR *pctr);
void NetBuf_FreeBufQ_SecList (NET_BUF *pbuf_q,
NET_CTR *pctr,
CPU_FNCT_PTR pfnct_unlink);
/* ------------ BUF API FNCTS ------------- */
void NetBuf_DataRd (NET_BUF *pbuf,
NET_BUF_SIZE ix,
NET_BUF_SIZE len,
CPU_INT08U *pdest,
NET_ERR *perr);
void NetBuf_DataWr (NET_BUF *pbuf,
NET_BUF_SIZE ix,
NET_BUF_SIZE len,
CPU_INT08U *psrc,
NET_ERR *perr);
/* ----------- BUF STATUS FNCTS ----------- */
CPU_BOOLEAN NetBuf_IsUsed (NET_BUF *pbuf);
#if (NET_BUF_CFG_NBR_SMALL > 0)
NET_STAT_POOL NetBuf_SmallPoolStatGet (void);
void NetBuf_SmallPoolStatResetMaxUsed(void);
#endif
#if (NET_BUF_CFG_NBR_LARGE > 0)
NET_STAT_POOL NetBuf_LargePoolStatGet (void);
void NetBuf_LargePoolStatResetMaxUsed(void);
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* CONFIGURATION ERRORS
*********************************************************************************************************
*/
#ifndef NET_BUF_CFG_NBR_SMALL
#error "NET_BUF_CFG_NBR_SMALL not #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_NBR_SMALL MUST be >= 0]"
#error " [ && < 65536]"
/* See 'NETWORK BUFFER QUANTITY DATA TYPE'. */
#elif ((NET_BUF_CFG_NBR_SMALL < DEF_INT_16U_MIN_VAL) || \
(NET_BUF_CFG_NBR_SMALL > DEF_INT_16U_MAX_VAL))
#error "NET_BUF_CFG_NBR_SMALL illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_NBR_SMALL MUST be >= 0]"
#error " [ && < 65536]"
#elif (NET_BUF_CFG_NBR_SMALL > 0)
#ifndef NET_BUF_CFG_DATA_SIZE_SMALL
#error "NET_BUF_CFG_DATA_SIZE_SMALL not #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_SMALL MUST be >= NET_BUF_DATA_SIZE_MIN]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3a') ]"
#elif (NET_BUF_CFG_DATA_SIZE_SMALL < NET_BUF_DATA_SIZE_MIN)
#error "NET_BUF_CFG_DATA_SIZE_SMALL illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_SMALL MUST be >= NET_BUF_DATA_SIZE_MIN]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3a') ]"
#endif
#if 0 /* Alignment is NOT absolutely required. */
#if (((CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32) && \
((NET_BUF_CFG_DATA_SIZE_SMALL % CPU_WORD_SIZE_32) != 0)) || \
((CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16) && \
((NET_BUF_CFG_DATA_SIZE_SMALL % CPU_WORD_SIZE_16) != 0)))
#error "NET_BUF_CFG_DATA_SIZE_SMALL illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_SMALL SHOULD be an integer ]"
#error " [ multiple of 'CPU_ALIGN' word size ]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3c')]"
#endif
#endif
#endif
#ifndef NET_BUF_CFG_NBR_LARGE
#error "NET_BUF_CFG_NBR_LARGE not #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_NBR_LARGE MUST be >= 0]"
#error " [ && < 65536]"
/* See 'NETWORK BUFFER QUANTITY DATA TYPE'. */
#elif ((NET_BUF_CFG_NBR_LARGE < DEF_INT_16U_MIN_VAL) || \
(NET_BUF_CFG_NBR_LARGE > DEF_INT_16U_MAX_VAL))
#error "NET_BUF_CFG_NBR_LARGE illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_NBR_LARGE MUST be >= 0]"
#error " [ && < 65536]"
#elif (NET_BUF_CFG_NBR_LARGE > 0)
#ifndef NET_BUF_CFG_DATA_SIZE_LARGE
#error "NET_BUF_CFG_DATA_SIZE_LARGE not #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_LARGE MUST be >= NET_BUF_DATA_SIZE_MIN]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3a') ]"
#elif (NET_BUF_CFG_DATA_SIZE_LARGE < NET_BUF_DATA_SIZE_MIN)
#error "NET_BUF_CFG_DATA_SIZE_LARGE illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_LARGE MUST be >= NET_BUF_DATA_SIZE_MIN]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3a') ]"
#endif
#if 0 /* Alignment is NOT absolutely required. */
#if (((CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_32) && \
((NET_BUF_CFG_DATA_SIZE_LARGE % CPU_WORD_SIZE_32) != 0)) || \
((CPU_CFG_DATA_SIZE == CPU_WORD_SIZE_16) && \
((NET_BUF_CFG_DATA_SIZE_LARGE % CPU_WORD_SIZE_16) != 0)))
#error "NET_BUF_CFG_DATA_SIZE_LARGE illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_LARGE SHOULD be an integer ]"
#error " [ multiple of 'CPU_ALIGN' word size ]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3c')]"
#endif
#endif
#endif
/*$PAGE*/
#if ((NET_BUF_CFG_NBR_SMALL < 1) && \
(NET_BUF_CFG_NBR_LARGE < 1))
#error "NET_BUF_CFG_NBR_SMALL && "
#error "NET_BUF_CFG_NBR_LARGE illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_NBR_SMALL || ]"
#error " [NET_BUF_CFG_NBR_LARGE MUST be > 0]"
#endif
#if ((NET_BUF_CFG_NBR_SMALL > 0 ) && \
(NET_BUF_CFG_NBR_LARGE > 0 ) && \
(NET_BUF_CFG_DATA_SIZE_LARGE < NET_BUF_CFG_DATA_SIZE_SMALL))
#error "NET_BUF_CFG_DATA_SIZE_LARGE illegally #define'd in 'net_cfg.h' "
#error " [NET_BUF_CFG_DATA_SIZE_LARGE MUST be >= NET_BUF_CFG_DATA_SIZE_SMALL]"
#error " [(see 'net_buf.h NETWORK BUFFER DATA TYPE Note #3b') ]"
#endif