1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! The second version of the autonat protocol.
//!
//! The implementation follows the [libp2p spec](https://github.com/libp2p/specs/blob/03718ef0f2dea4a756a85ba716ee33f97e4a6d6c/autonat/autonat-v2.md).
//!
//! The new version fixes the issues of the first version:
//! - The server now always dials back over a newly allocated port. This greatly reduces the risk of
//!     false positives that often occured in the first version, when the clinet-server connection
//!     occured over a hole-punched port.
//! - The server protects against DoS attacks by requiring the client to send more data to the
//!     server then the dial back puts on the client, thus making the protocol unatractive for an
//!     attacker.
//!
//! The protocol is seperated into two parts:
//! - The client part, which is implemented in the `client` module. (The client is the party that
//!     wants to check if it is reachable from the outside.)
//! - The server part, which is implemented in the `server` module. (The server is the party
//!     performing reachability checks on behalf of the client.)
//!
//! The two can be used together.

use libp2p_swarm::StreamProtocol;

pub mod client;
pub(crate) mod protocol;
pub mod server;

pub(crate) mod generated {
    #![allow(unreachable_pub)]
    include!("v2/generated/mod.rs");
}

pub(crate) const DIAL_REQUEST_PROTOCOL: StreamProtocol =
    StreamProtocol::new("/libp2p/autonat/2/dial-request");
pub(crate) const DIAL_BACK_PROTOCOL: StreamProtocol =
    StreamProtocol::new("/libp2p/autonat/2/dial-back");

type Nonce = u64;