@@ -5,7 +5,7 @@ pub mod socket;
55pub mod uri;
66pub ( crate ) mod utils;
77
8- use crate :: socket:: icmp:: IcmpEchoType ;
8+ use crate :: socket:: icmp:: { IcmpConfig , IcmpEchoType } ;
99use anyhow:: Context ;
1010use parking_lot:: { RwLock , RwLockUpgradableReadGuard , RwLockWriteGuard } ;
1111use poll:: Poll ;
@@ -22,6 +22,12 @@ const MAX_PACKET_SIZE: usize = 65535;
2222/// interval that cleanup happens, lowering this result in lower allowed unused time
2323const CLEANUP_INTERVAL : Duration = Duration :: from_secs ( 7 * 60 ) ;
2424
25+ #[ derive( Default , Clone ) ]
26+ pub struct Args {
27+ pub reverse_icmp : bool ,
28+ pub force_icmpv6 : bool ,
29+ }
30+
2531/// blocks current thread and runs a forwarder server that listens on `listen_uri` and forwards
2632/// all incoming packets to `remote_uri` and also forwards all packets returned by `remote_uri`
2733/// to the client that initiated the connection
@@ -33,19 +39,28 @@ pub fn run(
3339 listen_uri : Uri ,
3440 remote_uri : Uri ,
3541 passphrase : Option < String > ,
36- reverse_icmp : bool ,
42+ args : Args ,
3743) -> anyhow:: Result < ( ) > {
3844 let listen_addr = & listen_uri. addr ;
39- let icmp_type = if reverse_icmp {
45+ let force_icmpv6 = args. force_icmpv6 ;
46+ let icmp_type = if args. reverse_icmp {
4047 IcmpEchoType :: Reply
4148 } else {
4249 IcmpEchoType :: Request
4350 } ;
44- let socket = Socket :: bind ( listen_uri. protocol , listen_addr, icmp_type)
51+ let icmp_config = IcmpConfig {
52+ echo_type : icmp_type,
53+ force_icmpv6,
54+ } ;
55+ let socket = Socket :: bind ( listen_uri. protocol , listen_addr, icmp_config)
4556 . with_context ( || "couldn't create server" ) ?;
4657 log:: info!( "listen on '{listen_addr}'" ) ;
4758
48- let poll = poll:: new ( remote_uri. protocol , remote_uri. addr , icmp_type. opposite ( ) )
59+ let icmp_config = IcmpConfig {
60+ echo_type : icmp_type. opposite ( ) ,
61+ force_icmpv6 : args. force_icmpv6 ,
62+ } ;
63+ let poll = poll:: new ( remote_uri. protocol , remote_uri. addr , icmp_config)
4964 . with_context ( || "couldn't create poll" ) ?;
5065 let registry = poll
5166 . get_registry ( )
@@ -65,6 +80,7 @@ pub fn run(
6580 passphrase,
6681 remote_uri,
6782 icmp_type. opposite ( ) ,
83+ force_icmpv6,
6884 listen_uri. addr . port ( ) ,
6985 ) ;
7086 Ok ( ( ) )
@@ -86,6 +102,7 @@ fn run_server(
86102 passphrase : Option < String > ,
87103 remote_uri : Uri ,
88104 peer_icmp_type : IcmpEchoType ,
105+ force_icmpv6 : bool ,
89106 listening_port : u16 ,
90107) {
91108 let buffer = create_socket_buffer ! ( MAX_PACKET_SIZE ) ;
@@ -112,7 +129,11 @@ fn run_server(
112129 None => {
113130 log:: info!( "new client '{from_addr}'" ) ;
114131 let peers = RwLockUpgradableReadGuard :: upgrade ( peers) ;
115- let peer = match add_new_peer ( & remote_uri, from_addr, peers, peer_icmp_type) {
132+ let icmp_config = IcmpConfig {
133+ echo_type : peer_icmp_type,
134+ force_icmpv6,
135+ } ;
136+ let peer = match add_new_peer ( & remote_uri, from_addr, peers, icmp_config) {
116137 Ok ( peer) => peer,
117138 Err ( error) => {
118139 log:: error!( "couldn't add new peer: {error:?}" ) ;
@@ -132,9 +153,9 @@ fn add_new_peer(
132153 remote_uri : & Uri ,
133154 from_addr : SocketAddr ,
134155 mut peers : RwLockWriteGuard < PeerManager > ,
135- icmp_echo_type : IcmpEchoType ,
156+ icmp_config : IcmpConfig ,
136157) -> anyhow:: Result < Arc < Peer > > {
137- let new_peer = Peer :: new ( remote_uri, from_addr, icmp_echo_type ) ?;
158+ let new_peer = Peer :: new ( remote_uri, from_addr, icmp_config ) ?;
138159 let peer = peers. add_peer ( new_peer) ?;
139160 Ok ( peer)
140161}
0 commit comments