In the name of simplicity, remove the interface FSM that was inherited
from ospfd. In ldpd interfaces are just up or down, so keeping a FSM
for that is an overkill. Now instead of calling if_fsm(), just call
if_update() whenever a relevant event occurs (status change, address
addition/removal).
Additional notes:
1 - s/if_act_/if_/
2 - Remove the IMSG_IFUP and IMSG_IFDOWN events. Now whenever an
interface changes its state a IMSG_IFSTATUS event will be generated
with the new status.
---
interface.c | 118 +++++++++---------------------------------------------------
kroute.c | 13 ++++---
ldpd.h | 19 ----------
ldpe.c | 21 ++---------
ldpe.h | 4 ++-
5 files changed, 28 insertions(+), 147 deletions(-)
diff --git a/interface.c b/interface.c
index 7c80d1e..62c2766 100644
--- a/interface.c
+++ b/interface.c
@@ -41,98 +41,9 @@
extern struct ldpd_conf *leconf;
-int if_act_start(struct iface *);
-int if_act_reset(struct iface *);
-int if_act_update(struct iface *);
void if_hello_timer(int, short, void *);
void if_start_hello_timer(struct iface *);
void if_stop_hello_timer(struct iface *);
-struct nbr *if_elect(struct nbr *, struct nbr *);
-
-struct {
- int state;
- enum iface_event event;
- enum iface_action action;
- int new_state;
-} iface_fsm[] = {
- /* current state event that happened action to take resulting state
*/
- {IF_STA_DOWN, IF_EVT_DOWN, IF_ACT_NOTHING, 0},
- {IF_STA_DOWN, IF_EVT_UP, IF_ACT_UPDATE, 0},
- {IF_STA_DOWN, IF_EVT_NEWADDR, IF_ACT_UPDATE, 0},
- {IF_STA_DOWN, IF_EVT_DELADDR, IF_ACT_NOTHING, 0},
- {IF_STA_ACTIVE, IF_EVT_DOWN, IF_ACT_RST, IF_STA_DOWN},
- {IF_STA_ACTIVE, IF_EVT_NEWADDR, IF_ACT_NOTHING, 0},
- {IF_STA_ACTIVE, IF_EVT_DELADDR, IF_ACT_UPDATE, 0},
- {-1, IF_EVT_NOTHING, IF_ACT_NOTHING, 0},
-};
-
-const char * const if_event_names[] = {
- "NOTHING",
- "UP",
- "DOWN",
- "NEWADDR",
- "DELADDR"
-};
-
-const char * const if_action_names[] = {
- "NOTHING",
- "UPDATE",
- "RESET"
-};
-
-int
-if_fsm(struct iface *iface, enum iface_event event)
-{
- int old_state;
- int new_state = 0;
- int i, ret = 0;
-
- old_state = iface->state;
-
- for (i = 0; iface_fsm[i].state != -1; i++)
- if ((iface_fsm[i].state & old_state) &&
- (iface_fsm[i].event == event)) {
- new_state = iface_fsm[i].new_state;
- break;
- }
-
- if (iface_fsm[i].state == -1) {
- /* event outside of the defined fsm, ignore it. */
- log_debug("if_fsm: interface %s, "
- "event %s not expected in state %s", iface->name,
- if_event_names[event], if_state_name(old_state));
- return (0);
- }
-
- switch (iface_fsm[i].action) {
- case IF_ACT_UPDATE:
- ret = if_act_update(iface);
- break;
- case IF_ACT_RST:
- ret = if_act_reset(iface);
- break;
- case IF_ACT_NOTHING:
- /* do nothing */
- break;
- }
-
- if (ret) {
- log_debug("if_fsm: error changing state for interface %s, "
- "event %s, state %s", iface->name, if_event_names[event],
- if_state_name(old_state));
- return (-1);
- }
-
- if (new_state != 0)
- iface->state = new_state;
-
- log_debug("if_fsm: event %s resulted in action %s and changing "
- "state for interface %s from %s to %s",
- if_event_names[event], if_action_names[iface_fsm[i].action],
- iface->name, if_state_name(old_state), if_state_name(iface->state));
-
- return (ret);
-}
struct iface *
if_new(struct kif *kif)
@@ -168,7 +79,7 @@ if_del(struct iface *iface)
struct if_addr *if_addr;
if (iface->state == IF_STA_ACTIVE)
- if_act_reset(iface);
+ if_reset(iface);
log_debug("if_del: interface %s", iface->name);
@@ -237,13 +148,14 @@ if_stop_hello_timer(struct iface *iface)
fatal("if_stop_hello_timer");
}
-/* actions */
int
-if_act_start(struct iface *iface)
+if_start(struct iface *iface)
{
struct in_addr addr;
struct timeval now;
+ log_debug("if_start: %s", iface->name);
+
gettimeofday(&now, NULL);
iface->uptime = now.tv_sec;
@@ -257,11 +169,13 @@ if_act_start(struct iface *iface)
}
int
-if_act_reset(struct iface *iface)
+if_reset(struct iface *iface)
{
struct in_addr addr;
struct adj *adj;
+ log_debug("if_reset: %s", iface->name);
+
while ((adj = LIST_FIRST(&iface->adj_list)) != NULL) {
LIST_REMOVE(adj, iface_entry);
adj_del(adj);
@@ -277,26 +191,26 @@ if_act_reset(struct iface *iface)
}
int
-if_act_update(struct iface *iface)
+if_update(struct iface *iface)
{
int ret;
if (iface->state == IF_STA_DOWN) {
- if (!((iface->flags & IFF_UP) &&
- LINK_STATE_IS_UP(iface->linkstate)))
- return (0);
-
- if (LIST_EMPTY(&iface->addr_list))
+ if (!(iface->flags & IFF_UP) ||
+ !LINK_STATE_IS_UP(iface->linkstate) ||
+ LIST_EMPTY(&iface->addr_list))
return (0);
iface->state = IF_STA_ACTIVE;
- ret = if_act_start(iface);
+ ret = if_start(iface);
} else {
- if (!LIST_EMPTY(&iface->addr_list))
+ if ((iface->flags & IFF_UP) &&
+ LINK_STATE_IS_UP(iface->linkstate) &&
+ !LIST_EMPTY(&iface->addr_list))
return (0);
iface->state = IF_STA_DOWN;
- ret = if_act_reset(iface);
+ ret = if_reset(iface);
}
return (ret);
diff --git a/kroute.c b/kroute.c
index 679f66d..a962ea1 100644
--- a/kroute.c
+++ b/kroute.c
@@ -136,7 +136,7 @@ kif_redistribute(void)
struct kif_addr *ka;
RB_FOREACH(kif, kif_tree, &kit) {
- main_imsg_compose_ldpe(IMSG_IFUP, 0, &kif->k,
+ main_imsg_compose_ldpe(IMSG_IFSTATUS, 0, &kif->k,
sizeof(struct kif));
TAILQ_FOREACH(ka, &kif->addrs, entry)
@@ -855,18 +855,17 @@ if_change(u_short ifindex, int flags, struct if_data *ifd,
link_new = (kif->k.flags & IFF_UP) &&
LINK_STATE_IS_UP(kif->k.link_state);
- if (link_new == link_old) {
- main_imsg_compose_ldpe(IMSG_IFSTATUS, 0, &kif->k,
- sizeof(struct kif));
+ if (link_new == link_old)
return;
- } else if (link_new) {
- main_imsg_compose_ldpe(IMSG_IFUP, 0, &kif->k,
+
+ if (link_new) {
+ main_imsg_compose_ldpe(IMSG_IFSTATUS, 0, &kif->k,
sizeof(struct kif));
TAILQ_FOREACH(ka, &kif->addrs, entry)
main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka->addr,
sizeof(struct kaddr));
} else {
- main_imsg_compose_ldpe(IMSG_IFDOWN, 0, &kif->k,
+ main_imsg_compose_ldpe(IMSG_IFSTATUS, 0, &kif->k,
sizeof(struct kif));
TAILQ_FOREACH(ka, &kif->addrs, entry)
main_imsg_compose_ldpe(IMSG_DELADDR, 0, &ka->addr,
diff --git a/ldpd.h b/ldpd.h
index 27e7138..f3718dd 100644
--- a/ldpd.h
+++ b/ldpd.h
@@ -85,8 +85,6 @@ enum imsg_type {
IMSG_KLABEL_CHANGE,
IMSG_KLABEL_DELETE,
IMSG_IFSTATUS,
- IMSG_IFUP,
- IMSG_IFDOWN,
IMSG_NEWADDR,
IMSG_DELADDR,
IMSG_LABEL_MAPPING,
@@ -117,23 +115,6 @@ enum imsg_type {
#define IF_STA_NEW 0x00 /* dummy state for reload */
#define IF_STA_DOWN 0x01
#define IF_STA_ACTIVE 0x02
-#define IF_STA_ANY (IF_STA_DOWN | IF_STA_ACTIVE)
-
-/* interface events */
-enum iface_event {
- IF_EVT_NOTHING,
- IF_EVT_UP,
- IF_EVT_DOWN,
- IF_EVT_NEWADDR,
- IF_EVT_DELADDR
-};
-
-/* interface actions */
-enum iface_action {
- IF_ACT_NOTHING,
- IF_ACT_UPDATE,
- IF_ACT_RST
-};
/* interface types */
enum iface_type {
diff --git a/ldpe.c b/ldpe.c
index d422603..9e2648f 100644
--- a/ldpe.c
+++ b/ldpe.c
@@ -264,10 +264,6 @@ ldpe_shutdown(void)
/* stop all interfaces */
while ((iface = LIST_FIRST(&leconf->iface_list)) != NULL) {
- if (if_fsm(iface, IF_EVT_DOWN)) {
- log_debug("error stopping interface %s",
- iface->name);
- }
LIST_REMOVE(iface, entry);
if_del(iface);
}
@@ -346,8 +342,6 @@ ldpe_dispatch_main(int fd, short event, void *bula)
switch (imsg.hdr.type) {
case IMSG_IFSTATUS:
- case IMSG_IFUP:
- case IMSG_IFDOWN:
if (imsg.hdr.len != IMSG_HEADER_SIZE +
sizeof(struct kif))
fatalx("IFINFO imsg with wrong len");
@@ -359,16 +353,7 @@ ldpe_dispatch_main(int fd, short event, void *bula)
iface->flags = kif->flags;
iface->linkstate = kif->link_state;
- switch (imsg.hdr.type) {
- case IMSG_IFUP:
- if_fsm(iface, IF_EVT_UP);
- break;
- case IMSG_IFDOWN:
- if_fsm(iface, IF_EVT_DOWN);
- break;
- default:
- break;
- }
+ if_update(iface);
break;
case IMSG_NEWADDR:
if (imsg.hdr.len != IMSG_HEADER_SIZE +
@@ -395,7 +380,7 @@ ldpe_dispatch_main(int fd, short event, void *bula)
if (iface) {
LIST_INSERT_HEAD(&iface->addr_list, if_addr,
iface_entry);
- if_fsm(iface, IF_EVT_NEWADDR);
+ if_update(iface);
}
break;
case IMSG_DELADDR:
@@ -417,7 +402,7 @@ ldpe_dispatch_main(int fd, short event, void *bula)
iface = if_lookup(kaddr->ifindex);
if (iface) {
LIST_REMOVE(if_addr, iface_entry);
- if_fsm(iface, IF_EVT_DELADDR);
+ if_update(iface);
}
RB_FOREACH(nbr, nbr_id_head, &nbrs_by_id) {
diff --git a/ldpe.h b/ldpe.h
index ffb5848..e380d65 100644
--- a/ldpe.h
+++ b/ldpe.h
@@ -136,7 +136,9 @@ void ldpe_fib_update(int);
void ldpe_iface_ctl(struct ctl_conn *, unsigned int);
/* interface.c */
-int if_fsm(struct iface *, enum iface_event);
+int if_start(struct iface *);
+int if_reset(struct iface *);
+int if_update(struct iface *);
struct iface *if_new(struct kif *);
void if_del(struct iface *);
--
1.9.1