tor-commits
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2020
- 18 participants
- 1962 discussions
11 Aug '20
commit f075a645ab78fbce155c4940cf1327efb9f9b944
Author: juga0 <juga(a)riseup.net>
Date: Sat Aug 1 13:35:15 2020 +0000
fix: tests: Stop converting boolean key to int
Conversion only happens when parsing a bandwidth file in the
integration tests.
Closes: #40009
---
docs/source/classes_original.puml | 4 +-
docs/source/images/classes_original.svg | 234 +++++++++++++++++++++++++++++++-
sbws/lib/v3bwfile.py | 2 +
3 files changed, 237 insertions(+), 3 deletions(-)
diff --git a/docs/source/classes_original.puml b/docs/source/classes_original.puml
index 4318db3..1284b9f 100644
--- a/docs/source/classes_original.puml
+++ b/docs/source/classes_original.puml
@@ -30,7 +30,7 @@ class Relay {
int @p average_bandwidth
int @p burst_bandwidth
int @p consensus_bandwidth
- int @p consensus_bandwidth_is_unmeasured
+ bool @p consensus_bandwidth_is_unmeasured
obj _from_ns(attr)
obj _from_desc(attr)
bool can_exit_to_port(int port)
@@ -217,4 +217,4 @@ class State {
get()
}
-@enduml
\ No newline at end of file
+@enduml
diff --git a/docs/source/images/classes_original.svg b/docs/source/images/classes_original.svg
index d894dd6..473659e 100644
--- a/docs/source/images/classes_original.svg
+++ b/docs/source/images/classes_original.svg
@@ -1 +1,233 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1573px" preserveAspectRatio="none" style="width:1542px;height:1573px;" version="1.1" viewBox="0 0 1542 1573" width="1542px" zoomAndPan="magnify"><defs><filter height="300%" id="f17ckm9" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--class RelayList--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="227.2656" style="stroke: #A80036; stroke-width: 1.5;" width="258" x="1023" y="877.5"/><ellipse cx="1120.75" cy="893.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;
"/><path d="M1123.7188,899.1406 Q1123.1406,899.4375 1122.5,899.5859 Q1121.8594,899.7344 1121.1563,899.7344 Q1118.6563,899.7344 1117.3359,898.0859 Q1116.0156,896.4375 1116.0156,893.3125 Q1116.0156,890.1875 1117.3359,888.5313 Q1118.6563,886.875 1121.1563,886.875 Q1121.8594,886.875 1122.5078,887.0313 Q1123.1563,887.1875 1123.7188,887.4844 L1123.7188,890.2031 Q1123.0938,889.625 1122.5,889.3516 Q1121.9063,889.0781 1121.2813,889.0781 Q1119.9375,889.0781 1119.25,890.1484 Q1118.5625,891.2188 1118.5625,893.3125 Q1118.5625,895.4063 1119.25,896.4766 Q1119.9375,897.5469 1121.2813,897.5469 Q1121.9063,897.5469 1122.5,897.2734 Q1123.0938,897 1123.7188,896.4219 L1123.7188,899.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="54" x="1141.25" y="897.6543">RelayList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1024" x2="1280" y1="909.5" y2="909.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="
spacingAndGlyphs" textLength="153" x="1029" y="923.7104">stem.Controller _controller</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1029" y="936.5151">Lock _refresh_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1029" y="949.3198">int _last_refresh</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1029" y="962.1245">list @p relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1029" y="974.9292">list @p bad_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="71" x="1029" y="987.7339">list @p exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1029" y="1000.5386">list
@p non_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1029" y="1013.3433">list @p authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1024" x2="1280" y1="1019.9375" y2="1019.9375"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="1029" y="1034.1479">bool _need_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1029" y="1046.9526">_init_relays()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1029" y="1059.7573">_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="165" x="1029" y="1072.562">list _relays_with_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAn
dGlyphs" textLength="183" x="1029" y="1085.3667">list _relays_without_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="246" x="1029" y="1098.1714">list exits_not_bad_can_exit_to_port(int port)</text><!--class Relay--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="265.6797" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="980.5" y="1190"/><ellipse cx="1096.25" cy="1206" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1099.2188,1211.6406 Q1098.6406,1211.9375 1098,1212.0859 Q1097.3594,1212.2344 1096.6563,1212.2344 Q1094.1563,1212.2344 1092.8359,1210.5859 Q1091.5156,1208.9375 1091.5156,1205.8125 Q1091.5156,1202.6875 1092.8359,1201.0313 Q1094.1563,1199.375 1096.6563,1199.375 Q1097.3594,1199.375 1098.0078,1199.5313 Q1098.6563,1199.6875 1099.2188,1199.9844 L1099.2188,1202.7031 Q1098.5938,1202.125 1098,1201.8516 Q1097.4063,1201.5781 1096.7813,1201.5781 Q1095.4375
,1201.5781 1094.75,1202.6484 Q1094.0625,1203.7188 1094.0625,1205.8125 Q1094.0625,1207.9063 1094.75,1208.9766 Q1095.4375,1210.0469 1096.7813,1210.0469 Q1097.4063,1210.0469 1098,1209.7734 Q1098.5938,1209.5 1099.2188,1208.9219 L1099.2188,1211.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="33" x="1116.75" y="1210.1543">Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1252.5" y1="1222" y2="1222"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="986.5" y="1236.2104">stem.RouterStatusEntryV3 _from_ns</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="986.5" y="1249.0151">stem.RelayDescriptor _from_desc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="986.5" y="1261.8198">str @p nickname</text><text
fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1274.6245">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="986.5" y="1287.4292">list @p flags</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="137" x="986.5" y="1300.2339">ExitPolicy @p exit_policy</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="986.5" y="1313.0386">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="986.5" y="1325.8433">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="986.5" y="1338.6479">int @p observed_bandwidth</text><text fill="#000000" font-family="sans
-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="151" x="986.5" y="1351.4526">int @p average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="986.5" y="1364.2573">int @p burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="986.5" y="1377.062">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="986.5" y="1389.8667">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1252.5" y1="1396.4609" y2="1396.4609"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1410.6714">obj _from_ns(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" text
Length="115" x="986.5" y="1423.4761">obj _from_desc(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="986.5" y="1436.2808">bool can_exit_to_port(int port)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="986.5" y="1449.0854">bool is_exit_not_bad_allowing_port(int port)</text><!--class RelayPrioritizer--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="158" x="996" y="117"/><ellipse cx="1026.75" cy="133" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1029.7188,138.6406 Q1029.1406,138.9375 1028.5,139.0859 Q1027.8594,139.2344 1027.1563,139.2344 Q1024.6563,139.2344 1023.3359,137.5859 Q1022.0156,135.9375 1022.0156,132.8125 Q1022.0156,129.6875 1023.3359,128.0313 Q1024.6563,126.375 1027.1563,126.375 Q1027.8594,126.375 1028.5078,126.5313 Q1029.156
3,126.6875 1029.7188,126.9844 L1029.7188,129.7031 Q1029.0938,129.125 1028.5,128.8516 Q1027.9063,128.5781 1027.2813,128.5781 Q1025.9375,128.5781 1025.25,129.6484 Q1024.5625,130.7188 1024.5625,132.8125 Q1024.5625,134.9063 1025.25,135.9766 Q1025.9375,137.0469 1027.2813,137.0469 Q1027.9063,137.0469 1028.5,136.7734 Q1029.0938,136.5 1029.7188,135.9219 L1029.7188,138.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="1044.25" y="137.1543">RelayPrioritizer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="997" x2="1153" y1="149" y2="149"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="1002" y="163.2104">int fresh_seconds</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="143" x="1002" y="176.0151">ResultDump result_dump</text><text fill="#000000" font-family="sans-serif" font-size="11" l
engthAdjust="spacingAndGlyphs" textLength="105" x="1002" y="188.8198">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="146" x="1002" y="201.6245">bool measure_authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="997" x2="1153" y1="208.2188" y2="208.2188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="139" x="1002" y="222.4292">generator best_priority()</text><!--class ResultDump--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="176.0469" style="stroke: #A80036; stroke-width: 1.5;" width="199" x="899.5" y="507"/><ellipse cx="957.25" cy="523" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M960.2188,528.6406 Q959.6406,528.9375 959,529.0859 Q958.3594,529.2344 957.6563,529.2344 Q955.1563,529.2344 953.8359,527.5859 Q952.5156,525.9375 952.5156,522.8125 Q952.5156,519.6875 953.8359,518.0313 Q
955.1563,516.375 957.6563,516.375 Q958.3594,516.375 959.0078,516.5313 Q959.6563,516.6875 960.2188,516.9844 L960.2188,519.7031 Q959.5938,519.125 959,518.8516 Q958.4063,518.5781 957.7813,518.5781 Q956.4375,518.5781 955.75,519.6484 Q955.0625,520.7188 955.0625,522.8125 Q955.0625,524.9063 955.75,525.9766 Q956.4375,527.0469 957.7813,527.0469 Q958.4063,527.0469 959,526.7734 Q959.5938,526.5 960.2188,525.9219 L960.2188,528.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="977.75" y="527.1543">ResultDump</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="900.5" x2="1097.5" y1="539" y2="539"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="49" x="905.5" y="553.2104">dict data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="905.5" y="566.0151">int fresh_days</text><text fill="#000000" font-
family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="905.5" y="578.8198">str datadir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="905.5" y="591.6245">Lock data_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="905.5" y="604.4292">Thread thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="905.5" y="617.2339">Queue queue</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="900.5" x2="1097.5" y1="623.8281" y2="623.8281"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="905.5" y="638.0386">store_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="157" x="905.5" y="650.8433">handle_result(Re
sult result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="905.5" y="663.6479">enter()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="187" x="905.5" y="676.4526">list results_for_relay(Relay relay)</text><!--class Result--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="278.4844" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="564.5" y="852"/><ellipse cx="677.25" cy="868" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M680.2188,873.6406 Q679.6406,873.9375 679,874.0859 Q678.3594,874.2344 677.6563,874.2344 Q675.1563,874.2344 673.8359,872.5859 Q672.5156,870.9375 672.5156,867.8125 Q672.5156,864.6875 673.8359,863.0313 Q675.1563,861.375 677.6563,861.375 Q678.3594,861.375 679.0078,861.5313 Q679.6563,861.6875 680.2188,861.9844 L680.2188,864.7031 Q679.5938,864.125 679,863.8516 Q678.4063,863.5781 677.7813,8
63.5781 Q676.4375,863.5781 675.75,864.6484 Q675.0625,865.7188 675.0625,867.8125 Q675.0625,869.9063 675.75,870.9766 Q676.4375,872.0469 677.7813,872.0469 Q678.4063,872.0469 679,871.7734 Q679.5938,871.5 680.2188,870.9219 L680.2188,873.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="39" x="697.75" y="872.1543">Result</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565.5" x2="836.5" y1="884" y2="884"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="570.5" y="898.2104">Result.Relay _relay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="570.5" y="911.0151">list @p circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="570.5" y="923.8198">str @p dest_url</text><text fill="#000000" font-family="sans-serif" font-siz
e="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="570.5" y="936.6245">str @p scanner</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="570.5" y="949.4292">int @p time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="570.5" y="962.2339">str @p type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="570.5" y="975.0386">int @p version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="570.5" y="987.8433">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="570.5" y="1000.6479">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="570.5" y="1013.4526"
>str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="570.5" y="1026.2573">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="570.5" y="1039.062">int @p relay_observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="570.5" y="1051.8667">int @p relay_average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="570.5" y="1064.6714">int @p relay_burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="570.5" y="1077.4761">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="570.5" y="1090.280
8">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565.5" x2="836.5" y1="1096.875" y2="1096.875"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="570.5" y="1111.0854">dict to_dict()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="570.5" y="1123.8901">Result from_dict(dict d)</text><!--class ResultError--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="668" y="1292.5"/><ellipse cx="683" cy="1308.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M685.9688,1314.1406 Q685.3906,1314.4375 684.75,1314.5859 Q684.1094,1314.7344 683.4063,1314.7344 Q680.9063,1314.7344 679.5859,1313.0859 Q678.2656,1311.4375 678.2656,1308.3125 Q678.2656,1305.1875 679.5859,1303.5313 Q680.9063,1301.875 683.4063,1301.875 Q
684.1094,1301.875 684.7578,1302.0313 Q685.4063,1302.1875 685.9688,1302.4844 L685.9688,1305.2031 Q685.3438,1304.625 684.75,1304.3516 Q684.1563,1304.0781 683.5313,1304.0781 Q682.1875,1304.0781 681.5,1305.1484 Q680.8125,1306.2188 680.8125,1308.3125 Q680.8125,1310.4063 681.5,1311.4766 Q682.1875,1312.5469 683.5313,1312.5469 Q684.1563,1312.5469 684.75,1312.2734 Q685.3438,1312 685.9688,1311.4219 L685.9688,1314.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="697" y="1312.6543">ResultError</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1324.5" y2="1324.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="674" y="1338.7104">str @p msg</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1345.3047" y2="1345.3047"/><!--class ResultSuccess--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="73.6094" styl
e="stroke: #A80036; stroke-width: 1.5;" width="123" x="805.5" y="1286"/><ellipse cx="820.5" cy="1302" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M823.4688,1307.6406 Q822.8906,1307.9375 822.25,1308.0859 Q821.6094,1308.2344 820.9063,1308.2344 Q818.4063,1308.2344 817.0859,1306.5859 Q815.7656,1304.9375 815.7656,1301.8125 Q815.7656,1298.6875 817.0859,1297.0313 Q818.4063,1295.375 820.9063,1295.375 Q821.6094,1295.375 822.2578,1295.5313 Q822.9063,1295.6875 823.4688,1295.9844 L823.4688,1298.7031 Q822.8438,1298.125 822.25,1297.8516 Q821.6563,1297.5781 821.0313,1297.5781 Q819.6875,1297.5781 819,1298.6484 Q818.3125,1299.7188 818.3125,1301.8125 Q818.3125,1303.9063 819,1304.9766 Q819.6875,1306.0469 821.0313,1306.0469 Q821.6563,1306.0469 822.25,1305.7734 Q822.8438,1305.5 823.4688,1304.9219 L823.4688,1307.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="834.5" y="1306.1543">ResultSucce
ss</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1318" y2="1318"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="811.5" y="1332.2104">list @p rtts</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="811.5" y="1345.0151">list @p downloads</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1351.6094" y2="1351.6094"/><!--class Destination--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="342" x="6" y="1260.5"/><ellipse cx="136.75" cy="1276.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M139.7188,1282.1406 Q139.1406,1282.4375 138.5,1282.5859 Q137.8594,1282.7344 137.1563,1282.7344 Q134.6563,1282.7344 133.3359,1281.0859 Q132.0156,1279.4375 132.0156,1276.3125 Q132.0156,1273.1875 133.3359,12
71.5313 Q134.6563,1269.875 137.1563,1269.875 Q137.8594,1269.875 138.5078,1270.0313 Q139.1563,1270.1875 139.7188,1270.4844 L139.7188,1273.2031 Q139.0938,1272.625 138.5,1272.3516 Q137.9063,1272.0781 137.2813,1272.0781 Q135.9375,1272.0781 135.25,1273.1484 Q134.5625,1274.2188 134.5625,1276.3125 Q134.5625,1278.4063 135.25,1279.4766 Q135.9375,1280.5469 137.2813,1280.5469 Q137.9063,1280.5469 138.5,1280.2734 Q139.0938,1280 139.7188,1279.4219 L139.7188,1282.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="72" x="157.25" y="1280.6543">Destination</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1292.5" y2="1292.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="12" y="1306.7104">str @p hostname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="12" y="1319.5151">int @p p
ort</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="12" y="1332.3198">str @p url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="12" y="1345.1245">bool @p verify</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1351.7188" y2="1351.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="12" y="1365.9292">bool is_usable()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="330" x="12" y="1378.7339">Destination @sm from_config(str conf_section,int max_dl)</text><!--class Result.Relay--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="163.2422" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="383" y="1241.5"/><ellipse cx="465.75" cy="1257.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A8
0036; stroke-width: 1.0;"/><path d="M468.7188,1263.1406 Q468.1406,1263.4375 467.5,1263.5859 Q466.8594,1263.7344 466.1563,1263.7344 Q463.6563,1263.7344 462.3359,1262.0859 Q461.0156,1260.4375 461.0156,1257.3125 Q461.0156,1254.1875 462.3359,1252.5313 Q463.6563,1250.875 466.1563,1250.875 Q466.8594,1250.875 467.5078,1251.0313 Q468.1563,1251.1875 468.7188,1251.4844 L468.7188,1254.2031 Q468.0938,1253.625 467.5,1253.3516 Q466.9063,1253.0781 466.2813,1253.0781 Q464.9375,1253.0781 464.25,1254.1484 Q463.5625,1255.2188 463.5625,1257.3125 Q463.5625,1259.4063 464.25,1260.4766 Q464.9375,1261.5469 466.2813,1261.5469 Q466.9063,1261.5469 467.5,1261.2734 Q468.0938,1261 468.7188,1260.4219 L468.7188,1263.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="76" x="486.25" y="1261.6543">Result.Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1273.5" y2="1273.5"/><text fill="#000000" font-family="sans-serif" fo
nt-size="11" lengthAdjust="spacingAndGlyphs" textLength="74" x="389" y="1287.7104">str nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="389" y="1300.5151">str fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="389" y="1313.3198">str address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="389" y="1326.1245">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="389" y="1338.9292">int observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="389" y="1351.7339">int average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x
="389" y="1364.5386">int burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="144" x="389" y="1377.3433">int consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="238" x="389" y="1390.1479">int consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1396.7422" y2="1396.7422"/><!--class ResultErrorCircuit--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="141" x="559.5" y="1516"/><ellipse cx="574.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M577.4688,1537.6406 Q576.8906,1537.9375 576.25,1538.0859 Q575.6094,1538.2344 574.9063,1538.2344 Q572.4063,1538.2344 571.0859,1536.5859 Q569.7656,1534.9375 569.7656,1531.8125 Q569.7656,1528.6875 571.0859,1527.0313 Q572.4063,1525.375 574
.9063,1525.375 Q575.6094,1525.375 576.2578,1525.5313 Q576.9063,1525.6875 577.4688,1525.9844 L577.4688,1528.7031 Q576.8438,1528.125 576.25,1527.8516 Q575.6563,1527.5781 575.0313,1527.5781 Q573.6875,1527.5781 573,1528.6484 Q572.3125,1529.7188 572.3125,1531.8125 Q572.3125,1533.9063 573,1534.9766 Q573.6875,1536.0469 575.0313,1536.0469 Q575.6563,1536.0469 576.25,1535.7734 Q576.8438,1535.5 577.4688,1534.9219 L577.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="109" x="588.5" y="1536.1543">ResultErrorCircuit</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="560.5" x2="699.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="560.5" x2="699.5" y1="1556" y2="1556"/><!--class ResultErrorStream--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="147" x="735.5" y="1516"/><ellipse cx="750.5" cy="1532" fill="#ADD1B2" rx="11" ry="11
" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M753.4688,1537.6406 Q752.8906,1537.9375 752.25,1538.0859 Q751.6094,1538.2344 750.9063,1538.2344 Q748.4063,1538.2344 747.0859,1536.5859 Q745.7656,1534.9375 745.7656,1531.8125 Q745.7656,1528.6875 747.0859,1527.0313 Q748.4063,1525.375 750.9063,1525.375 Q751.6094,1525.375 752.2578,1525.5313 Q752.9063,1525.6875 753.4688,1525.9844 L753.4688,1528.7031 Q752.8438,1528.125 752.25,1527.8516 Q751.6563,1527.5781 751.0313,1527.5781 Q749.6875,1527.5781 749,1528.6484 Q748.3125,1529.7188 748.3125,1531.8125 Q748.3125,1533.9063 749,1534.9766 Q749.6875,1536.0469 751.0313,1536.0469 Q751.6563,1536.0469 752.25,1535.7734 Q752.8438,1535.5 753.4688,1534.9219 L753.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="115" x="764.5" y="1536.1543">ResultErrorStream</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="736.5" x2="881.5" y1="1548" y2="1548"/><line style="stroke: #A8
0036; stroke-width: 1.5;" x1="736.5" x2="881.5" y1="1556" y2="1556"/><!--class DestinationList--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="66.5" y="948"/><ellipse cx="126.25" cy="964" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M129.2188,969.6406 Q128.6406,969.9375 128,970.0859 Q127.3594,970.2344 126.6563,970.2344 Q124.1563,970.2344 122.8359,968.5859 Q121.5156,966.9375 121.5156,963.8125 Q121.5156,960.6875 122.8359,959.0313 Q124.1563,957.375 126.6563,957.375 Q127.3594,957.375 128.0078,957.5313 Q128.6563,957.6875 129.2188,957.9844 L129.2188,960.7031 Q128.5938,960.125 128,959.8516 Q127.4063,959.5781 126.7813,959.5781 Q125.4375,959.5781 124.75,960.6484 Q124.0625,961.7188 124.0625,963.8125 Q124.0625,965.9063 124.75,966.9766 Q125.4375,968.0469 126.7813,968.0469 Q127.4063,968.0469 128,967.7734 Q128.5938,967.5 129.2188,966.9219 L129.2188,969.6406 Z "/><text fill="#000000" f
ont-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="93" x="146.75" y="968.1543">DestinationList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="980" y2="980"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="72.5" y="994.2104">list _rl</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="1000.8047" y2="1000.8047"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="72.5" y="1015.0151">Destination next()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="72.5" y="1027.8198">DestinationList @sm from_config(...)</text><!--class V3BWHeader--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="291.2891" style="stroke: #A80036; stroke-width: 1.5;" width="322" x="181" y="449.5"/><ellipse cx="297.25" cy="465.5"
fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M300.2188,471.1406 Q299.6406,471.4375 299,471.5859 Q298.3594,471.7344 297.6563,471.7344 Q295.1563,471.7344 293.8359,470.0859 Q292.5156,468.4375 292.5156,465.3125 Q292.5156,462.1875 293.8359,460.5313 Q295.1563,458.875 297.6563,458.875 Q298.3594,458.875 299.0078,459.0313 Q299.6563,459.1875 300.2188,459.4844 L300.2188,462.2031 Q299.5938,461.625 299,461.3516 Q298.4063,461.0781 297.7813,461.0781 Q296.4375,461.0781 295.75,462.1484 Q295.0625,463.2188 295.0625,465.3125 Q295.0625,467.4063 295.75,468.4766 Q296.4375,469.5469 297.7813,469.5469 Q298.4063,469.5469 299,469.2734 Q299.5938,469 300.2188,468.4219 L300.2188,471.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="81" x="317.75" y="469.6543">V3BWHeader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182" x2="502" y1="481.5" y2="481.5"/><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="187" y="495.7104">int timestamp</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="187" y="508.5151">str version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="187" y="521.3198">str file_created</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="187" y="534.1245">str latest_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="187" y="546.9292">int num_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="187" y="559.7339">str software</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="187" y="572.5386">str
software_version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="187" y="585.3433">str generator_started</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="187" y="598.1479">int number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="208" x="187" y="610.9526">int minimum_number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="171" x="187" y="623.7573">int number_consensus_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="187" y="636.562">int percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="187" y="649.3667">int minimum_percen
t_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="187" y="662.1714">int @p num_lines</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182" x2="502" y1="668.7656" y2="668.7656"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="187" y="682.9761">V3BWHeader @cm from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117" x="187" y="695.7808">add_stats(**kwargs)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="310" x="187" y="708.5854">int @sm earliest_bandwidth_from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="285" x="187" y="721.3901">str @sm generator_started_from_file(dict results)</text><text fil
l="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="299" x="187" y="734.1948">int @sm latest_bandwidth_from_results(dict results)</text><!--class V3BWLine--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="393.7266" style="stroke: #A80036; stroke-width: 1.5;" width="326" x="538" y="398"/><ellipse cx="666.75" cy="414" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M669.7188,419.6406 Q669.1406,419.9375 668.5,420.0859 Q667.8594,420.2344 667.1563,420.2344 Q664.6563,420.2344 663.3359,418.5859 Q662.0156,416.9375 662.0156,413.8125 Q662.0156,410.6875 663.3359,409.0313 Q664.6563,407.375 667.1563,407.375 Q667.8594,407.375 668.5078,407.5313 Q669.1563,407.6875 669.7188,407.9844 L669.7188,410.7031 Q669.0938,410.125 668.5,409.8516 Q667.9063,409.5781 667.2813,409.5781 Q665.9375,409.5781 665.25,410.6484 Q664.5625,411.7188 664.5625,413.8125 Q664.5625,415.9063 665.25,416.9766 Q665.9375,418.0469 667.2813,418.0469 Q667
.9063,418.0469 668.5,417.7734 Q669.0938,417.5 669.7188,416.9219 L669.7188,419.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="60" x="687.25" y="418.1543">V3BWLine</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="863" y1="430" y2="430"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="544" y="444.2104">int bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="544" y="457.0151">str node_id</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="544" y="469.8198">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="544" y="482.6245">str nick</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spa
cingAndGlyphs" textLength="31" x="544" y="495.4292">int rtt</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="544" y="508.2339">str time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="544" y="521.0386">int success</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="544" y="533.8433">int error_stream</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="544" y="546.6479">int error_circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="80" x="544" y="559.4526">int error_misc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="544" y="572.2573">int bw_median</text><text fill="#000000" font-family=
"sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="544" y="585.062">int bw_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="544" y="597.8667">int desc_bw_avg</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="544" y="610.6714">int desc_bw_bur</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="121" x="544" y="623.4761">int desc_bw_obs_last</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="132" x="544" y="636.2808">int desc_bw_obs_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="544" y="649.0854">consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="2
20" x="544" y="661.8901">consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="863" y1="668.4844" y2="668.4844"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="544" y="682.6948">int @sm bw_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="264" x="544" y="695.4995">int @sm bw_median_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="303" x="544" y="708.3042">int @sm desc_bw_obs_last_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="314" x="544" y="721.1089">int @sm desc_bw_obs_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" te
xtLength="233" x="544" y="733.9136">V3BWLine @cm from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="544" y="746.7183">str @sm last_time_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="276" x="544" y="759.5229">dict @sm result_types_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="268" x="544" y="772.3276">list @sm results_away_each_other(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="237" x="544" y="785.1323">list @sm results_recent_than(list results)</text><!--class V3BWFile--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="329.7031" style="stroke: #A80036; stroke-width: 1.5;" width="370" x="157" y="8"/><ellipse cx="309.75" cy="24"
fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M312.7188,29.6406 Q312.1406,29.9375 311.5,30.0859 Q310.8594,30.2344 310.1563,30.2344 Q307.6563,30.2344 306.3359,28.5859 Q305.0156,26.9375 305.0156,23.8125 Q305.0156,20.6875 306.3359,19.0313 Q307.6563,17.375 310.1563,17.375 Q310.8594,17.375 311.5078,17.5313 Q312.1563,17.6875 312.7188,17.9844 L312.7188,20.7031 Q312.0938,20.125 311.5,19.8516 Q310.9063,19.5781 310.2813,19.5781 Q308.9375,19.5781 308.25,20.6484 Q307.5625,21.7188 307.5625,23.8125 Q307.5625,25.9063 308.25,26.9766 Q308.9375,28.0469 310.2813,28.0469 Q310.9063,28.0469 311.5,27.7734 Q312.0938,27.5 312.7188,26.9219 L312.7188,29.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="56" x="330.25" y="28.1543">V3BWFile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="158" x2="526" y1="40" y2="40"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacin
gAndGlyphs" textLength="116" x="163" y="54.2104">V3BWHeader header</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="163" y="67.0151">list bw_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="163" y="79.8198">@p info_stats</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="163" y="92.6245">bool @p is_min_perc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="163" y="105.4292">int @p max_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="163" y="118.2339">int @p mean_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="163" y="131.0386">int @p median_bw</text><text fill="#00
0000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="163" y="143.8433">int @p min_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="163" y="156.6479">int @p num</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="88" x="163" y="169.4526">int @p sum_bw</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="158" x2="526" y1="176.0469" y2="176.0469"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="252" x="163" y="190.2573">V3BWFile @cm from_results(dict results, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="147" x="163" y="203.062">list @sm bw_kb(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="200" x="163" y="215.
8667">list @sm bw_sbws_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="163" y="228.6714">list @sm bw_torflow_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="288" x="163" y="241.4761">bool @sm is_max_bw_diff_perc_reached(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="306" x="163" y="254.2808">(dict, bool) @sm measured_progress_stats(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="358" x="163" y="267.0854">int @sm read_number_consensus_relays(str consensus_path)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="163" y="279.8901">(list, list, list) to_plt()</text><text fill="#000000" font-family="sans-serif" fo
nt-size="11" lengthAdjust="spacingAndGlyphs" textLength="195" x="163" y="292.6948">list update_progress(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="163" y="305.4995">warn_if_not_accurate_enough(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="163" y="318.3042">tuple to_plt(...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="163" y="331.1089">write(str output)</text><!--class CircuitBuilder--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="1271" y="532.5"/><ellipse cx="1291.4" cy="548.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1294.3688,554.1406 Q1293.7906,554.4375 1293.15,554.5859 Q1292.5094,554.7344 1291.8063,554.7344 Q1289.
3063,554.7344 1287.9859,553.0859 Q1286.6656,551.4375 1286.6656,548.3125 Q1286.6656,545.1875 1287.9859,543.5313 Q1289.3063,541.875 1291.8063,541.875 Q1292.5094,541.875 1293.1578,542.0313 Q1293.8063,542.1875 1294.3688,542.4844 L1294.3688,545.2031 Q1293.7438,544.625 1293.15,544.3516 Q1292.5563,544.0781 1291.9313,544.0781 Q1290.5875,544.0781 1289.9,545.1484 Q1289.2125,546.2188 1289.2125,548.3125 Q1289.2125,550.4063 1289.9,551.4766 Q1290.5875,552.5469 1291.9313,552.5469 Q1292.5563,552.5469 1293.15,552.2734 Q1293.7438,552 1294.3688,551.4219 L1294.3688,554.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="82" x="1306.6" y="552.6543">CircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1272" x2="1396" y1="564.5" y2="564.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1277" y="578.7104">set built_circuits</text><text fill="#000000" font-fa
mily="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1277" y="591.5151">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1277" y="604.3198">list relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="1277" y="617.1245">Controller controller</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1272" x2="1396" y1="623.7188" y2="623.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1277" y="637.9292">int build_circuit()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1277" y="650.7339">void close_circuit()</text><!--class GapsCircuitBuilder--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="146"
x="1387" y="967"/><ellipse cx="1402" cy="983" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1404.9688,988.6406 Q1404.3906,988.9375 1403.75,989.0859 Q1403.1094,989.2344 1402.4063,989.2344 Q1399.9063,989.2344 1398.5859,987.5859 Q1397.2656,985.9375 1397.2656,982.8125 Q1397.2656,979.6875 1398.5859,978.0313 Q1399.9063,976.375 1402.4063,976.375 Q1403.1094,976.375 1403.7578,976.5313 Q1404.4063,976.6875 1404.9688,976.9844 L1404.9688,979.7031 Q1404.3438,979.125 1403.75,978.8516 Q1403.1563,978.5781 1402.5313,978.5781 Q1401.1875,978.5781 1400.5,979.6484 Q1399.8125,980.7188 1399.8125,982.8125 Q1399.8125,984.9063 1400.5,985.9766 Q1401.1875,987.0469 1402.5313,987.0469 Q1403.1563,987.0469 1403.75,986.7734 Q1404.3438,986.5 1404.9688,985.9219 L1404.9688,988.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="1416" y="987.1543">GapsCircuitBuilder</text><line style="stroke: #A80036; stroke-w
idth: 1.5;" x1="1388" x2="1532" y1="999" y2="999"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1388" x2="1532" y1="1007" y2="1007"/><!--class State--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="66" x="1189" y="142.5"/><ellipse cx="1204" cy="158.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1206.9688,164.1406 Q1206.3906,164.4375 1205.75,164.5859 Q1205.1094,164.7344 1204.4063,164.7344 Q1201.9063,164.7344 1200.5859,163.0859 Q1199.2656,161.4375 1199.2656,158.3125 Q1199.2656,155.1875 1200.5859,153.5313 Q1201.9063,151.875 1204.4063,151.875 Q1205.1094,151.875 1205.7578,152.0313 Q1206.4063,152.1875 1206.9688,152.4844 L1206.9688,155.2031 Q1206.3438,154.625 1205.75,154.3516 Q1205.1563,154.0781 1204.5313,154.0781 Q1203.1875,154.0781 1202.5,155.1484 Q1201.8125,156.2188 1201.8125,158.3125 Q1201.8125,160.4063 1202.5,161.4766 Q1203.1875,162.5469 1204.5313,162.5469 Q1205.1563,162
.5469 1205.75,162.2734 Q1206.3438,162 1206.9688,161.4219 L1206.9688,164.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="34" x="1218" y="162.6543">State</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1190" x2="1254" y1="174.5" y2="174.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1190" x2="1254" y1="182.5" y2="182.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="26" x="1195" y="196.7104">get()</text><path d="M1138.67,1117.655 C1136.16,1141.31 1133.53,1166.111 1131,1189.954 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1140.05,1104.644,1135.4394,1110.1886,1138.7842,1116.5771,1143.3948,1111.0325,1140.05,1104.644" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1089.72,242.34 C1098.68,286.54 1109.61,345.43 1116,398 C1136.18,564.101 1145.24,757.865 1149.18,877.246 " fill="none" style="st
roke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1087.06,229.41,1084.3489,236.0921,1089.4743,241.1646,1092.1853,234.4826,1087.06,229.41" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1062.64,242.29 C1049.6,314.37 1029,428.19 1014.79,506.73 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1064.99,229.34,1059.9863,234.5326,1062.855,241.1485,1067.8587,235.9559,1064.99,229.34" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M709.634,1150.29 C712.587,1204.42 715.592,1259.514 717.376,1292.219 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="702.629,1150.389,708.529,1130.038,716.608,1149.627,702.629,1150.389" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M779.546,1148.146 C805.413,1199.569 831.859,1252.142 848.795,1285.809 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="773.171,1151.05,770.437,1130.038,785.678,1144.759,773.171,11
51.05" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M564.219,1069.298 C502.644,1104.936 429.46,1148.471 365,1190 C330.636,1212.139 293.652,1237.711 261.654,1260.417 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M837.502,1100.283 C883.339,1136.644 934.451,1177.19 980.304,1213.563 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M613.472,1141.659 C593.355,1176.056 572.714,1211.349 555.086,1241.491 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="620.269,1130.038,613.7871,1133.1979,614.2108,1140.3965,620.6927,1137.2366,620.269,1130.038" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M698.878,1372.61 C680.34,1417.393 653.638,1481.8967 639.546,1515.9402 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="692.508,1369.697,706.625,1353.895,705.443,1375.051,692.508,1369.697" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M739.348,1372.61 C758.095,1417
.393 785.096,1481.8967 799.347,1515.9402 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="732.78,1375.047,731.514,1353.895,745.694,1369.641,732.78,1375.047" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M944.599,694.845 C925.726,726.719 903.6,761.637 881,792 C866.16,811.937 849.661,832.189 832.845,851.753 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="951.4,683.254,944.9137,686.4049,945.3276,693.6042,951.8138,690.4532,951.4,683.254" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M986.523,683.449 C974.243,790.808 962.827,977.411 1005,1130 C1010.58,1150.179 1018.82,1170.427 1028.35,1189.81 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M177,1047.245 C177,1106.165 177,1199.251 177,1260.472 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="177,1034.13,173,1040.13,177,1046.13,181,1040.13,177,1034.13" style="stroke: #A80036; stroke
-width: 1.0;"/><path d="M473.178,740.55 C488.947,757.895 504.83,775.351 520,792 C537.644,811.365 556.273,831.779 574.602,851.847 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M701,792.134 C701,812.297 701,832.472 701,851.814 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M342,351.6 C342,384.21 342,417.88 342,449.38 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="342,338.19,338,344.19,342,350.19,346,344.19,342,338.19" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M490.906,348.21 C506.387,366.32 522.181,384.8 537.808,403.08 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="482.341,338.19,483.2029,345.3494,490.1431,347.3074,489.2812,340.148,482.341,338.19" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M191.752,338.22 C180.173,357.38 170.203,377.45 163,398 C105.082,563.26 62.8173,648.378 163,792 C169.086,800.724 407.087,886.138 564.464,941.895 "
fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1299.98,669.643 C1273,728.048 1234.84,810.657 1204.03,877.359 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1305.56,657.562,1299.4124,661.3313,1300.5273,668.4557,1306.6749,664.6864,1305.56,657.562" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1342.81,657.587 C1354.75,760.354 1367.33,971.181 1298,1130 C1287.05,1155.085 1271.35,1178.92 1253.72,1200.721 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1359.82,676.751 C1389,767.97 1434.72,910.962 1452.54,966.679 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1353.11,678.744,1353.69,657.562,1366.45,674.48,1353.11,678.744" style="stroke: #A80036; stroke-width: 1.0;"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1575px" preserveAspectRatio="none" style="width:1546px;height:1575px;" version="1.1" viewBox="0 0 1546 1575" width="1546px" zoomAndPan="magnify"><defs><filter height="300%" id="fuwj1fyyylsf1" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--class RelayList--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="227.2656" id="RelayList" style="stroke: #A80036; stroke-width: 1.5;" width="258" x="1025" y="877.5"/><ellipse cx="1122.75" cy="893.5" fill="#ADD1B2" rx="11" ry="11" style="stroke:
#A80036; stroke-width: 1.0;"/><path d="M1125.7188,899.1406 Q1125.1406,899.4375 1124.5,899.5781 Q1123.8594,899.7344 1123.1563,899.7344 Q1120.6563,899.7344 1119.3281,898.0938 Q1118.0156,896.4375 1118.0156,893.3125 Q1118.0156,890.1875 1119.3281,888.5313 Q1120.6563,886.875 1123.1563,886.875 Q1123.8594,886.875 1124.5,887.0313 Q1125.1563,887.1875 1125.7188,887.4844 L1125.7188,890.2031 Q1125.0938,889.625 1124.5,889.3594 Q1123.9063,889.0781 1123.2813,889.0781 Q1121.9375,889.0781 1121.25,890.1563 Q1120.5625,891.2188 1120.5625,893.3125 Q1120.5625,895.4063 1121.25,896.4844 Q1121.9375,897.5469 1123.2813,897.5469 Q1123.9063,897.5469 1124.5,897.2813 Q1125.0938,897 1125.7188,896.4219 L1125.7188,899.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="54" x="1143.25" y="897.6543">RelayList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1026" x2="1282" y1="909.5" y2="909.5"/><text fill="#000000" font-family="sans-serif" font-
size="11" lengthAdjust="spacingAndGlyphs" textLength="153" x="1031" y="923.7104">stem.Controller _controller</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1031" y="936.5151">Lock _refresh_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1031" y="949.3198">int _last_refresh</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1031" y="962.1245">list @p relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1031" y="974.9292">list @p bad_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="71" x="1031" y="987.7339">list @p exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="
1031" y="1000.5386">list @p non_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1031" y="1013.3433">list @p authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1026" x2="1282" y1="1019.9375" y2="1019.9375"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="1031" y="1034.1479">bool _need_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1031" y="1046.9526">_init_relays()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1031" y="1059.7573">_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="165" x="1031" y="1072.562">list _relays_with_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="183" x="1031" y="1085.3667">list _relays_without_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="246" x="1031" y="1098.1714">list exits_not_bad_can_exit_to_port(int port)</text><!--class Relay--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="265.6797" id="Relay" style="stroke: #A80036; stroke-width: 1.5;" width="283" x="980.5" y="1190"/><ellipse cx="1101.25" cy="1206" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1104.2188,1211.6406 Q1103.6406,1211.9375 1103,1212.0781 Q1102.3594,1212.2344 1101.6563,1212.2344 Q1099.1563,1212.2344 1097.8281,1210.5938 Q1096.5156,1208.9375 1096.5156,1205.8125 Q1096.5156,1202.6875 1097.8281,1201.0313 Q1099.1563,1199.375 1101.6563,1199.375 Q1102.3594,1199.375 1103,1199.5313 Q1103.6563,1199.6875 1104.2188,1199.9844 L1104.2188,1202.7031 Q1103.5938,1202.125 1103,1201.8594 Q1102.4063,1201
.5781 1101.7813,1201.5781 Q1100.4375,1201.5781 1099.75,1202.6563 Q1099.0625,1203.7188 1099.0625,1205.8125 Q1099.0625,1207.9063 1099.75,1208.9844 Q1100.4375,1210.0469 1101.7813,1210.0469 Q1102.4063,1210.0469 1103,1209.7813 Q1103.5938,1209.5 1104.2188,1208.9219 L1104.2188,1211.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="33" x="1121.75" y="1210.1543">Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1262.5" y1="1222" y2="1222"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="986.5" y="1236.2104">stem.RouterStatusEntryV3 _from_ns</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="986.5" y="1249.0151">stem.RelayDescriptor _from_desc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="986.5" y="12
61.8198">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1274.6245">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="986.5" y="1287.4292">list @p flags</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="137" x="986.5" y="1300.2339">ExitPolicy @p exit_policy</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="986.5" y="1313.0386">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="986.5" y="1325.8433">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="986.5" y="1338.6479">int @p observed_bandwidth</text><t
ext fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="151" x="986.5" y="1351.4526">int @p average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="986.5" y="1364.2573">int @p burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="986.5" y="1377.062">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="271" x="986.5" y="1389.8667">bool @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1262.5" y1="1396.4609" y2="1396.4609"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1410.6714">obj _from_ns(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11"
lengthAdjust="spacingAndGlyphs" textLength="115" x="986.5" y="1423.4761">obj _from_desc(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="986.5" y="1436.2808">bool can_exit_to_port(int port)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="986.5" y="1449.0854">bool is_exit_not_bad_allowing_port(int port)</text><!--class RelayPrioritizer--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="112.0234" id="RelayPrioritizer" style="stroke: #A80036; stroke-width: 1.5;" width="158" x="998" y="117"/><ellipse cx="1028.75" cy="133" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1031.7188,138.6406 Q1031.1406,138.9375 1030.5,139.0781 Q1029.8594,139.2344 1029.1563,139.2344 Q1026.6563,139.2344 1025.3281,137.5938 Q1024.0156,135.9375 1024.0156,132.8125 Q1024.0156,129.6875 1025.3281,128.0313 Q1026.6563,126.375
1029.1563,126.375 Q1029.8594,126.375 1030.5,126.5313 Q1031.1563,126.6875 1031.7188,126.9844 L1031.7188,129.7031 Q1031.0938,129.125 1030.5,128.8594 Q1029.9063,128.5781 1029.2813,128.5781 Q1027.9375,128.5781 1027.25,129.6563 Q1026.5625,130.7188 1026.5625,132.8125 Q1026.5625,134.9063 1027.25,135.9844 Q1027.9375,137.0469 1029.2813,137.0469 Q1029.9063,137.0469 1030.5,136.7813 Q1031.0938,136.5 1031.7188,135.9219 L1031.7188,138.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="1046.25" y="137.1543">RelayPrioritizer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="999" x2="1155" y1="149" y2="149"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="1004" y="163.2104">int fresh_seconds</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="143" x="1004" y="176.0151">ResultDump result_dump</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1004" y="188.8198">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="146" x="1004" y="201.6245">bool measure_authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="999" x2="1155" y1="208.2188" y2="208.2188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="139" x="1004" y="222.4292">generator best_priority()</text><!--class ResultDump--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="176.0469" id="ResultDump" style="stroke: #A80036; stroke-width: 1.5;" width="199" x="901.5" y="507"/><ellipse cx="959.25" cy="523" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M962.2188,528.6406 Q961.6406,528.9375 961,529.0781 Q960.3594,529.2344 959.6563,529.2344 Q957.1563,529.2344 955.8281,
527.5938 Q954.5156,525.9375 954.5156,522.8125 Q954.5156,519.6875 955.8281,518.0313 Q957.1563,516.375 959.6563,516.375 Q960.3594,516.375 961,516.5313 Q961.6563,516.6875 962.2188,516.9844 L962.2188,519.7031 Q961.5938,519.125 961,518.8594 Q960.4063,518.5781 959.7813,518.5781 Q958.4375,518.5781 957.75,519.6563 Q957.0625,520.7188 957.0625,522.8125 Q957.0625,524.9063 957.75,525.9844 Q958.4375,527.0469 959.7813,527.0469 Q960.4063,527.0469 961,526.7813 Q961.5938,526.5 962.2188,525.9219 L962.2188,528.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="979.75" y="527.1543">ResultDump</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="902.5" x2="1099.5" y1="539" y2="539"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="49" x="907.5" y="553.2104">dict data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLen
gth="81" x="907.5" y="566.0151">int fresh_days</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="907.5" y="578.8198">str datadir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="907.5" y="591.6245">Lock data_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="907.5" y="604.4292">Thread thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="907.5" y="617.2339">Queue queue</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="902.5" x2="1099.5" y1="623.8281" y2="623.8281"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="907.5" y="638.0386">store_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdj
ust="spacingAndGlyphs" textLength="157" x="907.5" y="650.8433">handle_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="907.5" y="663.6479">enter()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="187" x="907.5" y="676.4526">list results_for_relay(Relay relay)</text><!--class Result--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="278.4844" id="Result" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="566.5" y="852"/><ellipse cx="679.25" cy="868" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M682.2188,873.6406 Q681.6406,873.9375 681,874.0781 Q680.3594,874.2344 679.6563,874.2344 Q677.1563,874.2344 675.8281,872.5938 Q674.5156,870.9375 674.5156,867.8125 Q674.5156,864.6875 675.8281,863.0313 Q677.1563,861.375 679.6563,861.375 Q680.3594,861.375 681,861.5313 Q681.6563,861.6875 682.2
188,861.9844 L682.2188,864.7031 Q681.5938,864.125 681,863.8594 Q680.4063,863.5781 679.7813,863.5781 Q678.4375,863.5781 677.75,864.6563 Q677.0625,865.7188 677.0625,867.8125 Q677.0625,869.9063 677.75,870.9844 Q678.4375,872.0469 679.7813,872.0469 Q680.4063,872.0469 681,871.7813 Q681.5938,871.5 682.2188,870.9219 L682.2188,873.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="39" x="699.75" y="872.1543">Result</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="567.5" x2="838.5" y1="884" y2="884"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="572.5" y="898.2104">Result.Relay _relay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="572.5" y="911.0151">list @p circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="572.
5" y="923.8198">str @p dest_url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="572.5" y="936.6245">str @p scanner</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="572.5" y="949.4292">int @p time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="572.5" y="962.2339">str @p type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="572.5" y="975.0386">int @p version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="572.5" y="987.8433">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="572.5" y="1000.6479">str @p fingerprint</text><text fill="#000000" font-family="sans-s
erif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="572.5" y="1013.4526">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="572.5" y="1026.2573">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="572.5" y="1039.062">int @p relay_observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="572.5" y="1051.8667">int @p relay_average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="572.5" y="1064.6714">int @p relay_burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="572.5" y="1077.4761">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-
serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="572.5" y="1090.2808">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="567.5" x2="838.5" y1="1096.875" y2="1096.875"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="572.5" y="1111.0854">dict to_dict()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="572.5" y="1123.8901">Result from_dict(dict d)</text><!--class ResultError--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="60.8047" id="ResultError" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="668" y="1292.5"/><ellipse cx="683" cy="1308.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M685.9688,1314.1406 Q685.3906,1314.4375 684.75,1314.5781 Q684.1094,1314.7344 683.4063,1314.7344 Q680.9063,1314.7344 679.5781,1313.0938 Q
678.2656,1311.4375 678.2656,1308.3125 Q678.2656,1305.1875 679.5781,1303.5313 Q680.9063,1301.875 683.4063,1301.875 Q684.1094,1301.875 684.75,1302.0313 Q685.4063,1302.1875 685.9688,1302.4844 L685.9688,1305.2031 Q685.3438,1304.625 684.75,1304.3594 Q684.1563,1304.0781 683.5313,1304.0781 Q682.1875,1304.0781 681.5,1305.1563 Q680.8125,1306.2188 680.8125,1308.3125 Q680.8125,1310.4063 681.5,1311.4844 Q682.1875,1312.5469 683.5313,1312.5469 Q684.1563,1312.5469 684.75,1312.2813 Q685.3438,1312 685.9688,1311.4219 L685.9688,1314.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="697" y="1312.6543">ResultError</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1324.5" y2="1324.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="674" y="1338.7104">str @p msg</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1345.
3047" y2="1345.3047"/><!--class ResultSuccess--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="73.6094" id="ResultSuccess" style="stroke: #A80036; stroke-width: 1.5;" width="123" x="805.5" y="1286"/><ellipse cx="820.5" cy="1302" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M823.4688,1307.6406 Q822.8906,1307.9375 822.25,1308.0781 Q821.6094,1308.2344 820.9063,1308.2344 Q818.4063,1308.2344 817.0781,1306.5938 Q815.7656,1304.9375 815.7656,1301.8125 Q815.7656,1298.6875 817.0781,1297.0313 Q818.4063,1295.375 820.9063,1295.375 Q821.6094,1295.375 822.25,1295.5313 Q822.9063,1295.6875 823.4688,1295.9844 L823.4688,1298.7031 Q822.8438,1298.125 822.25,1297.8594 Q821.6563,1297.5781 821.0313,1297.5781 Q819.6875,1297.5781 819,1298.6563 Q818.3125,1299.7188 818.3125,1301.8125 Q818.3125,1303.9063 819,1304.9844 Q819.6875,1306.0469 821.0313,1306.0469 Q821.6563,1306.0469 822.25,1305.7813 Q822.8438,1305.5 823.4688,1304.9219 L823.4688,1307.6406 Z "/><text fi
ll="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="834.5" y="1306.1543">ResultSuccess</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1318" y2="1318"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="811.5" y="1332.2104">list @p rtts</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="811.5" y="1345.0151">list @p downloads</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1351.6094" y2="1351.6094"/><!--class Destination--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="124.8281" id="Destination" style="stroke: #A80036; stroke-width: 1.5;" width="342" x="6" y="1260.5"/><ellipse cx="136.75" cy="1276.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M139.7188,1282.1406 Q139.1406,1282.4375 138.5
,1282.5781 Q137.8594,1282.7344 137.1563,1282.7344 Q134.6563,1282.7344 133.3281,1281.0938 Q132.0156,1279.4375 132.0156,1276.3125 Q132.0156,1273.1875 133.3281,1271.5313 Q134.6563,1269.875 137.1563,1269.875 Q137.8594,1269.875 138.5,1270.0313 Q139.1563,1270.1875 139.7188,1270.4844 L139.7188,1273.2031 Q139.0938,1272.625 138.5,1272.3594 Q137.9063,1272.0781 137.2813,1272.0781 Q135.9375,1272.0781 135.25,1273.1563 Q134.5625,1274.2188 134.5625,1276.3125 Q134.5625,1278.4063 135.25,1279.4844 Q135.9375,1280.5469 137.2813,1280.5469 Q137.9063,1280.5469 138.5,1280.2813 Q139.0938,1280 139.7188,1279.4219 L139.7188,1282.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="72" x="157.25" y="1280.6543">Destination</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1292.5" y2="1292.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="12" y="1306.7104">str
@p hostname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="12" y="1319.5151">int @p port</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="12" y="1332.3198">str @p url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="12" y="1345.1245">bool @p verify</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1351.7188" y2="1351.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="12" y="1365.9292">bool is_usable()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="330" x="12" y="1378.7339">Destination @sm from_config(str conf_section,int max_dl)</text><!--class Result.Relay--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="163.24
22" id="Result.Relay" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="383" y="1241.5"/><ellipse cx="465.75" cy="1257.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M468.7188,1263.1406 Q468.1406,1263.4375 467.5,1263.5781 Q466.8594,1263.7344 466.1563,1263.7344 Q463.6563,1263.7344 462.3281,1262.0938 Q461.0156,1260.4375 461.0156,1257.3125 Q461.0156,1254.1875 462.3281,1252.5313 Q463.6563,1250.875 466.1563,1250.875 Q466.8594,1250.875 467.5,1251.0313 Q468.1563,1251.1875 468.7188,1251.4844 L468.7188,1254.2031 Q468.0938,1253.625 467.5,1253.3594 Q466.9063,1253.0781 466.2813,1253.0781 Q464.9375,1253.0781 464.25,1254.1563 Q463.5625,1255.2188 463.5625,1257.3125 Q463.5625,1259.4063 464.25,1260.4844 Q464.9375,1261.5469 466.2813,1261.5469 Q466.9063,1261.5469 467.5,1261.2813 Q468.0938,1261 468.7188,1260.4219 L468.7188,1263.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="76" x="486.2
5" y="1261.6543">Result.Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1273.5" y2="1273.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="74" x="389" y="1287.7104">str nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="389" y="1300.5151">str fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="389" y="1313.3198">str address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="389" y="1326.1245">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="389" y="1338.9292">int observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" t
extLength="128" x="389" y="1351.7339">int average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="389" y="1364.5386">int burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="144" x="389" y="1377.3433">int consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="238" x="389" y="1390.1479">int consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1396.7422" y2="1396.7422"/><!--class ResultErrorCircuit--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="ResultErrorCircuit" style="stroke: #A80036; stroke-width: 1.5;" width="141" x="558.5" y="1516"/><ellipse cx="573.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M576.4688,1537.6406 Q575.890
6,1537.9375 575.25,1538.0781 Q574.6094,1538.2344 573.9063,1538.2344 Q571.4063,1538.2344 570.0781,1536.5938 Q568.7656,1534.9375 568.7656,1531.8125 Q568.7656,1528.6875 570.0781,1527.0313 Q571.4063,1525.375 573.9063,1525.375 Q574.6094,1525.375 575.25,1525.5313 Q575.9063,1525.6875 576.4688,1525.9844 L576.4688,1528.7031 Q575.8438,1528.125 575.25,1527.8594 Q574.6563,1527.5781 574.0313,1527.5781 Q572.6875,1527.5781 572,1528.6563 Q571.3125,1529.7188 571.3125,1531.8125 Q571.3125,1533.9063 572,1534.9844 Q572.6875,1536.0469 574.0313,1536.0469 Q574.6563,1536.0469 575.25,1535.7813 Q575.8438,1535.5 576.4688,1534.9219 L576.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="109" x="587.5" y="1536.1543">ResultErrorCircuit</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="559.5" x2="698.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="559.5" x2="698.5" y1="1556" y2="1556"/><!--class Result
ErrorStream--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="ResultErrorStream" style="stroke: #A80036; stroke-width: 1.5;" width="147" x="734.5" y="1516"/><ellipse cx="749.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M752.4688,1537.6406 Q751.8906,1537.9375 751.25,1538.0781 Q750.6094,1538.2344 749.9063,1538.2344 Q747.4063,1538.2344 746.0781,1536.5938 Q744.7656,1534.9375 744.7656,1531.8125 Q744.7656,1528.6875 746.0781,1527.0313 Q747.4063,1525.375 749.9063,1525.375 Q750.6094,1525.375 751.25,1525.5313 Q751.9063,1525.6875 752.4688,1525.9844 L752.4688,1528.7031 Q751.8438,1528.125 751.25,1527.8594 Q750.6563,1527.5781 750.0313,1527.5781 Q748.6875,1527.5781 748,1528.6563 Q747.3125,1529.7188 747.3125,1531.8125 Q747.3125,1533.9063 748,1534.9844 Q748.6875,1536.0469 750.0313,1536.0469 Q750.6563,1536.0469 751.25,1535.7813 Q751.8438,1535.5 752.4688,1534.9219 L752.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-seri
f" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="115" x="763.5" y="1536.1543">ResultErrorStream</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="735.5" x2="880.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="735.5" x2="880.5" y1="1556" y2="1556"/><!--class DestinationList--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="86.4141" id="DestinationList" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="66.5" y="948"/><ellipse cx="126.25" cy="964" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M129.2188,969.6406 Q128.6406,969.9375 128,970.0781 Q127.3594,970.2344 126.6563,970.2344 Q124.1563,970.2344 122.8281,968.5938 Q121.5156,966.9375 121.5156,963.8125 Q121.5156,960.6875 122.8281,959.0313 Q124.1563,957.375 126.6563,957.375 Q127.3594,957.375 128,957.5313 Q128.6563,957.6875 129.2188,957.9844 L129.2188,960.7031 Q128.5938,960.125 128,959.8594 Q127.4063,959.5781 126.7813,959.5781 Q1
25.4375,959.5781 124.75,960.6563 Q124.0625,961.7188 124.0625,963.8125 Q124.0625,965.9063 124.75,966.9844 Q125.4375,968.0469 126.7813,968.0469 Q127.4063,968.0469 128,967.7813 Q128.5938,967.5 129.2188,966.9219 L129.2188,969.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="93" x="146.75" y="968.1543">DestinationList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="980" y2="980"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="72.5" y="994.2104">list _rl</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="1000.8047" y2="1000.8047"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="72.5" y="1015.0151">Destination next()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="7
2.5" y="1027.8198">DestinationList @sm from_config(...)</text><!--class V3BWHeader--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="291.2891" id="V3BWHeader" style="stroke: #A80036; stroke-width: 1.5;" width="322" x="183" y="449.5"/><ellipse cx="299.25" cy="465.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M302.2188,471.1406 Q301.6406,471.4375 301,471.5781 Q300.3594,471.7344 299.6563,471.7344 Q297.1563,471.7344 295.8281,470.0938 Q294.5156,468.4375 294.5156,465.3125 Q294.5156,462.1875 295.8281,460.5313 Q297.1563,458.875 299.6563,458.875 Q300.3594,458.875 301,459.0313 Q301.6563,459.1875 302.2188,459.4844 L302.2188,462.2031 Q301.5938,461.625 301,461.3594 Q300.4063,461.0781 299.7813,461.0781 Q298.4375,461.0781 297.75,462.1563 Q297.0625,463.2188 297.0625,465.3125 Q297.0625,467.4063 297.75,468.4844 Q298.4375,469.5469 299.7813,469.5469 Q300.4063,469.5469 301,469.2813 Q301.5938,469 302.2188,468.4219 L302.2188,471.1406 Z "/><text fill="#00
0000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="81" x="319.75" y="469.6543">V3BWHeader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="184" x2="504" y1="481.5" y2="481.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="189" y="495.7104">int timestamp</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="189" y="508.5151">str version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="189" y="521.3198">str file_created</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="189" y="534.1245">str latest_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="189" y="546.9292">int num_lines</text><text fill="
#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="189" y="559.7339">str software</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="189" y="572.5386">str software_version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="189" y="585.3433">str generator_started</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="189" y="598.1479">int number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="208" x="189" y="610.9526">int minimum_number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="171" x="189" y="623.7573">int number_consensus_relays</text><text fill="#000000" font-family="sans-ser
if" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="189" y="636.562">int percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="189" y="649.3667">int minimum_percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="189" y="662.1714">int @p num_lines</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="184" x2="504" y1="668.7656" y2="668.7656"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="189" y="682.9761">V3BWHeader @cm from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117" x="189" y="695.7808">add_stats(**kwargs)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="310" x="189
" y="708.5854">int @sm earliest_bandwidth_from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="285" x="189" y="721.3901">str @sm generator_started_from_file(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="299" x="189" y="734.1948">int @sm latest_bandwidth_from_results(dict results)</text><!--class V3BWLine--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="393.7266" id="V3BWLine" style="stroke: #A80036; stroke-width: 1.5;" width="326" x="540" y="398"/><ellipse cx="668.75" cy="414" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M671.7188,419.6406 Q671.1406,419.9375 670.5,420.0781 Q669.8594,420.2344 669.1563,420.2344 Q666.6563,420.2344 665.3281,418.5938 Q664.0156,416.9375 664.0156,413.8125 Q664.0156,410.6875 665.3281,409.0313 Q666.6563,407.375 669.1563,407.375 Q669.8594,407.375 6
70.5,407.5313 Q671.1563,407.6875 671.7188,407.9844 L671.7188,410.7031 Q671.0938,410.125 670.5,409.8594 Q669.9063,409.5781 669.2813,409.5781 Q667.9375,409.5781 667.25,410.6563 Q666.5625,411.7188 666.5625,413.8125 Q666.5625,415.9063 667.25,416.9844 Q667.9375,418.0469 669.2813,418.0469 Q669.9063,418.0469 670.5,417.7813 Q671.0938,417.5 671.7188,416.9219 L671.7188,419.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="60" x="689.25" y="418.1543">V3BWLine</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="541" x2="865" y1="430" y2="430"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="546" y="444.2104">int bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="546" y="457.0151">str node_id</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" te
xtLength="141" x="546" y="469.8198">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="546" y="482.6245">str nick</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="31" x="546" y="495.4292">int rtt</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="546" y="508.2339">str time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="546" y="521.0386">int success</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="546" y="533.8433">int error_stream</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="546" y="546.6479">int error_circ</text><text fill="#000000" font-family="sans-serif"
font-size="11" lengthAdjust="spacingAndGlyphs" textLength="80" x="546" y="559.4526">int error_misc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="546" y="572.2573">int bw_median</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="546" y="585.062">int bw_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="546" y="597.8667">int desc_bw_avg</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="546" y="610.6714">int desc_bw_bur</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="121" x="546" y="623.4761">int desc_bw_obs_last</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="132" x="546" y="636.2808">in
t desc_bw_obs_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="546" y="649.0854">consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="220" x="546" y="661.8901">consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="541" x2="865" y1="668.4844" y2="668.4844"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="546" y="682.6948">int @sm bw_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="264" x="546" y="695.4995">int @sm bw_median_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="303" x="546" y="708.3042">int @sm desc_bw_obs_last_from_results(list results)</t
ext><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="314" x="546" y="721.1089">int @sm desc_bw_obs_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="233" x="546" y="733.9136">V3BWLine @cm from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="546" y="746.7183">str @sm last_time_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="276" x="546" y="759.5229">dict @sm result_types_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="268" x="546" y="772.3276">list @sm results_away_each_other(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="
spacingAndGlyphs" textLength="237" x="546" y="785.1323">list @sm results_recent_than(list results)</text><!--class V3BWFile--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="329.7031" id="V3BWFile" style="stroke: #A80036; stroke-width: 1.5;" width="370" x="159" y="8"/><ellipse cx="311.75" cy="24" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M314.7188,29.6406 Q314.1406,29.9375 313.5,30.0781 Q312.8594,30.2344 312.1563,30.2344 Q309.6563,30.2344 308.3281,28.5938 Q307.0156,26.9375 307.0156,23.8125 Q307.0156,20.6875 308.3281,19.0313 Q309.6563,17.375 312.1563,17.375 Q312.8594,17.375 313.5,17.5313 Q314.1563,17.6875 314.7188,17.9844 L314.7188,20.7031 Q314.0938,20.125 313.5,19.8594 Q312.9063,19.5781 312.2813,19.5781 Q310.9375,19.5781 310.25,20.6563 Q309.5625,21.7188 309.5625,23.8125 Q309.5625,25.9063 310.25,26.9844 Q310.9375,28.0469 312.2813,28.0469 Q312.9063,28.0469 313.5,27.7813 Q314.0938,27.5 314.7188,26.9219 L314.7188,29.6406 Z "/><text fi
ll="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="56" x="332.25" y="28.1543">V3BWFile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="160" x2="528" y1="40" y2="40"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="165" y="54.2104">V3BWHeader header</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="165" y="67.0151">list bw_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="165" y="79.8198">@p info_stats</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="165" y="92.6245">bool @p is_min_perc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="165" y="105.4292">int @p max_bw</text><text fill="#00
0000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="165" y="118.2339">int @p mean_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="165" y="131.0386">int @p median_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="165" y="143.8433">int @p min_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="165" y="156.6479">int @p num</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="88" x="165" y="169.4526">int @p sum_bw</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="160" x2="528" y1="176.0469" y2="176.0469"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="252" x="165" y="190.2573">V3BWFile @cm from_results(dict r
esults, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="147" x="165" y="203.062">list @sm bw_kb(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="200" x="165" y="215.8667">list @sm bw_sbws_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="165" y="228.6714">list @sm bw_torflow_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="288" x="165" y="241.4761">bool @sm is_max_bw_diff_perc_reached(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="306" x="165" y="254.2808">(dict, bool) @sm measured_progress_stats(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLengt
h="358" x="165" y="267.0854">int @sm read_number_consensus_relays(str consensus_path)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="165" y="279.8901">(list, list, list) to_plt()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="195" x="165" y="292.6948">list update_progress(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="165" y="305.4995">warn_if_not_accurate_enough(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="165" y="318.3042">tuple to_plt(...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="165" y="331.1089">write(str output)</text><!--class CircuitBuilder--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" he
ight="124.8281" id="CircuitBuilder" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="1273" y="532.5"/><ellipse cx="1293.4" cy="548.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1296.3688,554.1406 Q1295.7906,554.4375 1295.15,554.5781 Q1294.5094,554.7344 1293.8063,554.7344 Q1291.3063,554.7344 1289.9781,553.0938 Q1288.6656,551.4375 1288.6656,548.3125 Q1288.6656,545.1875 1289.9781,543.5313 Q1291.3063,541.875 1293.8063,541.875 Q1294.5094,541.875 1295.15,542.0313 Q1295.8063,542.1875 1296.3688,542.4844 L1296.3688,545.2031 Q1295.7438,544.625 1295.15,544.3594 Q1294.5563,544.0781 1293.9313,544.0781 Q1292.5875,544.0781 1291.9,545.1563 Q1291.2125,546.2188 1291.2125,548.3125 Q1291.2125,550.4063 1291.9,551.4844 Q1292.5875,552.5469 1293.9313,552.5469 Q1294.5563,552.5469 1295.15,552.2813 Q1295.7438,552 1296.3688,551.4219 L1296.3688,554.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLengt
h="82" x="1308.6" y="552.6543">CircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1274" x2="1398" y1="564.5" y2="564.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1279" y="578.7104">set built_circuits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1279" y="591.5151">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1279" y="604.3198">list relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="1279" y="617.1245">Controller controller</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1274" x2="1398" y1="623.7188" y2="623.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1279" y="637.9292
">int build_circuit()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1279" y="650.7339">void close_circuit()</text><!--class GapsCircuitBuilder--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="GapsCircuitBuilder" style="stroke: #A80036; stroke-width: 1.5;" width="146" x="1389" y="967"/><ellipse cx="1404" cy="983" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1406.9688,988.6406 Q1406.3906,988.9375 1405.75,989.0781 Q1405.1094,989.2344 1404.4063,989.2344 Q1401.9063,989.2344 1400.5781,987.5938 Q1399.2656,985.9375 1399.2656,982.8125 Q1399.2656,979.6875 1400.5781,978.0313 Q1401.9063,976.375 1404.4063,976.375 Q1405.1094,976.375 1405.75,976.5313 Q1406.4063,976.6875 1406.9688,976.9844 L1406.9688,979.7031 Q1406.3438,979.125 1405.75,978.8594 Q1405.1563,978.5781 1404.5313,978.5781 Q1403.1875,978.5781 1402.5,979.6563 Q1401.8125,980.7188 1401.8125,982.8125 Q1401.8125,
984.9063 1402.5,985.9844 Q1403.1875,987.0469 1404.5313,987.0469 Q1405.1563,987.0469 1405.75,986.7813 Q1406.3438,986.5 1406.9688,985.9219 L1406.9688,988.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="1418" y="987.1543">GapsCircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1390" x2="1534" y1="999" y2="999"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1390" x2="1534" y1="1007" y2="1007"/><!--class State--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="60.8047" id="State" style="stroke: #A80036; stroke-width: 1.5;" width="66" x="1191" y="142.5"/><ellipse cx="1206" cy="158.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1208.9688,164.1406 Q1208.3906,164.4375 1207.75,164.5781 Q1207.1094,164.7344 1206.4063,164.7344 Q1203.9063,164.7344 1202.5781,163.0938 Q1201.2656,161.4375 1201.2656,158.3125 Q1201.2656,155.1875 1202.5781,153.5313
Q1203.9063,151.875 1206.4063,151.875 Q1207.1094,151.875 1207.75,152.0313 Q1208.4063,152.1875 1208.9688,152.4844 L1208.9688,155.2031 Q1208.3438,154.625 1207.75,154.3594 Q1207.1563,154.0781 1206.5313,154.0781 Q1205.1875,154.0781 1204.5,155.1563 Q1203.8125,156.2188 1203.8125,158.3125 Q1203.8125,160.4063 1204.5,161.4844 Q1205.1875,162.5469 1206.5313,162.5469 Q1207.1563,162.5469 1207.75,162.2813 Q1208.3438,162 1208.9688,161.4219 L1208.9688,164.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="34" x="1220" y="162.6543">State</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1192" x2="1256" y1="174.5" y2="174.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1192" x2="1256" y1="182.5" y2="182.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="26" x="1197" y="196.7104">get()</text><!--link RelayList to Relay--><path d="M1141.7803,1117.7792 C1139.5047,
1141.3892 1137.1208,1166.1221 1134.8275,1189.9151 " fill="none" id="RelayList-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1143.0322,1104.7911,1138.4749,1110.3796,1141.8807,1116.7357,1146.438,1111.1472,1143.0322,1104.7911" style="stroke: #A80036; stroke-width: 1.0;"/><!--link RelayPrioritizer to RelayList--><path d="M1091.8035,242.0991 C1100.7542,286.445 1111.631,345.3745 1118,398 C1138.0909,564.0059 1147.1731,757.5829 1151.1325,877.2294 " fill="none" id="RelayPrioritizer-RelayList" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1089.1551,229.1209,1086.4355,235.7995,1091.5545,240.8786,1094.274,234.2,1089.1551,229.1209" style="stroke: #A80036; stroke-width: 1.0;"/><!--link RelayPrioritizer to ResultDump--><path d="M1064.568,242.0302 C1051.5551,314.2861 1031.0806,427.9735 1016.8997,506.7147 " fill="none" id="RelayPrioritizer-ResultDump" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1066
.9078,229.0383,1061.9076,234.2343,1064.7808,240.8483,1069.7809,235.6523,1066.9078,229.0383" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to ResultError--><path d="M710.6906,1150.5792 C713.2952,1204.6264 715.9437,1259.5825 717.5294,1292.4845 " fill="none" id="Result-ResultError" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="703.6868,1150.6686,709.7159,1130.3548,717.6706,1149.9947,703.6868,1150.6686" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to ResultSuccess--><path d="M780.7396,1148.3754 C806.0146,1199.5418 831.8309,1251.8039 848.5484,1285.6468 " fill="none" id="Result-ResultSuccess" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="774.4197,1151.3866,771.8379,1130.3548,786.9718,1145.1862,774.4197,1151.3866" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to Destination--><path d="M566.1487,1068.0931 C504.0233,1103.9749 430.0487,1147.9462 365,1190 C330.9212,1212.0319 294.3122,1237.5008
262.5366,1260.2178 " fill="none" id="Result-Destination" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to Relay--><path d="M839.6165,1099.2498 C884.6328,1134.9191 934.7779,1174.6522 980.1737,1210.6221 " fill="none" id="Result-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to Result.Relay--><path d="M614.3565,1141.9212 C594.2523,1176.1499 573.6418,1211.2406 555.9819,1241.3077 " fill="none" id="Result-Result.Relay" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="621.15,1130.3548,614.6622,1133.5026,615.0726,1140.702,621.5604,1137.5542,621.15,1130.3548" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultError to ResultErrorCircuit--><path d="M698.5156,1372.3901 C679.927,1417.2093 653.3054,1481.3969 639.0015,1515.8853 " fill="none" id="ResultError-ResultErrorCircuit" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="692.168,1369.4229,706.2961,1353.6306,705.0999,1374.7864,692.168,1369.4229"
style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultError to ResultErrorStream--><path d="M739.2568,1372.3901 C757.6388,1417.2093 783.9646,1481.3969 798.1096,1515.8853 " fill="none" id="ResultError-ResultErrorStream" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="732.6756,1374.791,731.5628,1353.6306,745.6285,1369.4784,732.6756,1374.791" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultDump to Result--><path d="M946.3484,694.784 C927.5344,726.6984 905.5067,761.6122 883,792 C868.2356,811.9343 851.8253,832.1859 835.0927,851.7601 " fill="none" id="ResultDump-Result" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="953.1293,683.1758,946.649,686.3391,947.0766,693.5375,953.5568,690.3742,953.1293,683.1758" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultDump to Relay--><path d="M988.2056,683.1519 C975.6842,790.8524 964.1023,977.5467 1007,1130 C1012.6786,1150.181 1021.0422,1170.3958 1030.7131,1189.7404 " fi
ll="none" id="ResultDump-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><!--link DestinationList to Destination--><path d="M177,1047.2321 C177,1106.3398 177,1199.0983 177,1260.4715 " fill="none" id="DestinationList-Destination" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="177,1034.0628,173,1040.0628,177,1046.0628,181,1040.0628,177,1034.0628" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWHeader to Result--><path d="M475.4186,740.5549 C491.1082,757.9 506.9075,775.3516 522,792 C539.5654,811.3761 558.107,831.7977 576.3573,851.8801 " fill="none" id="V3BWHeader-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWLine to Result--><path d="M703,792.1299 C703,812.298 703,832.4782 703,851.8333 " fill="none" id="V3BWLine-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to V3BWHeader--><path d="M344,351.6517 C344,384.1873 344,417.7741 344,449.2179 " fill="none" id="V3BWFile-V3BWHeader" style="stroke: #A80036; s
troke-width: 1.0;"/><polygon fill="#A80036" points="344,338.2718,340,344.2718,344,350.2718,348,344.2718,344,338.2718" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to V3BWLine--><path d="M493.1122,348.2795 C508.499,366.3665 524.1926,384.8142 539.723,403.0699 " fill="none" id="V3BWFile-V3BWLine" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="484.5985,338.2718,485.4396,345.4337,492.3741,347.4118,491.533,340.25,484.5985,338.2718" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to Result--><path d="M193.7462,338.0148 C182.1681,357.2413 172.2006,377.383 165,398 C107.2614,563.3184 64.9348,648.2959 165,792 C171.0821,800.7345 409.0849,886.5905 566.4632,942.6413 " fill="none" id="V3BWFile-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to RelayList--><path d="M1301.5908,669.8683 C1274.675,728.4323 1236.8065,810.8276 1206.1672,877.4933 " fill="none" id="CircuitBuilder-RelayList" style="stroke: #A80036;
stroke-width: 1.0;"/><polygon fill="#A80036" points="1307.1616,657.7474,1301.0215,661.5287,1302.1503,668.6509,1308.2905,664.8696,1307.1616,657.7474" style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to Relay--><path d="M1344.9855,657.8754 C1356.9509,761.1798 1369.3716,971.196 1301,1130 C1291.5123,1152.0367 1278.3878,1173.1519 1263.5173,1192.7967 " fill="none" id="CircuitBuilder-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to GapsCircuitBuilder--><path d="M1362.0812,676.9694 C1391.1312,768.2694 1436.3637,910.4289 1454.2986,966.7956 " fill="none" id="CircuitBuilder-GapsCircuitBuilder" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1355.3587,678.9283,1355.9651,657.7474,1368.6997,674.6834,1355.3587,678.9283" style="stroke: #A80036; stroke-width: 1.0;"/><!--
+@startuml
+
+class RelayList {
+ stem.Controller _controller
+ Lock _refresh_lock
+ int _last_refresh
+ list @p relays
+ list @p bad_exits
+ list @p exits
+ list @p non_exits
+ list @p authorities
+ bool _need_refresh()
+ _init_relays()
+ _refresh()
+ list _relays_with_flag(int flag)
+ list _relays_without_flag(int flag)
+ list exits_not_bad_can_exit_to_port(int port)
+}
+RelayList *- - Relay
+class Relay {
+ stem.RouterStatusEntryV3 _from_ns
+ stem.RelayDescriptor _from_desc
+ str @p nickname
+ str @p fingerprint
+ list @p flags
+ ExitPolicy @p exit_policy
+ str @p address
+ str @p master_key_ed25519
+ int @p observed_bandwidth
+ int @p average_bandwidth
+ int @p burst_bandwidth
+ int @p consensus_bandwidth
+ bool @p consensus_bandwidth_is_unmeasured
+ obj _from_ns(attr)
+ obj _from_desc(attr)
+ bool can_exit_to_port(int port)
+ bool is_exit_not_bad_allowing_port(int port)
+}
+class RelayPrioritizer {
+ int fresh_seconds
+ ResultDump result_dump
+ RelayList relay_list
+ bool measure_authorities
+ generator best_priority()
+}
+RelayPrioritizer *- - RelayList
+RelayPrioritizer *- - ResultDump
+Result ^- - ResultError
+Result ^- - ResultSuccess
+Result - - Destination
+class Result {
+ Result.Relay _relay
+ list @p circ
+ str @p dest_url
+ str @p scanner
+ int @p time
+ str @p type
+ int @p version
+ str @p nickname
+ str @p fingerprint
+ str @p address
+ str @p master_key_ed25519
+ int @p relay_observed_bandwidth
+ int @p relay_average_bandwidth
+ int @p relay_burst_bandwidth
+ int @p consensus_bandwidth
+ int @p consensus_bandwidth_is_unmeasured
+ dict to_dict()
+ Result from_dict(dict d)
+}
+Result - - Relay
+Result *- - Result.Relay
+class Result.Relay {
+ str nickname
+ str fingerprint
+ str address
+ str master_key_ed25519
+ int observed_bandwidth
+ int average_bandwidth
+ int burst_bandwidth
+ int consensus_bandwidth
+ int consensus_bandwidth_is_unmeasured
+}
+class ResultError {
+ str @p msg
+}
+ResultError ^- - ResultErrorCircuit
+class ResultErrorCircuit {
+}
+ResultError ^- - ResultErrorStream
+class ResultSuccess {
+ list @p rtts
+ list @p downloads
+}
+ResultDump *- - Result
+ResultDump - - Relay
+class ResultDump {
+ dict data
+ int fresh_days
+ str datadir
+ Lock data_lock
+ Thread thread
+ Queue queue
+ store_result(Result result)
+ handle_result(Result result)
+ enter()
+ list results_for_relay(Relay relay)
+}
+class DestinationList {
+ list _rl
+ Destination next()
+ DestinationList @sm from_config(...)
+}
+DestinationList *- - Destination
+class Destination {
+ str @p hostname
+ int @p port
+ str @p url
+ bool @p verify
+ bool is_usable()
+ Destination @sm from_config(str conf_section,int max_dl)
+}
+V3BWHeader - - Result
+class V3BWHeader {
+ int timestamp
+ str version
+ str file_created
+ str latest_bandwidth
+ int num_lines
+ str software
+ str software_version
+ str generator_started
+ int number_eligible_relays
+ int minimum_number_eligible_relays
+ int number_consensus_relays
+ int percent_eligible_relays
+ int minimum_percent_eligible_relays
+ int @p num_lines
+
+ V3BWHeader @cm from_results(dict results)
+ add_stats(**kwargs)
+ int @sm earliest_bandwidth_from_results(dict results)
+ str @sm generator_started_from_file(dict results)
+ int @sm latest_bandwidth_from_results(dict results)
+}
+V3BWLine - - Result
+class V3BWLine {
+ int bw
+ str node_id
+ str master_key_ed25519
+ str nick
+ int rtt
+ str time
+ int success
+ int error_stream
+ int error_circ
+ int error_misc
+ int bw_median
+ int bw_mean
+ int desc_bw_avg
+ int desc_bw_bur
+ int desc_bw_obs_last
+ int desc_bw_obs_mean
+ consensus_bandwidth
+ consensus_bandwidth_is_unmeasured
+
+ int @sm bw_mean_from_results(list results)
+ int @sm bw_median_from_results(list results)
+ int @sm desc_bw_obs_last_from_results(list results)
+ int @sm desc_bw_obs_mean_from_results(list results)
+ V3BWLine @cm from_results(list results)
+ str @sm last_time_from_results(list results)
+ dict @sm result_types_from_results(list results)
+ list @sm results_away_each_other(list results)
+ list @sm results_recent_than(list results)
+}
+V3BWFile *- - V3BWHeader
+V3BWFile *- - V3BWLine
+V3BWFile - - Result
+class V3BWFile {
+ V3BWHeader header
+ list bw_lines
+ @p info_stats
+ bool @p is_min_perc
+ int @p max_bw
+ int @p mean_bw
+ int @p median_bw
+ int @p min_bw
+ int @p num
+ int @p sum_bw
+ V3BWFile @cm from_results(dict results, ...)
+ list @sm bw_kb(bw_lines)
+ list @sm bw_sbws_scale(bw_lines)
+ list @sm bw_torflow_scale(bw_lines)
+ bool @sm is_max_bw_diff_perc_reached(bw_lines)
+ (dict, bool) @sm measured_progress_stats(bw_lines)
+ int @sm read_number_consensus_relays(str consensus_path)
+ (list, list, list) to_plt()
+ list update_progress(bw_lines, ...)
+ warn_if_not_accurate_enough(bw_lines, ...)
+ tuple to_plt(...)
+ write(str output)
+}
+CircuitBuilder *- - RelayList
+CircuitBuilder - - Relay
+class CircuitBuilder {
+ set built_circuits
+ RelayList relay_list
+ list relays
+ Controller controller
+ int build_circuit()
+ void close_circuit()
+}
+CircuitBuilder ^- - GapsCircuitBuilder
+
+class State {
+ get()
+}
+
+@enduml
+
+PlantUML version 1.2018.13(Mon Nov 26 17:11:51 GMT 2018)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.8+10-post-Debian-1deb10u1
+Operating System: Linux
+OS Version: 4.19.0-10-amd64
+Default Encoding: UTF-8
+Language: en
+Country: US
+--></g></svg>
\ No newline at end of file
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 0c1f9b6..8f63eb2 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -260,6 +260,8 @@ BWLINE_INT_KEYS = (
+ BWLINE_KEYS_V1_2
+ BWLINE_KEYS_V1_4
)
+# This is boolean, not int.
+BWLINE_INT_KEYS.remove('consensus_bandwidth_is_unmeasured')
def round_sig_dig(n, digits=PROP276_ROUND_DIG):
1
0
[sbws/maint-1.1] Merge remote-tracking branch 'gitlab/merge-requests/24' into maint-1.1
by jugaï¼ torproject.org 11 Aug '20
by jugaï¼ torproject.org 11 Aug '20
11 Aug '20
commit e4433c794c7e84c38665c3e22b9b380d5c25d899
Merge: b9f9210 ca20d82
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Aug 11 08:31:06 2020 +0000
Merge remote-tracking branch 'gitlab/merge-requests/24' into maint-1.1
sbws/lib/relaylist.py | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
1
0
[sbws/maint-1.1] Merge remote-tracking branch 'gitlab/merge-requests/21' into maint-1.1
by jugaï¼ torproject.org 11 Aug '20
by jugaï¼ torproject.org 11 Aug '20
11 Aug '20
commit 9ecff4e4ed39cbe166bae70403808de2a881c6dd
Merge: 3fcc589 20feac8
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Aug 9 18:11:19 2020 +0000
Merge remote-tracking branch 'gitlab/merge-requests/21' into maint-1.1
.gitchangelog.rc | 290 +++++++++++++++++++++++++++++++++++++++++++
.gitchangelogrst.tpl | 34 +++++
docs/source/contributing.rst | 18 +++
scripts/maint/release.py | 159 ++++++++++++++++++++++++
4 files changed, 501 insertions(+)
1
0
[sbws/maint-1.1] Merge remote-tracking branch 'gitlab/merge-requests/22' into maint-1.1
by jugaï¼ torproject.org 11 Aug '20
by jugaï¼ torproject.org 11 Aug '20
11 Aug '20
commit 1adce87ccbaa6add9ef97d8e07e165342e638912
Merge: e4433c7 f075a64
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Aug 11 08:35:23 2020 +0000
Merge remote-tracking branch 'gitlab/merge-requests/22' into maint-1.1
docs/source/classes_original.puml | 4 +-
docs/source/images/classes_original.svg | 234 +++++++++++++++++++++++++++++++-
sbws/lib/v3bwfile.py | 2 +
3 files changed, 237 insertions(+), 3 deletions(-)
1
0
[sbws/maint-1.1] fix: doc: Replace Trac, ticket by Gitlab, issue
by jugaï¼ torproject.org 11 Aug '20
by jugaï¼ torproject.org 11 Aug '20
11 Aug '20
commit c7b1c01e51afbc6722925f140ad87c260ac4b8b8
Author: juga0 <juga(a)riseup.net>
Date: Fri Jun 26 07:17:06 2020 +0000
fix: doc: Replace Trac, ticket by Gitlab, issue
Closes: #40001
---
docs/source/contributing.rst | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
index 66cf9d2..161f971 100644
--- a/docs/source/contributing.rst
+++ b/docs/source/contributing.rst
@@ -18,7 +18,7 @@ Bug reports or feature requests
.. _ticket-ref:
* Open a issue in
- `Tor Project Trac <https://gitlab.torproject.org/tpo/network-health/sbws/-/issues>`_ .
+ `Tor Project Gitlab <https://gitlab.torproject.org/tpo/network-health/sbws/-/issues>`_ .
Code/documentation patches
---------------------------
@@ -42,7 +42,7 @@ The following are guidelines we aim to follow.
Steps to create a PR
~~~~~~~~~~~~~~~~~~~~~
-1. Create a ticket in Tor Project Trac (:ref:`Open ticket <ticket-ref>`)
+1. Create a issue in Tor Project Gitlab (:ref:`Open issue <ticket-ref>`)
2. Clone ``sbws`` via the Github web interface
https://github.com/torproject/sbws
3. Clone the repository locally
@@ -132,7 +132,7 @@ but not all.
Commits
~~~~~~~~~
-Each commit should reference the Tor Project Trac ticket (example: ``#12345``)
+Each commit should reference the Tor Project Gitlab issue (example: ``#12345``)
and possibly the bugfix version.
Try to make each commit a logically separate changes.::
@@ -254,7 +254,7 @@ Before major releases, ensure that:
.. _changelog:
Create a ./CHANGELOG.rst file.
-Each entry should reference the Tor Project Trac ticket (example: ``#12345``)
+Each entry should reference the Tor Project Gitlab issue (example: ``#12345``)
and possibly the bugfix version.
Until version 1.0.2 we have followed `keep a changelog`_ format.
1
0
[sbws/maint-1.1] fix: doc: Replace Github review process to Gitlab
by jugaï¼ torproject.org 11 Aug '20
by jugaï¼ torproject.org 11 Aug '20
11 Aug '20
commit f26e4bc58d80717f2d8893a9f72003cfc84da014
Author: juga0 <juga(a)riseup.net>
Date: Fri Jun 26 07:42:33 2020 +0000
fix: doc: Replace Github review process to Gitlab
Replace also Github terminology to Gitlab.
---
docs/source/contributing.rst | 57 +++++++++++++++++++++++++++-----------------
1 file changed, 35 insertions(+), 22 deletions(-)
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
index 161f971..658cf80 100644
--- a/docs/source/contributing.rst
+++ b/docs/source/contributing.rst
@@ -24,8 +24,9 @@ Code/documentation patches
---------------------------
The sbws canonical repository is https://gitweb.torproject.org/sbws.git,
-but we review patches using the Github canonical repository
-(https://github.com/torproject/sbws) Pull Requests (PR).
+but we review patches using the Gitlab repository
+(https://gitlab.torproject.org/tpo/network-health/sbws/-/merge_requests)
+Merge Requests (MR).
To know more about ``sbws`` code,
@@ -39,12 +40,12 @@ To know more about ``sbws`` code,
The following are guidelines we aim to follow.
-Steps to create a PR
+Steps to create a MR
~~~~~~~~~~~~~~~~~~~~~
1. Create a issue in Tor Project Gitlab (:ref:`Open issue <ticket-ref>`)
-2. Clone ``sbws`` via the Github web interface
- https://github.com/torproject/sbws
+2. Fork ``sbws`` via the Gitlab web interface:
+ https://gitlab.torproject.org/tpo/network-health/sbws
3. Clone the repository locally
4. Install ``sbws`` as explained in ./INSTALL.rst and ./TESTING.rst
Use ``pip install -e <>``
@@ -56,11 +57,23 @@ Steps to create a PR
7. Write code (:ref:`codestyle-ref`), tests, documentation,
extra files (:ref:`extrafiles-ref`), commit (:ref:`commits-ref`), etc.
8. Ensure tests pass (./TESTING.rst).
-9. Push your branch to your repository. If you have an account in Travis,
- you can see whether it pass the tests in Github and in
- https://travis-ci.org/youruser/sbws/
-10. Create a PR from your branch to https://github.com/torproject/sbws
-11. Change the Trac ticket status to ``needs_review``
+9. Push your branch to your Gitlab repository.
+
+We are temporally using Github Travis to ensure tests pass. For this:
+
+10. Clone ``sbws`` via the Github web interface:
+ https://github.com/torproject/sbws
+11. Push your branch to your Github repository.
+
+12. If you have an account in Travis, you can see whether it pass the tests in
+ Github and at https://travis-ci.org/youruser/sbws/
+
+Finally:
+
+13. Create a MR from your branch at
+ https://gitlab.torproject.org/tpo/network-health/sbws
+
+
.. _codestyle-ref:
@@ -154,27 +167,27 @@ Template originally written by `Tim Pope`_: :ref:`example commit <commit-msg>`
Code being reviewed workflow
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-When a PR is being reviewed, new changes might be needed:
+When a MR is being reviewed, new changes might be needed:
- If the change does not modify a previous change, create new commits and push.
- If the change modifies a previous change and it's small,
`git commit fixup <https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupltc…>`_
- should be used. When it is agreed that the PR is ready, create a new branch
+ should be used. When it is agreed that the MR is ready, create a new branch
named ``mybranch_02`` and run:
.. code-block:: bash
rebase --autosquash
- push, create new PR and close old PR mentioning the number of the new PR.
-- If the review takes long and when it's ready code related to the PR has changed
+ push, create new MR and close old MR mentioning the number of the new MR.
+- If the review takes long and when it's ready code related to the MR has changed
in master, create a new branch named ``mybranch_02`` and run:
.. code-block:: bash
rebase master
- push, create new PR and close old PR mentioning the number of the new PR.
+ push, create new MR and close old MR mentioning the number of the new MR.
[MERG]_
@@ -196,23 +209,23 @@ Reviewers:
- Should let the contributor know what to improve/change.
- Should not push code to the contributor's branch.
- Should wait for contributor's changes or feedback after changes are requested,
- before merging or closing a PR.
-- Should merge (not rebase) the PR.
+ before merging or closing a MR.
+- Should merge (not rebase) the MR.
- If rebase is needed due to changes in master, the contributor should create
a new branch named `xxx_rebased` based on the reviewed branch, rebase and
- create a new PR from it, as explained above.
+ create a new MR from it, as explained above.
- If new changes are needed when the contributor's branch is ready to merge,
the reviewer can create a new branch based on the contributor's branch,
- push the changes and merge that PR.
+ push the changes and merge that MR.
The contributor should be notified about it.
-- If the reviewer realize that new changes are needed after the PR has been
+- If the reviewer realize that new changes are needed after the MR has been
merged, the reviewer can push to master, notifying the contributor about the
changes.
- Because currently there are not many reviewers, reviewers can merge their own
- PR if there was not any feedback after a week.
+ MR if there was not any feedback after a week.
- Should not push directly to master, unless changes are trivial (typos,
extra spaces, etc.)
-- Should not push to master new features while there are open PRs to review.
+- Should not push to master new features while there are open MRs to review.
Currently, the reviewers are the persons that have contributed to the code:
pastly, teor, juga.
1
0
11 Aug '20
commit ba4791d1ca255b9e91d5b0a8e11471714f78d08a
Author: juga0 <juga(a)riseup.net>
Date: Fri Jun 26 07:07:35 2020 +0000
fix: Replace links from Trac to Gitlab
---
docs/source/contributing.rst | 5 ++---
docs/source/man_sbws.ini.rst | 2 +-
docs/source/man_sbws.rst | 2 +-
docs/source/tor_bandwidth_files.rst | 4 ++--
sbws/core/scanner.py | 4 +++-
sbws/lib/v3bwfile.py | 2 +-
6 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst
index 15da287..66cf9d2 100644
--- a/docs/source/contributing.rst
+++ b/docs/source/contributing.rst
@@ -17,9 +17,8 @@ Bug reports or feature requests
.. _ticket-ref:
-* Open a ticket in
- `Tor Project Trac <https://trac.torproject.org>`_
- and assign the component to ``Core Tor``/``sbws``.
+* Open a issue in
+ `Tor Project Trac <https://gitlab.torproject.org/tpo/network-health/sbws/-/issues>`_ .
Code/documentation patches
---------------------------
diff --git a/docs/source/man_sbws.ini.rst b/docs/source/man_sbws.ini.rst
index 5f4241b..22512b8 100644
--- a/docs/source/man_sbws.ini.rst
+++ b/docs/source/man_sbws.ini.rst
@@ -226,4 +226,4 @@ SEE ALSO
BUGS
----
-Please report bugs at https://trac.torproject.org/.
\ No newline at end of file
+Please report bugs at https://gitlab.torproject.org/tpo/network-health/sbws/-/issues/.
diff --git a/docs/source/man_sbws.rst b/docs/source/man_sbws.rst
index c9411e4..608c36d 100644
--- a/docs/source/man_sbws.rst
+++ b/docs/source/man_sbws.rst
@@ -114,4 +114,4 @@ https://gitweb.torproject.org/torspec.git/tree/bandwidth-file-spec.txt,
BUGS
----
-Please report bugs at https://trac.torproject.org/.
\ No newline at end of file
+Please report bugs at https://gitlab.torproject.org/tpo/network-health/sbws/-/issues/.
diff --git a/docs/source/tor_bandwidth_files.rst b/docs/source/tor_bandwidth_files.rst
index 94aaae7..94fae97 100644
--- a/docs/source/tor_bandwidth_files.rst
+++ b/docs/source/tor_bandwidth_files.rst
@@ -18,7 +18,7 @@ To appear in Tor v0.4.1.x:
bandwidth-file-digest sha256=01234567890123456789abcdefghijkl
-https://trac.torproject.org/projects/tor/ticket/26698
+https://gitlab.torproject.org/tpo/core/tor/-/issues/26698
Directory authorities' bandwidth file URL
-----------------------------------------
@@ -29,4 +29,4 @@ To appear in Tor v0.4.1.x:
/tor/status-vote/next/bandwidth.z
-https://trac.torproject.org/projects/tor/ticket/21377
+https://gitlab.torproject.org/tpo/core/tor/-/issues/21377
diff --git a/sbws/core/scanner.py b/sbws/core/scanner.py
index 3210c80..e5d5e90 100644
--- a/sbws/core/scanner.py
+++ b/sbws/core/scanner.py
@@ -43,7 +43,9 @@ rd = None
controller = None
FILLUP_TICKET_MSG = """Something went wrong.
-Please create a ticket in https://trac.torproject.org with this traceback."""
+Please create an issue at
+https://gitlab.torproject.org/tpo/network-health/sbws/-/issues with this
+traceback."""
def stop_threads(signal, frame, exit_code=0):
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 0c1f9b6..343a490 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -1250,7 +1250,7 @@ class V3BWFile(object):
# Generators SHOULD NOT limit measured bandwidths based on
# descriptors' bandwidth-observed, because that penalises new
# relays.
- # See https://trac.torproject.org/projects/tor/ticket/8494
+ # See https://gitlab.torproject.org/tpo/core/tor/-/issues/8494
# If the observed bandwidth is None, it is not possible to
# calculate the minimum with the other descriptors.
# Only in this case, take the consensus bandwidth.
1
0
[translation/communitytpo-contentspot] https://gitweb.torproject.org/translation.git/commit/?h=communitytpo-contentspot
by translationï¼ torproject.org 11 Aug '20
by translationï¼ torproject.org 11 Aug '20
11 Aug '20
commit bf5ca768f3c50e44bac8ff7250266a687f7bd487
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Aug 11 12:15:13 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=communitytpo-conten…
---
contents+es.po | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/contents+es.po b/contents+es.po
index 677d0382cb..d9b7dbca8d 100644
--- a/contents+es.po
+++ b/contents+es.po
@@ -8279,6 +8279,9 @@ msgid ""
"If you have a law school nearby, meet the professors that teach the Internet"
" law classes, and chat with them about Tor and its implications."
msgstr ""
+"Si tienes una escuela de leyes en las cercanÃas, reúnete con los profesoers "
+"que enseñan las clases sobre leyes de Internet, y charla con ellos acerca de"
+" Tor y sus implicaciones."
#: https//community.torproject.org/relay/community-resources/tor-relay-universities/
#: (content/relay-operations/community-resources/tor-relay-universities/contents+en.lrpage.body)
@@ -8287,6 +8290,9 @@ msgid ""
"your way up the chain to get as many good allies as you can in as many areas"
" as you can."
msgstr ""
+"Solicita el consejo de todos con los que te reunes y les gusta la idea, e "
+"intenta trepar por la cadena para obtener tantos buenos aliados como puedas,"
+" en tantas áreas como puedas."
#: https//community.torproject.org/relay/community-resources/tor-relay-universities/
#: (content/relay-operations/community-resources/tor-relay-universities/contents+en.lrpage.body)
1
0
11 Aug '20
commit b705cfa0247dda72ae7c8291be290316bd2392d1
Merge: b46942d37f dcf5753a83
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Tue Aug 11 15:12:43 2020 +0300
Merge remote-tracking branch 'tor-gitlab/mr/111'
changes/ticket18106 | 3 +
src/app/config/or_options_st.h | 4 +-
src/core/mainloop/connection.c | 12 +--
src/core/or/extendinfo.c | 2 +-
src/core/or/policies.c | 140 +++++++++++++--------------
src/core/or/policies.h | 26 ++---
src/feature/client/bridges.c | 8 +-
src/feature/client/entrynodes.c | 4 +-
src/feature/dirclient/dirclient.c | 12 +--
src/feature/hs/hs_common.c | 4 +-
src/feature/nodelist/authcert.c | 2 +-
src/feature/nodelist/node_select.c | 14 +--
src/feature/nodelist/nodelist.c | 16 ++--
src/feature/nodelist/routerlist.c | 4 +-
src/feature/rend/rendservice.c | 6 +-
src/test/test_entrynodes.c | 2 +-
src/test/test_policy.c | 190 ++++++++++++++++++-------------------
17 files changed, 226 insertions(+), 223 deletions(-)
1
0
11 Aug '20
commit b417594dbcbd6b0c149611084c7319781ed67a70
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Aug 5 16:34:45 2020 -0400
Replace several C identifiers for ticket 18106.
We used to have a single boolean, "FascistFirewall". Ages ago, in
tickets #17840 and #9067, we added an improved "ReachableAddresses"
mechanism. It's time to rename related identifiers in the code for
consistency. This closes #18106.
This is an automated commit, generated by this command:
./scripts/maint/rename_c_identifier.py \
fascist_firewall_allows_address reachable_addr_allows \
fascist_firewall_use_ipv6 reachable_addr_use_ipv6 \
fascist_firewall_prefer_ipv6_impl reachable_addr_prefer_ipv6_impl \
fascist_firewall_prefer_ipv6_orport reachable_addr_prefer_ipv6_orport \
fascist_firewall_prefer_ipv6_dirport reachable_addr_prefer_ipv6_dirport \
fascist_firewall_allows_address_addr reachable_addr_allows_addr \
fascist_firewall_allows_address_ap reachable_addr_allows_ap \
fascist_firewall_allows_base reachable_addr_allows_base \
fascist_firewall_allows_ri_impl reachable_addr_allows_ri_impl \
fascist_firewall_allows_rs_impl reachable_addr_allows_rs_impl \
fascist_firewall_allows_rs reachable_addr_allows_rs \
fascist_firewall_allows_md_impl reachable_addr_allows_md_impl \
fascist_firewall_allows_node reachable_addr_allows_node \
fascist_firewall_allows_dir_server reachable_addr_allows_dir_server \
fascist_firewall_choose_address_impl reachable_addr_choose_impl \
fascist_firewall_choose_address reachable_addr_choose \
fascist_firewall_choose_address_base reachable_addr_choose_base \
fascist_firewall_choose_address_rs reachable_addr_choose_from_rs \
fascist_firewall_choose_address_ls reachable_addr_choose_from_ls \
fascist_firewall_choose_address_node reachable_addr_choose_from_node \
fascist_firewall_choose_address_dir_server reachable_addr_choose_from_dir_server
---
src/app/config/or_options_st.h | 4 +-
src/core/mainloop/connection.c | 12 +--
src/core/or/extendinfo.c | 2 +-
src/core/or/policies.c | 140 +++++++++++++--------------
src/core/or/policies.h | 26 ++---
src/feature/client/bridges.c | 8 +-
src/feature/client/entrynodes.c | 4 +-
src/feature/dirclient/dirclient.c | 12 +--
src/feature/hs/hs_common.c | 4 +-
src/feature/nodelist/authcert.c | 2 +-
src/feature/nodelist/node_select.c | 14 +--
src/feature/nodelist/nodelist.c | 16 ++--
src/feature/nodelist/routerlist.c | 4 +-
src/feature/rend/rendservice.c | 6 +-
src/test/test_entrynodes.c | 2 +-
src/test/test_policy.c | 190 ++++++++++++++++++-------------------
16 files changed, 223 insertions(+), 223 deletions(-)
diff --git a/src/app/config/or_options_st.h b/src/app/config/or_options_st.h
index 9d620c7b62..3b84e5e1f2 100644
--- a/src/app/config/or_options_st.h
+++ b/src/app/config/or_options_st.h
@@ -668,7 +668,7 @@ struct or_options_t {
int ClientUseIPv4;
/** If true, clients may connect over IPv6. If false, they will avoid
* connecting over IPv4. We enforce this for OR and Dir connections.
- * Use fascist_firewall_use_ipv6() instead of accessing this value
+ * Use reachable_addr_use_ipv6() instead of accessing this value
* directly. */
int ClientUseIPv6;
/** If true, prefer an IPv6 OR port over an IPv4 one for entry node
@@ -678,7 +678,7 @@ struct or_options_t {
int ClientPreferIPv6ORPort;
/** If true, prefer an IPv6 directory port over an IPv4 one for direct
* directory connections. If auto, bridge clients prefer IPv6, and other
- * clients prefer IPv4. Use fascist_firewall_prefer_ipv6_dirport() instead of
+ * clients prefer IPv4. Use reachable_addr_prefer_ipv6_dirport() instead of
* accessing this value directly. */
int ClientPreferIPv6DirPort;
diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c
index b89a4ae796..a243e9fec4 100644
--- a/src/core/mainloop/connection.c
+++ b/src/core/mainloop/connection.c
@@ -2246,11 +2246,11 @@ connection_connect_log_client_use_ip_version(const connection_t *conn)
return;
}
- const int must_ipv4 = !fascist_firewall_use_ipv6(options);
+ const int must_ipv4 = !reachable_addr_use_ipv6(options);
const int must_ipv6 = (options->ClientUseIPv4 == 0);
const int pref_ipv6 = (conn->type == CONN_TYPE_OR
- ? fascist_firewall_prefer_ipv6_orport(options)
- : fascist_firewall_prefer_ipv6_dirport(options));
+ ? reachable_addr_prefer_ipv6_orport(options)
+ : reachable_addr_prefer_ipv6_dirport(options));
tor_addr_t real_addr;
tor_addr_copy(&real_addr, &conn->addr);
@@ -2275,7 +2275,7 @@ connection_connect_log_client_use_ip_version(const connection_t *conn)
return;
}
- if (fascist_firewall_use_ipv6(options)) {
+ if (reachable_addr_use_ipv6(options)) {
log_info(LD_NET, "Our outgoing connection is using IPv%d.",
tor_addr_family(&real_addr) == AF_INET6 ? 6 : 4);
}
@@ -2285,13 +2285,13 @@ connection_connect_log_client_use_ip_version(const connection_t *conn)
|| (pref_ipv6 && tor_addr_family(&real_addr) == AF_INET)) {
log_info(LD_NET, "Outgoing connection to %s doesn't satisfy "
"ClientPreferIPv6%sPort %d, with ClientUseIPv4 %d, and "
- "fascist_firewall_use_ipv6 %d (ClientUseIPv6 %d and UseBridges "
+ "reachable_addr_use_ipv6 %d (ClientUseIPv6 %d and UseBridges "
"%d).",
fmt_addr(&real_addr),
conn->type == CONN_TYPE_OR ? "OR" : "Dir",
conn->type == CONN_TYPE_OR ? options->ClientPreferIPv6ORPort
: options->ClientPreferIPv6DirPort,
- options->ClientUseIPv4, fascist_firewall_use_ipv6(options),
+ options->ClientUseIPv4, reachable_addr_use_ipv6(options),
options->ClientUseIPv6, options->UseBridges);
}
}
diff --git a/src/core/or/extendinfo.c b/src/core/or/extendinfo.c
index ffc88295cf..22e5b664bb 100644
--- a/src/core/or/extendinfo.c
+++ b/src/core/or/extendinfo.c
@@ -102,7 +102,7 @@ extend_info_from_node(const node_t *node, int for_direct_connect)
/* Choose a preferred address first, but fall back to an allowed address. */
if (for_direct_connect)
- fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, &ap);
+ reachable_addr_choose_from_node(node, FIREWALL_OR_CONNECTION, 0, &ap);
else {
node_get_prim_orport(node, &ap);
}
diff --git a/src/core/or/policies.c b/src/core/or/policies.c
index 020eb0a152..0dc440cc96 100644
--- a/src/core/or/policies.c
+++ b/src/core/or/policies.c
@@ -311,7 +311,7 @@ parse_reachable_addresses(void)
"ReachableAddresses, ReachableORAddresses, or "
"ReachableDirAddresses reject all IPv4 addresses. "
"Tor will not connect using IPv4.");
- } else if (fascist_firewall_use_ipv6(options)
+ } else if (reachable_addr_use_ipv6(options)
&& (policy_is_reject_star(reachable_or_addr_policy, AF_INET6, 0)
|| policy_is_reject_star(reachable_dir_addr_policy, AF_INET6, 0))) {
log_warn(LD_CONFIG, "You have configured tor to use or prefer IPv6 "
@@ -399,12 +399,12 @@ addr_policy_permits_tor_addr(const tor_addr_t *addr, uint16_t port,
* - if ClientUseIPv4 is 0, or
* if pref_only and pref_ipv6 are both true;
* - return false for all IPv6 addresses:
- * - if fascist_firewall_use_ipv6() is 0, or
+ * - if reachable_addr_use_ipv6() is 0, or
* - if pref_only is true and pref_ipv6 is false.
*
* Return false if addr is NULL or tor_addr_is_null(), or if port is 0. */
STATIC int
-fascist_firewall_allows_address(const tor_addr_t *addr,
+reachable_addr_allows(const tor_addr_t *addr,
uint16_t port,
smartlist_t *firewall_policy,
int pref_only, int pref_ipv6)
@@ -427,7 +427,7 @@ fascist_firewall_allows_address(const tor_addr_t *addr,
/* Clients and Servers won't use IPv6 unless it's enabled (and in most
* cases, IPv6 must also be preferred before it will be used). */
if (tor_addr_family(addr) == AF_INET6 &&
- (!fascist_firewall_use_ipv6(options) || (pref_only && !pref_ipv6))) {
+ (!reachable_addr_use_ipv6(options) || (pref_only && !pref_ipv6))) {
return 0;
}
@@ -443,7 +443,7 @@ fascist_firewall_allows_address(const tor_addr_t *addr,
* port: it supports bridge client per-node IPv6 preferences.
*/
int
-fascist_firewall_use_ipv6(const or_options_t *options)
+reachable_addr_use_ipv6(const or_options_t *options)
{
/* Clients use IPv6 if it's set, or they use bridges, or they don't use
* IPv4, or they prefer it.
@@ -458,7 +458,7 @@ fascist_firewall_use_ipv6(const or_options_t *options)
* If we're unsure, return -1, otherwise, return 1 for IPv6 and 0 for IPv4.
*/
static int
-fascist_firewall_prefer_ipv6_impl(const or_options_t *options)
+reachable_addr_prefer_ipv6_impl(const or_options_t *options)
{
/*
Cheap implementation of config options ClientUseIPv4 & ClientUseIPv6 --
@@ -466,7 +466,7 @@ fascist_firewall_prefer_ipv6_impl(const or_options_t *options)
If IPv4 is disabled, use IPv6.
*/
- if (server_mode(options) || !fascist_firewall_use_ipv6(options)) {
+ if (server_mode(options) || !reachable_addr_use_ipv6(options)) {
return 0;
}
@@ -482,9 +482,9 @@ fascist_firewall_prefer_ipv6_impl(const or_options_t *options)
* per-node IPv6 preferences.
*/
int
-fascist_firewall_prefer_ipv6_orport(const or_options_t *options)
+reachable_addr_prefer_ipv6_orport(const or_options_t *options)
{
- int pref_ipv6 = fascist_firewall_prefer_ipv6_impl(options);
+ int pref_ipv6 = reachable_addr_prefer_ipv6_impl(options);
if (pref_ipv6 >= 0) {
return pref_ipv6;
@@ -504,9 +504,9 @@ fascist_firewall_prefer_ipv6_orport(const or_options_t *options)
* preferences. There's no reason to use it instead of this function.)
*/
int
-fascist_firewall_prefer_ipv6_dirport(const or_options_t *options)
+reachable_addr_prefer_ipv6_dirport(const or_options_t *options)
{
- int pref_ipv6 = fascist_firewall_prefer_ipv6_impl(options);
+ int pref_ipv6 = reachable_addr_prefer_ipv6_impl(options);
if (pref_ipv6 >= 0) {
return pref_ipv6;
@@ -528,16 +528,16 @@ fascist_firewall_prefer_ipv6_dirport(const or_options_t *options)
* If pref_only is false, ignore pref_ipv6, and return true if addr is allowed.
*/
int
-fascist_firewall_allows_address_addr(const tor_addr_t *addr, uint16_t port,
+reachable_addr_allows_addr(const tor_addr_t *addr, uint16_t port,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
if (fw_connection == FIREWALL_OR_CONNECTION) {
- return fascist_firewall_allows_address(addr, port,
+ return reachable_addr_allows(addr, port,
reachable_or_addr_policy,
pref_only, pref_ipv6);
} else if (fw_connection == FIREWALL_DIR_CONNECTION) {
- return fascist_firewall_allows_address(addr, port,
+ return reachable_addr_allows(addr, port,
reachable_dir_addr_policy,
pref_only, pref_ipv6);
} else {
@@ -550,15 +550,15 @@ fascist_firewall_allows_address_addr(const tor_addr_t *addr, uint16_t port,
/** Return true iff we think our firewall will let us make a connection to
* addr:port (ap). Uses ReachableORAddresses or ReachableDirAddresses based on
* fw_connection.
- * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr().
+ * pref_only and pref_ipv6 work as in reachable_addr_allows_addr().
*/
static int
-fascist_firewall_allows_address_ap(const tor_addr_port_t *ap,
+reachable_addr_allows_ap(const tor_addr_port_t *ap,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
tor_assert(ap);
- return fascist_firewall_allows_address_addr(&ap->addr, ap->port,
+ return reachable_addr_allows_addr(&ap->addr, ap->port,
fw_connection, pref_only,
pref_ipv6);
}
@@ -567,17 +567,17 @@ fascist_firewall_allows_address_ap(const tor_addr_port_t *ap,
* ipv4h_addr/ipv6_addr. Uses ipv4_orport/ipv6_orport/ReachableORAddresses or
* ipv4_dirport/ipv6_dirport/ReachableDirAddresses based on IPv4/IPv6 and
* <b>fw_connection</b>.
- * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr().
+ * pref_only and pref_ipv6 work as in reachable_addr_allows_addr().
*/
static int
-fascist_firewall_allows_base(const tor_addr_t *ipv4_addr, uint16_t ipv4_orport,
+reachable_addr_allows_base(const tor_addr_t *ipv4_addr, uint16_t ipv4_orport,
uint16_t ipv4_dirport,
const tor_addr_t *ipv6_addr, uint16_t ipv6_orport,
uint16_t ipv6_dirport,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
- if (fascist_firewall_allows_address_addr(ipv4_addr,
+ if (reachable_addr_allows_addr(ipv4_addr,
(fw_connection == FIREWALL_OR_CONNECTION
? ipv4_orport
: ipv4_dirport),
@@ -586,7 +586,7 @@ fascist_firewall_allows_base(const tor_addr_t *ipv4_addr, uint16_t ipv4_orport,
return 1;
}
- if (fascist_firewall_allows_address_addr(ipv6_addr,
+ if (reachable_addr_allows_addr(ipv6_addr,
(fw_connection == FIREWALL_OR_CONNECTION
? ipv6_orport
: ipv6_dirport),
@@ -598,9 +598,9 @@ fascist_firewall_allows_base(const tor_addr_t *ipv4_addr, uint16_t ipv4_orport,
return 0;
}
-/** Like fascist_firewall_allows_base(), but takes ri. */
+/** Like reachable_addr_allows_base(), but takes ri. */
static int
-fascist_firewall_allows_ri_impl(const routerinfo_t *ri,
+reachable_addr_allows_ri_impl(const routerinfo_t *ri,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
@@ -609,15 +609,15 @@ fascist_firewall_allows_ri_impl(const routerinfo_t *ri,
}
/* Assume IPv4 and IPv6 DirPorts are the same */
- return fascist_firewall_allows_base(&ri->ipv4_addr, ri->ipv4_orport,
+ return reachable_addr_allows_base(&ri->ipv4_addr, ri->ipv4_orport,
ri->ipv4_dirport, &ri->ipv6_addr,
ri->ipv6_orport, ri->ipv4_dirport,
fw_connection, pref_only, pref_ipv6);
}
-/** Like fascist_firewall_allows_rs, but takes pref_ipv6. */
+/** Like reachable_addr_allows_rs, but takes pref_ipv6. */
static int
-fascist_firewall_allows_rs_impl(const routerstatus_t *rs,
+reachable_addr_allows_rs_impl(const routerstatus_t *rs,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
@@ -626,20 +626,20 @@ fascist_firewall_allows_rs_impl(const routerstatus_t *rs,
}
/* Assume IPv4 and IPv6 DirPorts are the same */
- return fascist_firewall_allows_base(&rs->ipv4_addr, rs->ipv4_orport,
+ return reachable_addr_allows_base(&rs->ipv4_addr, rs->ipv4_orport,
rs->ipv4_dirport, &rs->ipv6_addr,
rs->ipv6_orport, rs->ipv4_dirport,
fw_connection, pref_only, pref_ipv6);
}
-/** Like fascist_firewall_allows_base(), but takes rs.
+/** Like reachable_addr_allows_base(), but takes rs.
* When rs is a fake_status from a dir_server_t, it can have a reachable
* address, even when the corresponding node does not.
* nodes can be missing addresses when there's no consensus (IPv4 and IPv6),
* or when there is a microdescriptor consensus, but no microdescriptors
* (microdescriptors have IPv6, the microdesc consensus does not). */
int
-fascist_firewall_allows_rs(const routerstatus_t *rs,
+reachable_addr_allows_rs(const routerstatus_t *rs,
firewall_connection_t fw_connection, int pref_only)
{
if (!rs) {
@@ -650,20 +650,20 @@ fascist_firewall_allows_rs(const routerstatus_t *rs,
* generic IPv6 preference instead. */
const or_options_t *options = get_options();
int pref_ipv6 = (fw_connection == FIREWALL_OR_CONNECTION
- ? fascist_firewall_prefer_ipv6_orport(options)
- : fascist_firewall_prefer_ipv6_dirport(options));
+ ? reachable_addr_prefer_ipv6_orport(options)
+ : reachable_addr_prefer_ipv6_dirport(options));
- return fascist_firewall_allows_rs_impl(rs, fw_connection, pref_only,
+ return reachable_addr_allows_rs_impl(rs, fw_connection, pref_only,
pref_ipv6);
}
/** Return true iff we think our firewall will let us make a connection to
* ipv6_addr:ipv6_orport based on ReachableORAddresses.
* If <b>fw_connection</b> is FIREWALL_DIR_CONNECTION, returns 0.
- * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr().
+ * pref_only and pref_ipv6 work as in reachable_addr_allows_addr().
*/
static int
-fascist_firewall_allows_md_impl(const microdesc_t *md,
+reachable_addr_allows_md_impl(const microdesc_t *md,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
@@ -677,15 +677,15 @@ fascist_firewall_allows_md_impl(const microdesc_t *md,
}
/* Also can't check IPv4, doesn't have that either */
- return fascist_firewall_allows_address_addr(&md->ipv6_addr, md->ipv6_orport,
+ return reachable_addr_allows_addr(&md->ipv6_addr, md->ipv6_orport,
fw_connection, pref_only,
pref_ipv6);
}
-/** Like fascist_firewall_allows_base(), but takes node, and looks up pref_ipv6
+/** Like reachable_addr_allows_base(), but takes node, and looks up pref_ipv6
* from node_ipv6_or/dir_preferred(). */
int
-fascist_firewall_allows_node(const node_t *node,
+reachable_addr_allows_node(const node_t *node,
firewall_connection_t fw_connection,
int pref_only)
{
@@ -701,15 +701,15 @@ fascist_firewall_allows_node(const node_t *node,
/* Sometimes, the rs is missing the IPv6 address info, and we need to go
* all the way to the md */
- if (node->ri && fascist_firewall_allows_ri_impl(node->ri, fw_connection,
+ if (node->ri && reachable_addr_allows_ri_impl(node->ri, fw_connection,
pref_only, pref_ipv6)) {
return 1;
- } else if (node->rs && fascist_firewall_allows_rs_impl(node->rs,
+ } else if (node->rs && reachable_addr_allows_rs_impl(node->rs,
fw_connection,
pref_only,
pref_ipv6)) {
return 1;
- } else if (node->md && fascist_firewall_allows_md_impl(node->md,
+ } else if (node->md && reachable_addr_allows_md_impl(node->md,
fw_connection,
pref_only,
pref_ipv6)) {
@@ -721,9 +721,9 @@ fascist_firewall_allows_node(const node_t *node,
}
}
-/** Like fascist_firewall_allows_rs(), but takes ds. */
+/** Like reachable_addr_allows_rs(), but takes ds. */
int
-fascist_firewall_allows_dir_server(const dir_server_t *ds,
+reachable_addr_allows_dir_server(const dir_server_t *ds,
firewall_connection_t fw_connection,
int pref_only)
{
@@ -734,8 +734,8 @@ fascist_firewall_allows_dir_server(const dir_server_t *ds,
/* A dir_server_t always has a fake_status. As long as it has the same
* addresses/ports in both fake_status and dir_server_t, this works fine.
* (See #17867.)
- * fascist_firewall_allows_rs only checks the addresses in fake_status. */
- return fascist_firewall_allows_rs(&ds->fake_status, fw_connection,
+ * reachable_addr_allows_rs only checks the addresses in fake_status. */
+ return reachable_addr_allows_rs(&ds->fake_status, fw_connection,
pref_only);
}
@@ -743,10 +743,10 @@ fascist_firewall_allows_dir_server(const dir_server_t *ds,
* choose one based on want_a and return it.
* Otherwise, return whichever is allowed.
* Otherwise, return NULL.
- * pref_only and pref_ipv6 work as in fascist_firewall_allows_address_addr().
+ * pref_only and pref_ipv6 work as in reachable_addr_allows_addr().
*/
static const tor_addr_port_t *
-fascist_firewall_choose_address_impl(const tor_addr_port_t *a,
+reachable_addr_choose_impl(const tor_addr_port_t *a,
const tor_addr_port_t *b,
int want_a,
firewall_connection_t fw_connection,
@@ -755,12 +755,12 @@ fascist_firewall_choose_address_impl(const tor_addr_port_t *a,
const tor_addr_port_t *use_a = NULL;
const tor_addr_port_t *use_b = NULL;
- if (fascist_firewall_allows_address_ap(a, fw_connection, pref_only,
+ if (reachable_addr_allows_ap(a, fw_connection, pref_only,
pref_ipv6)) {
use_a = a;
}
- if (fascist_firewall_allows_address_ap(b, fw_connection, pref_only,
+ if (reachable_addr_allows_ap(b, fw_connection, pref_only,
pref_ipv6)) {
use_b = b;
}
@@ -784,13 +784,13 @@ fascist_firewall_choose_address_impl(const tor_addr_port_t *a,
* - Otherwise, return whichever is preferred.
* Otherwise, return NULL. */
STATIC const tor_addr_port_t *
-fascist_firewall_choose_address(const tor_addr_port_t *a,
+reachable_addr_choose(const tor_addr_port_t *a,
const tor_addr_port_t *b,
int want_a,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6)
{
- const tor_addr_port_t *pref = fascist_firewall_choose_address_impl(
+ const tor_addr_port_t *pref = reachable_addr_choose_impl(
a, b, want_a,
fw_connection,
1, pref_ipv6);
@@ -802,7 +802,7 @@ fascist_firewall_choose_address(const tor_addr_port_t *a,
} else {
/* If there's no preferred address, and we can return addresses that are
* not preferred, use an address that's allowed */
- return fascist_firewall_choose_address_impl(a, b, want_a, fw_connection,
+ return reachable_addr_choose_impl(a, b, want_a, fw_connection,
0, pref_ipv6);
}
}
@@ -817,7 +817,7 @@ fascist_firewall_choose_address(const tor_addr_port_t *a,
* If both addresses could be chosen (they are both preferred or both allowed)
* choose IPv6 if pref_ipv6 is true, otherwise choose IPv4. */
static void
-fascist_firewall_choose_address_base(const tor_addr_t *ipv4_addr,
+reachable_addr_choose_base(const tor_addr_t *ipv4_addr,
uint16_t ipv4_orport,
uint16_t ipv4_dirport,
const tor_addr_t *ipv6_addr,
@@ -849,7 +849,7 @@ fascist_firewall_choose_address_base(const tor_addr_t *ipv4_addr,
? ipv6_orport
: ipv6_dirport);
- result = fascist_firewall_choose_address(&ipv4_ap, &ipv6_ap,
+ result = reachable_addr_choose(&ipv4_ap, &ipv6_ap,
want_ipv4,
fw_connection, pref_only,
pref_ipv6);
@@ -860,13 +860,13 @@ fascist_firewall_choose_address_base(const tor_addr_t *ipv4_addr,
}
}
-/** Like fascist_firewall_choose_address_base(), but takes <b>rs</b>.
+/** Like reachable_addr_choose_base(), but takes <b>rs</b>.
* Consults the corresponding node, then falls back to rs if node is NULL.
* This should only happen when there's no valid consensus, and rs doesn't
* correspond to a bridge client's bridge.
*/
void
-fascist_firewall_choose_address_rs(const routerstatus_t *rs,
+reachable_addr_choose_from_rs(const routerstatus_t *rs,
firewall_connection_t fw_connection,
int pref_only, tor_addr_port_t* ap)
{
@@ -883,15 +883,15 @@ fascist_firewall_choose_address_rs(const routerstatus_t *rs,
const node_t *node = node_get_by_id(rs->identity_digest);
if (node) {
- fascist_firewall_choose_address_node(node, fw_connection, pref_only, ap);
+ reachable_addr_choose_from_node(node, fw_connection, pref_only, ap);
} else {
/* There's no node-specific IPv6 preference, so use the generic IPv6
* preference instead. */
int pref_ipv6 = (fw_connection == FIREWALL_OR_CONNECTION
- ? fascist_firewall_prefer_ipv6_orport(options)
- : fascist_firewall_prefer_ipv6_dirport(options));
+ ? reachable_addr_prefer_ipv6_orport(options)
+ : reachable_addr_prefer_ipv6_dirport(options));
- fascist_firewall_choose_address_base(&rs->ipv4_addr, rs->ipv4_orport,
+ reachable_addr_choose_base(&rs->ipv4_addr, rs->ipv4_orport,
rs->ipv4_dirport, &rs->ipv6_addr,
rs->ipv6_orport, rs->ipv4_dirport,
fw_connection, pref_only, pref_ipv6,
@@ -899,13 +899,13 @@ fascist_firewall_choose_address_rs(const routerstatus_t *rs,
}
}
-/** Like fascist_firewall_choose_address_base(), but takes in a smartlist
+/** Like reachable_addr_choose_base(), but takes in a smartlist
* <b>lspecs</b> consisting of one or more link specifiers. We assume
* fw_connection is FIREWALL_OR_CONNECTION as link specifiers cannot
* contain DirPorts.
*/
void
-fascist_firewall_choose_address_ls(const smartlist_t *lspecs,
+reachable_addr_choose_from_ls(const smartlist_t *lspecs,
int pref_only, tor_addr_port_t* ap)
{
int have_v4 = 0, have_v6 = 0;
@@ -967,20 +967,20 @@ fascist_firewall_choose_address_ls(const smartlist_t *lspecs,
/* Here, don't check for DirPorts as link specifiers are only used for
* ORPorts. */
const or_options_t *options = get_options();
- int pref_ipv6 = fascist_firewall_prefer_ipv6_orport(options);
+ int pref_ipv6 = reachable_addr_prefer_ipv6_orport(options);
/* Assume that the DirPorts are zero as link specifiers only use ORPorts. */
- fascist_firewall_choose_address_base(&addr_v4, port_v4, 0,
+ reachable_addr_choose_base(&addr_v4, port_v4, 0,
&addr_v6, port_v6, 0,
FIREWALL_OR_CONNECTION,
pref_only, pref_ipv6,
ap);
}
-/** Like fascist_firewall_choose_address_base(), but takes <b>node</b>, and
+/** Like reachable_addr_choose_base(), but takes <b>node</b>, and
* looks up the node's IPv6 preference rather than taking an argument
* for pref_ipv6. */
void
-fascist_firewall_choose_address_node(const node_t *node,
+reachable_addr_choose_from_node(const node_t *node,
firewall_connection_t fw_connection,
int pref_only, tor_addr_port_t *ap)
{
@@ -1010,16 +1010,16 @@ fascist_firewall_choose_address_node(const node_t *node,
node_get_pref_ipv6_dirport(node, &ipv6_dir_ap);
/* Assume the IPv6 OR and Dir addresses are the same. */
- fascist_firewall_choose_address_base(&ipv4_or_ap.addr, ipv4_or_ap.port,
+ reachable_addr_choose_base(&ipv4_or_ap.addr, ipv4_or_ap.port,
ipv4_dir_ap.port, &ipv6_or_ap.addr,
ipv6_or_ap.port, ipv6_dir_ap.port,
fw_connection, pref_only,
pref_ipv6_node, ap);
}
-/** Like fascist_firewall_choose_address_rs(), but takes <b>ds</b>. */
+/** Like reachable_addr_choose_from_rs(), but takes <b>ds</b>. */
void
-fascist_firewall_choose_address_dir_server(const dir_server_t *ds,
+reachable_addr_choose_from_dir_server(const dir_server_t *ds,
firewall_connection_t fw_connection,
int pref_only,
tor_addr_port_t *ap)
@@ -1036,9 +1036,9 @@ fascist_firewall_choose_address_dir_server(const dir_server_t *ds,
/* A dir_server_t always has a fake_status. As long as it has the same
* addresses/ports in both fake_status and dir_server_t, this works fine.
* (See #17867.)
- * This function relies on fascist_firewall_choose_address_rs looking up the
+ * This function relies on reachable_addr_choose_from_rs looking up the
* node if it can, because that will get the latest info for the relay. */
- fascist_firewall_choose_address_rs(&ds->fake_status, fw_connection,
+ reachable_addr_choose_from_rs(&ds->fake_status, fw_connection,
pref_only, ap);
}
diff --git a/src/core/or/policies.h b/src/core/or/policies.h
index 1ac6f87dcf..c8502a5516 100644
--- a/src/core/or/policies.h
+++ b/src/core/or/policies.h
@@ -69,34 +69,34 @@ typedef struct short_policy_t {
int firewall_is_fascist_or(void);
int firewall_is_fascist_dir(void);
-int fascist_firewall_use_ipv6(const or_options_t *options);
-int fascist_firewall_prefer_ipv6_orport(const or_options_t *options);
-int fascist_firewall_prefer_ipv6_dirport(const or_options_t *options);
+int reachable_addr_use_ipv6(const or_options_t *options);
+int reachable_addr_prefer_ipv6_orport(const or_options_t *options);
+int reachable_addr_prefer_ipv6_dirport(const or_options_t *options);
-int fascist_firewall_allows_address_addr(const tor_addr_t *addr,
+int reachable_addr_allows_addr(const tor_addr_t *addr,
uint16_t port,
firewall_connection_t fw_connection,
int pref_only, int pref_ipv6);
-int fascist_firewall_allows_rs(const routerstatus_t *rs,
+int reachable_addr_allows_rs(const routerstatus_t *rs,
firewall_connection_t fw_connection,
int pref_only);
-int fascist_firewall_allows_node(const node_t *node,
+int reachable_addr_allows_node(const node_t *node,
firewall_connection_t fw_connection,
int pref_only);
-int fascist_firewall_allows_dir_server(const dir_server_t *ds,
+int reachable_addr_allows_dir_server(const dir_server_t *ds,
firewall_connection_t fw_connection,
int pref_only);
-void fascist_firewall_choose_address_rs(const routerstatus_t *rs,
+void reachable_addr_choose_from_rs(const routerstatus_t *rs,
firewall_connection_t fw_connection,
int pref_only, tor_addr_port_t* ap);
-void fascist_firewall_choose_address_ls(const smartlist_t *lspecs,
+void reachable_addr_choose_from_ls(const smartlist_t *lspecs,
int pref_only, tor_addr_port_t* ap);
-void fascist_firewall_choose_address_node(const node_t *node,
+void reachable_addr_choose_from_node(const node_t *node,
firewall_connection_t fw_connection,
int pref_only, tor_addr_port_t* ap);
-void fascist_firewall_choose_address_dir_server(const dir_server_t *ds,
+void reachable_addr_choose_from_dir_server(const dir_server_t *ds,
firewall_connection_t fw_connection,
int pref_only, tor_addr_port_t* ap);
@@ -173,11 +173,11 @@ addr_policy_result_t compare_tor_addr_to_short_policy(
#ifdef POLICIES_PRIVATE
STATIC void append_exit_policy_string(smartlist_t **policy, const char *more);
-STATIC int fascist_firewall_allows_address(const tor_addr_t *addr,
+STATIC int reachable_addr_allows(const tor_addr_t *addr,
uint16_t port,
smartlist_t *firewall_policy,
int pref_only, int pref_ipv6);
-STATIC const tor_addr_port_t * fascist_firewall_choose_address(
+STATIC const tor_addr_port_t * reachable_addr_choose(
const tor_addr_port_t *a,
const tor_addr_port_t *b,
int want_a,
diff --git a/src/feature/client/bridges.c b/src/feature/client/bridges.c
index 6892c4a25f..cc17e8fa67 100644
--- a/src/feature/client/bridges.c
+++ b/src/feature/client/bridges.c
@@ -654,7 +654,7 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
/* Until we get a descriptor for the bridge, we only know one address for
* it. */
- if (!fascist_firewall_allows_address_addr(&bridge->addr, bridge->port,
+ if (!reachable_addr_allows_addr(&bridge->addr, bridge->port,
FIREWALL_OR_CONNECTION, 0, 0)) {
log_notice(LD_CONFIG, "Tried to fetch a descriptor directly from a "
"bridge, but that bridge is not reachable through our "
@@ -746,7 +746,7 @@ fetch_bridge_descriptors(const or_options_t *options, time_t now)
!options->UpdateBridgesFromAuthority, !num_bridge_auths);
if (ask_bridge_directly &&
- !fascist_firewall_allows_address_addr(&bridge->addr, bridge->port,
+ !reachable_addr_allows_addr(&bridge->addr, bridge->port,
FIREWALL_OR_CONNECTION, 0,
0)) {
log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our "
@@ -832,7 +832,7 @@ rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
!tor_addr_is_null(&node->ri->ipv6_addr));
} else {
/* Mark which address to use based on user preference */
- node->ipv6_preferred = (fascist_firewall_prefer_ipv6_orport(options) &&
+ node->ipv6_preferred = (reachable_addr_prefer_ipv6_orport(options) &&
!tor_addr_is_null(&node->ri->ipv6_addr));
}
@@ -889,7 +889,7 @@ rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
!tor_addr_is_null(&node->rs->ipv6_addr));
} else {
/* Mark which address to use based on user preference */
- node->ipv6_preferred = (fascist_firewall_prefer_ipv6_orport(options) &&
+ node->ipv6_preferred = (reachable_addr_prefer_ipv6_orport(options) &&
!tor_addr_is_null(&node->rs->ipv6_addr));
}
diff --git a/src/feature/client/entrynodes.c b/src/feature/client/entrynodes.c
index 9b20684bf7..c51958acec 100644
--- a/src/feature/client/entrynodes.c
+++ b/src/feature/client/entrynodes.c
@@ -1466,7 +1466,7 @@ node_passes_guard_filter(const or_options_t *options,
!routerset_contains_node(options->EntryNodes, node))
return 0;
- if (!fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, 0))
+ if (!reachable_addr_allows_node(node, FIREWALL_OR_CONNECTION, 0))
return 0;
if (node_is_a_configured_bridge(node))
@@ -1492,7 +1492,7 @@ bridge_passes_guard_filter(const or_options_t *options,
/* Ignore entrynodes */
const tor_addr_port_t *addrport = bridge_get_addr_port(bridge);
- if (!fascist_firewall_allows_address_addr(&addrport->addr,
+ if (!reachable_addr_allows_addr(&addrport->addr,
addrport->port,
FIREWALL_OR_CONNECTION,
0, 0))
diff --git a/src/feature/dirclient/dirclient.c b/src/feature/dirclient/dirclient.c
index 337fa4c965..f088ef8283 100644
--- a/src/feature/dirclient/dirclient.c
+++ b/src/feature/dirclient/dirclient.c
@@ -284,10 +284,10 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
}
if (purpose_needs_anonymity(dir_purpose, router_purpose, NULL)) {
indirection = DIRIND_ANONYMOUS;
- } else if (!fascist_firewall_allows_dir_server(ds,
+ } else if (!reachable_addr_allows_dir_server(ds,
FIREWALL_DIR_CONNECTION,
0)) {
- if (fascist_firewall_allows_dir_server(ds, FIREWALL_OR_CONNECTION, 0))
+ if (reachable_addr_allows_dir_server(ds, FIREWALL_OR_CONNECTION, 0))
indirection = DIRIND_ONEHOP;
else
indirection = DIRIND_ANONYMOUS;
@@ -487,7 +487,7 @@ directory_get_from_dirserver,(
tor_addr_port_t or_ap;
directory_request_t *req = directory_request_new(dir_purpose);
/* we are willing to use a non-preferred address if we need to */
- fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0,
+ reachable_addr_choose_from_node(node, FIREWALL_OR_CONNECTION, 0,
&or_ap);
directory_request_set_or_addr_port(req, &or_ap);
directory_request_set_directory_id_digest(req,
@@ -666,7 +666,7 @@ directory_choose_address_routerstatus(const routerstatus_t *status,
* Use the preferred address and port if they are reachable, otherwise,
* use the alternate address and port (if any).
*/
- fascist_firewall_choose_address_rs(status, FIREWALL_OR_CONNECTION, 0,
+ reachable_addr_choose_from_rs(status, FIREWALL_OR_CONNECTION, 0,
use_or_ap);
have_or = tor_addr_port_is_valid_ap(use_or_ap, 0);
}
@@ -677,7 +677,7 @@ directory_choose_address_routerstatus(const routerstatus_t *status,
indirection == DIRIND_ANON_DIRPORT ||
(indirection == DIRIND_ONEHOP
&& !dirclient_must_use_begindir(options))) {
- fascist_firewall_choose_address_rs(status, FIREWALL_DIR_CONNECTION, 0,
+ reachable_addr_choose_from_rs(status, FIREWALL_DIR_CONNECTION, 0,
use_dir_ap);
have_dir = tor_addr_port_is_valid_ap(use_dir_ap, 0);
}
@@ -921,7 +921,7 @@ directory_command_should_use_begindir(const or_options_t *options,
}
if (indirection == DIRIND_ONEHOP) {
/* We're firewalled and want a direct OR connection */
- if (!fascist_firewall_allows_address_addr(or_addr, or_port,
+ if (!reachable_addr_allows_addr(or_addr, or_port,
FIREWALL_OR_CONNECTION, 0, 0)) {
*reason = "ORPort not reachable";
return 0;
diff --git a/src/feature/hs/hs_common.c b/src/feature/hs/hs_common.c
index 706b42529f..cbcb672140 100644
--- a/src/feature/hs/hs_common.c
+++ b/src/feature/hs/hs_common.c
@@ -1744,7 +1744,7 @@ hs_get_extend_info_from_lspecs(const smartlist_t *lspecs,
switch (link_specifier_get_ls_type(ls)) {
case LS_IPV4:
/* Skip if we already seen a v4. If direct_conn is true, we skip this
- * block because fascist_firewall_choose_address_ls() will set ap. If
+ * block because reachable_addr_choose_from_ls() will set ap. If
* direct_conn is false, set ap to the first IPv4 address and port in
* the link specifiers.*/
if (have_v4 || direct_conn) continue;
@@ -1776,7 +1776,7 @@ hs_get_extend_info_from_lspecs(const smartlist_t *lspecs,
/* Choose a preferred address first, but fall back to an allowed address. */
if (direct_conn)
- fascist_firewall_choose_address_ls(lspecs, 0, &ap);
+ reachable_addr_choose_from_ls(lspecs, 0, &ap);
/* Legacy ID is mandatory, and we require an IP address. */
if (!tor_addr_port_is_valid_ap(&ap, 0)) {
diff --git a/src/feature/nodelist/authcert.c b/src/feature/nodelist/authcert.c
index 26713d7149..c5b31be9e3 100644
--- a/src/feature/nodelist/authcert.c
+++ b/src/feature/nodelist/authcert.c
@@ -808,7 +808,7 @@ authority_certs_fetch_resource_impl(const char *resource,
/* clients always make OR connections to bridges */
tor_addr_port_t or_ap;
/* we are willing to use a non-preferred address if we need to */
- fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0,
+ reachable_addr_choose_from_node(node, FIREWALL_OR_CONNECTION, 0,
&or_ap);
req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE);
diff --git a/src/feature/nodelist/node_select.c b/src/feature/nodelist/node_select.c
index a7c02f64d8..ecb70aef14 100644
--- a/src/feature/nodelist/node_select.c
+++ b/src/feature/nodelist/node_select.c
@@ -141,7 +141,7 @@ router_pick_dirserver_generic(smartlist_t *sourcelist,
#define RETRY_ALTERNATE_IP_VERSION(retry_label) \
STMT_BEGIN \
if (result == NULL && try_ip_pref && options->ClientUseIPv4 \
- && fascist_firewall_use_ipv6(options) && !server_mode(options) \
+ && reachable_addr_use_ipv6(options) && !server_mode(options) \
&& !n_busy) { \
n_excluded = 0; \
n_busy = 0; \
@@ -212,8 +212,8 @@ router_picked_poor_directory_log(const routerstatus_t *rs)
log_debug(LD_DIR, "Wanted to make an outgoing directory connection, but "
"we couldn't find a directory that fit our criteria. "
"Perhaps we will succeed next time with less strict criteria.");
- } else if (!fascist_firewall_allows_rs(rs, FIREWALL_OR_CONNECTION, 1)
- && !fascist_firewall_allows_rs(rs, FIREWALL_DIR_CONNECTION, 1)
+ } else if (!reachable_addr_allows_rs(rs, FIREWALL_OR_CONNECTION, 1)
+ && !reachable_addr_allows_rs(rs, FIREWALL_DIR_CONNECTION, 1)
) {
/* This is rare, and might be interesting to users trying to diagnose
* connection issues on dual-stack machines. */
@@ -374,12 +374,12 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags,
* we try routers that only have one address both times.)
*/
if (!fascistfirewall || skip_or_fw ||
- fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION,
+ reachable_addr_allows_node(node, FIREWALL_OR_CONNECTION,
try_ip_pref))
smartlist_add(is_trusted ? trusted_tunnel :
is_overloaded ? overloaded_tunnel : tunnel, (void*)node);
else if (!must_have_or && (skip_dir_fw ||
- fascist_firewall_allows_node(node, FIREWALL_DIR_CONNECTION,
+ reachable_addr_allows_node(node, FIREWALL_DIR_CONNECTION,
try_ip_pref)))
smartlist_add(is_trusted ? trusted_direct :
is_overloaded ? overloaded_direct : direct, (void*)node);
@@ -1162,11 +1162,11 @@ router_pick_trusteddirserver_impl(const smartlist_t *sourcelist,
* we try routers that only have one address both times.)
*/
if (!fascistfirewall || skip_or_fw ||
- fascist_firewall_allows_dir_server(d, FIREWALL_OR_CONNECTION,
+ reachable_addr_allows_dir_server(d, FIREWALL_OR_CONNECTION,
try_ip_pref))
smartlist_add(is_overloaded ? overloaded_tunnel : tunnel, (void*)d);
else if (!must_have_or && (skip_dir_fw ||
- fascist_firewall_allows_dir_server(d, FIREWALL_DIR_CONNECTION,
+ reachable_addr_allows_dir_server(d, FIREWALL_DIR_CONNECTION,
try_ip_pref)))
smartlist_add(is_overloaded ? overloaded_direct : direct, (void*)d);
}
diff --git a/src/feature/nodelist/nodelist.c b/src/feature/nodelist/nodelist.c
index c30684d2d8..7edc1fc51c 100644
--- a/src/feature/nodelist/nodelist.c
+++ b/src/feature/nodelist/nodelist.c
@@ -666,7 +666,7 @@ nodelist_set_consensus(const networkstatus_t *ns)
node->is_bad_exit = rs->is_bad_exit;
node->is_hs_dir = rs->is_hs_dir;
node->ipv6_preferred = 0;
- if (fascist_firewall_prefer_ipv6_orport(options) &&
+ if (reachable_addr_prefer_ipv6_orport(options) &&
(tor_addr_is_null(&rs->ipv6_addr) == 0 ||
(node->md && tor_addr_is_null(&node->md->ipv6_addr) == 0)))
node->ipv6_preferred = 1;
@@ -1704,7 +1704,7 @@ node_has_ipv6_dirport(const node_t *node)
* ii) the router has no IPv4 OR address.
*
* If you don't have a node, consider looking it up.
- * If there is no node, use fascist_firewall_prefer_ipv6_orport().
+ * If there is no node, use reachable_addr_prefer_ipv6_orport().
*/
int
node_ipv6_or_preferred(const node_t *node)
@@ -1714,10 +1714,10 @@ node_ipv6_or_preferred(const node_t *node)
node_assert_ok(node);
/* XX/teor - node->ipv6_preferred is set from
- * fascist_firewall_prefer_ipv6_orport() each time the consensus is loaded.
+ * reachable_addr_prefer_ipv6_orport() each time the consensus is loaded.
*/
node_get_prim_orport(node, &ipv4_addr);
- if (!fascist_firewall_use_ipv6(options)) {
+ if (!reachable_addr_use_ipv6(options)) {
return 0;
} else if (node->ipv6_preferred ||
!tor_addr_port_is_valid_ap(&ipv4_addr, 0)) {
@@ -1812,7 +1812,7 @@ node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out)
* or
* ii) our preference is for IPv6 Dir addresses.
*
- * If there is no node, use fascist_firewall_prefer_ipv6_dirport().
+ * If there is no node, use reachable_addr_prefer_ipv6_dirport().
*/
int
node_ipv6_dir_preferred(const node_t *node)
@@ -1821,15 +1821,15 @@ node_ipv6_dir_preferred(const node_t *node)
tor_addr_port_t ipv4_addr;
node_assert_ok(node);
- /* node->ipv6_preferred is set from fascist_firewall_prefer_ipv6_orport(),
+ /* node->ipv6_preferred is set from reachable_addr_prefer_ipv6_orport(),
* so we can't use it to determine DirPort IPv6 preference.
* This means that bridge clients will use IPv4 DirPorts by default.
*/
node_get_prim_dirport(node, &ipv4_addr);
- if (!fascist_firewall_use_ipv6(options)) {
+ if (!reachable_addr_use_ipv6(options)) {
return 0;
} else if (!tor_addr_port_is_valid_ap(&ipv4_addr, 0)
- || fascist_firewall_prefer_ipv6_dirport(get_options())) {
+ || reachable_addr_prefer_ipv6_dirport(get_options())) {
return node_has_ipv6_dirport(node);
}
return 0;
diff --git a/src/feature/nodelist/routerlist.c b/src/feature/nodelist/routerlist.c
index 72824f2dd2..9def90d8d5 100644
--- a/src/feature/nodelist/routerlist.c
+++ b/src/feature/nodelist/routerlist.c
@@ -539,7 +539,7 @@ routers_have_same_or_addrs(const routerinfo_t *r1, const routerinfo_t *r2)
* - <b>CRN_DIRECT_CONN</b>: is suitable for direct connections. Checks
* for the relevant descriptors. Checks the address
* against ReachableAddresses, ClientUseIPv4 0, and
- * fascist_firewall_use_ipv6() == 0);
+ * reachable_addr_use_ipv6() == 0);
* - <b>CRN_PREF_ADDR</b>: if we are connecting directly to the node, it has
* an address that is preferred by the
* ClientPreferIPv6ORPort setting;
@@ -594,7 +594,7 @@ router_can_choose_node(const node_t *node, int flags)
return false;
/* Choose a node with an OR address that matches the firewall rules */
if (direct_conn && check_reach &&
- !fascist_firewall_allows_node(node,
+ !reachable_addr_allows_node(node,
FIREWALL_OR_CONNECTION,
pref_addr))
return false;
diff --git a/src/feature/rend/rendservice.c b/src/feature/rend/rendservice.c
index 8e1a22fb39..68dd8f4f4a 100644
--- a/src/feature/rend/rendservice.c
+++ b/src/feature/rend/rendservice.c
@@ -1849,13 +1849,13 @@ rend_service_use_direct_connection(const or_options_t* options,
const extend_info_t* ei)
{
/* We'll connect directly all reachable addresses, whether preferred or not.
- * The prefer_ipv6 argument to fascist_firewall_allows_address_addr is
+ * The prefer_ipv6 argument to reachable_addr_allows_addr is
* ignored, because pref_only is 0. */
const tor_addr_port_t *ap = extend_info_get_orport(ei, AF_INET);
if (!ap)
return 0;
return (rend_service_allow_non_anonymous_connection(options) &&
- fascist_firewall_allows_address_addr(&ap->addr, ap->port,
+ reachable_addr_allows_addr(&ap->addr, ap->port,
FIREWALL_OR_CONNECTION, 0, 0));
}
@@ -1867,7 +1867,7 @@ rend_service_use_direct_connection_node(const or_options_t* options,
/* We'll connect directly all reachable addresses, whether preferred or not.
*/
return (rend_service_allow_non_anonymous_connection(options) &&
- fascist_firewall_allows_node(node, FIREWALL_OR_CONNECTION, 0));
+ reachable_addr_allows_node(node, FIREWALL_OR_CONNECTION, 0));
}
/******
diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c
index 7da7ea66e4..589876db2a 100644
--- a/src/test/test_entrynodes.c
+++ b/src/test/test_entrynodes.c
@@ -322,7 +322,7 @@ test_node_preferred_orport(void *arg)
* ClientUseIPv4 is 0 */
mocked_options->ClientUseIPv4 = 0;
mocked_options->ClientUseIPv6 = 1;
- node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(mocked_options);
+ node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(mocked_options);
node_get_pref_orport(&node, &ap);
tt_assert(tor_addr_eq(&ap.addr, &ipv6_addr));
tt_assert(ap.port == ipv6_port);
diff --git a/src/test/test_policy.c b/src/test/test_policy.c
index 3559c0dda8..0a0548d161 100644
--- a/src/test/test_policy.c
+++ b/src/test/test_policy.c
@@ -1753,7 +1753,7 @@ test_policies_getinfo_helper_policies(void *arg)
#define OTHER_IPV4_ADDR_STR "6.7.8.9"
#define OTHER_IPV6_ADDR_STR "[afff::]"
-/** Run unit tests for fascist_firewall_allows_address */
+/** Run unit tests for reachable_addr_allows */
static void
test_policies_fascist_firewall_allows_address(void *arg)
{
@@ -1822,33 +1822,33 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 0;
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* Preferring IPv4 */
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 1, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 1, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 1, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 1, 0),
OP_EQ, 0);
/* Preferring IPv6 */
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 1, 1),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 1, 1),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 1, 1),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 1, 1),
OP_EQ, 0);
/* Test the function's address matching with UseBridges on */
@@ -1857,45 +1857,45 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 1;
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* Preferring IPv4 */
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 1, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 1, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 1, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 1, 0),
OP_EQ, 0);
/* Preferring IPv6 */
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 1, 1),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 1, 1),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 1, 1),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 1, 1),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 1, 1),
OP_EQ, 0);
/* bridge clients always use IPv6, regardless of ClientUseIPv6 */
mock_options.ClientUseIPv4 = 1;
mock_options.ClientUseIPv6 = 0;
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* Test the function's address matching with IPv4 on */
@@ -1904,13 +1904,13 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 0;
mock_options.UseBridges = 0;
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* Test the function's address matching with IPv6 on */
@@ -1919,13 +1919,13 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 0;
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* Test the function's address matching with ClientUseIPv4 0.
@@ -1935,13 +1935,13 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.ClientUseIPv6 = 0;
mock_options.UseBridges = 0;
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&r_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&r_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&r_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* Test the function's address matching for unusual inputs */
@@ -1951,27 +1951,27 @@ test_policies_fascist_firewall_allows_address(void *arg)
mock_options.UseBridges = 1;
/* NULL and tor_addr_is_null addresses are rejected */
- tt_int_op(fascist_firewall_allows_address(NULL, port, policy, 0, 0), OP_EQ,
+ tt_int_op(reachable_addr_allows(NULL, port, policy, 0, 0), OP_EQ,
0);
- tt_int_op(fascist_firewall_allows_address(&n_ipv4_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&n_ipv4_addr, port, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&n_ipv6_addr, port, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&n_ipv6_addr, port, policy, 0, 0),
OP_EQ, 0);
/* zero ports are rejected */
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, 0, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, 0, policy, 0, 0),
OP_EQ, 0);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, 0, policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, 0, policy, 0, 0),
OP_EQ, 0);
/* NULL and empty policies accept everything */
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, NULL, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, NULL, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, NULL, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, NULL, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv4_addr, port, e_policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv4_addr, port, e_policy, 0, 0),
OP_EQ, 1);
- tt_int_op(fascist_firewall_allows_address(&ipv6_addr, port, e_policy, 0, 0),
+ tt_int_op(reachable_addr_allows(&ipv6_addr, port, e_policy, 0, 0),
OP_EQ, 1);
done:
@@ -1991,7 +1991,7 @@ test_policies_fascist_firewall_allows_address(void *arg)
#define TEST_IPV6_OR_PORT 61234
#define TEST_IPV6_DIR_PORT 62345
-/* Check that fascist_firewall_choose_address_rs() returns the expected
+/* Check that reachable_addr_choose_from_rs() returns the expected
* results. */
#define CHECK_CHOSEN_ADDR_RS(fake_rs, fw_connection, pref_only, expect_rv, \
expect_ap) \
@@ -1999,13 +1999,13 @@ test_policies_fascist_firewall_allows_address(void *arg)
tor_addr_port_t chosen_rs_ap; \
tor_addr_make_null(&chosen_rs_ap.addr, AF_INET); \
chosen_rs_ap.port = 0; \
- fascist_firewall_choose_address_rs(&(fake_rs), (fw_connection), \
+ reachable_addr_choose_from_rs(&(fake_rs), (fw_connection), \
(pref_only), &chosen_rs_ap); \
tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_rs_ap.addr)); \
tt_int_op((expect_ap).port, OP_EQ, chosen_rs_ap.port); \
STMT_END
-/* Check that fascist_firewall_choose_address_node() returns the expected
+/* Check that reachable_addr_choose_from_node() returns the expected
* results. */
#define CHECK_CHOSEN_ADDR_NODE(fake_node, fw_connection, pref_only, \
expect_rv, expect_ap) \
@@ -2013,14 +2013,14 @@ test_policies_fascist_firewall_allows_address(void *arg)
tor_addr_port_t chosen_node_ap; \
tor_addr_make_null(&chosen_node_ap.addr, AF_INET); \
chosen_node_ap.port = 0; \
- fascist_firewall_choose_address_node(&(fake_node),(fw_connection), \
+ reachable_addr_choose_from_node(&(fake_node),(fw_connection), \
(pref_only), &chosen_node_ap); \
tt_assert(tor_addr_eq(&(expect_ap).addr, &chosen_node_ap.addr)); \
tt_int_op((expect_ap).port, OP_EQ, chosen_node_ap.port); \
STMT_END
-/* Check that fascist_firewall_choose_address_rs and
- * fascist_firewall_choose_address_node() both return the expected results. */
+/* Check that reachable_addr_choose_from_rs and
+ * reachable_addr_choose_from_node() both return the expected results. */
#define CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, fw_connection, pref_only, \
expect_rv, expect_ap) \
STMT_BEGIN \
@@ -2030,7 +2030,7 @@ test_policies_fascist_firewall_allows_address(void *arg)
expect_ap); \
STMT_END
-/* Check that fascist_firewall_choose_address_ls() returns the expected
+/* Check that reachable_addr_choose_from_ls() returns the expected
* results. */
#define CHECK_CHOSEN_ADDR_NULL_LS() \
STMT_BEGIN \
@@ -2038,7 +2038,7 @@ test_policies_fascist_firewall_allows_address(void *arg)
tor_addr_make_null(&chosen_ls_ap.addr, AF_UNSPEC); \
chosen_ls_ap.port = 0; \
setup_full_capture_of_logs(LOG_WARN); \
- fascist_firewall_choose_address_ls(NULL, 1, &chosen_ls_ap); \
+ reachable_addr_choose_from_ls(NULL, 1, &chosen_ls_ap); \
expect_single_log_msg("Unknown or missing link specifiers"); \
teardown_capture_of_logs(); \
STMT_END
@@ -2049,7 +2049,7 @@ test_policies_fascist_firewall_allows_address(void *arg)
tor_addr_make_null(&chosen_ls_ap.addr, AF_UNSPEC); \
chosen_ls_ap.port = 0; \
setup_full_capture_of_logs(LOG_WARN); \
- fascist_firewall_choose_address_ls(fake_ls, pref_only, &chosen_ls_ap); \
+ reachable_addr_choose_from_ls(fake_ls, pref_only, &chosen_ls_ap); \
if (smartlist_len(fake_ls) == 0) { \
expect_single_log_msg("Link specifiers are empty"); \
} else { \
@@ -2066,7 +2066,7 @@ test_policies_fascist_firewall_allows_address(void *arg)
tor_addr_make_null(&chosen_ls_ap.addr, AF_UNSPEC); \
chosen_ls_ap.port = 0; \
setup_full_capture_of_logs(LOG_WARN); \
- fascist_firewall_choose_address_ls(fake_ls, 0, &chosen_ls_ap); \
+ reachable_addr_choose_from_ls(fake_ls, 0, &chosen_ls_ap); \
expect_single_log_msg("None of our link specifiers have IPv4 or IPv6"); \
teardown_capture_of_logs(); \
STMT_END
@@ -2125,7 +2125,7 @@ test_policies_fascist_firewall_allows_address(void *arg)
teardown_capture_of_logs(); \
STMT_END
-/** Run unit tests for fascist_firewall_choose_address */
+/** Run unit tests for reachable_addr_choose */
static void
test_policies_fascist_firewall_choose_address(void *arg)
{
@@ -2153,87 +2153,87 @@ test_policies_fascist_firewall_choose_address(void *arg)
tor_addr_make_null(&n_ipv6_ap.addr, AF_INET6);
n_ipv6_ap.port = 0;
- /* Sanity check fascist_firewall_choose_address with IPv4 and IPv6 on */
+ /* Sanity check reachable_addr_choose with IPv4 and IPv6 on */
memset(&mock_options, 0, sizeof(or_options_t));
mock_options.ClientUseIPv4 = 1;
mock_options.ClientUseIPv6 = 1;
mock_options.UseBridges = 0;
/* Prefer IPv4 */
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 1,
FIREWALL_OR_CONNECTION, 0, 0)
== &ipv4_or_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 1,
FIREWALL_OR_CONNECTION, 1, 0)
== &ipv4_or_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1,
+ tt_assert(reachable_addr_choose(&ipv4_dir_ap, &ipv6_dir_ap, 1,
FIREWALL_DIR_CONNECTION, 0, 0)
== &ipv4_dir_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 1,
+ tt_assert(reachable_addr_choose(&ipv4_dir_ap, &ipv6_dir_ap, 1,
FIREWALL_DIR_CONNECTION, 1, 0)
== &ipv4_dir_ap);
/* Prefer IPv6 */
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 0,
FIREWALL_OR_CONNECTION, 0, 1)
== &ipv6_or_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 0,
FIREWALL_OR_CONNECTION, 1, 1)
== &ipv6_or_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_dir_ap, &ipv6_dir_ap, 0,
FIREWALL_DIR_CONNECTION, 0, 1)
== &ipv6_dir_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &ipv6_dir_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_dir_ap, &ipv6_dir_ap, 0,
FIREWALL_DIR_CONNECTION, 1, 1)
== &ipv6_dir_ap);
/* Unusual inputs */
/* null preferred OR addresses */
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &n_ipv6_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &n_ipv6_ap, 0,
FIREWALL_OR_CONNECTION, 0, 1)
== &ipv4_or_ap);
- tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_or_ap, 1,
+ tt_assert(reachable_addr_choose(&n_ipv4_ap, &ipv6_or_ap, 1,
FIREWALL_OR_CONNECTION, 0, 0)
== &ipv6_or_ap);
/* null both OR addresses */
- tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
+ tt_ptr_op(reachable_addr_choose(&n_ipv4_ap, &n_ipv6_ap, 0,
FIREWALL_OR_CONNECTION, 0, 1),
OP_EQ, NULL);
- tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
+ tt_ptr_op(reachable_addr_choose(&n_ipv4_ap, &n_ipv6_ap, 1,
FIREWALL_OR_CONNECTION, 0, 0),
OP_EQ, NULL);
/* null preferred Dir addresses */
- tt_assert(fascist_firewall_choose_address(&ipv4_dir_ap, &n_ipv6_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_dir_ap, &n_ipv6_ap, 0,
FIREWALL_DIR_CONNECTION, 0, 1)
== &ipv4_dir_ap);
- tt_assert(fascist_firewall_choose_address(&n_ipv4_ap, &ipv6_dir_ap, 1,
+ tt_assert(reachable_addr_choose(&n_ipv4_ap, &ipv6_dir_ap, 1,
FIREWALL_DIR_CONNECTION, 0, 0)
== &ipv6_dir_ap);
/* null both Dir addresses */
- tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 0,
+ tt_ptr_op(reachable_addr_choose(&n_ipv4_ap, &n_ipv6_ap, 0,
FIREWALL_DIR_CONNECTION, 0, 1),
OP_EQ, NULL);
- tt_ptr_op(fascist_firewall_choose_address(&n_ipv4_ap, &n_ipv6_ap, 1,
+ tt_ptr_op(reachable_addr_choose(&n_ipv4_ap, &n_ipv6_ap, 1,
FIREWALL_DIR_CONNECTION, 0, 0),
OP_EQ, NULL);
/* Prefer IPv4 but want IPv6 (contradictory) */
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 0,
FIREWALL_OR_CONNECTION, 0, 0)
== &ipv4_or_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 0,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 0,
FIREWALL_OR_CONNECTION, 1, 0)
== &ipv4_or_ap);
/* Prefer IPv6 but want IPv4 (contradictory) */
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 1,
FIREWALL_OR_CONNECTION, 0, 1)
== &ipv6_or_ap);
- tt_assert(fascist_firewall_choose_address(&ipv4_or_ap, &ipv6_or_ap, 1,
+ tt_assert(reachable_addr_choose(&ipv4_or_ap, &ipv6_or_ap, 1,
FIREWALL_OR_CONNECTION, 1, 1)
== &ipv6_or_ap);
@@ -2268,7 +2268,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = 0;
mock_options.ClientPreferIPv6DirPort = 0;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2284,7 +2284,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = -1;
mock_options.ClientPreferIPv6DirPort = -1;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2300,7 +2300,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = 1;
mock_options.ClientPreferIPv6DirPort = 1;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2316,7 +2316,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = 0;
mock_options.ClientPreferIPv6DirPort = 1;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2332,7 +2332,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = 1;
mock_options.ClientPreferIPv6DirPort = 0;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2354,7 +2354,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = 0;
mock_options.ClientPreferIPv6DirPort = 0;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2405,7 +2405,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6ORPort = 1;
mock_options.ClientPreferIPv6DirPort = 1;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2454,7 +2454,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientUseIPv4 = 1;
mock_options.ClientUseIPv6 = 0;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2471,7 +2471,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientUseIPv4 = 0;
mock_options.ClientUseIPv6 = 1;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2489,7 +2489,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientUseIPv4 = 0;
mock_options.ClientUseIPv6 = 0;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2511,7 +2511,7 @@ test_policies_fascist_firewall_choose_address(void *arg)
mock_options.ClientPreferIPv6DirPort = 1;
/* Simulate the initialisation of fake_node.ipv6_preferred */
- fake_node.ipv6_preferred = fascist_firewall_prefer_ipv6_orport(
+ fake_node.ipv6_preferred = reachable_addr_prefer_ipv6_orport(
&mock_options);
CHECK_CHOSEN_ADDR_RN(fake_rs, fake_node, FIREWALL_OR_CONNECTION, 0, 1,
@@ -2683,9 +2683,9 @@ struct testcase_t policy_tests[] = {
{ "reject_interface_address", test_policies_reject_interface_address, 0,
NULL, NULL },
{ "reject_port_address", test_policies_reject_port_address, 0, NULL, NULL },
- { "fascist_firewall_allows_address",
+ { "reachable_addr_allows",
test_policies_fascist_firewall_allows_address, 0, NULL, NULL },
- { "fascist_firewall_choose_address",
+ { "reachable_addr_choose",
test_policies_fascist_firewall_choose_address, 0, NULL, NULL },
END_OF_TESTCASES
};
1
0