* int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh)
  * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq,
  *                          struct net_device *dev)
+ *
+ * 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.
  */
 struct net_device_ops {
        int                     (*ndo_init)(struct net_device *dev);
        int                     (*ndo_bridge_getlink)(struct sk_buff *skb,
                                                      u32 pid, u32 seq,
                                                      struct net_device *dev);
+       int                     (*ndo_change_carrier)(struct net_device *dev,
+                                                     bool new_carrier);
 };
 
 /*
 extern void            dev_set_group(struct net_device *, int);
 extern int             dev_set_mac_address(struct net_device *,
                                            struct sockaddr *);
+extern int             dev_change_carrier(struct net_device *,
+                                          bool new_carrier);
 extern int             dev_hard_start_xmit(struct sk_buff *skb,
                                            struct net_device *dev,
                                            struct netdev_queue *txq);
 
 }
 EXPORT_SYMBOL(dev_set_mac_address);
 
+/**
+ *     dev_change_carrier - Change device carrier
+ *     @dev: device
+ *     @new_carries: new value
+ *
+ *     Change device carrier
+ */
+int dev_change_carrier(struct net_device *dev, bool new_carrier)
+{
+       const struct net_device_ops *ops = dev->netdev_ops;
+
+       if (!ops->ndo_change_carrier)
+               return -EOPNOTSUPP;
+       if (!netif_device_present(dev))
+               return -ENODEV;
+       return ops->ndo_change_carrier(dev, new_carrier);
+}
+EXPORT_SYMBOL(dev_change_carrier);
+
 /*
  *     Perform the SIOCxIFxxx calls, inside rcu_read_lock()
  */