package ipv4
import (
"unsafe"
"golang.org/x/net/internal/iana"
"golang.org/x/net/internal/socket"
"golang.org/x/sys/unix"
)
func setControlMessage(c *socket .Conn , opt *rawOpt , cf ControlFlags , on bool ) error {
opt .Lock ()
defer opt .Unlock ()
if so , ok := sockOpts [ssoReceiveTTL ]; ok && cf &FlagTTL != 0 {
if err := so .SetInt (c , boolint (on )); err != nil {
return err
}
if on {
opt .set (FlagTTL )
} else {
opt .clear (FlagTTL )
}
}
if so , ok := sockOpts [ssoPacketInfo ]; ok {
if cf &(FlagSrc |FlagDst |FlagInterface ) != 0 {
if err := so .SetInt (c , boolint (on )); err != nil {
return err
}
if on {
opt .set (cf & (FlagSrc | FlagDst | FlagInterface ))
} else {
opt .clear (cf & (FlagSrc | FlagDst | FlagInterface ))
}
}
} else {
if so , ok := sockOpts [ssoReceiveDst ]; ok && cf &FlagDst != 0 {
if err := so .SetInt (c , boolint (on )); err != nil {
return err
}
if on {
opt .set (FlagDst )
} else {
opt .clear (FlagDst )
}
}
if so , ok := sockOpts [ssoReceiveInterface ]; ok && cf &FlagInterface != 0 {
if err := so .SetInt (c , boolint (on )); err != nil {
return err
}
if on {
opt .set (FlagInterface )
} else {
opt .clear (FlagInterface )
}
}
}
return nil
}
func marshalTTL(b []byte , cm *ControlMessage ) []byte {
m := socket .ControlMessage (b )
m .MarshalHeader (iana .ProtocolIP , unix .IP_RECVTTL , 1 )
return m .Next (1 )
}
func parseTTL(cm *ControlMessage , b []byte ) {
cm .TTL = int (*(*byte )(unsafe .Pointer (&b [:1 ][0 ])))
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .