@@ -321,6 +321,45 @@ func (s *Swarm) canDial(addr ma.Multiaddr) bool {
321321 return t != nil && t .CanDial (addr )
322322}
323323
324+ // ranks addresses in descending order of preference for dialing
325+ // Private UDP > Public UDP > Private TCP > Public TCP > UDP Relay server > TCP Relay server
326+ func (s * Swarm ) rankAddrs (addrs []ma.Multiaddr ) []ma.Multiaddr {
327+ var localUdpAddrs []ma.Multiaddr // private udp
328+ var relayUdpAddrs []ma.Multiaddr // relay udp
329+ var othersUdp []ma.Multiaddr // public udp
330+
331+ var localFdAddrs []ma.Multiaddr // private fd consuming
332+ var relayFdAddrs []ma.Multiaddr // relay fd consuming
333+ var othersFd []ma.Multiaddr // public fd consuming
334+
335+ for _ , a := range addrs {
336+ if _ , err := a .ValueForProtocol (ma .P_CIRCUIT ); err == nil {
337+ if s .IsFdConsumingAddr (a ) {
338+ relayFdAddrs = append (relayFdAddrs , a )
339+ continue
340+ }
341+ relayUdpAddrs = append (relayUdpAddrs , a )
342+ } else if manet .IsPrivateAddr (a ) {
343+ if s .IsFdConsumingAddr (a ) {
344+ localFdAddrs = append (localFdAddrs , a )
345+ continue
346+ }
347+ localUdpAddrs = append (localUdpAddrs , a )
348+ } else {
349+ if s .IsFdConsumingAddr (a ) {
350+ othersFd = append (othersFd , a )
351+ continue
352+ }
353+ othersUdp = append (othersUdp , a )
354+ }
355+ }
356+
357+ relays := append (relayUdpAddrs , relayFdAddrs ... )
358+ fds := append (localFdAddrs , othersFd ... )
359+
360+ return append (append (append (localUdpAddrs , othersUdp ... ), fds ... ), relays ... )
361+ }
362+
324363// dial is the actual swarm's dial logic, gated by Dial.
325364func (s * Swarm ) dial (ctx context.Context , p peer.ID ) (* Conn , error ) {
326365 var logdial = lgbl .Dial ("swarm" , s .LocalPeer (), p , nil , nil )
@@ -360,47 +399,7 @@ func (s *Swarm) dial(ctx context.Context, p peer.ID) (*Conn, error) {
360399 return nil , ErrDialBackoff
361400 }
362401
363- // ranks addresses in descending order of preference for dialing
364- // Private UDP > Public UDP > Private TCP > Public TCP > UDP Relay server > TCP Relay server
365- rankAddrsFnc := func (addrs []ma.Multiaddr ) []ma.Multiaddr {
366- var localUdpAddrs []ma.Multiaddr // private udp
367- var relayUdpAddrs []ma.Multiaddr // relay udp
368- var othersUdp []ma.Multiaddr // public udp
369-
370- var localFdAddrs []ma.Multiaddr // private fd consuming
371- var relayFdAddrs []ma.Multiaddr // relay fd consuming
372- var othersFd []ma.Multiaddr // public fd consuming
373-
374- for _ , a := range addrs {
375- if _ , err := a .ValueForProtocol (ma .P_CIRCUIT ); err == nil {
376- if s .IsFdConsumingAddr (a ) {
377- relayFdAddrs = append (relayFdAddrs , a )
378- continue
379- }
380- relayUdpAddrs = append (relayUdpAddrs , a )
381- } else if manet .IsPrivateAddr (a ) {
382- if s .IsFdConsumingAddr (a ) {
383- localFdAddrs = append (localFdAddrs , a )
384- continue
385- }
386- localUdpAddrs = append (localUdpAddrs , a )
387- } else {
388- if s .IsFdConsumingAddr (a ) {
389- othersFd = append (othersFd , a )
390- continue
391- }
392- othersUdp = append (othersUdp , a )
393- }
394- }
395-
396- relays := append (relayUdpAddrs , relayFdAddrs ... )
397- fds := append (localFdAddrs , othersFd ... )
398-
399- return append (append (append (localUdpAddrs , othersUdp ... ), fds ... ), relays ... )
400- }
401-
402- connC , dialErr := s .dialAddrs (ctx , p , rankAddrsFnc (goodAddrs ))
403-
402+ connC , dialErr := s .dialAddrs (ctx , p , s .rankAddrs (goodAddrs ))
404403 if dialErr != nil {
405404 logdial ["error" ] = dialErr .Cause .Error ()
406405 switch dialErr .Cause {
0 commit comments