Per-message byte limit depends on name length.

This commit is contained in:
David Fifield
2020-04-18 14:33:39 -06:00
parent f1ee951fd6
commit 163ae7f1b8
+14 -14
View File
@@ -111,7 +111,16 @@ func acceptSessions(ln *kcp.Listener, upstream *net.TCPAddr) error {
1, // nc=1 => congestion window off
)
// Set the maximum transmission unit.
mtu := dnsMessageCapacity()
longName, err := dns.NewName([][]byte{
bytes.Repeat([]byte{'a'}, 63),
bytes.Repeat([]byte{'b'}, 63),
bytes.Repeat([]byte{'c'}, 63),
bytes.Repeat([]byte{'d'}, 61),
})
if err != nil {
panic(err)
}
mtu := dnsMessageCapacity(longName)
if mtu < 80 {
// This value doesn't depend on any configuration values, so it
// should never be too small.
@@ -128,22 +137,13 @@ func acceptSessions(ln *kcp.Listener, upstream *net.TCPAddr) error {
}
}
func dnsMessageCapacity() int {
longName, err := dns.NewName([][]byte{
bytes.Repeat([]byte{'a'}, 63),
bytes.Repeat([]byte{'b'}, 63),
bytes.Repeat([]byte{'c'}, 63),
bytes.Repeat([]byte{'d'}, 61),
})
if err != nil {
panic(err)
}
func dnsMessageCapacity(name dns.Name) int {
message := dns.Message{
Question: []dns.Question{
dns.Question{Name: longName},
dns.Question{Name: name},
},
Answer: []dns.RR{
dns.RR{Name: longName},
dns.RR{Name: name},
},
}
builder, err := message.WireFormat()
@@ -328,7 +328,7 @@ func sendLoop(dnsConn net.PacketConn, ttConn *turbotunnel.QueuePacketConn, ch <-
// section with downstream packets.
var payload bytes.Buffer
limit := 4096
limit := dnsMessageCapacity(rec.Resp.Question[0].Name)
if len(nextP) > 0 {
// No length check on any packet left over from
// the previous bundle -- if it's too large, we