summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
authorpaul <paul>2004-05-09 09:09:59 +0000
committerpaul <paul>2004-05-09 09:09:59 +0000
commitb9df2d25fc8d06ca63fa792d162d97656361338b (patch)
tree53ec5975f608983b5cb95ee38ca112934db5e609 /zebra
parent0a5893596774554f039222c481d235de0f35d99e (diff)
2004-05-09 Paul Jakma <paul@dishone.st>
* zserv.c: (zsend_route_multipath) Set the nexthop_num field correctly. Add NEXTHOP_TYPE_IPV6_IFNAME for v6. Conditionally set ZAPI_MESSAGE_METRIC flag - only for adds. (zsend_ipv4_add) cruft, deleted. (zsend_ipv4_delete) ditto. (zsend_ipv6_add) ditto. (zsend_ipv6_delete) ditto. 2004-05-09 Sowmini Varadhan <sowmini.varadhan@sun.com> * zserv.c: (zsend_ipv{4,6}_{add,delete}_multipath) collapsed into single zsend_route_multipath function. (zsend_interface_{up,down}) collapsed into zsend_interface_update. (zsend_interface_address_{add,delete}) collapsed into zsend_interface_address. (zsend_interface_add) send mtu6. (zsend_interface_delete) ditto. (zebra_write) remove unused function. (various) Apply static qualifier. Add comments. * zserv.h: Definitions changed as per above. * redistribute.c: Changes as per zserv.c.
Diffstat (limited to 'zebra')
-rw-r--r--zebra/ChangeLog24
-rw-r--r--zebra/redistribute.c32
-rw-r--r--zebra/zserv.c696
-rw-r--r--zebra/zserv.h65
4 files changed, 249 insertions, 568 deletions
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 981c85ce..a543da8e 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,27 @@
+2004-05-09 Paul Jakma <paul@dishone.st>
+
+ * zserv.c: (zsend_route_multipath) Set the nexthop_num
+ field correctly. Add NEXTHOP_TYPE_IPV6_IFNAME for v6.
+ Conditionally set ZAPI_MESSAGE_METRIC flag - only for adds.
+ (zsend_ipv4_add) cruft, deleted.
+ (zsend_ipv4_delete) ditto.
+ (zsend_ipv6_add) ditto.
+ (zsend_ipv6_delete) ditto.
+
+2004-05-09 Sowmini Varadhan <sowmini.varadhan@sun.com>
+
+ * zserv.c: (zsend_ipv{4,6}_{add,delete}_multipath) collapsed
+ into single zsend_route_multipath function.
+ (zsend_interface_{up,down}) collapsed into zsend_interface_update.
+ (zsend_interface_address_{add,delete}) collapsed into
+ zsend_interface_address.
+ (zsend_interface_add) send mtu6.
+ (zsend_interface_delete) ditto.
+ (zebra_write) remove unused function.
+ (various) Apply static qualifier. Add comments.
+ * zserv.h: Definitions changed as per above.
+ * redistribute.c: Changes as per zserv.c.
+
2004-04-06 Krzysztof Oledzki <oleq@ans.pl>
* rt_netlink.c: Do not ignore metric when reading kernel routing
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index 2d30f790..ae61a448 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -107,7 +107,7 @@ zebra_redistribute_default (struct zserv *client)
for (newrib = rn->info; newrib; newrib = newrib->next)
if (CHECK_FLAG (newrib->flags, ZEBRA_FLAG_SELECTED)
&& newrib->distance != DISTANCE_INFINITY)
- zsend_ipv4_add_multipath (client, &rn->p, newrib);
+ zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, &rn->p, newrib);
route_unlock_node (rn);
}
}
@@ -127,7 +127,7 @@ zebra_redistribute_default (struct zserv *client)
for (newrib = rn->info; newrib; newrib = newrib->next)
if (CHECK_FLAG (newrib->flags, ZEBRA_FLAG_SELECTED)
&& newrib->distance != DISTANCE_INFINITY)
- zsend_ipv6_add_multipath (client, &rn->p, newrib);
+ zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, &rn->p, newrib);
route_unlock_node (rn);
}
}
@@ -150,7 +150,7 @@ zebra_redistribute (struct zserv *client, int type)
&& newrib->type == type
&& newrib->distance != DISTANCE_INFINITY
&& zebra_check_addr (&rn->p))
- zsend_ipv4_add_multipath (client, &rn->p, newrib);
+ zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, &rn->p, newrib);
#ifdef HAVE_IPV6
table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
@@ -161,7 +161,7 @@ zebra_redistribute (struct zserv *client, int type)
&& newrib->type == type
&& newrib->distance != DISTANCE_INFINITY
&& zebra_check_addr (&rn->p))
- zsend_ipv6_add_multipath (client, &rn->p, newrib);
+ zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, &rn->p, newrib);
#endif /* HAVE_IPV6 */
}
@@ -179,20 +179,20 @@ redistribute_add (struct prefix *p, struct rib *rib)
if (client->redist_default || client->redist[rib->type])
{
if (p->family == AF_INET)
- zsend_ipv4_add_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
- zsend_ipv6_add_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
#endif /* HAVE_IPV6 */
}
}
else if (client->redist[rib->type])
{
if (p->family == AF_INET)
- zsend_ipv4_add_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV4_ROUTE_ADD, client, p, rib);
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
- zsend_ipv6_add_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV6_ROUTE_ADD, client, p, rib);
#endif /* HAVE_IPV6 */
}
}
@@ -216,20 +216,20 @@ redistribute_delete (struct prefix *p, struct rib *rib)
if (client->redist_default || client->redist[rib->type])
{
if (p->family == AF_INET)
- zsend_ipv4_delete_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p, rib);
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
- zsend_ipv6_delete_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p, rib);
#endif /* HAVE_IPV6 */
}
}
else if (client->redist[rib->type])
{
if (p->family == AF_INET)
- zsend_ipv4_delete_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV4_ROUTE_DELETE, client, p, rib);
#ifdef HAVE_IPV6
if (p->family == AF_INET6)
- zsend_ipv6_delete_multipath (client, p, rib);
+ zsend_route_multipath (ZEBRA_IPV6_ROUTE_DELETE, client, p, rib);
#endif /* HAVE_IPV6 */
}
}
@@ -313,7 +313,7 @@ zebra_interface_up_update (struct interface *ifp)
for (node = listhead (zebrad.client_list); node; nextnode (node))
if ((client = getdata (node)) != NULL)
- zsend_interface_up (client, ifp);
+ zsend_interface_update (ZEBRA_INTERFACE_UP, client, ifp);
}
/* Interface down information. */
@@ -328,7 +328,7 @@ zebra_interface_down_update (struct interface *ifp)
for (node = listhead (zebrad.client_list); node; nextnode (node))
if ((client = getdata (node)) != NULL)
- zsend_interface_down (client, ifp);
+ zsend_interface_update (ZEBRA_INTERFACE_DOWN, client, ifp);
}
/* Interface information update. */
@@ -383,7 +383,7 @@ zebra_interface_address_add_update (struct interface *ifp,
for (node = listhead (zebrad.client_list); node; nextnode (node))
if ((client = getdata (node)) != NULL)
if (client->ifinfo && CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- zsend_interface_address_add (client, ifp, ifc);
+ zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_ADD, client, ifp, ifc);
}
/* Interface address deletion. */
@@ -407,5 +407,5 @@ zebra_interface_address_delete_update (struct interface *ifp,
for (node = listhead (zebrad.client_list); node; nextnode (node))
if ((client = getdata (node)) != NULL)
if (client->ifinfo && CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- zsend_interface_address_delete (client, ifp, ifc);
+ zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_DELETE, client, ifp, ifc);
}
diff --git a/zebra/zserv.c b/zebra/zserv.c
index c623151e..3c582afb 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -45,12 +45,12 @@ enum event { ZEBRA_SERV, ZEBRA_READ, ZEBRA_WRITE };
extern struct zebra_t zebrad;
-void zebra_event (enum event event, int sock, struct zserv *client);
+static void zebra_event (enum event event, int sock, struct zserv *client);
extern struct zebra_privs_t zserv_privs;
/* For logging of zebra meesages. */
-char *zebra_command_str [] =
+static char *zebra_command_str [] =
{
"NULL",
"ZEBRA_INTERFACE_ADD",
@@ -172,6 +172,16 @@ zebra_server_send_message (int sock, u_char *buf, unsigned long length)
}
/* Interface is added. Send ZEBRA_INTERFACE_ADD to client. */
+/*
+ * This function is called in the following situations:
+ * - in response to a 3-byte ZEBRA_INTERFACE_ADD request
+ * from the client.
+ * - at startup, when zebra figures out the available interfaces
+ * - when an interface is added (where support for
+ * RTM_IFANNOUNCE or AF_NETLINK sockets is available), or when
+ * an interface is marked IFF_UP (i.e., an RTM_IFINFO message is
+ * received)
+ */
int
zsend_interface_add (struct zserv *client, struct interface *ifp)
{
@@ -197,6 +207,7 @@ zsend_interface_add (struct zserv *client, struct interface *ifp)
stream_putl (s, ifp->flags);
stream_putl (s, ifp->metric);
stream_putl (s, ifp->mtu);
+ stream_putl (s, ifp->mtu6);
stream_putl (s, ifp->bandwidth);
#ifdef HAVE_SOCKADDR_DL
stream_put (s, &ifp->sdl, sizeof (ifp->sdl));
@@ -215,6 +226,12 @@ zsend_interface_add (struct zserv *client, struct interface *ifp)
}
/* Interface deletion from zebra daemon. */
+/*
+ * This function is only called when support for
+ * RTM_IFANNOUNCE or AF_NETLINK sockets (RTM_DELLINK message)
+ * is available. It is not called on Solaris.
+ */
+#if (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK))
int
zsend_interface_delete (struct zserv *client, struct interface *ifp)
{
@@ -238,6 +255,7 @@ zsend_interface_delete (struct zserv *client, struct interface *ifp)
stream_putl (s, ifp->flags);
stream_putl (s, ifp->metric);
stream_putl (s, ifp->mtu);
+ stream_putl (s, ifp->mtu6);
stream_putl (s, ifp->bandwidth);
/* Write packet length. */
@@ -247,12 +265,49 @@ zsend_interface_delete (struct zserv *client, struct interface *ifp)
return 0;
}
+#endif /* (defined(RTM_IFANNOUNCE) || defined(HAVE_LINUX_RTNETLINK_H)) */
-/* Interface address is added. Send ZEBRA_INTERFACE_ADDRESS_ADD to the
- client. */
+/* Interface address is added/deleted. Send ZEBRA_INTERFACE_ADDRESS_ADD or
+ * ZEBRA_INTERFACE_ADDRESS_DELETE to the client.
+ *
+ * A ZEBRA_INTERFACE_ADDRESS_ADD is sent in the following situations:
+ * - in response to a 3-byte ZEBRA_INTERFACE_ADD request
+ * from the client, after the ZEBRA_INTERFACE_ADD has been
+ * sent from zebra to the client
+ * - redistribute new address info to all clients in the following situations
+ * - at startup, when zebra figures out the available interfaces
+ * - when an interface is added (where support for
+ * RTM_IFANNOUNCE or AF_NETLINK sockets is available), or when
+ * an interface is marked IFF_UP (i.e., an RTM_IFINFO message is
+ * received)
+ * - for the vty commands "ip address A.B.C.D/M [<secondary>|<label LINE>]"
+ * and "no bandwidth <1-10000000>", "ipv6 address X:X::X:X/M"
+ * - when an RTM_NEWADDR message is received from the kernel,
+ *
+ * The call tree that triggers ZEBRA_INTERFACE_ADDRESS_DELETE:
+ *
+ * zsend_interface_address(DELETE)
+ * ^
+ * |
+ * zebra_interface_address_delete_update
+ * ^ ^ ^
+ * | | if_delete_update (not called on
+ * | | Solaris)
+ * ip_address_uninstall connected_delete_ipv4
+ * [ipv6_addresss_uninstall] [connected_delete_ipv6]
+ * ^ ^
+ * | |
+ * | RTM_NEWADDR on routing/netlink socket
+ * |
+ * vty commands:
+ * "no ip address A.B.C.D/M [label LINE]"
+ * "no ip address A.B.C.D/M secondary"
+ * ["no ipv6 address X:X::X:X/M"]
+ *
+ */
int
-zsend_interface_address_add (struct zserv *client, struct interface *ifp,
- struct connected *ifc)
+zsend_interface_address (int cmd, struct zserv *client,
+ struct interface *ifp, struct connected *ifc)
{
int blen;
struct stream *s;
@@ -268,7 +323,7 @@ zsend_interface_address_add (struct zserv *client, struct interface *ifp,
/* Place holder for size. */
stream_putw (s, 0);
- stream_putc (s, ZEBRA_INTERFACE_ADDRESS_ADD);
+ stream_putc (s, cmd);
stream_putl (s, ifp->ifindex);
/* Interface address flag. */
@@ -279,6 +334,12 @@ zsend_interface_address_add (struct zserv *client, struct interface *ifp,
stream_putc (s, p->family);
blen = prefix_blen (p);
stream_put (s, &p->u.prefix, blen);
+
+ /*
+ * XXX gnu version does not send prefixlen for ZEBRA_INTERFACE_ADDRESS_DELETE
+ * but zebra_interface_address_delete_read() in the gnu version
+ * expects to find it
+ */
stream_putc (s, p->prefixlen);
/* Destination. */
@@ -296,89 +357,18 @@ zsend_interface_address_add (struct zserv *client, struct interface *ifp,
return 0;
}
-/* Interface address is deleted. Send ZEBRA_INTERFACE_ADDRESS_DELETE
- to the client. */
-int
-zsend_interface_address_delete (struct zserv *client, struct interface *ifp,
- struct connected *ifc)
-{
- int blen;
- struct stream *s;
- struct prefix *p;
-
- /* Check this client need interface information. */
- if (! client->ifinfo)
- return -1;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- stream_putc (s, ZEBRA_INTERFACE_ADDRESS_DELETE);
- stream_putl (s, ifp->ifindex);
-
- /* Interface address flag. */
- stream_putc (s, ifc->flags);
-
- /* Prefix information. */
- p = ifc->address;
- stream_putc (s, p->family);
- blen = prefix_blen (p);
- stream_put (s, &p->u.prefix, blen);
-
- p = ifc->destination;
- if (p)
- stream_put (s, &p->u.prefix, blen);
- else
- stream_put (s, NULL, blen);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-
-int
-zsend_interface_up (struct zserv *client, struct interface *ifp)
-{
- struct stream *s;
-
- /* Check this client need interface information. */
- if (! client->ifinfo)
- return -1;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Zebra command. */
- stream_putc (s, ZEBRA_INTERFACE_UP);
-
- /* Interface information. */
- stream_put (s, ifp->name, INTERFACE_NAMSIZ);
- stream_putl (s, ifp->ifindex);
- stream_putc (s, ifp->status);
- stream_putl (s, ifp->flags);
- stream_putl (s, ifp->metric);
- stream_putl (s, ifp->mtu);
- stream_putl (s, ifp->bandwidth);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-
+/*
+ * The cmd passed to zsend_interface_update may be ZEBRA_INTERFACE_UP or
+ * ZEBRA_INTERFACE_DOWN.
+ *
+ * The ZEBRA_INTERFACE_UP message is sent from the zebra server to
+ * the clients in one of 2 situations:
+ * - an if_up is detected e.g., as a result of an RTM_IFINFO message
+ * - a vty command modifying the bandwidth of an interface is received.
+ * The ZEBRA_INTERFACE_DOWN message is sent when an if_down is detected.
+ */
int
-zsend_interface_down (struct zserv *client, struct interface *ifp)
+zsend_interface_update (int cmd, struct zserv *client, struct interface *ifp)
{
struct stream *s;
@@ -393,7 +383,7 @@ zsend_interface_down (struct zserv *client, struct interface *ifp)
stream_putw (s, 0);
/* Zebra command. */
- stream_putc (s, ZEBRA_INTERFACE_DOWN);
+ stream_putc (s, cmd);
/* Interface information. */
stream_put (s, ifp->name, INTERFACE_NAMSIZ);
@@ -402,6 +392,7 @@ zsend_interface_down (struct zserv *client, struct interface *ifp)
stream_putl (s, ifp->flags);
stream_putl (s, ifp->metric);
stream_putl (s, ifp->mtu);
+ stream_putl (s, ifp->mtu6);
stream_putl (s, ifp->bandwidth);
/* Write packet size. */
@@ -412,16 +403,40 @@ zsend_interface_down (struct zserv *client, struct interface *ifp)
return 0;
}
+/*
+ * The zebra server sends the clients a ZEBRA_IPV4_ROUTE_ADD or a
+ * ZEBRA_IPV6_ROUTE_ADD via zsend_route_multipath in the following
+ * situations:
+ * - when the client starts up, and requests default information
+ * by sending a ZEBRA_REDISTRIBUTE_DEFAULT_ADD to the zebra server, in the
+ * - case of rip, ripngd, ospfd and ospf6d, when the client sends a
+ * ZEBRA_REDISTRIBUTE_ADD as a result of the "redistribute" vty cmd,
+ * - when the zebra server redistributes routes after it updates its rib
+ *
+ * The zebra server sends clients a ZEBRA_IPV4_ROUTE_DELETE or a
+ * ZEBRA_IPV6_ROUTE_DELETE via zsend_route_multipath when:
+ * - a "ip route" or "ipv6 route" vty command is issued, a prefix is
+ * - deleted from zebra's rib, and this info
+ * has to be redistributed to the clients
+ *
+ * XXX The ZEBRA_IPV*_ROUTE_ADD message is also sent by the client to the
+ * zebra server when the client wants to tell the zebra server to add a
+ * route to the kernel (zapi_ipv4_add etc. ). Since it's essentially the
+ * same message being sent back and forth, this function and
+ * zapi_ipv{4,6}_{add, delete} should be re-written to avoid code
+ * duplication.
+ */
int
-zsend_ipv4_add_multipath (struct zserv *client, struct prefix *p,
- struct rib *rib)
+zsend_route_multipath (int cmd, struct zserv *client, struct prefix *p,
+ struct rib *rib)
{
int psize;
struct stream *s;
struct nexthop *nexthop;
- struct in_addr empty;
-
- empty.s_addr = 0;
+ unsigned long nhnummark = 0;
+ int nhnum = 0;
+ u_char zapi_flags = ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_IFINDEX;
+
s = client->obuf;
stream_reset (s);
@@ -429,287 +444,85 @@ zsend_ipv4_add_multipath (struct zserv *client, struct prefix *p,
stream_putw (s, 0);
/* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV4_ROUTE_ADD);
+ stream_putc (s, cmd);
stream_putc (s, rib->type);
stream_putc (s, rib->flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_IFINDEX | ZAPI_MESSAGE_METRIC);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->u.prefix, psize);
-
- /* Nexthop */
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
- {
- if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
- {
- stream_putc (s, 1);
-
- /* XXX: Waht's about NEXTHOP_TYPE_IPV4_IFNAME ? */
- if (nexthop->type == NEXTHOP_TYPE_IPV4
- || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
- stream_put_in_addr (s, &nexthop->gate.ipv4);
- else
- stream_put_in_addr (s, &empty);
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, nexthop->ifindex);
+ /*
+ * XXX no need to set ZAPI_MESSAGE_NEXTHOP if we are going to
+ * send empty nexthop?
+ */
+ if (cmd == ZEBRA_IPV4_ROUTE_ADD || ZEBRA_IPV6_ROUTE_ADD)
+ zapi_flags |= ZAPI_MESSAGE_METRIC;
- break;
- }
- }
-
- /* Metric */
- stream_putl (s, rib->metric);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-
-int
-zsend_ipv4_delete_multipath (struct zserv *client, struct prefix *p,
- struct rib *rib)
-{
- int psize;
- struct stream *s;
- struct nexthop *nexthop;
- struct in_addr empty;
-
- empty.s_addr = 0;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV4_ROUTE_DELETE);
- stream_putc (s, rib->type);
- stream_putc (s, rib->flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP|ZAPI_MESSAGE_IFINDEX);
+ stream_putc (s, zapi_flags);
/* Prefix. */
psize = PSIZE (p->prefixlen);
stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->u.prefix, psize);
-
+ stream_write (s, (u_char *) & p->u.prefix, psize);
+
+ /*
+ * XXX The message format sent by zebra below does not match the format
+ * of the corresponding message expected by the zebra server
+ * itself (e.g., see zread_ipv4_add). The nexthop_num is not set correctly,
+ * (is there a bug on the client side if more than one segment is sent?)
+ * nexthop ZEBRA_NEXTHOP_IPV4 is never set, ZEBRA_NEXTHOP_IFINDEX
+ * is hard-coded.
+ */
/* Nexthop */
for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
{
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
- {
- stream_putc (s, 1);
-
- if (nexthop->type == NEXTHOP_TYPE_IPV4)
- stream_put_in_addr (s, &nexthop->gate.ipv4);
- else
- stream_put_in_addr (s, &empty);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, nexthop->ifindex);
-
- break;
- }
- }
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-
-#if 0
-#warning oldies
-int
-zsend_ipv4_add (struct zserv *client, int type, int flags,
- struct prefix_ipv4 *p, struct in_addr *nexthop,
- unsigned int ifindex)
-{
- int psize;
- struct stream *s;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV4_ROUTE_ADD);
- stream_putc (s, type);
- stream_putc (s, flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP|ZAPI_MESSAGE_IFINDEX);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->prefix, psize);
-
- /* Nexthop */
- stream_putc (s, 1);
- stream_put_in_addr (s, nexthop);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, ifindex);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-
-int
-zsend_ipv4_delete (struct zserv *client, int type, int flags,
- struct prefix_ipv4 *p, struct in_addr *nexthop,
- unsigned int ifindex)
-{
- int psize;
- struct stream *s;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV4_ROUTE_DELETE);
- stream_putc (s, type);
- stream_putc (s, flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP|ZAPI_MESSAGE_IFINDEX);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->prefix, psize);
-
- /* Nexthop */
- stream_putc (s, 1);
- stream_put_in_addr (s, nexthop);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, ifindex);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-#endif /* oldies */
-
+ {
+ nhnummark = stream_get_putp (s);
+ stream_putc (s, 1); /* placeholder */
+ nhnum++;
+
+ switch(nexthop->type)
+ {
+ case NEXTHOP_TYPE_IPV4:
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ stream_put_in_addr (s, &nexthop->gate.ipv4);
+ break;
#ifdef HAVE_IPV6
-#if 0
-#warning oldies
-int
-zsend_ipv6_add (struct zserv *client, int type, int flags,
- struct prefix_ipv6 *p, struct in6_addr *nexthop,
- unsigned int ifindex)
-{
- int psize;
- struct stream *s;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV6_ROUTE_ADD);
- stream_putc (s, type);
- stream_putc (s, flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP|ZAPI_MESSAGE_IFINDEX);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->prefix, psize);
-
- /* Nexthop */
- stream_putc (s, 1);
- stream_write (s, (u_char *)nexthop, 16);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, ifindex);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-#endif /* oldies */
-
-int
-zsend_ipv6_add_multipath (struct zserv *client, struct prefix *p,
- struct rib *rib)
-{
- int psize;
- struct stream *s;
- struct nexthop *nexthop;
- struct in6_addr empty;
-
- memset (&empty, 0, sizeof (struct in6_addr));
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV6_ROUTE_ADD);
- stream_putc (s, rib->type);
- stream_putc (s, rib->flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_IFINDEX | ZAPI_MESSAGE_METRIC);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *) &p->u.prefix, psize);
-
- /* Nexthop */
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
- {
- if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
- {
- stream_putc (s, 1);
-
- if (nexthop->type == NEXTHOP_TYPE_IPV6
- || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX
- || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
- stream_write (s, (u_char *) &nexthop->gate.ipv6, 16);
- else
- stream_write (s, (u_char *) &empty, 16);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, nexthop->ifindex);
-
- break;
- }
+ case NEXTHOP_TYPE_IPV6:
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
+ case NEXTHOP_TYPE_IPV6_IFNAME:
+ stream_write (s, (u_char *) &nexthop->gate.ipv6, 16);
+ break;
+#endif
+ default:
+ if (cmd == ZEBRA_IPV4_ROUTE_ADD
+ || cmd == ZEBRA_IPV4_ROUTE_DELETE)
+ {
+ struct in_addr empty;
+ memset (&empty, 0, sizeof (struct in6_addr));
+ stream_write (s, (u_char *) &empty, IPV4_MAX_BYTELEN);
+ }
+ else
+ {
+ struct in6_addr empty;
+ memset (&empty, 0, sizeof (struct in6_addr));
+ stream_write (s, (u_char *) &empty, IPV6_MAX_BYTELEN);
+ }
+ }
+
+ /* Interface index. */
+ stream_putc (s, 1);
+ stream_putl (s, nexthop->ifindex);
+
+ break;
+ }
}
/* Metric */
stream_putl (s, rib->metric);
+ /* Write next-hop number */
+ if (nhnummark)
+ stream_putw_at (s, nhnummark, nhnum);
+
/* Write packet size. */
stream_putw_at (s, 0, stream_get_endp (s));
@@ -718,105 +531,7 @@ zsend_ipv6_add_multipath (struct zserv *client, struct prefix *p,
return 0;
}
-#if 0
-#warning oldies
-int
-zsend_ipv6_delete (struct zserv *client, int type, int flags,
- struct prefix_ipv6 *p, struct in6_addr *nexthop,
- unsigned int ifindex)
-{
- int psize;
- struct stream *s;
-
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV6_ROUTE_DELETE);
- stream_putc (s, type);
- stream_putc (s, flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP|ZAPI_MESSAGE_IFINDEX);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->prefix, psize);
-
- /* Nexthop */
- stream_putc (s, 1);
- stream_write (s, (u_char *)nexthop, 16);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, ifindex);
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-#endif /* oldies */
-
-int
-zsend_ipv6_delete_multipath (struct zserv *client, struct prefix *p,
- struct rib *rib)
-{
- int psize;
- struct stream *s;
- struct nexthop *nexthop;
- struct in6_addr empty;
-
- memset (&empty, 0, sizeof (struct in6_addr));
- s = client->obuf;
- stream_reset (s);
-
- /* Place holder for size. */
- stream_putw (s, 0);
-
- /* Put command, type and nexthop. */
- stream_putc (s, ZEBRA_IPV6_ROUTE_DELETE);
- stream_putc (s, rib->type);
- stream_putc (s, rib->flags);
- stream_putc (s, ZAPI_MESSAGE_NEXTHOP|ZAPI_MESSAGE_IFINDEX);
-
- /* Prefix. */
- psize = PSIZE (p->prefixlen);
- stream_putc (s, p->prefixlen);
- stream_write (s, (u_char *)&p->u.prefix, psize);
-
- /* Nexthop */
- for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
- {
- if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
- {
- stream_putc (s, 1);
-
- if (nexthop->type == NEXTHOP_TYPE_IPV6)
- stream_write (s, (u_char *) &nexthop->gate.ipv6, 16);
- else
- stream_write (s, (u_char *) &empty, 16);
-
- /* Interface index. */
- stream_putc (s, 1);
- stream_putl (s, nexthop->ifindex);
-
- break;
- }
- }
-
- /* Write packet size. */
- stream_putw_at (s, 0, stream_get_endp (s));
-
- zebra_server_send_message (client->sock, s->data, stream_get_endp (s));
-
- return 0;
-}
-
+#ifdef HAVE_IPV6
int
zsend_ipv6_nexthop_lookup (struct zserv *client, struct in6_addr *addr)
{
@@ -884,7 +599,7 @@ zsend_ipv6_nexthop_lookup (struct zserv *client, struct in6_addr *addr)
}
#endif /* HAVE_IPV6 */
-int
+static int
zsend_ipv4_nexthop_lookup (struct zserv *client, struct in_addr addr)
{
struct stream *s;
@@ -945,7 +660,7 @@ zsend_ipv4_nexthop_lookup (struct zserv *client, struct in_addr addr)
return 0;
}
-int
+static int
zsend_ipv4_import_lookup (struct zserv *client, struct prefix_ipv4 *p)
{
struct stream *s;
@@ -1008,7 +723,7 @@ zsend_ipv4_import_lookup (struct zserv *client, struct prefix_ipv4 *p)
/* Register zebra server interface information. Send current all
interface and address information. */
-void
+static void
zread_interface_add (struct zserv *client, u_short length)
{
listnode ifnode;
@@ -1033,20 +748,25 @@ zread_interface_add (struct zserv *client, u_short length)
{
c = getdata (cnode);
if (CHECK_FLAG (c->conf, ZEBRA_IFC_REAL))
- zsend_interface_address_add (client, ifp, c);
+ zsend_interface_address (ZEBRA_INTERFACE_ADDRESS_ADD, client,
+ ifp, c);
}
}
}
/* Unregister zebra server interface information. */
-void
+static void
zread_interface_delete (struct zserv *client, u_short length)
{
client->ifinfo = 0;
}
/* This function support multiple nexthop. */
-void
+/*
+ * Parse the ZEBRA_IPV4_ROUTE_ADD sent from client. Update rib and
+ * add kernel route.
+ */
+static void
zread_ipv4_add (struct zserv *client, u_short length)
{
int i;
@@ -1070,7 +790,7 @@ zread_ipv4_add (struct zserv *client, u_short length)
/* Type, flags, message. */
rib->type = stream_getc (s);
rib->flags = stream_getc (s);
- message = stream_getc (s);
+ message = stream_getc (s);
rib->uptime = time (NULL);
/* IPv4 prefix. */
@@ -1124,7 +844,7 @@ zread_ipv4_add (struct zserv *client, u_short length)
}
/* Zebra server IPv4 prefix delete function. */
-void
+static void
zread_ipv4_delete (struct zserv *client, u_short length)
{
int i;
@@ -1197,7 +917,7 @@ zread_ipv4_delete (struct zserv *client, u_short length)
}
/* Nexthop lookup for IPv4. */
-void
+static void
zread_ipv4_nexthop_lookup (struct zserv *client, u_short length)
{
struct in_addr addr;
@@ -1207,7 +927,7 @@ zread_ipv4_nexthop_lookup (struct zserv *client, u_short length)
}
/* Nexthop lookup for IPv4. */
-void
+static void
zread_ipv4_import_lookup (struct zserv *client, u_short length)
{
struct prefix_ipv4 p;
@@ -1221,7 +941,7 @@ zread_ipv4_import_lookup (struct zserv *client, u_short length)
#ifdef HAVE_IPV6
/* Zebra server IPv6 prefix add function. */
-void
+static void
zread_ipv6_add (struct zserv *client, u_short length)
{
int i;
@@ -1285,7 +1005,7 @@ zread_ipv6_add (struct zserv *client, u_short length)
}
/* Zebra server IPv6 prefix delete function. */
-void
+static void
zread_ipv6_delete (struct zserv *client, u_short length)
{
int i;
@@ -1383,13 +1103,13 @@ zebra_read_ipv6 (int command, struct zserv *client, u_short length)
gate = &nexthop;
if (command == ZEBRA_IPV6_ROUTE_ADD)
- rib_add_ipv6 (type, flags, &p, gate, ifindex, 0);
+ rib_add_ipv6 (type, flags, &p, gate, ifindex, 0);
else
- rib_delete_ipv6 (type, flags, &p, gate, ifindex, 0);
+ rib_delete_ipv6 (type, flags, &p, gate, ifindex, 0);
}
}
-void
+static void
zread_ipv6_nexthop_lookup (struct zserv *client, u_short length)
{
struct in6_addr addr;
@@ -1403,7 +1123,7 @@ zread_ipv6_nexthop_lookup (struct zserv *client, u_short length)
#endif /* HAVE_IPV6 */
/* Close zebra client. */
-void
+static void
zebra_client_close (struct zserv *client)
{
/* Close file descriptor. */
@@ -1431,7 +1151,7 @@ zebra_client_close (struct zserv *client)
}
/* Make new client. */
-void
+static void
zebra_client_create (int sock)
{
struct zserv *client;
@@ -1454,7 +1174,7 @@ zebra_client_create (int sock)
}
/* Handler of zebra service request. */
-int
+static int
zebra_client_read (struct thread *thread)
{
int sock;
@@ -1567,23 +1287,9 @@ zebra_client_read (struct thread *thread)
return 0;
}
-/* Write output buffer to the socket. */
-void
-zebra_write (struct thread *thread)
-{
- int sock;
- struct zserv *client;
-
- /* Thread treatment. */
- sock = THREAD_FD (thread);
- client = THREAD_ARG (thread);
- client->t_write = NULL;
-
- stream_flush (client->obuf, sock);
-}
/* Accept code of zebra server socket. */
-int
+static int
zebra_accept (struct thread *thread)
{
int val;
@@ -1617,8 +1323,9 @@ zebra_accept (struct thread *thread)
return 0;
}
+#ifdef HAVE_TCP_ZEBRA
/* Make zebra's server socket. */
-void
+static void
zebra_serv ()
{
int ret;
@@ -1672,12 +1379,13 @@ zebra_serv ()
zebra_event (ZEBRA_SERV, accept_sock, NULL);
}
+#endif /* HAVE_TCP_ZEBRA */
/* For sockaddr_un. */
#include <sys/un.h>
/* zebra server UNIX domain socket. */
-void
+static void
zebra_serv_un (char *path)
{
int ret;
@@ -1731,7 +1439,7 @@ zebra_serv_un (char *path)
}
-void
+static void
zebra_event (enum event event, int sock, struct zserv *client)
{
switch (event)
@@ -1844,7 +1552,7 @@ DEFUN (show_zebra_client,
}
/* Table configuration write function. */
-int
+static int
config_write_table (struct vty *vty)
{
if (zebrad.rtm_table_default)
diff --git a/zebra/zserv.h b/zebra/zserv.h
index 42fb64c6..f043099b 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -82,65 +82,14 @@ void route_read ();
void rtadv_init ();
void zebra_snmp_init ();
-int
-zsend_interface_add (struct zserv *, struct interface *);
-int
-zsend_interface_delete (struct zserv *, struct interface *);
-
-int
-zsend_interface_address_add (struct zserv *, struct interface *,
- struct connected *);
-
-int
-zsend_interface_address_delete (struct zserv *, struct interface *,
- struct connected *);
-
-int
-zsend_interface_up (struct zserv *, struct interface *);
-
-int
-zsend_interface_down (struct zserv *, struct interface *);
-
-#if 0
-#warning oldies
-int
-zsend_ipv4_add (struct zserv *client, int type, int flags,
- struct prefix_ipv4 *p, struct in_addr *nexthop,
- unsigned int ifindex);
-
-int
-zsend_ipv4_delete (struct zserv *client, int type, int flags,
- struct prefix_ipv4 *p, struct in_addr *nexthop,
- unsigned int ifindex);
+int zsend_interface_add (struct zserv *, struct interface *);
+#if (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK))
+int zsend_interface_delete (struct zserv *, struct interface *);
#endif
-
-int
-zsend_ipv4_add_multipath (struct zserv *, struct prefix *, struct rib *);
-
-int
-zsend_ipv4_delete_multipath (struct zserv *, struct prefix *, struct rib *);
-
-#ifdef HAVE_IPV6
-#if 0
-#warning oldies
-int
-zsend_ipv6_add (struct zserv *client, int type, int flags,
- struct prefix_ipv6 *p, struct in6_addr *nexthop,
- unsigned int ifindex);
-
-int
-zsend_ipv6_delete (struct zserv *client, int type, int flags,
- struct prefix_ipv6 *p, struct in6_addr *nexthop,
- unsigned int ifindex);
-#endif
-
-int
-zsend_ipv6_add_multipath (struct zserv *, struct prefix *, struct rib *);
-
-int
-zsend_ipv6_delete_multipath (struct zserv *, struct prefix *, struct rib *);
-
-#endif /* HAVE_IPV6 */
+int zsend_interface_address (int, struct zserv *, struct interface *,
+ struct connected *);
+int zsend_interface_update (int, struct zserv *, struct interface *);
+int zsend_route_multipath (int, struct zserv *, struct prefix *, struct rib *);
extern pid_t pid;
extern pid_t old_pid;