On Mon, Jul 09, 2018 at 05:47:11PM +0200, Claudio Jeker wrote:
> Similar to the rde_filter code there is no need to path_get() the aspath
> used in rde_update_dispatch(). Also makes the code a bit easier since the
> cleanup can be done all the time.
>
looks good, compiles fine, runs well, OK denis@
> Index: rde.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
> retrieving revision 1.386
> diff -u -p -r1.386 rde.c
> --- rde.c 9 Jul 2018 14:44:02 -0000 1.386
> +++ rde.c 9 Jul 2018 14:50:21 -0000
> @@ -938,10 +938,10 @@ rde_dispatch_imsg_parent(struct imsgbuf
> int
> rde_update_dispatch(struct imsg *imsg)
> {
> + struct rde_aspath asp;
> struct bgpd_addr prefix;
> struct mpattr mpa;
> struct rde_peer *peer;
> - struct rde_aspath *asp = NULL;
> u_char *p, *mpp = NULL;
> int error = -1, pos = 0;
> u_int16_t afi, len, mplen;
> @@ -986,11 +986,11 @@ rde_update_dispatch(struct imsg *imsg)
> imsg->hdr.len - IMSG_HEADER_SIZE - 4 - withdrawn_len - attrpath_len;
> bzero(&mpa, sizeof(mpa));
>
> + path_prep(&asp);
> if (attrpath_len != 0) { /* 0 = no NLRI information in this message */
> /* parse path attributes */
> - asp = path_get();
> while (len > 0) {
> - if ((pos = rde_attr_parse(p, len, peer, asp,
> + if ((pos = rde_attr_parse(p, len, peer, &asp,
> &mpa)) < 0)
> goto done;
> p += pos;
> @@ -998,19 +998,19 @@ rde_update_dispatch(struct imsg *imsg)
> }
>
> /* check for missing but necessary attributes */
> - if ((subtype = rde_attr_missing(asp, peer->conf.ebgp,
> + if ((subtype = rde_attr_missing(&asp, peer->conf.ebgp,
> nlri_len))) {
> rde_update_err(peer, ERR_UPDATE, ERR_UPD_MISSNG_WK_ATTR,
> &subtype, sizeof(u_int8_t));
> goto done;
> }
>
> - rde_as4byte_fixup(peer, asp);
> + rde_as4byte_fixup(peer, &asp);
>
> /* enforce remote AS if requested */
> - if (asp->flags & F_ATTR_ASPATH &&
> + if (asp.flags & F_ATTR_ASPATH &&
> peer->conf.enforce_as == ENFORCE_AS_ON) {
> - fas = aspath_neighbor(asp->aspath);
> + fas = aspath_neighbor(asp.aspath);
> if (peer->conf.remote_as != fas) {
> log_peer_warnx(&peer->conf, "bad path, "
> "starting with %s, "
> @@ -1021,7 +1021,7 @@ rde_update_dispatch(struct imsg *imsg)
> }
> }
>
> - rde_reflector(peer, asp);
> + rde_reflector(peer, &asp);
> }
>
> p = imsg->data;
> @@ -1103,7 +1103,7 @@ rde_update_dispatch(struct imsg *imsg)
> goto done;
> }
>
> - if ((asp->flags & ~F_ATTR_MP_UNREACH) == 0 && mplen == 0) {
> + if ((asp.flags & ~F_ATTR_MP_UNREACH) == 0 && mplen == 0) {
> /* EoR marker */
> peer_recv_eor(peer, aid);
> }
> @@ -1166,7 +1166,7 @@ rde_update_dispatch(struct imsg *imsg)
> break;
> }
>
> - if ((asp->flags & ~F_ATTR_MP_UNREACH) == 0) {
> + if ((asp.flags & ~F_ATTR_MP_UNREACH) == 0) {
> error = 0;
> goto done;
> }
> @@ -1178,8 +1178,8 @@ rde_update_dispatch(struct imsg *imsg)
> /* aspath needs to be loop free nota bene this is not a hard error */
> if (peer->conf.ebgp &&
> peer->conf.enforce_local_as == ENFORCE_AS_ON &&
> - !aspath_loopfree(asp->aspath, peer->conf.local_as))
> - asp->flags |= F_ATTR_LOOP;
> + !aspath_loopfree(asp.aspath, peer->conf.local_as))
> + asp.flags |= F_ATTR_LOOP;
>
> /* parse nlri prefix */
> while (nlri_len > 0) {
> @@ -1208,7 +1208,7 @@ rde_update_dispatch(struct imsg *imsg)
> goto done;
> }
>
> - if (rde_update_update(peer, asp, &prefix, prefixlen) == -1)
> + if (rde_update_update(peer, &asp, &prefix, prefixlen) == -1)
> goto done;
>
> }
> @@ -1244,11 +1244,11 @@ rde_update_dispatch(struct imsg *imsg)
> * this works because asp is not linked.
> * But first unlock the previously locked nexthop.
> */
> - if (asp->nexthop) {
> - (void)nexthop_put(asp->nexthop);
> - asp->nexthop = NULL;
> + if (asp.nexthop) {
> + (void)nexthop_put(asp.nexthop);
> + asp.nexthop = NULL;
> }
> - if ((pos = rde_get_mp_nexthop(mpp, mplen, aid, asp)) == -1) {
> + if ((pos = rde_get_mp_nexthop(mpp, mplen, aid, &asp)) == -1) {
> log_peer_warnx(&peer->conf, "bad nlri prefix");
> rde_update_err(peer, ERR_UPDATE, ERR_UPD_OPTATTR,
> mpa.reach, mpa.reach_len);
> @@ -1279,7 +1279,7 @@ rde_update_dispatch(struct imsg *imsg)
> mpp += pos;
> mplen -= pos;
>
> - if (rde_update_update(peer, asp, &prefix,
> + if (rde_update_update(peer, &asp, &prefix,
> prefixlen) == -1)
> goto done;
> }
> @@ -1305,7 +1305,7 @@ rde_update_dispatch(struct imsg *imsg)
> mpp += pos;
> mplen -= pos;
>
> - if (rde_update_update(peer, asp, &prefix,
> + if (rde_update_update(peer, &asp, &prefix,
> prefixlen) == -1)
> goto done;
> }
> @@ -1317,10 +1317,7 @@ rde_update_dispatch(struct imsg *imsg)
> }
>
> done:
> - if (attrpath_len != 0) {
> - /* free allocated attribute memory that is no longer used */
> - path_put(asp);
> - }
> + path_clean(&asp);
>
> return (error);
> }
>