Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| ip_up_down [2018/10/04 10:57] – [dev_ioctl()] rpjday | ip_up_down [2018/10/04 11:09] (current) – [__dev_change_flags()] rpjday | ||
|---|---|---|---|
| Line 484: | Line 484: | ||
| case SIOCSIFFLAGS: | case SIOCSIFFLAGS: | ||
| return dev_change_flags(dev, | return dev_change_flags(dev, | ||
| + | </ | ||
| + | |||
| + | ===== net/ | ||
| + | |||
| + | ==== dev_change_flags() ==== | ||
| + | |||
| + | < | ||
| + | int dev_change_flags(struct net_device *dev, unsigned int flags) | ||
| + | { | ||
| + | int ret; | ||
| + | unsigned int changes, old_flags = dev-> | ||
| + | |||
| + | ret = __dev_change_flags(dev, | ||
| + | if (ret < 0) | ||
| + | return ret; | ||
| + | |||
| + | changes = (old_flags ^ dev-> | ||
| + | __dev_notify_flags(dev, | ||
| + | return ret; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== __dev_change_flags() ==== | ||
| + | |||
| + | < | ||
| + | int __dev_change_flags(struct net_device *dev, unsigned int flags) | ||
| + | { | ||
| + | unsigned int old_flags = dev-> | ||
| + | int ret; | ||
| + | |||
| + | ASSERT_RTNL(); | ||
| + | |||
| + | /* | ||
| + | * Set the flags on our device. | ||
| + | */ | ||
| + | |||
| + | dev-> | ||
| + | | ||
| + | | ||
| + | | ||
| + | IFF_ALLMULTI)); | ||
| + | |||
| + | ... snip ... | ||
| + | |||
| + | ret = 0; | ||
| + | if ((old_flags ^ flags) & IFF_UP) { | ||
| + | if (old_flags & IFF_UP) | ||
| + | __dev_close(dev); | ||
| + | else | ||
| + | ret = __dev_open(dev); | ||
| + | } | ||
| </ | </ | ||