fix dns parser
This commit is contained in:
parent
f5cb87dc6a
commit
8e2e3a7f39
@ -32,6 +32,7 @@
|
||||
src_ip,
|
||||
src_port,
|
||||
packet,
|
||||
qname,
|
||||
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"),
|
||||
forward_to_upstream(DnsIp, DnsPort, Packet, Msg),
|
||||
%% 开启定时器,超时后递归请求后面的服务
|
||||
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), trigger_next),
|
||||
{noreply, State#state{dns_servers = RestDnsServers}}
|
||||
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), {trigger_next, Msg}),
|
||||
{noreply, State#state{dns_servers = RestDnsServers, qname = Qname}}
|
||||
end;
|
||||
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} |
|
||||
{stop, Reason :: term(), NewState :: #state{}}).
|
||||
%% 处理超时重试
|
||||
handle_info({timeout, _, trigger_next}, State = #state{packet = Packet, dns_servers = [{DnsIp, DnsPort}|RestDnsServers]}) ->
|
||||
forward_to_upstream(DnsIp, DnsPort, Packet),
|
||||
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), trigger_next),
|
||||
handle_info({timeout, _, {trigger_next, Msg}}, State = #state{packet = Packet, dns_servers = [{DnsIp, DnsPort}|RestDnsServers]}) ->
|
||||
forward_to_upstream(DnsIp, DnsPort, Packet, Msg),
|
||||
erlang:start_timer(?UPSTREAM_TIMEOUT, self(), {trigger_next, Msg}),
|
||||
{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};
|
||||
|
||||
handle_info({timeout, _, handler_max_ttl}, State) ->
|
||||
@ -120,8 +121,16 @@ handle_info({timeout, _, handler_max_ttl}, State) ->
|
||||
{stop, normal, State};
|
||||
|
||||
%% 收到请求
|
||||
handle_info({dns_resolver_reply, Resp}, State = #state{socket = Sock, src_ip = SrcIp, src_port = SrcPort}) ->
|
||||
gen_udp:send(Sock, SrcIp, SrcPort, dns:encode_message(Resp)),
|
||||
handle_info({dns_resolver_reply, Resp}, State = #state{socket = Sock, src_ip = SrcIp, src_port = SrcPort, qname = Qname}) ->
|
||||
%% 尝试解析
|
||||
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}.
|
||||
|
||||
%% @private
|
||||
@ -154,4 +163,4 @@ forward_to_upstream(TargetIp, TargetPort, Request, Msg) ->
|
||||
|
||||
build_response(Req, RR) ->
|
||||
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} |
|
||||
{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}) ->
|
||||
lager:debug("[dns_resolver] forward request to: ~p", [{TargetIp, TargetPort}]),
|
||||
ok = gen_udp:send(Socket, TargetIp, TargetPort, Request),
|
||||
|
||||
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}),
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
%% 公共的dns域名解析服务
|
||||
{public_dns_servers, [
|
||||
{{8,8,8,8}, 53},
|
||||
{{114, 114, 114, 114}, 53},
|
||||
{{8,8,8,8}, 53}
|
||||
]},
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user