ndo_change_carrier

This is an old revision of the document!


The implications of setting net_device_ops ndo_change_carrier field.

struct net_device {
        ... snip ...
        const struct net_device_ops *netdev_ops;
        ... snip ...
struct net_device_ops {

... snip ...

* int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
 *      Called to change device carrier. Soft-devices (like dummy, team, etc)
 *      which do not represent real hardware may define this to allow their
 *      userspace components to manage their virtual carrier state. Devices
 *      that determine carrier state from physical hardware properties (eg
 *      network cables) or protocol-dependent mechanisms (eg
 *      USB_CDC_NOTIFY_NETWORK_CONNECTION) should NOT implement this function.
 *
static int change_carrier(struct net_device *dev, unsigned long new_carrier)
{
        if (!netif_running(dev))
                return -EINVAL;
        return dev_change_carrier(dev, (bool) new_carrier);
}

static ssize_t carrier_store(struct device *dev, struct device_attribute *attr,
                             const char *buf, size_t len)
{
        return netdev_store(dev, attr, buf, len, change_carrier);
}

static ssize_t carrier_show(struct device *dev,
                            struct device_attribute *attr, char *buf)
{
        struct net_device *netdev = to_net_dev(dev);
        if (netif_running(netdev)) {
                return sprintf(buf, fmt_dec, !!netif_carrier_ok(netdev));
        }
        return -EINVAL;
}
static DEVICE_ATTR_RW(carrier);

Note how showing the value of carrier involves calling:

  • if (netif_running(netdev))
  • !!netif_carrier_ok(netdev)
  • ndo_change_carrier.1533378727.txt.gz
  • Last modified: 2018/08/04 10:32
  • by rpjday