Allow not to limit bandwidth in LAN (fixes #1336)

This commit is contained in:
Audrius Butkevicius
2015-03-08 18:36:59 +00:00
parent 03bbf273b3
commit 6fa97eeec7
7 changed files with 161 additions and 5 deletions

View File

@@ -104,15 +104,18 @@ next:
continue next
}
// If rate limiting is set, we wrap the connection in a
// limiter.
// If rate limiting is set, and based on the address we should
// limit the connection, then we wrap it in a limiter.
limit := shouldLimit(conn.RemoteAddr())
wr := io.Writer(conn)
if writeRateLimit != nil {
if limit && writeRateLimit != nil {
wr = &limitedWriter{conn, writeRateLimit}
}
rd := io.Reader(conn)
if readRateLimit != nil {
if limit && readRateLimit != nil {
rd = &limitedReader{conn, readRateLimit}
}
@@ -121,7 +124,7 @@ next:
l.Infof("Established secure connection to %s at %s", remoteID, name)
if debugNet {
l.Debugf("cipher suite %04X", conn.ConnectionState().CipherSuite)
l.Debugf("cipher suite: %04X in lan: %t", conn.ConnectionState().CipherSuite, !limit)
}
events.Default.Log(events.DeviceConnected, map[string]string{
"id": remoteID.String(),
@@ -283,3 +286,20 @@ func setTCPOptions(conn *net.TCPConn) {
l.Infoln(err)
}
}
func shouldLimit(addr net.Addr) bool {
if cfg.Options().LimitBandwidthInLan {
return true
}
tcpaddr, ok := addr.(*net.TCPAddr)
if !ok {
return true
}
for _, lan := range lans {
if lan.Contains(tcpaddr.IP) {
return false
}
}
return !tcpaddr.IP.IsLoopback()
}

View File

@@ -115,6 +115,7 @@ var (
externalPort int
igd *upnp.IGD
cert tls.Certificate
lans []*net.IPNet
)
const (
@@ -494,6 +495,10 @@ func syncthingMain() {
readRateLimit = ratelimit.NewBucketWithRate(float64(1000*opts.MaxRecvKbps), int64(5*1000*opts.MaxRecvKbps))
}
if opts.MaxRecvKbps > 0 || opts.MaxSendKbps > 0 {
lans, _ = osutil.GetLans()
}
dbFile := filepath.Join(confDir, "index")
dbOpts := &opt.Options{OpenFilesCacheCapacity: 100}
ldb, err := leveldb.OpenFile(dbFile, dbOpts)