mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-05 08:37:31 -04:00
unix: add Connectx for darwin
connectx(2) can be used to initiate a connection with TCP Fast Open. Change-Id: I113ee4dede7df1c01e16a0c07fec2b384b266cb0 GitHub-Last-Rev: 31665b9ad3b7ce01ac881d4df9d94957d37da67b GitHub-Pull-Request: golang/sys#215 Reviewed-on: https://go-review.googlesource.com/c/sys/+/606155 Auto-Submit: Ian Lance Taylor <iant@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
committed by
Gopher Robot
parent
a0c72efe2d
commit
59665e5b43
@@ -22,6 +22,7 @@ var darwinTests = [...]darwinTest{
|
|||||||
{"close", libc_close_trampoline_addr},
|
{"close", libc_close_trampoline_addr},
|
||||||
{"closedir", libc_closedir_trampoline_addr},
|
{"closedir", libc_closedir_trampoline_addr},
|
||||||
{"connect", libc_connect_trampoline_addr},
|
{"connect", libc_connect_trampoline_addr},
|
||||||
|
{"connectx", libc_connectx_trampoline_addr},
|
||||||
{"dup", libc_dup_trampoline_addr},
|
{"dup", libc_dup_trampoline_addr},
|
||||||
{"dup2", libc_dup2_trampoline_addr},
|
{"dup2", libc_dup2_trampoline_addr},
|
||||||
{"exchangedata", libc_exchangedata_trampoline_addr},
|
{"exchangedata", libc_exchangedata_trampoline_addr},
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ var darwinTests = [...]darwinTest{
|
|||||||
{"close", libc_close_trampoline_addr},
|
{"close", libc_close_trampoline_addr},
|
||||||
{"closedir", libc_closedir_trampoline_addr},
|
{"closedir", libc_closedir_trampoline_addr},
|
||||||
{"connect", libc_connect_trampoline_addr},
|
{"connect", libc_connect_trampoline_addr},
|
||||||
|
{"connectx", libc_connectx_trampoline_addr},
|
||||||
{"dup", libc_dup_trampoline_addr},
|
{"dup", libc_dup_trampoline_addr},
|
||||||
{"dup2", libc_dup2_trampoline_addr},
|
{"dup2", libc_dup2_trampoline_addr},
|
||||||
{"exchangedata", libc_exchangedata_trampoline_addr},
|
{"exchangedata", libc_exchangedata_trampoline_addr},
|
||||||
|
|||||||
@@ -552,6 +552,7 @@ ccflags="$@"
|
|||||||
$2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ &&
|
$2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ &&
|
||||||
$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ ||
|
$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ ||
|
||||||
$2 ~ /^SOCK_|SK_DIAG_|SKNLGRP_$/ ||
|
$2 ~ /^SOCK_|SK_DIAG_|SKNLGRP_$/ ||
|
||||||
|
$2 ~ /^(CONNECT|SAE)_/ ||
|
||||||
$2 ~ /^FIORDCHK$/ ||
|
$2 ~ /^FIORDCHK$/ ||
|
||||||
$2 ~ /^SIOC/ ||
|
$2 ~ /^SIOC/ ||
|
||||||
$2 ~ /^TIOC/ ||
|
$2 ~ /^TIOC/ ||
|
||||||
|
|||||||
@@ -566,6 +566,43 @@ func PthreadFchdir(fd int) (err error) {
|
|||||||
return pthread_fchdir_np(fd)
|
return pthread_fchdir_np(fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Connectx calls connectx(2) to initiate a connection on a socket.
|
||||||
|
//
|
||||||
|
// srcIf, srcAddr, and dstAddr are filled into a [SaEndpoints] struct and passed as the endpoints argument.
|
||||||
|
//
|
||||||
|
// - srcIf is the optional source interface index. 0 means unspecified.
|
||||||
|
// - srcAddr is the optional source address. nil means unspecified.
|
||||||
|
// - dstAddr is the destination address.
|
||||||
|
//
|
||||||
|
// On success, Connectx returns the number of bytes enqueued for transmission.
|
||||||
|
func Connectx(fd int, srcIf uint32, srcAddr, dstAddr Sockaddr, associd SaeAssocID, flags uint32, iov []Iovec, connid *SaeConnID) (n uintptr, err error) {
|
||||||
|
endpoints := SaEndpoints{
|
||||||
|
Srcif: srcIf,
|
||||||
|
}
|
||||||
|
|
||||||
|
if srcAddr != nil {
|
||||||
|
addrp, addrlen, err := srcAddr.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
endpoints.Srcaddr = (*RawSockaddr)(addrp)
|
||||||
|
endpoints.Srcaddrlen = uint32(addrlen)
|
||||||
|
}
|
||||||
|
|
||||||
|
if dstAddr != nil {
|
||||||
|
addrp, addrlen, err := dstAddr.sockaddr()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
endpoints.Dstaddr = (*RawSockaddr)(addrp)
|
||||||
|
endpoints.Dstaddrlen = uint32(addrlen)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = connectx(fd, &endpoints, associd, flags, iov, &n, connid)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//sys connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error)
|
||||||
//sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
|
//sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
|
||||||
|
|
||||||
//sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
|
//sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
|
||||||
|
|||||||
@@ -177,6 +177,12 @@ type XVSockPgen C.struct_xvsockpgen
|
|||||||
|
|
||||||
type _Socklen C.socklen_t
|
type _Socklen C.socklen_t
|
||||||
|
|
||||||
|
type SaeAssocID C.sae_associd_t
|
||||||
|
|
||||||
|
type SaeConnID C.sae_connid_t
|
||||||
|
|
||||||
|
type SaEndpoints C.struct_sa_endpoints
|
||||||
|
|
||||||
type Xucred C.struct_xucred
|
type Xucred C.struct_xucred
|
||||||
|
|
||||||
type Linger C.struct_linger
|
type Linger C.struct_linger
|
||||||
|
|||||||
@@ -237,6 +237,9 @@ const (
|
|||||||
CLOCK_UPTIME_RAW_APPROX = 0x9
|
CLOCK_UPTIME_RAW_APPROX = 0x9
|
||||||
CLONE_NOFOLLOW = 0x1
|
CLONE_NOFOLLOW = 0x1
|
||||||
CLONE_NOOWNERCOPY = 0x2
|
CLONE_NOOWNERCOPY = 0x2
|
||||||
|
CONNECT_DATA_AUTHENTICATED = 0x4
|
||||||
|
CONNECT_DATA_IDEMPOTENT = 0x2
|
||||||
|
CONNECT_RESUME_ON_READ_WRITE = 0x1
|
||||||
CR0 = 0x0
|
CR0 = 0x0
|
||||||
CR1 = 0x1000
|
CR1 = 0x1000
|
||||||
CR2 = 0x2000
|
CR2 = 0x2000
|
||||||
@@ -1265,6 +1268,10 @@ const (
|
|||||||
RTV_SSTHRESH = 0x20
|
RTV_SSTHRESH = 0x20
|
||||||
RUSAGE_CHILDREN = -0x1
|
RUSAGE_CHILDREN = -0x1
|
||||||
RUSAGE_SELF = 0x0
|
RUSAGE_SELF = 0x0
|
||||||
|
SAE_ASSOCID_ALL = 0xffffffff
|
||||||
|
SAE_ASSOCID_ANY = 0x0
|
||||||
|
SAE_CONNID_ALL = 0xffffffff
|
||||||
|
SAE_CONNID_ANY = 0x0
|
||||||
SCM_CREDS = 0x3
|
SCM_CREDS = 0x3
|
||||||
SCM_RIGHTS = 0x1
|
SCM_RIGHTS = 0x1
|
||||||
SCM_TIMESTAMP = 0x2
|
SCM_TIMESTAMP = 0x2
|
||||||
|
|||||||
@@ -237,6 +237,9 @@ const (
|
|||||||
CLOCK_UPTIME_RAW_APPROX = 0x9
|
CLOCK_UPTIME_RAW_APPROX = 0x9
|
||||||
CLONE_NOFOLLOW = 0x1
|
CLONE_NOFOLLOW = 0x1
|
||||||
CLONE_NOOWNERCOPY = 0x2
|
CLONE_NOOWNERCOPY = 0x2
|
||||||
|
CONNECT_DATA_AUTHENTICATED = 0x4
|
||||||
|
CONNECT_DATA_IDEMPOTENT = 0x2
|
||||||
|
CONNECT_RESUME_ON_READ_WRITE = 0x1
|
||||||
CR0 = 0x0
|
CR0 = 0x0
|
||||||
CR1 = 0x1000
|
CR1 = 0x1000
|
||||||
CR2 = 0x2000
|
CR2 = 0x2000
|
||||||
@@ -1265,6 +1268,10 @@ const (
|
|||||||
RTV_SSTHRESH = 0x20
|
RTV_SSTHRESH = 0x20
|
||||||
RUSAGE_CHILDREN = -0x1
|
RUSAGE_CHILDREN = -0x1
|
||||||
RUSAGE_SELF = 0x0
|
RUSAGE_SELF = 0x0
|
||||||
|
SAE_ASSOCID_ALL = 0xffffffff
|
||||||
|
SAE_ASSOCID_ANY = 0x0
|
||||||
|
SAE_CONNID_ALL = 0xffffffff
|
||||||
|
SAE_CONNID_ANY = 0x0
|
||||||
SCM_CREDS = 0x3
|
SCM_CREDS = 0x3
|
||||||
SCM_RIGHTS = 0x1
|
SCM_RIGHTS = 0x1
|
||||||
SCM_TIMESTAMP = 0x2
|
SCM_TIMESTAMP = 0x2
|
||||||
|
|||||||
@@ -841,6 +841,26 @@ var libc_pthread_fchdir_np_trampoline_addr uintptr
|
|||||||
|
|
||||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error) {
|
||||||
|
var _p0 unsafe.Pointer
|
||||||
|
if len(iov) > 0 {
|
||||||
|
_p0 = unsafe.Pointer(&iov[0])
|
||||||
|
} else {
|
||||||
|
_p0 = unsafe.Pointer(&_zero)
|
||||||
|
}
|
||||||
|
_, _, e1 := syscall_syscall9(libc_connectx_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(endpoints)), uintptr(associd), uintptr(flags), uintptr(_p0), uintptr(len(iov)), uintptr(unsafe.Pointer(n)), uintptr(unsafe.Pointer(connid)), 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var libc_connectx_trampoline_addr uintptr
|
||||||
|
|
||||||
|
//go:cgo_import_dynamic libc_connectx connectx "/usr/lib/libSystem.B.dylib"
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) {
|
func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) {
|
||||||
_, _, e1 := syscall_syscall6(libc_sendfile_trampoline_addr, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags))
|
_, _, e1 := syscall_syscall6(libc_sendfile_trampoline_addr, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags))
|
||||||
if e1 != 0 {
|
if e1 != 0 {
|
||||||
|
|||||||
@@ -248,6 +248,11 @@ TEXT libc_pthread_fchdir_np_trampoline<>(SB),NOSPLIT,$0-0
|
|||||||
GLOBL ·libc_pthread_fchdir_np_trampoline_addr(SB), RODATA, $8
|
GLOBL ·libc_pthread_fchdir_np_trampoline_addr(SB), RODATA, $8
|
||||||
DATA ·libc_pthread_fchdir_np_trampoline_addr(SB)/8, $libc_pthread_fchdir_np_trampoline<>(SB)
|
DATA ·libc_pthread_fchdir_np_trampoline_addr(SB)/8, $libc_pthread_fchdir_np_trampoline<>(SB)
|
||||||
|
|
||||||
|
TEXT libc_connectx_trampoline<>(SB),NOSPLIT,$0-0
|
||||||
|
JMP libc_connectx(SB)
|
||||||
|
GLOBL ·libc_connectx_trampoline_addr(SB), RODATA, $8
|
||||||
|
DATA ·libc_connectx_trampoline_addr(SB)/8, $libc_connectx_trampoline<>(SB)
|
||||||
|
|
||||||
TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0
|
TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0
|
||||||
JMP libc_sendfile(SB)
|
JMP libc_sendfile(SB)
|
||||||
GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8
|
GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8
|
||||||
|
|||||||
@@ -841,6 +841,26 @@ var libc_pthread_fchdir_np_trampoline_addr uintptr
|
|||||||
|
|
||||||
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error) {
|
||||||
|
var _p0 unsafe.Pointer
|
||||||
|
if len(iov) > 0 {
|
||||||
|
_p0 = unsafe.Pointer(&iov[0])
|
||||||
|
} else {
|
||||||
|
_p0 = unsafe.Pointer(&_zero)
|
||||||
|
}
|
||||||
|
_, _, e1 := syscall_syscall9(libc_connectx_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(endpoints)), uintptr(associd), uintptr(flags), uintptr(_p0), uintptr(len(iov)), uintptr(unsafe.Pointer(n)), uintptr(unsafe.Pointer(connid)), 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var libc_connectx_trampoline_addr uintptr
|
||||||
|
|
||||||
|
//go:cgo_import_dynamic libc_connectx connectx "/usr/lib/libSystem.B.dylib"
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) {
|
func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) {
|
||||||
_, _, e1 := syscall_syscall6(libc_sendfile_trampoline_addr, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags))
|
_, _, e1 := syscall_syscall6(libc_sendfile_trampoline_addr, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags))
|
||||||
if e1 != 0 {
|
if e1 != 0 {
|
||||||
|
|||||||
@@ -248,6 +248,11 @@ TEXT libc_pthread_fchdir_np_trampoline<>(SB),NOSPLIT,$0-0
|
|||||||
GLOBL ·libc_pthread_fchdir_np_trampoline_addr(SB), RODATA, $8
|
GLOBL ·libc_pthread_fchdir_np_trampoline_addr(SB), RODATA, $8
|
||||||
DATA ·libc_pthread_fchdir_np_trampoline_addr(SB)/8, $libc_pthread_fchdir_np_trampoline<>(SB)
|
DATA ·libc_pthread_fchdir_np_trampoline_addr(SB)/8, $libc_pthread_fchdir_np_trampoline<>(SB)
|
||||||
|
|
||||||
|
TEXT libc_connectx_trampoline<>(SB),NOSPLIT,$0-0
|
||||||
|
JMP libc_connectx(SB)
|
||||||
|
GLOBL ·libc_connectx_trampoline_addr(SB), RODATA, $8
|
||||||
|
DATA ·libc_connectx_trampoline_addr(SB)/8, $libc_connectx_trampoline<>(SB)
|
||||||
|
|
||||||
TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0
|
TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0
|
||||||
JMP libc_sendfile(SB)
|
JMP libc_sendfile(SB)
|
||||||
GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8
|
GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8
|
||||||
|
|||||||
@@ -306,6 +306,19 @@ type XVSockPgen struct {
|
|||||||
|
|
||||||
type _Socklen uint32
|
type _Socklen uint32
|
||||||
|
|
||||||
|
type SaeAssocID uint32
|
||||||
|
|
||||||
|
type SaeConnID uint32
|
||||||
|
|
||||||
|
type SaEndpoints struct {
|
||||||
|
Srcif uint32
|
||||||
|
Srcaddr *RawSockaddr
|
||||||
|
Srcaddrlen uint32
|
||||||
|
Dstaddr *RawSockaddr
|
||||||
|
Dstaddrlen uint32
|
||||||
|
_ [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
type Xucred struct {
|
type Xucred struct {
|
||||||
Version uint32
|
Version uint32
|
||||||
Uid uint32
|
Uid uint32
|
||||||
|
|||||||
@@ -306,6 +306,19 @@ type XVSockPgen struct {
|
|||||||
|
|
||||||
type _Socklen uint32
|
type _Socklen uint32
|
||||||
|
|
||||||
|
type SaeAssocID uint32
|
||||||
|
|
||||||
|
type SaeConnID uint32
|
||||||
|
|
||||||
|
type SaEndpoints struct {
|
||||||
|
Srcif uint32
|
||||||
|
Srcaddr *RawSockaddr
|
||||||
|
Srcaddrlen uint32
|
||||||
|
Dstaddr *RawSockaddr
|
||||||
|
Dstaddrlen uint32
|
||||||
|
_ [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
type Xucred struct {
|
type Xucred struct {
|
||||||
Version uint32
|
Version uint32
|
||||||
Uid uint32
|
Uid uint32
|
||||||
|
|||||||
Reference in New Issue
Block a user