summaryrefslogtreecommitdiffstats
path: root/translate.c
diff options
context:
space:
mode:
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2015-10-26 18:45:04 -0600
committerSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2015-11-15 13:21:45 -0700
commit32961d08e3abe5b4e81178bb8c37dd4df231306d (patch)
treec1e80bcbc7c1c0bb7792e1ac5fb4b0aa690bb633 /translate.c
parentb38ac868d20bb9c1cae087ab18691d242aad0c5c (diff)
downloadandroid_external_android-clat-32961d08e3abe5b4e81178bb8c37dd4df231306d.tar.gz
android_external_android-clat-32961d08e3abe5b4e81178bb8c37dd4df231306d.tar.bz2
android_external_android-clat-32961d08e3abe5b4e81178bb8c37dd4df231306d.zip
clatd: Relay checksum information from packet socket to TUN interface
With this change, we can notify network stack to disable checksum validation for GRO packets as well as other packets which have checksum validation completed earlier in a driver. GRO packets have the ip_summed field set to CHECKSUM_PARTIAL while checksum offloaded packets have the ip_summed field as CHECKSUM_UNNECESSARY. Kernel copies this ip_summed field to the status field in the tpacket filter. The information from the status field is then passed as part of the TUN header to the TUN interface. Any other packet will have the complete checksum validation done in the network stack. Note that this only applies to packets which are captured in packet sockets and passed onto the TUN interface. Change-Id: I536c0356cbbf30fed7ecda5fdd0d38fa0dfd7bf3
Diffstat (limited to 'translate.c')
-rw-r--r--translate.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/translate.c b/translate.c
index ddc9bac..bce9270 100644
--- a/translate.c
+++ b/translate.c
@@ -108,8 +108,8 @@ struct in6_addr ipv4_addr_to_ipv6_addr(uint32_t addr4) {
* tun_header - tunnel header, already allocated
* proto - ethernet protocol id: ETH_P_IP(ipv4) or ETH_P_IPV6(ipv6)
*/
-void fill_tun_header(struct tun_pi *tun_header, uint16_t proto) {
- tun_header->flags = 0;
+void fill_tun_header(struct tun_pi *tun_header, uint16_t proto, uint16_t skip_csum) {
+ tun_header->flags = htons(skip_csum);
tun_header->proto = htons(proto);
}
@@ -491,8 +491,9 @@ void send_rawv6(int fd, clat_packet out, int iov_len) {
* to_ipv6 - true if translating to ipv6, false if translating to ipv4
* packet - packet
* packetsize - size of packet
+ * skip_csum - true if kernel has to skip checksum validation, false if it has to validate checksum.
*/
-void translate_packet(int fd, int to_ipv6, const uint8_t *packet, size_t packetsize) {
+void translate_packet(int fd, int to_ipv6, const uint8_t *packet, size_t packetsize, uint16_t skip_csum) {
int iov_len = 0;
// Allocate buffers for all packet headers.
@@ -524,7 +525,7 @@ void translate_packet(int fd, int to_ipv6, const uint8_t *packet, size_t packets
} else {
iov_len = ipv6_packet(out, CLAT_POS_IPHDR, packet, packetsize);
if (iov_len > 0) {
- fill_tun_header(&tun_targ, ETH_P_IP);
+ fill_tun_header(&tun_targ, ETH_P_IP, skip_csum);
out[CLAT_POS_TUNHDR].iov_len = sizeof(tun_targ);
send_tun(fd, out, iov_len);
}