Module Name: src Committed By: kefren Date: Wed Jul 24 09:05:53 UTC 2013
Modified Files: src/usr.sbin/ldpd: label.c label.h mpls_interface.c mpls_routes.c Log Message: * use a flag in label struct in order to determine if we should treat the associated routes using RTF_HOST * clean the mess in flush_mpls_routes that could result in accessing uninitialized memory To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/usr.sbin/ldpd/label.c cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/ldpd/label.h cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/ldpd/mpls_interface.c cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/ldpd/mpls_routes.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/ldpd/label.c diff -u src/usr.sbin/ldpd/label.c:1.9 src/usr.sbin/ldpd/label.c:1.10 --- src/usr.sbin/ldpd/label.c:1.9 Thu Jul 18 11:45:36 2013 +++ src/usr.sbin/ldpd/label.c Wed Jul 24 09:05:53 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: label.c,v 1.9 2013/07/18 11:45:36 kefren Exp $ */ +/* $NetBSD: label.c,v 1.10 2013/07/24 09:05:53 kefren Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -55,7 +55,7 @@ label_init() struct label * label_add(const union sockunion * so_dest, const union sockunion * so_pref, const union sockunion * so_gate, uint32_t binding, - const struct ldp_peer * p, uint32_t label) + const struct ldp_peer * p, uint32_t label, bool host) { struct label *l; char spreftmp[INET_ADDRSTRLEN]; @@ -83,6 +83,7 @@ label_add(const union sockunion * so_des l->binding = get_free_local_label(); l->p = p; l->label = label; + l->host = host; SLIST_INSERT_HEAD(&label_head, l, labels); @@ -125,12 +126,13 @@ label_reattach_route(struct label *l, in if (readd == REATT_INET_CHANGE) { /* Delete the tagged route and re-add IPv4 route */ delete_route(&l->so_dest, - l->so_pref.sa.sa_len != 0 ? &l->so_pref : NULL, NO_FREESO); + l->host ? NULL : &l->so_pref, NO_FREESO); add_route(&l->so_dest, - l->so_pref.sa.sa_len != 0 ? &l->so_pref : NULL, &l->so_gate, + l->host ? NULL : &l->so_pref, &l->so_gate, NULL, NULL, NO_FREESO, RTM_READD); } else if (readd == REATT_INET_DEL) - delete_route(&l->so_dest, &l->so_pref, NO_FREESO); + delete_route(&l->so_dest, l->host ? NULL : &l->so_pref, + NO_FREESO); /* Deletes the MPLS route */ if (l->binding >= min_label) Index: src/usr.sbin/ldpd/label.h diff -u src/usr.sbin/ldpd/label.h:1.6 src/usr.sbin/ldpd/label.h:1.7 --- src/usr.sbin/ldpd/label.h:1.6 Thu Jul 18 11:45:36 2013 +++ src/usr.sbin/ldpd/label.h Wed Jul 24 09:05:53 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: label.h,v 1.6 2013/07/18 11:45:36 kefren Exp $ */ +/* $NetBSD: label.h,v 1.7 2013/07/24 09:05:53 kefren Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -51,6 +51,7 @@ struct label { union sockunion so_dest, so_pref, so_gate; int binding, label; + bool host; /* change routes using RTF_HOST */ const struct ldp_peer *p; SLIST_ENTRY(label) labels; }; @@ -58,7 +59,8 @@ SLIST_HEAD(,label) label_head; void label_init(void); struct label * label_add(const union sockunion *, const union sockunion *, - const union sockunion *, uint32_t, const struct ldp_peer *, uint32_t); + const union sockunion *, uint32_t, const struct ldp_peer *, uint32_t, + bool); void label_del(struct label *); void del_all_peer_labels(const struct ldp_peer*, int); void label_reattach_all_peer_labels(const struct ldp_peer*, int); Index: src/usr.sbin/ldpd/mpls_interface.c diff -u src/usr.sbin/ldpd/mpls_interface.c:1.11 src/usr.sbin/ldpd/mpls_interface.c:1.12 --- src/usr.sbin/ldpd/mpls_interface.c:1.11 Thu Jul 18 11:45:36 2013 +++ src/usr.sbin/ldpd/mpls_interface.c Wed Jul 24 09:05:53 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_interface.c,v 1.11 2013/07/18 11:45:36 kefren Exp $ */ +/* $NetBSD: mpls_interface.c,v 1.12 2013/07/24 09:05:53 kefren Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -138,24 +138,9 @@ mpls_add_label(struct label *lab) fatalp("Out of memory\n"); return LDP_E_MEMORY; } -/* - if (so_oldifa != NULL) { - so_ifa = malloc(sizeof(*so_ifa)); - if (so_ifa == NULL) { - free(so_dest); - if (so_pref != NULL) - free(so_pref); - free(so_tag); - free(so_nexthop); - fatalp("Out of memory\n"); - return LDP_E_MEMORY; - } - memcpy(so_ifa, so_oldifa, so_oldifa->sa.sa_len); - } else - so_ifa = NULL; -*/ - if (add_route(&lab->so_dest, &lab->so_pref, &lab->so_gate, &so_ifa, - so_tag, NO_FREESO, RTM_CHANGE) != LDP_E_OK) { + + if (add_route(&lab->so_dest, lab->host ? NULL : &lab->so_pref, + &lab->so_gate, &so_ifa, so_tag, NO_FREESO, RTM_CHANGE) != LDP_E_OK){ free(so_tag); fatalp("[mpls_add_label]: INET route failure\n"); return LDP_E_ROUTE_ERROR; Index: src/usr.sbin/ldpd/mpls_routes.c diff -u src/usr.sbin/ldpd/mpls_routes.c:1.19 src/usr.sbin/ldpd/mpls_routes.c:1.20 --- src/usr.sbin/ldpd/mpls_routes.c:1.19 Sat Jul 20 05:16:08 2013 +++ src/usr.sbin/ldpd/mpls_routes.c Wed Jul 24 09:05:53 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_routes.c,v 1.19 2013/07/20 05:16:08 kefren Exp $ */ +/* $NetBSD: mpls_routes.c,v 1.20 2013/07/24 09:05:53 kefren Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -414,8 +414,10 @@ delete_route(union sockunion * so_dest, rm.m_rtm.rtm_seq = ++rt_seq; if (so_pref) rm.m_rtm.rtm_addrs = RTA_DST | RTA_NETMASK; - else + else { rm.m_rtm.rtm_addrs = RTA_DST; + rm.m_rtm.rtm_flags |= RTF_HOST; + } /* destination, gateway, netmask, genmask, ifp, ifa */ @@ -656,7 +658,8 @@ check_route(struct rt_msg * rg, uint rle /* Just add an IMPLNULL label */ if (so_gate == NULL) label_add(so_dest, so_pref, NULL, - MPLS_LABEL_IMPLNULL, NULL, 0); + MPLS_LABEL_IMPLNULL, NULL, 0, + rg->m_rtm.rtm_flags & RTF_HOST); else { pm = ldp_test_mapping(&so_dest->sa, prefixlen, &so_gate->sa); @@ -665,13 +668,15 @@ check_route(struct rt_msg * rg, uint rle * gets rewritten in mpls_add_label */ lab = label_add(so_dest, so_pref, so_gate, MPLS_LABEL_IMPLNULL, - pm->peer, pm->lm->label); + pm->peer, pm->lm->label, + rg->m_rtm.rtm_flags & RTF_HOST); if (lab != NULL) mpls_add_label(lab); free(pm); } else label_add(so_dest, so_pref, so_gate, - MPLS_LABEL_IMPLNULL, NULL, 0); + MPLS_LABEL_IMPLNULL, NULL, 0, + rg->m_rtm.rtm_flags & RTF_HOST); } } else /* We already know about this prefix */ fatalp("Binding already there for prefix %s/%d !\n", @@ -885,7 +890,9 @@ bind_current_routes() (so_gate->sa.sa_family == AF_MPLS)) { debugp("MPLS route to %s deleted.\n", inet_ntoa(so_dst->sin.sin_addr)); - delete_route(so_dst, so_pref, NO_FREESO); + delete_route(so_dst, + rtmes->rtm_flags & RTF_HOST ? NULL : so_pref, + NO_FREESO); if (rtmes->rtm_flags & RTF_HOST) free(so_pref); continue; @@ -896,7 +903,8 @@ bind_current_routes() if (so_gate == NULL || so_gate->sa.sa_family == AF_INET) label_add(so_dst, so_pref, so_gate, - MPLS_LABEL_IMPLNULL, NULL, 0); + MPLS_LABEL_IMPLNULL, NULL, 0, + rtmes->rtm_flags & RTF_HOST); if (rtmes->rtm_flags & RTF_HOST) free(so_pref); @@ -955,11 +963,12 @@ flush_mpls_routes() continue; } - if (rtm->rtm_addrs & RTA_GATEWAY) { - GETNEXT(so_gate, so_dst); + if ((rtm->rtm_addrs & RTA_GATEWAY) == 0) + continue; + GETNEXT(so_gate, so_dst); + + if ((rtm->rtm_flags & RTF_HOST) == 0) GETNEXT(so_pref, so_gate); - } else - GETNEXT(so_pref, so_dst); if (so_gate->sa.sa_family == AF_MPLS) { if (so_dst->sa.sa_family == AF_INET)