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

📄 net_if.c

📁 AT91SAM7X256微处理器
💻 C
📖 第 1 页 / 共 5 页
字号:
*
*                               NET_IF_ERR_NONE                 NIC's hardware address successfully configured.
*                               NET_IF_ERR_NULL_PTR             Argument 'paddr' passed a NULL pointer.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_InitDrv().
*
* Note(s)     : (1) NIC's hardware address also known as MAC (Media Access Control) or physical address.
*
*               (2) (a) The size of the memory buffer that contains the NIC hardware address MUST be greater
*                       than or equal to NET_IF_ADDR_SIZE.
*
*                   (b) NIC's hardware address accessed by octets in memory buffer array.
*********************************************************************************************************
*/

void  NetIF_MAC_AddrSet (CPU_INT08U  *paddr,
                         NET_ERR     *perr)
{
#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
    if (paddr == (CPU_INT08U *)0) {
       *perr = NET_IF_ERR_NULL_PTR;
        return;
    }
#endif

    Mem_Copy((void     *)&NetIF_MAC_Addr[0],
             (void     *) paddr,
             (CPU_SIZE_T) NET_IF_ADDR_SIZE);

    NetIF_MAC_AddrValid = DEF_YES;

   *perr                = NET_IF_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                       NetIF_IsValidPktSize()
*
* Description : Validate an Ethernet packet size.
*
* Argument(s) : size        Number of Ethernet packet frame octets.
*
* Return(s)   : DEF_YES, if NIC packet size valid.
*
*               DEF_NO,  otherwise.
*
* Caller(s)   : NetIF_RxTaskHandler().
*
* Note(s)     : none.
*********************************************************************************************************
*/

CPU_BOOLEAN  NetIF_IsValidPktSize (CPU_INT16U  size)
{
    CPU_BOOLEAN  valid;


    valid = DEF_YES;

    if (size  < NET_IF_FRAME_MIN_SIZE) {
        valid = DEF_NO;
    }

    if (size  > NET_IF_FRAME_MAX_CRC_SIZE) {
        valid = DEF_NO;
    }

    return (valid);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                       NetIF_IsValidAddrSrc()
*
* Description : (1) Validate an Ethernet hardware address which MUST NOT be one of the following :
*
*                   (a) Ethernet broadcast address              See RFC #894, Section 'Address Mappings :
*                                                                   Broadcast Address'
*
*
* Argument(s) : paddr_src   Pointer to an Ethernet hardware address.
*
* Return(s)   : DEF_YES, if Ethernet hardware address valid.
*
*               DEF_NO,  otherwise.
*
* Caller(s)   : NetIF_RxPktFrameDemux(),
*               NetARP_IsValidAddrHW().
*
* Note(s)     : none.
*********************************************************************************************************
*/

CPU_BOOLEAN  NetIF_IsValidAddrSrc (CPU_INT08U  *paddr_src)
{
#if ((NET_CTR_CFG_ERR_EN      == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR       cpu_sr;
#endif
    CPU_BOOLEAN  broadcast;
    CPU_BOOLEAN  valid;

                                                                    /* ----------------- VALIDATE PTR ----------------- */
    if (paddr_src == (CPU_INT08U *)0) {
        NET_CTR_ERR_INC(NetIF_ErrNullPtrCtr);
        return (DEF_NO);
    }

                                                                    /* -------------- VALIDATE SRC ADDR --------------- */
    broadcast =  Mem_Cmp((void     *) paddr_src,
                         (void     *)&NetIF_AddrBroadcast[0],
                         (CPU_SIZE_T) NET_IF_ADDR_SIZE);

    valid     = (broadcast == DEF_NO) ? DEF_YES : DEF_NO;

    return (valid);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                             NetIF_Rx()
*
* Description : (1) Process received data packets from packet-based network interface layer & forward to
*                   network protocol layers :
*
*                   (a) Validate & demultiplex packet to higher-layer protocols
*                   (b) Update receive statistics
*
*
* Argument(s) : pbuf        Pointer to network buffer that received IF packet.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_IF_ERR_NONE                 IF packet successfully received & processed.
*                               NET_ERR_INIT_INCOMPLETE         Network initialization NOT complete.
*
*                                                               ---- RETURNED BY NetIF_RxPktDiscard() : ----
*                               NET_ERR_RX                      Receive error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIF_RxTaskHandler() [see Note #2].
*
* Note(s)     : (2) Network Interface Receive Task Handler implemented in Packet-based Network Interface
*                   [see '\<Network Protocol Suite>\IF\net_if_pkt.c  NetIF_RxTaskHandler()'].
*
*               (3) NetIF_Rx() blocked until network initialization completes; perform NO action.
*
*               (4) Network buffer already freed by higher layer; only increment error counter.
*********************************************************************************************************
*/
/*$PAGE*/
void  NetIF_Rx (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
    NET_BUF_HDR  *pbuf_hdr;
    NET_IF_HDR   *pif_hdr;


#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
    if (Net_InitDone != DEF_YES) {                              /* If init NOT complete, exit rx (see Note #3).         */
        NetIF_RxPktDiscard(pbuf, perr);
       *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_RxPktDiscard(pbuf, perr);
        NET_CTR_ERR_INC(NetIF_ErrNullPtrCtr);
        return;
    }
#endif


    NET_CTR_STAT_INC(NetIF_StatRxPktCtr);


                                                                /* ------------- VALIDATE / DEMUX IF PKT -------------- */
    pbuf_hdr = &pbuf->Hdr;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
    NetIF_RxPktValidateBuf(pbuf_hdr, perr);                     /* Validate rx'd buf.                                   */
    switch (*perr) {
        case NET_IF_ERR_NONE:
             break;


        case NET_ERR_INVALID_PROTOCOL:
        case NET_BUF_ERR_INVALID_IX:
        default:
             NetIF_RxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }
#endif
    pif_hdr = (NET_IF_HDR *)&pbuf->Data[pbuf_hdr->IF_HdrIx];
    NetIF_RxPktFrameDemux(pbuf, pbuf_hdr, pif_hdr, perr);       /* Validate & demux pkt to appropriate net Q.           */


                                                                /* ----------------- UPDATE RX STATS ------------------ */
    switch (*perr) {
        case NET_ARP_ERR_NONE:
        case NET_IP_ERR_NONE:
             NET_CTR_STAT_INC(NetIF_StatRxPktProcessedCtr);
            *perr = NET_IF_ERR_NONE;
             break;


        case NET_ERR_INIT_INCOMPLETE:
        case NET_ERR_RX:
             NET_CTR_ERR_INC(NetIF_ErrRxPktDiscardedCtr);       /* See Note #4.                                         */
             break;


        case NET_ERR_INVALID_PROTOCOL:
        case NET_IF_ERR_INVALID_ADDR_DEST:
        case NET_IF_ERR_INVALID_ADDR_SRC:
        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:
             NetIF_RxPktDiscard(pbuf, perr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */
    }
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                             NetIF_Tx()
*
* Description : (1) Prepare & transmit data packets from network protocol layers to packet-based network
*                   interface layer :
*
*                   (a) Prepare data packets with appropriate Ethernet frame format
*                   (b) Transmit packet via :
*                       (1) Broadcast
*                       (2) Bind hardware address
*
*
* 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 successfully transmitted  OR
*                                                                   buffered for later transmission.
*                               NET_ERR_INIT_INCOMPLETE         Network initialization NOT complete.
*
*                                                               - RETURNED BY NetIF_TxPktDiscard() : -
*                               NET_ERR_TX                      Transmit error; packet discarded.
*
* Return(s)   : none.
*
* Caller(s)   : NetIP_TxPktDatagram(),
*               NetARP_Tx().
*
* Note(s)     : (2) NetIF_Tx() blocked until network initialization completes; perform NO action.
*********************************************************************************************************
*/

void  NetIF_Tx (NET_BUF  *pbuf,
                NET_ERR  *perr)
{
#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
    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).         */
        NetIF_TxPktDiscard(pbuf, perr);
       *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;

⌨️ 快捷键说明

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