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