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

📄 net_if.c

📁 嵌入式的tcpip协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
    CPU_SR        cpu_sr;
#endif
    NET_BUF_HDR  *pbuf_hdr;


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


#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)                 /* ------------------- VALIDATE PTR ------------------- */
    if (pbuf == (NET_BUF *)0) {
        NetIF_TxPktDiscard(pbuf, perr);
        NET_CTR_ERR_INC(NetIF_ErrNullPtrCtr);
        return;
    }
#endif


                                                                /* ----------------- VALIDATE IF PKT ------------------ */
    pbuf_hdr = &pbuf->Hdr;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
    NetIF_TxPktValidate(pbuf, pbuf_hdr, perr);
    switch (*perr) {
        case NET_IF_ERR_NONE:
             break;


        case NET_ERR_INVALID_PROTOCOL:
        case NET_BUF_ERR_INVALID_IX:
        case NET_IF_ERR_INVALID_LEN_DATA:
        default:
             NetIF_TxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }
#endif


/*$PAGE*/
                                                                /* ----------------- PREPARE TX FRAME ----------------- */
    NetIF_TxPktPrepareFrame(pbuf, pbuf_hdr, perr);              /* Prepare Ethernet frame.                              */
    switch (*perr) {
        case NET_IF_ERR_TX_BROADCAST:
             break;


        case NET_IF_ERR_TX_ARP:
             NetARP_CacheHandler(pbuf, perr);                   /* Bind dest hw addr & transmit data pkt.               */
             break;


        case NET_ERR_INVALID_PROTOCOL:
        case NET_BUF_ERR_INVALID_IX:
        case NET_BUF_ERR_INVALID_LEN:
        default:
             NetIF_TxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }


                                                                /* -------------------- TX IF PKTS -------------------- */
    switch (*perr) {                                            /* Chk err from ...                                     */
        case NET_IF_ERR_TX_BROADCAST:                           /* ... NetIF_TxPktPrepareFrame().                       */
        case NET_ARP_ERR_CACHE_RESOLVED:                        /* ... NetARP_CacheHandler().                           */
             NetIF_TxPktHandler(pbuf);
            *perr = NET_IF_ERR_NONE;
             break;


        case NET_ARP_ERR_CACHE_PEND:
            *perr = NET_IF_ERR_NONE;
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */


        case NET_ARP_ERR_NULL_PTR:
        case NET_ARP_ERR_CACHE_NONE_AVAIL:
        case NET_ARP_ERR_CACHE_INVALID_TYPE:
        case NET_TMR_ERR_NULL_OBJ:
        case NET_TMR_ERR_NULL_FNCT:
        case NET_TMR_ERR_NONE_AVAIL:
        case NET_TMR_ERR_INVALID_TYPE:
        default:
             NetIF_TxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                            NetIF_TxPkt()
*
* Description : (1) Transmit data packet to packet-based network interface layer :
*
*                   (a) Transmit data packet
*                   (b) Update transmit statistics
*
*
* Argument(s) : pbuf        Pointer to network buffer with data packet to transmit.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IF_ERR_NONE                 Packet buffer(s) transmitted to driver.
*                               NET_ERR_TX                      Transmit error (see Note #2); packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_TxPktHandler(),
*               NetARP_CacheTxPktHandler().
*
*               This function is a network protocol suite to network interface (IF) function & SHOULD be 
*               called only by appropriate network interface function(s).
*
* Note(s)     : (2) Since the network interface layer & the packet interface layer return the same error
*                   codes, error code(s) do NOT need to be re-cast.
*
*               (3) Network buffer already freed by lower layer; only increment error counter.
*********************************************************************************************************
*/

void  NetIF_TxPkt (NET_BUF  *pbuf,
                   NET_ERR  *perr)
{
#if (((NET_CTR_CFG_STAT_EN     == DEF_ENABLED)                    || \
      (NET_CTR_CFG_ERR_EN      == DEF_ENABLED))                   && \
      (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR  cpu_sr;
#endif


                                                                /* --------------------- TX PKT ----------------------- */
    NetIF_Pkt_Tx(pbuf, perr);                                   /* Tx pkt to pkt IF.                                    */


                                                                /* ----------------- UPDATE TX STATS ------------------ */
    switch (*perr) {                                            /* See Note #2.                                         */
        case NET_IF_ERR_NONE:
             NET_CTR_STAT_INC(NetIF_StatTxPktCtr);
             break;


        case NET_ERR_INIT_INCOMPLETE:
        case NET_ERR_TX:
        default:
             NET_CTR_ERR_INC(NetIF_ErrTxPktDiscardedCtr);       /* See Note #3.                                         */
            *perr = NET_ERR_TX;
             break;
    }
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                        NetIF_TxPktDiscard()
*
* Description : On any transmit handler errors, discard packet & buffer.
*
* Argument(s) : pbuf        Pointer to network buffer.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_ERR_TX                      Transmit error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_Tx(),
*               NetARP_CacheFree().
*
*               This function is a network protocol suite to network interface (IF) function & SHOULD be 
*               called only by appropriate network interface function(s).
*
* Note(s)     : none.
*********************************************************************************************************
*/

void  NetIF_TxPktDiscard (NET_BUF  *pbuf,
                          NET_ERR  *perr)
{
    NET_CTR  *pctr;


#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED)
    pctr = (NET_CTR *)&NetIF_ErrTxPktDiscardedCtr;
#else
    pctr = (NET_CTR *) 0;
#endif
    NetBuf_FreeBuf((NET_BUF *)pbuf,
                   (NET_CTR *)pctr);

   *perr = NET_ERR_TX;
}


/*$PAGE*/
/*
*********************************************************************************************************
*********************************************************************************************************
*                                           LOCAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                      NetIF_RxPktValidateBuf()
*
* Description : Validate received buffer header as IF protocol.
*
* Argument(s) : pbuf_hdr    Pointer to network buffer header that received IF packet.
*               --------    Argument validated in NetIF_Rx().
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IF_ERR_NONE                 Received buffer's IF header validated.
*                               NET_ERR_INVALID_PROTOCOL        Buffer's protocol type is NOT IF.
*                               NET_BUF_ERR_INVALID_IX          Invalid buffer index.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_Rx().
*
* Note(s)     : none.
*********************************************************************************************************
*/

#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
static  void  NetIF_RxPktValidateBuf (NET_BUF_HDR  *pbuf_hdr,
                                      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

                                                                /* ---------------- VALIDATE IP BUF HDR --------------- */
    if (pbuf_hdr->ProtocolHdrType != NET_PROTOCOL_TYPE_FRAME) {
        NET_CTR_ERR_INC(Net_ErrInvalidProtocolCtr);
       *perr = NET_ERR_INVALID_PROTOCOL;
        return;
    }

    if (pbuf_hdr->IF_HdrIx == NET_BUF_IX_NONE) {
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidBufIxCtr);
       *perr = NET_BUF_ERR_INVALID_IX;
        return;
    }

   *perr = NET_IF_ERR_NONE;
}
#endif


/*$PAGE*/
/*
*********************************************************************************************************
*                                       NetIF_RxPktFrameDemux()
*
* Description : (1) Validate received packet frame & demultiplex to appropriate queue :
*
*                   (a) Validate destination address :
*                       (1) Check for broadcast address                 See RFC #1122, Section 2.4
*                       (2) Check for this host's hardware address
*                   (b) Validate source address                         See 'NetIF_IsValidAddrSrc()  Note #1'
*                   (c) Demultiplex & validate frame :
*                       (1) Ethernet   frame type 
*                       (2) IEEE 802.3 frame length
*                   (d) Demultiplex packet to appropriate queue :
*                       (1) IP  receive queue
*                       (2) ARP receive queue
*
*
* Argument(s) : pbuf        Pointer to network buffer that received data packet.
*               ----        Argument validated in NetIF_Rx().
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IF_ERR_INVALID_ADDR_DEST        Invalid destination address.
*                               NET_IF_ERR_INVALID_ADDR_SRC         Invalid source      address.
*                               NET_ERR_INVALID_PROTOCOL            Invalid network protocol.
*
*                                                                   -- RETURNED BY NetIF_RxPktFrameDemuxEther() : --
*                               NET_IF_ERR_INVALID_ETHER_TYPE       Invalid Ethernet Frame Type value.
*
*                                                                   - RETURNED BY NetIF_RxPktFrameDemuxIEEE802() : -
*                               NET_IF_ERR_INVALID_LEN_FRAME        Invalid IEEE 802.3 frame length.
*                               NET_IF_ERR_INVALID_LLC_DSAP         Invalid IEEE 802.2 LLC  DSAP    value.
*                               NET_IF_ERR_INVALID_LLC_SSAP         Invalid IEEE 802.2 LLC  SSAP    value.
*                               NET_IF_ERR_INVALID_LLC_CTRL         Invalid IEEE 802.2 LLC  Control value.
*                               NET_IF_ERR_INVALID_SNAP_CODE        Invalid IEEE 802.2 SNAP OUI     value.
*                               NET_IF_ERR_INVALID_SNAP_TYPE        Invalid IEEE 802.2 SNAP Type    value.
*
*                                                                   ----------- RETURNED BY NetARP_Rx() : ----------
*                               NET_ARP_ERR_NONE                    ARP message successfully demultiplexed.
*
*                                                                   ----------- RETURNED BY NetIP_Rx() : -----------
*                               NET_IP_ERR_NONE                     IP datagram successfully demultiplexed.
*
*
*                               NET_ERR_INIT_INCOMPLETE             Network initialization NOT complete.
*                               NET_ERR_RX                          Receive error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_Rx().
*
* Note(s)     : (2) When network buffer is demultiplexed to higher-layer protocol receive, the buffer's reference 
*                   counter is NOT incremented since the network interface layer does NOT maintain a reference to
*                   the buffer.
*********************************************************************************************************
*/
/*$PAGE*/

⌨️ 快捷键说明

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