@@ -250,25 +250,38 @@ var (
250250 DefaultUDPClientListenConfig = DefaultUDPClientSocketOptions .ListenConfig ()
251251)
252252
253- // Dialer is [tfo.Dialer] but provides a subjectively nicer API.
254- type Dialer tfo.Dialer
253+ // Dialer wraps a [tfo.Dialer] and provides a subjectively nicer API.
254+ type Dialer struct {
255+ td tfo.Dialer
256+ fns setFuncSlice
257+ }
258+
259+ // TFO returns true if the next DialTCP call will attempt to enable TFO.
260+ func (d * Dialer ) TFO () bool {
261+ return d .td .TFO ()
262+ }
255263
256264// DialTCP wraps [tfo.Dialer.DialContext] and returns a [*net.TCPConn] directly.
257- func (d * Dialer ) DialTCP (ctx context.Context , network , address string , b []byte ) (* net.TCPConn , error ) {
258- c , err := (* tfo .Dialer )(d ).DialContext (ctx , network , address , b )
265+ func (d * Dialer ) DialTCP (ctx context.Context , network , address string , b []byte ) (tc * net.TCPConn , info SocketInfo , err error ) {
266+ td := d .td
267+ td .ControlContext = d .fns .controlContextFunc (& info )
268+ c , err := td .DialContext (ctx , network , address , b )
259269 if err != nil {
260- return nil , err
270+ return nil , info , err
261271 }
262- return c .(* net.TCPConn ), nil
272+ return c .(* net.TCPConn ), info , nil
263273}
264274
265275// DialUDP wraps [net.Dialer.DialContext] and returns a [*net.UDPConn] directly.
266- func (d * Dialer ) DialUDP (ctx context.Context , network , address string ) (* net.UDPConn , error ) {
267- c , err := d .Dialer .DialContext (ctx , network , address )
276+ func (d * Dialer ) DialUDP (ctx context.Context , network , address string ) (uc * net.UDPConn , info SocketInfo , err error ) {
277+ info .MaxUDPGSOSegments = 1
278+ nd := d .td .Dialer
279+ nd .ControlContext = d .fns .controlContextFunc (& info )
280+ c , err := nd .DialContext (ctx , network , address )
268281 if err != nil {
269- return nil , err
282+ return nil , info , err
270283 }
271- return c .(* net.UDPConn ), nil
284+ return c .(* net.UDPConn ), info , nil
272285}
273286
274287// DialerSocketOptions contains dialer-specific socket options.
@@ -311,13 +324,13 @@ type DialerSocketOptions struct {
311324// Dialer returns a [Dialer] with a control function that sets the socket options.
312325func (dso DialerSocketOptions ) Dialer () Dialer {
313326 d := Dialer {
314- Dialer : net.Dialer {
315- ControlContext : dso .buildSetFns ().controlContextFunc (nil ),
327+ td : tfo.Dialer {
328+ DisableTFO : ! dso .TCPFastOpen ,
329+ Fallback : dso .TCPFastOpenFallback ,
316330 },
317- DisableTFO : ! dso .TCPFastOpen ,
318- Fallback : dso .TCPFastOpenFallback ,
331+ fns : dso .buildSetFns (),
319332 }
320- d .SetMultipathTCP (dso .MultipathTCP )
333+ d .td . SetMultipathTCP (dso .MultipathTCP )
321334 return d
322335}
323336
0 commit comments