Index: uspace/srv/net/checksum.c
===================================================================
--- uspace/srv/net/checksum.c	(revision 4be390bb5b72a4e67b761fbf2beda61791c43f0e)
+++ uspace/srv/net/checksum.c	(revision 918e9910a408edff4d948fec80491d4c2945dc05)
@@ -46,9 +46,4 @@
  */
 #define CRC_DIVIDER_LE	0xEDB88320
-
-/** IP checksum value for computed zero checksum.
- *  Zero is returned as 0xFFFF (not flipped)
- */
-#define IP_CHECKSUM_ZERO			0xFFFFu
 
 uint32_t compute_crc32_le( uint32_t seed, uint8_t * data, size_t length ){
@@ -135,5 +130,6 @@
 uint16_t flip_checksum( uint16_t checksum ){
 	// flip, zero is returned as 0xFFFF (not flipped)
-	return ( ~ checksum ) ? ( uint16_t ) ( ~ checksum ) : IP_CHECKSUM_ZERO;
+	checksum = ~ checksum;
+	return checksum ? checksum : IP_CHECKSUM_ZERO;
 }
 
Index: uspace/srv/net/il/ip/ip.c
===================================================================
--- uspace/srv/net/il/ip/ip.c	(revision 4be390bb5b72a4e67b761fbf2beda61791c43f0e)
+++ uspace/srv/net/il/ip/ip.c	(revision 918e9910a408edff4d948fec80491d4c2945dc05)
@@ -1204,5 +1204,5 @@
 	}
 	// checksum
-	if(( header->header_checksum ) && ( IP_HEADER_CHECKSUM( header ))){
+	if(( header->header_checksum ) && ( IP_HEADER_CHECKSUM( header ) != IP_CHECKSUM_ZERO )){
 		phone = ip_prepare_icmp_and_get_phone( 0, packet, header );
 		if( phone >= 0 ){
Index: uspace/srv/net/include/checksum.h
===================================================================
--- uspace/srv/net/include/checksum.h	(revision 4be390bb5b72a4e67b761fbf2beda61791c43f0e)
+++ uspace/srv/net/include/checksum.h	(revision 918e9910a408edff4d948fec80491d4c2945dc05)
@@ -41,4 +41,9 @@
 
 #include <sys/types.h>
+
+/** IP checksum value for computed zero checksum.
+ *  Zero is returned as 0xFFFF (not flipped)
+ */
+#define IP_CHECKSUM_ZERO			0xFFFFu
 
 /**	Computes CRC32 value.
Index: uspace/srv/net/tl/icmp/icmp.c
===================================================================
--- uspace/srv/net/tl/icmp/icmp.c	(revision 4be390bb5b72a4e67b761fbf2beda61791c43f0e)
+++ uspace/srv/net/tl/icmp/icmp.c	(revision 918e9910a408edff4d948fec80491d4c2945dc05)
@@ -617,5 +617,5 @@
 	// checksum
 	if( header->checksum ){
-		while( ICMP_CHECKSUM( header, length )){
+		while( ICMP_CHECKSUM( header, length ) != IP_CHECKSUM_ZERO ){
 			// set the original message type on error notification
 			// type swap observed in Qemu
Index: uspace/srv/net/tl/tcp/tcp.c
===================================================================
--- uspace/srv/net/tl/tcp/tcp.c	(revision 4be390bb5b72a4e67b761fbf2beda61791c43f0e)
+++ uspace/srv/net/tl/tcp/tcp.c	(revision 918e9910a408edff4d948fec80491d4c2945dc05)
@@ -382,5 +382,5 @@
 		}
 		checksum = compute_checksum( checksum, socket_data->pseudo_header, socket_data->headerlen );
-		if( flip_checksum( compact_checksum( checksum ))){
+		if( flip_checksum( compact_checksum( checksum )) != IP_CHECKSUM_ZERO ){
 			printf( "checksum err %x -> %x\n", header->checksum, flip_checksum( compact_checksum( checksum )));
 			fibril_rwlock_write_unlock( socket_data->local_lock );
Index: uspace/srv/net/tl/udp/udp.c
===================================================================
--- uspace/srv/net/tl/udp/udp.c	(revision 4be390bb5b72a4e67b761fbf2beda61791c43f0e)
+++ uspace/srv/net/tl/udp/udp.c	(revision 918e9910a408edff4d948fec80491d4c2945dc05)
@@ -372,5 +372,5 @@
 	// check checksum
 	if( header->checksum ){
-		if( flip_checksum( compact_checksum( checksum ))){
+		if( flip_checksum( compact_checksum( checksum )) != IP_CHECKSUM_ZERO ){
 			if( tl_prepare_icmp_packet( udp_globals.net_phone, udp_globals.icmp_phone, packet, error ) == EOK ){
 				// checksum error ICMP
