Stub out TCP_QUICKACK
PiperOrigin-RevId: 224696233 Change-Id: I45c425d9e32adee5dcce29ca7439a06567b26014
This commit is contained in:
parent
b89f9909d7
commit
25b8424d75
|
@ -698,6 +698,18 @@ func getSockOptTCP(t *kernel.Task, ep commonEndpoint, name, outLen int) (interfa
|
|||
|
||||
return int32(v), nil
|
||||
|
||||
case linux.TCP_QUICKACK:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.QuickAckOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
|
||||
case linux.TCP_INFO:
|
||||
var v tcpip.TCPInfoOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
|
@ -870,6 +882,14 @@ func setSockOptTCP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *
|
|||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.CorkOption(v)))
|
||||
|
||||
case linux.TCP_QUICKACK:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.QuickAckOption(v)))
|
||||
|
||||
case linux.TCP_REPAIR_OPTIONS:
|
||||
t.Kernel().EmitUnimplementedEvent(t)
|
||||
|
||||
|
|
|
@ -436,6 +436,9 @@ type CorkOption int
|
|||
// should allow reuse of local address.
|
||||
type ReuseAddressOption int
|
||||
|
||||
// QuickAckOption is stubbed out in SetSockOpt/GetSockOpt.
|
||||
type QuickAckOption int
|
||||
|
||||
// PasscredOption is used by SetSockOpt/GetSockOpt to specify whether
|
||||
// SCM_CREDENTIALS socket control messages are enabled.
|
||||
//
|
||||
|
|
|
@ -177,6 +177,12 @@ type endpoint struct {
|
|||
// options.
|
||||
reuseAddr bool
|
||||
|
||||
// slowAck holds the negated state of quick ack. It is stubbed out and
|
||||
// does nothing.
|
||||
//
|
||||
// slowAck is a boolean (0 is false) and must be accessed atomically.
|
||||
slowAck uint32
|
||||
|
||||
// segmentQueue is used to hand received segments to the protocol
|
||||
// goroutine. Segments are queued as long as the queue is not full,
|
||||
// and dropped when it is.
|
||||
|
@ -677,6 +683,15 @@ func (e *endpoint) SetSockOpt(opt interface{}) *tcpip.Error {
|
|||
e.mu.Unlock()
|
||||
return nil
|
||||
|
||||
case tcpip.QuickAckOption:
|
||||
if v == 0 {
|
||||
atomic.StoreUint32(&e.slowAck, 1)
|
||||
} else {
|
||||
atomic.StoreUint32(&e.slowAck, 0)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case tcpip.ReceiveBufferSizeOption:
|
||||
// Make sure the receive buffer size is within the min and max
|
||||
// allowed.
|
||||
|
@ -859,6 +874,13 @@ func (e *endpoint) GetSockOpt(opt interface{}) *tcpip.Error {
|
|||
}
|
||||
return nil
|
||||
|
||||
case *tcpip.QuickAckOption:
|
||||
*o = 1
|
||||
if v := atomic.LoadUint32(&e.slowAck); v != 0 {
|
||||
*o = 0
|
||||
}
|
||||
return nil
|
||||
|
||||
case *tcpip.V6OnlyOption:
|
||||
// We only recognize this option on v6 endpoints.
|
||||
if e.netProto != header.IPv6ProtocolNumber {
|
||||
|
|
Loading…
Reference in New Issue