@@ -17,37 +17,52 @@ const ND6_INFINITE_LIFETIME: u32 = u32::MAX;
1717
1818// SIOCIFDESTROY
1919ioctl_write_ptr ! ( destroy_clone_if, b'i' , 121 , IfReq ) ;
20+
2021// SIOCIFCREATE2
2122// FIXME: not on NetBSD
2223ioctl_readwrite ! ( create_clone_if, b'i' , 124 , IfReq ) ;
24+
2325// SIOCGIFMTU
2426#[ cfg( any( target_os = "freebsd" , target_os = "macos" ) ) ]
2527ioctl_readwrite ! ( get_if_mtu, b'i' , 51 , IfMtu ) ;
2628#[ cfg( target_os = "netbsd" ) ]
2729ioctl_readwrite ! ( get_if_mtu, b'i' , 126 , IfMtu ) ;
30+
2831// SIOCSIFMTU
2932#[ cfg( any( target_os = "freebsd" , target_os = "macos" ) ) ]
3033ioctl_write_ptr ! ( set_if_mtu, b'i' , 52 , IfMtu ) ;
3134#[ cfg( target_os = "netbsd" ) ]
3235ioctl_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" ) ]
3542ioctl_write_ptr ! ( add_addr_if, b'i' , 43 , InAliasReq ) ;
3643#[ cfg( any( target_os = "macos" , target_os = "netbsd" ) ) ]
3744ioctl_write_ptr ! ( add_addr_if, b'i' , 26 , InAliasReq ) ;
45+
3846// SIOCDIFADDR
3947ioctl_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" ) ]
4254ioctl_write_ptr ! ( add_addr_if_in6, b'i' , 27 , In6AliasReq ) ;
4355#[ cfg( target_os = "macos" ) ]
4456ioctl_write_ptr ! ( add_addr_if_in6, b'i' , 26 , In6AliasReq ) ;
4557#[ cfg( target_os = "netbsd" ) ]
4658ioctl_write_ptr ! ( add_addr_if_in6, b'i' , 107 , In6AliasReq ) ;
59+
4760// SIOCDIFADDR_IN6
4861ioctl_write_ptr ! ( del_addr_if_in6, b'i' , 25 , IfReq6 ) ;
62+
4963// SIOCSIFFLAGS
5064ioctl_write_ptr ! ( set_if_flags, b'i' , 16 , IfReqFlags ) ;
65+
5166// SIOCGIFFLAGS
5267ioctl_readwrite ! ( get_if_flags, b'i' , 17 , IfReqFlags ) ;
5368
@@ -71,6 +86,14 @@ pub struct IfReq {
7186}
7287
7388impl 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,25 @@ pub struct IfReq6 {
161191
162192impl 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+ pub ( super ) fn set_address ( & self ) -> Result < ( ) , IoError > {
203+ let socket = create_socket ( AddressFamily :: Inet6 ) . map_err ( IoError :: WriteIo ) ?;
204+
205+ unsafe {
206+ set_addr_if_in6 ( socket. as_raw_fd ( ) , self ) . map_err ( IoError :: WriteIo ) ?;
207+ }
208+
209+ Ok ( ( ) )
210+ }
174211
212+ pub ( super ) fn delete_address ( & self ) -> Result < ( ) , IoError > {
175213 let socket = create_socket ( AddressFamily :: Inet6 ) . map_err ( IoError :: WriteIo ) ?;
176214 unsafe {
177215 del_addr_if_in6 ( socket. as_raw_fd ( ) , self ) . map_err ( IoError :: WriteIo ) ?;
0 commit comments