On Wed, Mar 11, 2015 at 04:41:08PM -0300, Renato Westphal wrote:
> 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
> 

Looks good to me. Wonder if we lose any important log message because of
this. Anyway, now is the rigth time to move so OK claudio@

-- 
:wq Claudio

Reply via email to