📄 net_if.c
字号:
*
* 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 + -