Commit Graph

28098 Commits

Author SHA1 Message Date
Roger Dingledine
a575e35c17 sort pqueue ties by time-added
our pqueue implementation does bizarre unspecified things with
ordering of elements that are equal. it certainly doesn't do any
sort of "first in first out" property that i was expecting.

now make it explicit by saying that "equal-effort, added-earlier" is
higher priority.
2023-05-10 07:37:11 -07:00
Roger Dingledine
13f6258245 rate-limit low-effort rendezvous responses
specifically, if we have 16 in-flight rend circs, and the next
one at the top of the pqueue is lower than our suggested effort,
then don't launch it yet.

this way we always launch adequate-effort requests immediately, and
we always handle *some* low-effort requests, but we are ready at any
moment to handle a few new adequate-effort requests.
2023-05-10 07:37:11 -07:00
Roger Dingledine
dec3a0af7a make the rend_pqueue_cb event be postloop
this change makes us reach the callback *after* each mainloop
run, rather than as the next event to run immediately after
activation.

with the old behavior, we were starving everything else to drain the
pqueue entirely, each time we got a new intro2 cell.

now we at least will get to other activities as well.
2023-05-10 07:37:11 -07:00
Roger Dingledine
b95bd5017f track how many in-flight hs-side rend circs
not used in decision-making yet, but it's all ready to use in a
"don't dequeue any more if we have too many in-flight" kind of way
2023-05-10 07:37:11 -07:00
Roger Dingledine
5e768d5cb9 we were sorting our pqueue the wrong way
i.e. we were putting higher effort intro2 cells at the *end*
2023-05-10 07:37:11 -07:00
Roger Dingledine
d0c2d4cb43 add a log line for when client succeeds 2023-05-10 07:37:11 -07:00
Roger Dingledine
4e55f28220 bump up some log messages for easier debugging 2023-05-10 07:37:11 -07:00
Roger Dingledine
8042379c44 new design for handling too many pending rend reqs
now we let ourselves queue up to twice as many as we expect, and when
we get to the limit we make a new pqueue and move over the first n
elements that we like most.

(the old approach, of calling SMARTLIST_DEL_CURRENT_KEEPORDER() on
elements in a pqueue, will destroy its heapify property.)

we also discard elements that are too old, either during the trimming
process or if they come up as the next request to respond to.

lastly, fix a fencepost error on how many rend reqs we would handle
per iteration.
2023-05-10 07:37:11 -07:00
Roger Dingledine
85cba057e7 make a log message clearer about our actual intent 2023-05-10 07:37:11 -07:00
Roger Dingledine
4571faf0c3 pass time around as a parameter
should help with unit testing
2023-05-10 07:37:11 -07:00
David Goulet
047f8c63ee hs: Maximum rend request and trimming of the queue
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
bc9fe5a6f8 hs: Handle multiple rend request per mainloop run
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
c2f6b057b8 hs: Don't expire RP circuits to HS with PoW
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
35227a7a15 trunnel: Centralize the INTRO1 extension type
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
4eb783e97b hs: Priority queue for rendezvous requests
If PoW are enabled, use a priority queue by effort for the rendezvous
requests hooked into the mainloop.

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
f0b63ca242 hs: Move rendezvous circuit data structure
When parsing an INTRODUCE2 cell, we extract data in order to launch the
rendezvous circuit. This commit creates a data structure just for that
data so it can be used by future commits for prop327 in order to copy
that data over a priority queue instead of the whole intro data data
structure which contains pointers that could dissapear.

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
ca74530b40 hs: Setup service side PoW defenses
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
8b41e09a77 hs: Client now solve PoW if present
At this commit, the tor main loop solves it. We might consider moving
this to the CPU pool at some point.

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
26957b47ac hs: Descriptor support for PoW
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:11 -07:00
David Goulet
51ce0bb6ef hs: Add solve and verify PoW functions
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:10 -07:00
David Goulet
c611e328de hs: Add data structure needed for PoW 2023-05-10 07:37:10 -07:00
David Goulet
d79814f1b1 hs: PoW extension encoding
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:10 -07:00
David Goulet
5ef811b7d0 trunnel: INTRODUCE1 PoW cell extension
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:10 -07:00
David Goulet
95445f49f1 ext: Add Equi-X library
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-05-10 07:37:10 -07:00
Mike Perry
9ee71eaf5a CID 1524707: Quiet coverity noise 2023-05-04 16:31:08 +00:00
Mike Perry
bdf4fef2db CID 1524706: Remove dead assignment 2023-05-04 16:31:08 +00:00
Mike Perry
33c3059c82 Handle infinite loop with only one bridge (or snowflake). 2023-05-04 16:31:08 +00:00
Mike Perry
61aa4c3657 Actually count exits with conflux support, rather than relays. 2023-04-18 16:51:07 +00:00
David Goulet
2bb8988629 Fix cases where edge connections can stall.
We discovered two cases where edge connections can stall during testing:
  1. Due to final data sitting in the edge inbuf when it was resumed
  2. Due to flag synchronization between the token bucket and XON/XOFF

