mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 23:14:31 +08:00
cf60af03ca
sendmsg() (or sendto()) with MSG_FASTOPEN is a combo of connect(2) and write(2). The application should replace connect() with it to send data in the opening SYN packet. For blocking socket, sendmsg() blocks until all the data are buffered locally and the handshake is completed like connect() call. It returns similar errno like connect() if the TCP handshake fails. For non-blocking socket, it returns the number of bytes queued (and transmitted in the SYN-data packet) if cookie is available. If cookie is not available, it transmits a data-less SYN packet with Fast Open cookie request option and returns -EINPROGRESS like connect(). Using MSG_FASTOPEN on connecting or connected socket will result in simlar errno like repeating connect() calls. Therefore the application should only use this flag on new sockets. The buffer size of sendmsg() is independent of the MSS of the connection. Signed-off-by: Yuchung Cheng <ycheng@google.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
47 lines
1.7 KiB
C
47 lines
1.7 KiB
C
#ifndef _INET_COMMON_H
|
|
#define _INET_COMMON_H
|
|
|
|
extern const struct proto_ops inet_stream_ops;
|
|
extern const struct proto_ops inet_dgram_ops;
|
|
|
|
/*
|
|
* INET4 prototypes used by INET6
|
|
*/
|
|
|
|
struct msghdr;
|
|
struct sock;
|
|
struct sockaddr;
|
|
struct socket;
|
|
|
|
extern int inet_release(struct socket *sock);
|
|
extern int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
int addr_len, int flags);
|
|
extern int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
int addr_len, int flags);
|
|
extern int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
int addr_len, int flags);
|
|
extern int inet_accept(struct socket *sock, struct socket *newsock, int flags);
|
|
extern int inet_sendmsg(struct kiocb *iocb, struct socket *sock,
|
|
struct msghdr *msg, size_t size);
|
|
extern ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
|
|
size_t size, int flags);
|
|
extern int inet_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
struct msghdr *msg, size_t size, int flags);
|
|
extern int inet_shutdown(struct socket *sock, int how);
|
|
extern int inet_listen(struct socket *sock, int backlog);
|
|
extern void inet_sock_destruct(struct sock *sk);
|
|
extern int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
|
|
extern int inet_getname(struct socket *sock, struct sockaddr *uaddr,
|
|
int *uaddr_len, int peer);
|
|
extern int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
|
extern int inet_ctl_sock_create(struct sock **sk, unsigned short family,
|
|
unsigned short type, unsigned char protocol,
|
|
struct net *net);
|
|
|
|
static inline void inet_ctl_sock_destroy(struct sock *sk)
|
|
{
|
|
sk_release_kernel(sk);
|
|
}
|
|
|
|
#endif
|