On Wed, Mar 30, 2022 at 03:10:58PM +0200, Theo Buehler wrote:
> On Wed, Mar 30, 2022 at 02:38:54PM +0200, Claudio Jeker wrote:
> > Change the code to use less goto and instead use a while loop.
> > I think the result is easier to understand.
> 
> Yes this is clearer and preserves the current logic, so I'm ok with it.
> 
> Here's an alternative approach: unless I'm missing something, the only
> case that actually redoes the while loop and cares about new is if the
> TAILQ_NEXT() returns an eligible prefix, so I think the below diff is
> equivalent to yours (regress is still happy). I also removed various
> new = NULL since nothing looks at new afterward.

Agreed, this is even better. OK claudio@
 
> Index: rde_update.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde_update.c,v
> retrieving revision 1.138
> diff -u -p -r1.138 rde_update.c
> --- rde_update.c      22 Mar 2022 10:53:08 -0000      1.138
> +++ rde_update.c      30 Mar 2022 12:54:02 -0000
> @@ -117,12 +117,7 @@ up_generate_updates(struct filter_head *
>               prefixlen = new->pt->prefixlen;
>       }
>  
> -again:
> -     if (new == NULL) {
> -             /* withdraw prefix */
> -             if ((p = prefix_adjout_get(peer, 0, &addr, prefixlen)) != NULL)
> -                     prefix_adjout_withdraw(p);
> -     } else {
> +     while (new != NULL) {
>               need_withdraw = 0;
>               /*
>                * up_test_update() needs to run before the output filters
> @@ -142,10 +137,8 @@ again:
>                * skip the filters.
>                */
>               if (need_withdraw &&
> -                 !(peer->flags & PEERFLAG_EVALUATE_ALL)) {
> -                     new = NULL;
> -                     goto again;
> -             }
> +                 !(peer->flags & PEERFLAG_EVALUATE_ALL))
> +                     break;
>  
>               rde_filterstate_prep(&state, prefix_aspath(new),
>                   prefix_communities(new), prefix_nexthop(new),
> @@ -153,19 +146,19 @@ again:
>               if (rde_filter(rules, peer, prefix_peer(new), &addr,
>                   prefixlen, prefix_vstate(new), &state) == ACTION_DENY) {
>                       rde_filterstate_clean(&state);
> -                     if (peer->flags & PEERFLAG_EVALUATE_ALL)
> +                     if (peer->flags & PEERFLAG_EVALUATE_ALL) {
>                               new = TAILQ_NEXT(new, entry.list.rib);
> -                     else
> -                             new = NULL;
> -                     if (new != NULL && !prefix_eligible(new))
> -                             new = NULL;
> -                     goto again;
> +                             if (new != NULL && prefix_eligible(new))
> +                                     continue;
> +                     }
> +                     break;
>               }
>  
> -             if (need_withdraw) {
> -                     new = NULL;
> -                     goto again;
> -             }
> +             /* check if this was actually a withdraw */
> +             if (need_withdraw)
> +                     break;
> +
> +             /* from here on we know this is an update */
>  
>               up_prep_adjout(peer, &state, addr.aid);
>               prefix_adjout_update(peer, &state, &addr,
> @@ -181,7 +174,13 @@ again:
>                       rde_update_err(peer, ERR_CEASE,
>                           ERR_CEASE_MAX_SENT_PREFIX, NULL, 0);
>               }
> +
> +             return;
>       }
> +
> +     /* withdraw prefix */
> +     if ((p = prefix_adjout_get(peer, 0, &addr, prefixlen)) != NULL)
> +             prefix_adjout_withdraw(p);
>  }
>  
>  struct rib_entry *rib_add(struct rib *, struct bgpd_addr *, int);
> 

-- 
:wq Claudio

Reply via email to