|
@@ -314,8 +314,9 @@ impl<'a> Repr<'a> {
|
|
|
let opt = NdiscOption::new_checked(&packet.payload()[offset..])?;
|
|
|
match opt.option_type() {
|
|
|
NdiscOptionType::SourceLinkLayerAddr => {
|
|
|
- lladdr = Some(opt.link_layer_addr());
|
|
|
- offset += 8;
|
|
|
+ let addr = opt.link_layer_addr();
|
|
|
+ offset += NdiscOptionRepr::SourceLinkLayerAddr(addr).buffer_len();
|
|
|
+ lladdr = Some(addr);
|
|
|
}
|
|
|
NdiscOptionType::RedirectedHeader => {
|
|
|
if opt.data_len() < 6 {
|
|
@@ -351,7 +352,9 @@ impl<'a> Repr<'a> {
|
|
|
pub fn buffer_len(&self) -> usize {
|
|
|
match self {
|
|
|
&Repr::RouterSolicit { lladdr } => match lladdr {
|
|
|
- Some(_) => field::UNUSED.end + 8,
|
|
|
+ Some(addr) => {
|
|
|
+ field::UNUSED.end + { NdiscOptionRepr::SourceLinkLayerAddr(addr).buffer_len() }
|
|
|
+ }
|
|
|
None => field::UNUSED.end,
|
|
|
},
|
|
|
&Repr::RouterAdvert {
|
|
@@ -361,8 +364,8 @@ impl<'a> Repr<'a> {
|
|
|
..
|
|
|
} => {
|
|
|
let mut offset = 0;
|
|
|
- if lladdr.is_some() {
|
|
|
- offset += 8;
|
|
|
+ if let Some(lladdr) = lladdr {
|
|
|
+ offset += NdiscOptionRepr::TargetLinkLayerAddr(lladdr).buffer_len();
|
|
|
}
|
|
|
if mtu.is_some() {
|
|
|
offset += 8;
|
|
@@ -385,8 +388,8 @@ impl<'a> Repr<'a> {
|
|
|
..
|
|
|
} => {
|
|
|
let mut offset = 0;
|
|
|
- if lladdr.is_some() {
|
|
|
- offset += 8;
|
|
|
+ if let Some(lladdr) = lladdr {
|
|
|
+ offset += NdiscOptionRepr::TargetLinkLayerAddr(lladdr).buffer_len();
|
|
|
}
|
|
|
if let Some(NdiscRedirectedHeader { header, data }) = redirected_hdr {
|
|
|
offset += 8 + header.buffer_len() + data.len();
|
|
@@ -439,7 +442,7 @@ impl<'a> Repr<'a> {
|
|
|
let mut opt_pkt =
|
|
|
NdiscOption::new_unchecked(&mut packet.payload_mut()[offset..]);
|
|
|
NdiscOptionRepr::Mtu(mtu).emit(&mut opt_pkt);
|
|
|
- offset += 8;
|
|
|
+ offset += NdiscOptionRepr::Mtu(mtu).buffer_len();
|
|
|
}
|
|
|
if let Some(prefix_info) = prefix_info {
|
|
|
let mut opt_pkt =
|
|
@@ -493,7 +496,7 @@ impl<'a> Repr<'a> {
|
|
|
Some(lladdr) => {
|
|
|
let mut opt_pkt = NdiscOption::new_unchecked(packet.payload_mut());
|
|
|
NdiscOptionRepr::TargetLinkLayerAddr(lladdr).emit(&mut opt_pkt);
|
|
|
- 8
|
|
|
+ NdiscOptionRepr::TargetLinkLayerAddr(lladdr).buffer_len()
|
|
|
}
|
|
|
None => 0,
|
|
|
};
|