📄 net_udp.c
字号:
#if (((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) || \
(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
#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) || \
(NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED))
CPU_INT16U flag_mask;
CPU_BOOLEAN used;
#endif
CPU_BOOLEAN peek;
NET_BUF *pbuf_head;
NET_BUF *pbuf_next;
NET_BUF_HDR *pbuf_head_hdr;
NET_BUF_HDR *pbuf_hdr;
NET_BUF_SIZE data_len_pkt;
CPU_INT16U data_len_buf_rem;
CPU_INT16U data_len_tot;
CPU_INT08U *p_data;
CPU_INT08U *pip_opts;
CPU_INT08U ip_opt_len;
NET_ERR err;
NET_ERR err_rtn;
if (pip_opts_len != (CPU_INT08U *)0) { /* Init len for err (see Note #7). */
*pip_opts_len = 0;
}
#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) || \
(NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED))
if (Net_InitDone != DEF_YES) { /* If init NOT complete, exit rx (see Notes #3 & #9b). */
*perr = NET_ERR_INIT_INCOMPLETE;
return (0);
}
/* --------------- VALIDATE RX PKT BUFS --------------- */
if (pbuf == (NET_BUF *)0) {
*perr = NET_UDP_ERR_NULL_PTR; /* See Note #9b. */
return (0);
}
used = NetBuf_IsUsed(pbuf);
if (used != DEF_YES) {
NET_CTR_ERR_INC(NetUDP_ErrRxPktDiscardedCtr);
*perr = NET_ERR_RX; /* See Note #9b. */
return (0);
}
/* --------------- VALIDATE RX DATA BUF --------------- */
if (pdata_buf == (CPU_INT08U *)0) {
*perr = NET_UDP_ERR_NULL_PTR; /* See Note #9b. */
return (0);
}
if (data_buf_len < 1) {
*perr = NET_UDP_ERR_INVALID_DATA_SIZE; /* See Note #9b. */
return (0);
}
/* ---------------- VALIDATE RX FLAGS ----------------- */
flag_mask = NET_UDP_FLAG_NONE |
NET_UDP_FLAG_RX_DATA_PEEK;
if ((flags & ~flag_mask) != NET_UDP_FLAG_NONE) { /* If any invalid flags req'd, rtn err (see Note #5). */
NET_CTR_ERR_INC(NetUDP_ErrInvalidFlagsCtr);
*perr = NET_UDP_ERR_INVALID_FLAG; /* See Note #9b. */
return (0);
}
#endif
/*$PAGE*/
/* ----------------- GET RX'D IP OPTS ----------------- */
/* See Note #6. */
pbuf_hdr = &pbuf->Hdr;
if (pbuf_hdr->IP_OptPtr != (void *)0) { /* If IP opts rx'd, & ... */
if (pip_opts_buf != (void *)0) { /* .. IP opts rx buf avail, & ... */
if (ip_opts_buf_len >= pbuf_hdr->IP_HdrLen) { /* .. IP opts rx buf size sufficient, ... */
pip_opts = &pbuf->Data[pbuf_hdr->IP_HdrIx];
ip_opt_len = (CPU_INT08U)pbuf_hdr->IP_HdrLen;
Mem_Copy((void *)pip_opts_buf, /* .. copy IP opts into rx buf. */
(void *)pip_opts,
(CPU_SIZE_T) ip_opt_len);
*pip_opts_len = ip_opt_len;
}
}
}
/* ------------- DEFRAME UDP APP RX DATA -------------- */
pbuf_head = (NET_BUF *) pbuf;
pbuf_head_hdr = (NET_BUF_HDR *)&pbuf_head->Hdr;
p_data = (CPU_INT08U *) pdata_buf;
data_len_buf_rem = (CPU_INT16U ) data_buf_len;
data_len_tot = (CPU_INT16U ) 0;
err_rtn = NET_UDP_ERR_NONE;
while ((pbuf != (NET_BUF *)0) && /* Copy app rx data from avail pkt buf(s). */
(data_len_buf_rem > 0)) {
pbuf_hdr = &pbuf->Hdr;
pbuf_next = (NET_BUF *)pbuf_hdr->NextBufPtr;
if (data_len_buf_rem > pbuf_hdr->DataLen) { /* If rem data buf len > pkt buf data len, ... */
data_len_pkt = pbuf_hdr->DataLen; /* ... copy all pkt buf data len. */
} else {
data_len_pkt = (NET_BUF_SIZE)data_len_buf_rem; /* Else limit copy to rem data buf len ... */
err_rtn = NET_UDP_ERR_INVALID_DATA_SIZE; /* ... & rtn data size err code (see Note #4b). */
}
NetBuf_DataRd((NET_BUF *) pbuf,
(NET_BUF_SIZE) pbuf_hdr->DataIx,
(NET_BUF_SIZE) data_len_pkt,
(CPU_INT08U *) p_data,
(NET_ERR *)&err);
if (err != NET_BUF_ERR_NONE) { /* See Note #9a. */
NetUDP_RxPktDiscard(pbuf_head, perr);
return (0);
}
/* Update data ptr & lens. */
p_data += data_len_pkt; /* MUST NOT cast ptr operand (see Note #8b). */
data_len_tot += (CPU_INT16U)data_len_pkt;
data_len_buf_rem -= (CPU_INT16U)data_len_pkt;
pbuf = pbuf_next;
}
/* ----------------- FREE UDP RX PKTS ----------------- */
peek = DEF_BIT_IS_SET(flags, NET_UDP_FLAG_RX_DATA_PEEK);
if (peek != DEF_YES) { /* If peek opt NOT req'd, pkt buf(s) consumed; ... */
pbuf_head_hdr->NextPrimListPtr = (void *)0; /* ... unlink from any other pkt bufs/chains ... */
NetUDP_RxPktFree(pbuf_head); /* ... & free pkt buf(s). */
}
*perr = err_rtn;
return (data_len_tot);
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetUDP_TxAppData()
*
* Description : (1) Prepare & transmit data from Application layer(s) via UDP layer :
*
* (a) Validate application data
* (b) Transmit application data via UDP Transmit :
* (1) Calculate/validate application data buffer size
* (2) Get buffer(s) for application data
* (3) Copy application data into UDP packet buffer(s)
* (4) Initialize UDP packet buffer controls
* (5) Free UDP packet buffer(s)
*
*
* Argument(s) : p_data Pointer to application data.
*
* data_len Length of application data (in octets) [see Note #6].
*
* src_addr Source IP address.
*
* src_port Source UDP port.
*
* dest_addr Destination IP address.
*
* dest_port Destination UDP port.
*
* TOS Specific TOS to transmit UDP/IP packet
* (see 'net_ip.h IP HEADER TYPE OF SERVICE (TOS) DEFINES').
*
* TTL Specific TTL to transmit UDP/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_udp Flags to select UDP transmit options (see Note #4); bit-field flags logically OR'd :
*
* NET_UDP_FLAG_NONE No transmit flags selected.
* NET_UDP_FLAG_TX_CHK_SUM_DIS DISABLE transmit check-sums.
* NET_UDP_FLAG_TX_BLOCK Transmit UDP application data with blocking,
* if flag set; without blocking, if clear
* (see Note #4a).
*
* flags_ip Flags to select IP 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_ip Pointer to one or more IP options configuration data structures (see Note #5) :
*
* 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_UDP_ERR_NONE Application data successfully prepared &
* transmitted via UDP layer.
* NET_ERR_INIT_INCOMPLETE Network initialization NOT complete.
* NET_UDP_ERR_NULL_PTR Argument 'p_data' passed a NULL pointer.
* NET_UDP_ERR_INVALID_DATA_SIZE Argument 'data_len' passed an invalid size
* (see Notes #6b & #6a2B).
*
* ----------- RETURNED BY NetBuf_Get() : -----------
* NET_BUF_ERR_INVALID_SIZE Requested size is greater then the maximum buffer
* size available.
* NET_BUF_ERR_INVALID_LEN Requested size & start index calculation overflows
* buffer's DATA area.
* NET_BUF_ERR_INVALID_TYPE Invalid buffer type.
* NET_BUF_ERR_NONE_AVAIL NO available buffers to allocate.
*
* --------- RETURNED BY NetBuf_DataWr() : ----------
* NET_BUF_ERR_NULL_PTR Argument(s) passed a NULL pointer.
* NET_BUF_ERR_INVALID_IX Invalid buffer index.
*
* ----------- RETURNED BY NetUDP_Tx() : ------------
* NET_ERR_INVALID_PROTOCOL Invalid/unknown protocol type.
* NET_UDP_ERR_INVALID_LEN_DATA Invalid protocol/data length.
* NET_UDP_ERR_INVALID_PORT_NBR Invalid UDP port number.
* NET_UDP_ERR_INVALID_FLAG Invalid UDP flag(s).
* NET_UTIL_ERR_NULL_PTR Check-sum passed a NULL pointer.
* NET_UTIL_ERR_NULL_SIZE Check-sum passed a zero size.
* NET_UTIL_ERR_INVALID_PROTOCOL Invalid data packet protocol.
* NET_ERR_TX Transmit error; packet(s) discarded.
*$PAGE*
* Return(s) : Number of data octets transmitted, if NO errors.
*
* 0, otherwise.
*
* Caller(s) : NetSock_TxDataHandlerDatagram(),
* Application.
*
* This function is a network protocol suite application interface (API) function & MAY be
* called by application function(s).
*
* Note(s) : (2) NetUDP_TxAppData() MUST be called with the global network lock already acquired.
*
* (3) NetUDP_TxAppData() blocked until network initialization completes; perform NO action.
*
* (4) #### Some UDP transmit flag options NOT yet implemented :
*
* (a) NET_UDP_FLAG_TX_BLOCK
*
* See also 'NetUDP_TxPktValidate() Note #2b'.
*
* (5) #### 'popts' configuration should be provided via appropriate IP layer API.
*
* (6) (a) (1) Datagram transmission & reception MUST be atomic -- i.e. every single, complete
* datagram transmitted SHOULD be received as a single, complete datagram. Thus,
* each call to transmit data MUST be transmitted in a single, complete datagram.
*
* (2) (A) IEEE Std 1003.1, 2004 Edition, Section 'send() : DESCRIPTION' states that
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -