📄 net_udp.c
字号:
/* See Note #5. */
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 APP DATA ----------------- */
pbuf_head = (NET_BUF *)pbuf;
p_data = (CPU_INT08U *)pdata_buf;
data_len_buf_rem = (CPU_INT16U )data_buf_len;
data_len_tot = (CPU_INT16U )0;
err_rtn = NET_APP_ERR_NONE;
while ((pbuf != (NET_BUF *)0) && /* Copy app data from every pkt buf. */
(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 app data buf len > pkt buf data len, ... */
data_len_pkt = pbuf_hdr->DataLen; /* ... copy all pkt buf data len. */
} else { /* Else limit copy to ... */
data_len_pkt = (NET_BUF_SIZE)data_len_buf_rem; /* ... rem app data buf len & ... */
err_rtn = NET_APP_ERR_INVALID_DATA_SIZE; /* ... rtn 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 #7a. */
NetUDP_RxPktDiscard(pbuf_head, perr);
return (0);
}
/* Update data ptr & lens. */
p_data += data_len_pkt;
data_len_tot += (CPU_INT16U)data_len_pkt;
data_len_buf_rem -= (CPU_INT16U)data_len_pkt;
pbuf = pbuf_next;
}
/* ----------------- FREE UDP RX PKT ------------------ */
NetUDP_RxPktFree(pbuf_head);
*perr = err_rtn;
return (data_len_tot);
}
#endif
/*$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 #5].
*
* 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; bit-field flags logically OR'd :
*
* NET_UDP_FLAG_NONE No transmit flags selected.
* NET_UDP_FLAG_CHK_SUM_TX_DIS DISABLE transmit check-sums.
*
* 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 #4) :
*
* 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 Note #5).
*
* ----------- 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_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.
*
* Return(s) : Number of data octets transmitted, if NO errors.
*
* 0, otherwise.
*
* Caller(s) : NetSock_TxDataHandlerDatagram(),
* Application.
*$PAGE*
* Note(s) : (2) NetUDP_TxAppData() MUST be called with the global network lock already acquired.
*
* #### Developer required to encapsulate function call within global network lock?
*
* (3) NetUDP_TxAppData() blocked until network initialization completes; perform NO action.
*
* (4) #### 'popts' configuration should be provided via appropriate IP layer API.
*
* (5) (a) (1) Datagram transmission & reception SHOULD 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) Since IP transmit fragmentation is NOT currently supported (see 'net_ip.h
* Note #1e'), if requested datagram transmit data length is greater than MTU,
* then the maximum number of octets up to MTU is transmitted but the remaining
* data octets are silently discarded & NET_UDP_ERR_INVALID_DATA_SIZE error is
* returned.
*
* (b) (1) 'data_len' of 0 octets allowed.
*
* (2) 'data_len' argument check NOT required unless data_len's native data type
* 'CPU_INT16U' is incorrectly configured as a signed integer in 'cpu.h'.
*
* (6) On ANY transmit error, any remaining application data transmit is immediately aborted.
*
* (7) Network buffer already freed by lower layer; only increment error counter.
*********************************************************************************************************
*/
CPU_INT16U NetUDP_TxAppData (void *p_data,
CPU_INT16U data_len,
NET_IP_ADDR src_addr,
NET_UDP_PORT_NBR src_port,
NET_IP_ADDR dest_addr,
NET_UDP_PORT_NBR dest_port,
NET_IP_TOS TOS,
NET_IP_TTL TTL,
CPU_INT16U flags_udp,
CPU_INT16U flags_ip,
void *popts_ip,
NET_ERR *perr)
{
#if ((NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) && \
(NET_CTR_CFG_ERR_EN == DEF_ENABLED) && \
(CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
#if 0 /* See Note #5b2. */
CPU_SR cpu_sr;
#endif
#endif
NET_BUF *pbuf;
NET_BUF_HDR *pbuf_hdr;
NET_BUF_SIZE buf_size_max;
NET_BUF_SIZE buf_size_max_data;
NET_BUF_SIZE data_ix_pkt;
NET_BUF_SIZE data_len_pkt;
CPU_INT16U data_len_tot;
CPU_INT08U *p_data_pkt;
NET_ERR err_rtn;
#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)
if (Net_InitDone != DEF_YES) { /* If init NOT complete, exit tx (see Note #3). */
*perr = NET_ERR_INIT_INCOMPLETE;
return (0);
}
/* ---------------- VALIDATE APP DATA ----------------- */
if (p_data == (void *)0) {
if (data_len > 0) {
*perr = NET_UDP_ERR_NULL_PTR;
return (0);
}
}
#if 0 /* See Note #5b2. */
if (data_len < 0) {
NET_CTR_ERR_INC(NetUDP_ErrTxInvalidSizeCtr);
*perr = NET_UDP_ERR_INVALID_DATA_SIZE;
return (0);
}
#endif
#endif
/*$PAGE*/
/* ------------------- TX APP DATA -------------------- */
/* Calc buf max data size. */
data_ix_pkt = NET_BUF_DATA_TX_IX;
buf_size_max = NetBuf_GetMaxSize((NET_BUF *)0,
(NET_BUF_SIZE)data_ix_pkt);
buf_size_max_data = DEF_MIN(buf_size_max, NET_UDP_MTU);
if (data_len > buf_size_max_data) { /* If data len > max data size, ... */
data_len_pkt = (NET_BUF_SIZE)buf_size_max_data; /* ... limit pkt data len to max data size. */
err_rtn = NET_UDP_ERR_INVALID_DATA_SIZE; /* ... (see Note #5a2). */
} else {
data_len_pkt = (NET_BUF_SIZE)data_len; /* Else limit pkt data len to data len. */
err_rtn = NET_UDP_ERR_NONE;
}
data_len_tot = 0;
p_data_pkt = (CPU_INT08U *)p_data;
pbuf = NetBuf_Get((NET_BUF_SIZE)data_len_pkt, /* Get app data tx buf. */
(NET_BUF_SIZE)data_ix_pkt,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -