1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 270041088SAndy Grover #ifndef _RDS_TCP_H 370041088SAndy Grover #define _RDS_TCP_H 470041088SAndy Grover 570041088SAndy Grover #define RDS_TCP_PORT 16385 670041088SAndy Grover 770041088SAndy Grover struct rds_tcp_incoming { 870041088SAndy Grover struct rds_incoming ti_inc; 970041088SAndy Grover struct sk_buff_head ti_skb_list; 1070041088SAndy Grover }; 1170041088SAndy Grover 1270041088SAndy Grover struct rds_tcp_connection { 1370041088SAndy Grover 1470041088SAndy Grover struct list_head t_tcp_node; 15f10b4cffSSowmini Varadhan bool t_tcp_node_detached; 1602105b2cSSowmini Varadhan struct rds_conn_path *t_cpath; 1702105b2cSSowmini Varadhan /* t_conn_path_lock synchronizes the connection establishment between 18b04e8554SSowmini Varadhan * rds_tcp_accept_one and rds_tcp_conn_path_connect 19bd7c5f98SSowmini Varadhan */ 2002105b2cSSowmini Varadhan struct mutex t_conn_path_lock; 2170041088SAndy Grover struct socket *t_sock; 2270041088SAndy Grover void *t_orig_write_space; 2370041088SAndy Grover void *t_orig_data_ready; 2470041088SAndy Grover void *t_orig_state_change; 2570041088SAndy Grover 2670041088SAndy Grover struct rds_tcp_incoming *t_tinc; 2770041088SAndy Grover size_t t_tinc_hdr_rem; 2870041088SAndy Grover size_t t_tinc_data_rem; 2970041088SAndy Grover 3070041088SAndy Grover /* XXX error report? */ 3170041088SAndy Grover struct work_struct t_conn_w; 3270041088SAndy Grover struct work_struct t_send_w; 3370041088SAndy Grover struct work_struct t_down_w; 3470041088SAndy Grover struct work_struct t_recv_w; 3570041088SAndy Grover 3670041088SAndy Grover /* for info exporting only */ 3770041088SAndy Grover struct list_head t_list_item; 3870041088SAndy Grover u32 t_last_sent_nxt; 3970041088SAndy Grover u32 t_last_expected_una; 4070041088SAndy Grover u32 t_last_seen_una; 4170041088SAndy Grover }; 4270041088SAndy Grover 4370041088SAndy Grover struct rds_tcp_statistics { 4470041088SAndy Grover uint64_t s_tcp_data_ready_calls; 4570041088SAndy Grover uint64_t s_tcp_write_space_calls; 4670041088SAndy Grover uint64_t s_tcp_sndbuf_full; 4770041088SAndy Grover uint64_t s_tcp_connect_raced; 4870041088SAndy Grover uint64_t s_tcp_listen_closed_stale; 4970041088SAndy Grover }; 5070041088SAndy Grover 5170041088SAndy Grover /* tcp.c */ 52*6997fbd7STetsuo Handa bool rds_tcp_tune(struct socket *sock); 53ea3b1ea5SSowmini Varadhan void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp); 54ea3b1ea5SSowmini Varadhan void rds_tcp_reset_callbacks(struct socket *sock, struct rds_conn_path *cp); 5570041088SAndy Grover void rds_tcp_restore_callbacks(struct socket *sock, 5670041088SAndy Grover struct rds_tcp_connection *tc); 57b589513eSSowmini Varadhan u32 rds_tcp_write_seq(struct rds_tcp_connection *tc); 5870041088SAndy Grover u32 rds_tcp_snd_una(struct rds_tcp_connection *tc); 5970041088SAndy Grover extern struct rds_transport rds_tcp_transport; 60467fa153SSowmini Varadhan void rds_tcp_accept_work(struct sock *sk); 61aced3ce5SRao Shoaib int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr, 62aced3ce5SRao Shoaib __u32 scope_id); 6370041088SAndy Grover /* tcp_connect.c */ 64b04e8554SSowmini Varadhan int rds_tcp_conn_path_connect(struct rds_conn_path *cp); 65226f7a7dSSowmini Varadhan void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn); 6670041088SAndy Grover void rds_tcp_state_change(struct sock *sk); 6770041088SAndy Grover 6870041088SAndy Grover /* tcp_listen.c */ 691e2b44e7SKa-Cheong Poon struct socket *rds_tcp_listen_init(struct net *net, bool isv6); 70b21dd450SSowmini Varadhan void rds_tcp_listen_stop(struct socket *sock, struct work_struct *acceptor); 71676d2369SDavid S. Miller void rds_tcp_listen_data_ready(struct sock *sk); 72467fa153SSowmini Varadhan int rds_tcp_accept_one(struct socket *sock); 73480aeb96SChristoph Hellwig void rds_tcp_keepalive(struct socket *sock); 74a93d01f5SSowmini Varadhan void *rds_tcp_listen_sock_def_readable(struct net *net); 7570041088SAndy Grover 7670041088SAndy Grover /* tcp_recv.c */ 77ef87b7eaSZach Brown int rds_tcp_recv_init(void); 7870041088SAndy Grover void rds_tcp_recv_exit(void); 79676d2369SDavid S. Miller void rds_tcp_data_ready(struct sock *sk); 802da43c4aSSowmini Varadhan int rds_tcp_recv_path(struct rds_conn_path *cp); 8170041088SAndy Grover void rds_tcp_inc_free(struct rds_incoming *inc); 82c310e72cSAl Viro int rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to); 8370041088SAndy Grover 8470041088SAndy Grover /* tcp_send.c */ 85226f7a7dSSowmini Varadhan void rds_tcp_xmit_path_prepare(struct rds_conn_path *cp); 86226f7a7dSSowmini Varadhan void rds_tcp_xmit_path_complete(struct rds_conn_path *cp); 8770041088SAndy Grover int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, 8870041088SAndy Grover unsigned int hdr_off, unsigned int sg, unsigned int off); 8970041088SAndy Grover void rds_tcp_write_space(struct sock *sk); 9070041088SAndy Grover 9170041088SAndy Grover /* tcp_stats.c */ 9270041088SAndy Grover DECLARE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats); 9370041088SAndy Grover #define rds_tcp_stats_inc(member) rds_stats_inc_which(rds_tcp_stats, member) 9470041088SAndy Grover unsigned int rds_tcp_stats_info_copy(struct rds_info_iterator *iter, 9570041088SAndy Grover unsigned int avail); 9670041088SAndy Grover 9770041088SAndy Grover #endif 98