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