📄 net_ip.c
字号:
* Description : (1) Initialize Internet Protocol Layer :
*
* (a) Initialize IP pointers & counters
* (b) Initialize IP statistics & error counters
*
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : Net_Init().
*
* This function is an INTERNAL network protocol suite function & MUST NOT be called by
* application function(s).
*
* Note(s) : none.
*********************************************************************************************************
*/
void NetIP_Init (void)
{
/* ---------------- INIT IP PTRS/CTRS ----------------- */
/* Ptrs used to update Rx Frag Reasm Lists. */
NetIP_FragReasmListsHead = (NET_BUF *)0;
NetIP_FragReasmListsTail = (NET_BUF *)0;
NetIP_TxIDCtr = NET_IP_ID_INIT;
/* ------------- INIT IP STAT & ERR CTRS -------------- */
#if (NET_CTR_CFG_STAT_EN == DEF_ENABLED)
NetIP_StatRxPktCtr = 0;
NetIP_StatRxDatagramProcessedCtr = 0;
NetIP_StatRxDestLocalCtr = 0;
NetIP_StatRxDestBroadcastCtr = 0;
NetIP_StatRxFragCtr = 0;
NetIP_StatRxFragDatagramReasmCtr = 0;
NetIP_StatTxDatagramCtr = 0;
NetIP_StatTxDestLocalCtr = 0;
NetIP_StatTxDestBroadcastCtr = 0;
#endif
#if (NET_CTR_CFG_ERR_EN == DEF_ENABLED)
NetIP_ErrNullPtrCtr = 0;
NetIP_ErrCfgAddrThisHostCtr = 0;
NetIP_ErrCfgAddrDfltGatewayCtr = 0;
NetIP_ErrRxHdrVerCtr = 0;
NetIP_ErrRxHdrLenCtr = 0;
NetIP_ErrRxHdrTotLenCtr = 0;
NetIP_ErrRxHdrFlagsCtr = 0;
NetIP_ErrRxHdrFragCtr = 0;
NetIP_ErrRxHdrProtocolCtr = 0;
NetIP_ErrRxHdrChkSumCtr = 0;
NetIP_ErrRxHdrAddrSrcCtr = 0;
NetIP_ErrRxHdrOptsCtr = 0;
NetIP_ErrRxHdrOptsBufNoneAvailCtr = 0;
NetIP_ErrRxHdrOptsBufWrCtr = 0;
NetIP_ErrRxDestCtr = 0;
NetIP_ErrRxDestBroadcastCtr = 0;
NetIP_ErrRxFragDiscardedCtr = 0;
NetIP_ErrRxFragDatagramDiscardedCtr = 0;
NetIP_ErrRxFragDatagramTimeoutCtr = 0;
NetIP_ErrRxPktDiscardedCtr = 0;
NetIP_ErrTxProtocolCtr = 0;
NetIP_ErrTxOptTypeCtr = 0;
NetIP_ErrTxDestCtr = 0;
NetIP_ErrTxPktDiscardedCtr = 0;
/*$PAGE*/
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
NetIP_ErrRxInvalidBufIxCtr = 0;
NetIP_ErrRxHdrDataLenCtr = 0;
NetIP_ErrRxFragFlagsCtr = 0;
NetIP_ErrRxFragOffsetCtr = 0;
NetIP_ErrRxFragSizeCtr = 0;
NetIP_ErrTxInvalidBufIxCtr = 0;
NetIP_ErrTxHdrTOS_Ctr = 0;
NetIP_ErrTxHdrDataLenCtr = 0;
NetIP_ErrTxHdrAddrSrcCtr = 0;
NetIP_ErrTxHdrAddrDestCtr = 0;
NetIP_ErrTxHdrFlagsCtr = 0;
NetIP_ErrTxHdrOptLenCtr = 0;
NetIP_ErrTxHdrOptCfgCtr = 0;
#endif
#if 0 /* #### NOT currently implemented. */
/* See 'net_ip.c Note #1e'. */
NetIP_ErrTxFragDiscardedCtr = 0;
NetIP_ErrTxFragDiscardedDontFragCtr = 0;
#endif
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetIP_CfgAddrThisHost()
*
* Description : (1) Configure this host's IP address :
*
* (a) Validate this host's IP address & subnet mask
* (b) Configure this host's IP address, subnet mask, & subnet
*
*
* Argument(s) : addr_host Desired IP address for this host (see Note #2).
*
* addr_subnet_mask Desired IP address subnet mask for this host (see Note #2).
*
* Return(s) : DEF_OK, if valid host IP address & subnet mask configured.
*
* DEF_FAIL, otherwise.
*
* Caller(s) : Net_InitDflt() [see Note #3],
* Application.
*
* This function is a network protocol suite application interface (API) function & MAY be
* called by application function(s).
*
* Note(s) : (2) Host IP addresses MUST be in host-order.
*
* (3) The default initialization configuration by Net_InitDflt() is invalid & forces the
* developer or higher-layer protocol application to configure a valid IP address &
* subnet mask.
*********************************************************************************************************
*/
CPU_BOOLEAN NetIP_CfgAddrThisHost (NET_IP_ADDR addr_host,
NET_IP_ADDR addr_subnet_mask)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_BOOLEAN valid_addr;
CPU_BOOLEAN valid_cfg;
valid_addr = NetIP_IsValidAddrThisHost(addr_host, addr_subnet_mask);
valid_cfg = (valid_addr == DEF_YES) ? DEF_OK : DEF_FAIL;
if (valid_cfg == DEF_OK) {
CPU_CRITICAL_ENTER();
NetIP_AddrThisHost = addr_host;
NetIP_AddrThisHostNetOrder = (NET_IP_ADDR) NET_UTIL_HOST_TO_NET_32(addr_host);
NetIP_AddrThisHostSubnetMask = (NET_IP_ADDR) addr_subnet_mask;
NetIP_AddrThisHostSubnetMaskHost = (NET_IP_ADDR)~addr_subnet_mask;
NetIP_AddrThisHostSubnetNet = addr_host & addr_subnet_mask;
CPU_CRITICAL_EXIT();
} else {
NET_CTR_ERR_INC(NetIP_ErrCfgAddrThisHostCtr);
CPU_CRITICAL_ENTER();
NetIP_AddrThisHost = (NET_IP_ADDR)NET_IP_ADDR_NONE;
NetIP_AddrThisHostNetOrder = (NET_IP_ADDR)NET_UTIL_HOST_TO_NET_32(NET_IP_ADDR_NONE);
NetIP_AddrThisHostSubnetMask = (NET_IP_ADDR)NET_IP_ADDR_NONE;
NetIP_AddrThisHostSubnetMaskHost = (NET_IP_ADDR)NET_IP_ADDR_NONE;
NetIP_AddrThisHostSubnetNet = (NET_IP_ADDR)NET_IP_ADDR_NONE;
CPU_CRITICAL_EXIT();
}
return (valid_cfg);
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetIP_CfgAddrDfltGateway()
*
* Description : (1) Configure this host's default gateway IP address :
*
* (a) Validate this host's default gateway IP address
* (b) Configure this host's default gateway IP address
*
*
* Argument(s) : addr_dflt_gateway Desired IP address for this host's default gateway (see Note #2).
*
* Return(s) : DEF_OK, if valid default gateway IP address configured.
*
* DEF_FAIL, otherwise.
*
* Caller(s) : Net_InitDflt() [see Note #3],
* Application.
*
* This function is a network protocol suite application interface (API) function & MAY be
* called by application function(s).
*
* Note(s) : (2) Default gateway address MUST be in host-order.
*
* (3) The default initialization configuration by Net_InitDflt() is invalid & forces the
* developer or higher-layer protocol application to configure a valid default gateway
* IP address.
*
* (4) (a) RFC #1122, Section 3.3.1.1. states that "the host IP layer MUST operate correctly
* in a minimal network environment, and in particular, when there are no gateways".
*
* In other words, a host on an isolated network should be able to correctly operate
* & communicate with all other hosts on its local network without need of a gateway
* or configuration of a gateway.
*
* (b) However, if this host's network interface is a network type (versus a serial
* connection) AND the default gateway is configured with an invalid IP address
* NOT on the local network, then ALL non-local-network destination IP datagrams
* will be discarded at the physical link-layer/network interface.
*********************************************************************************************************
*/
CPU_BOOLEAN NetIP_CfgAddrDfltGateway (NET_IP_ADDR addr_dflt_gateway)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
CPU_BOOLEAN valid_addr;
CPU_BOOLEAN valid_cfg;
valid_addr = NetIP_IsValidAddrHost(addr_dflt_gateway);
valid_cfg = (valid_addr == DEF_YES) ? DEF_OK : DEF_FAIL;
if (valid_cfg == DEF_OK) {
CPU_CRITICAL_ENTER();
NetIP_AddrDfltGateway = (NET_IP_ADDR)addr_dflt_gateway;
CPU_CRITICAL_EXIT();
} else {
NET_CTR_ERR_INC(NetIP_ErrCfgAddrDfltGatewayCtr);
CPU_CRITICAL_ENTER();
NetIP_AddrDfltGateway = (NET_IP_ADDR)NET_IP_ADDR_NONE;
CPU_CRITICAL_EXIT();
}
return (valid_cfg);
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetIP_CfgFragReasmTimeout()
*
* Description : Configure IP fragment reassembly timeout.
*
* (1) IP fragment reassembly timeout is the maximum time allowed between received IP fragments
* from the same IP datagram.
*
*
* Argument(s) : timeout_sec Desired value for IP fragment reassembly timeout (in seconds).
*
* Return(s) : DEF_OK, IP fragment reassembly timeout configured.
*
* Caller(s) : Net_InitDflt(),
* Application.
*
* This function is a network protocol suite application interface (API) function & MAY be
* called by application function(s).
*
* Note(s) : (2) Timeout in seconds converted to 'NET_TMR_TICK' ticks in order to set initial 'NET_TMR'
* timeout value.
*********************************************************************************************************
*/
CPU_BOOLEAN NetIP_CfgFragReasmTimeout (CPU_INT08U timeout_sec)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif
NET_TMR_TICK tick;
if (timeout_sec < NET_IP_FRAG_REASM_TIMEOUT_MIN_SEC) {
timeout_sec = NET_IP_FRAG_REASM_TIMEOUT_MIN_SEC;
}
if (timeout_sec > NET_IP_FRAG_REASM_TIMEOUT_MAX_SEC) {
timeout_sec = NET_IP_FRAG_REASM_TIMEOUT_MAX_SEC;
}
tick = (NET_TMR_TICK)timeout_sec * NET_TMR_TIME_TICK_PER_SEC;
CPU_CRITICAL_ENTER();
NetIP_FragReasmTimeout_sec = timeout_sec;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -