aboutsummaryrefslogtreecommitdiff
path: root/crates/tor-proto/src/channel
Commit message (Collapse)AuthorAgeFilesLines
* remove usage of dbg!(..)trinity-1686a2022-02-281-1/+0
| | | | it's making rust-nightly job fail
* proto: Refactor conversion from CodecError to ErrorNick Mathewson2022-02-243-32/+37
| | | | | Remove default conversion; instead use a specific conversion in each of the two modules that need to do it.
* tor-proto: refactor handshake protocol errors to a different typeNick Mathewson2022-02-231-49/+68
| | | | | | | | This helps the user distinguish between protocol violations that happen when connecting to the tor network from those that happen while connected. Closes #358.
* tor-proto: Rename BadHandshake to BadCircHandshakeNick Mathewson2022-02-231-1/+1
| | | | (We'll have a BadChanHandshake soon.)
* tor-proto: Split IoErr based on when it occursNick Mathewson2022-02-232-7/+21
| | | | | | | We want to distinguish handshake failures from errors later on in the channel's lifetime. Closes #359.
* Replace as_mut with deref impl for MutCircEntYuan Lyu2022-02-162-26/+34
|
* Make CircMap open_ent_count O(1)Yuan Lyu2022-02-162-26/+76
|
* Update tor-proto errors to latest API.Nick Mathewson2022-02-152-2/+2
|
* tor-proto: use InternalError for internal errors.Nick Mathewson2022-02-152-8/+10
|
* tor-cell: provide HasKind.Nick Mathewson2022-02-152-14/+44
| | | | | | | | | Additionally, refactor the IoError out of tor_cell::Error: nothing in TorCell created this; it was only used by tor_proto. This required refactoring in tor_proto to use a new error type. Here I decided to use a new CodecError for now, though we may refactor that away soon too.
* Use atomic set-and-check to update OptTimestamps if none.Nick Mathewson2022-02-091-4/+2
| | | | | | | This fixes a tiny race condition in the previous code, where we checked whether an OptTimestamp is None a bit before we set it. Since std::atomic gives us compare_exchange, we might as well use it.
* Remove the use of Mutex in channel unused_since timestampYuan Lyu2022-02-081-11/+6
|
* Expire channels that have been unused for too longYuan Lyu2022-02-042-0/+46
|
* Remove many needless borrows and slicesIan Jackson2022-02-021-1/+1
| | | | | | | Found via clippy::needless_borrow. In some cases I removed needless `[..]` too. See also: needless_borrow suggestion doesn't go far enough https://github.com/rust-lang/rust-clippy/issues/8389
* handshake: Use read_exact, not read and checking lenIan Jackson2022-01-191-3/+7
| | | | | | | | | read_exact has a loop in it, which we need. This means we end up separating the two sites that generate the "not a relay" error, so we need to fish out the error construction. As per https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/249#note_2771023
* clippy: Rename a `from_foo` method that doesn't do conversionIan Jackson2022-01-191-1/+3
|
* Fix two bugs related to incomplete read/writeIan Jackson2022-01-191-3/+3
| | | | Discovered by clippy
* chanmgr: get rid of Arc around ChannelIan Jackson2022-01-131-34/+27
|
* tor-circmgr: Don't clone parameters in create_chantarget()Neel Chauhan2021-12-251-1/+2
|
* tor-proto: Replace XXXs with references to arti#269Nick Mathewson2021-12-201-9/+7
| | | | | These will require thought; should we ignore them, act on them, or continue to treat them as internal errors?
* fix nightly clippy errorsTrinity Pointard2021-12-091-2/+1
|
* Resolve roughly half of the XXXXs.Nick Mathewson2021-12-061-1/+1
| | | | | | | | We want to only use TODO in the codebase for non-blockers, and open tickets for anything that is a bigger blocker than a TODO. These XXXXs seem like definite non-blockers to me. Part of arti#231.
* Mark a test as #[ignore]Nick Mathewson2021-11-291-0/+1
| | | | | | This test seems unreliable on CI: we've got to disable them for now so that we have a working CI system. The CI failure is #238; the ticket to repair them is #244.
* add semicolons if nothing returnedDaniel Eades2021-11-252-13/+13
|
* Remove a couple more eprintln! calls.Nick Mathewson2021-11-231-1/+1
|
* Make unreliable tor-proto tests more reliable (arti#238).eta2021-11-181-12/+16
| | | | | | | | | | | | | | | | | | | | | The `bad_extend_*` failures were caused by bad test code in `bad_extend_test_impl` that used `futures::join!`; this meant that the reactor could receive the `Extended2` cell before it actually got the `ExtendNtor` request, which caused it to get (quite rightly) confused and close the circuit. Spawning a background thread which has a short delay before sending the `Extended2` cell seems to have alleviated this problem. `new_circ_create_failure` is similar; I think the reactor was getting dropped before it had a chance to flush out its `CreateFast` cell properly, because it had already gotten the result back (since the test code sends it indiscriminately). This was "fixed" in much the same manner as the other test: making it wait a bit before sending the result cell back. There seem to be other tests that use `futures::join!` (like `begindir`?), and use similarly erroneous patterns; I haven't gotten any to fail reliably enough to be able to debug them, though.
* tor-proto: Use tor-rtcompat macros for testing, not tokio.Nick Mathewson2021-11-153-430/+463
| | | | Closes #222.
* A few more eprintln!() removals that I missed.Nick Mathewson2021-11-131-4/+0
|
* Get rid of unbounded stream sender, and RawCellStreameta2021-11-121-1/+1
| | | | | | | | | | | | | | | | | | | | | Previously, the reactor would use an `UnboundedSender` to send things to the `RawCellStream`, in order that the reactor wouldn't block if you failed to read from the latter. This is bad, though, since it means people can just run us out of memory by sending lots of things. To fix this, we make the new `StreamReader` type (which does the reading parts from `RawCellStream`) keep track of the stream's receive window and issue SENDMEs once *it* has consumed enough data to require it, thus meaning that we shouldn't get sent enough data to fill the channel between reactor and `StreamReader` (and, if we do, that's someone trying to flood us, and we abort the circuit). As hinted to above, the `RawCellStream` was removed and its reading functionalities replaced by `StreamReader`; its writing functionalities are handled by `StreamTarget` anyway, so we just give out one of those for the write end. This now means we don't need any mutexes! note: this commit introduces a known issue, arti#230
* Completely overhaul the tor-proto circuit reactoreta2021-11-121-14/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rather like e8e9699c3c239d6c30f9ad414f15d3bad6ec03fd ("Get rid of tor-proto's ChannelImpl, and use the reactor more instead"), this admittedly rather large commit refactors the way circuits in `tor-proto` work, centralising all of the logic in one large nonblocking reactor which other things send messages into and out of, instead of having a bunch of `-Impl` types that are protected by mutexes. Congestion control becomes a lot simpler with this refactor, since the reactor can manage both stream- and circuit-level congestion control unilaterally without having to share this information with consumers, meaning we can get rid of some locks. The way streams work also changes, in order to facilitate better handling of backpressure / fairness between streams: each stream now has a set of channels to send and receive messages over, instead of sending relay cells directly onto the channel (now, the reactor pulls messages off each stream in each map, and tries to avoid doing so if it won't be able to forward them yet). Additionally, a lot of "close this circuit / stream" messages aren't required any more, since that state is simply indicated by one end of a channel going away. This should make cleanup a lot less brittle. Getting all of this to work involved writing a fair deal of intricate nonblocking code in Reactor::run_once that tries very hard to be mindful of making backpressure work correctly (and congestion control); the old code could get away with having tasks .await on things, but the new reactor can't really do this (as it'd lock the reactor up), so has to do everything in a nonblocking manner.
* Replace all println/eprintln calls outside of arti CLI with trace.Nick Mathewson2021-11-041-1/+1
|
* tor-proto: Use a dedicated sender for channel cells, make full-duplexeta2021-11-031-40/+90
| | | | | | | | | | | | | | | | @nickm pointed out that refactoring tor_proto::channel's Reactor to do sending as well meant that it could only send or receive, but not both, simultaneously, which was bad! To fix this, rewrite Reactor::run_once to use a handcrafted future (with futures::future::poll_fn) that can handle the logic required to push items onto the sink asynchronously (i.e. checking that it can be written to before trying to do that, and then flushing it). This also means we don't use select_biased! any more, and just handroll that logic ourselves; as a small bonus, we can now process all 3 kinds of message in one run_once() call, instead of having to do only one of them.
* Get rid of tor-proto's ChannelImpl, and use the reactor more insteadeta2021-11-033-148/+148
| | | | | | | | | | | | | | | | | | | Instead of awkwardly sharing the internals of a `tor-proto` `Channel` between the reactor task and any other tasks, move most of the internals into the reactor and have other tasks communicate with the reactor via message-passing to allocate circuits and send cells. This makes a lot of things simple, and has convenient properties like not needing to wrap the `Channel` in an `Arc` (though some places in the code still do this for now). A lot of test code required tweaking in order to deal with the refactor; in fact, fixing the tests probably took longer than writing the mainline code (!). Importantly, we now use `tokio`'s `tokio::test` annotation instead of `async_test`, so that we can run things in the background (which is required to have reactors running for the circuit tests). This is an instance of #205, and also kind of #217.
* Merge branch 'timestamp'Nick Mathewson2021-11-022-0/+9
|\
| * Use coarsetime to build an incoming traffic timestamp.Nick Mathewson2021-11-022-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We need this for the circuit timeout estimator (#57). It needs to know "how recently have we got some incoming traffic", so that it can tell whether a circuit has truly timed out, or whether the entire network is down. I'm implementing this with coarsetime, since we need to update these in response to every single incoming cell, and we need the timestamp operation to be _fast_. (This reinstates an earlier commit, f30b2280, which I reverted because we didn't need it at the time.) Closes #179.
* | Refactor tor_proto::channel::Reactor to use an UnboundedSendereta2021-11-021-39/+9
|/ | | | | | | | | | | There wasn't any good reason for tor-proto's channel reactor to use a shedload of oneshot channels instead of just an mpsc UnboundedSender, and the whole `CtrlResult` thing made even less sense. Straighten this code out by replacing all of that machinery with a simple UnboundedSender, instead. (part of arti#218)
* fix/silence clippy lints in test modulesDaniel Eades2021-09-085-3/+7
|
* Move all crates into a `crates` subdirectory.Nick Mathewson2021-08-275-0/+2046
This will cause some pain for now, but now is really the best time to do this kind of thing.