162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _RDS_TCP_H 362306a36Sopenharmony_ci#define _RDS_TCP_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#define RDS_TCP_PORT 16385 662306a36Sopenharmony_ci 762306a36Sopenharmony_cistruct rds_tcp_incoming { 862306a36Sopenharmony_ci struct rds_incoming ti_inc; 962306a36Sopenharmony_ci struct sk_buff_head ti_skb_list; 1062306a36Sopenharmony_ci}; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct rds_tcp_connection { 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci struct list_head t_tcp_node; 1562306a36Sopenharmony_ci bool t_tcp_node_detached; 1662306a36Sopenharmony_ci struct rds_conn_path *t_cpath; 1762306a36Sopenharmony_ci /* t_conn_path_lock synchronizes the connection establishment between 1862306a36Sopenharmony_ci * rds_tcp_accept_one and rds_tcp_conn_path_connect 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ci struct mutex t_conn_path_lock; 2162306a36Sopenharmony_ci struct socket *t_sock; 2262306a36Sopenharmony_ci void *t_orig_write_space; 2362306a36Sopenharmony_ci void *t_orig_data_ready; 2462306a36Sopenharmony_ci void *t_orig_state_change; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci struct rds_tcp_incoming *t_tinc; 2762306a36Sopenharmony_ci size_t t_tinc_hdr_rem; 2862306a36Sopenharmony_ci size_t t_tinc_data_rem; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci /* XXX error report? */ 3162306a36Sopenharmony_ci struct work_struct t_conn_w; 3262306a36Sopenharmony_ci struct work_struct t_send_w; 3362306a36Sopenharmony_ci struct work_struct t_down_w; 3462306a36Sopenharmony_ci struct work_struct t_recv_w; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci /* for info exporting only */ 3762306a36Sopenharmony_ci struct list_head t_list_item; 3862306a36Sopenharmony_ci u32 t_last_sent_nxt; 3962306a36Sopenharmony_ci u32 t_last_expected_una; 4062306a36Sopenharmony_ci u32 t_last_seen_una; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct rds_tcp_statistics { 4462306a36Sopenharmony_ci uint64_t s_tcp_data_ready_calls; 4562306a36Sopenharmony_ci uint64_t s_tcp_write_space_calls; 4662306a36Sopenharmony_ci uint64_t s_tcp_sndbuf_full; 4762306a36Sopenharmony_ci uint64_t s_tcp_connect_raced; 4862306a36Sopenharmony_ci uint64_t s_tcp_listen_closed_stale; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* tcp.c */ 5262306a36Sopenharmony_cibool rds_tcp_tune(struct socket *sock); 5362306a36Sopenharmony_civoid rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp); 5462306a36Sopenharmony_civoid rds_tcp_reset_callbacks(struct socket *sock, struct rds_conn_path *cp); 5562306a36Sopenharmony_civoid rds_tcp_restore_callbacks(struct socket *sock, 5662306a36Sopenharmony_ci struct rds_tcp_connection *tc); 5762306a36Sopenharmony_ciu32 rds_tcp_write_seq(struct rds_tcp_connection *tc); 5862306a36Sopenharmony_ciu32 rds_tcp_snd_una(struct rds_tcp_connection *tc); 5962306a36Sopenharmony_ciextern struct rds_transport rds_tcp_transport; 6062306a36Sopenharmony_civoid rds_tcp_accept_work(struct sock *sk); 6162306a36Sopenharmony_ciint rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr, 6262306a36Sopenharmony_ci __u32 scope_id); 6362306a36Sopenharmony_ci/* tcp_connect.c */ 6462306a36Sopenharmony_ciint rds_tcp_conn_path_connect(struct rds_conn_path *cp); 6562306a36Sopenharmony_civoid rds_tcp_conn_path_shutdown(struct rds_conn_path *conn); 6662306a36Sopenharmony_civoid rds_tcp_state_change(struct sock *sk); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* tcp_listen.c */ 6962306a36Sopenharmony_cistruct socket *rds_tcp_listen_init(struct net *net, bool isv6); 7062306a36Sopenharmony_civoid rds_tcp_listen_stop(struct socket *sock, struct work_struct *acceptor); 7162306a36Sopenharmony_civoid rds_tcp_listen_data_ready(struct sock *sk); 7262306a36Sopenharmony_ciint rds_tcp_accept_one(struct socket *sock); 7362306a36Sopenharmony_civoid rds_tcp_keepalive(struct socket *sock); 7462306a36Sopenharmony_civoid *rds_tcp_listen_sock_def_readable(struct net *net); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* tcp_recv.c */ 7762306a36Sopenharmony_ciint rds_tcp_recv_init(void); 7862306a36Sopenharmony_civoid rds_tcp_recv_exit(void); 7962306a36Sopenharmony_civoid rds_tcp_data_ready(struct sock *sk); 8062306a36Sopenharmony_ciint rds_tcp_recv_path(struct rds_conn_path *cp); 8162306a36Sopenharmony_civoid rds_tcp_inc_free(struct rds_incoming *inc); 8262306a36Sopenharmony_ciint rds_tcp_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* tcp_send.c */ 8562306a36Sopenharmony_civoid rds_tcp_xmit_path_prepare(struct rds_conn_path *cp); 8662306a36Sopenharmony_civoid rds_tcp_xmit_path_complete(struct rds_conn_path *cp); 8762306a36Sopenharmony_ciint rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, 8862306a36Sopenharmony_ci unsigned int hdr_off, unsigned int sg, unsigned int off); 8962306a36Sopenharmony_civoid rds_tcp_write_space(struct sock *sk); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* tcp_stats.c */ 9262306a36Sopenharmony_ciDECLARE_PER_CPU(struct rds_tcp_statistics, rds_tcp_stats); 9362306a36Sopenharmony_ci#define rds_tcp_stats_inc(member) rds_stats_inc_which(rds_tcp_stats, member) 9462306a36Sopenharmony_ciunsigned int rds_tcp_stats_info_copy(struct rds_info_iterator *iter, 9562306a36Sopenharmony_ci unsigned int avail); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#endif 98