static const char* natsState2Name(ULONG name) { #define STATE2STR(s) case SESSION_STATE_##s: return #s switch (name) { STATE2STR(UNKNOWN); STATE2STR(CLOSED); STATE2STR(SYN_RCV); STATE2STR(SYN_ACK_RCV); STATE2STR(ESTABLISHED); STATE2STR(FIN_CLN_RCV); STATE2STR(FIN_SRV_RCV); default: break; } return "UNKNOWN"; }
struct isis_circuit * isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg) { int old_state; old_state = circuit ? circuit->state : C_STATE_NA; if (isis->debugs & DEBUG_EVENTS) zlog_debug("CSM_EVENT: %s", EVENT2STR(event)); switch (old_state) { case C_STATE_NA: if (circuit) zlog_warn("Non-null circuit while state C_STATE_NA"); assert(circuit == NULL); switch (event) { case ISIS_ENABLE: circuit = isis_circuit_new(); isis_circuit_configure(circuit, (struct isis_area *)arg); circuit->state = C_STATE_CONF; break; case IF_UP_FROM_Z: circuit = isis_circuit_new(); isis_circuit_if_add(circuit, (struct interface *)arg); listnode_add(isis->init_circ_list, circuit); circuit->state = C_STATE_INIT; break; case ISIS_DISABLE: zlog_warn("circuit already disabled"); break; case IF_DOWN_FROM_Z: zlog_warn("circuit already disconnected"); break; } break; case C_STATE_INIT: assert(circuit); switch (event) { case ISIS_ENABLE: isis_circuit_configure(circuit, (struct isis_area *)arg); if (isis_circuit_up(circuit) != ISIS_OK) { isis_circuit_deconfigure( circuit, (struct isis_area *)arg); break; } circuit->state = C_STATE_UP; isis_event_circuit_state_change(circuit, circuit->area, 1); listnode_delete(isis->init_circ_list, circuit); break; case IF_UP_FROM_Z: assert(circuit); zlog_warn("circuit already connected"); break; case ISIS_DISABLE: zlog_warn("circuit already disabled"); break; case IF_DOWN_FROM_Z: isis_circuit_if_del(circuit, (struct interface *)arg); listnode_delete(isis->init_circ_list, circuit); isis_circuit_del(circuit); circuit = NULL; break; } break; case C_STATE_CONF: assert(circuit); switch (event) { case ISIS_ENABLE: zlog_warn("circuit already enabled"); break; case IF_UP_FROM_Z: isis_circuit_if_add(circuit, (struct interface *)arg); if (isis_circuit_up(circuit) != ISIS_OK) { flog_err( ISIS_ERR_CONFIG, "Could not bring up %s because of invalid config.", circuit->interface->name); flog_err( ISIS_ERR_CONFIG, "Clearing config for %s. Please re-examine it.", circuit->interface->name); if (circuit->ip_router) { circuit->ip_router = 0; circuit->area->ip_circuits--; } if (circuit->ipv6_router) { circuit->ipv6_router = 0; circuit->area->ipv6_circuits--; } circuit_update_nlpids(circuit); isis_circuit_deconfigure(circuit, circuit->area); listnode_add(isis->init_circ_list, circuit); circuit->state = C_STATE_INIT; break; } circuit->state = C_STATE_UP; isis_event_circuit_state_change(circuit, circuit->area, 1); break; case ISIS_DISABLE: isis_circuit_deconfigure(circuit, (struct isis_area *)arg); isis_circuit_del(circuit); circuit = NULL; break; case IF_DOWN_FROM_Z: zlog_warn("circuit already disconnected"); break; } break; case C_STATE_UP: assert(circuit); switch (event) { case ISIS_ENABLE: zlog_warn("circuit already configured"); break; case IF_UP_FROM_Z: zlog_warn("circuit already connected"); break; case ISIS_DISABLE: isis_circuit_down(circuit); isis_circuit_deconfigure(circuit, (struct isis_area *)arg); circuit->state = C_STATE_INIT; isis_event_circuit_state_change( circuit, (struct isis_area *)arg, 0); listnode_add(isis->init_circ_list, circuit); break; case IF_DOWN_FROM_Z: isis_circuit_down(circuit); isis_circuit_if_del(circuit, (struct interface *)arg); circuit->state = C_STATE_CONF; isis_event_circuit_state_change(circuit, circuit->area, 0); break; } break; default: zlog_warn("Invalid circuit state %d", old_state); } if (isis->debugs & DEBUG_EVENTS) zlog_debug("CSM_STATE_CHANGE: %s -> %s ", STATE2STR(old_state), circuit ? STATE2STR(circuit->state) : STATE2STR(C_STATE_NA)); return circuit; }
struct isis_circuit * isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg) { int old_state; old_state = circuit ? circuit->state : C_STATE_NA; if (isis->debugs & DEBUG_EVENTS) zlog_debug ("CSM_EVENT: %s", EVENT2STR (event)); switch (old_state) { case C_STATE_NA: if (circuit) zlog_warn ("Non-null circuit while state C_STATE_NA"); switch (event) { case ISIS_ENABLE: circuit = isis_circuit_new (); isis_circuit_configure (circuit, (struct isis_area *) arg); circuit->state = C_STATE_CONF; break; case IF_UP_FROM_Z: circuit = isis_circuit_new (); isis_circuit_if_add (circuit, (struct interface *) arg); listnode_add (isis->init_circ_list, circuit); circuit->state = C_STATE_INIT; break; case ISIS_DISABLE: zlog_warn ("circuit already disabled"); case IF_DOWN_FROM_Z: zlog_warn ("circuit already disconnected"); break; } break; case C_STATE_INIT: switch (event) { case ISIS_ENABLE: isis_circuit_configure (circuit, (struct isis_area *) arg); isis_circuit_up (circuit); circuit->state = C_STATE_UP; isis_event_circuit_state_change (circuit, 1); listnode_delete (isis->init_circ_list, circuit); break; case IF_UP_FROM_Z: zlog_warn ("circuit already connected"); break; case ISIS_DISABLE: zlog_warn ("circuit already disabled"); break; case IF_DOWN_FROM_Z: isis_circuit_if_del (circuit); listnode_delete (isis->init_circ_list, circuit); isis_circuit_del (circuit); circuit = NULL; break; } break; case C_STATE_CONF: switch (event) { case ISIS_ENABLE: zlog_warn ("circuit already enabled"); break; case IF_UP_FROM_Z: isis_circuit_if_add (circuit, (struct interface *) arg); isis_circuit_up (circuit); circuit->state = C_STATE_UP; isis_event_circuit_state_change (circuit, 1); break; case ISIS_DISABLE: isis_circuit_deconfigure (circuit, (struct isis_area *) arg); isis_circuit_del (circuit); circuit = NULL; break; case IF_DOWN_FROM_Z: zlog_warn ("circuit already disconnected"); break; } break; case C_STATE_UP: switch (event) { case ISIS_ENABLE: zlog_warn ("circuit already configured"); break; case IF_UP_FROM_Z: zlog_warn ("circuit already connected"); break; case ISIS_DISABLE: isis_circuit_deconfigure (circuit, (struct isis_area *) arg); listnode_add (isis->init_circ_list, circuit); circuit->state = C_STATE_INIT; isis_event_circuit_state_change (circuit, 0); break; case IF_DOWN_FROM_Z: isis_circuit_if_del (circuit); circuit->state = C_STATE_CONF; isis_event_circuit_state_change (circuit, 0); break; } break; default: zlog_warn ("Invalid circuit state %d", old_state); } if (isis->debugs & DEBUG_EVENTS) zlog_debug ("CSM_STATE_CHANGE: %s -> %s ", STATE2STR (old_state), circuit ? STATE2STR (circuit->state) : STATE2STR (C_STATE_NA)); return circuit; }
// XXX: isis_circuit_if_add() and isis_circuit_if_del commented out struct isis_circuit * isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg) { int old_state; old_state = circuit ? circuit->state : C_STATE_NA; Log(LOG_DEBUG, "DEBUG ( %s/core/ISIS ): CSM_EVENT: %s\n", config.name, EVENT2STR (event)); switch (old_state) { case C_STATE_NA: if (circuit) Log(LOG_WARNING, "WARN ( %s/core/ISIS ): Non-null circuit while state C_STATE_NA\n", config.name); switch (event) { case ISIS_ENABLE: circuit = isis_circuit_new (); isis_circuit_configure (circuit, (struct isis_area *) arg); circuit->state = C_STATE_CONF; break; case IF_UP_FROM_Z: circuit = isis_circuit_new (); // isis_circuit_if_add (circuit, (struct interface *) arg); isis_listnode_add (isis->init_circ_list, circuit); circuit->state = C_STATE_INIT; break; case ISIS_DISABLE: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already disabled\n", config.name); case IF_DOWN_FROM_Z: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already disconnected\n", config.name); break; } break; case C_STATE_INIT: switch (event) { case ISIS_ENABLE: isis_circuit_configure (circuit, (struct isis_area *) arg); isis_circuit_up (circuit); circuit->state = C_STATE_UP; isis_event_circuit_state_change (circuit, 1); isis_listnode_delete (isis->init_circ_list, circuit); break; case IF_UP_FROM_Z: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already connected\n", config.name); break; case ISIS_DISABLE: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already disabled\n", config.name); break; case IF_DOWN_FROM_Z: // isis_circuit_if_del (circuit); isis_listnode_delete (isis->init_circ_list, circuit); isis_circuit_del (circuit); circuit = NULL; break; } break; case C_STATE_CONF: switch (event) { case ISIS_ENABLE: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already enabled\n", config.name); break; case IF_UP_FROM_Z: // isis_circuit_if_add (circuit, (struct interface *) arg); isis_circuit_up (circuit); circuit->state = C_STATE_UP; isis_event_circuit_state_change (circuit, 1); break; case ISIS_DISABLE: isis_circuit_deconfigure (circuit, (struct isis_area *) arg); isis_circuit_del (circuit); circuit = NULL; break; case IF_DOWN_FROM_Z: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already disconnected\n", config.name); break; } break; case C_STATE_UP: switch (event) { case ISIS_ENABLE: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already configured\n", config.name); break; case IF_UP_FROM_Z: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): circuit already connected\n", config.name); break; case ISIS_DISABLE: isis_circuit_deconfigure (circuit, (struct isis_area *) arg); isis_listnode_add (isis->init_circ_list, circuit); circuit->state = C_STATE_INIT; isis_event_circuit_state_change (circuit, 0); break; case IF_DOWN_FROM_Z: // isis_circuit_if_del (circuit); circuit->state = C_STATE_CONF; isis_event_circuit_state_change (circuit, 0); break; } break; default: Log(LOG_WARNING, "WARN ( %s/core/ISIS ): Invalid circuit state %d\n", config.name, old_state); } Log(LOG_DEBUG, "DEBUG ( %s/core/ISIS ): CSM_STATE_CHANGE: %s -> %s \n", config.name, STATE2STR (old_state), circuit ? STATE2STR (circuit->state) : STATE2STR (C_STATE_NA)); return circuit; }