xref: /linux/Documentation/sunrpc/xdr/nlm4.x (revision 36d179fd6bea35698d53444b7bd3025fa3788266)
1*5bc37b75SChuck Lever /*
2*5bc37b75SChuck Lever  * This file was extracted by hand from
3*5bc37b75SChuck Lever  * https://www.rfc-editor.org/rfc/rfc1813.html .
4*5bc37b75SChuck Lever  *
5*5bc37b75SChuck Lever  * Note that RFC 1813 is Informational. Its official date of
6*5bc37b75SChuck Lever  * publication (June 1995) is before the IETF required its RFCs to
7*5bc37b75SChuck Lever  * carry an explicit copyright or other IP ownership notices.
8*5bc37b75SChuck Lever  *
9*5bc37b75SChuck Lever  * Note also that RFC 1813 does not specify the whole NLM4 protocol.
10*5bc37b75SChuck Lever  * In particular, the argument and result types are not present in
11*5bc37b75SChuck Lever  * that document, and had to be reverse-engineered.
12*5bc37b75SChuck Lever  */
13*5bc37b75SChuck Lever 
14*5bc37b75SChuck Lever /*
15*5bc37b75SChuck Lever  * The NLMv4 protocol
16*5bc37b75SChuck Lever  */
17*5bc37b75SChuck Lever 
18*5bc37b75SChuck Lever pragma header nlm4;
19*5bc37b75SChuck Lever 
20*5bc37b75SChuck Lever /*
21*5bc37b75SChuck Lever  * The following definitions are missing in RFC 1813,
22*5bc37b75SChuck Lever  * but can be found in the OpenNetworking Network Lock
23*5bc37b75SChuck Lever  * Manager protocol:
24*5bc37b75SChuck Lever  *
25*5bc37b75SChuck Lever  * https://pubs.opengroup.org/onlinepubs/9629799/chap10.htm
26*5bc37b75SChuck Lever  */
27*5bc37b75SChuck Lever 
28*5bc37b75SChuck Lever const LM_MAXSTRLEN = 1024;
29*5bc37b75SChuck Lever 
30*5bc37b75SChuck Lever const LM_MAXNAMELEN = 1025;
31*5bc37b75SChuck Lever 
32*5bc37b75SChuck Lever const MAXNETOBJ_SZ = 1024;
33*5bc37b75SChuck Lever 
34*5bc37b75SChuck Lever typedef opaque netobj<MAXNETOBJ_SZ>;
35*5bc37b75SChuck Lever 
36*5bc37b75SChuck Lever enum fsh4_mode {
37*5bc37b75SChuck Lever 	fsm_DN = 0,		/* deny none */
38*5bc37b75SChuck Lever 	fsm_DR = 1,		/* deny read */
39*5bc37b75SChuck Lever 	fsm_DW = 2,		/* deny write */
40*5bc37b75SChuck Lever 	fsm_DRW = 3		/* deny read/write */
41*5bc37b75SChuck Lever };
42*5bc37b75SChuck Lever 
43*5bc37b75SChuck Lever enum fsh4_access {
44*5bc37b75SChuck Lever 	fsa_NONE = 0,		/* for completeness */
45*5bc37b75SChuck Lever 	fsa_R = 1,		/* read-only */
46*5bc37b75SChuck Lever 	fsa_W = 2,		/* write-only */
47*5bc37b75SChuck Lever 	fsa_RW = 3		/* read/write */
48*5bc37b75SChuck Lever };
49*5bc37b75SChuck Lever 
50*5bc37b75SChuck Lever /*
51*5bc37b75SChuck Lever  * The following definitions come from the OpenNetworking
52*5bc37b75SChuck Lever  * Network Status Monitor protocol:
53*5bc37b75SChuck Lever  *
54*5bc37b75SChuck Lever  * https://pubs.opengroup.org/onlinepubs/9629799/chap11.htm
55*5bc37b75SChuck Lever  */
56*5bc37b75SChuck Lever 
57*5bc37b75SChuck Lever const SM_MAXSTRLEN = 1024;
58*5bc37b75SChuck Lever 
59*5bc37b75SChuck Lever /*
60*5bc37b75SChuck Lever  * The NLM protocol as extracted from:
61*5bc37b75SChuck Lever  * https://tools.ietf.org/html/rfc1813 Appendix II
62*5bc37b75SChuck Lever  */
63*5bc37b75SChuck Lever 
64*5bc37b75SChuck Lever typedef unsigned hyper uint64;
65*5bc37b75SChuck Lever 
66*5bc37b75SChuck Lever typedef hyper int64;
67*5bc37b75SChuck Lever 
68*5bc37b75SChuck Lever typedef unsigned long uint32;
69*5bc37b75SChuck Lever 
70*5bc37b75SChuck Lever typedef long int32;
71*5bc37b75SChuck Lever 
72*5bc37b75SChuck Lever enum nlm4_stats {
73*5bc37b75SChuck Lever 	NLM4_GRANTED = 0,
74*5bc37b75SChuck Lever 	NLM4_DENIED = 1,
75*5bc37b75SChuck Lever 	NLM4_DENIED_NOLOCKS = 2,
76*5bc37b75SChuck Lever 	NLM4_BLOCKED = 3,
77*5bc37b75SChuck Lever 	NLM4_DENIED_GRACE_PERIOD = 4,
78*5bc37b75SChuck Lever 	NLM4_DEADLCK = 5,
79*5bc37b75SChuck Lever 	NLM4_ROFS = 6,
80*5bc37b75SChuck Lever 	NLM4_STALE_FH = 7,
81*5bc37b75SChuck Lever 	NLM4_FBIG = 8,
82*5bc37b75SChuck Lever 	NLM4_FAILED = 9
83*5bc37b75SChuck Lever };
84*5bc37b75SChuck Lever 
85*5bc37b75SChuck Lever pragma big_endian nlm4_stats;
86*5bc37b75SChuck Lever 
87*5bc37b75SChuck Lever struct nlm4_holder {
88*5bc37b75SChuck Lever 	bool		exclusive;
89*5bc37b75SChuck Lever 	int32		svid;
90*5bc37b75SChuck Lever 	netobj		oh;
91*5bc37b75SChuck Lever 	uint64		l_offset;
92*5bc37b75SChuck Lever 	uint64		l_len;
93*5bc37b75SChuck Lever };
94*5bc37b75SChuck Lever 
95*5bc37b75SChuck Lever union nlm4_testrply switch (nlm4_stats stat) {
96*5bc37b75SChuck Lever 	case NLM4_DENIED:
97*5bc37b75SChuck Lever 		nlm4_holder	holder;
98*5bc37b75SChuck Lever 	default:
99*5bc37b75SChuck Lever 		void;
100*5bc37b75SChuck Lever };
101*5bc37b75SChuck Lever 
102*5bc37b75SChuck Lever struct nlm4_stat {
103*5bc37b75SChuck Lever 	nlm4_stats	stat;
104*5bc37b75SChuck Lever };
105*5bc37b75SChuck Lever 
106*5bc37b75SChuck Lever struct nlm4_res {
107*5bc37b75SChuck Lever 	netobj		cookie;
108*5bc37b75SChuck Lever 	nlm4_stat	stat;
109*5bc37b75SChuck Lever };
110*5bc37b75SChuck Lever 
111*5bc37b75SChuck Lever struct nlm4_testres {
112*5bc37b75SChuck Lever 	netobj		cookie;
113*5bc37b75SChuck Lever 	nlm4_testrply	stat;
114*5bc37b75SChuck Lever };
115*5bc37b75SChuck Lever 
116*5bc37b75SChuck Lever struct nlm4_lock {
117*5bc37b75SChuck Lever 	string		caller_name<LM_MAXSTRLEN>;
118*5bc37b75SChuck Lever 	netobj		fh;
119*5bc37b75SChuck Lever 	netobj		oh;
120*5bc37b75SChuck Lever 	int32		svid;
121*5bc37b75SChuck Lever 	uint64		l_offset;
122*5bc37b75SChuck Lever 	uint64		l_len;
123*5bc37b75SChuck Lever };
124*5bc37b75SChuck Lever 
125*5bc37b75SChuck Lever struct nlm4_lockargs {
126*5bc37b75SChuck Lever 	netobj		cookie;
127*5bc37b75SChuck Lever 	bool		block;
128*5bc37b75SChuck Lever 	bool		exclusive;
129*5bc37b75SChuck Lever 	nlm4_lock	alock;
130*5bc37b75SChuck Lever 	bool		reclaim;
131*5bc37b75SChuck Lever 	int32		state;
132*5bc37b75SChuck Lever };
133*5bc37b75SChuck Lever 
134*5bc37b75SChuck Lever struct nlm4_cancargs {
135*5bc37b75SChuck Lever 	netobj		cookie;
136*5bc37b75SChuck Lever 	bool		block;
137*5bc37b75SChuck Lever 	bool		exclusive;
138*5bc37b75SChuck Lever 	nlm4_lock	alock;
139*5bc37b75SChuck Lever };
140*5bc37b75SChuck Lever 
141*5bc37b75SChuck Lever struct nlm4_testargs {
142*5bc37b75SChuck Lever 	netobj		cookie;
143*5bc37b75SChuck Lever 	bool		exclusive;
144*5bc37b75SChuck Lever 	nlm4_lock	alock;
145*5bc37b75SChuck Lever };
146*5bc37b75SChuck Lever 
147*5bc37b75SChuck Lever struct nlm4_unlockargs {
148*5bc37b75SChuck Lever 	netobj		cookie;
149*5bc37b75SChuck Lever 	nlm4_lock	alock;
150*5bc37b75SChuck Lever };
151*5bc37b75SChuck Lever 
152*5bc37b75SChuck Lever struct nlm4_share {
153*5bc37b75SChuck Lever 	string		caller_name<LM_MAXSTRLEN>;
154*5bc37b75SChuck Lever 	netobj		fh;
155*5bc37b75SChuck Lever 	netobj		oh;
156*5bc37b75SChuck Lever 	fsh4_mode	mode;
157*5bc37b75SChuck Lever 	fsh4_access	access;
158*5bc37b75SChuck Lever };
159*5bc37b75SChuck Lever 
160*5bc37b75SChuck Lever struct nlm4_shareargs {
161*5bc37b75SChuck Lever 	netobj		cookie;
162*5bc37b75SChuck Lever 	nlm4_share	share;
163*5bc37b75SChuck Lever 	bool		reclaim;
164*5bc37b75SChuck Lever };
165*5bc37b75SChuck Lever 
166*5bc37b75SChuck Lever struct nlm4_shareres {
167*5bc37b75SChuck Lever 	netobj		cookie;
168*5bc37b75SChuck Lever 	nlm4_stats	stat;
169*5bc37b75SChuck Lever 	int32		sequence;
170*5bc37b75SChuck Lever };
171*5bc37b75SChuck Lever 
172*5bc37b75SChuck Lever struct nlm4_notify {
173*5bc37b75SChuck Lever 	string		name<LM_MAXNAMELEN>;
174*5bc37b75SChuck Lever 	int32		state;
175*5bc37b75SChuck Lever };
176*5bc37b75SChuck Lever 
177*5bc37b75SChuck Lever /*
178*5bc37b75SChuck Lever  * Argument for the Linux-private SM_NOTIFY procedure
179*5bc37b75SChuck Lever  */
180*5bc37b75SChuck Lever const SM_PRIV_SIZE = 16;
181*5bc37b75SChuck Lever 
182*5bc37b75SChuck Lever struct nlm4_notifyargs {
183*5bc37b75SChuck Lever 	nlm4_notify	notify;
184*5bc37b75SChuck Lever 	opaque		private[SM_PRIV_SIZE];
185*5bc37b75SChuck Lever };
186*5bc37b75SChuck Lever 
187*5bc37b75SChuck Lever program NLM4_PROG {
188*5bc37b75SChuck Lever 	version NLM4_VERS {
189*5bc37b75SChuck Lever 		void		NLMPROC4_NULL(void)			= 0;
190*5bc37b75SChuck Lever 		nlm4_testres	NLMPROC4_TEST(nlm4_testargs)		= 1;
191*5bc37b75SChuck Lever 		nlm4_res	NLMPROC4_LOCK(nlm4_lockargs)		= 2;
192*5bc37b75SChuck Lever 		nlm4_res	NLMPROC4_CANCEL(nlm4_cancargs)		= 3;
193*5bc37b75SChuck Lever 		nlm4_res	NLMPROC4_UNLOCK(nlm4_unlockargs)	= 4;
194*5bc37b75SChuck Lever 		nlm4_res	NLMPROC4_GRANTED(nlm4_testargs)		= 5;
195*5bc37b75SChuck Lever 		void		NLMPROC4_TEST_MSG(nlm4_testargs)	= 6;
196*5bc37b75SChuck Lever 		void		NLMPROC4_LOCK_MSG(nlm4_lockargs)	= 7;
197*5bc37b75SChuck Lever 		void		NLMPROC4_CANCEL_MSG(nlm4_cancargs)	= 8;
198*5bc37b75SChuck Lever 		void		NLMPROC4_UNLOCK_MSG(nlm4_unlockargs)	= 9;
199*5bc37b75SChuck Lever 		void		NLMPROC4_GRANTED_MSG(nlm4_testargs)	= 10;
200*5bc37b75SChuck Lever 		void		NLMPROC4_TEST_RES(nlm4_testres)		= 11;
201*5bc37b75SChuck Lever 		void		NLMPROC4_LOCK_RES(nlm4_res)		= 12;
202*5bc37b75SChuck Lever 		void		NLMPROC4_CANCEL_RES(nlm4_res)		= 13;
203*5bc37b75SChuck Lever 		void		NLMPROC4_UNLOCK_RES(nlm4_res)		= 14;
204*5bc37b75SChuck Lever 		void		NLMPROC4_GRANTED_RES(nlm4_res)		= 15;
205*5bc37b75SChuck Lever 		void		NLMPROC4_SM_NOTIFY(nlm4_notifyargs)	= 16;
206*5bc37b75SChuck Lever 		nlm4_shareres	NLMPROC4_SHARE(nlm4_shareargs)		= 20;
207*5bc37b75SChuck Lever 		nlm4_shareres	NLMPROC4_UNSHARE(nlm4_shareargs)	= 21;
208*5bc37b75SChuck Lever 		nlm4_res	NLMPROC4_NM_LOCK(nlm4_lockargs)		= 22;
209*5bc37b75SChuck Lever 		void		NLMPROC4_FREE_ALL(nlm4_notify)		= 23;
210*5bc37b75SChuck Lever 	} = 4;
211*5bc37b75SChuck Lever } = 100021;
212