|  |  |  | @ -30,10 +30,51 @@ uint32_t htonl(uint32_t val) | 
			
		
	
		
			
				
					|  |  |  |  | 	return (htons(val>>16) | (uint32_t)htons(val&0x0000FFFF)<<16); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static uint16_t generateChecksum(uint16_t sum, netIpHeader *data, uint16_t len) | 
			
		
	
		
			
				
					|  |  |  |  | {	 | 
			
		
	
		
			
				
					|  |  |  |  | 	uint16_t t; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	uint32_t *dataptr; | 
			
		
	
		
			
				
					|  |  |  |  | 	uint32_t *last_byte; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	dataptr		= (uint32_t *) data; | 
			
		
	
		
			
				
					|  |  |  |  | 	last_byte	= (uint32_t *) data + len - 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	while(dataptr < last_byte) {	// At least two more bytes
 | 
			
		
	
		
			
				
					|  |  |  |  | 		t = (dataptr[0] << 8) + dataptr[1]; | 
			
		
	
		
			
				
					|  |  |  |  | 		sum += t; | 
			
		
	
		
			
				
					|  |  |  |  | 		if(sum < t) { | 
			
		
	
		
			
				
					|  |  |  |  | 			sum++;		// carry
 | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		dataptr += 2; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if(dataptr == last_byte) { | 
			
		
	
		
			
				
					|  |  |  |  | 		t = (dataptr[0] << 8) + 0; | 
			
		
	
		
			
				
					|  |  |  |  | 		sum += t; | 
			
		
	
		
			
				
					|  |  |  |  | 		if(sum < t) { | 
			
		
	
		
			
				
					|  |  |  |  | 			sum++;		// carry
 | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Return sum in host byte order.
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return sum; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | uint16_t ipChecksum(netIpHeader *data, uint16_t len) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	return htons(generateChecksum(0, (netIpHeader *)data, len)); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | uint16_t netChecksum(netIpHeader *data, uint16_t len) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     register uint32_t sum = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 	uint16_t sum; | 
			
		
	
		
			
				
					|  |  |  |  | 	sum = generateChecksum(0, &data[len], len); | 
			
		
	
		
			
				
					|  |  |  |  | 	SPrintln_P(PSTR("uip_ipchksum: sum 0x")); | 
			
		
	
		
			
				
					|  |  |  |  | 	Serial.println((long int)sum, HEX); | 
			
		
	
		
			
				
					|  |  |  |  | 	return (sum == 0) ? 0xffff : htons(sum); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /*	  register uint32_t sum = 0;
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	for (;;) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (len < 2) | 
			
		
	
	
		
			
				
					|  |  |  | @ -43,16 +84,18 @@ uint16_t netChecksum(netIpHeader *data, uint16_t len) | 
			
		
	
		
			
				
					|  |  |  |  | 		data+=2; | 
			
		
	
		
			
				
					|  |  |  |  | 		len -= 2; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (len) | 
			
		
	
		
			
				
					|  |  |  |  | 		sum += *(uint8_t *) data; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	while ((len = (uint16_t) (sum >> 16)) != 0) | 
			
		
	
		
			
				
					|  |  |  |  | 		sum = (uint16_t) sum + len; | 
			
		
	
		
			
				
					|  |  |  |  | 	 | 
			
		
	
		
			
				
					|  |  |  |  | #if NET_DEBUG > 6 | 
			
		
	
		
			
				
					|  |  |  |  | 	Serial.print("Checksum: "); | 
			
		
	
		
			
				
					|  |  |  |  | 	Serial.println((uint16_t) sum ^ 0xFFFF, HEX); | 
			
		
	
		
			
				
					|  |  |  |  | 	 | 
			
		
	
		
			
				
					|  |  |  |  |     return (uint16_t) sum ^ 0xFFFF; | 
			
		
	
		
			
				
					|  |  |  |  | 	Serial.println((uint16_t) ~sum, HEX); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 	return (uint16_t) ~sum; | 
			
		
	
		
			
				
					|  |  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void netPrintEthAddr(struct netEthAddr* ethaddr) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |