diff options
Diffstat (limited to 'zebra')
| -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;  | 
