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