@@ -117,7 +117,7 @@ getstat(PacketSocket, Opts) ->
117117init ([Owner , Port0 , TransportInfo , EmOpts , DTLSOptions , Socket ]) ->
118118 InternalActiveN = get_internal_active_n (),
119119 erlang :monitor (process , Owner ),
120- {ok , SessionIdHandle } = session_id_tracker (Socket , DTLSOptions ),
120+ {ok , SessionIdHandle } = session_id_tracker (Socket ),
121121 proc_lib :set_label ({dtls_server_packet_demultiplexer , Port0 }),
122122 {ok , # state {active_n = InternalActiveN ,
123123 port = Port0 ,
@@ -139,11 +139,11 @@ handle_call({accept, Accepter}, From, #state{active_n = N,
139139 listener = Socket } = State0 ) ->
140140 next_datagram (Socket , N ),
141141 State = State0 # state {first = false ,
142- accepters = queue :in ({Accepter , From }, Accepters )},
142+ accepters = queue :in ({Accepter , From }, Accepters )},
143143 {noreply , State };
144144
145145handle_call ({accept , Accepter }, From , # state {accepters = Accepters } = State0 ) ->
146- State = State0 # state {accepters = queue :in ({Accepter , From }, Accepters )},
146+ State = State0 # state {accepters = queue :in ({Accepter , From }, Accepters )},
147147 {noreply , State };
148148handle_call (sockname , _ , # state {listener = Socket } = State ) ->
149149 Reply = inet :sockname (Socket ),
@@ -348,8 +348,16 @@ setup_new_connection(User, From, Client, Msg, #state{dtls_processes = Processes,
348348 dtls_options = DTLSOpts ,
349349 port = Port ,
350350 listener = Socket ,
351- session_id_tracker = Tracker ,
351+ session_id_tracker = Tracker0 ,
352352 emulated_options = EmOpts } = State ) ->
353+ Tracker = case erlang :is_process_alive (Tracker0 ) of
354+ true ->
355+ Tracker0 ;
356+ false ->
357+ {ok , Tracker1 } = session_id_tracker (Socket ),
358+ Tracker1
359+ end ,
360+
353361 ConnArgs = [server , " localhost" , Port , {self (), {Client , Socket }},
354362 {DTLSOpts ,
355363 emulated_opts_list (EmOpts , [mode , active ], []),
@@ -360,11 +368,12 @@ setup_new_connection(User, From, Client, Msg, #state{dtls_processes = Processes,
360368 erlang :monitor (process , Pid ),
361369 gen_server :reply (From , {ok , Pid }),
362370 Pid ! Msg ,
363- State # state {dtls_msq_queues = kv_insert (Client , {Pid , queue :new ()}, MsgQueues ),
371+ State # state {session_id_tracker = Tracker ,
372+ dtls_msq_queues = kv_insert (Client , {Pid , queue :new ()}, MsgQueues ),
364373 dtls_processes = kv_insert (Pid , Client , Processes )};
365374 {error , Reason } ->
366375 gen_server :reply (From , {error , Reason }),
367- State
376+ State # state { session_id_tracker = Tracker }
368377 end .
369378
370379kv_update (Key , Value , Store ) ->
@@ -411,7 +420,7 @@ get_socket_opts(Socket, SocketOpts, Cb) ->
411420do_set_emulated_opts ([], Opts ) ->
412421 Opts ;
413422do_set_emulated_opts ([{mode , Value } | Rest ], Opts ) ->
414- do_set_emulated_opts (Rest , Opts # socket_options {mode = Value });
423+ do_set_emulated_opts (Rest , Opts # socket_options {mode = Value });
415424do_set_emulated_opts ([{active , N0 } | Rest ], Opts = # socket_options {active = Active }) when is_integer (N0 ) ->
416425 N = tls_socket :update_active_n (N0 , Active ),
417426 do_set_emulated_opts (Rest , Opts # socket_options {active = N });
@@ -421,14 +430,14 @@ do_set_emulated_opts([{active, Value} | Rest], Opts) ->
421430emulated_opts_list (_ ,[], Acc ) ->
422431 Acc ;
423432emulated_opts_list ( Opts , [mode | Rest ], Acc ) ->
424- emulated_opts_list (Opts , Rest , [{mode , Opts # socket_options .mode } | Acc ]);
433+ emulated_opts_list (Opts , Rest , [{mode , Opts # socket_options .mode } | Acc ]);
425434emulated_opts_list (Opts , [active | Rest ], Acc ) ->
426435 emulated_opts_list (Opts , Rest , [{active , Opts # socket_options .active } | Acc ]).
427436
428437% % Regardless of the option reuse_sessions we need the session_id_tracker
429438% % to generate session ids, but no sessions will be stored unless
430439% % reuse_sessions = true.
431- session_id_tracker (Listener , _ ) ->
440+ session_id_tracker (Listener ) ->
432441 dtls_server_session_cache_sup :start_child (Listener ).
433442
434443get_internal_active_n () ->
0 commit comments