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

📄 net_if.c

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


#if (NET_IF_CFG_ADDR_FLTR_EN == DEF_ENABLED)
                                                                /* ---------------- VALIDATE SRC  ADDR ---------------- */
    valid = NetIF_IsValidAddrSrc(&pif_hdr->AddrSrc[0]);

    if (valid != DEF_YES) {                                     /* Discard invalid src addr (see Note #1b).             */
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidAddrSrcCtr);
       *perr = NET_IF_ERR_INVALID_ADDR_SRC;
        return;
    }
#endif


/*$PAGE*/
                                                                /* --------------- DEMUX/VALIDATE FRAME --------------- */
    frame_type_len = NET_UTIL_VAL_GET_NET_16(&pif_hdr->FrameType_Len);
    if (frame_type_len <= NET_IF_IEEE_802_FRAME_LEN_MAX) {
        NetIF_RxPktFrameDemuxIEEE802(pbuf_hdr, pif_hdr, perr);
    } else {
        NetIF_RxPktFrameDemuxEther(pbuf_hdr, pif_hdr, perr);
    }


                                                                /* -------------------- DEMUX PKT --------------------- */
    switch (*perr) {                                            /* See Note #2.                                         */
        case NET_IF_ERR_NONE:
             switch (pbuf_hdr->ProtocolHdrType) {               /* Demux buf to appropriate protocol Q.                 */
                 case NET_PROTOCOL_TYPE_ARP:
                      NetARP_Rx(pbuf, perr);
                      break;


                 case NET_PROTOCOL_TYPE_IP:
                      NetIP_Rx(pbuf, perr);
                      break;


                 case NET_PROTOCOL_TYPE_NONE:
                 default:
                      NET_CTR_ERR_INC(NetIF_ErrInvalidProtocolCtr);
                     *perr = NET_ERR_INVALID_PROTOCOL;
                      return;                                   /* Prevent 'break NOT reachable' compiler warning.      */
             }
             break;


        case NET_IF_ERR_INVALID_ETHER_TYPE:
        case NET_IF_ERR_INVALID_LEN_FRAME:
        case NET_IF_ERR_INVALID_LLC_DSAP:
        case NET_IF_ERR_INVALID_LLC_SSAP:
        case NET_IF_ERR_INVALID_LLC_CTRL:
        case NET_IF_ERR_INVALID_SNAP_CODE:
        case NET_IF_ERR_INVALID_SNAP_TYPE:
        default:
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                    NetIF_RxPktFrameDemuxEther()
*
* Description : (1) Validate & demultiplex Ethernet packet frame :
*
*                   (a) Validate & demultiplex Ethernet packet frame
*                   (b) Update buffer controls
*
*
* Argument(s) : pbuf_hdr    Pointer to received packet frame's network buffer header.
*               --------    Argument validated in NetIF_RxPktFrameDemux().
*
*               pif_hdr     Pointer to          packet frame header.
*               -------     Argument validated in NetIF_RxPktFrameDemux().
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IF_ERR_NONE                     Valid Ethernet packet frame.
*                               NET_IF_ERR_INVALID_ETHER_TYPE       Invalid Ethernet Frame Type value.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_RxPktFrameDemux().
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  NetIF_RxPktFrameDemuxEther (NET_BUF_HDR  *pbuf_hdr,
                                          NET_IF_HDR   *pif_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
    NET_IF_HDR_ETHER  *pif_hdr_ether;
    CPU_INT16U         frame_type;
    CPU_INT16U         ix;


    pif_hdr_ether = (NET_IF_HDR_ETHER *)pif_hdr;

                                                                /* --------------- VALIDATE/DEMUX FRAME --------------- */
    frame_type    =  NET_UTIL_VAL_GET_NET_16(&pif_hdr_ether->FrameType);
    ix            =  NET_IF_RX_IX + NET_IF_FRAME_HDR_SIZE_ETHER;
    switch (frame_type) {                                       /* Validate & demux Ethernet frame type.                */
        case NET_IF_FRAME_ETHER_TYPE_IP:
             pbuf_hdr->ProtocolHdrType =  NET_PROTOCOL_TYPE_IP;
             pbuf_hdr->IP_HdrIx        = (NET_BUF_SIZE)ix;
             break;


        case NET_IF_FRAME_ETHER_TYPE_ARP:
             pbuf_hdr->ProtocolHdrType =  NET_PROTOCOL_TYPE_ARP;
             pbuf_hdr->ARP_MsgIx       = (NET_BUF_SIZE)ix;
             break;


        default:
             NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
            *perr = NET_IF_ERR_INVALID_ETHER_TYPE;
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }

                                                                /* ----------------- UPDATE BUF CTRLS ----------------- */
    pbuf_hdr->IF_HdrLen  =  NET_IF_FRAME_HDR_SIZE_ETHER;
    pbuf_hdr->DataLen   -= (NET_BUF_SIZE)pbuf_hdr->IF_HdrLen;

    if (pbuf_hdr->IF_HdrLen <= NET_IF_FRAME_MIN_SIZE) {
        pbuf_hdr->IF_DataLenMin = NET_IF_FRAME_MIN_SIZE - pbuf_hdr->IF_HdrLen;
    } else {
        pbuf_hdr->IF_DataLenMin = 0;
    }


   *perr = NET_IF_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                   NetIF_RxPktFrameDemuxIEEE802()
*
* Description : (1) Validate & demultiplex IEEE 802 packet frame :
*
*                   (a) Validate & demultiplex IEEE 802 packet frame
*                       (1) IEEE 802.2 LLC
*                       (2) IEEE 802.2 SNAP Organization Code
*                       (3) IEEE 802.2 SNAP Frame Type
*                   (b) Update buffer controls
*
*
* Argument(s) : pbuf_hdr    Pointer to received packet frame's network buffer header.
*               --------    Argument validated in NetIF_RxPktFrameDemux().
*
*               pif_hdr     Pointer to          packet frame header.
*               -------     Argument validated in NetIF_RxPktFrameDemux().
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IF_ERR_NONE                     Valid IEEE 802 packet frame.
*                               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.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_RxPktFrameDemux().
*
* Note(s)     : (2) The IEEE 802.3 Frame Length field specifies the number of frame data octets & does NOT
*                   include the trailing frame CRC field octets.  However, since some NICs MAY append the
*                   CRC field as part of a received packet frame, any validation of the minimum frame size
*                   MUST assume that the CRC field may be present.  Therefore, the minimum frame packet size
*                   for comparison MUST include the number of CRC field octets.
*********************************************************************************************************
*/

static  void  NetIF_RxPktFrameDemuxIEEE802 (NET_BUF_HDR  *pbuf_hdr,
                                            NET_IF_HDR   *pif_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
    NET_IF_HDR_IEEE_802  *pif_hdr_ieee_802;
    CPU_INT16U            frame_len;
    CPU_INT16U            frame_len_actual;
    CPU_INT16U            frame_type;
    CPU_INT16U            ix;


/*$PAGE*/
    pif_hdr_ieee_802 = (NET_IF_HDR_IEEE_802 *)pif_hdr;

                                                                    /* ------------- VALIDATE FRAME SIZE -------------- */
    if (pbuf_hdr->TotLen >=  NET_IF_FRAME_MIN_CRC_SIZE) {           /* If pkt size >= min frame pkt size (see Note #2)  */
        frame_len         =  NET_UTIL_VAL_GET_NET_16(&pif_hdr_ieee_802->FrameLen);
        frame_len_actual  = (CPU_INT16U)(pbuf_hdr->TotLen - NET_IF_FRAME_HDR_SIZE - NET_IF_FRAME_CRC_SIZE);
        if (frame_len != frame_len_actual) {                        /* ... & frame len != rem pkt len, rtn err.         */
            NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
           *perr = NET_IF_ERR_INVALID_LEN_FRAME;
            return;
        }
    }

                                                                    /* ------------ VALIDATE IEEE 802.2 LLC ----------- */
    if (pif_hdr_ieee_802->LLC_DSAP != NET_IF_IEEE_802_LLC_DSAP) {   /* Validate IEEE 802.2 LLC DSAP.                    */
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
       *perr = NET_IF_ERR_INVALID_LLC_DSAP;
        return;
    }

    if (pif_hdr_ieee_802->LLC_SSAP != NET_IF_IEEE_802_LLC_SSAP) {   /* Validate IEEE 802.2 LLC SSAP.                    */
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
       *perr = NET_IF_ERR_INVALID_LLC_SSAP;
        return;
    }

    if (pif_hdr_ieee_802->LLC_Ctrl != NET_IF_IEEE_802_LLC_CTRL) {   /* Validate IEEE 802.2 LLC Ctrl.                    */
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
       *perr = NET_IF_ERR_INVALID_LLC_CTRL;
        return;
    }
                                                                    /* ----------- VALIDATE IEEE 802.2 SNAP ----------- */
                                                                    /* Validate IEEE 802.2 SNAP OUI.                    */
    if (pif_hdr_ieee_802->SNAP_OrgCode[0] != NET_IF_IEEE_802_SNAP_CODE_00) {
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
       *perr = NET_IF_ERR_INVALID_SNAP_CODE;
        return;
    }
    if (pif_hdr_ieee_802->SNAP_OrgCode[1] != NET_IF_IEEE_802_SNAP_CODE_01) {
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
       *perr = NET_IF_ERR_INVALID_SNAP_CODE;
        return;
    }
    if (pif_hdr_ieee_802->SNAP_OrgCode[2] != NET_IF_IEEE_802_SNAP_CODE_02) {
        NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
       *perr = NET_IF_ERR_INVALID_SNAP_CODE;
        return;
    }


    frame_type = NET_UTIL_VAL_GET_NET_16(&pif_hdr_ieee_802->SNAP_FrameType);
    ix         = NET_IF_RX_IX + NET_IF_FRAME_HDR_SIZE_IEEE_802;
    switch (frame_type) {                                           /* Validate & demux IEEE 802.2 SNAP Frame Type.     */
        case NET_IF_IEEE_802_SNAP_TYPE_IP:
             pbuf_hdr->ProtocolHdrType =  NET_PROTOCOL_TYPE_IP;
             pbuf_hdr->IP_HdrIx        = (NET_BUF_SIZE)ix;
             break;


        case NET_IF_IEEE_802_SNAP_TYPE_ARP:
             pbuf_hdr->ProtocolHdrType =  NET_PROTOCOL_TYPE_ARP;
             pbuf_hdr->ARP_MsgIx       = (NET_BUF_SIZE)ix;
             break;


        default:
             NET_CTR_ERR_INC(NetIF_ErrRxInvalidFrameCtr);
            *perr = NET_IF_ERR_INVALID_SNAP_TYPE;
             return;                                                /* Prevent 'break NOT reachable' compiler warning.  */
    }

                                                                    /* --------------- UPDATE BUF CTRLS --------------- */
    pbuf_hdr->IF_HdrLen  =  NET_IF_FRAME_HDR_SIZE_IEEE_802;
    pbuf_hdr->DataLen   -= (NET_BUF_SIZE)pbuf_hdr->IF_HdrLen;

    if (pbuf_hdr->IF_HdrLen <= NET_IF_FRAME_MIN_SIZE) {
        pbuf_hdr->IF_DataLenMin = NET_IF_FRAME_MIN_SIZE - pbuf_hdr->IF_HdrLen;
    } else {
        pbuf_hdr->IF_DataLenMin = 0;
    }


   *perr = NET_IF_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                        NetIF_RxPktDiscard()
*
* Description : On any Network Interface Receive 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_RX                      Receive error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_Rx().
*
* Note(s)     : none.
*********************************************************************************************************
*/

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


#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED)
    pctr = (NET_CTR *)&NetIF_ErrRxPktDiscardedCtr;

⌨️ 快捷键说明

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