getSockOptIPv6 implements linux getsockopt(2) when the level is SOL_IPV6.
(t *kernel.Task, ep commonEndpoint, name int, outPtr hostarch.Addr, outLen int)
| 1394 | |
| 1395 | // getSockOptIPv6 implements linux getsockopt(2) when the level is SOL_IPV6. |
| 1396 | func (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 | } |
no test coverage detected