[zxsocket] switch to fuchsia.posix.socket

NET-2364 #progress step 3

Change-Id: I8ed9fcf948b8617eb4589bd2c0bea789f8d9154b
diff --git a/regen-fidl b/regen-fidl
index 5af2592..e777b93 100755
--- a/regen-fidl
+++ b/regen-fidl
@@ -21,27 +21,20 @@
 # Parameters:
 # $1 = directory where fidl file is found.
 # $2 =  output of subdirectory of syscall/zx
-# $3..n = additional fidl dependencies needed to generate this target.
+# $3..n = additional arguments needed to generate this target.
 function generate_file {
   local source_dir=$1
   shift
   local package_dir=$1
   shift
-  local additional_files=""
-  local additional_files_prefix="--files"
-  while (( "$#" )); do
-    additional_files+="${additional_files_prefix} $1"
-    additional_files_prefix=""
-    shift
-  done
   out_file=third_party/go/src/syscall/zx/"${package_dir}"/impl.go
   copyright_line=$(grep -E "^// Copyright [0-9]+" "${out_file}" || \
     echo "// Copyright $(date +%Y) The Fuchsia Authors. All rights reserved.")
-  ./out/default/host_x64/fidlc \
+  ./out/default.zircon/tools/fidlc \
     --json "${ir_file}" \
-    ${additional_files} \
+    $@ \
     --files "${source_dir}"/*.fidl
-  ./out/default/host_x64/fidlgen \
+  fx fidlgen \
     --json "${ir_file}" \
     --generators go \
     --include-base notused \
@@ -61,14 +54,17 @@
 EOF
   cat "${tmpout}"/impl.go >> "${tmpfile}"
   perl -pi -e 's|^// WARNING: This file is machine generated by fidlgen.\n$||' "${tmpfile}"
-  perl -pi -e 's|fidl/fuchsia/mem|syscall/zx/mem|' "${tmpfile}"
-  ./out/default/tools/goroot/bin/gofmt -s -w "${tmpfile}"
+  perl -pi -e 's|fidl/fuchsia/|syscall/zx/|' "${tmpfile}"
+  perl -pi -e 's|package socket|package net|' "${tmpfile}"
+  ./buildtools/linux-x64/go/bin/gofmt -s -w "${tmpfile}"
   mv -- "${tmpfile}" "${out_file}"
 }
 
 generate_file third_party/go/src/syscall/zx/fidl/bindingstest/ fidl/bindingstest
 generate_file tools/fidl/gidl-conformance-suite/ fidl/conformance
-generate_file zircon/system/fidl/fuchsia-net net
 generate_file zircon/system/fidl/fuchsia-mem mem
 generate_file zircon/system/fidl/fuchsia-io io \
-  zircon/system/fidl/fuchsia-mem/*.fidl
+  --files zircon/system/fidl/fuchsia-mem/*.fidl
+generate_file zircon/system/fidl/fuchsia-posix-socket net \
+  --files zircon/system/fidl/fuchsia-mem/*.fidl \
+  --files zircon/system/fidl/fuchsia-io/*.fidl
diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go
index 792ee71..2a72e31 100644
--- a/src/go/build/deps_test.go
+++ b/src/go/build/deps_test.go
@@ -168,7 +168,7 @@
 	"syscall/zx/mem":               {"L0"},
 	"syscall/zx/mxnet":             {"L0"},
 	"syscall/zx/net":               {"L0"},
-	"syscall/zx/zxsocket":          {"L0", "syscall"},
+	"syscall/zx/zxsocket":          {"L0", "strconv", "syscall"},
 	"syscall/zx/zxwait":            {"L0"},
 
 	"internal/syscall/unix":             {"L0", "syscall"},
diff --git a/src/internal/poll/fd_fuchsia.go b/src/internal/poll/fd_fuchsia.go
index 89b703d..c455dc2 100644
--- a/src/internal/poll/fd_fuchsia.go
+++ b/src/internal/poll/fd_fuchsia.go
@@ -211,7 +211,7 @@
 	}
 
 	if s, ok := syscall.FDIOForFD(fd.Sysfd).(*zxsocket.Socket); ok {
-		code, err := s.Accept(0)
+		code, control, err := s.Accept(0)
 		if code == syscall.EAGAIN {
 			// TODO: non-blocking support, pass this to the poller
 			if obs, err := s.Wait(mxnet.MXSIO_SIGNAL_INCOMING|zx.SignalSocketPeerClosed, zx.TimensecInfinite); err != nil {
@@ -223,7 +223,7 @@
 			} else {
 				panic("unreachable")
 			}
-			code, err = s.Accept(0)
+			code, control, err = s.Accept(0)
 		}
 		if err != nil {
 			return nil, err
@@ -231,11 +231,7 @@
 		if code != 0 {
 			return nil, syscall.Errno(code)
 		}
-		var h zx.Handle
-		if err := s.Socket.Accept(&h); err != nil {
-			return nil, err
-		}
-		return zxsocket.NewSocket(zx.Socket(h)), nil
+		return zxsocket.NewSocket(control)
 	}
 	return nil, syscall.EBADF
 }
diff --git a/src/net/ipsock_fuchsia.go b/src/net/ipsock_fuchsia.go
index 2fd6775..3f67a1d 100644
--- a/src/net/ipsock_fuchsia.go
+++ b/src/net/ipsock_fuchsia.go
@@ -64,12 +64,12 @@
 	h  zx.Handle
 }
 
-func getSocketProvider() zx.Handle {
+func getProvider() zx.Handle {
 	socketProvider.mu.Lock()
 	defer socketProvider.mu.Unlock()
 	if socketProvider.h == zx.HandleInvalid {
 		if c0, c1, err := zx.NewChannel(0); err == nil {
-			if err := fdio.ServiceConnect("/svc/"+zxnet.SocketProviderName, zx.Handle(c0)); err == nil {
+			if err := fdio.ServiceConnect("/svc/"+zxnet.ProviderName, zx.Handle(c0)); err == nil {
 				socketProvider.h = zx.Handle(c1)
 			}
 		}
@@ -85,26 +85,26 @@
 		sotype = syscall.SOCK_DGRAM
 	}
 
-	var sp zxnet.SocketProviderInterface
+	var sp zxnet.ProviderInterface
 	// Wait for the network stack to publish the socket device.
 	// See similar logic in zircon/system/ulib/fdio/bsdsocket.c.
 	for i := 0; i < 40; i++ {
-		if h := getSocketProvider(); h.IsValid() {
-			sp = zxnet.SocketProviderInterface(fidl.ChannelProxy{Channel: zx.Channel(h)})
+		if h := getProvider(); h.IsValid() {
+			sp = zxnet.ProviderInterface(fidl.ChannelProxy{Channel: zx.Channel(h)})
 			break
 		}
 		time.Sleep(250 * time.Millisecond)
 	}
-	code, s, err := sp.Socket(int16(family), int16(sotype), syscall.IPPROTO_IP)
+	code, control, err := sp.Socket(int16(family), int16(sotype), syscall.IPPROTO_IP)
 	if err != nil {
 		return nil, err
 	}
 	if code != 0 {
 		return nil, syscall.Errno(code)
 	}
-	sock := zxsocket.NewSocket(s)
-	if sotype == syscall.SOCK_DGRAM {
-		sock.SetDgram()
+	sock, err := zxsocket.NewSocket(control)
+	if err != nil {
+		return nil, err
 	}
 
 	fd = newFD(sock, family, sotype, net)
diff --git a/src/syscall/zx/handle.go b/src/syscall/zx/handle.go
index 150c3c6..5a9b3c4 100644
--- a/src/syscall/zx/handle.go
+++ b/src/syscall/zx/handle.go
@@ -168,22 +168,17 @@
 	return nil
 }
 
-func (h *Handle) GetInfo(topic uint32, data []byte) (actual, avail uint, _ error) {
-	dataBytes := uint(len(data))
-	if status := Sys_object_get_info(*h, topic, bytesPtr(data), dataBytes, &actual, &avail); status != ErrOk {
-		return 0, 0, &Error{Status: status, Text: "zx.Handle.GetInfo"}
+func (h *Handle) GetInfo(topic uint32, buffer unsafe.Pointer, bufferSize uint) error {
+	if status := Sys_object_get_info(*h, topic, buffer, bufferSize, nil, nil); status != ErrOk {
+		return &Error{Status: status, Text: "zx.Handle.GetInfo"}
 	}
-	return actual, avail, nil
+	return nil
 }
 
 func (h *Handle) GetInfoHandleBasic() (InfoHandleBasic, error) {
 	var info InfoHandleBasic
-	dataBytes := uint(unsafe.Sizeof(info))
-	dataPtr := unsafe.Pointer(&info)
-	if status := Sys_object_get_info(*h, ObjectInfoHandleBasic, dataPtr, dataBytes, nil, nil); status != ErrOk {
-		return info, &Error{Status: status, Text: "zx.Handle.GetInfoHandleBasic"}
-	}
-	return info, nil
+	err := h.GetInfo(ObjectInfoHandleBasic, unsafe.Pointer(&info), uint(unsafe.Sizeof(info)))
+	return info, err
 }
 
 func (h *Handle) GetProperty(property uint32, data []byte) error {
diff --git a/src/syscall/zx/net/impl.go b/src/syscall/zx/net/impl.go
index 4661b55..a72a621 100644
--- a/src/syscall/zx/net/impl.go
+++ b/src/syscall/zx/net/impl.go
@@ -13,1050 +13,598 @@
 import (
 	_zx "syscall/zx"
 	_bindings "syscall/zx/fidl"
+	fuchsiaio "syscall/zx/io"
 )
 
 const (
-	MaxHostnameSize uint64 = 255
-	MaxAddr         uint64 = 128
-	MaxBuffer       uint64 = 900
+	ControlCloneOrdinal          uint64 = 402549324 << 32
+	ControlCloneGenOrdinal       uint64 = 402549324 << 32
+	ControlCloseOrdinal          uint64 = 1387878023 << 32
+	ControlCloseGenOrdinal       uint64 = 1387878023 << 32
+	ControlDescribeOrdinal       uint64 = 526573406 << 32
+	ControlDescribeGenOrdinal    uint64 = 526573406 << 32
+	ControlOnOpenOrdinal         uint64 = 1191225277 << 32
+	ControlOnOpenGenOrdinal      uint64 = 1191225277 << 32
+	ControlSyncOrdinal           uint64 = 1648508842 << 32
+	ControlSyncGenOrdinal        uint64 = 1648508842 << 32
+	ControlGetAttrOrdinal        uint64 = 1166403528 << 32
+	ControlGetAttrGenOrdinal     uint64 = 1166403528 << 32
+	ControlSetAttrOrdinal        uint64 = 198530458 << 32
+	ControlSetAttrGenOrdinal     uint64 = 198530458 << 32
+	ControlIoctlOrdinal          uint64 = 905161895 << 32
+	ControlIoctlGenOrdinal       uint64 = 905161895 << 32
+	ControlBindOrdinal           uint64 = 343163373 << 32
+	ControlBindGenOrdinal        uint64 = 343163373 << 32
+	ControlConnectOrdinal        uint64 = 595514168 << 32
+	ControlConnectGenOrdinal     uint64 = 595514168 << 32
+	ControlListenOrdinal         uint64 = 778265222 << 32
+	ControlListenGenOrdinal      uint64 = 778265222 << 32
+	ControlAcceptOrdinal         uint64 = 300755315 << 32
+	ControlAcceptGenOrdinal      uint64 = 300755315 << 32
+	ControlGetSockNameOrdinal    uint64 = 1673606786 << 32
+	ControlGetSockNameGenOrdinal uint64 = 1673606786 << 32
+	ControlGetPeerNameOrdinal    uint64 = 1484290998 << 32
+	ControlGetPeerNameGenOrdinal uint64 = 1484290998 << 32
+	ControlSetSockOptOrdinal     uint64 = 1268914087 << 32
+	ControlSetSockOptGenOrdinal  uint64 = 1268914087 << 32
+	ControlGetSockOptOrdinal     uint64 = 914699896 << 32
+	ControlGetSockOptGenOrdinal  uint64 = 914699896 << 32
+	ControlIoctlPosixOrdinal     uint64 = 1353250461 << 32
+	ControlIoctlPosixGenOrdinal  uint64 = 1353250461 << 32
 )
 
-type LookupError uint32
-
-const (
-	LookupErrorNotFound      LookupError = 1
-	LookupErrorTransient     LookupError = 2
-	LookupErrorInvalidArgs   LookupError = 3
-	LookupErrorInternalError LookupError = 4
-)
-
-func (x LookupError) String() string {
-	switch x {
-	case 1:
-		return "NotFound"
-	case 2:
-		return "Transient"
-	case 3:
-		return "InvalidArgs"
-	case 4:
-		return "InternalError"
-	}
-	return "Unknown"
+type controlCloneRequest struct {
+	_      struct{} `fidl2:"s,8,0"`
+	Flags  uint32
+	Object fuchsiaio.NodeInterfaceRequest `fidl2:"0"`
 }
 
-type AddrInfoStatus uint32
+var _mcontrolCloneRequest = _bindings.CreateLazyMarshaler(controlCloneRequest{})
 
-const (
-	AddrInfoStatusOk             AddrInfoStatus = 0
-	AddrInfoStatusBadFlags       AddrInfoStatus = 1
-	AddrInfoStatusNoName         AddrInfoStatus = 2
-	AddrInfoStatusAgain          AddrInfoStatus = 3
-	AddrInfoStatusFail           AddrInfoStatus = 4
-	AddrInfoStatusNoData         AddrInfoStatus = 5
-	AddrInfoStatusBufferOverflow AddrInfoStatus = 6
-	AddrInfoStatusSystemError    AddrInfoStatus = 7
-)
-
-func (x AddrInfoStatus) String() string {
-	switch x {
-	case 0:
-		return "Ok"
-	case 1:
-		return "BadFlags"
-	case 2:
-		return "NoName"
-	case 3:
-		return "Again"
-	case 4:
-		return "Fail"
-	case 5:
-		return "NoData"
-	case 6:
-		return "BufferOverflow"
-	case 7:
-		return "SystemError"
-	}
-	return "Unknown"
-}
-
-type LookupIpOptions uint8
-
-const (
-	LookupIpOptionsV4Addrs     LookupIpOptions = 1
-	LookupIpOptionsV6Addrs     LookupIpOptions = 2
-	LookupIpOptionsCnameLookup LookupIpOptions = 4
-)
-
-func (x LookupIpOptions) String() string {
-	switch x {
-	case 1:
-		return "V4Addrs"
-	case 2:
-		return "V6Addrs"
-	case 4:
-		return "CnameLookup"
-	}
-	return "Unknown"
+func (msg *controlCloneRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolCloneRequest
 }
 
-type NameLookupLookupIpResponse struct {
-	_    struct{} `fidl2:"s,48,8"`
-	Addr IpAddressInfo
+type controlCloseResponse struct {
+	_ struct{} `fidl2:"s,8,0"`
+	S int32
 }
 
-var _mNameLookupLookupIpResponse = _bindings.CreateLazyMarshaler(NameLookupLookupIpResponse{})
+var _mcontrolCloseResponse = _bindings.CreateLazyMarshaler(controlCloseResponse{})
 
-func (msg *NameLookupLookupIpResponse) Marshaler() _bindings.Marshaler {
-	return _mNameLookupLookupIpResponse
+func (msg *controlCloseResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolCloseResponse
 }
 
-type NameLookupLookupHostnameResponse struct {
-	_        struct{} `fidl2:"s,16,8"`
-	Hostname string   `fidl:"255" fidl2:"255"`
+type controlDescribeResponse struct {
+	_    struct{} `fidl2:"s,32,0"`
+	Info fuchsiaio.NodeInfo
 }
 
-var _mNameLookupLookupHostnameResponse = _bindings.CreateLazyMarshaler(NameLookupLookupHostnameResponse{})
+var _mcontrolDescribeResponse = _bindings.CreateLazyMarshaler(controlDescribeResponse{})
 
-func (msg *NameLookupLookupHostnameResponse) Marshaler() _bindings.Marshaler {
-	return _mNameLookupLookupHostnameResponse
+func (msg *controlDescribeResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolDescribeResponse
 }
 
-type IpAddressInfo struct {
-	_ struct{} `fidl2:"s,48,8"`
-	// All of the IPv4 addresses for the requested hostname.
-	Ipv4Addrs []Ipv4Address
-	// All of the IPv6 addresses for the requested hostname.
-	Ipv6Addrs []Ipv6Address
-	// The canonical name of the requested hostname (usually the DNS CNAME record, if one exists).
-	CanonicalName *string
+type controlOnOpenResponse struct {
+	_    struct{} `fidl2:"s,16,0"`
+	S    int32
+	Info *fuchsiaio.NodeInfo
 }
 
-var _mIpAddressInfo = _bindings.CreateLazyMarshaler(IpAddressInfo{})
+var _mcontrolOnOpenResponse = _bindings.CreateLazyMarshaler(controlOnOpenResponse{})
 
-func (msg *IpAddressInfo) Marshaler() _bindings.Marshaler {
-	return _mIpAddressInfo
+func (msg *controlOnOpenResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolOnOpenResponse
 }
 
-// Ipv4Address is expressed in network byte order, so the most significant byte
-// ("127" in the address "127.0.0.1") will be at index 0.
-type Ipv4Address struct {
-	_    struct{} `fidl2:"s,4,1"`
-	Addr [4]uint8
+type controlSyncResponse struct {
+	_ struct{} `fidl2:"s,8,0"`
+	S int32
 }
 
-var _mIpv4Address = _bindings.CreateLazyMarshaler(Ipv4Address{})
+var _mcontrolSyncResponse = _bindings.CreateLazyMarshaler(controlSyncResponse{})
 
-func (msg *Ipv4Address) Marshaler() _bindings.Marshaler {
-	return _mIpv4Address
+func (msg *controlSyncResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolSyncResponse
 }
 
-// Ipv6Address is expressed in network byte order, so the most significant byte
-// ("ff" in the address "ff02::1") will be at index 0.
-type Ipv6Address struct {
-	_    struct{} `fidl2:"s,16,1"`
-	Addr [16]uint8
+type controlGetAttrResponse struct {
+	_          struct{} `fidl2:"s,64,0"`
+	S          int32
+	Attributes fuchsiaio.NodeAttributes
 }
 
-var _mIpv6Address = _bindings.CreateLazyMarshaler(Ipv6Address{})
+var _mcontrolGetAttrResponse = _bindings.CreateLazyMarshaler(controlGetAttrResponse{})
 
-func (msg *Ipv6Address) Marshaler() _bindings.Marshaler {
-	return _mIpv6Address
+func (msg *controlGetAttrResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolGetAttrResponse
 }
 
-// Endpoint describes an IP address and port. The network protocol associated
-// with the Endpoint will be known from context or communicated through
-// additional structures.
-type Endpoint struct {
-	_ struct{} `fidl2:"s,24,4"`
-	// The IP address of the endpoint.
-	Addr IpAddress
-	// The port number of the endpoint.
-	Port uint16
+type controlSetAttrRequest struct {
+	_          struct{} `fidl2:"s,64,0"`
+	Flags      uint32
+	Attributes fuchsiaio.NodeAttributes
 }
 
-var _mEndpoint = _bindings.CreateLazyMarshaler(Endpoint{})
+var _mcontrolSetAttrRequest = _bindings.CreateLazyMarshaler(controlSetAttrRequest{})
 
-func (msg *Endpoint) Marshaler() _bindings.Marshaler {
-	return _mEndpoint
+func (msg *controlSetAttrRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolSetAttrRequest
 }
 
-// Subnet describes an IP subnetwork, where all host IP addresses share the same most significant
-// bits.
-type Subnet struct {
-	_ struct{} `fidl2:"s,24,4"`
-	// The Ipv4 or Ipv6 address. Only the `prefix_len` most significant bits may be set in `addr`;
-	// all bits in the host portion of the address must be zero.
-	Addr IpAddress
-	// The prefix length of the netmask. E.g. for 192.168.1.0/24, the prefix
-	// length is 24, corresponding to a netmask of 255.255.255.0.
-	// For Ipv4, prefix_len must be in the range [0, 32].
-	// For Ipv6, prefix_len must be in the range [0, 128].
-	PrefixLen uint8
+type controlSetAttrResponse struct {
+	_ struct{} `fidl2:"s,8,0"`
+	S int32
 }
 
-var _mSubnet = _bindings.CreateLazyMarshaler(Subnet{})
+var _mcontrolSetAttrResponse = _bindings.CreateLazyMarshaler(controlSetAttrResponse{})
 
-func (msg *Subnet) Marshaler() _bindings.Marshaler {
-	return _mSubnet
+func (msg *controlSetAttrResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolSetAttrResponse
 }
 
-// A MAC address used to identify a network interface on the data link layer within the network.
-type MacAddress struct {
-	_      struct{} `fidl2:"s,6,1"`
-	Octets [6]uint8
+type controlIoctlRequest struct {
+	_       struct{} `fidl2:"s,48,0"`
+	Opcode  uint32
+	MaxOut  uint64
+	Handles []_zx.Handle `fidl:"2" fidl2:"2,0"`
+	In      []uint8      `fidl:"8192" fidl2:"8192"`
 }
 
-var _mMacAddress = _bindings.CreateLazyMarshaler(MacAddress{})
+var _mcontrolIoctlRequest = _bindings.CreateLazyMarshaler(controlIoctlRequest{})
 
-func (msg *MacAddress) Marshaler() _bindings.Marshaler {
-	return _mMacAddress
+func (msg *controlIoctlRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolIoctlRequest
 }
 
-type AddrInfoHints struct {
-	_        struct{} `fidl2:"s,16,4"`
-	Flags    int32
-	Family   int32
-	SockType int32
-	Protocol int32
-}
-
-var _mAddrInfoHints = _bindings.CreateLazyMarshaler(AddrInfoHints{})
-
-func (msg *AddrInfoHints) Marshaler() _bindings.Marshaler {
-	return _mAddrInfoHints
-}
-
-type AddrStorage struct {
-	_   struct{} `fidl2:"s,20,4"`
-	Val [16]uint8
-	Len uint32
-}
-
-var _mAddrStorage = _bindings.CreateLazyMarshaler(AddrStorage{})
-
-func (msg *AddrStorage) Marshaler() _bindings.Marshaler {
-	return _mAddrStorage
-}
-
-type AddrInfo struct {
-	_        struct{} `fidl2:"s,40,4"`
-	Flags    int32
-	Family   int32
-	SockType int32
-	Protocol int32
-	Addr     AddrStorage
-	Port     uint16
-}
-
-var _mAddrInfo = _bindings.CreateLazyMarshaler(AddrInfo{})
-
-func (msg *AddrInfo) Marshaler() _bindings.Marshaler {
-	return _mAddrInfo
-}
-
-type NameLookupLookupIpResultTag uint32
-
-const (
-	_ NameLookupLookupIpResultTag = iota
-	NameLookupLookupIpResultResponse
-	NameLookupLookupIpResultErr
-)
-
-type NameLookupLookupIpResult struct {
-	NameLookupLookupIpResultTag `fidl:"tag" fidl2:"u,56,8"`
-	Response                    NameLookupLookupIpResponse
-	Err                         LookupError
-}
-
-func (u *NameLookupLookupIpResult) Which() NameLookupLookupIpResultTag {
-	return u.NameLookupLookupIpResultTag
-}
-
-func (u *NameLookupLookupIpResult) SetResponse(response NameLookupLookupIpResponse) {
-	u.NameLookupLookupIpResultTag = NameLookupLookupIpResultResponse
-	u.Response = response
-}
-
-func (u *NameLookupLookupIpResult) SetErr(err LookupError) {
-	u.NameLookupLookupIpResultTag = NameLookupLookupIpResultErr
-	u.Err = err
-}
-
-type NameLookupLookupHostnameResultTag uint32
-
-const (
-	_ NameLookupLookupHostnameResultTag = iota
-	NameLookupLookupHostnameResultResponse
-	NameLookupLookupHostnameResultErr
-)
-
-type NameLookupLookupHostnameResult struct {
-	NameLookupLookupHostnameResultTag `fidl:"tag" fidl2:"u,24,8"`
-	Response                          NameLookupLookupHostnameResponse
-	Err                               LookupError
-}
-
-func (u *NameLookupLookupHostnameResult) Which() NameLookupLookupHostnameResultTag {
-	return u.NameLookupLookupHostnameResultTag
-}
-
-func (u *NameLookupLookupHostnameResult) SetResponse(response NameLookupLookupHostnameResponse) {
-	u.NameLookupLookupHostnameResultTag = NameLookupLookupHostnameResultResponse
-	u.Response = response
-}
-
-func (u *NameLookupLookupHostnameResult) SetErr(err LookupError) {
-	u.NameLookupLookupHostnameResultTag = NameLookupLookupHostnameResultErr
-	u.Err = err
-}
-
-type IpAddressTag uint32
-
-const (
-	_ IpAddressTag = iota
-	IpAddressIpv4
-	IpAddressIpv6
-)
-
-// Represents an IP address that may be either v4 or v6.
-type IpAddress struct {
-	IpAddressTag `fidl:"tag" fidl2:"u,20,4"`
-	Ipv4         Ipv4Address
-	Ipv6         Ipv6Address
-}
-
-func (u *IpAddress) Which() IpAddressTag {
-	return u.IpAddressTag
-}
-
-func (u *IpAddress) SetIpv4(ipv4 Ipv4Address) {
-	u.IpAddressTag = IpAddressIpv4
-	u.Ipv4 = ipv4
-}
-
-func (u *IpAddress) SetIpv6(ipv6 Ipv6Address) {
-	u.IpAddressTag = IpAddressIpv6
-	u.Ipv6 = ipv6
-}
-
-const (
-	ConnectivityOnNetworkReachableOrdinal    uint64 = 1703348424 << 32
-	ConnectivityOnNetworkReachableGenOrdinal uint64 = 1703348424 << 32
-)
-
-type connectivityOnNetworkReachableResponse struct {
-	_         struct{} `fidl2:"s,8,0"`
-	Reachable bool
-}
-
-var _mconnectivityOnNetworkReachableResponse = _bindings.CreateLazyMarshaler(connectivityOnNetworkReachableResponse{})
-
-func (msg *connectivityOnNetworkReachableResponse) Marshaler() _bindings.Marshaler {
-	return _mconnectivityOnNetworkReachableResponse
-}
-
-type ConnectivityInterface _bindings.ChannelProxy
-
-// This is triggered on a state change in network reachability. Clients
-// should expect that network requests will succeed when `reachable` is
-// true.
-func (p *ConnectivityInterface) ExpectOnNetworkReachable() (bool, error) {
-	resp_ := &connectivityOnNetworkReachableResponse{}
-	err := ((*_bindings.ChannelProxy)(p)).Recv(ConnectivityOnNetworkReachableOrdinal, resp_)
-	return resp_.Reachable, err
-}
-
-type Connectivity interface {
-	// This is triggered on a state change in network reachability. Clients
-	// should expect that network requests will succeed when `reachable` is
-	// true.
-}
-
-type ConnectivityTransitionalBase struct{}
-
-type ConnectivityInterfaceRequest _bindings.InterfaceRequest
-
-func NewConnectivityInterfaceRequest() (ConnectivityInterfaceRequest, *ConnectivityInterface, error) {
-	req, cli, err := _bindings.NewInterfaceRequest()
-	return ConnectivityInterfaceRequest(req), (*ConnectivityInterface)(cli), err
-}
-
-// Implements ServiceRequest.
-func (_ ConnectivityInterfaceRequest) Name() string {
-	return "fuchsia.net.Connectivity"
-}
-func (c ConnectivityInterfaceRequest) ToChannel() _zx.Channel {
-	return c.Channel
-}
-
-const ConnectivityName = "fuchsia.net.Connectivity"
-
-type ConnectivityStub struct {
-	Impl Connectivity
-}
-
-func (s_ *ConnectivityStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
-	switch ordinal_ {
-	}
-	return nil, _bindings.ErrUnknownOrdinal
-}
-
-type ConnectivityService struct {
-	_bindings.BindingSet
-}
-
-func (s *ConnectivityService) Add(impl Connectivity, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
-	return s.BindingSet.Add(&ConnectivityStub{Impl: impl}, c, onError)
-}
-
-func (s *ConnectivityService) EventProxyFor(key _bindings.BindingKey) (*ConnectivityEventProxy, bool) {
-	pxy, err := s.BindingSet.ProxyFor(key)
-	return (*ConnectivityEventProxy)(pxy), err
-}
-
-type ConnectivityEventProxy _bindings.ChannelProxy
-
-func (p *ConnectivityEventProxy) OnNetworkReachable(reachable bool) error {
-	event_ := &connectivityOnNetworkReachableResponse{
-		Reachable: reachable,
-	}
-	return ((*_bindings.ChannelProxy)(p)).Send(ConnectivityOnNetworkReachableOrdinal, event_)
-}
-
-const (
-	NameLookupLookupIpOrdinal          uint64 = 818031436 << 32
-	NameLookupLookupIpGenOrdinal       uint64 = 818031436 << 32
-	NameLookupLookupHostnameOrdinal    uint64 = 391654548 << 32
-	NameLookupLookupHostnameGenOrdinal uint64 = 391654548 << 32
-)
-
-type nameLookupLookupIpRequest struct {
-	_        struct{} `fidl2:"s,24,0"`
-	Hostname string   `fidl:"255" fidl2:"255"`
-	Options  LookupIpOptions
-}
-
-var _mnameLookupLookupIpRequest = _bindings.CreateLazyMarshaler(nameLookupLookupIpRequest{})
-
-func (msg *nameLookupLookupIpRequest) Marshaler() _bindings.Marshaler {
-	return _mnameLookupLookupIpRequest
-}
-
-type nameLookupLookupIpResponse struct {
-	_      struct{} `fidl2:"s,56,0"`
-	Result NameLookupLookupIpResult
-}
-
-var _mnameLookupLookupIpResponse = _bindings.CreateLazyMarshaler(nameLookupLookupIpResponse{})
-
-func (msg *nameLookupLookupIpResponse) Marshaler() _bindings.Marshaler {
-	return _mnameLookupLookupIpResponse
-}
-
-type nameLookupLookupHostnameRequest struct {
-	_    struct{} `fidl2:"s,24,0"`
-	Addr IpAddress
-}
-
-var _mnameLookupLookupHostnameRequest = _bindings.CreateLazyMarshaler(nameLookupLookupHostnameRequest{})
-
-func (msg *nameLookupLookupHostnameRequest) Marshaler() _bindings.Marshaler {
-	return _mnameLookupLookupHostnameRequest
-}
-
-type nameLookupLookupHostnameResponse struct {
-	_      struct{} `fidl2:"s,24,0"`
-	Result NameLookupLookupHostnameResult
-}
-
-var _mnameLookupLookupHostnameResponse = _bindings.CreateLazyMarshaler(nameLookupLookupHostnameResponse{})
-
-func (msg *nameLookupLookupHostnameResponse) Marshaler() _bindings.Marshaler {
-	return _mnameLookupLookupHostnameResponse
-}
-
-type NameLookupInterface _bindings.ChannelProxy
-
-// Look up a list of IP addresses by hostname.
-//
-// If `hostname` is an Internationalized Domain Name, it must be encoded as per RFC 3490.
-func (p *NameLookupInterface) LookupIp(hostname string, options LookupIpOptions) (NameLookupLookupIpResult, error) {
-	req_ := &nameLookupLookupIpRequest{
-		Hostname: hostname,
-		Options:  options,
-	}
-	resp_ := &nameLookupLookupIpResponse{}
-	err := ((*_bindings.ChannelProxy)(p)).Call(NameLookupLookupIpOrdinal, req_, resp_)
-	return resp_.Result, err
-}
-
-// Look up a hostname by IP address.
-func (p *NameLookupInterface) LookupHostname(addr IpAddress) (NameLookupLookupHostnameResult, error) {
-	req_ := &nameLookupLookupHostnameRequest{
-		Addr: addr,
-	}
-	resp_ := &nameLookupLookupHostnameResponse{}
-	err := ((*_bindings.ChannelProxy)(p)).Call(NameLookupLookupHostnameOrdinal, req_, resp_)
-	return resp_.Result, err
-}
-
-type NameLookup interface {
-	// Look up a list of IP addresses by hostname.
-	//
-	// If `hostname` is an Internationalized Domain Name, it must be encoded as per RFC 3490.
-	LookupIp(hostname string, options LookupIpOptions) (NameLookupLookupIpResult, error)
-	// Look up a hostname by IP address.
-	LookupHostname(addr IpAddress) (NameLookupLookupHostnameResult, error)
-}
-
-type NameLookupTransitionalBase struct{}
-
-type NameLookupInterfaceRequest _bindings.InterfaceRequest
-
-func NewNameLookupInterfaceRequest() (NameLookupInterfaceRequest, *NameLookupInterface, error) {
-	req, cli, err := _bindings.NewInterfaceRequest()
-	return NameLookupInterfaceRequest(req), (*NameLookupInterface)(cli), err
-}
-
-// Implements ServiceRequest.
-func (_ NameLookupInterfaceRequest) Name() string {
-	return "fuchsia.net.NameLookup"
-}
-func (c NameLookupInterfaceRequest) ToChannel() _zx.Channel {
-	return c.Channel
-}
-
-const NameLookupName = "fuchsia.net.NameLookup"
-
-type NameLookupStub struct {
-	Impl NameLookup
-}
-
-func (s_ *NameLookupStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
-	switch ordinal_ {
-	case NameLookupLookupIpOrdinal:
-		in_ := nameLookupLookupIpRequest{}
-		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
-		}
-		result, err_ := s_.Impl.LookupIp(in_.Hostname, in_.Options)
-		out_ := nameLookupLookupIpResponse{}
-		out_.Result = result
-		return &out_, err_
-	case NameLookupLookupHostnameOrdinal:
-		in_ := nameLookupLookupHostnameRequest{}
-		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
-		}
-		result, err_ := s_.Impl.LookupHostname(in_.Addr)
-		out_ := nameLookupLookupHostnameResponse{}
-		out_.Result = result
-		return &out_, err_
-	}
-	return nil, _bindings.ErrUnknownOrdinal
-}
-
-type NameLookupService struct {
-	_bindings.BindingSet
-}
-
-func (s *NameLookupService) Add(impl NameLookup, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
-	return s.BindingSet.Add(&NameLookupStub{Impl: impl}, c, onError)
-}
-
-func (s *NameLookupService) EventProxyFor(key _bindings.BindingKey) (*NameLookupEventProxy, bool) {
-	pxy, err := s.BindingSet.ProxyFor(key)
-	return (*NameLookupEventProxy)(pxy), err
-}
-
-type NameLookupEventProxy _bindings.ChannelProxy
-
-const (
-	SocketProviderSocketOrdinal         uint64 = 316444173 << 32
-	SocketProviderSocketGenOrdinal      uint64 = 316444173 << 32
-	SocketProviderGetAddrInfoOrdinal    uint64 = 498796293 << 32
-	SocketProviderGetAddrInfoGenOrdinal uint64 = 498796293 << 32
-)
-
-type socketProviderSocketRequest struct {
-	_        struct{} `fidl2:"s,8,0"`
-	Domain   int16
-	Type     int16
-	Protocol int16
-}
-
-var _msocketProviderSocketRequest = _bindings.CreateLazyMarshaler(socketProviderSocketRequest{})
-
-func (msg *socketProviderSocketRequest) Marshaler() _bindings.Marshaler {
-	return _msocketProviderSocketRequest
-}
-
-type socketProviderSocketResponse struct {
-	_    struct{} `fidl2:"s,8,0"`
-	Code int16
-	S    _zx.Socket `fidl:"*" fidl2:"1"`
-}
-
-var _msocketProviderSocketResponse = _bindings.CreateLazyMarshaler(socketProviderSocketResponse{})
-
-func (msg *socketProviderSocketResponse) Marshaler() _bindings.Marshaler {
-	return _msocketProviderSocketResponse
-}
-
-type socketProviderGetAddrInfoRequest struct {
+type controlIoctlResponse struct {
 	_       struct{} `fidl2:"s,40,0"`
-	Node    *string  `fidl:"256" fidl2:"256"`
-	Service *string  `fidl:"256" fidl2:"256"`
-	Hints   *AddrInfoHints
+	S       int32
+	Handles []_zx.Handle `fidl:"2" fidl2:"2,0"`
+	Out     []uint8      `fidl:"8192" fidl2:"8192"`
 }
 
-var _msocketProviderGetAddrInfoRequest = _bindings.CreateLazyMarshaler(socketProviderGetAddrInfoRequest{})
+var _mcontrolIoctlResponse = _bindings.CreateLazyMarshaler(controlIoctlResponse{})
 
-func (msg *socketProviderGetAddrInfoRequest) Marshaler() _bindings.Marshaler {
-	return _msocketProviderGetAddrInfoRequest
+func (msg *controlIoctlResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolIoctlResponse
 }
 
-type socketProviderGetAddrInfoResponse struct {
-	_      struct{} `fidl2:"s,168,0"`
-	Status AddrInfoStatus
-	Nres   uint32
-	Res    [4]AddrInfo
-}
-
-var _msocketProviderGetAddrInfoResponse = _bindings.CreateLazyMarshaler(socketProviderGetAddrInfoResponse{})
-
-func (msg *socketProviderGetAddrInfoResponse) Marshaler() _bindings.Marshaler {
-	return _msocketProviderGetAddrInfoResponse
-}
-
-type SocketProviderInterface _bindings.ChannelProxy
-
-// Requests a socket with the specified parameters. Values for `code` are defined in
-// errno.h.
-func (p *SocketProviderInterface) Socket(domain int16, type_ int16, protocol int16) (int16, _zx.Socket, error) {
-	req_ := &socketProviderSocketRequest{
-		Domain:   domain,
-		Type:     type_,
-		Protocol: protocol,
-	}
-	resp_ := &socketProviderSocketResponse{}
-	err := ((*_bindings.ChannelProxy)(p)).Call(SocketProviderSocketOrdinal, req_, resp_)
-	return resp_.Code, resp_.S, err
-}
-
-// Retrieves information about the address of a node and/or service. The number of valid
-// results in `res` is given by the `count` return value.
-func (p *SocketProviderInterface) GetAddrInfo(node *string, service *string, hints *AddrInfoHints) (AddrInfoStatus, uint32, [4]AddrInfo, error) {
-	req_ := &socketProviderGetAddrInfoRequest{
-		Node:    node,
-		Service: service,
-		Hints:   hints,
-	}
-	resp_ := &socketProviderGetAddrInfoResponse{}
-	err := ((*_bindings.ChannelProxy)(p)).Call(SocketProviderGetAddrInfoOrdinal, req_, resp_)
-	return resp_.Status, resp_.Nres, resp_.Res, err
-}
-
-// SocketProvider implements the POSIX sockets API.
-type SocketProvider interface {
-	// Requests a socket with the specified parameters. Values for `code` are defined in
-	// errno.h.
-	Socket(domain int16, type_ int16, protocol int16) (int16, _zx.Socket, error)
-	// Retrieves information about the address of a node and/or service. The number of valid
-	// results in `res` is given by the `count` return value.
-	GetAddrInfo(node *string, service *string, hints *AddrInfoHints) (AddrInfoStatus, uint32, [4]AddrInfo, error)
-}
-
-type SocketProviderTransitionalBase struct{}
-
-type SocketProviderInterfaceRequest _bindings.InterfaceRequest
-
-func NewSocketProviderInterfaceRequest() (SocketProviderInterfaceRequest, *SocketProviderInterface, error) {
-	req, cli, err := _bindings.NewInterfaceRequest()
-	return SocketProviderInterfaceRequest(req), (*SocketProviderInterface)(cli), err
-}
-
-// Implements ServiceRequest.
-func (_ SocketProviderInterfaceRequest) Name() string {
-	return "fuchsia.net.SocketProvider"
-}
-func (c SocketProviderInterfaceRequest) ToChannel() _zx.Channel {
-	return c.Channel
-}
-
-const SocketProviderName = "fuchsia.net.SocketProvider"
-
-type SocketProviderStub struct {
-	Impl SocketProvider
-}
-
-func (s_ *SocketProviderStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
-	switch ordinal_ {
-	case SocketProviderSocketOrdinal:
-		in_ := socketProviderSocketRequest{}
-		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
-		}
-		code, s, err_ := s_.Impl.Socket(in_.Domain, in_.Type, in_.Protocol)
-		out_ := socketProviderSocketResponse{}
-		out_.Code = code
-		out_.S = s
-		return &out_, err_
-	case SocketProviderGetAddrInfoOrdinal:
-		in_ := socketProviderGetAddrInfoRequest{}
-		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
-		}
-		status, nres, res, err_ := s_.Impl.GetAddrInfo(in_.Node, in_.Service, in_.Hints)
-		out_ := socketProviderGetAddrInfoResponse{}
-		out_.Status = status
-		out_.Nres = nres
-		out_.Res = res
-		return &out_, err_
-	}
-	return nil, _bindings.ErrUnknownOrdinal
-}
-
-type SocketProviderService struct {
-	_bindings.BindingSet
-}
-
-func (s *SocketProviderService) Add(impl SocketProvider, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
-	return s.BindingSet.Add(&SocketProviderStub{Impl: impl}, c, onError)
-}
-
-func (s *SocketProviderService) EventProxyFor(key _bindings.BindingKey) (*SocketProviderEventProxy, bool) {
-	pxy, err := s.BindingSet.ProxyFor(key)
-	return (*SocketProviderEventProxy)(pxy), err
-}
-
-type SocketProviderEventProxy _bindings.ChannelProxy
-
-const (
-	SocketControlBindOrdinal           uint64 = 2092731140 << 32
-	SocketControlBindGenOrdinal        uint64 = 2092731140 << 32
-	SocketControlConnectOrdinal        uint64 = 345505709 << 32
-	SocketControlConnectGenOrdinal     uint64 = 345505709 << 32
-	SocketControlListenOrdinal         uint64 = 1117818704 << 32
-	SocketControlListenGenOrdinal      uint64 = 1117818704 << 32
-	SocketControlAcceptOrdinal         uint64 = 796734679 << 32
-	SocketControlAcceptGenOrdinal      uint64 = 796734679 << 32
-	SocketControlCloseOrdinal          uint64 = 506040350 << 32
-	SocketControlCloseGenOrdinal       uint64 = 506040350 << 32
-	SocketControlGetSockNameOrdinal    uint64 = 764939941 << 32
-	SocketControlGetSockNameGenOrdinal uint64 = 764939941 << 32
-	SocketControlGetPeerNameOrdinal    uint64 = 472396488 << 32
-	SocketControlGetPeerNameGenOrdinal uint64 = 472396488 << 32
-	SocketControlSetSockOptOrdinal     uint64 = 1365685084 << 32
-	SocketControlSetSockOptGenOrdinal  uint64 = 1365685084 << 32
-	SocketControlGetSockOptOrdinal     uint64 = 2132650507 << 32
-	SocketControlGetSockOptGenOrdinal  uint64 = 2132650507 << 32
-	SocketControlIoctlOrdinal          uint64 = 1157859964 << 32
-	SocketControlIoctlGenOrdinal       uint64 = 1157859964 << 32
-)
-
-type socketControlBindRequest struct {
+type controlBindRequest struct {
 	_    struct{} `fidl2:"s,16,0"`
-	Addr []uint8  `fidl:"128" fidl2:"128"`
+	Addr []uint8
 }
 
-var _msocketControlBindRequest = _bindings.CreateLazyMarshaler(socketControlBindRequest{})
+var _mcontrolBindRequest = _bindings.CreateLazyMarshaler(controlBindRequest{})
 
-func (msg *socketControlBindRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlBindRequest
+func (msg *controlBindRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolBindRequest
 }
 
-type socketControlBindResponse struct {
+type controlBindResponse struct {
 	_    struct{} `fidl2:"s,8,0"`
 	Code int16
 }
 
-var _msocketControlBindResponse = _bindings.CreateLazyMarshaler(socketControlBindResponse{})
+var _mcontrolBindResponse = _bindings.CreateLazyMarshaler(controlBindResponse{})
 
-func (msg *socketControlBindResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlBindResponse
+func (msg *controlBindResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolBindResponse
 }
 
-type socketControlConnectRequest struct {
+type controlConnectRequest struct {
 	_    struct{} `fidl2:"s,16,0"`
-	Addr []uint8  `fidl:"128" fidl2:"128"`
+	Addr []uint8
 }
 
-var _msocketControlConnectRequest = _bindings.CreateLazyMarshaler(socketControlConnectRequest{})
+var _mcontrolConnectRequest = _bindings.CreateLazyMarshaler(controlConnectRequest{})
 
-func (msg *socketControlConnectRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlConnectRequest
+func (msg *controlConnectRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolConnectRequest
 }
 
-type socketControlConnectResponse struct {
+type controlConnectResponse struct {
 	_    struct{} `fidl2:"s,8,0"`
 	Code int16
 }
 
-var _msocketControlConnectResponse = _bindings.CreateLazyMarshaler(socketControlConnectResponse{})
+var _mcontrolConnectResponse = _bindings.CreateLazyMarshaler(controlConnectResponse{})
 
-func (msg *socketControlConnectResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlConnectResponse
+func (msg *controlConnectResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolConnectResponse
 }
 
-type socketControlListenRequest struct {
+type controlListenRequest struct {
 	_       struct{} `fidl2:"s,8,0"`
 	Backlog int16
 }
 
-var _msocketControlListenRequest = _bindings.CreateLazyMarshaler(socketControlListenRequest{})
+var _mcontrolListenRequest = _bindings.CreateLazyMarshaler(controlListenRequest{})
 
-func (msg *socketControlListenRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlListenRequest
+func (msg *controlListenRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolListenRequest
 }
 
-type socketControlListenResponse struct {
+type controlListenResponse struct {
 	_    struct{} `fidl2:"s,8,0"`
 	Code int16
 }
 
-var _msocketControlListenResponse = _bindings.CreateLazyMarshaler(socketControlListenResponse{})
+var _mcontrolListenResponse = _bindings.CreateLazyMarshaler(controlListenResponse{})
 
-func (msg *socketControlListenResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlListenResponse
+func (msg *controlListenResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolListenResponse
 }
 
-type socketControlAcceptRequest struct {
+type controlAcceptRequest struct {
 	_     struct{} `fidl2:"s,8,0"`
 	Flags int16
 }
 
-var _msocketControlAcceptRequest = _bindings.CreateLazyMarshaler(socketControlAcceptRequest{})
+var _mcontrolAcceptRequest = _bindings.CreateLazyMarshaler(controlAcceptRequest{})
 
-func (msg *socketControlAcceptRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlAcceptRequest
+func (msg *controlAcceptRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolAcceptRequest
 }
 
-type socketControlAcceptResponse struct {
+type controlAcceptResponse struct {
 	_    struct{} `fidl2:"s,8,0"`
 	Code int16
+	S    ControlInterface `fidl:"*"`
 }
 
-var _msocketControlAcceptResponse = _bindings.CreateLazyMarshaler(socketControlAcceptResponse{})
+var _mcontrolAcceptResponse = _bindings.CreateLazyMarshaler(controlAcceptResponse{})
 
-func (msg *socketControlAcceptResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlAcceptResponse
+func (msg *controlAcceptResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolAcceptResponse
 }
 
-type socketControlCloseResponse struct {
-	_    struct{} `fidl2:"s,8,0"`
-	Code int16
-}
-
-var _msocketControlCloseResponse = _bindings.CreateLazyMarshaler(socketControlCloseResponse{})
-
-func (msg *socketControlCloseResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlCloseResponse
-}
-
-type socketControlGetSockNameResponse struct {
+type controlGetSockNameResponse struct {
 	_    struct{} `fidl2:"s,24,0"`
 	Code int16
-	Addr []uint8 `fidl:"128" fidl2:"128"`
+	Addr []uint8
 }
 
-var _msocketControlGetSockNameResponse = _bindings.CreateLazyMarshaler(socketControlGetSockNameResponse{})
+var _mcontrolGetSockNameResponse = _bindings.CreateLazyMarshaler(controlGetSockNameResponse{})
 
-func (msg *socketControlGetSockNameResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlGetSockNameResponse
+func (msg *controlGetSockNameResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolGetSockNameResponse
 }
 
-type socketControlGetPeerNameResponse struct {
+type controlGetPeerNameResponse struct {
 	_    struct{} `fidl2:"s,24,0"`
 	Code int16
-	Addr []uint8 `fidl:"128" fidl2:"128"`
+	Addr []uint8
 }
 
-var _msocketControlGetPeerNameResponse = _bindings.CreateLazyMarshaler(socketControlGetPeerNameResponse{})
+var _mcontrolGetPeerNameResponse = _bindings.CreateLazyMarshaler(controlGetPeerNameResponse{})
 
-func (msg *socketControlGetPeerNameResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlGetPeerNameResponse
+func (msg *controlGetPeerNameResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolGetPeerNameResponse
 }
 
-type socketControlSetSockOptRequest struct {
+type controlSetSockOptRequest struct {
 	_       struct{} `fidl2:"s,24,0"`
 	Level   int16
 	Optname int16
-	Optval  []uint8 `fidl:"900" fidl2:"900"`
+	Optval  []uint8
 }
 
-var _msocketControlSetSockOptRequest = _bindings.CreateLazyMarshaler(socketControlSetSockOptRequest{})
+var _mcontrolSetSockOptRequest = _bindings.CreateLazyMarshaler(controlSetSockOptRequest{})
 
-func (msg *socketControlSetSockOptRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlSetSockOptRequest
+func (msg *controlSetSockOptRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolSetSockOptRequest
 }
 
-type socketControlSetSockOptResponse struct {
+type controlSetSockOptResponse struct {
 	_    struct{} `fidl2:"s,8,0"`
 	Code int16
 }
 
-var _msocketControlSetSockOptResponse = _bindings.CreateLazyMarshaler(socketControlSetSockOptResponse{})
+var _mcontrolSetSockOptResponse = _bindings.CreateLazyMarshaler(controlSetSockOptResponse{})
 
-func (msg *socketControlSetSockOptResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlSetSockOptResponse
+func (msg *controlSetSockOptResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolSetSockOptResponse
 }
 
-type socketControlGetSockOptRequest struct {
+type controlGetSockOptRequest struct {
 	_       struct{} `fidl2:"s,8,0"`
 	Level   int16
 	Optname int16
 }
 
-var _msocketControlGetSockOptRequest = _bindings.CreateLazyMarshaler(socketControlGetSockOptRequest{})
+var _mcontrolGetSockOptRequest = _bindings.CreateLazyMarshaler(controlGetSockOptRequest{})
 
-func (msg *socketControlGetSockOptRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlGetSockOptRequest
+func (msg *controlGetSockOptRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolGetSockOptRequest
 }
 
-type socketControlGetSockOptResponse struct {
+type controlGetSockOptResponse struct {
 	_      struct{} `fidl2:"s,24,0"`
 	Code   int16
-	Optval []uint8 `fidl:"900" fidl2:"900"`
+	Optval []uint8
 }
 
-var _msocketControlGetSockOptResponse = _bindings.CreateLazyMarshaler(socketControlGetSockOptResponse{})
+var _mcontrolGetSockOptResponse = _bindings.CreateLazyMarshaler(controlGetSockOptResponse{})
 
-func (msg *socketControlGetSockOptResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlGetSockOptResponse
+func (msg *controlGetSockOptResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolGetSockOptResponse
 }
 
-type socketControlIoctlRequest struct {
+type controlIoctlPosixRequest struct {
 	_   struct{} `fidl2:"s,24,0"`
 	Req int16
-	In  []uint8 `fidl:"900" fidl2:"900"`
+	In  []uint8
 }
 
-var _msocketControlIoctlRequest = _bindings.CreateLazyMarshaler(socketControlIoctlRequest{})
+var _mcontrolIoctlPosixRequest = _bindings.CreateLazyMarshaler(controlIoctlPosixRequest{})
 
-func (msg *socketControlIoctlRequest) Marshaler() _bindings.Marshaler {
-	return _msocketControlIoctlRequest
+func (msg *controlIoctlPosixRequest) Marshaler() _bindings.Marshaler {
+	return _mcontrolIoctlPosixRequest
 }
 
-type socketControlIoctlResponse struct {
+type controlIoctlPosixResponse struct {
 	_    struct{} `fidl2:"s,24,0"`
 	Code int16
-	Out  []uint8 `fidl:"900" fidl2:"900"`
+	Out  []uint8
 }
 
-var _msocketControlIoctlResponse = _bindings.CreateLazyMarshaler(socketControlIoctlResponse{})
+var _mcontrolIoctlPosixResponse = _bindings.CreateLazyMarshaler(controlIoctlPosixResponse{})
 
-func (msg *socketControlIoctlResponse) Marshaler() _bindings.Marshaler {
-	return _msocketControlIoctlResponse
+func (msg *controlIoctlPosixResponse) Marshaler() _bindings.Marshaler {
+	return _mcontrolIoctlPosixResponse
 }
 
-type SocketControlInterface _bindings.SocketControlProxy
+type ControlInterface _bindings.ChannelProxy
+
+// Create another connection to the same remote object.
+//
+// `flags` may be any of:
+// - OPEN_RIGHT_*
+// - OPEN_FLAG_APPEND
+// - OPEN_FLAG_NO_REMOTE
+// - OPEN_FLAG_DESCRIBE
+// - CLONE_FLAG_SAME_RIGHTS
+//
+// All other flags are ignored.
+//
+// The OPEN_RIGHT_* bits in `flags` request corresponding rights over the resulting
+// cloned object.
+// The cloned object must have rights less than or equal to the original object.
+// Alternatively, pass CLONE_FLAG_SAME_RIGHTS to inherit the rights on the source connection.
+// It is invalid to pass any of the OPEN_RIGHT_* flags together with CLONE_FLAG_SAME_RIGHTS.
+func (p *ControlInterface) Clone(flags uint32, object fuchsiaio.NodeInterfaceRequest) error {
+	req_ := &controlCloneRequest{
+		Flags:  flags,
+		Object: object,
+	}
+	err := ((*_bindings.ChannelProxy)(p)).Send(ControlCloneOrdinal, req_)
+	return err
+}
+
+// Terminates connection with object.
+//
+// This method does not require any rights.
+func (p *ControlInterface) Close() (int32, error) {
+	var req_ _bindings.Message
+	resp_ := &controlCloseResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlCloseOrdinal, req_, resp_)
+	return resp_.S, err
+}
+
+// Returns extra information about the type of the object.
+// If the `Describe` operation fails, the connection is closed.
+//
+// This method does not require any rights.
+func (p *ControlInterface) Describe() (fuchsiaio.NodeInfo, error) {
+	var req_ _bindings.Message
+	resp_ := &controlDescribeResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlDescribeOrdinal, req_, resp_)
+	return resp_.Info, err
+}
+
+// An event produced eagerly by a FIDL server if requested by `OPEN_FLAG_DESCRIBE`.
+//
+// Indicates the success or failure of the open operation, and optionally describes the
+// object. If the status is `ZX_OK`, `info` contains descriptive information about the object
+// (the same as would be returned by `Describe`).
+func (p *ControlInterface) ExpectOnOpen() (int32, *fuchsiaio.NodeInfo, error) {
+	resp_ := &controlOnOpenResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Recv(ControlOnOpenOrdinal, resp_)
+	return resp_.S, resp_.Info, err
+}
+
+// Synchronizes updates to the node to the underlying media, if it exists.
+//
+// This method does not require any rights.
+func (p *ControlInterface) Sync() (int32, error) {
+	var req_ _bindings.Message
+	resp_ := &controlSyncResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlSyncOrdinal, req_, resp_)
+	return resp_.S, err
+}
+
+// Acquires information about the node.
+//
+// This method does not require any rights.
+func (p *ControlInterface) GetAttr() (int32, fuchsiaio.NodeAttributes, error) {
+	var req_ _bindings.Message
+	resp_ := &controlGetAttrResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlGetAttrOrdinal, req_, resp_)
+	return resp_.S, resp_.Attributes, err
+}
+
+// Updates information about the node.
+// `flags` may be any of NODE_ATTRIBUTE_FLAG_*.
+//
+// This method requires following rights: OPEN_RIGHT_WRITABLE.
+func (p *ControlInterface) SetAttr(flags uint32, attributes fuchsiaio.NodeAttributes) (int32, error) {
+	req_ := &controlSetAttrRequest{
+		Flags:      flags,
+		Attributes: attributes,
+	}
+	resp_ := &controlSetAttrResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlSetAttrOrdinal, req_, resp_)
+	return resp_.S, err
+}
+
+// Deprecated. Only for use with compatibility with devhost.
+func (p *ControlInterface) Ioctl(opcode uint32, maxOut uint64, handles []_zx.Handle, in []uint8) (int32, []_zx.Handle, []uint8, error) {
+	req_ := &controlIoctlRequest{
+		Opcode:  opcode,
+		MaxOut:  maxOut,
+		Handles: handles,
+		In:      in,
+	}
+	resp_ := &controlIoctlResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlIoctlOrdinal, req_, resp_)
+	return resp_.S, resp_.Handles, resp_.Out, err
+}
 
 // Sets the local address used for the socket.
-func (p *SocketControlInterface) Bind(addr []uint8) (int16, error) {
-	req_ := &socketControlBindRequest{
+func (p *ControlInterface) Bind(addr []uint8) (int16, error) {
+	req_ := &controlBindRequest{
 		Addr: addr,
 	}
-	resp_ := &socketControlBindResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlBindOrdinal, req_, resp_)
+	resp_ := &controlBindResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlBindOrdinal, req_, resp_)
 	return resp_.Code, err
 }
 
 // Initiates a connection to a network endpoint.
-func (p *SocketControlInterface) Connect(addr []uint8) (int16, error) {
-	req_ := &socketControlConnectRequest{
+func (p *ControlInterface) Connect(addr []uint8) (int16, error) {
+	req_ := &controlConnectRequest{
 		Addr: addr,
 	}
-	resp_ := &socketControlConnectResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlConnectOrdinal, req_, resp_)
+	resp_ := &controlConnectResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlConnectOrdinal, req_, resp_)
 	return resp_.Code, err
 }
 
 // Begin listening for new connections from network endpoints. At most `backlog` connections
 // will be buffered.
-func (p *SocketControlInterface) Listen(backlog int16) (int16, error) {
-	req_ := &socketControlListenRequest{
+func (p *ControlInterface) Listen(backlog int16) (int16, error) {
+	req_ := &controlListenRequest{
 		Backlog: backlog,
 	}
-	resp_ := &socketControlListenResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlListenOrdinal, req_, resp_)
+	resp_ := &controlListenResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlListenOrdinal, req_, resp_)
 	return resp_.Code, err
 }
 
 // Accepts an incoming connection from a network endpoint.
-func (p *SocketControlInterface) Accept(flags int16) (int16, error) {
-	req_ := &socketControlAcceptRequest{
+func (p *ControlInterface) Accept(flags int16) (int16, ControlInterface, error) {
+	req_ := &controlAcceptRequest{
 		Flags: flags,
 	}
-	resp_ := &socketControlAcceptResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlAcceptOrdinal, req_, resp_)
-	return resp_.Code, err
-}
-
-// Closes the socket.
-func (p *SocketControlInterface) Close() (int16, error) {
-	var req_ _bindings.Message
-	resp_ := &socketControlCloseResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlCloseOrdinal, req_, resp_)
-	return resp_.Code, err
+	resp_ := &controlAcceptResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlAcceptOrdinal, req_, resp_)
+	return resp_.Code, resp_.S, err
 }
 
 // Retrieves the local socket address.
-func (p *SocketControlInterface) GetSockName() (int16, []uint8, error) {
+func (p *ControlInterface) GetSockName() (int16, []uint8, error) {
 	var req_ _bindings.Message
-	resp_ := &socketControlGetSockNameResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlGetSockNameOrdinal, req_, resp_)
+	resp_ := &controlGetSockNameResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlGetSockNameOrdinal, req_, resp_)
 	return resp_.Code, resp_.Addr, err
 }
 
 // Retrieves the remote socket address.
-func (p *SocketControlInterface) GetPeerName() (int16, []uint8, error) {
+func (p *ControlInterface) GetPeerName() (int16, []uint8, error) {
 	var req_ _bindings.Message
-	resp_ := &socketControlGetPeerNameResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlGetPeerNameOrdinal, req_, resp_)
+	resp_ := &controlGetPeerNameResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlGetPeerNameOrdinal, req_, resp_)
 	return resp_.Code, resp_.Addr, err
 }
 
 // Sets a socket option. TODO(NET-1699): link to description of supported socket options.
-func (p *SocketControlInterface) SetSockOpt(level int16, optname int16, optval []uint8) (int16, error) {
-	req_ := &socketControlSetSockOptRequest{
+func (p *ControlInterface) SetSockOpt(level int16, optname int16, optval []uint8) (int16, error) {
+	req_ := &controlSetSockOptRequest{
 		Level:   level,
 		Optname: optname,
 		Optval:  optval,
 	}
-	resp_ := &socketControlSetSockOptResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlSetSockOptOrdinal, req_, resp_)
+	resp_ := &controlSetSockOptResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlSetSockOptOrdinal, req_, resp_)
 	return resp_.Code, err
 }
 
-// Retrieves the current value of a socket option. TODO(NET-1699): link to description of
-// supported socket options.
-func (p *SocketControlInterface) GetSockOpt(level int16, optname int16) (int16, []uint8, error) {
-	req_ := &socketControlGetSockOptRequest{
+// Retrieves the current value of a socket option.
+func (p *ControlInterface) GetSockOpt(level int16, optname int16) (int16, []uint8, error) {
+	req_ := &controlGetSockOptRequest{
 		Level:   level,
 		Optname: optname,
 	}
-	resp_ := &socketControlGetSockOptResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlGetSockOptOrdinal, req_, resp_)
+	resp_ := &controlGetSockOptResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlGetSockOptOrdinal, req_, resp_)
 	return resp_.Code, resp_.Optval, err
 }
 
 // Runs operations (e.g., get the receive timestamp of the last packet) on the socket.
-func (p *SocketControlInterface) Ioctl(req int16, in []uint8) (int16, []uint8, error) {
-	req_ := &socketControlIoctlRequest{
+func (p *ControlInterface) IoctlPosix(req int16, in []uint8) (int16, []uint8, error) {
+	req_ := &controlIoctlPosixRequest{
 		Req: req,
 		In:  in,
 	}
-	resp_ := &socketControlIoctlResponse{}
-	err := ((*_bindings.SocketControlProxy)(p)).Call(SocketControlIoctlOrdinal, req_, resp_)
+	resp_ := &controlIoctlPosixResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ControlIoctlPosixOrdinal, req_, resp_)
 	return resp_.Code, resp_.Out, err
 }
 
 // The control plane for a network socket. Once a socket has been retrieved from a
-// `SocketProvider`, this interface is then used to further configure and use the socket.
+// `Provider`, this interface is then used to further configure and use the socket.
 // This interface is essentially POSIX. Its implementation must support Linux-specific arguments
 // to {Get,Set}SockOpt.
-type SocketControl interface {
+type Control interface {
+	// Create another connection to the same remote object.
+	//
+	// `flags` may be any of:
+	// - OPEN_RIGHT_*
+	// - OPEN_FLAG_APPEND
+	// - OPEN_FLAG_NO_REMOTE
+	// - OPEN_FLAG_DESCRIBE
+	// - CLONE_FLAG_SAME_RIGHTS
+	//
+	// All other flags are ignored.
+	//
+	// The OPEN_RIGHT_* bits in `flags` request corresponding rights over the resulting
+	// cloned object.
+	// The cloned object must have rights less than or equal to the original object.
+	// Alternatively, pass CLONE_FLAG_SAME_RIGHTS to inherit the rights on the source connection.
+	// It is invalid to pass any of the OPEN_RIGHT_* flags together with CLONE_FLAG_SAME_RIGHTS.
+	Clone(flags uint32, object fuchsiaio.NodeInterfaceRequest) error
+	// Terminates connection with object.
+	//
+	// This method does not require any rights.
+	Close() (int32, error)
+	// Returns extra information about the type of the object.
+	// If the `Describe` operation fails, the connection is closed.
+	//
+	// This method does not require any rights.
+	Describe() (fuchsiaio.NodeInfo, error)
+	// An event produced eagerly by a FIDL server if requested by `OPEN_FLAG_DESCRIBE`.
+	//
+	// Indicates the success or failure of the open operation, and optionally describes the
+	// object. If the status is `ZX_OK`, `info` contains descriptive information about the object
+	// (the same as would be returned by `Describe`).
+	// Synchronizes updates to the node to the underlying media, if it exists.
+	//
+	// This method does not require any rights.
+	Sync() (int32, error)
+	// Acquires information about the node.
+	//
+	// This method does not require any rights.
+	GetAttr() (int32, fuchsiaio.NodeAttributes, error)
+	// Updates information about the node.
+	// `flags` may be any of NODE_ATTRIBUTE_FLAG_*.
+	//
+	// This method requires following rights: OPEN_RIGHT_WRITABLE.
+	SetAttr(flags uint32, attributes fuchsiaio.NodeAttributes) (int32, error)
+	// Deprecated. Only for use with compatibility with devhost.
+	Ioctl(opcode uint32, maxOut uint64, handles []_zx.Handle, in []uint8) (int32, []_zx.Handle, []uint8, error)
 	// Sets the local address used for the socket.
 	Bind(addr []uint8) (int16, error)
 	// Initiates a connection to a network endpoint.
@@ -1065,109 +613,157 @@
 	// will be buffered.
 	Listen(backlog int16) (int16, error)
 	// Accepts an incoming connection from a network endpoint.
-	Accept(flags int16) (int16, error)
-	// Closes the socket.
-	Close() (int16, error)
+	Accept(flags int16) (int16, ControlInterface, error)
 	// Retrieves the local socket address.
 	GetSockName() (int16, []uint8, error)
 	// Retrieves the remote socket address.
 	GetPeerName() (int16, []uint8, error)
 	// Sets a socket option. TODO(NET-1699): link to description of supported socket options.
 	SetSockOpt(level int16, optname int16, optval []uint8) (int16, error)
-	// Retrieves the current value of a socket option. TODO(NET-1699): link to description of
-	// supported socket options.
+	// Retrieves the current value of a socket option.
 	GetSockOpt(level int16, optname int16) (int16, []uint8, error)
 	// Runs operations (e.g., get the receive timestamp of the last packet) on the socket.
-	Ioctl(req int16, in []uint8) (int16, []uint8, error)
+	IoctlPosix(req int16, in []uint8) (int16, []uint8, error)
 }
 
-type SocketControlTransitionalBase struct{}
+type ControlTransitionalBase struct{}
 
-type SocketControlStub struct {
-	Impl SocketControl
+type ControlInterfaceRequest _bindings.InterfaceRequest
+
+func NewControlInterfaceRequest() (ControlInterfaceRequest, *ControlInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return ControlInterfaceRequest(req), (*ControlInterface)(cli), err
 }
 
-func (s_ *SocketControlStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+type ControlStub struct {
+	Impl Control
+}
+
+func (s_ *ControlStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
 	switch ordinal_ {
-	case SocketControlBindOrdinal:
-		in_ := socketControlBindRequest{}
+	case ControlCloneOrdinal:
+		in_ := controlCloneRequest{}
+		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
+			return nil, err_
+		}
+		err_ := s_.Impl.Clone(in_.Flags, in_.Object)
+		return nil, err_
+	case ControlCloseOrdinal:
+		s, err_ := s_.Impl.Close()
+		out_ := controlCloseResponse{}
+		out_.S = s
+		return &out_, err_
+	case ControlDescribeOrdinal:
+		info, err_ := s_.Impl.Describe()
+		out_ := controlDescribeResponse{}
+		out_.Info = info
+		return &out_, err_
+	case ControlSyncOrdinal:
+		s, err_ := s_.Impl.Sync()
+		out_ := controlSyncResponse{}
+		out_.S = s
+		return &out_, err_
+	case ControlGetAttrOrdinal:
+		s, attributes, err_ := s_.Impl.GetAttr()
+		out_ := controlGetAttrResponse{}
+		out_.S = s
+		out_.Attributes = attributes
+		return &out_, err_
+	case ControlSetAttrOrdinal:
+		in_ := controlSetAttrRequest{}
+		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
+			return nil, err_
+		}
+		s, err_ := s_.Impl.SetAttr(in_.Flags, in_.Attributes)
+		out_ := controlSetAttrResponse{}
+		out_.S = s
+		return &out_, err_
+	case ControlIoctlOrdinal:
+		in_ := controlIoctlRequest{}
+		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
+			return nil, err_
+		}
+		s, handles, out, err_ := s_.Impl.Ioctl(in_.Opcode, in_.MaxOut, in_.Handles, in_.In)
+		out_ := controlIoctlResponse{}
+		out_.S = s
+		out_.Handles = handles
+		out_.Out = out
+		return &out_, err_
+	case ControlBindOrdinal:
+		in_ := controlBindRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
 		code, err_ := s_.Impl.Bind(in_.Addr)
-		out_ := socketControlBindResponse{}
+		out_ := controlBindResponse{}
 		out_.Code = code
 		return &out_, err_
-	case SocketControlConnectOrdinal:
-		in_ := socketControlConnectRequest{}
+	case ControlConnectOrdinal:
+		in_ := controlConnectRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
 		code, err_ := s_.Impl.Connect(in_.Addr)
-		out_ := socketControlConnectResponse{}
+		out_ := controlConnectResponse{}
 		out_.Code = code
 		return &out_, err_
-	case SocketControlListenOrdinal:
-		in_ := socketControlListenRequest{}
+	case ControlListenOrdinal:
+		in_ := controlListenRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
 		code, err_ := s_.Impl.Listen(in_.Backlog)
-		out_ := socketControlListenResponse{}
+		out_ := controlListenResponse{}
 		out_.Code = code
 		return &out_, err_
-	case SocketControlAcceptOrdinal:
-		in_ := socketControlAcceptRequest{}
+	case ControlAcceptOrdinal:
+		in_ := controlAcceptRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
-		code, err_ := s_.Impl.Accept(in_.Flags)
-		out_ := socketControlAcceptResponse{}
+		code, s, err_ := s_.Impl.Accept(in_.Flags)
+		out_ := controlAcceptResponse{}
 		out_.Code = code
+		out_.S = s
 		return &out_, err_
-	case SocketControlCloseOrdinal:
-		code, err_ := s_.Impl.Close()
-		out_ := socketControlCloseResponse{}
-		out_.Code = code
-		return &out_, err_
-	case SocketControlGetSockNameOrdinal:
+	case ControlGetSockNameOrdinal:
 		code, addr, err_ := s_.Impl.GetSockName()
-		out_ := socketControlGetSockNameResponse{}
+		out_ := controlGetSockNameResponse{}
 		out_.Code = code
 		out_.Addr = addr
 		return &out_, err_
-	case SocketControlGetPeerNameOrdinal:
+	case ControlGetPeerNameOrdinal:
 		code, addr, err_ := s_.Impl.GetPeerName()
-		out_ := socketControlGetPeerNameResponse{}
+		out_ := controlGetPeerNameResponse{}
 		out_.Code = code
 		out_.Addr = addr
 		return &out_, err_
-	case SocketControlSetSockOptOrdinal:
-		in_ := socketControlSetSockOptRequest{}
+	case ControlSetSockOptOrdinal:
+		in_ := controlSetSockOptRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
 		code, err_ := s_.Impl.SetSockOpt(in_.Level, in_.Optname, in_.Optval)
-		out_ := socketControlSetSockOptResponse{}
+		out_ := controlSetSockOptResponse{}
 		out_.Code = code
 		return &out_, err_
-	case SocketControlGetSockOptOrdinal:
-		in_ := socketControlGetSockOptRequest{}
+	case ControlGetSockOptOrdinal:
+		in_ := controlGetSockOptRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
 		code, optval, err_ := s_.Impl.GetSockOpt(in_.Level, in_.Optname)
-		out_ := socketControlGetSockOptResponse{}
+		out_ := controlGetSockOptResponse{}
 		out_.Code = code
 		out_.Optval = optval
 		return &out_, err_
-	case SocketControlIoctlOrdinal:
-		in_ := socketControlIoctlRequest{}
+	case ControlIoctlPosixOrdinal:
+		in_ := controlIoctlPosixRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
 			return nil, err_
 		}
-		code, out, err_ := s_.Impl.Ioctl(in_.Req, in_.In)
-		out_ := socketControlIoctlResponse{}
+		code, out, err_ := s_.Impl.IoctlPosix(in_.Req, in_.In)
+		out_ := controlIoctlPosixResponse{}
 		out_.Code = code
 		out_.Out = out
 		return &out_, err_
@@ -1175,4 +771,131 @@
 	return nil, _bindings.ErrUnknownOrdinal
 }
 
-type SocketControlEventProxy _bindings.SocketControlProxy
+type ControlService struct {
+	_bindings.BindingSet
+}
+
+func (s *ControlService) Add(impl Control, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&ControlStub{Impl: impl}, c, onError)
+}
+
+func (s *ControlService) EventProxyFor(key _bindings.BindingKey) (*ControlEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*ControlEventProxy)(pxy), err
+}
+
+type ControlEventProxy _bindings.ChannelProxy
+
+func (p *ControlEventProxy) OnOpen(s int32, info *fuchsiaio.NodeInfo) error {
+	event_ := &controlOnOpenResponse{
+		S:    s,
+		Info: info,
+	}
+	return ((*_bindings.ChannelProxy)(p)).Send(ControlOnOpenOrdinal, event_)
+}
+
+const (
+	ProviderSocketOrdinal    uint64 = 1292318594 << 32
+	ProviderSocketGenOrdinal uint64 = 1292318594 << 32
+)
+
+type providerSocketRequest struct {
+	_        struct{} `fidl2:"s,8,0"`
+	Domain   int16
+	Type     int16
+	Protocol int16
+}
+
+var _mproviderSocketRequest = _bindings.CreateLazyMarshaler(providerSocketRequest{})
+
+func (msg *providerSocketRequest) Marshaler() _bindings.Marshaler {
+	return _mproviderSocketRequest
+}
+
+type providerSocketResponse struct {
+	_    struct{} `fidl2:"s,8,0"`
+	Code int16
+	S    ControlInterface `fidl:"*"`
+}
+
+var _mproviderSocketResponse = _bindings.CreateLazyMarshaler(providerSocketResponse{})
+
+func (msg *providerSocketResponse) Marshaler() _bindings.Marshaler {
+	return _mproviderSocketResponse
+}
+
+type ProviderInterface _bindings.ChannelProxy
+
+// Requests a socket with the specified parameters. Values for `code` are defined in
+// errno.h.
+func (p *ProviderInterface) Socket(domain int16, type_ int16, protocol int16) (int16, ControlInterface, error) {
+	req_ := &providerSocketRequest{
+		Domain:   domain,
+		Type:     type_,
+		Protocol: protocol,
+	}
+	resp_ := &providerSocketResponse{}
+	err := ((*_bindings.ChannelProxy)(p)).Call(ProviderSocketOrdinal, req_, resp_)
+	return resp_.Code, resp_.S, err
+}
+
+// Provider implements the POSIX sockets API.
+type Provider interface {
+	// Requests a socket with the specified parameters. Values for `code` are defined in
+	// errno.h.
+	Socket(domain int16, type_ int16, protocol int16) (int16, ControlInterface, error)
+}
+
+type ProviderTransitionalBase struct{}
+
+type ProviderInterfaceRequest _bindings.InterfaceRequest
+
+func NewProviderInterfaceRequest() (ProviderInterfaceRequest, *ProviderInterface, error) {
+	req, cli, err := _bindings.NewInterfaceRequest()
+	return ProviderInterfaceRequest(req), (*ProviderInterface)(cli), err
+}
+
+// Implements ServiceRequest.
+func (_ ProviderInterfaceRequest) Name() string {
+	return "fuchsia.posix.socket.Provider"
+}
+func (c ProviderInterfaceRequest) ToChannel() _zx.Channel {
+	return c.Channel
+}
+
+const ProviderName = "fuchsia.posix.socket.Provider"
+
+type ProviderStub struct {
+	Impl Provider
+}
+
+func (s_ *ProviderStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+	switch ordinal_ {
+	case ProviderSocketOrdinal:
+		in_ := providerSocketRequest{}
+		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
+			return nil, err_
+		}
+		code, s, err_ := s_.Impl.Socket(in_.Domain, in_.Type, in_.Protocol)
+		out_ := providerSocketResponse{}
+		out_.Code = code
+		out_.S = s
+		return &out_, err_
+	}
+	return nil, _bindings.ErrUnknownOrdinal
+}
+
+type ProviderService struct {
+	_bindings.BindingSet
+}
+
+func (s *ProviderService) Add(impl Provider, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
+	return s.BindingSet.Add(&ProviderStub{Impl: impl}, c, onError)
+}
+
+func (s *ProviderService) EventProxyFor(key _bindings.BindingKey) (*ProviderEventProxy, bool) {
+	pxy, err := s.BindingSet.ProxyFor(key)
+	return (*ProviderEventProxy)(pxy), err
+}
+
+type ProviderEventProxy _bindings.ChannelProxy
diff --git a/src/syscall/zx/types.go b/src/syscall/zx/types.go
index 2ced54e..c365761 100644
--- a/src/syscall/zx/types.go
+++ b/src/syscall/zx/types.go
@@ -62,6 +62,15 @@
 	Props       uint32
 } // zx_info_handle_basic_t
 
+type InfoSocket struct {
+	Options        uint32
+	RXBufMax       int
+	RXBufSize      int
+	RXBufAvailable int
+	TXBufMax       int
+	TXBufSize      int
+} // zx_info_socket_t
+
 type RrecSelf struct {
 	Type        uint16 // ZX_RREC_SELF
 	Subtype     uint16
@@ -377,6 +386,21 @@
 	ObjectInfoResourceChildren
 	ObjectInfoResourceRecords
 	ObjectInfoVMAR
+	ObjectInfoJobChildren
+	ObjectInfoJobProcesses
+	ObjectInfoThread
+	ObjectInfoThreadExceptionReport
+	ObjectInfoTaskStats
+	ObjectInfoProcessMaps
+	ObjectInfoProcessVMOs
+	ObjectInfoThreadStats
+	ObjectInfoCpUStats
+	ObjectInfoKMemStats
+	ObjectInfoResource
+	ObjectInfoHandleCount
+	ObjectInfoBTI
+	ObjectInfoProcessHandleStats
+	ObjectInfoSocket
 )
 
 const (
diff --git a/src/syscall/zx/zxsocket/socket.go b/src/syscall/zx/zxsocket/socket.go
index 2c1b8b7..c02f29b 100644
--- a/src/syscall/zx/zxsocket/socket.go
+++ b/src/syscall/zx/zxsocket/socket.go
@@ -8,6 +8,7 @@
 
 import (
 	"io"
+	"strconv"
 	"syscall"
 	"syscall/zx"
 	"syscall/zx/fdio"
@@ -15,31 +16,50 @@
 	"syscall/zx/mxnet"
 	"syscall/zx/net"
 	"syscall/zx/zxwait"
+	"unsafe"
 )
 
 // Socket is an fdio.FDIO socket.
 type Socket struct {
-	net.SocketControlInterface
+	net.ControlInterface
+	socket zx.Socket
 
 	dgram bool
 	flags uint32
 }
 
-func NewSocket(s zx.Socket) *Socket {
-	return &Socket{
-		SocketControlInterface: net.SocketControlInterface{
-			Socket: s,
-		},
+func NewSocket(control net.ControlInterface) (*Socket, error) {
+	info, err := control.Describe()
+	if err != nil {
+		return nil, err
+	}
+	switch w := info.Which(); w {
+	case fidlIo.NodeInfoService, fidlIo.NodeInfoFile, fidlIo.NodeInfoDirectory, fidlIo.NodeInfoPipe, fidlIo.NodeInfoVmofile, fidlIo.NodeInfoDevice, fidlIo.NodeInfoTty:
+		return nil, &zx.Error{Status: zx.ErrInternal, Text: "zxsocket.NewSocket"}
+	case fidlIo.NodeInfoSocket:
+		socket := info.Socket.Socket
+
+		var info zx.InfoSocket
+		if err := socket.Handle().GetInfo(zx.ObjectInfoSocket, unsafe.Pointer(&info), uint(unsafe.Sizeof(info))); err != nil {
+			return nil, err
+		}
+		return &Socket{
+			ControlInterface: control,
+			socket:          socket,
+			dgram:           info.Options&zx.SocketDatagram != 0,
+		}, nil
+	default:
+		panic("unknown node info tag " + strconv.FormatInt(int64(w), 10))
 	}
 }
 
 func (s *Socket) Wait(signals zx.Signals, timeout zx.Time) (zx.Signals, error) {
-	return zxwait.Wait(zx.Handle(s.Socket), signals, timeout)
+	return zxwait.Wait(*s.socket.Handle(), signals, timeout)
 }
 
 // Handles returns the underlying handles for this Socket.
 func (s *Socket) Handles() []zx.Handle {
-	return []zx.Handle{zx.Handle(s.Socket)}
+	return []zx.Handle{*s.ControlInterface.Handle(), *s.socket.Handle()}
 }
 
 // Clone makes a clone of the object.
@@ -49,13 +69,13 @@
 
 // Close closes the object.
 func (s *Socket) Close() error {
-	if code, err := s.SocketControlInterface.Close(); err != nil {
+	if code, err := s.ControlInterface.Close(); err != nil {
 		return err
 	} else if code != 0 {
 		return syscall.Errno(code)
 	}
 
-	return s.Socket.Close()
+	return s.socket.Close()
 }
 
 // Sync implements fdio.FDIO for Socket.
@@ -75,7 +95,7 @@
 
 // Ioctl implements fdio.FDIO for Socket.
 func (s *Socket) Ioctl(op uint32, max uint64, in []byte, _ []zx.Handle) ([]byte, []zx.Handle, error) {
-	code, out, err := s.SocketControlInterface.Ioctl(int16(op), in)
+	code, out, err := s.IoctlPosix(int16(op), in)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -94,7 +114,7 @@
 	}
 	// c.f. zxs_recvmsg_stream in zircon/system/ulib/zxs/zxs.cpp
 	for {
-		n, err := s.Socket.Read(data, 0)
+		n, err := s.socket.Read(data, 0)
 		if err != nil {
 			if err, ok := err.(*zx.Error); ok {
 				switch err.Status {
@@ -140,7 +160,7 @@
 	// c.f. zxsio_sendmsg_stream
 	var total int
 	for {
-		n, err := s.Socket.Write(data, 0)
+		n, err := s.socket.Write(data, 0)
 		total += n
 		if err != nil {
 			if err, ok := err.(*zx.Error); ok {
@@ -229,7 +249,7 @@
 
 func (s *Socket) recvMsg(data []byte) (int, error) {
 	for {
-		n, err := s.Socket.Read(data, 0)
+		n, err := s.socket.Read(data, 0)
 		if err != nil {
 			if err, ok := err.(*zx.Error); ok {
 				switch err.Status {
@@ -265,7 +285,7 @@
 	copy(data[mxnet.SockmsgHdrLen:], b)
 
 	for {
-		n, err := s.Socket.Write(data, 0)
+		n, err := s.socket.Write(data, 0)
 		if err != nil {
 			if err, ok := err.(*zx.Error); ok {
 				switch err.Status {
@@ -295,9 +315,3 @@
 		return len(b), nil
 	}
 }
-
-// SetDgram marks a *Socket as a datagram (UDP) socket.
-// A different protocol is used internally.
-func (s *Socket) SetDgram() {
-	s.dgram = true
-}