summaryrefslogtreecommitdiffstats
path: root/pimd/pim_zlookup.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_zlookup.c')
-rw-r--r--pimd/pim_zlookup.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c
index 60003670..fae8f81c 100644
--- a/pimd/pim_zlookup.c
+++ b/pimd/pim_zlookup.c
@@ -149,17 +149,18 @@ static int zclient_read_nexthop(struct zclient *zlookup,
{
int num_ifindex = 0;
struct stream *s;
- const uint16_t MIN_LEN = 14; /* getc=1 getc=1 getw=2 getipv4=4 getc=1 getl=4 getc=1 */
- uint16_t length, len;
+ const uint16_t MIN_LEN = 10; /* getipv4=4 getc=1 getl=4 getc=1 */
+ uint16_t length;
u_char marker;
u_char version;
+ uint16_t vrf_id;
uint16_t command;
int nbytes;
struct in_addr raddr;
uint8_t distance;
uint32_t metric;
int nexthop_num;
- int i;
+ int i, err;
if (PIM_DEBUG_ZEBRA) {
char addr_str[100];
@@ -172,41 +173,37 @@ static int zclient_read_nexthop(struct zclient *zlookup,
s = zlookup->ibuf;
stream_reset(s);
- nbytes = stream_read(s, zlookup->sock, 2);
- if (nbytes < 2) {
- zlog_err("%s %s: failure reading zclient lookup socket: nbytes=%d",
- __FILE__, __PRETTY_FUNCTION__, nbytes);
+ err = zclient_read_header (s, zlookup->sock, &length, &marker, &version,
+ &vrf_id, &command);
+ if (err < 0) {
+ zlog_err("%s %s: zclient_read_header() failed",
+ __FILE__, __PRETTY_FUNCTION__);
zclient_lookup_failed(zlookup);
return -1;
}
- length = stream_getw(s);
-
- len = length - 2;
- if (len < MIN_LEN) {
+ if (length < MIN_LEN) {
zlog_err("%s %s: failure reading zclient lookup socket: len=%d < MIN_LEN=%d",
- __FILE__, __PRETTY_FUNCTION__, len, MIN_LEN);
+ __FILE__, __PRETTY_FUNCTION__, length, MIN_LEN);
zclient_lookup_failed(zlookup);
return -2;
}
-
- nbytes = stream_read(s, zlookup->sock, len);
- if (nbytes < (length - 2)) {
+
+ nbytes = stream_read(s, zlookup->sock, length);
+ if (nbytes < length) {
zlog_err("%s %s: failure reading zclient lookup socket: nbytes=%d < len=%d",
- __FILE__, __PRETTY_FUNCTION__, nbytes, len);
+ __FILE__, __PRETTY_FUNCTION__, nbytes, length);
zclient_lookup_failed(zlookup);
return -3;
}
- marker = stream_getc(s);
- version = stream_getc(s);
if (version != ZSERV_VERSION || marker != ZEBRA_HEADER_MARKER) {
zlog_err("%s: socket %d version mismatch, marker %d, version %d",
__func__, zlookup->sock, marker, version);
+ zclient_lookup_failed(zlookup);
return -4;
}
- command = stream_getw(s);
if (command != ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB) {
zlog_err("%s: socket %d command mismatch: %d",
__func__, zlookup->sock, command);
@@ -236,19 +233,19 @@ static int zclient_read_nexthop(struct zclient *zlookup,
return -6;
}
- len -= MIN_LEN;
+ length -= MIN_LEN;
for (i = 0; i < nexthop_num; ++i) {
enum nexthop_types_t nexthop_type;
- if (len < 1) {
+ if (length < 1) {
zlog_err("%s: socket %d empty input expecting nexthop_type: len=%d",
- __func__, zlookup->sock, len);
+ __func__, zlookup->sock, length);
return -7;
}
nexthop_type = stream_getc(s);
- --len;
+ --length;
switch (nexthop_type) {
case ZEBRA_NEXTHOP_IFINDEX:
@@ -263,13 +260,13 @@ static int zclient_read_nexthop(struct zclient *zlookup,
return num_ifindex;
}
if (nexthop_type == ZEBRA_NEXTHOP_IPV4_IFINDEX) {
- if (len < 4) {
+ if (length < 4) {
zlog_err("%s: socket %d short input expecting nexthop IPv4-addr: len=%d",
- __func__, zlookup->sock, len);
+ __func__, zlookup->sock, length);
return -8;
}
nexthop_tab[num_ifindex].nexthop_addr.s_addr = stream_get_ipv4(s);
- len -= 4;
+ length -= 4;
}
else {
nexthop_tab[num_ifindex].nexthop_addr.s_addr = PIM_NET_INADDR_ANY;
@@ -289,7 +286,7 @@ static int zclient_read_nexthop(struct zclient *zlookup,
return num_ifindex;
}
nexthop_tab[num_ifindex].nexthop_addr.s_addr = stream_get_ipv4(s);
- len -= 4;
+ length -= 4;
nexthop_tab[num_ifindex].ifindex = 0;
nexthop_tab[num_ifindex].protocol_distance = distance;
nexthop_tab[num_ifindex].route_metric = metric;