summaryrefslogtreecommitdiff
path: root/nuttx/net/uip/uip-chksum.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/net/uip/uip-chksum.c')
-rw-r--r--nuttx/net/uip/uip-chksum.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/nuttx/net/uip/uip-chksum.c b/nuttx/net/uip/uip-chksum.c
index ebf814e8b..c8c173b95 100644
--- a/nuttx/net/uip/uip-chksum.c
+++ b/nuttx/net/uip/uip-chksum.c
@@ -116,12 +116,15 @@ static uint16 upper_layer_chksum(struct uip_driver_s *dev, uint8 proto)
/* First sum pseudoheader. */
/* IP protocol and length fields. This addition cannot carry. */
+
sum = upper_layer_len + proto;
/* Sum IP source and destination addresses. */
+
sum = chksum(sum, (uint8 *)&BUF->srcipaddr, 2 * sizeof(uip_ipaddr_t));
/* Sum TCP header and data. */
+
sum = chksum(sum, &dev->d_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_len);
return (sum == 0) ? 0xffff : htons(sum);
@@ -143,35 +146,49 @@ static uint16 uip_icmp6chksum(struct uip_driver_s *dev)
/* Calculate the Internet checksum over a buffer. */
#if !UIP_ARCH_ADD32
-void uip_add32(uint8 *op32, uint16 op16)
+static void uip_carry32(uint8 *sum, uint16 op16)
{
- uip_acc32[3] = op32[3] + (op16 & 0xff);
- uip_acc32[2] = op32[2] + (op16 >> 8);
- uip_acc32[1] = op32[1];
- uip_acc32[0] = op32[0];
-
- if (uip_acc32[2] < (op16 >> 8))
+ if (sum[2] < (op16 >> 8))
{
- ++uip_acc32[1];
- if (uip_acc32[1] == 0)
+ ++sum[1];
+ if (sum[1] == 0)
{
- ++uip_acc32[0];
+ ++sum[0];
}
}
- if (uip_acc32[3] < (op16 & 0xff))
+ if (sum[3] < (op16 & 0xff))
{
- ++uip_acc32[2];
- if (uip_acc32[2] == 0)
+ ++sum[2];
+ if (sum[2] == 0)
{
- ++uip_acc32[1];
- if (uip_acc32[1] == 0)
+ ++sum[1];
+ if (sum[1] == 0)
{
- ++uip_acc32[0];
+ ++sum[0];
}
}
}
}
+
+void uip_add32(const uint8 *op32, uint16 op16, uint8 *sum)
+{
+ /* op32 and the sum are in network order (big-endian); op16 is host order. */
+
+ sum[3] = op32[3] + (op16 & 0xff);
+ sum[2] = op32[2] + (op16 >> 8);
+ sum[1] = op32[1];
+ sum[0] = op32[0];
+ uip_carry32(sum, op16);
+}
+
+void uip_incr32(uint8 *op32, uint16 op16)
+{
+ op32[3] += (op16 & 0xff);
+ op32[2] += (op16 >> 8);
+ uip_carry32(op32, op16);
+}
+
#endif /* UIP_ARCH_ADD32 */
#if !UIP_ARCH_CHKSUM