fix dns parser
This commit is contained in:
parent
f5cb87dc6a
commit
8e2e3a7f39
@ -32,6 +32,7 @@
|
|||||||
src_ip,
|
src_ip,
|
||||||
src_port,
|
src_port,
|
||||||
packet,
|
packet,
|
||||||
|
qname,
|
||||||
dns_servers = []
|
dns_servers = []
|
||||||
}).
|
}).
|
||||||
|
|
||||||
@ -93,8 +94,8 @@ handle_cast(handle, State = #state{socket = Sock, src_ip = SrcIp, src_port = Src
|
|||||||
lager:debug("[dns_handler] cache is miss"),
|
lager:debug("[dns_handler] cache is miss"),
|
||||||
forward_to_upstream(DnsIp, DnsPort, Packet, Msg),
|
forward_to_upstream(DnsIp, DnsPort, Packet, Msg),
|
||||||
%% 开启定时器,超时后递归请求后面的服务
|
%% 开启定时器,超时后递归请求后面的服务
|
||||||
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), trigger_next),
|
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), {trigger_next, Msg}),
|
||||||
{noreply, State#state{dns_servers = RestDnsServers}}
|
{noreply, State#state{dns_servers = RestDnsServers, qname = Qname}}
|
||||||
end;
|
end;
|
||||||
Other ->
|
Other ->
|
||||||
lager:warning("[] decode msg get error: ~p", [Other]),
|
lager:warning("[] decode msg get error: ~p", [Other]),
|
||||||
@ -108,11 +109,11 @@ handle_cast(handle, State = #state{socket = Sock, src_ip = SrcIp, src_port = Src
|
|||||||
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
||||||
{stop, Reason :: term(), NewState :: #state{}}).
|
{stop, Reason :: term(), NewState :: #state{}}).
|
||||||
%% 处理超时重试
|
%% 处理超时重试
|
||||||
handle_info({timeout, _, trigger_next}, State = #state{packet = Packet, dns_servers = [{DnsIp, DnsPort}|RestDnsServers]}) ->
|
handle_info({timeout, _, {trigger_next, Msg}}, State = #state{packet = Packet, dns_servers = [{DnsIp, DnsPort}|RestDnsServers]}) ->
|
||||||
forward_to_upstream(DnsIp, DnsPort, Packet),
|
forward_to_upstream(DnsIp, DnsPort, Packet, Msg),
|
||||||
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), trigger_next),
|
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), {trigger_next, Msg}),
|
||||||
{noreply, State#state{dns_servers = RestDnsServers}};
|
{noreply, State#state{dns_servers = RestDnsServers}};
|
||||||
handle_info({timeout, _, trigger_next}, State = #state{dns_servers = []}) ->
|
handle_info({timeout, _, {trigger_next, _}}, State = #state{dns_servers = []}) ->
|
||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
handle_info({timeout, _, handler_max_ttl}, State) ->
|
handle_info({timeout, _, handler_max_ttl}, State) ->
|
||||||
@ -120,8 +121,16 @@ handle_info({timeout, _, handler_max_ttl}, State) ->
|
|||||||
{stop, normal, State};
|
{stop, normal, State};
|
||||||
|
|
||||||
%% 收到请求
|
%% 收到请求
|
||||||
handle_info({dns_resolver_reply, Resp}, State = #state{socket = Sock, src_ip = SrcIp, src_port = SrcPort}) ->
|
handle_info({dns_resolver_reply, Resp}, State = #state{socket = Sock, src_ip = SrcIp, src_port = SrcPort, qname = Qname}) ->
|
||||||
gen_udp:send(Sock, SrcIp, SrcPort, dns:encode_message(Resp)),
|
%% 尝试解析
|
||||||
|
case dns:decode_message(Resp) of
|
||||||
|
Msg = #dns_message{answers = Answers} ->
|
||||||
|
lager:debug("[dns_handler] get a resolver reply: ~p", [Msg]),
|
||||||
|
dns_cache:insert(Qname, Answers),
|
||||||
|
gen_udp:send(Sock, SrcIp, SrcPort, Resp);
|
||||||
|
Other ->
|
||||||
|
lager:debug("[dns_handler] parse reply get error: ~p", [Other])
|
||||||
|
end,
|
||||||
{stop, normal, State}.
|
{stop, normal, State}.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
@ -154,4 +163,4 @@ forward_to_upstream(TargetIp, TargetPort, Request, Msg) ->
|
|||||||
|
|
||||||
build_response(Req, RR) ->
|
build_response(Req, RR) ->
|
||||||
Msg = Req,
|
Msg = Req,
|
||||||
Msg#dns_message{answers=[RR], qr=true, aa=true}.
|
Msg#dns_message{answers = RR, qr = true, aa = true}.
|
||||||
@ -77,10 +77,11 @@ handle_call(_Request, _From, State = #state{}) ->
|
|||||||
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
||||||
{stop, Reason :: term(), NewState :: #state{}}).
|
{stop, Reason :: term(), NewState :: #state{}}).
|
||||||
handle_cast({forward, ReceiverPid, TargetIp, TargetPort, Request, #dns_message{id = TxId, questions = [#dns_query{name = QName}|_]}}, State = #state{socket = Socket, tid = Tid}) ->
|
handle_cast({forward, ReceiverPid, TargetIp, TargetPort, Request, #dns_message{id = TxId, questions = [#dns_query{name = QName}|_]}}, State = #state{socket = Socket, tid = Tid}) ->
|
||||||
|
lager:debug("[dns_resolver] forward request to: ~p", [{TargetIp, TargetPort}]),
|
||||||
ok = gen_udp:send(Socket, TargetIp, TargetPort, Request),
|
ok = gen_udp:send(Socket, TargetIp, TargetPort, Request),
|
||||||
|
|
||||||
Key = {TxId, TargetIp, TargetPort, QName},
|
Key = {TxId, TargetIp, TargetPort, QName},
|
||||||
ok = ets:insert(Tid, {Key, ReceiverPid}),
|
true = ets:insert(Tid, {Key, ReceiverPid}),
|
||||||
|
|
||||||
erlang:start_timer(?REQUEST_TTL, self(), {clean_ticker, Key}),
|
erlang:start_timer(?REQUEST_TTL, self(), {clean_ticker, Key}),
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
%% 公共的dns域名解析服务
|
%% 公共的dns域名解析服务
|
||||||
{public_dns_servers, [
|
{public_dns_servers, [
|
||||||
{{8,8,8,8}, 53},
|
{{114, 114, 114, 114}, 53},
|
||||||
{{8,8,8,8}, 53}
|
{{8,8,8,8}, 53}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user