Adjust the way nlri get extracted from the MP attrs. Instead of
switch statements with a while loop for each case move the while loop out
and only do the nlri_get_* call in the switch statement. The mpp and mplen
adjustmens and the call to rde_update_update and rde_update_withdraw are
also moved to the while loop.

-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.527
diff -u -p -r1.527 rde.c
--- rde.c       17 Jun 2021 16:05:26 -0000      1.527
+++ rde.c       22 Jun 2021 17:49:22 -0000
@@ -1338,9 +1338,9 @@ rde_update_dispatch(struct rde_peer *pee
                        rde_peer_recv_eor(peer, aid);
                }
 
-               switch (aid) {
-               case AID_INET6:
-                       while (mplen > 0) {
+               while (mplen > 0) {
+                       switch (aid) {
+                       case AID_INET6:
                                if ((pos = nlri_get_prefix6(mpp, mplen,
                                    &prefix, &prefixlen)) == -1) {
                                        log_peer_warnx(&peer->conf,
@@ -1350,14 +1350,8 @@ rde_update_dispatch(struct rde_peer *pee
                                            mpa.unreach, mpa.unreach_len);
                                        goto done;
                                }
-                               mpp += pos;
-                               mplen -= pos;
-
-                               rde_update_withdraw(peer, &prefix, prefixlen);
-                       }
-                       break;
-               case AID_VPN_IPv4:
-                       while (mplen > 0) {
+                               break;
+                       case AID_VPN_IPv4:
                                if ((pos = nlri_get_vpn4(mpp, mplen,
                                    &prefix, &prefixlen, 1)) == -1) {
                                        log_peer_warnx(&peer->conf,
@@ -1367,14 +1361,8 @@ rde_update_dispatch(struct rde_peer *pee
                                            mpa.unreach, mpa.unreach_len);
                                        goto done;
                                }
-                               mpp += pos;
-                               mplen -= pos;
-
-                               rde_update_withdraw(peer, &prefix, prefixlen);
-                       }
-                       break;
-               case AID_VPN_IPv6:
-                       while (mplen > 0) {
+                               break;
+                       case AID_VPN_IPv6:
                                if ((pos = nlri_get_vpn6(mpp, mplen,
                                    &prefix, &prefixlen, 1)) == -1) {
                                        log_peer_warnx(&peer->conf,
@@ -1384,15 +1372,16 @@ rde_update_dispatch(struct rde_peer *pee
                                            mpa.unreach_len);
                                        goto done;
                                }
-                               mpp += pos;
-                               mplen -= pos;
-
-                               rde_update_withdraw(peer, &prefix, prefixlen);
+                               break;
+                       default:
+                               /* ignore unsupported multiprotocol AF */
+                               break;
                        }
-                       break;
-               default:
-                       /* silently ignore unsupported multiprotocol AF */
-                       break;
+
+                       mpp += pos;
+                       mplen -= pos;
+
+                       rde_update_withdraw(peer, &prefix, prefixlen);
                }
 
                if ((state.aspath.flags & ~F_ATTR_MP_UNREACH) == 0)
@@ -1466,9 +1455,9 @@ rde_update_dispatch(struct rde_peer *pee
                mpp += pos;
                mplen -= pos;
 
-               switch (aid) {
-               case AID_INET6:
-                       while (mplen > 0) {
+               while (mplen > 0) {
+                       switch (aid) {
+                       case AID_INET6:
                                if ((pos = nlri_get_prefix6(mpp, mplen,
                                    &prefix, &prefixlen)) == -1) {
                                        log_peer_warnx(&peer->conf,
@@ -1478,16 +1467,8 @@ rde_update_dispatch(struct rde_peer *pee
                                            mpa.reach, mpa.reach_len);
                                        goto done;
                                }
-                               mpp += pos;
-                               mplen -= pos;
-
-                               if (rde_update_update(peer, &state, &prefix,
-                                   prefixlen) == -1)
-                                       goto done;
-                       }
-                       break;
-               case AID_VPN_IPv4:
-                       while (mplen > 0) {
+                               break;
+                       case AID_VPN_IPv4:
                                if ((pos = nlri_get_vpn4(mpp, mplen,
                                    &prefix, &prefixlen, 0)) == -1) {
                                        log_peer_warnx(&peer->conf,
@@ -1497,16 +1478,8 @@ rde_update_dispatch(struct rde_peer *pee
                                            mpa.reach, mpa.reach_len);
                                        goto done;
                                }
-                               mpp += pos;
-                               mplen -= pos;
-
-                               if (rde_update_update(peer, &state, &prefix,
-                                   prefixlen) == -1)
-                                       goto done;
-                       }
-                       break;
-               case AID_VPN_IPv6:
-                       while (mplen > 0) {
+                               break;
+                       case AID_VPN_IPv6:
                                if ((pos = nlri_get_vpn6(mpp, mplen,
                                    &prefix, &prefixlen, 0)) == -1) {
                                        log_peer_warnx(&peer->conf,
@@ -1516,17 +1489,18 @@ rde_update_dispatch(struct rde_peer *pee
                                            mpa.reach, mpa.reach_len);
                                        goto done;
                                }
-                               mpp += pos;
-                               mplen -= pos;
-
-                               if (rde_update_update(peer, &state, &prefix,
-                                   prefixlen) == -1)
-                                       goto done;
+                               break;
+                       default:
+                               /* ignore unsupported multiprotocol AF */
+                               break;
                        }
-                       break;
-               default:
-                       /* silently ignore unsupported multiprotocol AF */
-                       break;
+
+                       mpp += pos;
+                       mplen -= pos;
+
+                       if (rde_update_update(peer, &state,
+                           &prefix, prefixlen) == -1)
+                               goto done;
                }
        }
 

Reply via email to