2009/235 dladm Possible Values List
James Carlson
james.d.carlson at sun.com
Mon Apr 13 09:43:46 PDT 2009
I'm sponsoring this fast-track request for Girish Moodalbail. The
timer is set to 04/20/2009.
The consolidation is "ON" and the stability level for the interfaces
being introduced is "Consolidation Private".
Introduction:
-------------
dladm(1m) does not display possible values for some properties like MTU.
For a data-link which supports setting MTU on it, there exists a range of
values (for e.g., 108-9000) that can be set as MTU. Today in ON we do
not display that range (see CR 6680929) in 'dladm show-linkprop' output.
MTU happens to be one such property and there could be many.
To display such range of values we need to contact driver or MAC layer
(based on the property being queried). However there isn't any structure
to represent
(a) range of values (read: integers, unsigned integers, et al) or
collection of strings
(b) the type of the values returned and
(c) count of the range itself.
We want to provide one such structure and make it part of the linkprop
framework itself, so that it will be useful for implementers to send in
range of values from userspace to kernel or from kernel/driver to user
space. This data structure would be defined in 'mac.h' and would be used
as a value-result parameter (see below for more details).
Interfaces being added:
---------------------------
(a) Set of data structures to represent range of values (int32, int64,
uint32, uint64, et al) or collection/enumeration of values (strings).
For now we define uint32 range (mac_propval_uint32_range_t) for MTU. The
framework can be extended for other types.
/*
* Defines range of uint32 values. (108-9000)
*/
typedef struct mac_propval_uint32_range_s {
uint32_t mpur_min; /* minimum value in the range */
uint32_t mpur_max; /* maximum value in the range */
} mac_propval_uint32_range_t;
/*
* Data type of the value.
*/
typedef enum {
MAC_PROPVAL_UINT32 = 0x1
/* Various other types could be
* MAC_PROPVAL_INT32
* MAC_PROPVAL_INT64
* MAC_PROPVAL_UINT64
* MAC_PROPVAL_STRING
*/
} mac_propval_type_t;
/*
* Captures range of values for a given property. For e.g.,
* - MTU property for a data link can have values between 68-9000.
* - CPU property for a MAC client can have multiple CPU ranges
* 1-6, 10-16 assigned to it.
*/
typedef struct mac_propval_range_s {
uint_t mpr_count; /* count of ranges */
mac_propval_type_t mpr_type; /* type of value */
union {
mac_propval_uint32_range_t mpr_uint32[1];
} u;
} mac_propval_range_t;
#define range_uint32 u.mpr_uint32
(b) MAC_PROP_POSSIBLE:
In order to avoid explosion of MAC properties (read: MAC_PROP_YYY,
MAC_PROP_YYY_RANGE, et al), we chose to use a new flag
'MAC_PROP_POSSIBLE' to tell the drivers that the linkprop framework is
interested in the range of property values. Device driver authors should
handle the above flag by populating the aforementioned data structures
and returning them.
This flag is in the same league as MAC_PROP_DEFAULT, which is used to
tell the drivers to return default property value.
NOTE: MAC_PROP_POSSIBLE flag needs to be handled 'carefully'.
MAC_PROP_YYY by itself means current value of property, however
MAC_PROP_YYY with MAC_PROP_POSSIBLE flag means range of property values.
So when MAC_PROP_POSSIBLE flag is used for a particular property, one
may have to change "all" the drivers to handle this flag for that
property (i.e., either return 'ENOTSUP' when not supported or return
'range of values').
Interface interaction details:
-------------------------------
The caller is responsible to allocate sufficient memory for the drivers
to fill in the details. The caller provides a pointer to an array (union
member 'u' of 'mac_propval_range_t') and a size of the array
('mpr_count' of the 'mac_propval_range_t') and the callee will copy the
data into that array. Upon success, mpr_count will have count of range
of values and the array itself will have value range. However if
sufficient memory was not allocated, the driver would return ENOBUF and
would set 'mpr_count' to the required size of the array.
The query/reply mechanism is achieved by calling i_dladm_range_get() for
query and the respective driver function <drv>_m_getprop() would reply
back with the range of values.
i_dladm_range_get() is a function available in libdladm.so.1, which
needs to be registered as a callback function in prop_desc_t[] table for
those properties interested in range of values.
Following drivers would be changed to use the above structure:
bge, e1000g, nxge, nge, hxge, vnic & aggr.
All the changes would be in the respective <drv>_m_getprop() function.
More information about the opensolaris-arc
mailing list