162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * linux/include/linux/sunrpc/svcsock.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * RPC server socket I/O.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef SUNRPC_SVCSOCK_H
1162306a36Sopenharmony_ci#define SUNRPC_SVCSOCK_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/sunrpc/svc.h>
1462306a36Sopenharmony_ci#include <linux/sunrpc/svc_xprt.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/*
1762306a36Sopenharmony_ci * RPC server socket.
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_cistruct svc_sock {
2062306a36Sopenharmony_ci	struct svc_xprt		sk_xprt;
2162306a36Sopenharmony_ci	struct socket *		sk_sock;	/* berkeley socket layer */
2262306a36Sopenharmony_ci	struct sock *		sk_sk;		/* INET layer */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	/* We keep the old state_change and data_ready CB's here */
2562306a36Sopenharmony_ci	void			(*sk_ostate)(struct sock *);
2662306a36Sopenharmony_ci	void			(*sk_odata)(struct sock *);
2762306a36Sopenharmony_ci	void			(*sk_owspace)(struct sock *);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	/* private TCP part */
3062306a36Sopenharmony_ci	/* On-the-wire fragment header: */
3162306a36Sopenharmony_ci	__be32			sk_marker;
3262306a36Sopenharmony_ci	/* As we receive a record, this includes the length received so
3362306a36Sopenharmony_ci	 * far (including the fragment header): */
3462306a36Sopenharmony_ci	u32			sk_tcplen;
3562306a36Sopenharmony_ci	/* Total length of the data (not including fragment headers)
3662306a36Sopenharmony_ci	 * received so far in the fragments making up this rpc: */
3762306a36Sopenharmony_ci	u32			sk_datalen;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	struct page_frag_cache  sk_frag_cache;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	struct completion	sk_handshake_done;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	struct page *		sk_pages[RPCSVC_MAXPAGES];	/* received data */
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline u32 svc_sock_reclen(struct svc_sock *svsk)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	return be32_to_cpu(svsk->sk_marker) & RPC_FRAGMENT_SIZE_MASK;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic inline u32 svc_sock_final_rec(struct svc_sock *svsk)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return be32_to_cpu(svsk->sk_marker) & RPC_LAST_STREAM_FRAGMENT;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/*
5762306a36Sopenharmony_ci * Function prototypes.
5862306a36Sopenharmony_ci */
5962306a36Sopenharmony_civoid		svc_recv(struct svc_rqst *rqstp);
6062306a36Sopenharmony_civoid		svc_send(struct svc_rqst *rqstp);
6162306a36Sopenharmony_civoid		svc_drop(struct svc_rqst *);
6262306a36Sopenharmony_civoid		svc_sock_update_bufs(struct svc_serv *serv);
6362306a36Sopenharmony_ciint		svc_addsock(struct svc_serv *serv, struct net *net,
6462306a36Sopenharmony_ci			    const int fd, char *name_return, const size_t len,
6562306a36Sopenharmony_ci			    const struct cred *cred);
6662306a36Sopenharmony_civoid		svc_init_xprt_sock(void);
6762306a36Sopenharmony_civoid		svc_cleanup_xprt_sock(void);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/*
7062306a36Sopenharmony_ci * svc_makesock socket characteristics
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_ci#define SVC_SOCK_DEFAULTS	(0U)
7362306a36Sopenharmony_ci#define SVC_SOCK_ANONYMOUS	(1U << 0)	/* don't register with pmap */
7462306a36Sopenharmony_ci#define SVC_SOCK_TEMPORARY	(1U << 1)	/* flag socket as temporary */
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#endif /* SUNRPC_SVCSOCK_H */
77