MCPcopy
hub / github.com/google/gvisor / getSockOptIPv6

Method getSockOptIPv6

pkg/sentry/socket/netstack/netstack.go:1396–1635  ·  view source on GitHub ↗

getSockOptIPv6 implements linux getsockopt(2) when the level is SOL_IPV6.

(t *kernel.Task, ep commonEndpoint, name int, outPtr hostarch.Addr, outLen int)

Source from the content-addressed store, hash-verified

1394
1395// getSockOptIPv6 implements linux getsockopt(2) when the level is SOL_IPV6.
1396func (s *sock) getSockOptIPv6(t *kernel.Task, ep commonEndpoint, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
1397 if _, ok := ep.(tcpip.Endpoint); !ok {
1398 log.Warningf("SOL_IPV6 options not supported on endpoints other than tcpip.Endpoint: option = %d", name)
1399 return nil, syserr.ErrUnknownProtocolOption
1400 }
1401
1402 family, skType, _ := s.Type()
1403 if family != linux.AF_INET6 {
1404 return nil, syserr.ErrNotSupported
1405 }
1406
1407 switch name {
1408 case linux.IPV6_CHECKSUM:
1409 if outLen < sizeOfInt32 {
1410 return nil, syserr.ErrInvalidArgument
1411 }
1412
1413 v, err := ep.GetSockOptInt(tcpip.IPv6Checksum)
1414 if err != nil {
1415 return nil, syserr.TranslateNetstackError(err)
1416 }
1417
1418 vP := primitive.Int32(v)
1419 return &vP, nil
1420
1421 case linux.IPV6_V6ONLY:
1422 if outLen < sizeOfInt32 {
1423 return nil, syserr.ErrInvalidArgument
1424 }
1425
1426 v := primitive.Int32(boolToInt32(ep.SocketOptions().GetV6Only()))
1427 return &v, nil
1428
1429 case linux.IPV6_UNICAST_HOPS:
1430 if outLen < sizeOfInt32 {
1431 return nil, syserr.ErrInvalidArgument
1432 }
1433
1434 v, err := ep.GetSockOptInt(tcpip.IPv6HopLimitOption)
1435 if err != nil {
1436 return nil, syserr.TranslateNetstackError(err)
1437 }
1438
1439 // Fill in the default value, if needed.
1440 vP := primitive.Int32(v)
1441 if vP == -1 {
1442 vP, err = defaultTTL(t, header.IPv6ProtocolNumber)
1443 if err != nil {
1444 return nil, syserr.TranslateNetstackError(err)
1445 }
1446 }
1447
1448 return &vP, nil
1449
1450 case linux.IPV6_RECVHOPLIMIT:
1451 if outLen < sizeOfInt32 {
1452 return nil, syserr.ErrInvalidArgument
1453 }

Callers 1

GetSockOptMethod · 0.95

Calls 15

TypeMethod · 0.95
HasCapabilityMethod · 0.95
WarningfFunction · 0.92
TranslateNetstackErrorFunction · 0.92
Int32TypeAlias · 0.92
Uint32TypeAlias · 0.92
ByteSliceTypeAlias · 0.92
ConvertAddressFunction · 0.92
FullAddressStruct · 0.92
StackFromContextFunction · 0.92
GetInfoFunction · 0.92
GetEntries6Function · 0.92

Tested by

no test coverage detected