summaryrefslogtreecommitdiffstats
path: root/clatd.c
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2013-04-10 12:24:56 +0900
committerLorenzo Colitti <lorenzo@google.com>2013-04-12 13:42:58 +0900
commitcd70b354eb985678175904a937085bed6094af77 (patch)
tree0a3664daec00a5a608f851a4f8e767cd5c072d3d /clatd.c
parentee80ca65907d214e2483e315a1ba7f610184de03 (diff)
downloadandroid_external_android-clat-cd70b354eb985678175904a937085bed6094af77.tar.gz
android_external_android-clat-cd70b354eb985678175904a937085bed6094af77.tar.bz2
android_external_android-clat-cd70b354eb985678175904a937085bed6094af77.zip
Support translating ICMP errors.
When receiving ICMPv6 messages from IPv6-only nodes, use 255.0.0.<ttl> as a fake IPv4 source address. It's better than nothing. Bug: 8276725 Change-Id: Iae93f75764cb9cd875af9bb5f1862a0dce2c2fa7
Diffstat (limited to 'clatd.c')
-rw-r--r--clatd.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/clatd.c b/clatd.c
index a914f02..063026d 100644
--- a/clatd.c
+++ b/clatd.c
@@ -317,12 +317,16 @@ void packet_handler(const struct tun_data *tunnel, struct tun_pi *tun_header, co
struct tun_pi tun_targ;
char iphdr[sizeof(struct ip6_hdr)];
char transporthdr[MAX_TCP_HDR];
+ char icmp_iphdr[sizeof(struct ip6_hdr)];
+ char icmp_transporthdr[MAX_TCP_HDR];
// iovec of the packets we'll send. This gets passed down to the translation functions.
clat_packet out = {
{ &tun_targ, sizeof(tun_targ) }, // Tunnel header.
{ iphdr, 0 }, // IP header.
{ transporthdr, 0 }, // Transport layer header.
+ { icmp_iphdr, 0 }, // ICMP error inner IP header.
+ { icmp_transporthdr, 0 }, // ICMP error transport layer header.
{ NULL, 0 }, // Payload. No buffer, it's a pointer to the original payload.
};