Skip to content

Add TCP FastOpen support for macOS #1632

Closed
@zonyitoo

Description

@zonyitoo

The connectx system call

This function is commonly used for inititiating a TCP Fast Open connection.

Available since iOS 9 and OS X 10.11

// Original definition in /usr/include/sys

__API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0))
int connectx(int, const sa_endpoints_t *, sae_associd_t, unsigned int,
    const struct iovec *, unsigned int, size_t *, sae_connid_t *);

__API_AVAILABLE(macosx(10.11), ios(9.0), tvos(9.0), watchos(2.0))
int disconnectx(int, sae_associd_t, sae_connid_t);

Definition:

int connectx(int socket,
             const sa_endpoints_t *endpoints,
             sae_associd_t associd /* Reserved, always be SAE_ASSOCID_ANY */,
             unsigned int flags,
             const struct iovec *iov,
             unsigned int iovcnt,
             size_t *len,
             sae_connid_t *connid /* Reserved, always be NULL */);

Example usage:

struct sockaddr_in sa;
memcpy(&sa, /* TARGET ADDR */, sizeof(struct sockaddr_in));
sa.sin_len = sizeof(struct sockaddr_in);
sa_endpoints_t endpoints;
memset((char *)&endpoints, 0, sizeof(endpoints));
endpoints.sae_dstaddr    = (struct sockaddr *)&sa;
endpoints.sae_dstaddrlen = /* TARGET ADDR LEN */;

s = connectx(sockfd,
             &endpoints,
             SAE_ASSOCID_ANY,
             CONNECT_DATA_IDEMPOTENT | CONNECT_RESUME_ON_READ_WRITE,
             NULL,
             0,
             NULL,
             NULL);

Variable definitions

  • SAE_ASSOCID_ANY

    // Defined in /usr/include/sys/socket.h (MacOSX.sdk)
    #define SAE_ASSOCID_ANY 0
  • CONNECT_DATA_IDEMPOTENT and CONNECT_RESUME_ON_READ_WRITE

    // Defined in /usr/include/sys/socket.h (MacOSX.sdk)
    #define CONNECT_RESUME_ON_READ_WRITE    0x1 /* resume connect() on read/write */
    #define CONNECT_DATA_IDEMPOTENT         0x2 /* data is idempotent */

sa_endpoints_t

// Defined in /usr/include/sys/socket.h (MacOSX.sdk)

/* sockaddr endpoints */
typedef struct sa_endpoints {
	unsigned int            sae_srcif;      /* optional source interface */
	const struct sockaddr   *sae_srcaddr;   /* optional source address */
	socklen_t               sae_srcaddrlen; /* size of source address */
	const struct sockaddr   *sae_dstaddr;   /* destination address */
	socklen_t               sae_dstaddrlen; /* size of destination address */
} sa_endpoints_t;

sae_associd_t

// Defined in /usr/include/sys/socket.h (MacOSX.sdk)

typedef __uint32_t sae_associd_t;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions