212 lines
4.2 KiB
Plaintext
212 lines
4.2 KiB
Plaintext
/*
|
|
* This file was extracted by hand from
|
|
* https://www.rfc-editor.org/rfc/rfc1813.html .
|
|
*
|
|
* Note that RFC 1813 is Informational. Its official date of
|
|
* publication (June 1995) is before the IETF required its RFCs to
|
|
* carry an explicit copyright or other IP ownership notices.
|
|
*
|
|
* Note also that RFC 1813 does not specify the whole NLM4 protocol.
|
|
* In particular, the argument and result types are not present in
|
|
* that document, and had to be reverse-engineered.
|
|
*/
|
|
|
|
/*
|
|
* The NLMv4 protocol
|
|
*/
|
|
|
|
pragma header nlm4;
|
|
|
|
/*
|
|
* The following definitions are missing in RFC 1813,
|
|
* but can be found in the OpenNetworking Network Lock
|
|
* Manager protocol:
|
|
*
|
|
* https://pubs.opengroup.org/onlinepubs/9629799/chap10.htm
|
|
*/
|
|
|
|
const LM_MAXSTRLEN = 1024;
|
|
|
|
const LM_MAXNAMELEN = 1025;
|
|
|
|
const MAXNETOBJ_SZ = 1024;
|
|
|
|
typedef opaque netobj<MAXNETOBJ_SZ>;
|
|
|
|
enum fsh4_mode {
|
|
fsm_DN = 0, /* deny none */
|
|
fsm_DR = 1, /* deny read */
|
|
fsm_DW = 2, /* deny write */
|
|
fsm_DRW = 3 /* deny read/write */
|
|
};
|
|
|
|
enum fsh4_access {
|
|
fsa_NONE = 0, /* for completeness */
|
|
fsa_R = 1, /* read-only */
|
|
fsa_W = 2, /* write-only */
|
|
fsa_RW = 3 /* read/write */
|
|
};
|
|
|
|
/*
|
|
* The following definitions come from the OpenNetworking
|
|
* Network Status Monitor protocol:
|
|
*
|
|
* https://pubs.opengroup.org/onlinepubs/9629799/chap11.htm
|
|
*/
|
|
|
|
const SM_MAXSTRLEN = 1024;
|
|
|
|
/*
|
|
* The NLM protocol as extracted from:
|
|
* https://tools.ietf.org/html/rfc1813 Appendix II
|
|
*/
|
|
|
|
typedef unsigned hyper uint64;
|
|
|
|
typedef hyper int64;
|
|
|
|
typedef unsigned long uint32;
|
|
|
|
typedef long int32;
|
|
|
|
enum nlm4_stats {
|
|
NLM4_GRANTED = 0,
|
|
NLM4_DENIED = 1,
|
|
NLM4_DENIED_NOLOCKS = 2,
|
|
NLM4_BLOCKED = 3,
|
|
NLM4_DENIED_GRACE_PERIOD = 4,
|
|
NLM4_DEADLCK = 5,
|
|
NLM4_ROFS = 6,
|
|
NLM4_STALE_FH = 7,
|
|
NLM4_FBIG = 8,
|
|
NLM4_FAILED = 9
|
|
};
|
|
|
|
pragma big_endian nlm4_stats;
|
|
|
|
struct nlm4_holder {
|
|
bool exclusive;
|
|
int32 svid;
|
|
netobj oh;
|
|
uint64 l_offset;
|
|
uint64 l_len;
|
|
};
|
|
|
|
union nlm4_testrply switch (nlm4_stats stat) {
|
|
case NLM4_DENIED:
|
|
nlm4_holder holder;
|
|
default:
|
|
void;
|
|
};
|
|
|
|
struct nlm4_stat {
|
|
nlm4_stats stat;
|
|
};
|
|
|
|
struct nlm4_res {
|
|
netobj cookie;
|
|
nlm4_stat stat;
|
|
};
|
|
|
|
struct nlm4_testres {
|
|
netobj cookie;
|
|
nlm4_testrply stat;
|
|
};
|
|
|
|
struct nlm4_lock {
|
|
string caller_name<LM_MAXSTRLEN>;
|
|
netobj fh;
|
|
netobj oh;
|
|
int32 svid;
|
|
uint64 l_offset;
|
|
uint64 l_len;
|
|
};
|
|
|
|
struct nlm4_lockargs {
|
|
netobj cookie;
|
|
bool block;
|
|
bool exclusive;
|
|
nlm4_lock alock;
|
|
bool reclaim;
|
|
int32 state;
|
|
};
|
|
|
|
struct nlm4_cancargs {
|
|
netobj cookie;
|
|
bool block;
|
|
bool exclusive;
|
|
nlm4_lock alock;
|
|
};
|
|
|
|
struct nlm4_testargs {
|
|
netobj cookie;
|
|
bool exclusive;
|
|
nlm4_lock alock;
|
|
};
|
|
|
|
struct nlm4_unlockargs {
|
|
netobj cookie;
|
|
nlm4_lock alock;
|
|
};
|
|
|
|
struct nlm4_share {
|
|
string caller_name<LM_MAXSTRLEN>;
|
|
netobj fh;
|
|
netobj oh;
|
|
fsh4_mode mode;
|
|
fsh4_access access;
|
|
};
|
|
|
|
struct nlm4_shareargs {
|
|
netobj cookie;
|
|
nlm4_share share;
|
|
bool reclaim;
|
|
};
|
|
|
|
struct nlm4_shareres {
|
|
netobj cookie;
|
|
nlm4_stats stat;
|
|
int32 sequence;
|
|
};
|
|
|
|
struct nlm4_notify {
|
|
string name<LM_MAXNAMELEN>;
|
|
int32 state;
|
|
};
|
|
|
|
/*
|
|
* Argument for the Linux-private SM_NOTIFY procedure
|
|
*/
|
|
const SM_PRIV_SIZE = 16;
|
|
|
|
struct nlm4_notifyargs {
|
|
nlm4_notify notify;
|
|
opaque private[SM_PRIV_SIZE];
|
|
};
|
|
|
|
program NLM4_PROG {
|
|
version NLM4_VERS {
|
|
void NLMPROC4_NULL(void) = 0;
|
|
nlm4_testres NLMPROC4_TEST(nlm4_testargs) = 1;
|
|
nlm4_res NLMPROC4_LOCK(nlm4_lockargs) = 2;
|
|
nlm4_res NLMPROC4_CANCEL(nlm4_cancargs) = 3;
|
|
nlm4_res NLMPROC4_UNLOCK(nlm4_unlockargs) = 4;
|
|
nlm4_res NLMPROC4_GRANTED(nlm4_testargs) = 5;
|
|
void NLMPROC4_TEST_MSG(nlm4_testargs) = 6;
|
|
void NLMPROC4_LOCK_MSG(nlm4_lockargs) = 7;
|
|
void NLMPROC4_CANCEL_MSG(nlm4_cancargs) = 8;
|
|
void NLMPROC4_UNLOCK_MSG(nlm4_unlockargs) = 9;
|
|
void NLMPROC4_GRANTED_MSG(nlm4_testargs) = 10;
|
|
void NLMPROC4_TEST_RES(nlm4_testres) = 11;
|
|
void NLMPROC4_LOCK_RES(nlm4_res) = 12;
|
|
void NLMPROC4_CANCEL_RES(nlm4_res) = 13;
|
|
void NLMPROC4_UNLOCK_RES(nlm4_res) = 14;
|
|
void NLMPROC4_GRANTED_RES(nlm4_res) = 15;
|
|
void NLMPROC4_SM_NOTIFY(nlm4_notifyargs) = 16;
|
|
nlm4_shareres NLMPROC4_SHARE(nlm4_shareargs) = 20;
|
|
nlm4_shareres NLMPROC4_UNSHARE(nlm4_shareargs) = 21;
|
|
nlm4_res NLMPROC4_NM_LOCK(nlm4_lockargs) = 22;
|
|
void NLMPROC4_FREE_ALL(nlm4_notify) = 23;
|
|
} = 4;
|
|
} = 100021;
|