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;
}
}