summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
authorNicolas Dichtel <nicolas.dichtel@6wind.com>2015-09-16 09:42:36 +0200
committerPaul Jakma <paul@quagga.net>2015-09-24 15:26:41 +0100
commit794c4735f81289d9fc603b5fd5e4a5d39dbb5ca5 (patch)
treeb81f6a549fe0916bdf25b5a5a88745c34a4e816d /bgpd
parenta29c8a23a35b3f94c6aea5b3b7578b5dbf81ad71 (diff)
downloadquagga-794c4735f81289d9fc603b5fd5e4a5d39dbb5ca5.tar.bz2
quagga-794c4735f81289d9fc603b5fd5e4a5d39dbb5ca5.tar.xz
bgpd/pimd: fix zAPI parsing
Commit c99f3481a598 has changed the API. Now, the vrfid has been added in the header, thus we must read it before parsing the rest of the message. To ease code maintenance, let's add a new function to read a zAPI header. Fixes: c99f3481a598 ("*: add VRF ID in the API message header") Reported-by: Martin Winter <mwinter@opensourcerouting.org> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Acked-by: Donald Sharp <sharpd@cumulusnetworks.com> Tested-by: Martin Winter <mwinter@opensourcerouting.org>
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_nexthop.c68
1 files changed, 27 insertions, 41 deletions
diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c
index 7336793e..c74bebad 100644
--- a/bgpd/bgp_nexthop.c
+++ b/bgpd/bgp_nexthop.c
@@ -789,8 +789,9 @@ zlookup_read (void)
uint16_t length;
u_char marker;
u_char version;
- uint16_t command __attribute__((unused));
- int nbytes __attribute__((unused));
+ uint16_t vrf_id;
+ uint16_t command;
+ int err;
struct in_addr raddr __attribute__((unused));
uint32_t metric;
int i;
@@ -801,14 +802,13 @@ zlookup_read (void)
s = zlookup->ibuf;
stream_reset (s);
- /* nbytes not being checked */
- nbytes = stream_read (s, zlookup->sock, 2);
- length = stream_getw (s);
-
- nbytes = stream_read (s, zlookup->sock, length - 2);
- marker = stream_getc (s);
- version = stream_getc (s);
-
+ err = zclient_read_header (s, zlookup->sock, &length, &marker, &version,
+ &vrf_id, &command);
+ if (err < 0)
+ {
+ zlog_err("%s: zserv_read_header() failed", __func__);
+ return NULL;
+ }
if (version != ZSERV_VERSION || marker != ZEBRA_HEADER_MARKER)
{
zlog_err("%s: socket %d version mismatch, marker %d, version %d",
@@ -816,9 +816,6 @@ zlookup_read (void)
return NULL;
}
- /* XXX: not checking command */
- command = stream_getw (s);
-
/* XXX: not doing anything with raddr */
raddr.s_addr = stream_get_ipv4 (s);
metric = stream_getl (s);
@@ -902,11 +899,11 @@ static struct bgp_nexthop_cache *
zlookup_read_ipv6 (void)
{
struct stream *s;
- uint16_t length;
+ uint16_t length, vrf_id, cmd;
u_char version, marker;
struct in6_addr raddr;
uint32_t metric;
- int i;
+ int i, err;
u_char nexthop_num;
struct nexthop *nexthop;
struct bgp_nexthop_cache *bnc;
@@ -914,14 +911,13 @@ zlookup_read_ipv6 (void)
s = zlookup->ibuf;
stream_reset (s);
- /* XXX: ignoring nbytes, see also zread_lookup */
- stream_read (s, zlookup->sock, 2);
- length = stream_getw (s);
-
- stream_read (s, zlookup->sock, length - 2);
- marker = stream_getc (s);
- version = stream_getc (s);
-
+ err = zclient_read_header (s, zlookup->sock, &length, &marker, &version,
+ &vrf_id, &cmd);
+ if (err < 0)
+ {
+ zlog_err("%s: zserv_read_header() failed", __func__);
+ return NULL;
+ }
if (version != ZSERV_VERSION || marker != ZEBRA_HEADER_MARKER)
{
zlog_err("%s: socket %d version mismatch, marker %d, version %d",
@@ -929,9 +925,6 @@ zlookup_read_ipv6 (void)
return NULL;
}
- /* XXX: ignoring command */
- stream_getw (s);
-
/* XXX: not actually doing anything with raddr */
stream_get (&raddr, s, 16);
@@ -1018,9 +1011,8 @@ bgp_import_check (struct prefix *p, u_int32_t *igpmetric,
{
struct stream *s;
int ret;
- u_int16_t length, command __attribute__((unused));
+ u_int16_t length, vrf_id, command;
u_char version, marker;
- int nbytes __attribute__((unused));
struct in_addr addr __attribute__((unused));
struct in_addr nexthop;
u_int32_t metric = 0;
@@ -1066,16 +1058,13 @@ bgp_import_check (struct prefix *p, u_int32_t *igpmetric,
/* Get result. */
stream_reset (s);
- /* Fetch length. */
- /* XXX: not using nbytes */
- nbytes = stream_read (s, zlookup->sock, 2);
- length = stream_getw (s);
-
- /* Fetch whole data. */
- nbytes = stream_read (s, zlookup->sock, length - 2);
- marker = stream_getc (s);
- version = stream_getc (s);
-
+ ret = zclient_read_header (s, zlookup->sock, &length, &marker, &version,
+ &vrf_id, &command);
+ if (ret < 0)
+ {
+ zlog_err("%s: zserv_read_header() failed", __func__);
+ return 0;
+ }
if (version != ZSERV_VERSION || marker != ZEBRA_HEADER_MARKER)
{
zlog_err("%s: socket %d version mismatch, marker %d, version %d",
@@ -1083,9 +1072,6 @@ bgp_import_check (struct prefix *p, u_int32_t *igpmetric,
return 0;
}
- /* XXX: not using command */
- command = stream_getw (s);
-
/* XXX: not using addr */
addr.s_addr = stream_get_ipv4 (s);
metric = stream_getl (s);