interface: set interface in TEARDOWN state when checking link state
authorHans dedecker <dedeckeh@gmail.com>
Mon, 1 Apr 2019 08:34:26 +0000 (10:34 +0200)
committerHans Dedecker <dedeckeh@gmail.com>
Mon, 1 Apr 2019 20:55:46 +0000 (22:55 +0200)
When launching PROTO_CMD_TEARDOWN in interface_check_state() the interface
was set in IFS_DOWN state. In case an interface is now brought into IFS_SETUP
state in __interface_set_up() it will launch PROTO_CMD_SETUP trying to
bring the proto shell handler in S_SETUP state which will fail as the proto
shell handler is still in the S_TEARDOWN state.

Fix this by setting the interface in IFS_TEARDOWN state when the PROTO_CMD_TEARDOWN
event is launched which will prevent the interface being brought into IFS_SETUP state
as long as it's not in the IFS_DOWN state.

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
interface.c

index b8c4ae23a2f1cadbc48541f929763860f7ff3d43..fd7a826dc2a52e14594232307b206a7719a094c7 100644 (file)
@@ -342,11 +342,11 @@ interface_check_state(struct interface *iface)
        case IFS_UP:
        case IFS_SETUP:
                if (!iface->enabled || !link_state) {
-                       interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false);
+                       iface->state = IFS_TEARDOWN;
                        if (iface->dynamic)
                                __set_config_state(iface, IFC_REMOVE);
 
-                       mark_interface_down(iface);
+                       interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false);
                }
                break;
        case IFS_DOWN: