Commit Graph

1842 Commits

Author SHA1 Message Date
6db57121e9 protocols/gossipsub/: Allow custom protocol id (#2718)
Allow for custom protocol ID via `GossipsubConfigBuilder::protocol_id()`.
2022-07-02 10:30:02 +02:00
31f1d66138 Cargo.toml: Undo version bump to v0.47.0 as v0.46.0 is unreleased (#2733) 2022-07-01 16:33:27 +02:00
862ae14ae2 protocols/rendezvous/src/client: Fix clippy warning let-unit-value (#2742) 2022-07-01 16:13:21 +02:00
748588e3f0 protocols/gossipsub: Fix a typo in error message (#2739)
* protocols/gossipsub: Fix a typo in error message

* protocols/gossipsub: Make the error message accurately
2022-06-30 10:20:26 +02:00
423adca0bf protocols/identify: Fix dev deps for example (#2737) 2022-06-29 06:37:57 +02:00
9f7d0fe0ac build(deps): Bump styfle/cancel-workflow-action from 0.9.1 to 0.10.0 (#2731)
Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.9.1 to 0.10.0.
- [Release notes](https://github.com/styfle/cancel-workflow-action/releases)
- [Commits](a40b8845c0...bb6001c4ea)

---
updated-dependencies:
- dependency-name: styfle/cancel-workflow-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 05:23:35 +02:00
71909522cf transports/tcp/: Call take_error on tokio TcpStream (#2725)
See e04e95a for the rational.

With tokio `v1.19.0` released, `TcStream` exposes `take_error`.

This commit applies the same fix from e04e95a to the tokio TCP provider.
2022-06-27 09:36:33 +02:00
f814b21f5a protocols/relay: Don't duplicate p2p protocol in relay reservation (#2696) (#2701) 2022-06-27 06:54:40 +02:00
40744beec1 protocols/identify/: Add example (#2689) 2022-06-27 04:17:59 +02:00
072d7364a1 swarm/CHANGELOG: Merge unreleased section v0.36.2 with v0.37.0 (#2727) 2022-06-26 14:24:50 +02:00
2c70c59618 protocols/identify: Extend log message on second identify push (#2726)
Print remote peer ID when seeing a second identify push stream coming in.
2022-06-26 10:37:29 +02:00
0f40e513cc core/muxing: Replace Into<io::Error> bound on StreamMuxer with std::error::Error (#2710)
* core/muxing: Remove `Into<io::Error>` bound from `StreamMuxer::Error`

This allows us to preserve the type information of a muxer's concrete
error as long as possible. For `StreamMuxerBox`, we leverage `io::Error`'s
capability of wrapping any error that implements `Into<Box<dyn Error>>`.

* Use `?` in `Connection::poll`

* Use `?` in `muxing::boxed::Wrap`

* Use `futures::ready!` in `muxing::boxed::Wrap`

* Fill PR number into changelog

* Put `Error + Send + Sync` bounds directly on `StreamMuxer::Error`

* Move `Send + Sync` bounds to higher layers

* Use `map_inbound_stream` helper

* Update changelog to match new implementation
2022-06-24 08:26:49 +02:00
eb490c08e9 core/muxing: Force StreamMuxer::Substream to implement Async{Read,Write} (#2707)
Co-authored-by: Max Inden <mail@max-inden.de>
2022-06-23 21:52:11 +10:00
118046c9e0 transports/uds: Bump version due to libp2p-core upgrade (#2720)
`libp2p` 0.45.1 depends (amongst others) on `libp2p-uds` v0.32.0 and on
`libp2p-core` v0.33.0 `libp2p-uds` v0.32.0, however, depends on `libp2p-core`
v0.32.0.

This commit changes the version mismatch for the upcoming `libp2p release.
2022-06-23 08:48:05 +02:00
7eaa9c7bb7 swarm/src/connection: Extend log when exceeding streams limit (#2716)
Log peer ID and stream limit as well as reference config option when limit is
exceeded. This should help folks running into this limit debug what is going on.
2022-06-22 06:02:55 +02:00
e2bef93bd7 protocols/autonat: Export DEFAULT_PROTOCOL_NAME (#2717) 2022-06-22 05:36:20 +02:00
cb3784a8b3 misc/metrics: Use correct event name for dcutr metrics (#2714) 2022-06-21 07:04:18 +02:00
ea487aebfe muxers/mplex: Implement AsyncRead and AsyncWrite for Substream (#2706)
This aligns the public API of the `libp2p-mplex` module with the one
from `libp2p-yamux`. This change has two benefits:

1. For standalone users of `libp2p-mplex`, the substreams itself are
now useful, similar to `libp2p-yamux` and don't necessarily need to
be polled via the `StreamMuxer`. The `StreamMuxer` only forwards to
the `Async{Read,Write}` implementations.

2. This will reduce the diff of #2648 because we can chunk the one
giant commit into smaller atomic ones.
2022-06-20 05:33:59 +02:00
3c120ef971 core/muxing: Introduce StreamMuxerEvent::map_inbound_stream (#2691)
Co-authored-by: Max Inden <mail@max-inden.de>
2022-06-16 05:33:32 +10:00
04f31cd501 core/muxing: Introduce boxed module (#2703)
This is analogous to other sub-modules like `transport` within
`libp2p-core` and thus contributes to consistency within the code
base.
2022-06-15 17:25:31 +02:00
c7c21b1023 protocols/gossipsub: Fix duplicate connection id (#2702) 2022-06-14 16:31:27 +02:00
2fd4998928 Cargo.toml: Use Rust 1.60.0 and weak dependency for feats (#2646) 2022-06-10 18:36:29 +02:00
802d00e645 *: Prepare v0.45.1 (#2700) 2022-06-09 15:26:56 +02:00
5cb4886ab2 protocols/kad: Limit # of inbound substreams to 32 (#2699)
* protocols/kad/: Split into outbound and inbound substreams

* protocols/kad: Limit # of inbound substreams to 32

A remote node may still send more than 32 requests in parallel by using more
than one connection or by sending more than one request per stream.

* protocols/kad: Favor new substreams over old ones waiting for reuse

When a new inbound substream comes in and the limit of total inbound substreams
is hit, try to find an old inbound substream waiting to be reused. In such case,
replace the old with the new. In case no such old substream exists, drop the new
one.
2022-06-09 15:12:03 +02:00
0d3787ed04 protocols/relay: Limit inbound streams (#2698)
* protocols/relay: Use prost-codec

* protocols/relay: Respond to at most one incoming reservation request

Also changes poll order prioritizing

- Error handling over everything.
- Queued events over existing circuits.
- Existing circuits over accepting new circuits.
- Reservation management of existing reservation over new reservation
  requests.

* protocols/relay: Deny <= 8 incoming circuit requests with one per peer

* protocols/relay: Deny new circuits before accepting new circuits
2022-06-08 17:33:24 +02:00
0bce7f7fff *: Remove warnings when compiling without default features (#2692)
* Remove unused import in rendezvous tests

* Expand uds-transport conditionals to include features

In case neither the tokio nor the async-std feature is defined,
this file needs to be empty to avoid unused code warnings.

Co-authored-by: Max Inden <mail@max-inden.de>
2022-06-08 13:05:11 +02:00
2acbb457cd swarm/: Limit negotiating inbound substreams per connection (#2697)
This limit is shared across all `ConnectionHandler`s on a single connection. It
only enforces a limit on the number of negotiating substreams. Once negotiated a
`ConnectionHandler` manages the lifecycle of the substream and has to enforce
limits themselves.
2022-06-08 11:48:46 +02:00
59a74b4083 protocols/dcutr: Upgrade at most one inbound connect request (#2695)
Sending two concurrent connect requests is nonsensical. In the case where a
remote sends two, the earlier is dropped in favor of the latter.
2022-06-07 14:52:35 +02:00
676a630875 protocols/identify: Allow at most one inbound identify push stream (#2694)
An identify push contains the whole identify information of a remote
peer. Upgrading multiple inbound identify push streams is useless.
Instead older streams are dropped in favor of newer streams.
2022-06-07 13:42:34 +02:00
fcc987e0f6 muxers/mplex/benches: Use combinators to reduce nesting (#2688) 2022-06-03 17:38:02 +02:00
bd9834aab4 core/either: Use io::Result type alias instead of renaming io::Error (#2687) 2022-06-03 17:22:01 +02:00
c36a749478 muxers/yamux: Use existing Poll import (#2685) 2022-06-03 16:27:13 +02:00
3611d69e09 muxers/yamux: Refactor Yamux::close to use ? (#2677) 2022-05-31 15:24:03 +02:00
6e1e314872 *: Prepare v0.45.0 (#2662) 2022-05-31 13:12:53 +02:00
6078fc619f transports/{tcp,dns,websocket}: Remove Clone imp for *Config (#2682)
This commit removes the `Clone` implementation on `GenTcpConfig` and consequently the `Clone`
implementations on `GenDnsConfig` and `WsConfig`.

When port-reuse is enabled, `GenTcpConfig` tracks the addresses it is listening in a `HashSet`. This
`HashSet` is shared with the `TcpListenStream`s via an `Arc<Mutex<_>>`. Given that `Clone` is
`derive`d on `GenTcpConfig`, cloning a `GenTcpConfig`, results in both instances sharing the same
set of listen addresses. This is not intuitive.

This behavior is for example error prone in the scenario where one wants to speak both plain DNS/TCP and
Websockets. Say a user creates the transport in the following way:

``` Rust
let transport = {
    let tcp = tcp::TcpConfig::new().nodelay(true).port_reuse(true);
    let dns_tcp = dns::DnsConfig::system(tcp).await?;
    let ws_dns_tcp = websocket::WsConfig::new(dns_tcp.clone());
    dns_tcp.or_transport(ws_dns_tcp)
};
```

Both `dns_tcp` and `ws_dns_tcp` share the set of listen addresses, given the `dns_tcp.clone()` to
create the `ws_dns_tcp`. Thus, with port-reuse, a Websocket dial might reuse a DNS/TCP listening
port instead of a Websocket listening port.

With this commit a user is forced to do the below, preventing the above error:

``` Rust
let transport = {
    let dns_tcp = dns::DnsConfig::system(tcp::TcpConfig::new().nodelay(true).port_reuse(true)).await?;
    let ws_dns_tcp = websocket::WsConfig::new(
        dns::DnsConfig::system(tcp::TcpConfig::new().nodelay(true).port_reuse(true)).await?,
    );
    dns_tcp.or_transport(ws_dns_tcp)
};
```

Co-authored-by: Thomas Eizinger <thomas@eizinger.io>
2022-05-31 12:29:43 +02:00
280475645c transports/tcp: Fix port reuse using Arc<RwLock> for listen_addrs (#2670)
Fix bug introduced in 2ad905f35a.

Make sure set of listen addresses is shared between GenTcpConfig and TcpListenStream.
2022-05-30 16:53:52 +02:00
4aa84bf7cd core/transport: Remove Sync bounds (#2667)
With `Transport` becoming non-Clone and having `&mut` self receivers,
the `Sync` requirement no longer makes any sense and we can thus
remove it.
2022-05-29 20:42:48 +02:00
eba763443a protocols/rendezvous: Remove unnecessary mapping to StreamMuxerBox (#2668)
Calling `.boxed()` will already map the muxer in a `StreamMuxer` box.
This mapping is therefore unnecessary.
2022-05-29 17:34:26 +02:00
2b79f113bb core/muxing: Remove the StreamMuxer::flush_all function (#2669)
`libp2p-core` provides the `StreamMuxer` abstraction so it can provide
functionality that abstracts over this trait.

We never use the `flush_all` function as part of our abstractions.
No one else is going to use it so we can remove it from the abstraction.
2022-05-29 17:23:13 +02:00
25c8bc24de core/muxing: Rename close to poll_close (#2666)
It is common practise to prefix functions that return a `Poll` with
`poll_`.
2022-05-29 16:27:40 +02:00
8361fabb47 core/src/muxing: Remove deprecated function (#2665) 2022-05-23 16:56:59 +02:00
ef2afcd41e protocols/autonat: optionally use only global IPs (#2618)
Optionally only perform dial-backs on peers that are observed at a global ip-address.
This is relevant when multiple peers are in the same local network, in which case a peer could incorrectly assume themself to be public because a peer in the same local network was able to dial them. Thus servers should reject dial-back requests from clients with a non-global IP address, and at the same time clients should only pick connected peers as servers if they are global.
Behind a config flag (enabled by default) to also allow use-cases where AutoNAT is needed within a private network.
2022-05-22 22:04:05 +02:00
48598fc1da protocols/autonat: Fix flaky test (#2660)
Handle in test that a `OutboundProbeEvent::Response` can be reported
before the associated inbound connection event.
In rare cases (that only really happen in a test setup where both peers
run on the same device) the server may observe a connection and report
the response back to the client, before the connection event was
reported at the client.
2022-05-22 21:07:55 +02:00
1d6b08b0b6 protocols/dcutr/examples: Wait to tell relay its public addr (#2659)
As a listening client, when requesting a reservation with a relay, the relay
responds with its public addresses. The listening client can then use the public
addresses of the relay to advertise itself as reachable under a relayed
address (`/<public-relay-addr>/p2p-circuit/p2p/<listening-client-peer-id>`).

The above operates under the assumption that the relay knows its public address.
A relay learns its public address from remote peers, via the identify protocol.
In the case where the relay just started up, the listening client might be the
very first node to connect to it.

Such scenario allows for a race condition. The listening client requests a
reservation from the relay, while the relay requests its public address from the
listening client. The former needs to contain the response from the latter.

This commit serializes the two requests, making sure, in the case of a freshly
started relay, that the listening client tells the relay its public address
before requesting a reservation from the relay.

Co-authored-by: Elena Frank <elena.frank@protonmail.com>
2022-05-20 21:59:32 +02:00
686d6ff363 misc/metrics/README: Reference sample Grafana dashboard (#2655) 2022-05-20 09:27:03 +02:00
8c343a911f build(deps): Update pin-project requirement from 0.4.6 to 1.0.10 (#2654)
Updates the requirements on [pin-project](https://github.com/taiki-e/pin-project) to permit the latest version.
- [Release notes](https://github.com/taiki-e/pin-project/releases)
- [Changelog](https://github.com/taiki-e/pin-project/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/pin-project/commits/v1.0.10)

---
updated-dependencies:
- dependency-name: pin-project
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-20 09:09:02 +02:00
0e9ab1c960 protocols/dcutr/example: Wait for relay to accept reservation request (#2642)
When in listening mode, wait for the relay to accept our reservation
request. Only then can a client in dialing mode establish a relayed
connection to us via the relay.

See also
https://github.com/libp2p/rust-libp2p/issues/2621#issuecomment-1123549348
2022-05-19 20:08:32 +02:00
d4c1292d42 transports/dns: Remove Clone trait bound (#2658) 2022-05-19 21:00:46 +10:00
999a212664 README.md: Add elenaf9 to Maintainers (#2656) 2022-05-18 12:13:22 +02:00
9a5fec874d swarm/src/connection: Prioritize handler over negotiating streams (#2638)
The `HandlerWrapper` polls three components:

1. `ConnectionHandler`
2. Outbound negotiating streams
3. Inbound negotiating streams

The `ConnectionHandler` itself might itself poll already negotiated streams.

By polling the three components above in the listed order one:

- Prioritizes local work and work coming from negotiated streams over
  negotiating streams.
- Prioritizes outbound negotiating streams over inbound negotiating
  streams, i.e. outbound requests over inbound requests.
2022-05-18 11:05:08 +02:00