mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Implement IP_TTL.
Also change the default TTL to 64 to match Linux. PiperOrigin-RevId: 273430341
This commit is contained in:
@@ -174,6 +174,10 @@ var Metrics = tcpip.Stats{
|
||||
},
|
||||
}
|
||||
|
||||
// DefaultTTL is linux's default TTL. All network protocols in all stacks used
|
||||
// with this package must have this value set as their default TTL.
|
||||
const DefaultTTL = 64
|
||||
|
||||
const sizeOfInt32 int = 4
|
||||
|
||||
var errStackType = syserr.New("expected but did not receive a netstack.Stack", linux.EINVAL)
|
||||
@@ -833,7 +837,7 @@ func GetSockOpt(t *kernel.Task, s socket.Socket, ep commonEndpoint, family int,
|
||||
return getSockOptIPv6(t, ep, name, outLen)
|
||||
|
||||
case linux.SOL_IP:
|
||||
return getSockOptIP(t, ep, name, outLen)
|
||||
return getSockOptIP(t, ep, name, outLen, family)
|
||||
|
||||
case linux.SOL_UDP,
|
||||
linux.SOL_ICMPV6,
|
||||
@@ -1176,8 +1180,25 @@ func getSockOptIPv6(t *kernel.Task, ep commonEndpoint, name, outLen int) (interf
|
||||
}
|
||||
|
||||
// getSockOptIP implements GetSockOpt when level is SOL_IP.
|
||||
func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int) (interface{}, *syserr.Error) {
|
||||
func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int, family int) (interface{}, *syserr.Error) {
|
||||
switch name {
|
||||
case linux.IP_TTL:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.TTLOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
// Fill in the default value, if needed.
|
||||
if v == 0 {
|
||||
v = DefaultTTL
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
|
||||
case linux.IP_MULTICAST_TTL:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
@@ -1648,6 +1669,20 @@ func setSockOptIP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *s
|
||||
t.Kernel().EmitUnimplementedEvent(t)
|
||||
return syserr.ErrInvalidArgument
|
||||
|
||||
case linux.IP_TTL:
|
||||
v, err := parseIntOrChar(optVal)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// -1 means default TTL.
|
||||
if v == -1 {
|
||||
v = 0
|
||||
} else if v < 1 || v > 255 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.TTLOption(v)))
|
||||
|
||||
case linux.IP_ADD_SOURCE_MEMBERSHIP,
|
||||
linux.IP_BIND_ADDRESS_NO_PORT,
|
||||
linux.IP_BLOCK_SOURCE,
|
||||
@@ -1673,7 +1708,6 @@ func setSockOptIP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *s
|
||||
linux.IP_RETOPTS,
|
||||
linux.IP_TOS,
|
||||
linux.IP_TRANSPARENT,
|
||||
linux.IP_TTL,
|
||||
linux.IP_UNBLOCK_SOURCE,
|
||||
linux.IP_UNICAST_IF,
|
||||
linux.IP_XFRM_POLICY,
|
||||
|
||||
Reference in New Issue
Block a user