⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_sock.c

📁 AT91SAM7X256
💻 C
📖 第 1 页 / 共 5 页
字号:
*                               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 (see Note #4).
*
*               NET_SOCK_BSD_ERR_CLOSE, otherwise.
*
* Caller(s)   : close().
*
* Note(s)     : (3) NetSock_Close() blocked until network initialization completes; perform NO action.
*
*               (4) NO BSD socket error is returned for any internal error while closing the socket.
*
*               (5) Default case already invalidated in NetSock_Open().  However, the default case is
*                   included as an extra precaution in case 'SockType' is incorrectly modified.
*********************************************************************************************************
*/
/*$PAGE*/
NET_SOCK_RTN_CODE  NetSock_Close (NET_SOCK_ID   sock_id,
                                  NET_ERR      *perr)
{
#if ((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;
#endif
    NET_SOCK           *psock;
    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_CLOSE);
    }
    if (sock_id > NET_SOCK_ID_MAX) {
        NET_CTR_ERR_INC(NetSock_ErrInvalidSockCtr);
       *perr =  NET_SOCK_ERR_INVALID_SOCK;
        return (NET_SOCK_BSD_ERR_CLOSE);
    }
#endif


                                                                /* ----------------- ACQUIRE NET LOCK ----------------- */
    NetOS_Lock(perr);
    if (*perr != NET_OS_ERR_NONE) {
         return (NET_SOCK_BSD_ERR_CLOSE);
    }

#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
    if (Net_InitDone != DEF_YES) {                              /* If init NOT complete, exit (see Note #3).            */
        NetOS_Unlock();
       *perr =  NET_ERR_INIT_INCOMPLETE;
        return (NET_SOCK_BSD_ERR_CLOSE);
    }
#endif


    psock = &NetSock_Tbl[sock_id];

#if (NET_ERR_CFG_ARG_CHK_EXT_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);
        NetOS_Unlock();
       *perr =  NET_SOCK_ERR_NOT_USED;
        return (NET_SOCK_BSD_ERR_CLOSE);
    }
#endif
                                                                /* ------------- VALIDATE SOCK CONN STATE ------------- */
    switch (psock->State) {
        case NET_SOCK_STATE_FREE:
        case NET_SOCK_STATE_DISCARD:
             NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_NOT_USED;
             return (NET_SOCK_BSD_ERR_CLOSE);                   /* Prevent 'break NOT reachable' compiler warning.      */


        case NET_SOCK_STATE_CLOSED:                             /* If CLOSED from init open  ...                        */
        case NET_SOCK_STATE_CLOSED_FAULT:                       /* ... OR internal fault(s), ...                        */
             NetSock_Free(psock);                               /* ... sock need ONLY be freed.                         */
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_CLOSED;                       /* Rtn net sock err but rtn NO BSD err (see Note #4).   */
             return (NET_SOCK_BSD_ERR_NONE);                    /* Prevent 'break NOT reachable' compiler warning.      */


        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:
             break;

             
        case NET_SOCK_STATE_NONE:
        default:
             NetSock_CloseSockFromClose(psock);
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_INVALID_STATE;                /* Rtn net sock err but rtn NO BSD err (see Note #4).   */
             return (NET_SOCK_BSD_ERR_NONE);                    /* Prevent 'break NOT reachable' compiler warning.      */
    }


/*$PAGE*/
                                                                /* -------------------- CLOSE SOCK -------------------- */
    switch (psock->SockType) {
        case NET_SOCK_TYPE_DATAGRAM:
             NetSock_CloseHandler(psock, DEF_YES, DEF_YES);
             rtn_code = NET_SOCK_BSD_ERR_NONE;
             break;


#if (NET_SOCK_CFG_TYPE_STREAM_EN == DEF_ENABLED)
        case NET_SOCK_TYPE_STREAM:
             rtn_code = NetSock_CloseHandlerStream(sock_id, psock, perr);
             break;
#endif

        case NET_SOCK_TYPE_NONE:
        default:                                                /* See Note #5.                                         */
             NetSock_CloseSockFromClose(psock);
             NET_CTR_ERR_INC(NetSock_ErrInvalidSockTypeCtr);
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_INVALID_TYPE;                 /* Rtn net sock err but rtn NO BSD err (see Note #4).   */
             return (NET_SOCK_BSD_ERR_NONE);                    /* Prevent 'break NOT reachable' compiler warning.      */
    }


                                                                /* ----------------- RELEASE NET LOCK ----------------- */
    NetOS_Unlock();


   *perr =  NET_SOCK_ERR_NONE;

    return (rtn_code);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                       NetSock_CloseFromConn()
*
* Description : Close a socket via a network connection.
*
*               (1) When a network connection closes a socket, the socket :
*
*                   (a) (1) Closes NO other network connection(s),
*                       (2) MUST NOT recursively re-close other network connection(s);
*
*                   (b) SHOULD clear network connection(s)' handle identifiers.
*
*                   See also             'NetSock_CloseSockHandler()  Note #2a',
*                            'net_tcp.c   NetTCP_ConnCloseFromConn()  Note #1',
*                          & 'net_conn.c  NetConn_CloseFromApp()      Note #1b'.
*
*               (2) Closes socket but does NOT free the socket since NO mechanism or API exists to close
*                   an application's reference to the socket.
*
*                   See also 'NetSock_CloseSock()  Note #2b'.
*
*
* Argument(s) : sock_id     Socket descriptor/handle identifier of socket to close.
*
*               conn_id     Handle identifier of closing network connection.
*
* Return(s)   : none.
*
* Caller(s)   : NetConn_CloseApp().
*
* Note(s)     : none.
*********************************************************************************************************
*/
/*$PAGE*/
void  NetSock_CloseFromConn (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_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().
*
* 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 #4b1A'.
*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -