text: // Copyright 2013 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  // +build darwin dragonfly freebsd linux netbsd openbsd solaris
  
  package ipv6
  
  import "golang.org/x/net/internal/socket"
  
  func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error {
  	opt.Lock()
  	defer opt.Unlock()
  	if so, ok := sockOpts[ssoReceiveTrafficClass]; ok && cf&FlagTrafficClass != 0 {
  		if err := so.SetInt(c, boolint(on)); err != nil {
  			return err
  		}
  		if on {
  			opt.set(FlagTrafficClass)
  		} else {
  			opt.clear(FlagTrafficClass)
  		}
  	}
  	if so, ok := sockOpts[ssoReceiveHopLimit]; ok && cf&FlagHopLimit != 0 {
  		if err := so.SetInt(c, boolint(on)); err != nil {
  			return err
  		}
  		if on {
  			opt.set(FlagHopLimit)
  		} else {
  			opt.clear(FlagHopLimit)
  		}
  	}
  	if so, ok := sockOpts[ssoReceivePacketInfo]; ok && cf&flagPacketInfo != 0 {
  		if err := so.SetInt(c, boolint(on)); err != nil {
  			return err
  		}
  		if on {
  			opt.set(cf & flagPacketInfo)
  		} else {
  			opt.clear(cf & flagPacketInfo)
  		}
  	}
  	if so, ok := sockOpts[ssoReceivePathMTU]; ok && cf&FlagPathMTU != 0 {
  		if err := so.SetInt(c, boolint(on)); err != nil {
  			return err
  		}
  		if on {
  			opt.set(FlagPathMTU)
  		} else {
  			opt.clear(FlagPathMTU)
  		}
  	}
  	return nil
  }
  