Skip to content

Commit 7a40fab

Browse files
committed
Add bsd::set_address()
1 parent 6bc5b41 commit 7a40fab

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

src/bsd/ifconfig.rs

+53-6
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,52 @@ const ND6_INFINITE_LIFETIME: u32 = u32::MAX;
1717

1818
// SIOCIFDESTROY
1919
ioctl_write_ptr!(destroy_clone_if, b'i', 121, IfReq);
20+
2021
// SIOCIFCREATE2
2122
// FIXME: not on NetBSD
2223
ioctl_readwrite!(create_clone_if, b'i', 124, IfReq);
24+
2325
// SIOCGIFMTU
2426
#[cfg(any(target_os = "freebsd", target_os = "macos"))]
2527
ioctl_readwrite!(get_if_mtu, b'i', 51, IfMtu);
2628
#[cfg(target_os = "netbsd")]
2729
ioctl_readwrite!(get_if_mtu, b'i', 126, IfMtu);
30+
2831
// SIOCSIFMTU
2932
#[cfg(any(target_os = "freebsd", target_os = "macos"))]
3033
ioctl_write_ptr!(set_if_mtu, b'i', 52, IfMtu);
3134
#[cfg(target_os = "netbsd")]
3235
ioctl_write_ptr!(set_if_mtu, b'i', 127, IfMtu);
36+
37+
// SIOCSIFADDR
38+
ioctl_write_ptr!(set_addr_if, b'i', 12, IfReq);
39+
3340
// SIOCAIFADDR
3441
#[cfg(target_os = "freebsd")]
3542
ioctl_write_ptr!(add_addr_if, b'i', 43, InAliasReq);
3643
#[cfg(any(target_os = "macos", target_os = "netbsd"))]
3744
ioctl_write_ptr!(add_addr_if, b'i', 26, InAliasReq);
45+
3846
// SIOCDIFADDR
3947
ioctl_write_ptr!(del_addr_if, b'i', 25, IfReq);
48+
49+
// SIOCSIFADDR_IN6
50+
ioctl_write_ptr!(set_addr_if_in6, b'i', 12, IfReq6);
51+
4052
// SIOCAIFADDR_IN6
4153
#[cfg(target_os = "freebsd")]
4254
ioctl_write_ptr!(add_addr_if_in6, b'i', 27, In6AliasReq);
4355
#[cfg(target_os = "macos")]
4456
ioctl_write_ptr!(add_addr_if_in6, b'i', 26, In6AliasReq);
4557
#[cfg(target_os = "netbsd")]
4658
ioctl_write_ptr!(add_addr_if_in6, b'i', 107, In6AliasReq);
59+
4760
// SIOCDIFADDR_IN6
4861
ioctl_write_ptr!(del_addr_if_in6, b'i', 25, IfReq6);
62+
4963
// SIOCSIFFLAGS
5064
ioctl_write_ptr!(set_if_flags, b'i', 16, IfReqFlags);
65+
5166
// SIOCGIFFLAGS
5267
ioctl_readwrite!(get_if_flags, b'i', 17, IfReqFlags);
5368

@@ -71,6 +86,14 @@ pub struct IfReq {
7186
}
7287

