control_unix.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2013 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
  5. // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
  6. package ipv6
  7. import "golang.org/x/net/internal/socket"
  8. func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error {
  9. opt.Lock()
  10. defer opt.Unlock()
  11. if so, ok := sockOpts[ssoReceiveTrafficClass]; ok && cf&FlagTrafficClass != 0 {
  12. if err := so.SetInt(c, boolint(on)); err != nil {
  13. return err
  14. }
  15. if on {
  16. opt.set(FlagTrafficClass)
  17. } else {
  18. opt.clear(FlagTrafficClass)
  19. }
  20. }
  21. if so, ok := sockOpts[ssoReceiveHopLimit]; ok && cf&FlagHopLimit != 0 {
  22. if err := so.SetInt(c, boolint(on)); err != nil {
  23. return err
  24. }
  25. if on {
  26. opt.set(FlagHopLimit)
  27. } else {
  28. opt.clear(FlagHopLimit)
  29. }
  30. }
  31. if so, ok := sockOpts[ssoReceivePacketInfo]; ok && cf&flagPacketInfo != 0 {
  32. if err := so.SetInt(c, boolint(on)); err != nil {
  33. return err
  34. }
  35. if on {
  36. opt.set(cf & flagPacketInfo)
  37. } else {
  38. opt.clear(cf & flagPacketInfo)
  39. }
  40. }
  41. if so, ok := sockOpts[ssoReceivePathMTU]; ok && cf&FlagPathMTU != 0 {
  42. if err := so.SetInt(c, boolint(on)); err != nil {
  43. return err
  44. }
  45. if on {
  46. opt.set(FlagPathMTU)
  47. } else {
  48. opt.clear(FlagPathMTU)
  49. }
  50. }
  51. return nil
  52. }