Skip to content

Commit 4612924

Browse files
committed
Prefix field in RIO to variable length
1 parent 3c9d491 commit 4612924

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

send.c

+8-3
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,13 @@ static struct safe_buffer_list *add_ra_options_route(struct safe_buffer_list *sb
571571
memset(&rinfo, 0, sizeof(rinfo));
572572

573573
rinfo.nd_opt_ri_type = ND_OPT_ROUTE_INFORMATION;
574-
/* XXX: the prefixes are allowed to be sent in smaller chunks as well */
575-
rinfo.nd_opt_ri_len = 3;
574+
if (route->PrefixLen == 0) {
575+
rinfo.nd_opt_ri_len = 1;
576+
} else if (route->PrefixLen > 0 && route->PrefixLen <= 64) {
577+
rinfo.nd_opt_ri_len = 2;
578+
} else if (route->PrefixLen > 64 && route->PrefixLen <= 128) {
579+
rinfo.nd_opt_ri_len = 3;
580+
}
576581
rinfo.nd_opt_ri_prefix_len = route->PrefixLen;
577582

578583
rinfo.nd_opt_ri_flags_reserved = (route->AdvRoutePreference << ND_OPT_RI_PRF_SHIFT) & ND_OPT_RI_PRF_MASK;
@@ -585,7 +590,7 @@ static struct safe_buffer_list *add_ra_options_route(struct safe_buffer_list *sb
585590
memcpy(&rinfo.nd_opt_ri_prefix, &route->Prefix, sizeof(struct in6_addr));
586591

587592
sbl = safe_buffer_list_append(sbl);
588-
safe_buffer_append(sbl->sb, &rinfo, sizeof(rinfo));
593+
safe_buffer_append(sbl->sb, &rinfo, rinfo.nd_opt_ri_len * 8);
589594

590595
route = route->next;
591596
}

0 commit comments

Comments
 (0)