Comparison

plugins/mod_s2s/s2sout.lib.lua @ 4922:d1fdc545f8b2

mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
author Kim Alvefur <zash@zash.se>
date Tue, 29 May 2012 18:02:48 +0200
parent 4906:89df1f03546a
child 4923:760a1f367f02
comparison
equal deleted inserted replaced
4921:9a01c6bc435e 4922:d1fdc545f8b2
23 local s2s_destroy_session = require "core.s2smanager".destroy_session; 23 local s2s_destroy_session = require "core.s2smanager".destroy_session;
24 24
25 local log = module._log; 25 local log = module._log;
26 26
27 local sources = {}; 27 local sources = {};
28 local has_ipv4, has_ipv6;
28 29
29 local dns_timeout = module:get_option_number("dns_timeout", 15); 30 local dns_timeout = module:get_option_number("dns_timeout", 15);
30 dns.settimeout(dns_timeout); 31 dns.settimeout(dns_timeout);
31 local max_dns_depth = module:get_option_number("dns_max_depth", 3); 32 local max_dns_depth = module:get_option_number("dns_max_depth", 3);
32 33
112 if srv_choice then 113 if srv_choice then
113 connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port; 114 connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port;
114 log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port); 115 log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port);
115 end 116 end
116 else 117 else
117 log("debug", to_host.." has no SRV records, falling back to A"); 118 log("debug", to_host.." has no SRV records, falling back to A/AAAA");
118 end 119 end
119 -- Try with SRV, or just the plain hostname if no SRV 120 -- Try with SRV, or just the plain hostname if no SRV
120 local ok, err = s2sout.try_connect(host_session, connect_host, connect_port); 121 local ok, err = s2sout.try_connect(host_session, connect_host, connect_port);
121 if not ok then 122 if not ok then
122 if not s2sout.attempt_connection(host_session, err) then 123 if not s2sout.attempt_connection(host_session, err) then
169 local IPs = {}; 170 local IPs = {};
170 host_session.ip_hosts = IPs; 171 host_session.ip_hosts = IPs;
171 local handle4, handle6; 172 local handle4, handle6;
172 local has_other = false; 173 local has_other = false;
173 174
175 if has_ipv4 then
174 handle4 = adns.lookup(function (reply, err) 176 handle4 = adns.lookup(function (reply, err)
175 handle4 = nil; 177 handle4 = nil;
176 178
177 -- COMPAT: This is a compromise for all you CNAME-(ab)users :) 179 -- COMPAT: This is a compromise for all you CNAME-(ab)users :)
178 if not (reply and reply[#reply] and reply[#reply].a) then 180 if not (reply and reply[#reply] and reply[#reply].a) then
212 end 214 end
213 else 215 else
214 has_other = true; 216 has_other = true;
215 end 217 end
216 end, connect_host, "A", "IN"); 218 end, connect_host, "A", "IN");
217 219 else
220 has_other = true;
221 end
222
223 if has_ipv6 then
218 handle6 = adns.lookup(function (reply, err) 224 handle6 = adns.lookup(function (reply, err)
219 handle6 = nil; 225 handle6 = nil;
220 226
221 if reply and reply[#reply] and reply[#reply].aaaa then 227 if reply and reply[#reply] and reply[#reply].aaaa then
222 for _, ip in ipairs(reply) do 228 for _, ip in ipairs(reply) do
244 end 250 end
245 else 251 else
246 has_other = true; 252 has_other = true;
247 end 253 end
248 end, connect_host, "AAAA", "IN"); 254 end, connect_host, "AAAA", "IN");
255 else
256 has_other = true;
257 end
249 258
250 return true; 259 return true;
251 elseif host_session.ip_hosts and #host_session.ip_hosts > host_session.ip_choice then -- Not our first attempt, and we also have IPs left to try 260 elseif host_session.ip_hosts and #host_session.ip_hosts > host_session.ip_choice then -- Not our first attempt, and we also have IPs left to try
252 s2sout.try_next_ip(host_session); 261 s2sout.try_next_ip(host_session);
253 else 262 else
345 end 354 end
346 else 355 else
347 sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4"); 356 sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
348 end 357 end
349 end 358 end
359 for i = 1,#sources do
360 if sources[i].proto == "IPv6" then
361 has_ipv6 = true;
362 elseif sources[i].proto == "IPv4" then
363 has_ipv4 = true;
364 end
365 end
350 end); 366 end);
351 367
352 return s2sout; 368 return s2sout;