📄 net_util.c
字号:
(CPU_INT32U)size_rem_32);
sum_32 += (CPU_INT32U)sum_val_32;
size_rem -= (CPU_INT32U)size_rem_32;
pdata_08 = (CPU_INT08U *)pdata_16;
pdata_08 += size_rem_32; /* MUST NOT cast ptr operand (see Note #7b). */
pdata_16 = (CPU_INT16U *)pdata_08;
#else
pdata_32 = (CPU_INT32U *)pdata_16;
while (size_rem >= sizeof(CPU_INT32U)) { /* While pkt data aligned on 32-bit boundary; ... */
data_val_32 = (CPU_INT32U) *pdata_32++; /* ... get sum data with 32-bit data words, ... */
data_val_16 = (CPU_INT16U)((data_val_32 >> 16) & 0x0000FFFF);
sum_val_32 = (CPU_INT32U) NET_UTIL_HOST_TO_NET_16(data_val_16); /* Conv to net-order (see Note #5b). */
sum_32 += (CPU_INT32U) sum_val_32; /* ... & calc sum with upper 16-bit data word ... */
data_val_16 = (CPU_INT16U) (data_val_32 & 0x0000FFFF);
sum_val_32 = (CPU_INT32U) NET_UTIL_HOST_TO_NET_16(data_val_16); /* Conv to net-order (see Note #5b). */
sum_32 += (CPU_INT32U) sum_val_32; /* ... & lower 16-bit data word. */
size_rem -= sizeof(CPU_INT32U);
}
pdata_16 = (CPU_INT16U *)pdata_32;
#endif
#endif
while (size_rem >= sizeof(CPU_INT16U)) { /* While pkt data aligned on 16-bit boundary; .. */
data_val_16 = (CPU_INT16U)*pdata_16++;
sum_val_32 = (CPU_INT32U) NET_UTIL_HOST_TO_NET_16(data_val_16); /* Conv to net-order (see Note #5b). */
sum_32 += (CPU_INT32U) sum_val_32; /* .. calc sum with 16-bit data words. */
size_rem -= sizeof(CPU_INT16U);
}
if (size_rem > 0) {
sum_val_32 = (CPU_INT32U)(*((CPU_INT08U *)pdata_16));
}
} else { /* Else pkt data NOT aligned on 16-bit boundary, .. */
while (size_rem >= sizeof(CPU_INT16U)) {
sum_val_32 = (CPU_INT32U)*pdata_08++;
sum_val_32 <<= DEF_OCTET_NBR_BITS;
sum_val_32 += (CPU_INT32U)*pdata_08++;
sum_32 += (CPU_INT32U) sum_val_32; /* .. calc sum with 8-bit data vals. */
size_rem -= sizeof(CPU_INT16U);
}
if (size_rem > 0) {
sum_val_32 = (CPU_INT32U)*pdata_08;
}
}
/*$PAGE*/
if (size_rem > 0) {
if (last_pkt_buf != DEF_NO) { /* If last pkt buf, ... */
sum_val_32 <<= DEF_OCTET_NBR_BITS; /* ... pad odd-len pkt len (see Note #8). */
sum_32 += (CPU_INT32U)sum_val_32;
} else {
*poctet_last = (CPU_INT08U)sum_val_32; /* Else rtn last octet. */
DEF_BIT_SET(*psum_err, NET_UTIL_16_BIT_SUM_ERR_LAST_OCTET);
}
}
return (sum_32); /* Rtn 16-bit sum (see Note #5c1). */
}
/*$PAGE*/
/*
*********************************************************************************************************
* NetUtil_16BitOnesCplSumDataCalc()
*
* Description : Calculate 16-bit one's-complement sum on packet data.
*
* (1) Calculates the 16-bit one's-complement sum of packet data encapsulated in :
*
* (a) One or more network buffers Support non-fragmented & fragmented packets
* (b) Transport layer pseudo-header See RFC #768, Section 'Fields : Checksum' &
* RFC #793, Section 3.1 'Header Format :
* Checksum'.
*
* Argument(s) : pdata_buf Pointer to packet data network buffer(s) (see Notes #1a & #2).
*
* ppseudo_hdr Pointer to transport layer pseudo-header (see Note #1b).
*
* pseudo_hdr_size Size of transport layer pseudo-header.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* NET_UTIL_ERR_NONE 16-bit one's-complement sum calculated;
* check return value.
* NET_UTIL_ERR_NULL_PTR Argument 'pdata_buf' passed a NULL pointer.
* NET_UTIL_ERR_NULL_SIZE Packet data is a zero size.
* NET_UTIL_ERR_INVALID_PROTOCOL Invalid data packet protocol.
* NET_BUF_ERR_INVALID_IX Invalid buffer index.
*
* Return(s) : 16-bit one's-complement sum, if NO errors.
*
* 0, otherwise.
*
* Caller(s) : NetUtil_16BitOnesCplChkSumDataCalc(),
* NetUtil_16BitOnesCplChkSumDataVerify().
*
* Note(s) : (2) Pointer to network buffer packet NOT validated as a network buffer. However, no memory
* corruption occurs since no write operations are performed.
*
* (3) Default case already invalidated in earlier functions. However, the default case is
* included as an extra precaution in case 'ProtocolHdrType' is incorrectly modified.
*
* (4) (a) Since the 16-bit sum calculations are returned as 32-bit network-order values
* (see 'NetUtil_16BitSumDataCalc() Note #5c1'), ...
*
* (b) ... the one's-complement sum MUST be converted to host-order but MUST NOT be re-
* converted back to network-order (see 'NetUtil_16BitSumDataCalc() Note #5c3').
*********************************************************************************************************
*/
/*$PAGE*/
static CPU_INT16U NetUtil_16BitOnesCplSumDataCalc (void *pdata_buf,
void *ppseudo_hdr,
CPU_INT16U pseudo_hdr_size,
NET_ERR *perr)
{
NET_BUF *pbuf;
NET_BUF *pbuf_next;
NET_BUF_HDR *pbuf_hdr;
void *p_data;
CPU_INT32U sum;
CPU_INT32U sum_val;
CPU_INT16U sum_ones_cpl;
CPU_INT16U sum_ones_cpl_host;
CPU_INT16U data_ix;
CPU_INT16U data_len;
CPU_INT08U sum_err;
CPU_INT08U octet_prev;
CPU_INT08U octet_last;
CPU_BOOLEAN octet_prev_valid;
CPU_BOOLEAN octet_last_valid;
CPU_BOOLEAN mem_buf_last;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
CPU_BOOLEAN mem_buf_first;
CPU_BOOLEAN mem_buf_null_size;
#endif
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED) /* ----------------- VALIDATE PTR ----------------- */
if (pdata_buf == (void *)0) {
*perr = NET_UTIL_ERR_NULL_PTR;
return (0);
}
#endif
/* ------ CALC PKT DATA 16-BIT ONE'S-CPL SUM ------ */
pbuf = (NET_BUF *)pdata_buf;
sum = 0;
octet_prev = 0;
octet_last = 0;
octet_prev_valid = DEF_NO;
octet_last_valid = DEF_NO;
mem_buf_last = DEF_NO;
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
mem_buf_first = DEF_YES;
#endif
if (ppseudo_hdr != (void *)0) { /* Calc pkt's pseudo-hdr 16-bit sum (see Note #1b). */
sum_val = NetUtil_16BitSumDataCalc((void *) ppseudo_hdr,
(CPU_INT16U ) pseudo_hdr_size,
(CPU_INT08U *)&octet_prev,
(CPU_INT08U *)&octet_last,
(CPU_BOOLEAN ) octet_prev_valid,
(CPU_BOOLEAN ) mem_buf_last,
(CPU_INT08U *)&sum_err);
sum += sum_val;
octet_last_valid = DEF_BIT_IS_SET(sum_err, NET_UTIL_16_BIT_SUM_ERR_LAST_OCTET);
if (octet_last_valid == DEF_YES) { /* If last octet from pseudo-hdr avail, ... */
octet_prev = octet_last; /* ... prepend last octet to first pkt buf. */
octet_prev_valid = DEF_YES;
} else {
octet_prev = 0;
octet_prev_valid = DEF_NO;
}
}
/*$PAGE*/
while (pbuf != (NET_BUF *)0) { /* Calc ALL data pkts' 16-bit sum (see Note #1a). */
pbuf_hdr = &pbuf->Hdr;
switch (pbuf_hdr->ProtocolHdrType) { /* Demux pkt buf's protocol ix & len. */
case NET_PROTOCOL_TYPE_ICMP:
data_ix = pbuf_hdr->ICMP_MsgIx;
data_len = pbuf_hdr->ICMP_HdrLen + (CPU_INT16U)pbuf_hdr->DataLen;
break;
case NET_PROTOCOL_TYPE_UDP:
case NET_PROTOCOL_TYPE_TCP:
data_ix = pbuf_hdr->TCP_UDP_HdrDataIx;
data_len = pbuf_hdr->TCP_UDP_HdrLen + (CPU_INT16U)pbuf_hdr->DataLen;
break;
default: /* See Note #3. */
*perr = NET_UTIL_ERR_INVALID_PROTOCOL;
return (0); /* Prevent 'break NOT reachable' compiler warning. */
}
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
if (data_ix == NET_BUF_IX_NONE) {
*perr = NET_BUF_ERR_INVALID_IX;
return (0);
}
#endif
p_data = (void *)&pbuf->Data[data_ix];
pbuf_next = (NET_BUF *) pbuf_hdr->NextBufPtr;
mem_buf_last = (pbuf_next == (NET_BUF *)0) ? DEF_YES : DEF_NO;
/* Calc pkt buf's 16-bit sum. */
sum_val = NetUtil_16BitSumDataCalc((void *) p_data,
(CPU_INT16U ) data_len,
(CPU_INT08U *)&octet_prev,
(CPU_INT08U *)&octet_last,
(CPU_BOOLEAN ) octet_prev_valid,
(CPU_BOOLEAN ) mem_buf_last,
(CPU_INT08U *)&sum_err);
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
if (mem_buf_first == DEF_YES) {
mem_buf_first = DEF_NO;
if (mem_buf_last == DEF_YES) {
mem_buf_null_size = DEF_BIT_IS_SET(sum_err, NET_UTIL_16_BIT_SUM_ERR_NULL_SIZE);
if (mem_buf_null_size != DEF_NO) { /* If ONLY mem buf & null size, rtn err. */
*perr = NET_UTIL_ERR_NULL_SIZE;
return (0);
}
}
}
#endif
if (mem_buf_last != DEF_YES) { /* If NOT on last pkt buf & ... */
octet_last_valid = DEF_BIT_IS_SET(sum_err, NET_UTIL_16_BIT_SUM_ERR_LAST_OCTET);
if (octet_last_valid == DEF_YES) { /* ... last octet from cur pkt buf avail, */
octet_prev = octet_last; /* ... prepend last octet to next pkt buf. */
octet_prev_valid = DEF_YES;
} else {
octet_prev = 0;
octet_prev_valid = DEF_NO;
}
}
sum += sum_val;
pbuf = pbuf_next;
}
while (sum >> 16) { /* While 16-bit sum ovf's, ... */
sum = (sum & 0x0000FFFF) + (sum >> 16); /* ... sum ovf bits back into 16-bit one's-cpl sum. */
}
sum_ones_cpl = (CPU_INT16U)sum;
sum_ones_cpl_host = NET_UTIL_NET_TO_HOST_16(sum_ones_cpl); /* Conv back to host-order (see Note #4b). */
*perr = NET_UTIL_ERR_NONE;
return (sum_ones_cpl_host); /* Rtn 16-bit one's-cpl sum (see Note #1). */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -