📄 net_conn.c
字号:
/*
*********************************************************************************************************
* uC/TCP-IP
* The Embedded TCP/IP Suite
*
* (c) Copyright 2003-2006; 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 CONNECTION MANAGEMENT
*
* Filename : net_conn.c
* Version : V1.87
* Programmer(s) : ITJ
*********************************************************************************************************
* Note(s) : (1) Supports network connections for local & remote addresses of the following :
*
* (a) Families :
* (1) IPv4 Connections
* (A) BSD 4.x Sockets
*
* (b) Connection types :
* (1) Datagram
* (2) Stream
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define NET_CONN_MODULE
#include <net.h>
/*
*********************************************************************************************************
* MODULE
*
* Note(s) : (1) See 'net_conn.h MODULE'.
*********************************************************************************************************
*/
#ifdef NET_CONN_MODULE_PRESENT
/*$PAGE*/
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL CONSTANTS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL TABLES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
/*$PAGE*/
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void NetConn_Close (NET_CONN *pconn);
static void NetConn_CloseApp (NET_CONN *pconn);
static void NetConn_CloseTransport (NET_CONN *pconn);
static void NetConn_CloseAllConnListConns (NET_CONN **pconn_list);
static void NetConn_FreeHandler (NET_CONN *pconn);
static void NetConn_Clr (NET_CONN *pconn);
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
static void NetConn_Discard (NET_CONN *pconn);
#endif
static NET_CONN *NetConn_ListSrch (NET_CONN **pconn_list,
NET_CONN_LIST_TYPE conn_list_type,
CPU_BOOLEAN sec_srch_addr_reqd,
CPU_INT08U *paddr_local,
CPU_INT08U *paddr_remote);
static void NetConn_ChainInsert (NET_CONN **pconn_list,
NET_CONN *pconn_chain);
static void NetConn_ChainUnlink (NET_CONN **pconn_list,
NET_CONN *pconn_chain);
static void NetConn_Add (NET_CONN **pconn_list,
NET_CONN *pconn_chain,
NET_CONN *pconn,
NET_CONN_LIST_TYPE conn_list_type);
static void NetConn_Unlink (NET_CONN *pconn);
/*
*********************************************************************************************************
* LOCAL CONFIGURATION ERRORS
*********************************************************************************************************
*/
/*$PAGE*/
/*
*********************************************************************************************************
* NetConn_Init()
*
* Description : (1) Initialize Network Connection Management Module :
*
* (a) Initialize network connection pool
* (b) Initialize network connection table
* (c) Initialize network connection lists
* (d) Initialize network connection wildcard address(s)
* (e) Initialize network connection statistics & error counters
*
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : Net_Init().
*
* This function is an INTERNAL network protocol suite function & MUST NOT be called by
* application function(s).
*
* Note(s) : (2) Network connection pool MUST be initialized PRIOR to initializing the pool with
* pointers to network connections.
*
* (3) Network connection addresses maintained in network-order. Therefore, network
* connection wildcard address(es) MUST be configured in network-order.
*
* (4) Ideally, network connection address configuration comparison(s) would be calculated
* at compile-time. However, some compilers do NOT allow pre-processor directives to
* include run-time macro's -- e.g. 'sizeof()'.
*********************************************************************************************************
*/
/*$PAGE*/
void NetConn_Init (void)
{
NET_CONN *pconn;
NET_CONN **pconn_list;
NET_CONN_QTY i;
NET_CONN_LIST_QTY j;
CPU_INT16U k;
CPU_INT16U ix;
CPU_INT16U val_len;
CPU_INT08U val;
NET_ERR stat_err;
/* ------------- INIT NET CONN POOL/STATS ------------- */
NetConn_PoolPtr = (NET_CONN *)0; /* See Note #2. */
NetStat_PoolInit((NET_STAT_POOL *)&NetConn_PoolStat,
(NET_STAT_POOL_QTY) NET_CONN_CFG_NBR_CONN,
(NET_ERR *)&stat_err);
/* ---------------- INIT NET CONN TBL ----------------- */
pconn = &NetConn_Tbl[0];
for (i = 0; i < NET_CONN_CFG_NBR_CONN; i++) {
pconn->Type = NET_CONN_TYPE_CONN; /* Init each net conn type/id--NEVER modify. */
pconn->ID = (NET_CONN_ID)i;
pconn->Flags = NET_CONN_FLAG_NONE; /* Init each net conn as NOT used. */
#if (NET_DBG_CFG_MEM_CLR_EN == DEF_ENABLED)
NetConn_Clr(pconn);
#endif
pconn->NextConnPtr = (void *)NetConn_PoolPtr; /* Free each net conn to net conn pool (see Note #2). */
NetConn_PoolPtr = (NET_CONN *)pconn;
pconn++;
}
/* --------------- INIT NET CONN LISTS ---------------- */
/* Init net conn lists. */
pconn_list = &NetConn_ServerConnListHead[0];
for (j = 0; j < NET_CONN_CFG_PROTOCOL_MAX; j++) {
*pconn_list = (NET_CONN *)0;
pconn_list++;
}
pconn_list = &NetConn_ClientConnListHead[0];
for (j = 0; j < NET_CONN_CFG_PROTOCOL_MAX; j++) {
*pconn_list = (NET_CONN *)0;
pconn_list++;
}
/* Init net conn list ptrs. */
NetConn_ConnListChainPtr = (NET_CONN *)0;
NetConn_ConnListConnPtr = (NET_CONN *)0;
NetConn_ConnListNextChainPtr = (NET_CONN *)0;
NetConn_ConnListNextConnPtr = (NET_CONN *)0;
/*$PAGE*/
/* ----------- INIT NET CONN WILDCARD ADDRS ----------- */
/* See Note #3. */
Mem_Clr((void *)&NetConn_AddrWildCard[0],
(CPU_SIZE_T) NET_CONN_CFG_ADDR_LEN);
#if (NET_CONN_CFG_FAMILY == NET_CONN_FAMILY_IP_V4_SOCK)
if (NET_CONN_ADDR_IP_LEN_ADDR <= NET_CONN_CFG_ADDR_LEN) { /* See Note #4. */
NetConn_AddrWildCardAvail = DEF_YES;
val_len = NET_CONN_ADDR_IP_LEN_ADDR;
for (k = 0; k < val_len; k++) {
val = (NET_CONN_ADDR_IP_WILD_CARD >> (k * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
ix = val_len - k - 1;
NetConn_AddrWildCard[ix] = val;
}
} else {
NetConn_AddrWildCardAvail = DEF_NO;
}
#else
NetConn_AddrWildCardAvail = DEF_NO;
(void)&k; /* Prevent compiler warnings. */
(void)&ix;
(void)&val;
(void)&val_len;
#endif
/* ---------- INIT NET CONN STAT & ERR CTRS ----------- */
#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED)
NetConn_ErrNoneAvailCtr = 0;
NetConn_ErrNotUsedCtr = 0;
NetConn_ErrCloseCtr = 0;
NetConn_ErrInvalidConnCtr = 0;
NetConn_ErrInvalidConnAddrLenCtr = 0;
NetConn_ErrInvalidConnAddrInUseCtr = 0;
NetConn_ErrInvalidFamilyCtr = 0;
NetConn_ErrInvalidListTypeCtr = 0;
NetConn_ErrInvalidListIxCtr = 0;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -