diff options
Diffstat (limited to 'checksum.c')
-rw-r--r-- | checksum.c | 38 |
1 files changed, 5 insertions, 33 deletions
@@ -49,25 +49,17 @@ uint32_t ip_checksum_add(uint32_t current, const void *data, int len) { return checksum; } -/* function: ip_checksum_fold - * folds a 32-bit partial checksum into 16 bits +/* function: ip_checksum_finish + * close the checksum * temp_sum - sum from ip_checksum_add - * returns: the folded checksum in network byte order */ -uint16_t ip_checksum_fold(uint32_t temp_sum) { +uint16_t ip_checksum_finish(uint32_t temp_sum) { while(temp_sum > 0xffff) temp_sum = (temp_sum >> 16) + (temp_sum & 0xFFFF); - return temp_sum; -} + temp_sum = (~temp_sum) & 0xffff; -/* function: ip_checksum_finish - * folds and closes the checksum - * temp_sum - sum from ip_checksum_add - * returns: a header checksum value in network byte order - */ -uint16_t ip_checksum_finish(uint32_t temp_sum) { - return ~ip_checksum_fold(temp_sum); + return temp_sum; } /* function: ip_checksum @@ -121,23 +113,3 @@ uint32_t ipv4_pseudo_header_checksum(uint32_t current, const struct iphdr *ip, u return current; } - -/* function: ip_checksum_adjust - * calculates a new checksum given a previous checksum and the old and new pseudo-header checksums - * checksum - the header checksum in the original packet in network byte order - * old_hdr_sum - the pseudo-header checksum of the original packet - * new_hdr_sum - the pseudo-header checksum of the translated packet - * returns: the new header checksum in network byte order - */ -uint16_t ip_checksum_adjust(uint16_t checksum, uint32_t old_hdr_sum, uint32_t new_hdr_sum) { - // Algorithm suggested in RFC 1624. - // http://tools.ietf.org/html/rfc1624#section-3 - checksum = ~checksum; - uint16_t folded_sum = ip_checksum_fold(checksum + new_hdr_sum); - uint16_t folded_old = ip_checksum_fold(old_hdr_sum); - if (folded_sum > folded_old) { - return ~(folded_sum - folded_old); - } else { - return ~(folded_sum - folded_old - 1); // end-around borrow - } -} |