summaryrefslogtreecommitdiff
path: root/zebra/zebra_rnh.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/zebra_rnh.c')
-rw-r--r--zebra/zebra_rnh.c76
1 files changed, 38 insertions, 38 deletions
diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c
index 9fc5afff0f..c9fb782ba6 100644
--- a/zebra/zebra_rnh.c
+++ b/zebra/zebra_rnh.c
@@ -355,7 +355,8 @@ static int zebra_rnh_apply_nht_rmap(int family, struct route_node *prn,
rmap_family = (family == AF_INET) ? AFI_IP : AFI_IP6;
if (prn && re) {
- for (nexthop = re->nexthop; nexthop; nexthop = nexthop->next) {
+ for (nexthop = re->ng.nexthop; nexthop;
+ nexthop = nexthop->next) {
ret = zebra_nht_route_map_check(rmap_family, proto,
&prn->p, re, nexthop);
if (ret != RMAP_DENYMATCH) {
@@ -373,12 +374,10 @@ static int zebra_rnh_apply_nht_rmap(int family, struct route_node *prn,
* Determine appropriate route (RE entry) resolving a tracked BGP route
* for BGP route for import.
*/
-static
-struct route_entry *zebra_rnh_resolve_import_entry(vrf_id_t vrfid,
- int family,
- struct route_node *nrn,
- struct rnh *rnh,
- struct route_node **prn)
+static struct route_entry *
+zebra_rnh_resolve_import_entry(vrf_id_t vrfid, int family,
+ struct route_node *nrn, struct rnh *rnh,
+ struct route_node **prn)
{
struct route_table *route_table;
struct route_node *rn;
@@ -397,15 +396,15 @@ struct route_entry *zebra_rnh_resolve_import_entry(vrf_id_t vrfid,
/* Unlock route node - we don't need to lock when walking the tree. */
route_unlock_node(rn);
- if (CHECK_FLAG(rnh->flags, ZEBRA_NHT_EXACT_MATCH) &&
- !prefix_same(&nrn->p, &rn->p))
+ if (CHECK_FLAG(rnh->flags, ZEBRA_NHT_EXACT_MATCH)
+ && !prefix_same(&nrn->p, &rn->p))
return NULL;
/* Identify appropriate route entry. */
- RNODE_FOREACH_RE(rn, re) {
- if (!CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED) &&
- CHECK_FLAG(re->flags, ZEBRA_FLAG_SELECTED) &&
- (re->type != ZEBRA_ROUTE_BGP))
+ RNODE_FOREACH_RE (rn, re) {
+ if (!CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED)
+ && CHECK_FLAG(re->flags, ZEBRA_FLAG_SELECTED)
+ && (re->type != ZEBRA_ROUTE_BGP))
break;
}
@@ -430,7 +429,7 @@ static void zebra_rnh_eval_import_check_entry(vrf_id_t vrfid, int family,
struct nexthop *nexthop;
if (re && (rnh->state == NULL)) {
- for (ALL_NEXTHOPS(re->nexthop, nexthop))
+ for (ALL_NEXTHOPS(re->ng, nexthop))
if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB)) {
state_changed = 1;
break;
@@ -561,7 +560,7 @@ static void zebra_rnh_process_static_routes(vrf_id_t vrfid, int family,
* be having multiple. We care here only about
* registered nexthops.
*/
- for (nexthop = sre->nexthop; nexthop;
+ for (nexthop = sre->ng.nexthop; nexthop;
nexthop = nexthop->next) {
switch (nexthop->type) {
case NEXTHOP_TYPE_IPV4:
@@ -628,11 +627,10 @@ static void zebra_rnh_process_static_routes(vrf_id_t vrfid, int family,
* Determine appropriate route (route entry) resolving a tracked
* nexthop.
*/
-static struct route_entry *zebra_rnh_resolve_nexthop_entry(vrf_id_t vrfid,
- int family,
- struct route_node *nrn,
- struct rnh *rnh,
- struct route_node **prn)
+static struct route_entry *
+zebra_rnh_resolve_nexthop_entry(vrf_id_t vrfid, int family,
+ struct route_node *nrn, struct rnh *rnh,
+ struct route_node **prn)
{
struct route_table *route_table;
struct route_node *rn;
@@ -658,12 +656,12 @@ static struct route_entry *zebra_rnh_resolve_nexthop_entry(vrf_id_t vrfid,
/* Do not resolve over default route unless allowed &&
* match route to be exact if so specified
*/
- if (is_default_prefix(&rn->p) &&
- !rnh_resolve_via_default(rn->p.family))
+ if (is_default_prefix(&rn->p)
+ && !rnh_resolve_via_default(rn->p.family))
return NULL;
/* Identify appropriate route entry. */
- RNODE_FOREACH_RE(rn, re) {
+ RNODE_FOREACH_RE (rn, re) {
if (CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED))
continue;
if (!CHECK_FLAG(re->flags, ZEBRA_FLAG_SELECTED))
@@ -676,11 +674,10 @@ static struct route_entry *zebra_rnh_resolve_nexthop_entry(vrf_id_t vrfid,
if (re->type == ZEBRA_ROUTE_NHRP) {
struct nexthop *nexthop;
- for (nexthop = re->nexthop;
- nexthop;
+ for (nexthop = re->ng.nexthop; nexthop;
nexthop = nexthop->next)
if (nexthop->type
- == NEXTHOP_TYPE_IFINDEX)
+ == NEXTHOP_TYPE_IFINDEX)
break;
if (nexthop)
break;
@@ -779,8 +776,8 @@ static void zebra_rnh_evaluate_entry(vrf_id_t vrfid, int family, int force,
/* Identify route entry (RE) resolving this tracked entry. */
if (type == RNH_IMPORT_CHECK_TYPE)
- re = zebra_rnh_resolve_import_entry(vrfid, family, nrn,
- rnh, &prn);
+ re = zebra_rnh_resolve_import_entry(vrfid, family, nrn, rnh,
+ &prn);
else
re = zebra_rnh_resolve_nexthop_entry(vrfid, family, nrn, rnh,
&prn);
@@ -820,8 +817,8 @@ static void zebra_rnh_clear_nhc_flag(vrf_id_t vrfid, int family,
/* Identify route entry (RIB) resolving this tracked entry. */
if (type == RNH_IMPORT_CHECK_TYPE)
- re = zebra_rnh_resolve_import_entry(vrfid, family, nrn,
- rnh, &prn);
+ re = zebra_rnh_resolve_import_entry(vrfid, family, nrn, rnh,
+ &prn);
else
re = zebra_rnh_resolve_nexthop_entry(vrfid, family, nrn, rnh,
&prn);
@@ -929,8 +926,8 @@ static void free_state(vrf_id_t vrf_id, struct route_entry *re,
return;
/* free RE and nexthops */
- zebra_deregister_rnh_static_nexthops(vrf_id, re->nexthop, rn);
- nexthops_free(re->nexthop);
+ zebra_deregister_rnh_static_nexthops(vrf_id, re->ng.nexthop, rn);
+ nexthops_free(re->ng.nexthop);
XFREE(MTYPE_RE, re);
}
@@ -953,7 +950,7 @@ static void copy_state(struct rnh *rnh, struct route_entry *re,
state->metric = re->metric;
state->vrf_id = re->vrf_id;
- route_entry_copy_nexthops(state, re->nexthop);
+ route_entry_copy_nexthops(state, re->ng.nexthop);
rnh->state = state;
}
@@ -998,8 +995,7 @@ static int send_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
re = rnh->state;
/* Get output stream. */
- s = client->obuf;
- stream_reset(s);
+ s = stream_new(ZEBRA_MAX_PACKET_SIZ);
zclient_create_header(s, cmd, vrf_id);
@@ -1019,12 +1015,14 @@ static int send_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
break;
}
if (re) {
+ stream_putc(s, re->type);
+ stream_putw(s, re->instance);
stream_putc(s, re->distance);
stream_putl(s, re->metric);
num = 0;
nump = stream_get_endp(s);
stream_putc(s, 0);
- for (nexthop = re->nexthop; nexthop; nexthop = nexthop->next)
+ for (nexthop = re->ng.nexthop; nexthop; nexthop = nexthop->next)
if ((CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB)
|| CHECK_FLAG(nexthop->flags,
NEXTHOP_FLAG_RECURSIVE))
@@ -1054,6 +1052,8 @@ static int send_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
}
stream_putc_at(s, nump, num);
} else {
+ stream_putc(s, 0); // type
+ stream_putw(s, 0); // instance
stream_putc(s, 0); // distance
stream_putl(s, 0); // metric
stream_putc(s, 0); // nexthops
@@ -1062,7 +1062,7 @@ static int send_client(struct rnh *rnh, struct zserv *client, rnh_type_t type,
client->nh_last_upd_time = monotime(NULL);
client->last_write_cmd = cmd;
- return zebra_server_send_message(client);
+ return zebra_server_send_message(client, s);
}
static void print_nh(struct nexthop *nexthop, struct vty *vty)
@@ -1115,7 +1115,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->nexthop; nexthop;
+ for (nexthop = rnh->state->ng.nexthop; nexthop;
nexthop = nexthop->next)
print_nh(nexthop, vty);
} else