mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Avoid pseudo endpoint for TSVal generation
PiperOrigin-RevId: 393808461
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
load("//tools:defs.bzl", "go_library")
|
||||
|
||||
package(licenses = ["notice"])
|
||||
|
||||
go_library(
|
||||
name = "tcp",
|
||||
srcs = ["tcp.go"],
|
||||
visibility = ["//pkg/tcpip:__subpackages__"],
|
||||
deps = [
|
||||
"//pkg/tcpip",
|
||||
],
|
||||
)
|
||||
@@ -0,0 +1,48 @@
|
||||
// Copyright 2021 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Package tcp contains internal type definitions that are not expected to be
|
||||
// used by anyone else outside pkg/tcpip.
|
||||
package tcp
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
)
|
||||
|
||||
// TSOffset is an offset applied to the value of the TSVal field in the TCP
|
||||
// Timestamp option.
|
||||
//
|
||||
// +stateify savable
|
||||
type TSOffset struct {
|
||||
milliseconds uint32
|
||||
}
|
||||
|
||||
// NewTSOffset creates a new TSOffset from milliseconds.
|
||||
func NewTSOffset(milliseconds uint32) TSOffset {
|
||||
return TSOffset{
|
||||
milliseconds: milliseconds,
|
||||
}
|
||||
}
|
||||
|
||||
// TSVal applies the offset to now and returns the timestamp in milliseconds.
|
||||
func (offset TSOffset) TSVal(now tcpip.MonotonicTime) uint32 {
|
||||
return uint32(now.Sub(tcpip.MonotonicTime{}).Milliseconds()) + offset.milliseconds
|
||||
}
|
||||
|
||||
// Elapsed calculates the elapsed time given now and the echoed back timestamp.
|
||||
func (offset TSOffset) Elapsed(now tcpip.MonotonicTime, tsEcr uint32) time.Duration {
|
||||
return time.Duration(offset.TSVal(now)-tsEcr) * time.Millisecond
|
||||
}
|
||||
@@ -85,6 +85,7 @@ go_library(
|
||||
"//pkg/tcpip/buffer",
|
||||
"//pkg/tcpip/hash/jenkins",
|
||||
"//pkg/tcpip/header",
|
||||
"//pkg/tcpip/internal/tcp",
|
||||
"//pkg/tcpip/ports",
|
||||
"//pkg/tcpip/seqnum",
|
||||
"//pkg/tcpip/transport/tcpconntrack",
|
||||
|
||||
@@ -19,6 +19,7 @@ import (
|
||||
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/internal/tcp"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/seqnum"
|
||||
)
|
||||
|
||||
@@ -402,7 +403,7 @@ type TCPSndBufState struct {
|
||||
type TCPEndpointStateInner struct {
|
||||
// TSOffset is a randomized offset added to the value of the TSVal
|
||||
// field in the timestamp option.
|
||||
TSOffset uint32
|
||||
TSOffset tcp.TSOffset
|
||||
|
||||
// SACKPermitted is set to true if the peer sends the TCPSACKPermitted
|
||||
// option in the SYN/SYN-ACK.
|
||||
|
||||
@@ -68,6 +68,7 @@ go_library(
|
||||
"//pkg/tcpip/hash/jenkins",
|
||||
"//pkg/tcpip/header",
|
||||
"//pkg/tcpip/header/parse",
|
||||
"//pkg/tcpip/internal/tcp",
|
||||
"//pkg/tcpip/ports",
|
||||
"//pkg/tcpip/seqnum",
|
||||
"//pkg/tcpip/stack",
|
||||
|
||||
@@ -606,14 +606,9 @@ func (e *endpoint) handleListenSegment(ctx *listenContext, s *segment) tcpip.Err
|
||||
MSS: calculateAdvertisedMSS(e.userMSS, route),
|
||||
}
|
||||
if opts.TS {
|
||||
// Create a barely-sufficient endpoint to calculate the TSVal.
|
||||
pseudoEndpoint := endpoint{
|
||||
TCPEndpointStateInner: stack.TCPEndpointStateInner{
|
||||
TSOffset: e.protocol.tsOffset(s.dstAddr, s.srcAddr),
|
||||
},
|
||||
stack: e.stack,
|
||||
}
|
||||
synOpts.TSVal = pseudoEndpoint.tsValNow()
|
||||
offset := e.protocol.tsOffset(s.dstAddr, s.srcAddr)
|
||||
now := e.stack.Clock().NowMonotonic()
|
||||
synOpts.TSVal = offset.TSVal(now)
|
||||
}
|
||||
cookie := ctx.createCookie(s.id, s.sequenceNumber, encodeMSS(opts.MSS))
|
||||
fields := tcpFields{
|
||||
|
||||
@@ -2913,7 +2913,7 @@ func (e *endpoint) maybeEnableTimestamp(synOpts header.TCPSynOptions) {
|
||||
}
|
||||
|
||||
func (e *endpoint) tsVal(now tcpip.MonotonicTime) uint32 {
|
||||
return uint32(now.Sub(tcpip.MonotonicTime{}).Milliseconds()) + e.TSOffset
|
||||
return e.TSOffset.TSVal(now)
|
||||
}
|
||||
|
||||
func (e *endpoint) tsValNow() uint32 {
|
||||
@@ -2921,7 +2921,7 @@ func (e *endpoint) tsValNow() uint32 {
|
||||
}
|
||||
|
||||
func (e *endpoint) elapsed(now tcpip.MonotonicTime, tsEcr uint32) time.Duration {
|
||||
return time.Duration(e.tsVal(now)-tsEcr) * time.Millisecond
|
||||
return e.TSOffset.Elapsed(now, tsEcr)
|
||||
}
|
||||
|
||||
// maybeEnableSACKPermitted marks the SACKPermitted option enabled for this endpoint
|
||||
|
||||
@@ -26,6 +26,7 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/tcpip/hash/jenkins"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/header/parse"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/internal/tcp"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/seqnum"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/transport/raw"
|
||||
@@ -158,7 +159,7 @@ func (p *protocol) HandleUnknownDestinationPacket(id stack.TransportEndpointID,
|
||||
return stack.UnknownDestinationPacketHandled
|
||||
}
|
||||
|
||||
func (p *protocol) tsOffset(src, dst tcpip.Address) uint32 {
|
||||
func (p *protocol) tsOffset(src, dst tcpip.Address) tcp.TSOffset {
|
||||
// Initialize a random tsOffset that will be added to the recentTS
|
||||
// everytime the timestamp is sent when the Timestamp option is enabled.
|
||||
//
|
||||
@@ -173,7 +174,7 @@ func (p *protocol) tsOffset(src, dst tcpip.Address) uint32 {
|
||||
// It never returns an error.
|
||||
_, _ = h.Write([]byte(src))
|
||||
_, _ = h.Write([]byte(dst))
|
||||
return h.Sum32()
|
||||
return tcp.NewTSOffset(h.Sum32())
|
||||
}
|
||||
|
||||
// replyWithReset replies to the given segment with a reset segment.
|
||||
|
||||
Reference in New Issue
Block a user