@@ -20,8 +20,11 @@ package appquic
20
20
import (
21
21
"crypto/tls"
22
22
"fmt"
23
+ "io"
24
+ "log"
23
25
"net"
24
26
"sync"
27
+ "sync/atomic"
25
28
26
29
"github.com/lucas-clemente/quic-go"
27
30
@@ -86,6 +89,10 @@ func DialAddr(raddr *snet.UDPAddr, host string, tlsConf *tls.Config, quicConf *q
86
89
return nil , err
87
90
}
88
91
host = appnet .MangleSCIONAddr (host )
92
+ // HACK: we silence the log here to shut up quic-go's warning about trying to
93
+ // set receive buffer size (it's not a UDPConn, we know).
94
+ silenceLog ()
95
+ defer unsilenceLog ()
89
96
session , err := quic .Dial (sconn , raddr , host , tlsConf , quicConf )
90
97
if err != nil {
91
98
return nil , err
@@ -113,6 +120,10 @@ func DialAddrEarly(raddr *snet.UDPAddr, host string, tlsConf *tls.Config, quicCo
113
120
return nil , err
114
121
}
115
122
host = appnet .MangleSCIONAddr (host )
123
+ // HACK: we silence the log here to shut up quic-go's warning about trying to
124
+ // set receive buffer size (it's not a UDPConn, we know).
125
+ silenceLog ()
126
+ defer unsilenceLog ()
116
127
session , err := quic .DialEarly (sconn , raddr , host , tlsConf , quicConf )
117
128
if err != nil {
118
129
return nil , err
@@ -132,18 +143,18 @@ func ensurePathDefined(raddr *snet.UDPAddr) error {
132
143
//
133
144
// See note on wildcard addresses in the appnet package documentation.
134
145
func ListenPort (port uint16 , tlsConf * tls.Config , quicConfig * quic.Config ) (quic.Listener , error ) {
135
- sconn , err := appnet .ListenPort (port )
136
- if err != nil {
137
- return nil , err
138
- }
139
- return quic .Listen (sconn , tlsConf , quicConfig )
146
+ return Listen (& net.UDPAddr {Port : int (port )}, tlsConf , quicConfig )
140
147
}
141
148
142
149
func Listen (listen * net.UDPAddr , tlsConf * tls.Config , quicConfig * quic.Config ) (quic.Listener , error ) {
143
150
sconn , err := appnet .Listen (listen )
144
151
if err != nil {
145
152
return nil , err
146
153
}
154
+ // HACK: we silence the log here to shut up quic-go's warning about trying to
155
+ // set receive buffer size (it's not a UDPConn, we know).
156
+ silenceLog ()
157
+ defer unsilenceLog ()
147
158
return quic .Listen (sconn , tlsConf , quicConfig )
148
159
}
149
160
@@ -163,3 +174,33 @@ func GetDummyTLSCerts() []tls.Certificate {
163
174
}
164
175
return srvTLSDummyCerts
165
176
}
177
+
178
+ var logSilencerCount int32
179
+ var logSilencerOriginal io.Writer
180
+
181
+ // silenceLog redirects the log.Default writer to a black hole.
182
+ // It can be reenabled by calling unsilenceLog.
183
+ // These functions can safely be called from multiple goroutines concurrently;
184
+ // the log will remain silenced until unsilenceLog was called for each
185
+ // silenceLog call.
186
+ func silenceLog () {
187
+ count := atomic .AddInt32 (& logSilencerCount , 1 )
188
+ if count == 1 {
189
+ logSilencerOriginal = log .Default ().Writer ()
190
+ log .Default ().SetOutput (blackhole {})
191
+ }
192
+ }
193
+
194
+ func unsilenceLog () {
195
+ count := atomic .AddInt32 (& logSilencerCount , - 1 )
196
+ if count == 0 {
197
+ log .Default ().SetOutput (logSilencerOriginal )
198
+ logSilencerOriginal = nil
199
+ }
200
+ }
201
+
202
+ type blackhole struct {}
203
+
204
+ func (w blackhole ) Write (p []byte ) (n int , err error ) {
205
+ return len (p ), nil
206
+ }
0 commit comments