if(IsAnyAddress(locala)) {
int val=1;
- setsockopt(s, IPPROTO_IP, GEN_IP_PKTINFO, &val, sizeof(val));
- setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &val, sizeof(val));
+ setsockopt(s, IPPROTO_IP, GEN_IP_PKTINFO, &val, sizeof(val)); // linux supports this, so why not - might fail on other systems
+ setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &val, sizeof(val));
+ setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)); // if this fails, we report an error in tcpreceiver too
}
if(::bind(s, (sockaddr*)&locala, sizeof(locala))<0) {
static void proxyQuestion(shared_ptr<DNSPacket> packet)
{
int sock=socket(AF_INET, SOCK_STREAM, 0);
+
Utility::setCloseOnExec(sock);
if(sock < 0)
throw NetworkError("Error making TCP connection socket to recursor: "+stringerror());
for(vector<string>::const_iterator laddr=locals.begin();laddr!=locals.end();++laddr) {
int s=socket(AF_INET,SOCK_STREAM,0);
Utility::setCloseOnExec(s);
-
+
if(s<0)
throw AhuException("Unable to acquire TCP socket: "+stringerror());
L<<Logger::Error<<"Setsockopt failed"<<endl;
exit(1);
}
-
+
if(::bind(s, (sockaddr*)&local, local.getSocklen())<0) {
L<<Logger::Error<<"binding to TCP socket: "<<strerror(errno)<<endl;
throw AhuException("Unable to bind to TCP socket");
L<<Logger::Error<<"Setsockopt failed"<<endl;
exit(1);
}
-
+ if(setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &tmp, sizeof(tmp)) < 0) {
+ L<<Logger::Error<<"Failed to set IPv6 socket to IPv6 only, continuing anyhow: "<<strerror(errno)<<endl;
+ }
if(bind(s, (const sockaddr*)&local, local.getSocklen())<0) {
L<<Logger::Error<<"binding to TCP socket: "<<strerror(errno)<<endl;
throw AhuException("Unable to bind to TCPv6 socket");