Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ndo_change_carrier [2018/08/04 10:24] rpjdayndo_change_carrier [2018/08/04 17:31] (current) – [Overview] rpjday
Line 1: Line 1:
 ===== Overview ===== ===== Overview =====
  
-The implications of setting ''net_device_ops'' ''ndo_change_carrier'' field.+Setting/detecting carrier, and the subsequent implications of setting ''net_device_ops'' ''ndo_change_carrier'' field (if any implications actually exist):
  
-===== net/core/net-sysfs.c =====+===== Normal behaviour ===== 
 + 
 +==== Net device state ==== 
 + 
 +From ''include/linux/netdevice.h'': 
 + 
 +Net device state:
  
 <code> <code>
-static int change_carrier(struct net_device *dev, unsigned long new_carrier)+struct net_device { 
 +        ... snip ... 
 +        unsigned long           state; 
 +        ... snip ... 
 +</code> 
 + 
 +State flag bits for later testing: 
 + 
 +<code> 
 +enum netdev_state_t { 
 +        __LINK_STATE_START, 
 +        __LINK_STATE_PRESENT, 
 +        __LINK_STATE_NOCARRIER, 
 +        __LINK_STATE_LINKWATCH_PENDING, 
 +        __LINK_STATE_DORMANT, 
 +}; 
 +</code> 
 + 
 +==== Checking for state of carrier ==== 
 + 
 +Again from ''netdevice.h'': 
 + 
 +<code> 
 +/** 
 +      netif_carrier_ok - test if carrier present 
 +      @dev: network device 
 + * 
 + * Check if carrier is present on device 
 + */ 
 +static inline bool netif_carrier_ok(const struct net_device *dev)
 { {
-        if (!netif_running(dev)) +        return !test_bit(__LINK_STATE_NOCARRIER, &dev->state);
-                return -EINVAL; +
-        return dev_change_carrier(dev, (bool) new_carrier);+
 } }
  
-static ssize_t carrier_store(struct device *devstruct device_attribute *attr, +void netif_carrier_on(struct net_device *dev); 
-                             const char *buf, size_t len)+void netif_carrier_off(struct net_device *dev); 
 +</code> 
 + 
 +==== Test for interface running ==== 
 + 
 +Still in ''netdevice.h'': 
 + 
 +<code> 
 +/** 
 + * netif_running - test if up 
 + * @dev: network device 
 + * 
 + * Test if the device has been brought up. 
 + */ 
 +static inline bool netif_running(const struct net_device *dev)
 { {
-        return netdev_store(dev, attr, buf, len, change_carrier);+ return test_bit(__LINK_STATE_START, &dev->state); 
 +
 +</code> 
 +==== Test if carrier on or off ==== 
 + 
 +From ''net/sched/sch_generic.c'': 
 + 
 +<code> 
 +/** 
 +      netif_carrier_on - set carrier 
 +      @dev: network device 
 + * 
 + * Device has detected that carrier. 
 + */ 
 +void netif_carrier_on(struct net_device *dev) 
 +
 +        if (test_and_clear_bit(__LINK_STATE_NOCARRIER&dev->state)) { 
 +                if (dev->reg_state == NETREG_UNINITIALIZED) 
 +                        return; 
 +                atomic_inc(&dev->carrier_up_count); 
 +                linkwatch_fire_event(dev); 
 +                if (netif_running(dev)) 
 +                        __netdev_watchdog_up(dev); 
 +        }
 } }
 +EXPORT_SYMBOL(netif_carrier_on);
  
-static ssize_t carrier_show(struct device *dev, +/*
-                            struct device_attribute *attr, char *buf)+      netif_carrier_off - clear carrier 
 +      @dev: network device 
 + * 
 + Device has detected loss of carrier. 
 + */ 
 +void netif_carrier_off(struct net_device *dev)
 { {
-        struct net_device *netdev = to_net_dev(dev); +        if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { 
-        if (netif_running(netdev)) { +                if (dev->reg_state == NETREG_UNINITIALIZED) 
-                return sprintf(buf, fmt_dec, !!netif_carrier_ok(netdev));+                        return
 +                atomic_inc(&dev->carrier_down_count)
 +                linkwatch_fire_event(dev);
         }         }
-        return -EINVAL; 
 } }
-static DEVICE_ATTR_RW(carrier);+EXPORT_SYMBOL(netif_carrier_off);
 </code> </code>
  • ndo_change_carrier.1533378248.txt.gz
  • Last modified: 2018/08/04 10:24
  • by rpjday