diff options
author | Zeling Feng <zeling@google.com> | 2021-08-30 10:56:32 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-08-30 10:59:45 -0700 |
commit | 9625071e6dd6d949f6bd443910eaf56ce1c9762d (patch) | |
tree | 6aa1b4c821995c2960f2972826510925a25c7fae /pkg/tcpip/transport | |
parent | cf65f9a8ded6d7423465cb89066f79915f54db5a (diff) |
Avoid pseudo endpoint for TSVal generation
PiperOrigin-RevId: 393808461
Diffstat (limited to 'pkg/tcpip/transport')
-rw-r--r-- | pkg/tcpip/transport/tcp/BUILD | 1 | ||||
-rw-r--r-- | pkg/tcpip/transport/tcp/accept.go | 11 | ||||
-rw-r--r-- | pkg/tcpip/transport/tcp/endpoint.go | 4 | ||||
-rw-r--r-- | pkg/tcpip/transport/tcp/protocol.go | 5 |
4 files changed, 9 insertions, 12 deletions
diff --git a/pkg/tcpip/transport/tcp/BUILD b/pkg/tcpip/transport/tcp/BUILD index c3922bbe5..5148fe157 100644 --- a/pkg/tcpip/transport/tcp/BUILD +++ b/pkg/tcpip/transport/tcp/BUILD @@ -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", diff --git a/pkg/tcpip/transport/tcp/accept.go b/pkg/tcpip/transport/tcp/accept.go index f8269efa6..03c9fafa1 100644 --- a/pkg/tcpip/transport/tcp/accept.go +++ b/pkg/tcpip/transport/tcp/accept.go @@ -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{ diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go index 0623ee8ed..d2b8f298f 100644 --- a/pkg/tcpip/transport/tcp/endpoint.go +++ b/pkg/tcpip/transport/tcp/endpoint.go @@ -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 diff --git a/pkg/tcpip/transport/tcp/protocol.go b/pkg/tcpip/transport/tcp/protocol.go index b0ffd2429..e4410ad93 100644 --- a/pkg/tcpip/transport/tcp/protocol.go +++ b/pkg/tcpip/transport/tcp/protocol.go @@ -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. |