summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ChangeLog10
-rw-r--r--lib/zclient.c59
-rw-r--r--lib/zclient.h36
-rw-r--r--lib/zebra.h10
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