Commit 13ad5faf authored by Matthieu Boutier's avatar Matthieu Boutier Committed by Juliusz Chroboczek

Big fixes while parsing sub-TLVs.

- Hello is not ignored if there is a mandatory sub-TLV,
- non-wildcard Updates also,
- Duplicated check for Requests,
- wrong size for the beginning of sub-TLVs for Seqno Requests,
- wrong size for source specific Requests and Seqno Requests.
parent ad262aa5
...@@ -433,16 +433,16 @@ parse_packet(const unsigned char *from, struct interface *ifp, ...@@ -433,16 +433,16 @@ parse_packet(const unsigned char *from, struct interface *ifp,
debugf("Received hello %d (%d) from %s on %s.\n", debugf("Received hello %d (%d) from %s on %s.\n",
seqno, interval, seqno, interval,
format_address(from), ifp->name); format_address(from), ifp->name);
changed = update_neighbour(neigh, seqno, interval);
update_neighbour_metric(neigh, changed);
if(interval > 0)
/* Multiply by 3/2 to allow hellos to expire. */
schedule_neighbours_check(interval * 15, 0);
/* Sub-TLV handling. */ /* Sub-TLV handling. */
rc = parse_hello_subtlv(message + 8, len - 6, rc = parse_hello_subtlv(message + 8, len - 6,
&timestamp, &have_timestamp); &timestamp, &have_timestamp);
if(rc < 0) if(rc < 0)
goto done; goto done;
changed = update_neighbour(neigh, seqno, interval);
update_neighbour_metric(neigh, changed);
if(interval > 0)
/* Multiply by 3/2 to allow hellos to expire. */
schedule_neighbours_check(interval * 15, 0);
if(have_timestamp) { if(have_timestamp) {
neigh->hello_send_us = timestamp; neigh->hello_send_us = timestamp;
neigh->hello_rtt_receive_time = now; neigh->hello_rtt_receive_time = now;
...@@ -611,8 +611,10 @@ parse_packet(const unsigned char *from, struct interface *ifp, ...@@ -611,8 +611,10 @@ parse_packet(const unsigned char *from, struct interface *ifp,
goto done; goto done;
} }
parse_update_subtlv(ifp, metric, message + 2 + parsed_len, rc = parse_update_subtlv(ifp, metric, message + 2 + parsed_len,
len - parsed_len, channels, &channels_len); len - parsed_len, channels, &channels_len);
if (rc < 0)
goto done;
update_route(router_id, prefix, plen, src_prefix, src_plen, seqno, update_route(router_id, prefix, plen, src_prefix, src_plen, seqno,
metric, interval, neigh, nh, metric, interval, neigh, nh,
channels, channels_len); channels, channels_len);
...@@ -631,9 +633,6 @@ parse_packet(const unsigned char *from, struct interface *ifp, ...@@ -631,9 +633,6 @@ parse_packet(const unsigned char *from, struct interface *ifp,
if(rc < 0) if(rc < 0)
goto done; goto done;
if(message[2] == 0) { if(message[2] == 0) {
rc = parse_other_subtlv(message + 4, len - 2);
if(rc < 0)
goto done;
/* If a neighbour is requesting a full route dump from us, /* If a neighbour is requesting a full route dump from us,
we might as well send it an IHU. */ we might as well send it an IHU. */
send_ihu(neigh, NULL); send_ihu(neigh, NULL);
...@@ -663,7 +662,7 @@ parse_packet(const unsigned char *from, struct interface *ifp, ...@@ -663,7 +662,7 @@ parse_packet(const unsigned char *from, struct interface *ifp,
rc = network_prefix(message[2], message[3], 0, rc = network_prefix(message[2], message[3], 0,
message + 16, NULL, len - 14, prefix); message + 16, NULL, len - 14, prefix);
if(rc < 0) goto fail; if(rc < 0) goto fail;
rc = parse_other_subtlv(message + 8 + rc, len - 6 - rc); rc = parse_other_subtlv(message + 16 + rc, len - 14 - rc);
if(rc < 0) if(rc < 0)
goto done; goto done;
plen = message[3] + (message[2] == 1 ? 96 : 0); plen = message[3] + (message[2] == 1 ? 96 : 0);
...@@ -774,7 +773,7 @@ parse_packet(const unsigned char *from, struct interface *ifp, ...@@ -774,7 +773,7 @@ parse_packet(const unsigned char *from, struct interface *ifp,
if(ae == 1) if(ae == 1)
src_plen += 96; src_plen += 96;
parsed += rc; parsed += rc;
rc = parse_other_subtlv(message + parsed, len - parsed - 2); rc = parse_other_subtlv(message + parsed, len - parsed + 2);
if(rc < 0) if(rc < 0)
goto done; goto done;
if(ae == 0) { if(ae == 0) {
...@@ -815,7 +814,7 @@ parse_packet(const unsigned char *from, struct interface *ifp, ...@@ -815,7 +814,7 @@ parse_packet(const unsigned char *from, struct interface *ifp,
NULL, len + 2 - parsed, src_prefix); NULL, len + 2 - parsed, src_prefix);
if(rc < 0) goto fail; if(rc < 0) goto fail;
parsed += rc; parsed += rc;
rc = parse_other_subtlv(message + parsed, len - parsed - 2); rc = parse_other_subtlv(message + parsed, len - parsed + 2);
if(rc < 0) if(rc < 0)
goto done; goto done;
if(ae == 1) if(ae == 1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment