]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_rnh.c
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / zebra / zebra_rnh.c
index 1494e3bed39be2adb5433b0ed7fbf1e1c131f07c..2d9c83becb7b6ee65926ca8f23d54fd321170cac 100644 (file)
@@ -384,7 +384,7 @@ static void zebra_rnh_clear_nexthop_rnh_filters(struct route_entry *re)
        struct nexthop *nexthop;
 
        if (re) {
-               for (nexthop = re->ng->nexthop; nexthop;
+               for (nexthop = re->nhe->nhg->nexthop; nexthop;
                     nexthop = nexthop->next) {
                        UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_RNH_FILTERED);
                }
@@ -403,7 +403,7 @@ static int zebra_rnh_apply_nht_rmap(afi_t afi, struct zebra_vrf *zvrf,
        route_map_result_t ret;
 
        if (prn && re) {
-               for (nexthop = re->ng->nexthop; nexthop;
+               for (nexthop = re->nhe->nhg->nexthop; nexthop;
                     nexthop = nexthop->next) {
                        ret = zebra_nht_route_map_check(
                                afi, proto, &prn->p, zvrf, re, nexthop);
@@ -688,7 +688,7 @@ zebra_rnh_resolve_nexthop_entry(struct zebra_vrf *zvrf, afi_t afi,
                        /* Just being SELECTED isn't quite enough - must
                         * have an installed nexthop to be useful.
                         */
-                       for (ALL_NEXTHOPS_PTR(re->ng, nexthop)) {
+                       for (ALL_NEXTHOPS_PTR(re->nhe->nhg, nexthop)) {
                                if (rnh_nexthop_valid(re, nexthop))
                                        break;
                        }
@@ -707,7 +707,8 @@ zebra_rnh_resolve_nexthop_entry(struct zebra_vrf *zvrf, afi_t afi,
                                        break;
                                if (re->type == ZEBRA_ROUTE_NHRP) {
 
-                                       for (nexthop = re->ng->nexthop; nexthop;
+                                       for (nexthop = re->nhe->nhg->nexthop;
+                                            nexthop;
                                             nexthop = nexthop->next)
                                                if (nexthop->type
                                                    == NEXTHOP_TYPE_IFINDEX)
@@ -940,8 +941,7 @@ static void free_state(vrf_id_t vrf_id, struct route_entry *re,
                return;
 
        /* free RE and nexthops */
-       nexthops_free(re->ng->nexthop);
-       nexthop_group_delete(&re->ng);
+       zebra_nhg_free(re->nhe);
        XFREE(MTYPE_RE, re);
 }
 
@@ -964,9 +964,11 @@ static void copy_state(struct rnh *rnh, struct route_entry *re,
        state->metric = re->metric;
        state->vrf_id = re->vrf_id;
        state->status = re->status;
-       state->ng = nexthop_group_new();
 
-       route_entry_copy_nexthops(state, re->ng->nexthop);
+       state->nhe = zebra_nhg_alloc();
+       state->nhe->nhg = nexthop_group_new();
+
+       nexthop_group_copy(state->nhe->nhg, re->nhe->nhg);
        rnh->state = state;
 }
 
@@ -984,10 +986,12 @@ static int compare_state(struct route_entry *r1, struct route_entry *r2)
        if (r1->metric != r2->metric)
                return 1;
 
-       if (r1->nexthop_num != r2->nexthop_num)
+       if (nexthop_group_nexthop_num(r1->nhe->nhg)
+           != nexthop_group_nexthop_num(r2->nhe->nhg))
                return 1;
 
-       if (nexthop_group_hash(r1->ng) != nexthop_group_hash(r2->ng))
+       if (nexthop_group_hash(r1->nhe->nhg) !=
+           nexthop_group_hash(r2->nhe->nhg))
                return 1;
 
        return 0;
@@ -1030,6 +1034,8 @@ static int send_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
                break;
        }
        if (re) {
+               struct zapi_nexthop znh;
+
                stream_putc(s, re->type);
                stream_putw(s, re->instance);
                stream_putc(s, re->distance);
@@ -1037,39 +1043,10 @@ static int send_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
                num = 0;
                nump = stream_get_endp(s);
                stream_putc(s, 0);
-               for (ALL_NEXTHOPS_PTR(re->ng, nh))
+               for (ALL_NEXTHOPS_PTR(re->nhe->nhg, nh))
                        if (rnh_nexthop_valid(re, nh)) {
-                               stream_putl(s, nh->vrf_id);
-                               stream_putc(s, nh->type);
-                               switch (nh->type) {
-                               case NEXTHOP_TYPE_IPV4:
-                               case NEXTHOP_TYPE_IPV4_IFINDEX:
-                                       stream_put_in_addr(s, &nh->gate.ipv4);
-                                       stream_putl(s, nh->ifindex);
-                                       break;
-                               case NEXTHOP_TYPE_IFINDEX:
-                                       stream_putl(s, nh->ifindex);
-                                       break;
-                               case NEXTHOP_TYPE_IPV6:
-                               case NEXTHOP_TYPE_IPV6_IFINDEX:
-                                       stream_put(s, &nh->gate.ipv6, 16);
-                                       stream_putl(s, nh->ifindex);
-                                       break;
-                               default:
-                                       /* do nothing */
-                                       break;
-                               }
-                               if (nh->nh_label) {
-                                       stream_putc(s,
-                                                   nh->nh_label->num_labels);
-                                       if (nh->nh_label->num_labels)
-                                               stream_put(
-                                                       s,
-                                                       &nh->nh_label->label[0],
-                                                       nh->nh_label->num_labels
-                                                               * sizeof(mpls_label_t));
-                               } else
-                                       stream_putc(s, 0);
+                               zapi_nexthop_from_nexthop(&znh, nh);
+                               zapi_nexthop_encode(s, &znh, 0 /* flags */);
                                num++;
                        }
                stream_putc_at(s, nump, num);
@@ -1137,7 +1114,7 @@ static void print_rnh(struct route_node *rn, struct vty *vty)
        if (rnh->state) {
                vty_out(vty, " resolved via %s\n",
                        zebra_route_string(rnh->state->type));
-               for (nexthop = rnh->state->ng->nexthop; nexthop;
+               for (nexthop = rnh->state->nhe->nhg->nexthop; nexthop;
                     nexthop = nexthop->next)
                        print_nh(nexthop, vty);
        } else