summaryrefslogtreecommitdiff
path: root/ospfd/ospf_zebra.c
diff options
context:
space:
mode:
authorpaul <paul>2003-06-19 02:11:23 +0000
committerpaul <paul>2003-06-19 02:11:23 +0000
commit72357f2b98032e06770c5d9ba713cf5f2796a391 (patch)
tree632e8d5e696239bbaf974c592cd6a73f84b0d4e1 /ospfd/ospf_zebra.c
parent5ec90d28c9268c54e000c2bcfb9b164abfacbacd (diff)
2003-06-19 Vladimir Ivaschenko <hazard@francoudi.com>
* ospfd/ospf_zebra.c: [zebra 19434] fix for disappearing OSPF routes modify ospf_zebra_delete() to specify nexthop when deleting routes with zebra.
Diffstat (limited to 'ospfd/ospf_zebra.c')
-rw-r--r--ospfd/ospf_zebra.c70
1 files changed, 45 insertions, 25 deletions
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index bdb0c0f5..81bf59af 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -309,7 +309,7 @@ ospf_interface_address_delete (int command, struct zclient *zclient,
return 0;
}
-
+
void
ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or)
{
@@ -333,7 +333,7 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or)
/* Distance value. */
distance = ospf_distance_apply (p, or);
if (distance)
- SET_FLAG (message, ZAPI_MESSAGE_DISTANCE);
+ SET_FLAG (message, ZAPI_MESSAGE_DISTANCE);
/* Make packet. */
s = zclient->obuf;
@@ -358,7 +358,7 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or)
/* Nexthop, ifindex, distance and metric information. */
for (node = listhead (or->path); node; nextnode (node))
- {
+ {
path = getdata (node);
if (path->nexthop.s_addr != INADDR_ANY)
@@ -374,6 +374,14 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or)
else
stream_putl (s, 0);
}
+
+ if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
+ {
+ zlog_info ("Zebra: Route add %s/%d nexthop %s",
+ inet_ntoa (p->prefix),
+ p->prefixlen,
+ inet_ntoa (path->nexthop));
+ }
}
if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE))
@@ -391,19 +399,6 @@ ospf_zebra_add (struct prefix_ipv4 *p, struct ospf_route *or)
stream_putw_at (s, 0, stream_get_endp (s));
writen (zclient->sock, s->data, stream_get_endp (s));
-
-#if 0
- if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
- {
- char *nexthop_str;
-
- nexthop_str = strdup (inet_ntoa (*nexthop));
- zlog_info ("Zebra: Route add %s/%d nexthop %s metric %d",
- inet_ntoa (p->prefix), p->prefixlen, nexthop_str,
- metric);
- free (nexthop_str);
- }
-#endif /* 0 */
}
}
@@ -411,25 +406,45 @@ void
ospf_zebra_delete (struct prefix_ipv4 *p, struct ospf_route *or)
{
struct zapi_ipv4 api;
+ struct ospf_path *path;
+ struct in_addr *nexthop;
+ listnode node;
if (zclient->redist[ZEBRA_ROUTE_OSPF])
{
api.type = ZEBRA_ROUTE_OSPF;
api.flags = 0;
api.message = 0;
- zapi_ipv4_delete (zclient, p, &api);
+ api.ifindex_num = 0;
+ api.nexthop_num = 0;
+ SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
-#if 0
- if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
+ for (node = listhead (or->path); node; nextnode (node))
{
- char *nexthop_str;
+ path = getdata (node);
+
+ if (path->nexthop.s_addr != INADDR_ANY)
+ {
+ api.nexthop_num = 1;
+ nexthop = &path->nexthop;
+ api.nexthop = &nexthop;
+ }
+ else
+ {
+ api.ifindex_num = 1;
+ api.ifindex = &path->oi->ifp->ifindex;
+ }
- nexthop_str = strdup (inet_ntoa (*nexthop));
- zlog_info ("Zebra: Route delete %s/%d nexthop %s",
- inet_ntoa (p->prefix), p->prefixlen, nexthop_str);
- free (nexthop_str);
+ zapi_ipv4_delete (zclient, p, &api);
+
+ if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE) && api.nexthop_num)
+ {
+ zlog_info ("Zebra: Route delete %s/%d nexthop %s",
+ inet_ntoa (p->prefix),
+ p->prefixlen,
+ inet_ntoa (**api.nexthop));
+ }
}
-#endif /* 0 */
}
}
@@ -466,6 +481,11 @@ ospf_zebra_delete_discard (struct prefix_ipv4 *p)
api.ifindex_num = 0;
zapi_ipv4_delete (zclient, p, &api);
+
+ if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
+ zlog_info ("Zebra: Route delete discard %s/%d",
+ inet_ntoa (p->prefix), p->prefixlen);
+
}
}