summaryrefslogtreecommitdiffstats
path: root/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/net')
-rw-r--r--src/net/ipv4.c5
-rw-r--r--src/net/ipv6.c2
-rw-r--r--src/net/udp.c1
3 files changed, 7 insertions, 1 deletions
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index 7959cf355..8eb04a65f 100644
--- a/src/net/ipv4.c
+++ b/src/net/ipv4.c
@@ -358,8 +358,11 @@ static int ipv4_tx ( struct io_buffer *iobuf,
( ( netdev->rx_stats.good & 0xf ) << 0 ) );
/* Fix up checksums */
- if ( trans_csum )
+ if ( trans_csum ) {
*trans_csum = ipv4_pshdr_chksum ( iobuf, *trans_csum );
+ if ( ! *trans_csum )
+ *trans_csum = tcpip_protocol->zero_csum;
+ }
iphdr->chksum = tcpip_chksum ( iphdr, sizeof ( *iphdr ) );
/* Print IP4 header for debugging */
diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index 012ba5921..bbc00d33e 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -522,6 +522,8 @@ static int ipv6_tx ( struct io_buffer *iobuf,
*trans_csum = ipv6_pshdr_chksum ( iphdr, len,
tcpip_protocol->tcpip_proto,
*trans_csum );
+ if ( ! *trans_csum )
+ *trans_csum = tcpip_protocol->zero_csum;
}
/* Print IPv6 header for debugging */
diff --git a/src/net/udp.c b/src/net/udp.c
index 0f7dfb24a..1fbc12d48 100644
--- a/src/net/udp.c
+++ b/src/net/udp.c
@@ -328,6 +328,7 @@ static int udp_rx ( struct io_buffer *iobuf,
struct tcpip_protocol udp_protocol __tcpip_protocol = {
.name = "UDP",
.rx = udp_rx,
+ .zero_csum = TCPIP_NEGATIVE_ZERO_CSUM,
.tcpip_proto = IP_UDP,
};