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

Reply via email to