📄 net_sock.c
字号:
}
#endif
psock = &NetSock_Tbl[sock_id];
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
/* ---------------- VALIDATE SOCK USED ---------------- */
used = DEF_BIT_IS_SET(psock->Flags, NET_SOCK_FLAG_USED);
if (used != DEF_YES) {
NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
return;
}
/* ------------- VALIDATE SOCK CONN STATE ------------- */
switch (psock->State) {
case NET_SOCK_STATE_FREE:
case NET_SOCK_STATE_DISCARD:
NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
return; /* Prevent 'break NOT reachable' compiler warning. */
case NET_SOCK_STATE_CLOSED_FAULT:
return; /* Prevent 'break NOT reachable' compiler warning. */
case NET_SOCK_STATE_NONE:
case NET_SOCK_STATE_CLOSED:
case NET_SOCK_STATE_BOUND:
case NET_SOCK_STATE_LISTEN:
case NET_SOCK_STATE_CONN:
case NET_SOCK_STATE_CONN_IN_PROGRESS:
case NET_SOCK_STATE_CONN_DONE:
case NET_SOCK_STATE_CLOSE_IN_PROGRESS:
case NET_SOCK_STATE_CLOSING_DATA_AVAIL:
default:
break;
}
#endif
/* -------------------- CLOSE SOCK -------------------- */
NetSock_CloseSock((NET_SOCK *)psock,
(CPU_BOOLEAN)DEF_YES, /* See Note #1b. */
(CPU_BOOLEAN)DEF_NO); /* See Note #1a. */
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetSock_FreeConnFromSock()
*
* Description : (1) Free/de-reference network connection from socket :
*
* (a) Remove connection handle identifier from socket's connection accept queue
*
*
* Argument(s) : sock_id Socket descriptor/handle identifier of socket to free network connection.
*
* conn_id Handle identifier of network connection.
*
* Return(s) : none.
*
* Caller(s) : NetSock_CloseConnFree(),
* NetConn_CloseApp().
*
* This function is an INTERNAL network protocol suite function & MUST NOT be called by
* application function(s).
*
* Note(s) : (2) (a) When a network connection is fully connected/established, it is queued to an
* application connection as a cloned network connection until the connection is
* accepted & a new application connection is created.
*
* See also 'net_tcp.c NetTCP_RxPktConnHandlerListen() Note #5a2A1'.
*
* (b) Therefore, network connections need only be de-referenced from cloned socket
* application connections.
*********************************************************************************************************
*/
/*$PAGE*/
void NetSock_FreeConnFromSock (NET_SOCK_ID sock_id,
NET_CONN_ID conn_id)
{
#if ((NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED) && \
(NET_CTR_CFG_ERR_EN == DEF_ENABLED) && \
(CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
CPU_SR cpu_sr;
#endif
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
CPU_BOOLEAN used;
#endif
NET_SOCK *psock;
/* ------------------ VALIDATE SOCK ------------------- */
if (sock_id == NET_SOCK_ID_NONE) {
return;
}
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
if (sock_id < NET_SOCK_ID_MIN) {
NET_CTR_ERR_INC(NetSock_ErrInvalidSockCtr);
return;
}
if (sock_id > NET_SOCK_ID_MAX) {
NET_CTR_ERR_INC(NetSock_ErrInvalidSockCtr);
return;
}
#endif
psock = &NetSock_Tbl[sock_id];
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
/* ---------------- VALIDATE SOCK USED ---------------- */
used = DEF_BIT_IS_SET(psock->Flags, NET_SOCK_FLAG_USED);
if (used != DEF_YES) {
NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
return;
}
/* ------------- VALIDATE SOCK CONN STATE ------------- */
switch (psock->State) {
case NET_SOCK_STATE_FREE:
case NET_SOCK_STATE_DISCARD:
NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
return; /* Prevent 'break NOT reachable' compiler warning. */
case NET_SOCK_STATE_CLOSED_FAULT:
return; /* Prevent 'break NOT reachable' compiler warning. */
case NET_SOCK_STATE_NONE:
case NET_SOCK_STATE_CLOSED:
case NET_SOCK_STATE_CLOSE_IN_PROGRESS:
case NET_SOCK_STATE_CLOSING_DATA_AVAIL:
case NET_SOCK_STATE_LISTEN:
case NET_SOCK_STATE_BOUND:
case NET_SOCK_STATE_CONN:
case NET_SOCK_STATE_CONN_IN_PROGRESS:
case NET_SOCK_STATE_CONN_DONE:
default:
break;
}
#endif
/* --------------- FREE/DE-REF CONN ID ---------------- */
#if (NET_SOCK_CFG_TYPE_STREAM_EN == DEF_ENABLED)
NetSock_ConnAcceptQ_ConnID_Remove(psock, conn_id);
#endif
(void)&psock; /* Prevent possible compiler warnings. */
(void)&conn_id;
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetSock_Bind()
*
* Description : (1) Bind a socket to a local address :
*
* (a) Validate socket handle identifier
* (b) Acquire network lock
* (c) Validate socket
* (d) Bind socket to a local address
* (e) Release network lock
*
*
* Argument(s) : sock_id Socket descriptor/handle identifier of socket to bind to a local address.
*
* paddr_local Pointer to socket address structure (see Note #3).
*
* addr_len Length of socket address structure (in octets).
*
* perr Pointer to variable that will receive the return error code from this function :
*
* NET_ERR_INIT_INCOMPLETE Network initialization NOT complete.
* NET_SOCK_ERR_INVALID_SOCK Invalid socket number.
* NET_SOCK_ERR_NOT_USED Socket NOT currently used.
*
* --- RETURNED BY NetSock_BindHandler() : ---
* NET_SOCK_ERR_NONE Socket successfully bound to local address.
* NET_SOCK_ERR_CLOSED Socket already closed.
* NET_SOCK_ERR_INVALID_FAMILY Invalid socket protocol family.
* NET_SOCK_ERR_INVALID_PROTOCOL Invalid socket protocol.
* NET_SOCK_ERR_INVALID_TYPE Invalid socket type.
* NET_SOCK_ERR_INVALID_STATE Invalid socket state.
* NET_SOCK_ERR_INVALID_OP Invalid socket operation.
* NET_SOCK_ERR_INVALID_ADDR Invalid local address.
* NET_SOCK_ERR_ADDR_IN_USE Local address already in use.
* NET_SOCK_ERR_PORT_NBR_NONE_AVAIL Port number NOT available.
* NET_SOCK_ERR_CONN_FAIL Socket connection operation(s) failed.
*
* NET_CONN_ERR_NULL_PTR Argument(s) passed a NULL pointer.
* NET_CONN_ERR_NONE_AVAIL NO available connections to allocate.
* NET_CONN_ERR_NOT_USED Connection(s) NOT currently used.
* NET_CONN_ERR_INVALID_CONN Invalid connection number.
* NET_CONN_ERR_INVALID_FAMILY Invalid connection family.
* NET_CONN_ERR_INVALID_TYPE Invalid connection type.
* NET_CONN_ERR_INVALID_LIST_IX Invalid connection list index.
* NET_CONN_ERR_INVALID_ADDR_LEN Invalid connection address length.
* NET_CONN_ERR_ADDR_IN_USE Connection address already in use.
* NET_CONN_ERR_ADDR_NOT_USED Connection address NOT in use.
*
* ------- RETURNED BY NetOS_Lock() : --------
* NET_OS_ERR_LOCK Network access NOT acquired.
*
* Return(s) : NET_SOCK_BSD_ERR_NONE, if NO errors.
*
* NET_SOCK_BSD_ERR_BIND, otherwise.
*
* Caller(s) : bind().
*
* This function is a network protocol suite application interface (API) function & MAY be
* called by application function(s).
*
* Note(s) : (2) NetSock_Bind() blocked until network initialization completes; perform NO action.
*
* (3) (a) Socket address structure 'Family' member MUST be configured in host-order & MUST
* NOT be converted to/from network-order.
*
* (b) Socket address structure addresses MUST be configured/converted from host-order
* to network-order.
*
* See also 'net_sock.h NETWORK SOCKET ADDRESS DATA TYPES Note #2'.
*********************************************************************************************************
*/
/*$PAGE*/
NET_SOCK_RTN_CODE NetSock_Bind (NET_SOCK_ID sock_id,
NET_SOCK_ADDR *paddr_local,
NET_SOCK_ADDR_LEN addr_len,
NET_ERR *perr)
{
#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) && \
(NET_CTR_CFG_ERR_EN == DEF_ENABLED) && \
(CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
CPU_SR cpu_sr;
#endif
#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
CPU_BOOLEAN used;
NET_SOCK *psock;
#endif
NET_SOCK_RTN_CODE rtn_code;
#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
/* ----------------- VALIDATE SOCK ID ----------------- */
if (sock_id < NET_SOCK_ID_MIN) {
NET_CTR_ERR_INC(NetSock_ErrInvalidSockCtr);
*perr = NET_SOCK_ERR_INVALID_SOCK;
return (NET_SOCK_BSD_ERR_BIND);
}
if (sock_id > NET_SOCK_ID_MAX) {
NET_CTR_ERR_INC(NetSock_ErrInvalidSockCtr);
*perr = NET_SOCK_ERR_INVALID_SOCK;
return (NET_SOCK_BSD_ERR_BIND);
}
#endif
/* ----------------- ACQUIRE NET LOCK ----------------- */
NetOS_Lock(perr);
if (*perr != NET_OS_ERR_NONE) {
return (NET_SOCK_BSD_ERR_BIND);
}
#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
if (Net_InitDone != DEF_YES) { /* If init NOT complete, exit (see Note #2). */
NetOS_Unlock();
*perr = NET_ERR_INIT_INCOMPLETE;
return (NET_SOCK_BSD_ERR_BIND);
}
/* ---------------- VALIDATE SOCK USED ---------------- */
psock = &NetSock_Tbl[sock_id];
used = DEF_BIT_IS_SE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -