github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/golang.org/x/net/ipv6/control_unix.go (about) 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 5 // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris 6 7 package ipv6 8 9 import "golang.org/x/net/internal/socket" 10 11 func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { 12 opt.Lock() 13 defer opt.Unlock() 14 if so, ok := sockOpts[ssoReceiveTrafficClass]; ok && cf&FlagTrafficClass != 0 { 15 if err := so.SetInt(c, boolint(on)); err != nil { 16 return err 17 } 18 if on { 19 opt.set(FlagTrafficClass) 20 } else { 21 opt.clear(FlagTrafficClass) 22 } 23 } 24 if so, ok := sockOpts[ssoReceiveHopLimit]; ok && cf&FlagHopLimit != 0 { 25 if err := so.SetInt(c, boolint(on)); err != nil { 26 return err 27 } 28 if on { 29 opt.set(FlagHopLimit) 30 } else { 31 opt.clear(FlagHopLimit) 32 } 33 } 34 if so, ok := sockOpts[ssoReceivePacketInfo]; ok && cf&flagPacketInfo != 0 { 35 if err := so.SetInt(c, boolint(on)); err != nil { 36 return err 37 } 38 if on { 39 opt.set(cf & flagPacketInfo) 40 } else { 41 opt.clear(cf & flagPacketInfo) 42 } 43 } 44 if so, ok := sockOpts[ssoReceivePathMTU]; ok && cf&FlagPathMTU != 0 { 45 if err := so.SetInt(c, boolint(on)); err != nil { 46 return err 47 } 48 if on { 49 opt.set(FlagPathMTU) 50 } else { 51 opt.clear(FlagPathMTU) 52 } 53 } 54 return nil 55 }