Skip to content

Add TCP FastOpen support for macOS #1632

@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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions