+ sa_endpoints_t endpoints;
+ endpoints.sae_srcif = 0;
+ endpoints.sae_srcaddr = nullptr;
+ endpoints.sae_srcaddrlen = 0;
+ endpoints.sae_dstaddr = (struct sockaddr*)msg->msg_name;
+ endpoints.sae_dstaddrlen = msg->msg_namelen;
+ int ret = connectx(
+ sockfd,
+ &endpoints,
+ SAE_ASSOCID_ANY,
+ CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,
+ nullptr,
+ 0,
+ nullptr,
+ nullptr);
+
+ if (ret != 0) {
+ return ret;
+ }
+ ret = sendmsg(sockfd, msg, flags);
+ return ret;
+}
+
+int tfo_enable(int sockfd, size_t max_queue_size) {
+ return setsockopt(
+ sockfd,
+ IPPROTO_TCP,
+ TCP_FASTOPEN,
+ &max_queue_size,
+ sizeof(max_queue_size));
+}
+
+bool tfo_succeeded(int sockfd) {
+ errno = EOPNOTSUPP;
+ return false;
+}
+
+#else
+
+ssize_t
+tfo_sendmsg(int /* sockfd */, const struct msghdr* /* msg */, int /* flags */) {