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