OLD | NEW |
(Empty) | |
| 1 // Copyright 2012 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 package ipv4 |
| 6 |
| 7 import ( |
| 8 "net" |
| 9 "os" |
| 10 "syscall" |
| 11 ) |
| 12 |
| 13 func ipv4ReceiveTOS(fd int) (bool, error) { |
| 14 v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVT
OS) |
| 15 if err != nil { |
| 16 return false, os.NewSyscallError("getsockopt", err) |
| 17 } |
| 18 return v == 1, nil |
| 19 } |
| 20 |
| 21 func setIPv4ReceiveTOS(fd int, v bool) error { |
| 22 err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTOS,
boolint(v)) |
| 23 if err != nil { |
| 24 return os.NewSyscallError("setsockopt", err) |
| 25 } |
| 26 return nil |
| 27 } |
| 28 |
| 29 func ipv4MulticastTTL(fd int) (int, error) { |
| 30 v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTI
CAST_TTL) |
| 31 if err != nil { |
| 32 return 0, os.NewSyscallError("getsockopt", err) |
| 33 } |
| 34 return v, nil |
| 35 } |
| 36 |
| 37 func setIPv4MulticastTTL(fd int, v int) error { |
| 38 err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAS
T_TTL, v) |
| 39 if err != nil { |
| 40 return os.NewSyscallError("setsockopt", err) |
| 41 } |
| 42 return nil |
| 43 } |
| 44 |
| 45 func ipv4PacketInfo(fd int) (bool, error) { |
| 46 v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_PKTIN
FO) |
| 47 if err != nil { |
| 48 return false, os.NewSyscallError("getsockopt", err) |
| 49 } |
| 50 return v == 1, nil |
| 51 } |
| 52 |
| 53 func setIPv4PacketInfo(fd int, v bool) error { |
| 54 err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_PKTINFO,
boolint(v)) |
| 55 if err != nil { |
| 56 return os.NewSyscallError("setsockopt", err) |
| 57 } |
| 58 return nil |
| 59 } |
| 60 |
| 61 func ipv4MulticastInterface(fd int) (*net.Interface, error) { |
| 62 mreqn, err := syscall.GetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.
IP_MULTICAST_IF) |
| 63 if err != nil { |
| 64 return nil, os.NewSyscallError("getsockopt", err) |
| 65 } |
| 66 if int(mreqn.Ifindex) == 0 { |
| 67 return nil, nil |
| 68 } |
| 69 return net.InterfaceByIndex(int(mreqn.Ifindex)) |
| 70 } |
| 71 |
| 72 func setIPv4MulticastInterface(fd int, ifi *net.Interface) error { |
| 73 mreqn := &syscall.IPMreqn{} |
| 74 if ifi != nil { |
| 75 mreqn.Ifindex = int32(ifi.Index) |
| 76 } |
| 77 err := syscall.SetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_MULT
ICAST_IF, mreqn) |
| 78 if err != nil { |
| 79 return os.NewSyscallError("setsockopt", err) |
| 80 } |
| 81 return nil |
| 82 } |
| 83 |
| 84 func ipv4MulticastLoopback(fd int) (bool, error) { |
| 85 v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTI
CAST_LOOP) |
| 86 if err != nil { |
| 87 return false, os.NewSyscallError("getsockopt", err) |
| 88 } |
| 89 return v == 1, nil |
| 90 } |
| 91 |
| 92 func setIPv4MulticastLoopback(fd int, v bool) error { |
| 93 err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAS
T_LOOP, boolint(v)) |
| 94 if err != nil { |
| 95 return os.NewSyscallError("setsockopt", err) |
| 96 } |
| 97 return nil |
| 98 } |
| 99 |
| 100 func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { |
| 101 mreqn := &syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp
[3]}} |
| 102 if ifi != nil { |
| 103 mreqn.Ifindex = int32(ifi.Index) |
| 104 } |
| 105 err := syscall.SetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_ADD_
MEMBERSHIP, mreqn) |
| 106 if err != nil { |
| 107 return os.NewSyscallError("setsockopt", err) |
| 108 } |
| 109 return nil |
| 110 } |
| 111 |
| 112 func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { |
| 113 mreqn := &syscall.IPMreqn{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp
[3]}} |
| 114 if ifi != nil { |
| 115 mreqn.Ifindex = int32(ifi.Index) |
| 116 } |
| 117 err := syscall.SetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_DROP
_MEMBERSHIP, mreqn) |
| 118 if err != nil { |
| 119 return os.NewSyscallError("setsockopt", err) |
| 120 } |
| 121 return nil |
| 122 } |
OLD | NEW |