Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/rpc/replay.h
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2008 Isilon Inc http://www.isilon.com/
5
* Authors: Doug Rabson <[email protected]>
6
* Developed with Red Inc: Alfred Perlstein <[email protected]>
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
*
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*/
29
30
#ifndef _RPC_REPLAY_H
31
#define _RPC_REPLAY_H
32
33
enum replay_state {
34
RS_NEW, /* new request - caller should execute */
35
RS_DONE, /* request was executed and reply sent */
36
RS_INPROGRESS, /* request is being executed now */
37
RS_ERROR /* allocation or other failure */
38
};
39
40
struct replay_cache;
41
42
/*
43
* Create a new replay cache.
44
*/
45
struct replay_cache *replay_newcache(size_t);
46
47
/*
48
* Set the replay cache size.
49
*/
50
void replay_setsize(struct replay_cache *, size_t);
51
52
/*
53
* Free a replay cache. Caller must ensure that no cache entries are
54
* in-progress.
55
*/
56
void replay_freecache(struct replay_cache *rc);
57
58
/*
59
* Check a replay cache for a message from a given address.
60
*
61
* If this is a new request, RS_NEW is returned. Caller should call
62
* replay_setreply with the results of the request.
63
*
64
* If this is a request which is currently executing
65
* (i.e. replay_setreply hasn't been called for it yet), RS_INPROGRESS
66
* is returned. The caller should silently drop the request.
67
*
68
* If a reply to this message already exists, *repmsg and *mp are set
69
* to point at the reply and, RS_DONE is returned. The caller should
70
* re-send this reply.
71
*
72
* If the attempt to update the replay cache or copy a replay failed
73
* for some reason (typically memory shortage), RS_ERROR is returned.
74
*/
75
enum replay_state replay_find(struct replay_cache *rc,
76
struct rpc_msg *msg, struct sockaddr *addr,
77
struct rpc_msg *repmsg, struct mbuf **mp);
78
79
/*
80
* Call this after executing a request to record the reply.
81
*/
82
void replay_setreply(struct replay_cache *rc,
83
struct rpc_msg *repmsg, struct sockaddr *addr, struct mbuf *m);
84
85
#endif /* !_RPC_REPLAY_H */
86
87