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
ip_up_down [2018/10/04 10:55] – [dev_ioctl()] rpjdayip_up_down [2018/10/04 11:09] (current) – [__dev_change_flags()] rpjday
Line 467: Line 467:
 </code> </code>
  
 +==== dev_ifsioc() ====
  
 +<code>
 +static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)
 +{
 + int err;
 + struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
 + const struct net_device_ops *ops;
 +
 + if (!dev)
 + return -ENODEV;
 +
 + ops = dev->netdev_ops;
 +
 + switch (cmd) {
 + case SIOCSIFFLAGS: /* Set interface flags */
 + return dev_change_flags(dev, ifr->ifr_flags);
 +</code>
 +
 +===== net/core/dev.c =====
 +
 +==== dev_change_flags() ====
 +
 +<code>
 +int dev_change_flags(struct net_device *dev, unsigned int flags)
 +{
 + int ret;
 + unsigned int changes, old_flags = dev->flags, old_gflags = dev->gflags;
 +
 + ret = __dev_change_flags(dev, flags);
 + if (ret < 0)
 + return ret;
 +
 + changes = (old_flags ^ dev->flags) | (old_gflags ^ dev->gflags);
 + __dev_notify_flags(dev, old_flags, changes);
 + return ret;
 +}
 +</code>
 +
 +==== __dev_change_flags() ====
 +
 +<code>
 +int __dev_change_flags(struct net_device *dev, unsigned int flags)
 +{
 + unsigned int old_flags = dev->flags;
 + int ret;
 +
 + ASSERT_RTNL();
 +
 + /*
 + * Set the flags on our device.
 + */
 +
 + dev->flags = (flags & (IFF_DEBUG | IFF_NOTRAILERS | IFF_NOARP |
 +        IFF_DYNAMIC | IFF_MULTICAST | IFF_PORTSEL |
 +        IFF_AUTOMEDIA)) |
 +      (dev->flags & (IFF_UP | IFF_VOLATILE | IFF_PROMISC |
 +     IFF_ALLMULTI));
 +
 +... snip ...
 +
 + ret = 0;
 + if ((old_flags ^ flags) & IFF_UP) {
 + if (old_flags & IFF_UP)
 + __dev_close(dev);
 + else
 + ret = __dev_open(dev);
 + }
 +</code>
  • ip_up_down.1538650524.txt.gz
  • Last modified: 2018/10/04 10:55
  • by rpjday