@@ -37,7 +37,7 @@ pub enum BindAddr {
3737 target_os = "solaris"
3838 ) ) ]
3939 Interface ( Interface ) ,
40- #[ cfg( target_os = "linux" ) ]
40+ #[ cfg( any ( target_os = "linux" , target_os = "freebsd" , target_os = "openbsd" ) ) ]
4141 Foreign ( SocketAddr ) ,
4242}
4343
@@ -58,7 +58,7 @@ impl BindAddr {
5858 target_os = "solaris"
5959 ) ) ]
6060 BindAddr :: Interface ( _) => None ,
61- #[ cfg( target_os = "linux" ) ]
61+ #[ cfg( any ( target_os = "linux" , target_os = "freebsd" , target_os = "openbsd" ) ) ]
6262 BindAddr :: Foreign ( addr) => Some ( addr. ip ( ) ) ,
6363 }
6464 }
@@ -96,7 +96,7 @@ impl BindAddr {
9696 AddressFamily :: Ipv4 => socket. bind_device_by_index_v4 ( Some ( iface. id ( ) ) ) ,
9797 AddressFamily :: Ipv6 => socket. bind_device_by_index_v6 ( Some ( iface. id ( ) ) ) ,
9898 } ,
99- #[ cfg( target_os = "linux" ) ]
99+ #[ cfg( any ( target_os = "linux" , target_os = "freebsd" , target_os = "openbsd" ) ) ]
100100 BindAddr :: Foreign ( addr) => {
101101 if AddressFamily :: from ( addr) != peer_family {
102102 return Err ( io:: Error :: new (
@@ -105,18 +105,12 @@ impl BindAddr {
105105 ) ) ;
106106 }
107107 if addr. port ( ) == 0 {
108+ #[ cfg( target_os = "linux" ) ]
108109 set_bind_address_no_port ( socket, true ) ?;
109110 } else {
110111 socket. set_reuse_address ( true ) ?;
111112 }
112- match addr {
113- SocketAddr :: V4 ( _) => {
114- socket. set_ip_transparent_v4 ( true ) ?;
115- }
116- SocketAddr :: V6 ( _) => {
117- crate :: sockopt:: set_ip_transparent_v6 ( socket, true ) ?;
118- }
119- }
113+ crate :: sockopt:: set_transparent ( socket, peer_family) ?;
120114 let addr: SockAddr = ( * addr) . into ( ) ;
121115 socket. bind ( & addr)
122116 }
@@ -153,7 +147,7 @@ impl BindAddr {
153147 AddressFamily :: Ipv4 => socket. bind_device_by_index_v4 ( Some ( iface. id ( ) ) ) ,
154148 AddressFamily :: Ipv6 => socket. bind_device_by_index_v6 ( Some ( iface. id ( ) ) ) ,
155149 } ,
156- #[ cfg( target_os = "linux" ) ]
150+ #[ cfg( any ( target_os = "linux" , target_os = "freebsd" , target_os = "openbsd" ) ) ]
157151 BindAddr :: Foreign ( addr) => {
158152 if AddressFamily :: from ( addr) != peer_family {
159153 return Err ( io:: Error :: new (
@@ -162,16 +156,10 @@ impl BindAddr {
162156 ) ) ;
163157 }
164158 if addr. port ( ) == 0 {
159+ #[ cfg( target_os = "linux" ) ]
165160 set_bind_address_no_port ( socket, true ) ?;
166161 }
167- match addr {
168- SocketAddr :: V4 ( _) => {
169- socket. set_ip_transparent_v4 ( true ) ?;
170- }
171- SocketAddr :: V6 ( _) => {
172- crate :: sockopt:: set_ip_transparent_v6 ( socket, true ) ?;
173- }
174- }
162+ crate :: sockopt:: set_transparent ( socket, peer_family) ?;
175163 let addr: SockAddr = ( * addr) . into ( ) ;
176164 socket. bind ( & addr)
177165 }
@@ -204,22 +192,15 @@ impl BindAddr {
204192 IpAddr :: V6 ( Ipv6Addr :: UNSPECIFIED )
205193 }
206194 } ,
207- #[ cfg( target_os = "linux" ) ]
195+ #[ cfg( any ( target_os = "linux" , target_os = "freebsd" , target_os = "openbsd" ) ) ]
208196 BindAddr :: Foreign ( addr) => {
209197 if AddressFamily :: from ( addr) != family {
210198 return Err ( io:: Error :: new (
211199 io:: ErrorKind :: InvalidInput ,
212200 "foreign bind addr has incorrect address family" ,
213201 ) ) ;
214202 }
215- match addr {
216- SocketAddr :: V4 ( _) => {
217- socket. set_ip_transparent_v4 ( true ) ?;
218- }
219- SocketAddr :: V6 ( _) => {
220- crate :: sockopt:: set_ip_transparent_v6 ( socket, true ) ?;
221- }
222- }
203+ crate :: sockopt:: set_transparent ( socket, family) ?;
223204 let addr: SockAddr = ( * addr) . into ( ) ;
224205 return socket. bind ( & addr) ;
225206 }
0 commit comments