diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2019-01-30 00:38:46 -0800 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2019-01-30 00:38:46 -0800 |
commit | 156db333bba726a074dde7b1644e38d24dc9d6a1 (patch) | |
tree | 50c90d0f04d303ddb4ebded33676a6bd71aa0e32 | |
parent | 56c625999a4434e7b285ea8c43bcdb648872f45d (diff) | |
parent | 7dde6ef867b08c87c0f77d0b7824ea0491ce7ccd (diff) | |
download | platform_external_android-clat-156db333bba726a074dde7b1644e38d24dc9d6a1.tar.gz platform_external_android-clat-156db333bba726a074dde7b1644e38d24dc9d6a1.tar.bz2 platform_external_android-clat-156db333bba726a074dde7b1644e38d24dc9d6a1.zip |
Move checksum code from clatd to libnetutils. am: 98de5958cf am: db02878bb2
am: 7dde6ef867
Change-Id: I3aa67d2ab2b45aafa80a8218f9acc44fbfdc81bb
-rw-r--r-- | Android.bp | 5 | ||||
-rw-r--r-- | checksum.c | 142 | ||||
-rw-r--r-- | checksum.h | 34 | ||||
-rw-r--r-- | clatd_microbenchmark.c | 2 | ||||
-rw-r--r-- | clatd_test.cpp | 2 | ||||
-rw-r--r-- | config.c | 2 | ||||
-rw-r--r-- | dump.c | 3 | ||||
-rw-r--r-- | ipv4.c | 3 | ||||
-rw-r--r-- | ipv6.c | 3 | ||||
-rw-r--r-- | translate.c | 3 |
10 files changed, 14 insertions, 185 deletions
@@ -21,7 +21,6 @@ cc_defaults { filegroup { name: "clatd_common", srcs: [ - "checksum.c", "config.c", "clatd.c", "dns64.c", @@ -90,7 +89,9 @@ cc_test { defaults: ["clatd_defaults"], srcs: [ "clatd_microbenchmark.c", - "checksum.c", "tun.c", ], + shared_libs: [ + "libnetutils", + ], } diff --git a/checksum.c b/checksum.c deleted file mode 100644 index 11b5149..0000000 --- a/checksum.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2011 Daniel Drown - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * checksum.c - ipv4/ipv6 checksum calculation - */ -#include <netinet/icmp6.h> -#include <netinet/in.h> -#include <netinet/ip.h> -#include <netinet/ip6.h> -#include <netinet/ip_icmp.h> -#include <netinet/tcp.h> -#include <netinet/udp.h> - -#include "checksum.h" - -/* function: ip_checksum_add - * adds data to a checksum - * current - the current checksum (or 0 to start a new checksum) - * data - the data to add to the checksum - * len - length of data - */ -uint32_t ip_checksum_add(uint32_t current, const void *data, int len) { - uint32_t checksum = current; - int left = len; - const uint16_t *data_16 = data; - - while (left > 1) { - checksum += *data_16; - data_16++; - left -= 2; - } - if (left) { - checksum += *(uint8_t *)data_16; - } - - return checksum; -} - -/* function: ip_checksum_fold - * folds a 32-bit partial checksum into 16 bits - * temp_sum - sum from ip_checksum_add - * returns: the folded checksum in network byte order - */ -uint16_t ip_checksum_fold(uint32_t temp_sum) { - while (temp_sum > 0xffff) { - temp_sum = (temp_sum >> 16) + (temp_sum & 0xFFFF); - } - return temp_sum; -} - -/* 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); } - -/* function: ip_checksum - * combined ip_checksum_add and ip_checksum_finish - * data - data to checksum - * len - length of data - */ -uint16_t ip_checksum(const void *data, int len) { - uint32_t temp_sum; - - temp_sum = ip_checksum_add(0, data, len); - return ip_checksum_finish(temp_sum); -} - -/* function: ipv6_pseudo_header_checksum - * calculate the pseudo header checksum for use in tcp/udp/icmp headers - * ip6 - the ipv6 header - * len - the transport length (transport header + payload) - * protocol - the transport layer protocol, can be different from ip6->ip6_nxt for fragments - */ -uint32_t ipv6_pseudo_header_checksum(const struct ip6_hdr *ip6, uint16_t len, uint8_t protocol) { - uint32_t checksum_len, checksum_next; - checksum_len = htonl((uint32_t)len); - checksum_next = htonl(protocol); - - uint32_t current = 0; - - current = ip_checksum_add(current, &(ip6->ip6_src), sizeof(struct in6_addr)); - current = ip_checksum_add(current, &(ip6->ip6_dst), sizeof(struct in6_addr)); - current = ip_checksum_add(current, &checksum_len, sizeof(checksum_len)); - current = ip_checksum_add(current, &checksum_next, sizeof(checksum_next)); - - return current; -} - -/* function: ipv4_pseudo_header_checksum - * calculate the pseudo header checksum for use in tcp/udp headers - * ip - the ipv4 header - * len - the transport length (transport header + payload) - */ -uint32_t ipv4_pseudo_header_checksum(const struct iphdr *ip, uint16_t len) { - uint16_t temp_protocol, temp_length; - - temp_protocol = htons(ip->protocol); - temp_length = htons(len); - - uint32_t current = 0; - - current = ip_checksum_add(current, &(ip->saddr), sizeof(uint32_t)); - current = ip_checksum_add(current, &(ip->daddr), sizeof(uint32_t)); - current = ip_checksum_add(current, &temp_protocol, sizeof(uint16_t)); - current = ip_checksum_add(current, &temp_length, sizeof(uint16_t)); - - 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 - } -} diff --git a/checksum.h b/checksum.h deleted file mode 100644 index 669b42c..0000000 --- a/checksum.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2011 Daniel Drown - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * checksum.h - checksum functions - */ -#ifndef __CHECKSUM_H__ -#define __CHECKSUM_H__ - -#include <netinet/ip.h> -#include <netinet/ip6.h> -#include <stdint.h> - -uint32_t ip_checksum_add(uint32_t current, const void *data, int len); -uint16_t ip_checksum_finish(uint32_t temp_sum); -uint16_t ip_checksum(const void *data, int len); - -uint32_t ipv6_pseudo_header_checksum(const struct ip6_hdr *ip6, uint16_t len, uint8_t protocol); -uint32_t ipv4_pseudo_header_checksum(const struct iphdr *ip, uint16_t len); - -uint16_t ip_checksum_adjust(uint16_t checksum, uint32_t old_hdr_sum, uint32_t new_hdr_sum); - -#endif /* __CHECKSUM_H__ */ diff --git a/clatd_microbenchmark.c b/clatd_microbenchmark.c index 83be006..91b0996 100644 --- a/clatd_microbenchmark.c +++ b/clatd_microbenchmark.c @@ -41,7 +41,7 @@ #include <time.h> #include <unistd.h> -#include "checksum.h" +#include "netutils/checksum.h" #include "tun.h" #define DEVICENAME "clat4" diff --git a/clatd_test.cpp b/clatd_test.cpp index 7705a36..8e49824 100644 --- a/clatd_test.cpp +++ b/clatd_test.cpp @@ -29,10 +29,10 @@ #include "tun_interface.h" extern "C" { -#include "checksum.h" #include "clatd.h" #include "config.h" #include "getaddr.h" +#include "netutils/checksum.h" #include "translate.h" #include "tun.h" } @@ -25,9 +25,9 @@ #include <unistd.h> #include <cutils/config_utils.h> +#include <netutils/checksum.h> #include <netutils/ifc.h> -#include "checksum.h" #include "clatd.h" #include "config.h" #include "dns64.h" @@ -29,7 +29,8 @@ #include <netinet/tcp.h> #include <netinet/udp.h> -#include "checksum.h" +#include "netutils/checksum.h" + #include "clatd.h" #include "debug.h" #include "logging.h" @@ -17,7 +17,8 @@ */ #include <string.h> -#include "checksum.h" +#include "netutils/checksum.h" + #include "debug.h" #include "dump.h" #include "logging.h" @@ -19,7 +19,8 @@ #include <arpa/inet.h> -#include "checksum.h" +#include "netutils/checksum.h" + #include "config.h" #include "debug.h" #include "dump.h" diff --git a/translate.c b/translate.c index df3d020..1632753 100644 --- a/translate.c +++ b/translate.c @@ -17,7 +17,8 @@ */ #include <string.h> -#include "checksum.h" +#include "netutils/checksum.h" + #include "clatd.h" #include "common.h" #include "config.h" |