The first issue has always existed in C-Tor, but we were able to tickle it
in scp testing. If the last data from the protocol is able to fit in the
inbuf, but not large enough to send, if an XOFF or connection block comes in
at exactly that point, when the edge connection resumes, there will be no
data to read from the socket, but the inbuf can just sit there, never
draining.

We noticed the second issue along the way to finding the first. It seems
wrong, but it didn't seem to affect anything in practice.

These are extremely rare in normal operation, but with conflux, XON/XOFF
activity is more common, so we hit these.

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:11 +00:00
Mike Perry
7c70f713c3 Avoid closing dirty circs with active half-edges
In https://gitlab.torproject.org/tpo/core/tor/-/issues/40623, we changed the
DESTROY propogation to ensure memory was freed quickly at relays. This was a
good move, but it exacerbates the condition where a stream is closed on a
circuit, and then it is immediately closed because it is dirty. This creates a
race between the DESTROY and the last data sent on the stream. This race is
visible in shadow, and does happen.

This could be backported. A better solution to these kinds of problems is to
create an ENDED cell, and not close any circuits until the ENDED comes back.
But this will also require thinking, since this ENDED cell can also get lost,
so some kind of timeout may be needed either way. The ENDED cell could just
allow us to have much longer timeouts for this case.
2023-04-06 15:57:11 +00:00
David Goulet
731a50c8c4 Prop#329: Add conflux to build
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:11 +00:00
Mike Perry
8d4781e730 Prop#329 Tests: Add tests for the conflux pool 2023-04-06 15:57:11 +00:00
David Goulet
39c2927d6f Prop#329 Pool: Handle pre-building and using conflux sets.
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:11 +00:00
Mike Perry
46e473f43e Prop#329 Pool: Avoid sharing Guards and Middles between circuits.
Conflux must not use the same Guard for each leg; nor the same middle for each
leg.
2023-04-06 15:57:11 +00:00
David Goulet
336a24754d Prop#329 Pool: Handle linking, unlinking, and relaunching conflux circuit legs.
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:11 +00:00
Mike Perry
2f865b4bba Prop#329 streams: Handle stream usage with conflux
This adds utility functions to help stream block decisions, as well as cpath
layer_hint checks for stream cell acceptance, and syncing stream lists
for conflux circuits.

These functions are then called throughout the codebase to properly manage
conflux streams.
2023-04-06 15:57:11 +00:00
Mike Perry
21c861bfa3 Refactor stream blocking due to channel cell queues
Streams can get blocked on a circuit in two ways:
  1. When the circuit package window is full
  2. When the channel's cell queue is too high

Conflux needs to decouple stream blocking from both of these conditions,
because streams can continue on another circuit, even if the primary circuit
is blocked for either of these cases.

However, both conflux and congestion control need to know if the channel's
cell queue hit the highwatermark and is still draining, because this condition
is used by those components, independent of stream state.

Therefore, this commit renames the 'streams_blocked_on_chan' variable to
signify that it refers to the cell queue state, and also refactors the actual
stream blocking bits out, so they can be handled separately if conflux is
present.
2023-04-06 15:57:10 +00:00
Mike Perry
a4ee0c29ee Prop#329: Add purposes for conflux circuits
Because UNLINKED circuits must never be used for streams, but LINKED circuits
can be, we want these separate.
2023-04-06 15:57:10 +00:00
Mike Perry
cf715a56f1 Prop#329 sendme: Adjust sendme sending and tracking for conflux
Because circuit-level sendmes are sent before relay data cells are processed,
we can safely move this to before the conflux decision. In this way,
regardless of conflux being negotiated, we still send sendmes as soon as data
cells are recieved. This avoids introducing conflux queue delay into RTT
measurement, which is important for measuring actual circuit capacity.

