@@ -28,41 +28,79 @@ func (p *Proxy) initDNSCryptListeners(ctx context.Context) (err error) {
2828 ProviderName : p .DNSCryptProviderName ,
2929 ResolverCert : p .DNSCryptResolverCert ,
3030 Handler : & dnsCryptHandler {
31- proxy : p ,
32-
31+ proxy : p ,
3332 reqSema : p .requestsSema ,
3433 },
3534 }
3635
37- for _ , a := range p .DNSCryptUDPListenAddr {
38- p .logger .InfoContext (ctx , "creating dnscrypt udp listener" )
39- udp , lErr := withRetry (func () (conn * net.UDPConn , err error ) {
40- return net .ListenUDP (bootstrap .NetworkUDP , a )
41- }, p .bindRetryIvl , p .bindRetryNum )
36+ for _ , addr := range p .DNSCryptUDPListenAddr {
37+ udp , lErr := p .listenDNSCryptUDP (ctx , addr )
4238 if lErr != nil {
43- return fmt .Errorf ("listening to dnscrypt udp socket : %w" , lErr )
39+ return fmt .Errorf ("listening to dnscrypt udp on addr %s : %w" , addr , lErr )
4440 }
4541
4642 p .dnsCryptUDPListen = append (p .dnsCryptUDPListen , udp )
47- p .logger .InfoContext (ctx , "listening for dnscrypt messages on udp" , "addr" , udp .LocalAddr ())
4843 }
4944
50- for _ , a := range p .DNSCryptTCPListenAddr {
51- p .logger .InfoContext (ctx , "creating a dnscrypt tcp listener" )
52- tcp , lErr := withRetry (func () (conn * net.TCPListener , err error ) {
53- return net .ListenTCP (bootstrap .NetworkTCP , a )
54- }, p .bindRetryIvl , p .bindRetryNum )
45+ for _ , addr := range p .DNSCryptTCPListenAddr {
46+ tcp , lErr := p .listenDNSCryptTCP (ctx , addr )
5547 if lErr != nil {
56- return fmt .Errorf ("listening to dnscrypt tcp socket : %w" , lErr )
48+ return fmt .Errorf ("listening to dnscrypt tcp on addr %s : %w" , addr , lErr )
5749 }
5850
5951 p .dnsCryptTCPListen = append (p .dnsCryptTCPListen , tcp )
60- p .logger .InfoContext (ctx , "listening for dnscrypt messages on tcp" , "addr" , tcp .Addr ())
6152 }
6253
6354 return nil
6455}
6556
57+ // listenDNSCryptUDP returns a new UDP connection for DNSCrypt listening on
58+ // addr.
59+ func (p * Proxy ) listenDNSCryptUDP (
60+ ctx context.Context ,
61+ addr * net.UDPAddr ,
62+ ) (conn * net.UDPConn , err error ) {
63+ addrStr := addr .String ()
64+ p .logger .InfoContext (ctx , "creating dnscrypt udp server socket" , "addr" , addrStr )
65+
66+ var udp * net.UDPConn
67+ lErr := p .bindWithRetry (ctx , func () (err error ) {
68+ udp , err = net .ListenUDP (bootstrap .NetworkUDP , addr )
69+
70+ return err
71+ })
72+ if lErr != nil {
73+ return nil , fmt .Errorf ("listening to udp socket: %w" , lErr )
74+ }
75+
76+ p .logger .InfoContext (ctx , "listening for dnscrypt messages on udp" , "addr" , udp .LocalAddr ())
77+
78+ return udp , nil
79+ }
80+
81+ // listenDNSCryptTCP returns a new TCP listener for DNSCrypt listening on addr.
82+ func (p * Proxy ) listenDNSCryptTCP (
83+ ctx context.Context ,
84+ addr * net.TCPAddr ,
85+ ) (conn * net.TCPListener , err error ) {
86+ addrStr := addr .String ()
87+ p .logger .InfoContext (ctx , "creating dnscrypt tcp server socket" , "addr" , addrStr )
88+
89+ var tcp * net.TCPListener
90+ lErr := p .bindWithRetry (ctx , func () (err error ) {
91+ tcp , err = net .ListenTCP (bootstrap .NetworkTCP , addr )
92+
93+ return err
94+ })
95+ if lErr != nil {
96+ return nil , fmt .Errorf ("listening to tcp socket: %w" , lErr )
97+ }
98+
99+ p .logger .InfoContext (ctx , "listening for dnscrypt messages on tcp" , "addr" , tcp .Addr ())
100+
101+ return tcp , nil
102+ }
103+
66104// dnsCryptHandler - dnscrypt.Handler implementation
67105type dnsCryptHandler struct {
68106 proxy * Proxy
0 commit comments