diff options
Diffstat (limited to 'include/rdma')
-rw-r--r-- | include/rdma/uverbs_ioctl.h | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/include/rdma/uverbs_ioctl.h b/include/rdma/uverbs_ioctl.h index 0b46ef8f0b4c..017ccf75890c 100644 --- a/include/rdma/uverbs_ioctl.h +++ b/include/rdma/uverbs_ioctl.h @@ -67,10 +67,11 @@ struct uverbs_attr_spec { u8 type; /* - * Support extending attributes by length, validate all - * unknown size == zero + * Support extending attributes by length. Allow the user to provide + * more bytes than ptr.len, but check that everything after is zero'd + * by the user. */ - u8 min_sz_or_zero:1; + u8 zero_trailing:1; /* * Valid only for PTR_IN. Allocate and copy the data inside * the parser @@ -200,13 +201,26 @@ struct uverbs_object_tree_def { * ======================================= */ -/* Use in the _type parameter for attribute specifications */ -#define UVERBS_ATTR_TYPE(_type) \ - .u.ptr.min_len = sizeof(_type), .u.ptr.len = sizeof(_type) -#define UVERBS_ATTR_STRUCT(_type, _last) \ - .u.ptr.min_len = ((uintptr_t)(&((_type *)0)->_last + 1)), .u.ptr.len = sizeof(_type) #define UVERBS_ATTR_SIZE(_min_len, _len) \ .u.ptr.min_len = _min_len, .u.ptr.len = _len + +/* + * Specifies a uapi structure that cannot be extended. The user must always + * supply the whole structure and nothing more. The structure must be declared + * in a header under include/uapi/rdma. + */ +#define UVERBS_ATTR_TYPE(_type) \ + .u.ptr.min_len = sizeof(_type), .u.ptr.len = sizeof(_type) +/* + * Specifies a uapi structure where the user must provide at least up to + * member 'last'. Anything after last and up until the end of the structure + * can be non-zero, anything longer than the end of the structure must be + * zero. The structure must be declared in a header under include/uapi/rdma. + */ +#define UVERBS_ATTR_STRUCT(_type, _last) \ + .zero_trailing = 1, \ + UVERBS_ATTR_SIZE(((uintptr_t)(&((_type *)0)->_last + 1)), \ + sizeof(_type)) /* * Specifies at least min_len bytes must be passed in, but the amount can be * larger, up to the protocol maximum size. No check for zeroing is done. @@ -216,7 +230,6 @@ struct uverbs_object_tree_def { /* Must be used in the '...' of any UVERBS_ATTR */ #define UA_ALLOC_AND_COPY .alloc_and_copy = 1 #define UA_MANDATORY .mandatory = 1 -#define UA_MIN_SZ_OR_ZERO .min_sz_or_zero = 1 #define UA_OPTIONAL .mandatory = 0 #define UVERBS_ATTR_IDR(_attr_id, _idr_type, _access, ...) \ |