]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_route.c
Merge pull request #2240 from donaldsharp/ubuntu_bull
[mirror_frr.git] / bgpd / bgp_route.c
index 19af159be0477d005dbbf0d05d234b9b88a8047d..7bfeee9669a00e37fe1dd6dd228c9f1c9eca3c61 100644 (file)
@@ -225,6 +225,11 @@ struct bgp_info *bgp_info_lock(struct bgp_info *binfo)
 
 struct bgp_info *bgp_info_unlock(struct bgp_info *binfo)
 {
+       /* unlink reference to parent, if any. */
+       if (binfo->extra && binfo->extra->parent) {
+               bgp_info_unlock((struct bgp_info *)binfo->extra->parent);
+               binfo->extra->parent = NULL;
+       }
        assert(binfo && binfo->lock > 0);
        binfo->lock--;
 
@@ -1336,6 +1341,8 @@ static void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr)
        }
        if (family == AF_INET6)
                memset(&attr->mp_nexthop_global, 0, IPV6_MAX_BYTELEN);
+       if (family == AF_EVPN)
+               memset(&attr->mp_nexthop_global_in, 0, BGP_ATTR_NHLEN_IPV4);
 }
 
 int subgroup_announce_check(struct bgp_node *rn, struct bgp_info *ri,
@@ -2367,15 +2374,13 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_node *rn,
                        if (bgp->adv_cmd_rmap[afi][safi].map) {
                                int ret = 0;
 
-                               ret =
-                                       route_map_apply(
-                                               bgp->adv_cmd_rmap[afi][safi].map,
-                                               &rn->p, RMAP_BGP, new_select);
+                               ret = route_map_apply(
+                                       bgp->adv_cmd_rmap[afi][safi].map,
+                                       &rn->p, RMAP_BGP, new_select);
                                if (ret == RMAP_MATCH)
-                                       bgp_evpn_advertise_type5_route(bgp,
-                                                                      &rn->p,
-                                                                      new_select->attr,
-                                                                      afi, safi);
+                                       bgp_evpn_advertise_type5_route(
+                                               bgp, &rn->p, new_select->attr,
+                                               afi, safi);
                        } else {
                                bgp_evpn_advertise_type5_route(bgp,
                                                               &rn->p,
@@ -4652,7 +4657,7 @@ static void bgp_static_update_safi(struct bgp *bgp, struct prefix *p,
                if (bgp_static->encap_tunneltype == BGP_ENCAP_TYPE_VXLAN) {
                        struct bgp_encap_type_vxlan bet;
                        memset(&bet, 0, sizeof(struct bgp_encap_type_vxlan));
-                       bet.vnid = p->u.prefix_evpn.eth_tag;
+                       bet.vnid = p->u.prefix_evpn.prefix_addr.eth_tag;
                        bgp_encap_type_vxlan_to_tlv(&bet, &attr);
                }
                if (bgp_static->router_mac) {
@@ -5127,10 +5132,10 @@ int bgp_static_set_safi(afi_t afi, safi_t safi, struct vty *vty,
                                return CMD_WARNING_CONFIG_FAILED;
                        }
                        if ((gw_ip.family == AF_INET
-                            && IS_EVPN_PREFIX_IPADDR_V6(
+                            && is_evpn_prefix_ipaddr_v6(
                                        (struct prefix_evpn *)&p))
                            || (gw_ip.family == AF_INET6
-                               && IS_EVPN_PREFIX_IPADDR_V4(
+                               && is_evpn_prefix_ipaddr_v4(
                                           (struct prefix_evpn *)&p))) {
                                vty_out(vty,
                                        "%% GatewayIp family differs with IP prefix\n");
@@ -6504,7 +6509,7 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
                                ? true
                                : false;
        bool nexthop_othervrf = false;
-       vrf_id_t nexthop_vrfid;
+       vrf_id_t nexthop_vrfid = VRF_DEFAULT;
        const char *nexthop_vrfname = "Default";
 
        if (json_paths)
@@ -7155,10 +7160,10 @@ void route_vty_out_overlay(struct vty *vty, struct prefix *p,
                vty_out(vty, "%s", str);
                XFREE(MTYPE_TMP, str);
 
-               if (IS_EVPN_PREFIX_IPADDR_V4((struct prefix_evpn *)p)) {
+               if (is_evpn_prefix_ipaddr_v4((struct prefix_evpn *)p)) {
                        vty_out(vty, "/%s",
                                inet_ntoa(attr->evpn_overlay.gw_ip.ipv4));
-               } else if (IS_EVPN_PREFIX_IPADDR_V6((struct prefix_evpn *)p)) {
+               } else if (is_evpn_prefix_ipaddr_v6((struct prefix_evpn *)p)) {
                        vty_out(vty, "/%s",
                                inet_ntop(AF_INET6,
                                          &(attr->evpn_overlay.gw_ip.ipv6), buf,
@@ -7409,7 +7414,6 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct prefix *p,
        json_object *json_cluster_list = NULL;
        json_object *json_cluster_list_list = NULL;
        json_object *json_ext_community = NULL;
-       json_object *json_lcommunity = NULL;
        json_object *json_last_update = NULL;
        json_object *json_pmsi = NULL;
        json_object *json_nexthop_global = NULL;
@@ -8036,13 +8040,12 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct prefix *p,
                /* Line 6 display Large community */
                if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES)) {
                        if (json_paths) {
-                               json_lcommunity = json_object_new_object();
-                               json_object_string_add(json_lcommunity,
-                                                      "string",
-                                                      attr->lcommunity->str);
+                               if (!attr->lcommunity->json)
+                                       lcommunity_str(attr->lcommunity, true);
+                               json_object_lock(attr->lcommunity->json);
                                json_object_object_add(json_path,
                                                       "largeCommunity",
-                                                      json_lcommunity);
+                                                      attr->lcommunity->json);
                        } else {
                                vty_out(vty, "      Large Community: %s\n",
                                        attr->lcommunity->str);
@@ -11424,14 +11427,15 @@ static void bgp_config_write_network_evpn(struct vty *vty, struct bgp *bgp,
                        prefix_rd2str(prd, rdbuf, sizeof(rdbuf));
                        if (p->u.prefix_evpn.route_type == 5) {
                                char local_buf[PREFIX_STRLEN];
-                               uint8_t family = IS_EVPN_PREFIX_IPADDR_V4((
+                               uint8_t family = is_evpn_prefix_ipaddr_v4((
                                                         struct prefix_evpn *)p)
                                                         ? AF_INET
                                                         : AF_INET6;
-                               inet_ntop(family, &p->u.prefix_evpn.ip.ip.addr,
+                               inet_ntop(family,
+                                         &p->u.prefix_evpn.prefix_addr.ip.ip.addr,
                                          local_buf, PREFIX_STRLEN);
                                sprintf(buf, "%s/%u", local_buf,
-                                       p->u.prefix_evpn.ip_prefix_length);
+                                       p->u.prefix_evpn.prefix_addr.ip_prefix_length);
                        } else {
                                prefix2str(p, buf, sizeof(buf));
                        }
@@ -11443,7 +11447,8 @@ static void bgp_config_write_network_evpn(struct vty *vty, struct bgp *bgp,
                                          sizeof(buf2));
                        vty_out(vty,
                                "  network %s rd %s ethtag %u label %u esi %s gwip %s routermac %s\n",
-                               buf, rdbuf, p->u.prefix_evpn.eth_tag,
+                               buf, rdbuf,
+                               p->u.prefix_evpn.prefix_addr.eth_tag,
                                decode_label(&bgp_static->label), esi, buf2,
                                macrouter);