/** * tipc_l2_device_event - handle device events from network device * @nb: the context of the notification * @evt: the type of event * @ptr: the net device that the event was on * * This function is called by the Ethernet driver in case of link * change event. */ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt, void *ptr) { struct tipc_bearer *b_ptr; struct net_device *dev = netdev_notifier_info_to_dev(ptr); if (!net_eq(dev_net(dev), &init_net)) return NOTIFY_DONE; b_ptr = rtnl_dereference(dev->tipc_ptr); if (!b_ptr) return NOTIFY_DONE; b_ptr->mtu = dev->mtu; switch (evt) { case NETDEV_CHANGE: if (netif_carrier_ok(dev)) break; case NETDEV_DOWN: case NETDEV_CHANGEMTU: tipc_reset_bearer(b_ptr); break; case NETDEV_CHANGEADDR: b_ptr->media->raw2addr(b_ptr, &b_ptr->addr, (char *)dev->dev_addr); tipc_reset_bearer(b_ptr); break; case NETDEV_UNREGISTER: case NETDEV_CHANGENAME: bearer_disable(b_ptr, false); break; } return NOTIFY_OK; }
/* tipc_bearer_reset_all - reset all links on all bearers */ void tipc_bearer_reset_all(struct net *net) { struct tipc_net *tn = tipc_net(net); struct tipc_bearer *b; int i; for (i = 0; i < MAX_BEARERS; i++) { b = rcu_dereference_rtnl(tn->bearer_list[i]); if (b) tipc_reset_bearer(net, b); } }
/* tipc_bearer_reset_all - reset all links on all bearers */ void tipc_bearer_reset_all(struct net *net) { struct tipc_bearer *b; int i; for (i = 0; i < MAX_BEARERS; i++) { b = bearer_get(net, i); if (b) clear_bit_unlock(0, &b->up); } for (i = 0; i < MAX_BEARERS; i++) { b = bearer_get(net, i); if (b) tipc_reset_bearer(net, b); } for (i = 0; i < MAX_BEARERS; i++) { b = bearer_get(net, i); if (b) test_and_set_bit_lock(0, &b->up); } }