MC_PROPINFO(9E) Driver Entry Points MC_PROPINFO(9E)

NAME


mc_propinfo - get information about a property

SYNOPSIS


#include <sys/mac_provider.h>

void
prefix_m_propinfo(void *driver, const char *pr_name,
mac_prop_id_t pr_num, mac_prop_info_handle_t hdl);

INTERFACE LEVEL


illumos DDI specific

PARAMETERS


driver A pointer to the driver's private data that was passed in via
the m_pdata member of the mac_register(9S) structure to the
mac_register(9F) function.

pr_name
A null-terminated string that contains the name of the
property.

pr_num The value indicates the property that the device is working
with.

hdl A handle to use with the mac_prop_info(9F) family of routines
to indicate the property's metadata.

DESCRIPTION


The mc_propinfo() entry point is an optional entry point for networking
device drivers that is used to obtain metadata about a property,
including its permissions, default value, and information about valid
possible values. If the device driver does not implement either of the
mc_getprop(9E) or mc_setprop(9E) entry points then it does not need to
implement the mc_propinfo() entry point. However, it is highly
recommended that these interfaces be implemented in order to give users
and administrators of the system access to the properties of the
device.

When the mc_propinfo() entry point is called, the driver needs to first
identify the property. The set of possible properties and their
meaning is listed in the PROPERTIES section of mac(9E). It should
identify the property based on the value of pr_num. Most drivers will
use a switch statement and for any property that it supports it should
call the appropriate mac_prop_info(9F) functions to set values and then
return. When an unknown or unsupported property is encountered,
generally the default case of the switch statement, the device driver
should simply do nothing and return.

The special property MAC_PROP_PRIVATE indicates that this is a device
driver specific private property. The device driver must then look at
the value of the pr_name argument and use strcmp(9F) on it, comparing
it to each of its private properties to identify which one it is.

For each property the driver has three different sets of information
that it can fill in. The driver should try to fill in all of these
that make sense, if possible.

1. First, the driver should fill in the permissions of the property
with the mac_prop_info_set_perm(9F) function. These permissions
indicate what the device driver supports for a given property.
For each non-private property, see the property list in mac(9E) to
see what the maximum property permissions are. As discussed in
mac(9E), a device driver may have more limited permissions than
the default. For example, on some SFP-based devices, it may not
be possible to change any of the auto-negotiation properties.

2. The driver should then fill in any default value that it has for a
property. This is the value that the device driver sets by
default if no other tuning has been performed. There are
different functions depending on the type of the default value to
call. They are all listed in mac_prop_info(9F).

3. Finally, a driver may optionally set one or more value ranges.
These are used for integer properties such as MAC_PROP_MTU. The
driver may call mac_prop_info_set_range_uint32(9F) to set a series
of one or more inclusive ranges that describe valid values for the
property. For example, a device that supports jumbo frames up to
9600 bytes would call mac_prop_info_set_range_uint32(9F) to convey
that it supports MTUs in the range of 1500-9600 bytes.

If the device driver needs to access its private data, it will be
available in the driver argument which it should cast to the
appropriate structure. From there, the device driver may need to lock
the structure to ensure that access to it is properly serialized.

RETURN VALUES


The mc_propinfo() entry point does not have a return value. Drivers
should simply ignore and immediately return when encountering
unsupported and unknown properties.

EXAMPLES


The following example shows how a device driver might structure its
mc_propinfo() entry point.

#include <sys/mac_provider.h>

/*
* Note, this example merely shows the structure of this function.
* Different devices will manage their state in different ways. Like other
* examples, this assumes that the device has state in a structure called
* example_t and that there is a lock which keeps track of that state.
*/

static void
example_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
mac_prop_info_handle_t prh)
{
uint8_t value;
uint_t perm;

example_t *ep = arg;

mutex_enter(&ep->ep_lock);

switch (pr_num) {
/*
* We try to fill in as much information for each property as makes
* sense. In some cases, you may only be able to set the permissions.
*/
case MAC_PROP_DUPLEX:
case MAC_PROP_SPEED:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
break;

/*
* The MTU is a good example of a property that has a property range.
* The range represents the valid values the MTU can take.
*/
case MAC_PROP_MTU:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_RW);
mac_prop_info_set_range(prh, ep->ep_min_mtu, ep->ep_max_mtu);
break;

/*
* The ADV properties represent things that the device supports and
* can't be changed by the user. These are good examples of properties
* that have a default value and are read-only.
*/
case MAC_PROP_ADV_100FDX_CAP:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
value = (ep->ep_link_sup_speeds & EXAMPLE_100FDX) ? 1 : 0;
mac_prop_info_set_default_uint8(prh, value);
break;
case MAC_PROP_ADV_1000FDX_CAP:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
value = (ep->ep_link_sup_speeds & EXAMPLE_1000FDX) ? 1 : 0;
mac_prop_info_set_default_uint8(prh, value);
break;
case MAC_PROP_ADV_10GFDX_CAP:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
value = (ep->ep_link_sup_speeds & EXAMPLE_10GDX) ? 1 : 0;
mac_prop_info_set_default_uint8(prh, value);
break;

/*
* The EN properties represent the speeds advertised by the driver. On
* baseT (copper) PHYs, we allow them to be set, otherwise we don't.
* This driver always advertises it if supported, hence why all of these
* default to advertised if the link supports its.
*/
case MAC_PROP_EN_100FDX_CAP:
perm = ep->ep_link_type == EXAMPLE_LINK_COPPER ?
MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
mac_prop_info_set_perm(prh, perm);
value = (ep->ep_link_sup_speeds & EXAMPLE_100FDX) ? 1 : 0;
mac_prop_info_set_default_uint8(prh, value);
break;
case MAC_PROP_EN_1000FDX_CAP:
perm = ep->ep_link_type == EXAMPLE_LINK_COPPER ?
MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
mac_prop_info_set_perm(prh, perm);
value = (ep->ep_link_sup_speeds & EXAMPLE_1000FDX) ? 1 : 0;
mac_prop_info_set_default_uint8(prh, value);
break;
case MAC_PROP_EN_10GFDX_CAP:
perm = ep->ep_link_type == EXAMPLE_LINK_COPPER ?
MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
mac_prop_info_set_perm(prh, perm);
value = (ep->ep_link_sup_speeds & EXAMPLE_10GFDX) ? 1 : 0;
mac_prop_info_set_default_uint8(prh, value);
break;

/*
* If this device has private properties, then it should compare pr_name
* with the device's private properties and then fill in property
* information if it recognizes the name.
*/
case MAC_PROP_PRIVATE:
break;

/*
* For unknown properties, there's not much to do. Simply don't call any
* of the mac_prop_info(9F) related functions.
*/
default:
break;
}
mutex_exit(&ep->ep_lock);
}

SEE ALSO


mac(9E), mc_getprop(9E), mac_prop_info(9F)

illumos May 31, 2016 illumos

tribblix@gmail.com :: GitHub :: Privacy