| .. | .. |
|---|
| 26 | 26 | #include <linux/types.h> |
|---|
| 27 | 27 | |
|---|
| 28 | 28 | /* latest upcall version available */ |
|---|
| 29 | | -#define CLD_UPCALL_VERSION 1 |
|---|
| 29 | +#define CLD_UPCALL_VERSION 2 |
|---|
| 30 | 30 | |
|---|
| 31 | 31 | /* defined by RFC3530 */ |
|---|
| 32 | 32 | #define NFS4_OPAQUE_LIMIT 1024 |
|---|
| 33 | + |
|---|
| 34 | +#ifndef SHA256_DIGEST_SIZE |
|---|
| 35 | +#define SHA256_DIGEST_SIZE 32 |
|---|
| 36 | +#endif |
|---|
| 33 | 37 | |
|---|
| 34 | 38 | enum cld_command { |
|---|
| 35 | 39 | Cld_Create, /* create a record for this cm_id */ |
|---|
| 36 | 40 | Cld_Remove, /* remove record of this cm_id */ |
|---|
| 37 | 41 | Cld_Check, /* is this cm_id allowed? */ |
|---|
| 38 | 42 | Cld_GraceDone, /* grace period is complete */ |
|---|
| 43 | + Cld_GraceStart, /* grace start (upload client records) */ |
|---|
| 44 | + Cld_GetVersion, /* query max supported upcall version */ |
|---|
| 39 | 45 | }; |
|---|
| 40 | 46 | |
|---|
| 41 | 47 | /* representation of long-form NFSv4 client ID */ |
|---|
| 42 | 48 | struct cld_name { |
|---|
| 43 | 49 | __u16 cn_len; /* length of cm_id */ |
|---|
| 44 | 50 | unsigned char cn_id[NFS4_OPAQUE_LIMIT]; /* client-provided */ |
|---|
| 51 | +} __attribute__((packed)); |
|---|
| 52 | + |
|---|
| 53 | +/* sha256 hash of the kerberos principal */ |
|---|
| 54 | +struct cld_princhash { |
|---|
| 55 | + __u8 cp_len; /* length of cp_data */ |
|---|
| 56 | + unsigned char cp_data[SHA256_DIGEST_SIZE]; /* hash of principal */ |
|---|
| 57 | +} __attribute__((packed)); |
|---|
| 58 | + |
|---|
| 59 | +struct cld_clntinfo { |
|---|
| 60 | + struct cld_name cc_name; |
|---|
| 61 | + struct cld_princhash cc_princhash; |
|---|
| 45 | 62 | } __attribute__((packed)); |
|---|
| 46 | 63 | |
|---|
| 47 | 64 | /* message struct for communication with userspace */ |
|---|
| .. | .. |
|---|
| 53 | 70 | union { |
|---|
| 54 | 71 | __s64 cm_gracetime; /* grace period start time */ |
|---|
| 55 | 72 | struct cld_name cm_name; |
|---|
| 73 | + __u8 cm_version; /* for getting max version */ |
|---|
| 56 | 74 | } __attribute__((packed)) cm_u; |
|---|
| 57 | 75 | } __attribute__((packed)); |
|---|
| 58 | 76 | |
|---|
| 77 | +/* version 2 message can include hash of kerberos principal */ |
|---|
| 78 | +struct cld_msg_v2 { |
|---|
| 79 | + __u8 cm_vers; /* upcall version */ |
|---|
| 80 | + __u8 cm_cmd; /* upcall command */ |
|---|
| 81 | + __s16 cm_status; /* return code */ |
|---|
| 82 | + __u32 cm_xid; /* transaction id */ |
|---|
| 83 | + union { |
|---|
| 84 | + struct cld_name cm_name; |
|---|
| 85 | + __u8 cm_version; /* for getting max version */ |
|---|
| 86 | + struct cld_clntinfo cm_clntinfo; /* name & princ hash */ |
|---|
| 87 | + } __attribute__((packed)) cm_u; |
|---|
| 88 | +} __attribute__((packed)); |
|---|
| 89 | + |
|---|
| 90 | +struct cld_msg_hdr { |
|---|
| 91 | + __u8 cm_vers; /* upcall version */ |
|---|
| 92 | + __u8 cm_cmd; /* upcall command */ |
|---|
| 93 | + __s16 cm_status; /* return code */ |
|---|
| 94 | + __u32 cm_xid; /* transaction id */ |
|---|
| 95 | +} __attribute__((packed)); |
|---|
| 96 | + |
|---|
| 59 | 97 | #endif /* !_NFSD_CLD_H */ |
|---|