Skip to content
Snippets Groups Projects
Commit 5f310f22 authored by Vladimír Čunát's avatar Vladimír Čunát Committed by Ondřej Surý
Browse files

policy.MIRROR: support IPv6 link-local addresses

parent ab204957
Branches
Tags
2 merge requests!2571.2 merge master,!2181.2.4 dev
...@@ -32,21 +32,16 @@ if has_socket then ...@@ -32,21 +32,16 @@ if has_socket then
end end
end end
local function parse_target(target) local function addr_split_port(target)
local addr, port = target:match '([^@]*)@?(.*)' local addr, port = target:match '([^@]*)@?(.*)'
port = port and tonumber(port) or 53 port = port and tonumber(port) or 53
addr = kres.str2ip(addr)
if addr == nil then
error("target '"..target..'" is not a valid IP address')
end
return addr, port return addr, port
end end
local function parse_sock(target) -- String address@port -> sockaddr.
local addr, port = target:match '([^@]*)@?(.*)' local function addr2sock(target)
port = port and tonumber(port) or 53 local addr, port = addr_split_port(target)
sock = ffi.gc(ffi.C.kr_straddr_socket(addr, port), ffi.C.free); sock = ffi.gc(ffi.C.kr_straddr_socket(addr, port), ffi.C.free);
if sock == nil then if sock == nil then
error("target '"..target..'" is not a valid IP address') error("target '"..target..'" is not a valid IP address')
end end
...@@ -55,7 +50,7 @@ end ...@@ -55,7 +50,7 @@ end
-- Mirror request elsewhere, and continue solving -- Mirror request elsewhere, and continue solving
local function mirror(target) local function mirror(target)
local addr, port = parse_target(target) local addr, port = addr_split_port(target)
local sink, err = socket_client(addr, port) local sink, err = socket_client(addr, port)
if not sink then panic('MIRROR target %s is not a valid: %s', target, err) end if not sink then panic('MIRROR target %s is not a valid: %s', target, err) end
return function(state, req) return function(state, req)
...@@ -74,11 +69,11 @@ local function forward(target) ...@@ -74,11 +69,11 @@ local function forward(target)
local list = {} local list = {}
if type(target) == 'table' then if type(target) == 'table' then
for _, v in pairs(target) do for _, v in pairs(target) do
table.insert(list, parse_sock(v)) table.insert(list, addr2sock(v))
assert(#list <= 4, 'at most 4 FORWARD targets are supported') assert(#list <= 4, 'at most 4 FORWARD targets are supported')
end end
else else
table.insert(list, parse_sock(target)) table.insert(list, addr2sock(target))
end end
return function(state, req) return function(state, req)
req = kres.request_t(req) req = kres.request_t(req)
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment