There is no need to loop over the full attribute space if there are no
attributes left to dump and the type is bigger then the last known one
(which is ATTR_LARGE_COMMUNITIES).
Gprof agrees with me. Before:
[28] 3.5 182.55 16.48 16460587 up_generate_attr [28]
after:
[58] 0.7 25.09 16.83 16687626 up_generate_attr [58]
Goes from 180s down to 30s of self time.
OK?
--
:wq Claudio
Index: rde_update.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_update.c,v
retrieving revision 1.111
diff -u -p -r1.111 rde_update.c
--- rde_update.c 13 May 2019 21:13:04 -0000 1.111
+++ rde_update.c 27 May 2019 12:21:24 -0000
@@ -518,6 +518,10 @@ up_generate_attr(u_char *buf, int len, s
}
break;
default:
+ if (oa == NULL && type > ATTR_LARGE_COMMUNITIES)
+ /* there is no attribute left to dump */
+ goto done;
+
if (oa == NULL || oa->type != type)
break;
@@ -537,9 +541,10 @@ up_generate_attr(u_char *buf, int len, s
return (-1);
break;
}
- wlen += r; len -= r;
+ wlen += r;
+ len -= r;
}
-
+done:
return (wlen);
}