]> Cypherpunks repositories - gostls13.git/commitdiff
net, syscall: update IP multicast socket options for darwin, freebsd, linux
authorMikio Hara <mikioh.mikioh@gmail.com>
Thu, 2 Jun 2011 14:10:17 +0000 (10:10 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 2 Jun 2011 14:10:17 +0000 (10:10 -0400)
Add IPv6Mreq and Inet6Pktinfo for specifying the network interface.
Rename IpMreq to IPMreq, SetsockoptIpMreq to SetsockoptIPMreq.

R=rsc, dave, robert.hencke
CC=golang-dev
https://golang.org/cl/4532098

14 files changed:
src/pkg/net/udpsock.go
src/pkg/syscall/syscall_bsd.go
src/pkg/syscall/syscall_linux.go
src/pkg/syscall/syscall_windows.go
src/pkg/syscall/types_darwin.c
src/pkg/syscall/types_freebsd.c
src/pkg/syscall/types_linux.c
src/pkg/syscall/ztypes_darwin_386.go
src/pkg/syscall/ztypes_darwin_amd64.go
src/pkg/syscall/ztypes_freebsd_386.go
src/pkg/syscall/ztypes_freebsd_amd64.go
src/pkg/syscall/ztypes_linux_386.go
src/pkg/syscall/ztypes_linux_amd64.go
src/pkg/syscall/ztypes_linux_arm.go

index 409355667b539af3387224b01d78587552ee6024..5469acffad8ce3c8d1a78daebdc3f8908349baa7 100644 (file)
@@ -293,10 +293,10 @@ func (c *UDPConn) JoinGroup(addr IP) os.Error {
        if ip == nil {
                return &OpError{"joingroup", "udp", &IPAddr{ip}, errInvalidMulticast}
        }
-       mreq := &syscall.IpMreq{
+       mreq := &syscall.IPMreq{
                Multiaddr: [4]byte{ip[0], ip[1], ip[2], ip[3]},
        }
-       err := os.NewSyscallError("setsockopt", syscall.SetsockoptIpMreq(c.fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq))
+       err := os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(c.fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq))
        if err != nil {
                return &OpError{"joingroup", "udp", &IPAddr{ip}, err}
        }
@@ -312,10 +312,10 @@ func (c *UDPConn) LeaveGroup(addr IP) os.Error {
        if ip == nil {
                return &OpError{"leavegroup", "udp", &IPAddr{ip}, errInvalidMulticast}
        }
-       mreq := &syscall.IpMreq{
+       mreq := &syscall.IPMreq{
                Multiaddr: [4]byte{ip[0], ip[1], ip[2], ip[3]},
        }
-       err := os.NewSyscallError("setsockopt", syscall.SetsockoptIpMreq(c.fd.sysfd, syscall.IPPROTO_IP, syscall.IP_DROP_MEMBERSHIP, mreq))
+       err := os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(c.fd.sysfd, syscall.IPPROTO_IP, syscall.IP_DROP_MEMBERSHIP, mreq))
        if err != nil {
                return &OpError{"leavegroup", "udp", &IPAddr{ip}, err}
        }
index d670e64cbfc1bd6916e8bf9b2efeaf68f368c904..89bcc7f0e3fd38634759bd95b37d9128852a774b 100644 (file)
@@ -22,7 +22,6 @@ const ImplementsGetwd = false
 
 func Getwd() (string, int) { return "", ENOTSUP }
 
-
 /*
  * Wrapped
  */
@@ -392,7 +391,11 @@ func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int) {
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(l)), unsafe.Sizeof(*l))
 }
 
-func SetsockoptIpMreq(fd, level, opt int, mreq *IpMreq) (errno int) {
+func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (errno int) {
+       return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
+}
+
+func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (errno int) {
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
 }
 
index 9e9037ea149722a39cedbaa201fd4967e3af1c52..63682d23c49ee92991042ae4ebe4a897dbc50335 100644 (file)
@@ -463,7 +463,11 @@ func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int) {
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(l)), unsafe.Sizeof(*l))
 }
 
