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