// Copyright 2012 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.

//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris

package ipv4

import (
	

	
	

	
)

func setControlMessage( *socket.Conn,  *rawOpt,  ControlFlags,  bool) error {
	.Lock()
	defer .Unlock()
	if ,  := sockOpts[ssoReceiveTTL];  && &FlagTTL != 0 {
		if  := .SetInt(, boolint());  != nil {
			return 
		}
		if  {
			.set(FlagTTL)
		} else {
			.clear(FlagTTL)
		}
	}
	if ,  := sockOpts[ssoPacketInfo];  {
		if &(FlagSrc|FlagDst|FlagInterface) != 0 {
			if  := .SetInt(, boolint());  != nil {
				return 
			}
			if  {
				.set( & (FlagSrc | FlagDst | FlagInterface))
			} else {
				.clear( & (FlagSrc | FlagDst | FlagInterface))
			}
		}
	} else {
		if ,  := sockOpts[ssoReceiveDst];  && &FlagDst != 0 {
			if  := .SetInt(, boolint());  != nil {
				return 
			}
			if  {
				.set(FlagDst)
			} else {
				.clear(FlagDst)
			}
		}
		if ,  := sockOpts[ssoReceiveInterface];  && &FlagInterface != 0 {
			if  := .SetInt(, boolint());  != nil {
				return 
			}
			if  {
				.set(FlagInterface)
			} else {
				.clear(FlagInterface)
			}
		}
	}
	return nil
}

func marshalTTL( []byte,  *ControlMessage) []byte {
	 := socket.ControlMessage()
	.MarshalHeader(iana.ProtocolIP, unix.IP_RECVTTL, 1)
	return .Next(1)
}

func parseTTL( *ControlMessage,  []byte) {
	.TTL = int(*(*byte)(unsafe.Pointer(&[:1][0])))
}