diff --git a/src/addr/add.rs b/src/addr/add.rs index 2825648..2a46a78 100644 --- a/src/addr/add.rs +++ b/src/addr/add.rs @@ -29,6 +29,7 @@ impl AddressAddRequest { index: u32, address: IpAddr, prefix_len: u8, + peer_address: Option, ) -> Self { let mut message = AddressMessage::default(); @@ -45,14 +46,18 @@ impl AddressAddRequest { message.attributes.push(AddressAttribute::Multicast(a)); } } else { - message.attributes.push(AddressAttribute::Address(address)); - - // for IPv4 the IFA_LOCAL address can be set to the same value as - // IFA_ADDRESS - message.attributes.push(AddressAttribute::Local(address)); + // If peer_address is provided, use it as IFA_ADDRESS + if let Some(peer) = peer_address { + message.attributes.push(AddressAttribute::Address(peer)); + message.attributes.push(AddressAttribute::Local(address)); + } else { + message.attributes.push(AddressAttribute::Address(address)); + // for IPv4 the IFA_LOCAL address can be set to the same value as + // IFA_ADDRESS when no peer is specified + message.attributes.push(AddressAttribute::Local(address)); + } - // set the IFA_BROADCAST address as well (IPv6 does not support - // broadcast) + // set the IFA_BROADCAST address as well (IPv6 does not support broadcast) if let IpAddr::V4(a) = address { if prefix_len == 32 { message.attributes.push(AddressAttribute::Broadcast(a)); diff --git a/src/addr/handle.rs b/src/addr/handle.rs index a29863d..9d2b607 100644 --- a/src/addr/handle.rs +++ b/src/addr/handle.rs @@ -25,8 +25,15 @@ impl AddressHandle { index: u32, address: IpAddr, prefix_len: u8, + peer_address: Option, ) -> AddressAddRequest { - AddressAddRequest::new(self.0.clone(), index, address, prefix_len) + AddressAddRequest::new( + self.0.clone(), + index, + address, + prefix_len, + peer_address, + ) } /// Delete the given address