The circuit-level tracking must happen inside the call to send a data cell,
since that call now chooses a circuit to send on. Turns out, we were already
doing this kind of here, but only for the digest. Now we do both things here.
2023-04-06 15:57:10 +00:00
David Goulet
b999051e44 Prop#329 OOM: Handle freeing conflux queues on OOM
We use the oldest-circ-first method here, since that seems good for conflux:
queues could briefly spike, but the bad case is if they are maliciously
bloated to stick around for a long time.

The tradeoff here is that it is possible to kill old circuits on a relay
quickly, but that has always been the case with this algorithm choice.

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:10 +00:00
Mike Perry
e0881a669a Prop#329 Algs: Conflux multiplexed cell sending decision algs 2023-04-06 15:57:10 +00:00
Mike Perry
2bd1eca78c Prop#329 Algs: Conflux multiplexed cell receive handling 2023-04-06 15:57:10 +00:00
Mike Perry
a1794ef687 Prop#329 Headers: Header files for conflux 2023-04-06 15:57:10 +00:00
Mike Perry
eac2bad86b Prop#329 params: Consensus parameter and torrc handling
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:10 +00:00
David Goulet
0d14d6b44a Prop#329 Tests: Add tests for conflux cells.
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:10 +00:00
David Goulet
8b185b2ac3 Prop#329 Cells: Building and parsing parsing conflux commands
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:10 +00:00
David Goulet
45432175fe trunnel: Add Conflux related cell definition
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:10 +00:00
David Goulet
a9fc6c937c protover: Support Relay=5 for Conflux (prop329)
Closes #40721

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-04-06 15:57:10 +00:00
David Goulet
59456cb3cf Merge branch 'tor-gitlab/mr/700' 2023-03-13 11:22:31 -04:00
Gabriela Moldovan
1a60fa547f metrics: Add HS service side circuit build time metrics.
This adds 2 histogram metrics for hidden services:
* `tor_hs_rend_circ_build_time` - the rendezvous circuit build time in milliseconds
* `tor_hs_intro_circ_build_time` - the introduction circuit build time in milliseconds