7388
impl IfReq {
89+
#[must_use]
90+
pub(super) fn new_with_address(if_name: &str, address: Ipv4Addr) -> Self {
91+
Self {
92+
ifr_name: make_ifr_name(if_name),
93+
ifr_ifru: address.into(),
94+
}
95+
}
96+
7497
#[must_use]
7598
pub(super) fn new(if_name: &str) -> Self {
7699
Self {
@@ -99,9 +122,16 @@ impl IfReq {
99122
Ok(())
100123
}
101124

102-
pub(super) fn delete_address(&mut self, addr: Ipv4Addr) -> Result<(), IoError> {
103-
self.ifr_ifru = addr.into();
125+
pub(super) fn set_address(&self) -> Result<(), IoError> {
126+
let socket = create_socket(AddressFamily::Inet).map_err(IoError::WriteIo)?;
127+
unsafe {
128+
set_addr_if(socket.as_raw_fd(), self).map_err(IoError::WriteIo)?;
129+
}
130+
131+
Ok(())
132+
}
104133

134+
pub(super) fn delete_address(&self) -> Result<(), IoError> {
105135
let socket = create_socket(AddressFamily::Inet).map_err(IoError::WriteIo)?;
106136
unsafe {
107137
del_addr_if(socket.as_raw_fd(), self).map_err(IoError::WriteIo)?;
@@ -161,17 +191,34 @@ pub struct IfReq6 {
161191

162192
impl IfReq6 {
163193
#[must_use]
164-
pub(super) fn new(if_name: &str) -> Self {
194+
pub(super) fn new_with_address(if_name: &str, address: Ipv6Addr) -> Self {
165195
Self {
166196
ifr_name: make_ifr_name(if_name),
167-
ifr_ifru: SockAddrIn6::default(),
197+
ifr_ifru: address.into(),
168198
_padding: [0u8; 244],
169199
}
170200
}
171201

172-
pub(super) fn delete_address(&mut self, addr: Ipv6Addr) -> Result<(), IoError> {
173-
self.ifr_ifru = addr.into();
202+
// #[must_use]
203+
// pub(super) fn new(if_name: &str) -> Self {
204+
// Self {
205+
// ifr_name: make_ifr_name(if_name),
206+
// ifr_ifru: SockAddrIn6::default(),
207+
// _padding: [0u8; 244],
208+
// }
209+
// }
210+
211+
pub(super) fn set_address(&self) -> Result<(), IoError> {
212+
let socket = create_socket(AddressFamily::Inet6).map_err(IoError::WriteIo)?;
213+
214+
unsafe {
215+
set_addr_if_in6(socket.as_raw_fd(), self).map_err(IoError::WriteIo)?;
216+
}
217+
218+
Ok(())
219+
}
174220

221+
pub(super) fn delete_address(&self) -> Result<(), IoError> {
175222
let socket = create_socket(AddressFamily::Inet6).map_err(IoError::WriteIo)?;
176223
unsafe {
177224
del_addr_if_in6(socket.as_raw_fd(), self).map_err(IoError::WriteIo)?;

src/bsd/mod.rs

+17-4
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,19 @@ pub fn delete_interface(if_name: &str) -> Result<(), IoError> {
327327
ifreq.destroy()
328328
}
329329

330+
pub fn set_address(if_name: &str, address: &IpAddrMask) -> Result<(), IoError> {
331+
match address.ip {
332+
IpAddr::V4(address) => {
333+
let ifreq = IfReq::new_with_address(if_name, address);
334+
ifreq.set_address()
335+
}
336+
IpAddr::V6(address) => {
337+
let ifreq6 = IfReq6::new_with_address(if_name, address);
338+
ifreq6.set_address()
339+
}
340+
}
341+
}
342+
330343
pub fn assign_address(if_name: &str, address: &IpAddrMask) -> Result<(), IoError> {
331344
let broadcast = address.broadcast();
332345
let mask = address.mask();
@@ -347,12 +360,12 @@ pub fn assign_address(if_name: &str, address: &IpAddrMask) -> Result<(), IoError
347360
pub fn remove_address(if_name: &str, address: &IpAddrMask) -> Result<(), IoError> {
348361
match address.ip {
349362
IpAddr::V4(address) => {
350-
let mut ifreq = IfReq::new(if_name);
351-
ifreq.delete_address(address)
363+
let ifreq = IfReq::new_with_address(if_name, address);
364+
ifreq.delete_address()
352365
}
353366
IpAddr::V6(address) => {
354-
let mut ifreq6 = IfReq6::new(if_name);
355-
ifreq6.delete_address(address)
367+
let ifreq6 = IfReq6::new_with_address(if_name, address);
368+
ifreq6.delete_address()
356369
}
357370
}
358371
}

src/wgapi_userspace.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ impl WireguardInterfaceApi for WGApi<Userspace> {
181181

182182
// Assign IP addresses to the interface.
183183
for address in &config.addresses {
184-
self.assign_address(&address)?;
184+
self.assign_address(address)?;
185185
}
186186

187187
// configure interface

0 commit comments

Comments
 (0)