diff options
author | paul <paul> | 2004-05-09 09:09:59 +0000 |
---|---|---|
committer | paul <paul> | 2004-05-09 09:09:59 +0000 |
commit | b9df2d25fc8d06ca63fa792d162d97656361338b (patch) | |
tree | 53ec5975f608983b5cb95ee38ca112934db5e609 | |
parent | 0a5893596774554f039222c481d235de0f35d99e (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.
-rw-r--r-- | zebra/ChangeLog | 24 | ||||
-rw-r--r-- | zebra/redistribute.c | 32 | ||||
-rw-r--r-- | zebra/zserv.c | 696 | ||||
-rw-r--r-- | zebra/zserv.h | 65 |
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; |