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

📄 net_if.c

📁 从Luminary官方网站下载的LM3S6000系列的UCos+Tcp/IP的源码, 经本人稍微修改后可直接在IAR6.2下编译通过,里面包括了LM3S6000系列的所有外设UART, PWn....
💻 C
📖 第 1 页 / 共 5 页
字号:


        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().
*
* 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().
*
* 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*/
static  void  NetIF_RxPktFrameDemux (NET_BUF      *pbuf,
                                     NET_BUF_HDR  *pbuf_hdr,
                                     NET_IF_HDR   *pif_hdr,
                                     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
#if (NET_IF_CFG_ADDR_FLTR_EN == DEF_ENABLED)
    CPU_BOOLEAN  dest_this_host;
    CPU_BOOLEAN  valid;
#endif
    CPU_BOOLEAN  dest_broadcast;
    CPU_INT16U   frame_type_len;


                                                                /* ---------------- VALIDATE DEST ADDR ---------------- */
    dest_broadcast = Mem_Cmp((void     *)&pif_hdr->AddrDest[0],
                             (void     *)&NetIF_AddrBroadcast[0],
                             (CPU_SIZE_T) NET_IF_ADDR_SIZE);
    if (dest_broadcast == DEF_YES) {
        NET_CTR_STAT_INC(NetIF_StatRxPktBroadcastCtr);
        DEF_BIT_SET(pbuf_hdr->Flags, NET_BUF_FLAG_BROADCAST_RX);/* Flag rx'd broadcast pkt (see Note #1a1).             */

    } else {
#if (NET_IF_CFG_ADDR_FLTR_EN == DEF_ENABLED)
        dest_this_host = Mem_Cmp((void     *)&pif_hdr->AddrDest[0],
                                 (void     *)&NetIF_MAC_Addr[0],
                                 (CPU_SIZE_T) NET_IF_ADDR_SIZE);
        if (dest_this_host != DEF_YES) {                        /* Discard invalid dest addr (see Note #1a2).           */
            NET_CTR_ERR_INC(NetIF_ErrRxInvalidAddrDestCtr);
           *perr = NET_IF_ERR_INVALID_ADDR_DEST;
            return;
        }

⌨️ 快捷键说明

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