10 static int interface_event(struct interface *iface, enum interface_event ev)
12 if (!iface->state || !iface->state->event)
15 return iface->state->event(iface, iface->state, ev);
19 __set_interface_up(struct interface *iface)
24 if (claim_device(iface->main_dev.dev) < 0)
27 if (interface_event(iface, IFEV_UP) < 0) {
28 release_device(iface->main_dev.dev);
36 __set_interface_down(struct interface *iface)
42 interface_event(iface, IFEV_DOWN);
43 release_device(iface->main_dev.dev);
47 interface_cb(struct device_user *dep, enum device_event ev)
49 struct interface *iface;
52 iface = container_of(dep, struct interface, main_dev);
57 case DEV_EVENT_REMOVE:
64 if (iface->active == new_state)
67 iface->active = new_state;
71 __set_interface_up(iface);
73 __set_interface_down(iface);
77 alloc_interface(const char *name)
79 struct interface *iface;
81 iface = get_interface(name);
85 iface = calloc(1, sizeof(*iface));
86 iface->main_dev.cb = interface_cb;
87 iface->l3_iface = &iface->main_dev;
88 strncpy(iface->name, name, sizeof(iface->name) - 1);
89 list_add(&iface->list, &interfaces);
90 netifd_ubus_add_interface(iface);
96 free_interface(struct interface *iface)
98 netifd_ubus_remove_interface(iface);
99 list_del(&iface->list);
100 if (iface->state && iface->state->free)
101 iface->state->free(iface, iface->state);
106 get_interface(const char *name)
108 struct interface *iface;
110 list_for_each_entry(iface, &interfaces, list) {
111 if (!strcmp(iface->name, name))
118 interface_remove_link(struct interface *iface, struct device *llif)
120 struct device *dev = iface->main_dev.dev;
122 if (dev && dev->hotplug_ops) {
123 dev->hotplug_ops->del(dev, llif);
127 remove_device_user(&iface->main_dev);
131 interface_add_link(struct interface *iface, struct device *llif)
133 struct device *dev = iface->main_dev.dev;
135 if (dev && dev->hotplug_ops)
136 return dev->hotplug_ops->add(dev, llif);
138 if (iface->main_dev.dev)
139 interface_remove_link(iface, NULL);
141 add_device_user(&iface->main_dev, llif);
147 set_interface_up(struct interface *iface)
149 iface->autostart = true;
151 if (iface->up || !iface->active)
154 __set_interface_up(iface);
159 set_interface_down(struct interface *iface)
161 iface->autostart = false;
166 __set_interface_down(iface);