-func SetsockoptIpMreq(fd, level, opt int, mreq *IpMreq) (errno int) {
+func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (errno int) {
+       return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
+}
+
+func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (errno int) {
        return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
 }
 
index 37e90053e09092cae3c992b08c1a01d71a6e7a83..bb93533bd097f942091dcc04834c0f735539b9ac 100644 (file)
@@ -680,14 +680,20 @@ const (
        IP_DROP_MEMBERSHIP
 )
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
-func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int)    { return EWINDOWS }
-func SetsockoptIpMreq(fd, level, opt int, mreq *IpMreq) (errno int) { return EWINDOWS }
-func BindToDevice(fd int, device string) (errno int)                { return EWINDOWS }
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
+func SetsockoptLinger(fd, level, opt int, l *Linger) (errno int)        { return EWINDOWS }
+func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (errno int)     { return EWINDOWS }
+func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (errno int) { return EWINDOWS }
+func BindToDevice(fd int, device string) (errno int)                    { return EWINDOWS }
 
 // TODO(brainman): fix all needed for os
 
index 666923a6866e2e78c3c132d0c3f4950de0e117ba..ecccd5bd92a4df02a1c940003003c0dc9ebecad7 100644 (file)
@@ -39,8 +39,7 @@ Input to godefs.  See also mkerrors.sh and mkall.sh
 
 // Machine characteristics; for internal use.
 
