diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ChangeLog | 10 | ||||
| -rw-r--r-- | lib/zclient.c | 59 | ||||
| -rw-r--r-- | lib/zclient.h | 36 | ||||
| -rw-r--r-- | lib/zebra.h | 10 | 
4 files changed, 78 insertions, 37 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index 0e98b924..eeb64041 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,13 @@ +2006-01-16 Paul Jakma <paul.jakma@sun.com> + +	* zclient.h: Update the Zserv protocol header with a version +	  field.  Define the old command field to be a 'marker', to +	  allow old Zserv and updated Zserv to be differentiated. +	  Future updates will bump the version field obviously. New +	  command field is made wider.  Try to stop using the +	  'zebra_size_t' typedef in the callbacks. +	* zclient.c: Update to read/write new format header. +  2006-01-11 Paul Jakma <paul.jakma@sun.com>  	* if.h: (struct interface) expand flags to 8 bytes. diff --git a/lib/zclient.c b/lib/zclient.c index b09f5586..ccd8bfc7 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -270,6 +270,16 @@ zclient_send_message(struct zclient *zclient)    return 0;  } +static void +zclient_create_header (struct stream *s, uint16_t command) +{ +  /* length placeholder, caller can update */ +  stream_putw (s, ZEBRA_HEADER_SIZE); +  stream_putc (s, ZEBRA_HEADER_MARKER); +  stream_putc (s, ZSERV_VERSION); +  stream_putw (s, command); +} +  /* Send simple Zebra message. */  static int  zebra_message_send (struct zclient *zclient, int command) @@ -281,9 +291,8 @@ zebra_message_send (struct zclient *zclient, int command)    stream_reset (s);    /* Send very simple command only Zebra message. */ -  stream_putw (s, 3); -  stream_putc (s, command); - +  zclient_create_header (s, command); +      return zclient_send_message(zclient);  } @@ -423,12 +432,10 @@ zapi_ipv4_route (u_char cmd, struct zclient *zclient, struct prefix_ipv4 *p,    /* Reset stream. */    s = zclient->obuf;    stream_reset (s); - -  /* Length place holder. */ -  stream_putw (s, 0); - -  /* Put command, type and nexthop. */ -  stream_putc (s, cmd); +   +  zclient_create_header (s, cmd); +   +  /* Put type and nexthop. */    stream_putc (s, api->type);    stream_putc (s, api->flags);    stream_putc (s, api->message); @@ -487,11 +494,9 @@ zapi_ipv6_route (u_char cmd, struct zclient *zclient, struct prefix_ipv6 *p,    s = zclient->obuf;    stream_reset (s); -  /* Length place holder. */ -  stream_putw (s, 0); +  zclient_create_header (s, cmd); -  /* Put command, type and nexthop. */ -  stream_putc (s, cmd); +  /* Put type and nexthop. */    stream_putc (s, api->type);    stream_putc (s, api->flags);    stream_putc (s, api->message); @@ -543,13 +548,12 @@ zebra_redistribute_send (int command, struct zclient *zclient, int type)    s = zclient->obuf;    stream_reset(s); - -  /* Total length of the message. */ -  stream_putw (s, 4); -  stream_putc (s, command); +  zclient_create_header (s, command);    stream_putc (s, type); - +   +  stream_putw_at (s, 0, stream_get_endp (s)); +      return zclient_send_message(zclient);  } @@ -794,8 +798,8 @@ zclient_read (struct thread *thread)  {    int ret;    size_t already; -  zebra_size_t length; -  zebra_command_t command; +  uint16_t length, command; +  uint8_t marker, version;    struct zclient *zclient;    /* Get socket to zebra. */ @@ -826,10 +830,19 @@ zclient_read (struct thread *thread)    /* Reset to read from the beginning of the incoming packet. */    stream_set_getp(zclient->ibuf, 0); -  /* Fetch length and command. */ +  /* Fetch header values. */    length = stream_getw (zclient->ibuf); -  command = stream_getc (zclient->ibuf); - +  marker = stream_getc (zclient->ibuf); +  version = stream_getc (zclient->ibuf); +  command = stream_getw (zclient->ibuf); +   +  if (marker != ZEBRA_HEADER_MARKER || version != ZSERV_VERSION) +    { +      zlog_err("%s: socket %d version mismatch, marker %d, version %d", +               __func__, zclient->sock, marker, version); +      return zclient_failed(zclient); +    } +      if (length < ZEBRA_HEADER_SIZE)       {        zlog_err("%s: socket %d message length %u is less than %d ", diff --git a/lib/zclient.h b/lib/zclient.h index 910db0dc..bd33295a 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -29,7 +29,7 @@  #define ZEBRA_MAX_PACKET_SIZ          4096  /* Zebra header size. */ -#define ZEBRA_HEADER_SIZE                3 +#define ZEBRA_HEADER_SIZE             6  /* Structure for the zebra client. */  struct zclient @@ -68,17 +68,17 @@ struct zclient    u_char default_information;    /* Pointer to the callback functions. */ -  int (*router_id_update) (int, struct zclient *, zebra_size_t); -  int (*interface_add) (int, struct zclient *, zebra_size_t); -  int (*interface_delete) (int, struct zclient *, zebra_size_t); -  int (*interface_up) (int, struct zclient *, zebra_size_t); -  int (*interface_down) (int, struct zclient *, zebra_size_t); -  int (*interface_address_add) (int, struct zclient *, zebra_size_t); -  int (*interface_address_delete) (int, struct zclient *, zebra_size_t); -  int (*ipv4_route_add) (int, struct zclient *, zebra_size_t); -  int (*ipv4_route_delete) (int, struct zclient *, zebra_size_t); -  int (*ipv6_route_add) (int, struct zclient *, zebra_size_t); -  int (*ipv6_route_delete) (int, struct zclient *, zebra_size_t); +  int (*router_id_update) (int, struct zclient *, uint16_t); +  int (*interface_add) (int, struct zclient *, uint16_t); +  int (*interface_delete) (int, struct zclient *, uint16_t); +  int (*interface_up) (int, struct zclient *, uint16_t); +  int (*interface_down) (int, struct zclient *, uint16_t); +  int (*interface_address_add) (int, struct zclient *, uint16_t); +  int (*interface_address_delete) (int, struct zclient *, uint16_t); +  int (*ipv4_route_add) (int, struct zclient *, uint16_t); +  int (*ipv4_route_delete) (int, struct zclient *, uint16_t); +  int (*ipv6_route_add) (int, struct zclient *, uint16_t); +  int (*ipv6_route_delete) (int, struct zclient *, uint16_t);  };  /* Zebra API message flag. */ @@ -87,6 +87,18 @@ struct zclient  #define ZAPI_MESSAGE_DISTANCE 0x04  #define ZAPI_MESSAGE_METRIC   0x08 +/* Zserv protocol message header */ +struct zserv_header +{ +  uint16_t length; +  uint8_t marker;	/* corresponds to command field in old zserv +                         * always set to 255 in new zserv. +                         */ +  uint8_t version; +#define ZSERV_VERSION	1 +  uint16_t command; +}; +  /* Zebra IPv4 route message API. */  struct zapi_ipv4  { diff --git a/lib/zebra.h b/lib/zebra.h index cf7998f2..00f13f57 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -397,6 +397,12 @@ struct in_pktinfo  #define ZEBRA_ROUTER_ID_UPDATE            22  #define ZEBRA_MESSAGE_MAX                 23 +/* Marker value used in new Zserv, in the byte location corresponding + * the command value in the old zserv header. To allow old and new + * Zserv headers to be distinguished from each other. + */ +#define ZEBRA_HEADER_MARKER              255 +  /* Zebra route's types. */  #define ZEBRA_ROUTE_SYSTEM               0  #define ZEBRA_ROUTE_KERNEL               1 @@ -493,9 +499,9 @@ extern char zebra_route_char(unsigned int route_type);  typedef u_int16_t afi_t;  typedef u_int8_t safi_t; -/* Zebra types. */ +/* Zebra types. Used in Zserv message header. */  typedef u_int16_t zebra_size_t; -typedef u_int8_t zebra_command_t; +typedef u_int16_t zebra_command_t;  /* FIFO -- first in first out structure and macros.  */  struct fifo  | 
