interface: report link up events for force_link interfaces
[project/netifd.git] / interface.c
index 2aab37c..b9833d3 100644 (file)
@@ -189,6 +189,9 @@ interface_add_data(struct interface *iface, const struct blob_attr *data)
        }
 
        n = calloc(1, sizeof(*n) + len);
+       if (!n)
+               return UBUS_STATUS_UNKNOWN_ERROR;
+
        memcpy(n->data, data, len);
        n->node.key = blobmsg_name(n->data);
        avl_insert(&iface->data, &n->node);
@@ -257,6 +260,7 @@ mark_interface_down(struct interface *iface)
        if (state == IFS_DOWN)
                return;
 
+       iface->link_up_event = false;
        iface->state = IFS_DOWN;
        if (state == IFS_UP)
                interface_event(iface, IFEV_DOWN);
@@ -352,6 +356,11 @@ interface_set_link_state(struct interface *iface, bool new_state)
        netifd_log_message(L_NOTICE, "Interface '%s' has link connectivity %s\n", iface->name, new_state ? "" : "loss");
        iface->link_state = new_state;
        interface_check_state(iface);
+
+       if (new_state && iface->force_link && iface->state == IFS_UP && !iface->link_up_event) {
+               interface_event(iface, IFEV_LINK_UP);
+               iface->link_up_event = true;
+       }
 }
 
 static void
@@ -547,8 +556,7 @@ interface_alias_cb(struct interface_user *dep, struct interface *iface, enum int
        case IFEV_FREE:
                interface_remove_user(dep);
                break;
-       case IFEV_RELOAD:
-       case IFEV_UPDATE:
+       default:
                break;
        }
 }