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