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