-enum
-{
+enum {
        $sizeofPtr = sizeof(void*),
        $sizeofShort = sizeof(short),
        $sizeofInt = sizeof(int),
@@ -48,7 +47,6 @@ enum
        $sizeofLongLong = sizeof(long long),
 };
 
-
 // Basic types
 
 typedef short $_C_short;
@@ -71,8 +69,7 @@ typedef gid_t $_Gid_t;
 
 // Files
 
-enum
-{
+enum {
        $O_CLOEXEC = 0, // not supported
 };
 
@@ -86,8 +83,6 @@ typedef struct log2phys $Log2phys_t;
 
 typedef struct dirent $Dirent;
 
-// Wait status.
-
 // Sockets
 
 union sockaddr_all {
@@ -112,9 +107,11 @@ typedef struct sockaddr_any $RawSockaddrAny;
 typedef socklen_t $_Socklen;
 typedef struct linger $Linger;
 typedef struct iovec $Iovec;
-typedef struct ip_mreq $IpMreq;
+typedef struct ip_mreq $IPMreq;
+typedef struct ipv6_mreq $IPv6Mreq;
 typedef struct msghdr $Msghdr;
 typedef struct cmsghdr $Cmsghdr;
+typedef struct in6_pktinfo $Inet6Pktinfo;
 
 enum {
        $SizeofSockaddrInet4 = sizeof(struct sockaddr_in),
@@ -123,19 +120,21 @@ enum {
        $SizeofSockaddrUnix = sizeof(struct sockaddr_un),
        $SizeofSockaddrDatalink = sizeof(struct sockaddr_dl),
        $SizeofLinger = sizeof(struct linger),
-       $SizeofIpMreq = sizeof(struct ip_mreq),
+       $SizeofIPMreq = sizeof(struct ip_mreq),
+       $SizeofIPv6Mreq = sizeof(struct ipv6_mreq),
        $SizeofMsghdr = sizeof(struct msghdr),
        $SizeofCmsghdr = sizeof(struct cmsghdr),
+       $SizeofInet6Pktinfo = sizeof(struct in6_pktinfo),
 };
 
 // Ptrace requests
+
 enum {
        $PTRACE_TRACEME = PT_TRACE_ME,
        $PTRACE_CONT = PT_CONTINUE,
        $PTRACE_KILL = PT_KILL,
 };
 
-
 // Events (kqueue, kevent)
 
 typedef struct kevent $Kevent_t;
index 9d65683ef147a82a9fc0a7093481422b81184350..97636550acf5b8bdedfbf007451f212035408dd9 100644 (file)
@@ -35,8 +35,7 @@ Input to godefs.  See also mkerrors.sh and mkall.sh
 
 // Machine characteristics; for internal use.
 
-enum
-{
+enum {
        $sizeofPtr = sizeof(void*),
        $sizeofShort = sizeof(short),
        $sizeofInt = sizeof(int),
@@ -44,7 +43,6 @@ enum
        $sizeofLongLong = sizeof(long long),
 };
 
-
 // Basic types
 
 typedef short $_C_short;
@@ -66,13 +64,11 @@ typedef gid_t $_Gid_t;
 
 // Files
 
-enum
-{
+enum {
        $O_CLOEXEC = 0, // not supported
 };
 
-enum
-{      // Directory mode bits
+enum { // Directory mode bits
        $S_IFMT = S_IFMT,
        $S_IFIFO = S_IFIFO,
        $S_IFCHR = S_IFCHR,
@@ -95,8 +91,6 @@ typedef struct flock $Flock_t;
 
 typedef struct dirent $Dirent;
 
-// Wait status.
-
 // Sockets
 
 union sockaddr_all {
@@ -121,9 +115,11 @@ typedef struct sockaddr_any $RawSockaddrAny;
 typedef socklen_t $_Socklen;
 typedef struct linger $Linger;
 typedef struct iovec $Iovec;
-typedef struct ip_mreq $IpMreq;
+typedef struct ip_mreq $IPMreq;
+typedef struct ipv6_mreq $IPv6Mreq;
 typedef struct msghdr $Msghdr;
 typedef struct cmsghdr $Cmsghdr;
+typedef struct in6_pktinfo $Inet6Pktinfo;
 
 enum {
        $SizeofSockaddrInet4 = sizeof(struct sockaddr_in),
@@ -132,19 +128,21 @@ enum {
        $SizeofSockaddrUnix = sizeof(struct sockaddr_un),
        $SizeofSockaddrDatalink = sizeof(struct sockaddr_dl),
        $SizeofLinger = sizeof(struct linger),
-       $SizeofIpMreq = sizeof(struct ip_mreq),
+       $SizeofIPMreq = sizeof(struct ip_mreq),
+       $SizeofIPv6Mreq = sizeof(struct ipv6_mreq),
        $SizeofMsghdr = sizeof(struct msghdr),
        $SizeofCmsghdr = sizeof(struct cmsghdr),
+       $SizeofInet6Pktinfo = sizeof(struct in6_pktinfo),
 };
 
 // Ptrace requests
+
 enum {
        $PTRACE_TRACEME = PT_TRACE_ME,
        $PTRACE_CONT = PT_CONTINUE,
        $PTRACE_KILL = PT_KILL,
 };
 
-
 // Events (kqueue, kevent)
 
 typedef struct kevent $Kevent_t;
index c8ddc12f27e3211f22dd97f155f6495906cec8b9..ce7f96764a747c1ad53418f19f8cb143ab83cf12 100644 (file)
@@ -47,8 +47,7 @@ Input to godefs.  See also mkerrors.sh and mkall.sh
 
 // Machine characteristics; for internal use.
 
-enum
-{
+enum {
        $sizeofPtr = sizeof(void*),
        $sizeofShort = sizeof(short),
        $sizeofInt = sizeof(int),
@@ -113,9 +112,11 @@ typedef struct sockaddr_any $RawSockaddrAny;
 typedef socklen_t $_Socklen;
 typedef struct linger $Linger;
 typedef struct iovec $Iovec;
-typedef struct ip_mreq $IpMreq;
+typedef struct ip_mreq $IPMreq;
+typedef struct ipv6_mreq $IPv6Mreq;
 typedef struct msghdr $Msghdr;
 typedef struct cmsghdr $Cmsghdr;
+typedef struct in6_pktinfo $Inet6Pktinfo;
 typedef struct ucred $Ucred;
 
 enum {
@@ -126,9 +127,11 @@ enum {
        $SizeofSockaddrLinklayer = sizeof(struct sockaddr_ll),
        $SizeofSockaddrNetlink = sizeof(struct sockaddr_nl),
        $SizeofLinger = sizeof(struct linger),
-       $SizeofIpMreq = sizeof(struct ip_mreq), 
+       $SizeofIPMreq = sizeof(struct ip_mreq),
+       $SizeofIPv6Mreq = sizeof(struct ipv6_mreq),
        $SizeofMsghdr = sizeof(struct msghdr),
        $SizeofCmsghdr = sizeof(struct cmsghdr),
+       $SizeofInet6Pktinfo = sizeof(struct in6_pktinfo),
        $SizeofUcred = sizeof(struct ucred),
 };
 
index 1f378427f6570d33c09aec7ae5538702ef142537..2dec0178731c184cb539fe83e353f049fe3ecede 100644 (file)
@@ -22,9 +22,11 @@ const (
        SizeofSockaddrUnix     = 0x6a
        SizeofSockaddrDatalink = 0x14
        SizeofLinger           = 0x8
-       SizeofIpMreq           = 0x8
+       SizeofIPMreq           = 0x8
+       SizeofIPv6Mreq         = 0x14
        SizeofMsghdr           = 0x1c
        SizeofCmsghdr          = 0xc
+       SizeofInet6Pktinfo     = 0x14
        PTRACE_TRACEME         = 0
        PTRACE_CONT            = 0x7
        PTRACE_KILL            = 0x8
@@ -226,11 +228,16 @@ type Iovec struct {
        Len  uint32
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name       *byte
        Namelen    uint32
@@ -247,6 +254,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Kevent_t struct {
        Ident  uint32
        Filter int16
index 5fa27bdd75c326f94f9dda0c3e9404f7e6e061b0..96500d73272c6898aaa27afb30a28d71b194083c 100644 (file)
@@ -22,9 +22,11 @@ const (
        SizeofSockaddrUnix     = 0x6a
        SizeofSockaddrDatalink = 0x14
        SizeofLinger           = 0x8
-       SizeofIpMreq           = 0x8
+       SizeofIPMreq           = 0x8
+       SizeofIPv6Mreq         = 0x14
        SizeofMsghdr           = 0x30
        SizeofCmsghdr          = 0xc
+       SizeofInet6Pktinfo     = 0x14
        PTRACE_TRACEME         = 0
        PTRACE_CONT            = 0x7
        PTRACE_KILL            = 0x8
@@ -234,11 +236,16 @@ type Iovec struct {
        Len  uint64
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name         *byte
        Namelen      uint32
@@ -257,6 +264,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Kevent_t struct {
        Ident  uint64
        Filter int16
index f4d256f4e29982ca21bf22c3ffe7b762bccb6b23..6304d3b81345885618de75e2f99ce4cbd159d7d6 100644 (file)
@@ -32,9 +32,11 @@ const (
        SizeofSockaddrUnix     = 0x6a
        SizeofSockaddrDatalink = 0x36
        SizeofLinger           = 0x8
-       SizeofIpMreq           = 0x8
+       SizeofIPMreq           = 0x8
+       SizeofIPv6Mreq         = 0x14
        SizeofMsghdr           = 0x1c
        SizeofCmsghdr          = 0xc
+       SizeofInet6Pktinfo     = 0x14
        PTRACE_TRACEME         = 0
        PTRACE_CONT            = 0x7
        PTRACE_KILL            = 0x8
@@ -219,11 +221,16 @@ type Iovec struct {
        Len  uint32
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name       *byte
        Namelen    uint32
@@ -240,6 +247,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Kevent_t struct {
        Ident  uint32
        Filter int16
index cf6355caf08271aa4a3d8541a2ae652b03707ebf..ef5a51c4d8e75b0a952827c505f49ea7bf8bb3ac 100644 (file)
@@ -32,9 +32,11 @@ const (
        SizeofSockaddrUnix     = 0x6a
        SizeofSockaddrDatalink = 0x36
        SizeofLinger           = 0x8
-       SizeofIpMreq           = 0x8
+       SizeofIPMreq           = 0x8
+       SizeofIPv6Mreq         = 0x14
        SizeofMsghdr           = 0x30
        SizeofCmsghdr          = 0xc
+       SizeofInet6Pktinfo     = 0x14
        PTRACE_TRACEME         = 0
        PTRACE_CONT            = 0x7
        PTRACE_KILL            = 0x8
@@ -220,11 +222,16 @@ type Iovec struct {
        Len  uint64
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name         *byte
        Namelen      uint32
@@ -243,6 +250,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Kevent_t struct {
        Ident  uint64
        Filter int16
index f33de049d64e6f3697b57dab706cdf2c4a1701c4..65c8b87db1c7254b988d0b6097496adf92453eae 100644 (file)
@@ -19,9 +19,11 @@ const (
        SizeofSockaddrLinklayer = 0x14
        SizeofSockaddrNetlink   = 0xc
        SizeofLinger            = 0x8
-       SizeofIpMreq            = 0x8
+       SizeofIPMreq            = 0x8
+       SizeofIPv6Mreq          = 0x14
        SizeofMsghdr            = 0x1c
        SizeofCmsghdr           = 0xc
+       SizeofInet6Pktinfo      = 0x14
        SizeofUcred             = 0xc
        IFA_UNSPEC              = 0
        IFA_ADDRESS             = 0x1
@@ -298,11 +300,16 @@ type Iovec struct {
        Len  uint32
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name       *byte
        Namelen    uint32
@@ -319,6 +326,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Ucred struct {
        Pid int32
        Uid uint32
index 3c293f00e5a23091e2e94bf3bbe1d88fc82fc47c..e26b6bfd2d37371b631d3c3b7ccd8349308640a4 100644 (file)
@@ -19,9 +19,11 @@ const (
        SizeofSockaddrLinklayer = 0x14
        SizeofSockaddrNetlink   = 0xc
        SizeofLinger            = 0x8
-       SizeofIpMreq            = 0x8
+       SizeofIPMreq            = 0x8
+       SizeofIPv6Mreq          = 0x14
        SizeofMsghdr            = 0x38
        SizeofCmsghdr           = 0x10
+       SizeofInet6Pktinfo      = 0x14
        SizeofUcred             = 0xc
        IFA_UNSPEC              = 0
        IFA_ADDRESS             = 0x1
@@ -298,11 +300,16 @@ type Iovec struct {
        Len  uint64
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name         *byte
        Namelen      uint32
@@ -321,6 +328,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Ucred struct {
        Pid int32
        Uid uint32
index 3b282d8ca62c80e9201c82817602389d81ddd587..ebd5379cb57252a12545a47d8863bdddba6b5e37 100644 (file)
@@ -24,9 +24,11 @@ const (
        SizeofSockaddrLinklayer = 0x14
        SizeofSockaddrNetlink   = 0xc
        SizeofLinger            = 0x8
-       SizeofIpMreq            = 0x8
+       SizeofIPMreq            = 0x8
+       SizeofIPv6Mreq          = 0x14
        SizeofMsghdr            = 0x1c
        SizeofCmsghdr           = 0xc
+       SizeofInet6Pktinfo      = 0x14
        SizeofUcred             = 0xc
        IFA_UNSPEC              = 0
        IFA_ADDRESS             = 0x1
@@ -305,11 +307,16 @@ type Iovec struct {
        Len  uint32
 }
 
-type IpMreq struct {
+type IPMreq struct {
        Multiaddr [4]byte /* in_addr */
        Interface [4]byte /* in_addr */
 }
 
+type IPv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Interface uint32
+}
+
 type Msghdr struct {
        Name       *byte
        Namelen    uint32
@@ -326,6 +333,11 @@ type Cmsghdr struct {
        Type  int32
 }
 
+type Inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex uint32
+}
+
 type Ucred struct {
        Pid int32
        Uid uint32