The text representation representation of the new metrics looks like this:
```
# HELP tor_hs_rend_circ_build_time The rendezvous circuit build time in milliseconds
# TYPE tor_hs_rend_circ_build_time histogram
tor_hs_rend_circ_build_time_bucket{onion="<elided>",le="1000.00"} 2
tor_hs_rend_circ_build_time_bucket{onion="<elided>",le="5000.00"} 10
tor_hs_rend_circ_build_time_bucket{onion="<elided>",le="10000.00"} 10
tor_hs_rend_circ_build_time_bucket{onion="<elided>",le="30000.00"} 10
tor_hs_rend_circ_build_time_bucket{onion="<elided>",le="60000.00"} 10
tor_hs_rend_circ_build_time_bucket{onion="<elided>",le="+Inf"} 10
tor_hs_rend_circ_build_time_sum{onion="<elided>"} 10824
tor_hs_rend_circ_build_time_count{onion="<elided>"} 10
# HELP tor_hs_intro_circ_build_time The introduction circuit build time in milliseconds
# TYPE tor_hs_intro_circ_build_time histogram
tor_hs_intro_circ_build_time_bucket{onion="<elided>",le="1000.00"} 0
tor_hs_intro_circ_build_time_bucket{onion="<elided>",le="5000.00"} 6
tor_hs_intro_circ_build_time_bucket{onion="<elided>",le="10000.00"} 6
tor_hs_intro_circ_build_time_bucket{onion="<elided>",le="30000.00"} 6
tor_hs_intro_circ_build_time_bucket{onion="<elided>",le="60000.00"} 6
tor_hs_intro_circ_build_time_bucket{onion="<elided>",le="+Inf"} 6
tor_hs_intro_circ_build_time_sum{onion="<elided>"} 9843
tor_hs_intro_circ_build_time_count{onion="<elided>"} 6
```

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-03-13 11:18:40 -04:00
Gabriela Moldovan
d1264d11c3 metrics: Add support for histograms.
This will enable us to add e.g. circuit build metrics (#40717).

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-03-13 11:18:40 -04:00
nonameformee
8f50f490a6 Update 3 files
- /src/feature/dirauth/process_descs.c
- /src/test/test_process_descs.c
- /changes/ticket40760
2023-03-12 11:40:52 +00:00
David Goulet
3fa08dc9a7 Merge branch 'tor-gitlab/mr/697' 2023-03-07 09:49:53 -05:00
Gabriela Moldovan
16c6788fbc metrics: Add a reason label to the HS error metrics.
This adds a `reason` label to the `hs_intro_rejected_intro_req_count` and
`hs_rdv_error_count` metrics introduced in #40755.

Metric look up and intialization is now more a bit more involved. This may be
fine for now, but it will become unwieldy if/when we add more labels (and as
such will need to be refactored).

Also, in the future, we may want to introduce finer grained `reason` labels.
For example, the `invalid_introduce2` label actually covers multiple types of
errors that can happen during the processing of an INTRODUCE2 cell (such as
cell parse errors, replays, decryption errors).

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-03-07 09:46:05 -05:00
David Goulet
85f5318f7f Merge branch 'tor-gitlab/mr/696' 2023-03-07 08:52:34 -05:00
David Goulet
73eab76e6d Merge branch 'maint-0.4.7' 2023-03-07 08:39:48 -05:00
Gabriela Moldovan
db4c4d656a
metrics: Add metrics for rendezvous and introduction request failures.
This introduces a couple of new service side metrics:
* `hs_intro_rejected_intro_req_count`, which counts the number of introduction
  requests rejected by the hidden service
* `hs_rdv_error_count`, which counts the number of rendezvous errors as seen by
  the hidden service (this number includes the number of circuit establishment
  failures, failed retries, end-to-end circuit setup failures)

Closes #40755. This partially addresses #40717.

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-02-16 18:54:30 +00:00
Richard Pospesel
c71f31dccc Reworded OpenSSL bug 7712 detection warning to avoid OpenSSL 1.1.1b detection false positive. 2023-02-16 13:27:30 +00:00
Roger Dingledine
36612b9bf8 vote AuthDirMaxServersPerAddr in consensus params
Directory authorities now include their AuthDirMaxServersPerAddr
config option in the consensus parameter section of their vote. Now
external tools can better predict how they will behave.

In particular, the value should make its way to the
https://consensus-health.torproject.org/#consensusparams page.

Once enough dir auths vote this param, they should also compute a
consensus value for it in the consensus document. Nothing uses this
consensus value yet, but we could imagine having dir auths consult it
in the future.

Implements ticket 40753.
2023-02-13 13:54:29 -05:00
David Goulet
482ce87a8d Merge branch 'maint-0.4.7' 2023-02-13 10:16:13 -05:00
Gabriela Moldovan
21b3397f9b
metrics: Decrement hs_intro_established_count on intro circuit close.
Closes #40751.

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-02-10 20:31:36 +00:00
Gabriela Moldovan
c98d78c95c
Update find_service documentation.
This updates the docs to stop suggesting `pk` can be NULL, as that doesn't seem
to be the case anymore (`tor_assert(pk)`).

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-02-10 15:27:43 +00:00
Nick Mathewson
43d3a41157 Extend blinding testvec with timeperiod test.
When I copied this to arti, I messed up and thought that the default
time period was 1440 seconds for some weird testing reason. That led
to confusion.

This commit adds a test case that time period 1440 is May 20, 1973:
now arti and c tor match!
2023-02-10 08:11:39 -05:00
Gabriela Moldovan
a9c7cd6b2c
Fix small typo in mainloop.c docs.
The docs should reference `tor_event_new()` rather than `tor_libevent_new()`.

Signed-off-by: Gabriela Moldovan <gabi@torproject.org>
2023-02-07 12:15:12 +00:00
Dimitris Apostolou
c1b940cebf
Fix typos 2023-02-05 00:36:37 +02:00
Roger Dingledine
a4d61c84e3 fix trivial typos 2023-01-30 16:23:24 -05:00
David Goulet
7770c5a2ae Merge branch 'tor-gitlab/mr/686' 2023-01-27 08:47:46 -05:00
David Goulet
fc11b38f2a Merge branch 'maint-0.4.7' 2023-01-26 13:11:22 -05:00
David Goulet
e390a7cdee Merge branch 'tor-gitlab/mr/687' into maint-0.4.7 2023-01-26 13:11:18 -05:00
David Goulet
7b87ecf7e2 Merge branch 'maint-0.4.5' into maint-0.4.7 2023-01-25 14:13:35 -05:00
Micah Elizabeth Scott
a1d3d201ae compress_lzma: New enum values from liblzma 5.3.x
Add new liblzma enums (LZMA_SEEK_NEEDED and LZMA_RET_INTERNAL*)
conditional to the API version they arrived in. The first stable
version of liblzma this affects is 5.4.0

Fixes #40741

Signed-off-by: Micah Elizabeth Scott <beth@torproject.org>
2023-01-25 14:13:31 -05:00
David Goulet
bff6d7a944 relay: Use the right max queue size value in log
Fixes #40745

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-01-25 14:10:20 -05:00
Nick Mathewson
a5d8c9fef7 Add a test vector for disaster SRV calculation. 2023-01-25 09:04:07 -05:00
Micah Elizabeth Scott
3d7e3af91e compress_lzma: New enum values from liblzma 5.3.x
Add new liblzma enums (LZMA_SEEK_NEEDED and LZMA_RET_INTERNAL*)
conditional to the API version they arrived in. The first stable
version of liblzma this affects is 5.4.0

Fixes #40741

Signed-off-by: Micah Elizabeth Scott <beth@torproject.org>
2023-01-19 13:59:08 -05:00
Nick Mathewson
ee153db5a1 Add more test-vectors for key blinding.
These are verified-as-correct against the current C implementation;
adding them here gives us something to copy into Arti.
2023-01-19 12:54:33 -05:00
David Goulet
d02d2a4338 Fix compiler warnings about unused variables
Fixes #40743

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-01-19 11:18:02 -05:00
David Goulet
49f10c5130 Merge branch 'tor-gitlab/mr/683' 2023-01-19 10:10:14 -05:00
Nick Mathewson
5629a391c2 Add a test vector for crypto_mac_sha3 2023-01-19 09:09:09 -05:00
Tor CI Release
fa2face3b5 version: Bump version to 0.4.7.13-dev 2023-01-12 12:09:34 -05:00
Tor CI Release
40e39b1e65 version: Bump version to 0.4.5.16-dev 2023-01-12 12:09:10 -05:00
Tor CI Release
89d1db6ad9 version: Bump version to 0.4.7.13 2023-01-12 11:15:53 -05:00
Tor CI Release
5a085a8f0f version: Bump version to 0.4.5.16 2023-01-12 11:15:23 -05:00
David Goulet
d9821bdea5 Merge branch 'maint-0.4.7' 2023-01-12 11:07:40 -05:00
David Goulet
64cebf4e1b Merge branch 'maint-0.4.5' into maint-0.4.7 2023-01-12 11:07:39 -05:00
Tor CI Release
64c0a9fa74 fallbackdir: Update list generated on January 12, 2023 2023-01-12 11:07:33 -05:00
Tor CI Release
049d0818c6 Update geoip files to match ipfire location db, 2023/01/12. 2023-01-12 11:07:23 -05:00
David Goulet
610b791aa6 Merge branch 'maint-0.4.7' 2023-01-12 10:52:35 -05:00
David Goulet
0df4083299 Merge branch 'maint-0.4.5' into maint-0.4.7 2023-01-12 10:52:35 -05:00
David Goulet
7b83e336ec Merge branch 'ticket40730_045_01' into maint-0.4.5 2023-01-12 10:52:31 -05:00
David Goulet
637213fce3 Merge branch 'maint-0.4.7' 2023-01-12 10:49:57 -05:00
David Goulet
f2e9ce72d6 dirauth: Reject 0.4.6.x series at the authority level
Closes #40664

Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-01-12 09:07:52 -05:00
David Goulet
754dbcd6d3 Merge branch 'maint-0.4.7' 2023-01-11 13:14:45 -05:00
Mike Perry
c6ef04e0d0 Coverity CID 1518991: Tighter bounds on consensus param value.
This prevents sign extension overflow in cwnd_became_full().
2023-01-11 17:32:20 +00:00
David Goulet
b38630ca56 Merge branch 'maint-0.4.7' 2023-01-11 09:03:29 -05:00
David Goulet
b9c7825f0e Merge branch 'maint-0.4.5' into maint-0.4.7 2023-01-11 09:03:29 -05:00
David Goulet
85547a9b5b Merge branch 'tor-gitlab/mr/538' into maint-0.4.5 2023-01-11 09:03:26 -05:00
David Goulet
5d6e0b8e13 Merge branch 'maint-0.4.7' 2023-01-10 15:58:28 -05:00
Mike Perry
482cde5931 Do not reset our RTT in slow start.
If a circuit only sends a tiny amount of data such that its cwnd is not
full, it won't increase its cwnd above the minimum. Since slow start circuits
should never hit the minimum otherwise, we can just ignore them for RTT reset
to handle this.
2023-01-10 20:47:11 +00:00
David Goulet
d6cf3ca5c1 Merge branch 'tor-gitlab/mr/678' 2023-01-10 11:57:07 -05:00
David Goulet
c50496036b cc: Rename function to avoid confusion
Signed-off-by: David Goulet <dgoulet@torproject.org>
2023-01-10 11:56:21 -05:00