?? net_ip.c
字號:
* See also 'net_ip.h IP ADDRESS DEFINES Note #3'.
*
* Argument(s) : addr_subnet_mask IP subnet mask to validate.
*
* Return(s) : DEF_YES, if IP subnet mask valid.
*
* DEF_NO, otherwise.
*
* Caller(s) : NetIP_IsValidAddrThisHost().
*
* Note(s) : none.
*********************************************************************************************************
*/
CPU_BOOLEAN NetIP_IsValidAddrSubnetMask (NET_IP_ADDR addr_subnet_mask)
{
CPU_BOOLEAN valid;
NET_IP_ADDR mask;
CPU_INT08U mask_size;
CPU_INT08U mask_nbr_one_bits;
CPU_INT08U mask_nbr_one_bits_min;
CPU_INT08U mask_nbr_one_bits_max;
CPU_INT08U i;
/* ------------- VALIDATE SUBNET MASK ------------- */
/* Chk invalid subnet class (see Note #1c). */
if ((addr_subnet_mask & NET_IP_ADDR_CLASS_SUBNET_MASK) == NET_IP_ADDR_NONE) {
valid = DEF_NO;
} else { /* Chk invalid subnet mask (see Notes #1a & #1b). */
mask_size = sizeof(addr_subnet_mask) * DEF_OCTET_NBR_BITS;
mask = DEF_BIT_00;
mask_nbr_one_bits = 0;
for (i = 0; i < mask_size; i++) { /* Calc nbr subnet bits. */
if (addr_subnet_mask & mask) {
mask_nbr_one_bits++;
}
mask <<= 1;
}
mask_nbr_one_bits_min = 2; /* See Note #1a2. */
mask_nbr_one_bits_max = mask_size - mask_nbr_one_bits_min;
/* Chk invalid nbr subnet bits (see Note #1a2). */
if (mask_nbr_one_bits < mask_nbr_one_bits_min) {
valid = DEF_NO;
} else if (mask_nbr_one_bits > mask_nbr_one_bits_max) {
valid = DEF_NO;
} else {
valid = DEF_YES;
}
}
return (valid);
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetIP_Rx()
*
* Description : (1) Process received datagrams & forward to network protocol layers :
*
* (a) Validate IP packet & options
* (b) Reassemble fragmented datagrams
* (c) Demultiplex datagram to higher-layer protocols
* (d) Update receive statistics
*
* (2) Although IP data units are typically referred to as 'datagrams' (see RFC #791, Section 1.1),
* the term 'IP packet' (see RFC #1983, 'packet') is used for IP Receive until the packet is
* validated, & possibly reassembled, as an IP datagram.
*
*
* Argument(s) : pbuf Pointer to network buffer that received IP packet.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* NET_IP_ERR_NONE IP datagram successfully received & processed.
* NET_ERR_INIT_INCOMPLETE Network initialization NOT complete.
*
* ----- RETURNED BY NetIP_RxPktDiscard() : -----
* NET_ERR_RX Receive error; packet discarded.
*
* Return(s) : none.
*
* Caller(s) : NetIF_RxPktFrameDemux(),
* NetIP_TxPktDatagram().
*
* Note(s) : (3) NetIP_Rx() blocked until network initialization completes; perform NO action.
*
* (4) Since NetIP_RxPktFragReasm() may return a pointer to a different packet buffer (see
* 'NetIP_RxPktFragReasm() Return(s)', 'pbuf_hdr' MUST be reloaded.
*
* (5) (a) For single packet buffer IP datagrams, the datagram length is equal to the IP
* Total Length minus the IP Header Length.
*
* (b) For multiple packet buffer, fragmented IP datagrams, the datagram length is
* equal to the previously calculated total fragment size.
*
* (1) IP datagram length is stored ONLY in the first packet buffer of any
* fragmented packet buffers.
*
* (6) Network buffer already freed by higher layer; only increment error counter.
*********************************************************************************************************
*/
/*$PAGE*/
void NetIP_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_IP_HDR *pip_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). */
NetIP_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) {
NetIP_RxPktDiscard(pbuf, perr);
NET_CTR_ERR_INC(NetIP_ErrNullPtrCtr);
return;
}
#endif
NET_CTR_STAT_INC(NetIP_StatRxPktCtr);
/* ------------------ VALIDATE IP PKT ----------------- */
pbuf_hdr = &pbuf->Hdr;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
NetIP_RxPktValidateBuf(pbuf_hdr, perr); /* Validate rx'd buf. */
switch (*perr) {
case NET_IP_ERR_NONE:
break;
case NET_ERR_INVALID_PROTOCOL:
case NET_BUF_ERR_INVALID_IX:
default:
NetIP_RxPktDiscard(pbuf, perr);
return; /* Prevent 'break NOT reachable' compiler warning. */
}
#endif
pip_hdr = (NET_IP_HDR *)&pbuf->Data[pbuf_hdr->IP_HdrIx];
NetIP_RxPktValidate(pbuf, pbuf_hdr, pip_hdr, perr); /* Validate rx'd pkt. */
/* ------------------- REASM FRAGS -------------------- */
switch (*perr) {
case NET_IP_ERR_NONE:
pbuf = NetIP_RxPktFragReasm(pbuf, pbuf_hdr, pip_hdr, perr);
break;
case NET_IP_ERR_INVALID_VER:
case NET_IP_ERR_INVALID_LEN_HDR:
case NET_IP_ERR_INVALID_LEN_TOT:
case NET_IP_ERR_INVALID_LEN_DATA:
case NET_IP_ERR_INVALID_FLAG:
case NET_IP_ERR_INVALID_FRAG:
case NET_IP_ERR_INVALID_PROTOCOL:
case NET_IP_ERR_INVALID_CHK_SUM:
case NET_IP_ERR_INVALID_ADDR_SRC:
case NET_IP_ERR_INVALID_ADDR_DEST:
case NET_IP_ERR_INVALID_OPT:
case NET_IP_ERR_INVALID_OPT_LEN:
case NET_IP_ERR_INVALID_OPT_NBR:
case NET_IP_ERR_INVALID_OPT_END:
case NET_IP_ERR_INVALID_OPT_FLAG:
case NET_IP_ERR_RX_OPT_BUF_NONE_AVAIL:
case NET_IP_ERR_RX_OPT_BUF_WR:
default:
NetIP_RxPktDiscard(pbuf, perr);
return; /* Prevent 'break NOT reachable' compiler warning. */
}
/*$PAGE*/
/* -------------- DEMUX DATAGRAM -------------- */
switch (*perr) { /* Chk err from NetIP_RxPktFragReasm(). */
case NET_IP_ERR_RX_FRAG_NONE:
case NET_IP_ERR_RX_FRAG_COMPLETE:
pbuf_hdr = &pbuf->Hdr; /* Reload buf hdr ptr (see Note #4). */
if (*perr == NET_IP_ERR_RX_FRAG_NONE) { /* If pkt NOT frag'd, ... */
pbuf_hdr->IP_DatagramLen = pbuf_hdr->IP_TotLen /* ... calc buf datagram len (see Note #5a). */
- pbuf_hdr->IP_HdrLen;
} else { /* Else set tot frag size ... */
pbuf_hdr->IP_DatagramLen = pbuf_hdr->IP_FragSizeTot; /* ... as datagram len (see Note #5b). */
}
NetIP_RxPktDemuxDatagram(pbuf, pbuf_hdr, perr);
break;
case NET_IP_ERR_RX_FRAG_REASM: /* Frag'd datagram in reasm. */
*perr = NET_IP_ERR_NONE;
return; /* Prevent 'break NOT reachable' compiler warning. */
case NET_IP_ERR_RX_FRAG_OFFSET:
case NET_IP_ERR_RX_FRAG_SIZE:
case NET_IP_ERR_RX_FRAG_DISCARD:
default:
NetIP_RxPktDiscard(pbuf, perr);
return; /* Prevent 'break NOT reachable' compiler warning. */
}
/* ----------------- UPDATE RX STATS ------------------ */
switch (*perr) { /* Chk err from NetIP_RxPktDemuxDatagram(). */
case NET_ICMP_ERR_NONE:
case NET_TCP_ERR_NONE:
case NET_UDP_ERR_NONE:
NET_CTR_STAT_INC(NetIP_StatRxDatagramProcessedCtr);
*perr = NET_IP_ERR_NONE;
break;
case NET_ERR_INIT_INCOMPLETE:
case NET_ERR_RX:
NET_CTR_ERR_INC(NetIP_ErrRxPktDiscardedCtr); /* See Note #6. */
return; /* Prevent 'break NOT reachable' compiler warning. */
case NET_ERR_INVALID_PROTOCOL:
default:
NetIP_RxPktDiscard(pbuf, perr);
return; /* Prevent 'break NOT reachable' compiler warning. */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetIP_Tx()
*
* Description : (1) Prepare & transmit packets from transport protocol layers to network interface layer :
*
* (a) Validate transmit packet
* (b) Prepare & transmit packet datagram
* (c) Update transmit statistics
*
*
* Argument(s) : pbuf Pointer to network buffer to transmit IP packet.
*
* addr_src Source IP address.
*
* addr_dest Destination IP address.
*
* TOS Specific TOS to transmit IP packet
* (see 'net_ip.h IP HEADER TYPE OF SERVICE (TOS) DEFINES').
*
* TTL Specific TTL to transmit IP packet (see RFC #1122, Section 3.2.1.7) :
*
* NET_IP_HDR_TTL_MIN 1 minimum TTL transmit value
* NET_IP_HDR_TTL_MAX 255 maximum TTL transmit value
* NET_IP_HDR_TTL_DFLT default TTL transmit value
* NET_IP_HDR_TTL_NONE 0 replace with default TTL
*
* flags Flags to select transmit options; bit-field flags logically OR'd :
*
* NET_IP_FLAG_NONE No transmit flags selected.
* NET_IP_FLAG_TX_DONT_FRAG Set IP 'Don't Frag' flag.
*
* popts Pointer to one or more IP options configuration data structures :
*
* NULL NO IP transmit options configuration.
* NET_IP_OPT_CFG_ROUTE_TS Route &/or Internet Timestamp options configuration.
* NET_IP_OPT_CFG_SECURITY Security options configuration
* (see 'net_ip.c Note #1f').
*
* perr Pointer to variable that will receive the return error code from this function :
*
* NET_IP_ERR_NONE IP datagram(s) successfully prepared & transmitted
* to network interface layer.
* NET_ERR_INIT_INCOMPLETE Network initialization NOT complete.
*
* ------- RETURNED BY NetIP_TxPktDiscard() : -------
* NET_ERR_TX Transmit error; packet discarded.
*
* Return(s) : none.
*
* Caller(s) : NetICMP_TxMsgErr(),
* NetICMP_TxMsgReq(),
* NetICMP_TxMsgReply(),
* NetUDP_Tx(),
* NetTCP_TxPkt().
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -