Prefer ipv6 protocol on direct connections

This commit is contained in:
9seconds
2019-12-10 13:59:27 +03:00
parent 19efcc93fc
commit 422ed5b071
4 changed files with 33 additions and 17 deletions
+24 -14
View File
@@ -1,10 +1,12 @@
package telegram package telegram
import ( import (
"fmt" "errors"
"math/rand" "math/rand"
"net" "net"
"go.uber.org/zap"
"github.com/9seconds/mtg/conntypes" "github.com/9seconds/mtg/conntypes"
"github.com/9seconds/mtg/utils" "github.com/9seconds/mtg/utils"
"github.com/9seconds/mtg/wrappers/stream" "github.com/9seconds/mtg/wrappers/stream"
@@ -12,10 +14,11 @@ import (
type baseTelegram struct { type baseTelegram struct {
dialer net.Dialer dialer net.Dialer
logger *zap.SugaredLogger
secret []byte secret []byte
v4DefaultDC conntypes.DC v4DefaultDC conntypes.DC
V6DefaultDC conntypes.DC v6DefaultDC conntypes.DC
v4Addresses map[conntypes.DC][]string v4Addresses map[conntypes.DC][]string
v6Addresses map[conntypes.DC][]string v6Addresses map[conntypes.DC][]string
} }
@@ -26,25 +29,32 @@ func (b *baseTelegram) Secret() []byte {
func (b *baseTelegram) dial(dc conntypes.DC, func (b *baseTelegram) dial(dc conntypes.DC,
protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) { protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
addr := "" addresses := make([]string, 0, 2)
switch protocol { if protocol&conntypes.ConnectionProtocolIPv6 != 0 {
case conntypes.ConnectionProtocolIPv4: addresses = append(addresses, b.chooseAddress(b.v6Addresses, dc, b.v6DefaultDC))
addr = b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC)
default:
addr = b.chooseAddress(b.v6Addresses, dc, b.V6DefaultDC)
} }
conn, err := b.dialer.Dial("tcp", addr) if protocol&conntypes.ConnectionProtocolIPv4 != 0 {
if err != nil { addresses = append(addresses, b.chooseAddress(b.v4Addresses, dc, b.v4DefaultDC))
return nil, fmt.Errorf("dial has failed: %w", err)
} }
if err := utils.InitTCP(conn); err != nil { for _, addr := range addresses {
return nil, fmt.Errorf("cannot initialize tcp socket: %w", err) conn, err := b.dialer.Dial("tcp", addr)
if err != nil {
b.logger.Infow("Cannot dial to Telegram", "address", addr, "error", err)
continue
}
if err := utils.InitTCP(conn); err != nil {
b.logger.Infow("Cannot initialize TCP socket", "address", addr, "error", err)
continue
}
return stream.NewTelegramConn(dc, conn), nil
} }
return stream.NewTelegramConn(dc, conn), nil return nil, errors.New("cannot dial to the chosen DC")
} }
func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string, func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
+1 -1
View File
@@ -37,5 +37,5 @@ func (d *directTelegram) Dial(dc conntypes.DC,
dc = conntypes.DCDefaultIdx dc = conntypes.DCDefaultIdx
} }
return d.baseTelegram.dial(dc-1, protocol) return d.baseTelegram.dial(dc-1, conntypes.ConnectionProtocolAny)
} }
+7 -1
View File
@@ -4,6 +4,8 @@ import (
"net" "net"
"sync" "sync"
"time" "time"
"go.uber.org/zap"
) )
const telegramDialTimeout = 10 * time.Second const telegramDialTimeout = 10 * time.Second
@@ -17,11 +19,14 @@ var (
func Init() { func Init() {
initOnce.Do(func() { initOnce.Do(func() {
logger := zap.S().Named("telegram")
Direct = &directTelegram{ Direct = &directTelegram{
baseTelegram: baseTelegram{ baseTelegram: baseTelegram{
dialer: net.Dialer{Timeout: telegramDialTimeout}, dialer: net.Dialer{Timeout: telegramDialTimeout},
logger: logger.Named("direct"),
v4DefaultDC: directV4DefaultIdx, v4DefaultDC: directV4DefaultIdx,
V6DefaultDC: directV6DefaultIdx, v6DefaultDC: directV6DefaultIdx,
v4Addresses: directV4Addresses, v4Addresses: directV4Addresses,
v6Addresses: directV6Addresses, v6Addresses: directV6Addresses,
}, },
@@ -30,6 +35,7 @@ func Init() {
tg := &middleTelegram{ tg := &middleTelegram{
baseTelegram: baseTelegram{ baseTelegram: baseTelegram{
dialer: net.Dialer{Timeout: telegramDialTimeout}, dialer: net.Dialer{Timeout: telegramDialTimeout},
logger: logger.Named("middle"),
}, },
} }
if err := tg.update(); err != nil { if err := tg.update(); err != nil {
+1 -1
View File
@@ -45,7 +45,7 @@ func (m *middleTelegram) update() error {
m.mutex.Lock() m.mutex.Lock()
m.secret = secret m.secret = secret
m.v4DefaultDC = v4DefaultDC m.v4DefaultDC = v4DefaultDC
m.V6DefaultDC = v6DefaultDC m.v6DefaultDC = v6DefaultDC
m.v4Addresses = v4Addresses m.v4Addresses = v4Addresses
m.v6Addresses = v6Addresses m.v6Addresses = v6Addresses
m.mutex.Unlock() m.mutex.Unlock()