Hello!
We do a SIIT (Stateless IP/ICMP Translator) for the Linux kernel (2.2.14).
------------- -------- -------------
| IPv6 only |----| SIIT |--------| IPv4 only |
------------- -------- -------------
The IPv6 only host must send the packet with
source address: IPv4 TRANSLATED IPv6 (::ffff:0:0:0/96 prefix)
dest. address: IPv4 MAPPED IPv6 (::ffff:0:0/96 prefix)
The SIIT gets the source and destination embedded addresses, drop the IPv6
header (and the extension headers), put an IPv4 header into the packet,
and send it.
We have the following problem: if we want to connect to an IPv4_MAPPED
address with IPv6, it opens an IPv4 socket instead of IPv6.
The IPv4 only host gets the converted packet, responds it, the SIIT
converts it into IPv6, and the IPv6 only host's kernel drops it, because
it sent an IPv4 connect and got IPv6 packet.
We found the codes that were responsible for the "IPv6->IPv4 fall back",
we commented it out. It works, but there must be a "nice" solution.
Is there any special reason that the IPv6 implementation of Linux works
this way?
The another problem is: if we "ping" the IPv6 only host from the IPv4 only
host over the SIIT, the packet the IPv6 only host receives has IPv4 MAPPED
IPv6 source address, and it doesn't response for it.
shogy
|