@@ -17,37 +17,52 @@ const ND6_INFINITE_LIFETIME: u32 = u32::MAX;
17
17
18
18
// SIOCIFDESTROY
19
19
ioctl_write_ptr ! ( destroy_clone_if, b'i' , 121 , IfReq ) ;
20
+
20
21
// SIOCIFCREATE2
21
22
// FIXME: not on NetBSD
22
23
ioctl_readwrite ! ( create_clone_if, b'i' , 124 , IfReq ) ;
24
+
23
25
// SIOCGIFMTU
24
26
#[ cfg( any( target_os = "freebsd" , target_os = "macos" ) ) ]
25
27
ioctl_readwrite ! ( get_if_mtu, b'i' , 51 , IfMtu ) ;
26
28
#[ cfg( target_os = "netbsd" ) ]
27
29
ioctl_readwrite ! ( get_if_mtu, b'i' , 126 , IfMtu ) ;
30
+
28
31
// SIOCSIFMTU
29
32
#[ cfg( any( target_os = "freebsd" , target_os = "macos" ) ) ]
30
33
ioctl_write_ptr ! ( set_if_mtu, b'i' , 52 , IfMtu ) ;
31
34
#[ cfg( target_os = "netbsd" ) ]
32
35
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
+
33
40
// SIOCAIFADDR
34
41
#[ cfg( target_os = "freebsd" ) ]
35
42
ioctl_write_ptr ! ( add_addr_if, b'i' , 43 , InAliasReq ) ;
36
43
#[ cfg( any( target_os = "macos" , target_os = "netbsd" ) ) ]
37
44
ioctl_write_ptr ! ( add_addr_if, b'i' , 26 , InAliasReq ) ;
45
+
38
46
// SIOCDIFADDR
39
47
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
+
40
52
// SIOCAIFADDR_IN6
41
53
#[ cfg( target_os = "freebsd" ) ]
42
54
ioctl_write_ptr ! ( add_addr_if_in6, b'i' , 27 , In6AliasReq ) ;
43
55
#[ cfg( target_os = "macos" ) ]
44
56
ioctl_write_ptr ! ( add_addr_if_in6, b'i' , 26 , In6AliasReq ) ;
45
57
#[ cfg( target_os = "netbsd" ) ]
46
58
ioctl_write_ptr ! ( add_addr_if_in6, b'i' , 107 , In6AliasReq ) ;
59
+
47
60
// SIOCDIFADDR_IN6
48
61
ioctl_write_ptr ! ( del_addr_if_in6, b'i' , 25 , IfReq6 ) ;
62
+
49
63
// SIOCSIFFLAGS
50
64
ioctl_write_ptr ! ( set_if_flags, b'i' , 16 , IfReqFlags ) ;
65
+
51
66
// SIOCGIFFLAGS
52
67
ioctl_readwrite ! ( get_if_flags, b'i' , 17 , IfReqFlags ) ;
53
68
@@ -71,6 +86,14 @@ pub struct IfReq {
71
86
}
72
87
73
88
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
+
74
97
#[ must_use]
75
98
pub ( super ) fn new ( if_name : & str ) -> Self {
76
99
Self {
@@ -99,9 +122,16 @@ impl IfReq {
99
122
Ok ( ( ) )
100
123
}
101
124
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
+ }
104
133
134
+ pub ( super ) fn delete_address ( & self ) -> Result < ( ) , IoError > {
105
135
let socket = create_socket ( AddressFamily :: Inet ) . map_err ( IoError :: WriteIo ) ?;
106
136
unsafe {
107
137
del_addr_if ( socket. as_raw_fd ( ) , self ) . map_err ( IoError :: WriteIo ) ?;
@@ -161,17 +191,34 @@ pub struct IfReq6 {
161
191
162
192
impl IfReq6 {
163
193
#[ must_use]
164
- pub ( super ) fn new ( if_name : & str ) -> Self {
194
+ pub ( super ) fn new_with_address ( if_name : & str , address : Ipv6Addr ) -> Self {
165
195
Self {
166
196
ifr_name : make_ifr_name ( if_name) ,
167
- ifr_ifru : SockAddrIn6 :: default ( ) ,
197
+ ifr_ifru : address . into ( ) ,
168
198
_padding : [ 0u8 ; 244 ] ,
169
199
}
170
200
}
171
201
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
+ }
174
220
221
+ pub ( super ) fn delete_address ( & self ) -> Result < ( ) , IoError > {
175
222
let socket = create_socket ( AddressFamily :: Inet6 ) . map_err ( IoError :: WriteIo ) ?;
176
223
unsafe {
177
224
del_addr_if_in6 ( socket. as_raw_fd ( ) , self ) . map_err ( IoError :: WriteIo ) ?;
0 commit comments