11 clear_interface_errors(struct interface *iface)
13 struct interface_error *error, *tmp;
15 list_for_each_entry_safe(error, tmp, &iface->errors, list) {
16 list_del(&error->list);
21 void interface_add_error(struct interface *iface, const char *subsystem,
22 const char *code, const char **data, int n_data)
24 struct interface_error *error;
30 len = n_data * sizeof(char *);
31 datalen = alloca(len);
32 for (i = 0; i < n_data; i++) {
33 datalen[i] = strlen(data[i]) + 1;
38 error = calloc(1, sizeof(*error) + sizeof(char *) + len);
42 list_add_tail(&error->list, &iface->errors);
43 error->subsystem = subsystem;
46 dest = (char *) &error->data[n_data + 1];
47 for (i = 0; i < n_data; i++) {
48 error->data[i] = dest;
49 memcpy(dest, data[i], datalen[i]);
52 error->data[n_data] = NULL;
56 interface_event(struct interface *iface, enum interface_event ev)
58 if (!iface->state || !iface->state->event)
61 return iface->state->event(iface, iface->state, ev);
65 __set_interface_up(struct interface *iface)
70 if (claim_device(iface->main_dev.dev) < 0)
73 if (interface_event(iface, IFEV_UP) < 0) {
74 release_device(iface->main_dev.dev);
82 __set_interface_down(struct interface *iface)
84 clear_interface_errors(iface);
90 interface_event(iface, IFEV_DOWN);
91 release_device(iface->main_dev.dev);
95 interface_cb(struct device_user *dep, enum device_event ev)
97 struct interface *iface;
100 iface = container_of(dep, struct interface, main_dev);
105 case DEV_EVENT_REMOVE:
112 if (iface->active == new_state)
115 iface->active = new_state;
118 if (iface->autostart)
119 __set_interface_up(iface);
121 __set_interface_down(iface);
125 alloc_interface(const char *name)
127 struct interface *iface;
129 iface = get_interface(name);
133 iface = calloc(1, sizeof(*iface));
134 iface->main_dev.cb = interface_cb;
135 iface->l3_iface = &iface->main_dev;
136 strncpy(iface->name, name, sizeof(iface->name) - 1);
137 list_add(&iface->list, &interfaces);
138 INIT_LIST_HEAD(&iface->errors);
140 netifd_ubus_add_interface(iface);
146 free_interface(struct interface *iface)
148 netifd_ubus_remove_interface(iface);
149 list_del(&iface->list);
150 if (iface->state && iface->state->free)
151 iface->state->free(iface, iface->state);
156 get_interface(const char *name)
158 struct interface *iface;
160 list_for_each_entry(iface, &interfaces, list) {
161 if (!strcmp(iface->name, name))
168 interface_remove_link(struct interface *iface, struct device *llif)
170 struct device *dev = iface->main_dev.dev;
172 if (dev && dev->hotplug_ops) {
173 dev->hotplug_ops->del(dev, llif);
177 remove_device_user(&iface->main_dev);
181 interface_add_link(struct interface *iface, struct device *llif)
183 struct device *dev = iface->main_dev.dev;
185 if (dev && dev->hotplug_ops)
186 return dev->hotplug_ops->add(dev, llif);
188 if (iface->main_dev.dev)
189 interface_remove_link(iface, NULL);
191 add_device_user(&iface->main_dev, llif);
197 set_interface_up(struct interface *iface)
199 iface->autostart = true;
201 if (!iface->active) {
202 interface_add_error(iface, "interface", "NO_DEVICE", NULL, 0);
206 if (iface->up || !iface->active)
209 __set_interface_up(iface);
214 set_interface_down(struct interface *iface)
216 iface->autostart = false;
217 __set_interface_down(iface);