Merge branch 'master' of gitlab.inria.fr:qdufour/donar
This commit is contained in:
commit
1d82b8bf54
16 changed files with 690 additions and 378 deletions
|
@ -37,6 +37,8 @@ list(APPEND CSOURCES
|
||||||
src/capture_traffic.c
|
src/capture_traffic.c
|
||||||
src/cap_utils.h
|
src/cap_utils.h
|
||||||
src/cap_utils.c
|
src/cap_utils.c
|
||||||
|
src/measure.h
|
||||||
|
src/measure.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(donar ${CSOURCES} src/donar.c)
|
add_executable(donar ${CSOURCES} src/donar.c)
|
||||||
|
|
|
@ -3,7 +3,7 @@ library(sqldf)
|
||||||
library(plyr)
|
library(plyr)
|
||||||
library(cowplot)
|
library(cowplot)
|
||||||
|
|
||||||
thunder_ms <- read.csv("thunder_23.csv")
|
thunder_ms <- read.csv("thunder_22.csv")
|
||||||
thunder_ms <- sqldf("select run,ident,jmax,links,latency, CAST(latency as real) / 1000. as lat_ms from thunder_ms")
|
thunder_ms <- sqldf("select run,ident,jmax,links,latency, CAST(latency as real) / 1000. as lat_ms from thunder_ms")
|
||||||
thunder_ms$links <- as.factor(thunder_ms$links)
|
thunder_ms$links <- as.factor(thunder_ms$links)
|
||||||
thunder_ms$jmax <- as.factor(thunder_ms$jmax)
|
thunder_ms$jmax <- as.factor(thunder_ms$jmax)
|
||||||
|
@ -61,7 +61,7 @@ thunder_bw$links <- as.factor(thunder_bw$links)
|
||||||
v3 <- ggplot(data = thunder_bw, aes(x = jmax, y=sent_ratio, fill=links)) +
|
v3 <- ggplot(data = thunder_bw, aes(x = jmax, y=sent_ratio, fill=links)) +
|
||||||
geom_boxplot(outlier.size=0.1) +
|
geom_boxplot(outlier.size=0.1) +
|
||||||
#scale_y_log10() +
|
#scale_y_log10() +
|
||||||
coord_cartesian(ylim = c(1,2)) +
|
coord_cartesian(ylim = c(1,4)) +
|
||||||
scale_fill_grey() +
|
scale_fill_grey() +
|
||||||
ylab("bandwidth ratio") +
|
ylab("bandwidth ratio") +
|
||||||
xlab("max allowed jitter") +
|
xlab("max allowed jitter") +
|
||||||
|
|
20
r/tor_owd.R
Normal file
20
r/tor_owd.R
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
library(ggplot2)
|
||||||
|
library(sqldf)
|
||||||
|
library(dplyr)
|
||||||
|
library(cowplot)
|
||||||
|
|
||||||
|
tor_owd <- read.csv("tor_owd.csv")
|
||||||
|
|
||||||
|
for (run_id in c(0:39)) {
|
||||||
|
print(run_id)
|
||||||
|
sel_owd <- filter(tor_owd, measure_type != "delta", run == paste("./out/nBV7DWLpj8WA6Be3-",run_id,sep=""))
|
||||||
|
ggplot(data = sel_owd, aes(x = packet_id, y=latency_ms, color=measure_type)) +
|
||||||
|
geom_line() +
|
||||||
|
theme_classic() +
|
||||||
|
ggsave(paste("tor_owd_",run_id,".png", sep = ""), dpi=150, dev='png', height=18, width=32, units="cm")
|
||||||
|
}
|
||||||
|
|
||||||
|
ggplot(data = sqldf("select * from tor_owd where measure_type='delta_abs'"), aes(x=latency_ms)) +
|
||||||
|
stat_ecdf(pad = FALSE) +
|
||||||
|
coord_cartesian(xlim = c(0,500)) +
|
||||||
|
theme_classic()
|
374
scripts/Makefile
374
scripts/Makefile
|
@ -4,7 +4,15 @@ simple_test:
|
||||||
./run-3 \
|
./run-3 \
|
||||||
1,simple_test . \
|
1,simple_test . \
|
||||||
thunder-client 600 100 100 8 150 . \
|
thunder-client 600 100 100 8 150 . \
|
||||||
thunder-server 8 150 . \
|
thunder-server 8 150 100. \
|
||||||
|
tor3 -f /etc/torrc_simple . \
|
||||||
|
tor3 -f /etc/torrc_simple
|
||||||
|
|
||||||
|
simple_test_2:
|
||||||
|
./run-3 \
|
||||||
|
1,simple_test . \
|
||||||
|
orig-client 600 100 100 . \
|
||||||
|
orig-server 100. \
|
||||||
tor3 -f /etc/torrc_simple . \
|
tor3 -f /etc/torrc_simple . \
|
||||||
tor3 -f /etc/torrc_simple
|
tor3 -f /etc/torrc_simple
|
||||||
|
|
||||||
|
@ -15,10 +23,10 @@ tor_bw_small:
|
||||||
orig-client 120 500 100, \
|
orig-client 120 500 100, \
|
||||||
orig-client 600 100 100, \
|
orig-client 600 100 100, \
|
||||||
orig-client 1200 50 100 . \
|
orig-client 1200 50 100 . \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server . \
|
orig-server 100. \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
|
@ -40,11 +48,11 @@ tor_bw_full:
|
||||||
orig-client 6000 100 100, \
|
orig-client 6000 100 100, \
|
||||||
orig-client 12000 50 100, \
|
orig-client 12000 50 100, \
|
||||||
orig-client 30000 20 100 . \
|
orig-client 30000 20 100 . \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server . \
|
orig-server 100. \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
|
@ -67,10 +75,10 @@ tor_guards_small:
|
||||||
dup2-client 600 100 100 8, \
|
dup2-client 600 100 100 8, \
|
||||||
dup2-client 600 100 100 8, \
|
dup2-client 600 100 100 8, \
|
||||||
dup2-client 600 100 100 8 . \
|
dup2-client 600 100 100 8 . \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8 . \
|
dup2-server 8 100. \
|
||||||
tor3 -f /etc/torrc_guard_1, \
|
tor3 -f /etc/torrc_guard_1, \
|
||||||
tor3 -f /etc/torrc_guard_3, \
|
tor3 -f /etc/torrc_guard_3, \
|
||||||
tor3 -f /etc/torrc_guard_5, \
|
tor3 -f /etc/torrc_guard_5, \
|
||||||
|
@ -92,15 +100,15 @@ tor_guards_full:
|
||||||
dup2-client 6000 100 100 8, \
|
dup2-client 6000 100 100 8, \
|
||||||
dup2-client 6000 100 100 8, \
|
dup2-client 6000 100 100 8, \
|
||||||
dup2-client 6000 100 100 8 . \
|
dup2-client 6000 100 100 8 . \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8, \
|
dup2-server 8 100, \
|
||||||
dup2-server 8 . \
|
dup2-server 8 100. \
|
||||||
tor3 -f /etc/torrc_guard_1, \
|
tor3 -f /etc/torrc_guard_1, \
|
||||||
tor3 -f /etc/torrc_guard_2, \
|
tor3 -f /etc/torrc_guard_2, \
|
||||||
tor3 -f /etc/torrc_guard_3, \
|
tor3 -f /etc/torrc_guard_3, \
|
||||||
|
@ -130,9 +138,9 @@ tor_relays_full:
|
||||||
orig-client 6000 100 100, \
|
orig-client 6000 100 100, \
|
||||||
orig-client 6000 100 100, \
|
orig-client 6000 100 100, \
|
||||||
orig-client 6000 100 100 . \
|
orig-client 6000 100 100 . \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server-single . \
|
orig-server-single 100. \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple . \
|
tor2 -f /etc/torrc_simple . \
|
||||||
|
@ -146,9 +154,9 @@ tor_relays_small:
|
||||||
orig-client 600 100 100, \
|
orig-client 600 100 100, \
|
||||||
orig-client 600 100 100, \
|
orig-client 600 100 100, \
|
||||||
orig-client 600 100 100 . \
|
orig-client 600 100 100 . \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server-single . \
|
orig-server-single 100. \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple . \
|
tor2 -f /etc/torrc_simple . \
|
||||||
|
@ -170,13 +178,13 @@ thunder_configure_small:
|
||||||
thunder-client 600 100 100 $(link_num) 250, \
|
thunder-client 600 100 100 $(link_num) 250, \
|
||||||
thunder-client 600 100 100 $(link_num) 300, \
|
thunder-client 600 100 100 $(link_num) 300, \
|
||||||
thunder-client 600 100 100 $(link_num) 350. \
|
thunder-client 600 100 100 $(link_num) 350. \
|
||||||
thunder-server $(link_num) 50, \
|
thunder-server $(link_num) 50 100, \
|
||||||
thunder-server $(link_num) 100, \
|
thunder-server $(link_num) 100 100, \
|
||||||
thunder-server $(link_num) 150, \
|
thunder-server $(link_num) 150 100, \
|
||||||
thunder-server $(link_num) 200, \
|
thunder-server $(link_num) 200 100, \
|
||||||
thunder-server $(link_num) 250, \
|
thunder-server $(link_num) 250 100, \
|
||||||
thunder-server $(link_num) 300, \
|
thunder-server $(link_num) 300 100, \
|
||||||
thunder-server $(link_num) 350. \
|
thunder-server $(link_num) 350 100. \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
|
@ -202,13 +210,13 @@ thunder_configure_full:
|
||||||
thunder-client 6000 100 100 $(link_num) 250, \
|
thunder-client 6000 100 100 $(link_num) 250, \
|
||||||
thunder-client 6000 100 100 $(link_num) 300, \
|
thunder-client 6000 100 100 $(link_num) 300, \
|
||||||
thunder-client 6000 100 100 $(link_num) 350. \
|
thunder-client 6000 100 100 $(link_num) 350. \
|
||||||
thunder-server $(link_num) 50, \
|
thunder-server $(link_num) 50 100, \
|
||||||
thunder-server $(link_num) 100, \
|
thunder-server $(link_num) 100 100, \
|
||||||
thunder-server $(link_num) 150, \
|
thunder-server $(link_num) 150 100, \
|
||||||
thunder-server $(link_num) 200, \
|
thunder-server $(link_num) 200 100, \
|
||||||
thunder-server $(link_num) 250, \
|
thunder-server $(link_num) 250 100, \
|
||||||
thunder-server $(link_num) 300, \
|
thunder-server $(link_num) 300 100, \
|
||||||
thunder-server $(link_num) 350. \
|
thunder-server $(link_num) 350 100. \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
|
@ -237,12 +245,12 @@ thunder_configure_2_part:
|
||||||
thunder-client 9900 30 100 8 ${jmax}, \
|
thunder-client 9900 30 100 8 ${jmax}, \
|
||||||
thunder-client 9900 30 100 12 ${jmax}, \
|
thunder-client 9900 30 100 12 ${jmax}, \
|
||||||
thunder-client 9900 30 100 16 ${jmax}. \
|
thunder-client 9900 30 100 16 ${jmax}. \
|
||||||
thunder-server 2 ${jmax}, \
|
thunder-server 2 ${jmax} 100, \
|
||||||
thunder-server 4 ${jmax}, \
|
thunder-server 4 ${jmax} 100, \
|
||||||
thunder-server 6 ${jmax}, \
|
thunder-server 6 ${jmax} 100, \
|
||||||
thunder-server 8 ${jmax}, \
|
thunder-server 8 ${jmax} 100, \
|
||||||
thunder-server 12 ${jmax}, \
|
thunder-server 12 ${jmax} 100, \
|
||||||
thunder-server 16 ${jmax}. \
|
thunder-server 16 ${jmax} 100. \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
|
@ -301,48 +309,48 @@ thunder_configure_2_full:
|
||||||
thunder-client 9900 30 100 8 450, \
|
thunder-client 9900 30 100 8 450, \
|
||||||
thunder-client 9900 30 100 8 550, \
|
thunder-client 9900 30 100 8 550, \
|
||||||
thunder-client 9900 30 100 8 650. \
|
thunder-client 9900 30 100 8 650. \
|
||||||
thunder-server 2 50, \
|
thunder-server 2 50 100, \
|
||||||
thunder-server 2 150, \
|
thunder-server 2 150 100, \
|
||||||
thunder-server 2 250, \
|
thunder-server 2 250 100, \
|
||||||
thunder-server 2 350, \
|
thunder-server 2 350 100, \
|
||||||
thunder-server 2 450, \
|
thunder-server 2 450 100, \
|
||||||
thunder-server 2 550, \
|
thunder-server 2 550 100, \
|
||||||
thunder-server 2 650, \
|
thunder-server 2 650 100, \
|
||||||
thunder-server 4 50, \
|
thunder-server 4 50 100, \
|
||||||
thunder-server 4 150, \
|
thunder-server 4 150 100, \
|
||||||
thunder-server 4 250, \
|
thunder-server 4 250 100, \
|
||||||
thunder-server 4 350, \
|
thunder-server 4 350 100, \
|
||||||
thunder-server 4 450, \
|
thunder-server 4 450 100, \
|
||||||
thunder-server 4 550, \
|
thunder-server 4 550 100, \
|
||||||
thunder-server 4 650, \
|
thunder-server 4 650 100, \
|
||||||
thunder-server 6 50, \
|
thunder-server 6 50 100, \
|
||||||
thunder-server 6 150, \
|
thunder-server 6 150 100, \
|
||||||
thunder-server 6 250, \
|
thunder-server 6 250 100, \
|
||||||
thunder-server 6 350, \
|
thunder-server 6 350 100, \
|
||||||
thunder-server 6 450, \
|
thunder-server 6 450 100, \
|
||||||
thunder-server 6 550, \
|
thunder-server 6 550 100, \
|
||||||
thunder-server 6 650, \
|
thunder-server 6 650 100, \
|
||||||
thunder-server 12 50, \
|
thunder-server 12 50 100, \
|
||||||
thunder-server 12 150, \
|
thunder-server 12 150 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 350, \
|
thunder-server 12 350 100, \
|
||||||
thunder-server 12 450, \
|
thunder-server 12 450 100, \
|
||||||
thunder-server 12 550, \
|
thunder-server 12 550 100, \
|
||||||
thunder-server 12 650, \
|
thunder-server 12 650 100, \
|
||||||
thunder-server 16 50, \
|
thunder-server 16 50 100, \
|
||||||
thunder-server 16 150, \
|
thunder-server 16 150 100, \
|
||||||
thunder-server 16 250, \
|
thunder-server 16 250 100, \
|
||||||
thunder-server 16 350, \
|
thunder-server 16 350 100, \
|
||||||
thunder-server 16 450, \
|
thunder-server 16 450 100, \
|
||||||
thunder-server 16 550, \
|
thunder-server 16 550 100, \
|
||||||
thunder-server 16 650, \
|
thunder-server 16 650 100, \
|
||||||
thunder-server 8 50, \
|
thunder-server 8 50 100, \
|
||||||
thunder-server 8 150, \
|
thunder-server 8 150 100, \
|
||||||
thunder-server 8 250, \
|
thunder-server 8 250 100, \
|
||||||
thunder-server 8 350, \
|
thunder-server 8 350 100, \
|
||||||
thunder-server 8 450, \
|
thunder-server 8 450 100, \
|
||||||
thunder-server 8 550, \
|
thunder-server 8 550 100, \
|
||||||
thunder-server 8 650. \
|
thunder-server 8 650 100. \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
tor2 -f /etc/torrc_simple, \
|
tor2 -f /etc/torrc_simple, \
|
||||||
|
@ -455,86 +463,86 @@ thunder_configure_2_full_parse_red:
|
||||||
tor_just_many_latencies:
|
tor_just_many_latencies:
|
||||||
./run-3 \
|
./run-3 \
|
||||||
2,tor_just_many_latencies . \
|
2,tor_just_many_latencies . \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100, \
|
orig-client ${count} ${interval} 100, \
|
||||||
orig-client 9900 30 100 . \
|
orig-client ${count} ${interval} 100 . \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server, \
|
orig-server 100, \
|
||||||
orig-server . \
|
orig-server 100. \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
tor3 -f /etc/torrc_simple, \
|
tor3 -f /etc/torrc_simple, \
|
||||||
|
@ -659,18 +667,18 @@ thunder_guards:
|
||||||
thunder-client 9900 30 100 12 250, \
|
thunder-client 9900 30 100 12 250, \
|
||||||
thunder-client 9900 30 100 12 250, \
|
thunder-client 9900 30 100 12 250, \
|
||||||
thunder-client 9900 30 100 12 250. \
|
thunder-client 9900 30 100 12 250. \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250, \
|
thunder-server 12 250 100, \
|
||||||
thunder-server 12 250. \
|
thunder-server 12 250 100. \
|
||||||
tor2 -f /etc/torrc_guard_2, \
|
tor2 -f /etc/torrc_guard_2, \
|
||||||
tor2 -f /etc/torrc_guard_4, \
|
tor2 -f /etc/torrc_guard_4, \
|
||||||
tor2 -f /etc/torrc_guard_6, \
|
tor2 -f /etc/torrc_guard_6, \
|
||||||
|
|
34
scripts/deltams.py
Executable file
34
scripts/deltams.py
Executable file
|
@ -0,0 +1,34 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
import sys,re
|
||||||
|
|
||||||
|
print("run,packet_id,measure_type,latency,latency_ms")
|
||||||
|
for i in range(1,len(sys.argv)):
|
||||||
|
path = sys.argv[i]
|
||||||
|
client_server = f"{sys.argv[i]}/log/server-measlat-stdout.log"
|
||||||
|
server_client = f"{sys.argv[i]}/log/client-measlat-stdout.log"
|
||||||
|
run = path
|
||||||
|
|
||||||
|
agg = {}
|
||||||
|
with open(client_server, 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
res = re.match(r".*Packet (\d+) latency (\d+)µs", line)
|
||||||
|
if not res: continue
|
||||||
|
pkt_id,lat = res.groups()
|
||||||
|
pkt_id,lat = int(pkt_id), int(lat)
|
||||||
|
agg[pkt_id] = {"client_server": lat }
|
||||||
|
|
||||||
|
with open(server_client, 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
res = re.match(r".*Packet (\d+) latency (\d+)µs", line)
|
||||||
|
if not res: continue
|
||||||
|
pkt_id,lat = res.groups()
|
||||||
|
pkt_id,lat = int(pkt_id), int(lat)
|
||||||
|
if not pkt_id in agg: agg[pkt_id] = {}
|
||||||
|
agg[pkt_id]["server_client"] = lat
|
||||||
|
|
||||||
|
for packet_id, lats in agg.items():
|
||||||
|
if "client_server" not in lats or "server_client" not in lats: continue
|
||||||
|
print(f"{run},{packet_id},client_server,{lats['client_server']},{lats['client_server'] / 1000}")
|
||||||
|
print(f"{run},{packet_id},server_client,{lats['server_client']},{lats['server_client'] / 1000}")
|
||||||
|
print(f"{run},{packet_id},delta,{lats['client_server'] - lats['server_client']},{(lats['client_server'] - lats['server_client'])/1000}")
|
||||||
|
print(f"{run},{packet_id},delta_abs,{abs(lats['client_server'] - lats['server_client'])},{abs(lats['client_server'] - lats['server_client'])/1000}")
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
mkdir -p $2/{log,shared}
|
mkdir -p $3/{log,shared}
|
||||||
cd $2/shared
|
cd $3/shared
|
||||||
|
|
||||||
donar \
|
donar \
|
||||||
-a dup2 \
|
-a dup2 \
|
||||||
|
@ -10,4 +10,4 @@ donar \
|
||||||
-e 9000 \
|
-e 9000 \
|
||||||
> ../log/server-donar-stdout.log 2> ../log/server-donar-stderr.log &
|
> ../log/server-donar-stdout.log 2> ../log/server-donar-stderr.log &
|
||||||
|
|
||||||
udpecho -p 9000 > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
udpecho -p 9000 -m -s $2 > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
||||||
|
|
|
@ -5,5 +5,5 @@ pushd $4/shared > /dev/null
|
||||||
HS="`cat onion_services.pub | head -n1`.onion"
|
HS="`cat onion_services.pub | head -n1`.onion"
|
||||||
popd > /dev/null
|
popd > /dev/null
|
||||||
|
|
||||||
measlat -h $HS -p 7500 -t tor > /dev/null 2> $4/log/client-bootstrap-stderr.log # Used to wait for connections
|
measlat -h $HS -p 7500 -t tor -r -s $3 > /dev/null 2> $4/log/client-bootstrap-stderr.log # Used to wait for connections
|
||||||
measlat -h $HS -p 7500 -t tor -c $1 -i $2 -s $3 > $4/res/orig.csv 2> $4/log/client-measlat-stderr.log
|
measlat -h $HS -p 7500 -t tor -c $1 -i $2 -s $3 > $4/log/client-measlat-stdout.log 2> $4/log/client-measlat-stderr.log
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
mkdir -p $1/{log,shared}
|
mkdir -p $2/{log,shared}
|
||||||
cd $1/shared
|
cd $2/shared
|
||||||
torecho > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
measlat -t tor -p 7500 -l -s $1 > ../log/server-measlat-stdout.log 2> ../log/server-measlat-stderr.log
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
mkdir -p $1/{log,shared}
|
mkdir -p $2/{log,shared}
|
||||||
cd $1/shared
|
cd $2/shared
|
||||||
torecho -n > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
torecho -n -m -s $1 > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
||||||
|
|
|
@ -5,7 +5,7 @@ donar \
|
||||||
-c \
|
-c \
|
||||||
-o $6/shared/onion_services.pub \
|
-o $6/shared/onion_services.pub \
|
||||||
-l $4 \
|
-l $4 \
|
||||||
-p jitter=$5 \
|
-p jitter=$5,scheduler=1 \
|
||||||
-b \
|
-b \
|
||||||
-r 9000 \
|
-r 9000 \
|
||||||
> $6/log/client-donar-stdout.log 2> $6/log/client-donar-stderr.log &
|
> $6/log/client-donar-stdout.log 2> $6/log/client-donar-stderr.log &
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
mkdir -p $3/{log,shared}
|
mkdir -p $4/{log,shared}
|
||||||
cd $3/shared
|
cd $4/shared
|
||||||
|
|
||||||
donar \
|
donar \
|
||||||
-a thunder \
|
-a thunder \
|
||||||
-s \
|
-s \
|
||||||
-l $1 \
|
-l $1 \
|
||||||
-p jitter=$2 \
|
-p jitter=$2,scheduler=1 \
|
||||||
-b \
|
-b \
|
||||||
-e 9000 \
|
-e 9000 \
|
||||||
> ../log/server-donar-stdout.log 2> ../log/server-donar-stderr.log &
|
> ../log/server-donar-stdout.log 2> ../log/server-donar-stderr.log &
|
||||||
|
|
||||||
udpecho -p 9000 > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
udpecho -p 9000 -m -s $3 > ../log/server-udpecho-stdout.log 2> ../log/server-udpecho-stderr.log
|
||||||
|
|
413
src/meas_lat.c
413
src/meas_lat.c
|
@ -8,138 +8,20 @@
|
||||||
#include "net_tools.h"
|
#include "net_tools.h"
|
||||||
#include "socks5.h"
|
#include "socks5.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "measure.h"
|
||||||
|
#include "url.h"
|
||||||
|
#include "tor_os.h"
|
||||||
|
#include "tor_ctl.h"
|
||||||
|
|
||||||
struct measlat_ctx {
|
struct measlat_ctx {
|
||||||
int count, size, interval, verbose;
|
struct measure_conf mc;
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t addrlen;
|
||||||
|
int verbose, is_timer_started, is_from_needed, tor_flags;
|
||||||
char *host, *port, *transport;
|
char *host, *port, *transport;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct measure_conf {
|
void register_timer(struct evt_core_ctx* evts, struct timespec* next_tick) {
|
||||||
uint64_t max_measure;
|
|
||||||
uint64_t payload_size;
|
|
||||||
char* payload;
|
|
||||||
uint64_t counter;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct packet_header {
|
|
||||||
uint64_t counter;
|
|
||||||
struct timespec emit_time;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct measure_conf* create_measure_conf(int max_mes, int plsize) {
|
|
||||||
struct measure_conf* mc = malloc(sizeof(struct measure_conf));
|
|
||||||
if (mc == NULL) {
|
|
||||||
perror("Malloc failed");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
mc->counter = 0;
|
|
||||||
mc->max_measure = max_mes;
|
|
||||||
mc->payload_size = plsize;
|
|
||||||
mc->payload = malloc(mc->payload_size);
|
|
||||||
if (mc->payload == NULL) {
|
|
||||||
perror("malloc failed");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_mesure_conf(void* v) {
|
|
||||||
struct measure_conf* mc = (struct measure_conf*)v;
|
|
||||||
free(mc->payload);
|
|
||||||
free(mc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int on_udp_err(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int on_udp(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
|
||||||
ssize_t res;
|
|
||||||
uint64_t micro_sec;
|
|
||||||
struct timespec curr;
|
|
||||||
struct measure_conf* mc = fdinfo->other;
|
|
||||||
res = read(fdinfo->fd, mc->payload, mc->payload_size);
|
|
||||||
if (res == -1 && errno == EAGAIN) return 1;
|
|
||||||
if (res != mc->payload_size) {
|
|
||||||
perror("read error");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
struct packet_header* head = (struct packet_header*) mc->payload;
|
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1){
|
|
||||||
perror("clock_gettime error");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
time_t now;
|
|
||||||
time(&now);
|
|
||||||
char* ctime_no_newline = strtok(ctime(&now), "\n");
|
|
||||||
|
|
||||||
micro_sec = elapsed_micros (&head->emit_time, &curr);
|
|
||||||
printf("[%s] Packet %llu latency %luµs\n", ctime_no_newline, (unsigned long long)head->counter, micro_sec);
|
|
||||||
|
|
||||||
if (mc->max_measure > 0 && head->counter >= mc->max_measure) {
|
|
||||||
printf("Measurement done\n");
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_timer_conf(void* v) {
|
|
||||||
struct measure_conf* mc = v;
|
|
||||||
free(mc->payload);
|
|
||||||
free(mc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int on_timer(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
|
||||||
ssize_t s;
|
|
||||||
uint64_t ticks = 0;
|
|
||||||
struct measure_conf* mc = fdinfo->other;
|
|
||||||
|
|
||||||
s = read(fdinfo->fd, &ticks, sizeof(uint64_t));
|
|
||||||
if (s == -1 && errno == EAGAIN) return 1;
|
|
||||||
if (s != sizeof(uint64_t)) {
|
|
||||||
perror("Read error");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ticks != 1) {
|
|
||||||
fprintf(stderr, "Has ticked %lu times, expected 1 time. This is a bug\n", ticks);
|
|
||||||
}
|
|
||||||
mc->counter++;
|
|
||||||
|
|
||||||
memset(mc->payload, 0, mc->payload_size);
|
|
||||||
struct packet_header* head = (struct packet_header*)mc->payload;
|
|
||||||
head->counter = mc->counter;
|
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &head->emit_time) == -1) {
|
|
||||||
perror("clock_gettime error");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *my_msg = "Tu n'es pas tout a fait la misere,\nCar les levres les plus pauvres te denoncent\nPar un sourire.";
|
|
||||||
size_t msg_len = strlen(my_msg);
|
|
||||||
size_t cursor_msg = 0;
|
|
||||||
for (size_t i = sizeof(struct packet_header); i < mc->payload_size; i++) {
|
|
||||||
mc->payload[i] = my_msg[cursor_msg];
|
|
||||||
cursor_msg = (cursor_msg + 1) % msg_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct evt_core_fdinfo* tgtinfo = evt_core_get_first_from_cat (ctx, "udp-read");
|
|
||||||
if (tgtinfo == NULL) tgtinfo = evt_core_get_first_from_cat (ctx, "tcp-read");
|
|
||||||
if (tgtinfo == NULL) {
|
|
||||||
printf("No connection yet\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
s = send(tgtinfo->fd, mc->payload, mc->payload_size, 0);
|
|
||||||
if (s < 0) {
|
|
||||||
perror("Send error");
|
|
||||||
//exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void register_timer(struct evt_core_ctx* evts, int udp, int interval, int count, int size) {
|
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
struct itimerspec timer_config;
|
struct itimerspec timer_config;
|
||||||
char url[1024];
|
char url[1024];
|
||||||
|
@ -148,16 +30,26 @@ void register_timer(struct evt_core_ctx* evts, int udp, int interval, int count,
|
||||||
fdinfo.cat = &cat;
|
fdinfo.cat = &cat;
|
||||||
fdinfo.url = url;
|
fdinfo.url = url;
|
||||||
|
|
||||||
|
struct evt_core_cat* ucat = evt_core_get_from_cat (evts, "tcp-read");
|
||||||
|
if (ucat == NULL) {
|
||||||
|
fprintf(stderr, "Category udp-read not found\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
struct measlat_ctx* mctx = ucat->app_ctx;
|
||||||
|
mctx->is_timer_started = 1;
|
||||||
|
|
||||||
if (clock_gettime(CLOCK_REALTIME, &now) == -1) {
|
if (clock_gettime(CLOCK_REALTIME, &now) == -1) {
|
||||||
perror("clock_gettime");
|
perror("clock_gettime");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
uint64_t micro_sec = interval;
|
uint64_t micro_sec = mctx->mc.interval;
|
||||||
timer_config.it_value.tv_sec = now.tv_sec + 1;
|
timer_config.it_value.tv_sec = next_tick == NULL ? now.tv_sec + 1 : next_tick->tv_sec;
|
||||||
timer_config.it_value.tv_nsec = now.tv_nsec;
|
timer_config.it_value.tv_nsec = next_tick == NULL ? now.tv_nsec : next_tick->tv_nsec;
|
||||||
timer_config.it_interval.tv_sec = micro_sec / 1000;
|
timer_config.it_interval.tv_sec = micro_sec / 1000;
|
||||||
timer_config.it_interval.tv_nsec = micro_sec % 1000 * 1000000;
|
timer_config.it_interval.tv_nsec = micro_sec % 1000 * 1000000;
|
||||||
|
|
||||||
|
printf("timer_config: sec=%ld nsec=%ld \n", (uint64_t) timer_config.it_value.tv_sec, (uint64_t) timer_config.it_value.tv_nsec);
|
||||||
|
|
||||||
fdinfo.fd = timerfd_create(CLOCK_REALTIME, 0);
|
fdinfo.fd = timerfd_create(CLOCK_REALTIME, 0);
|
||||||
if (fdinfo.fd == -1) {
|
if (fdinfo.fd == -1) {
|
||||||
perror("Unable to timerfd_create");
|
perror("Unable to timerfd_create");
|
||||||
|
@ -168,13 +60,123 @@ void register_timer(struct evt_core_ctx* evts, int udp, int interval, int count,
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
fdinfo.cat->name = "timer";
|
fdinfo.cat->name = "timer";
|
||||||
fdinfo.other = create_measure_conf(count, size);
|
sprintf(fdinfo.url, "timer:%ld:%ld", mctx->mc.interval, mctx->mc.max_measure);
|
||||||
fdinfo.free_other = free_timer_conf;
|
|
||||||
sprintf(fdinfo.url, "timer:%d:%d", interval, count);
|
|
||||||
evt_core_add_fd (evts, &fdinfo);
|
evt_core_add_fd (evts, &fdinfo);
|
||||||
printf("--- Timer registered\n");
|
printf("--- Timer registered\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int on_receive_measure_packet_err(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int on_receive_measure_packet(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
|
ssize_t nread;
|
||||||
|
struct measlat_ctx* mctx = fdinfo->cat->app_ctx;
|
||||||
|
|
||||||
|
if (mctx->is_from_needed) nread = recvfrom(fdinfo->fd, mctx->mc.payload, mctx->mc.payload_size, MSG_TRUNC, (struct sockaddr*)&mctx->addr, &mctx->addrlen);
|
||||||
|
else nread = recv(fdinfo->fd, mctx->mc.payload, mctx->mc.payload_size, 0);
|
||||||
|
|
||||||
|
if ((nread == -1 && errno == EAGAIN) || nread == 0) return 1;
|
||||||
|
// @FIXME logic is wrong for TCP here but would lead (hopefully) to a crash
|
||||||
|
|
||||||
|
// First we parse the packet and exit if needed
|
||||||
|
measure_parse (nread, &mctx->mc);
|
||||||
|
|
||||||
|
// Old behaviour where we work in a RTT way and send back the packet
|
||||||
|
if (measure_need_reply (&mctx->mc)) {
|
||||||
|
ssize_t nwritten;
|
||||||
|
if (mctx->is_from_needed) nwritten = sendto(fdinfo->fd, mctx->mc.payload, nread, 0, (struct sockaddr*)&mctx->addr, mctx->addrlen);
|
||||||
|
else nwritten = send(fdinfo->fd, mctx->mc.payload, nread, 0);
|
||||||
|
|
||||||
|
// @FIXME don't support EAGAIN on write. Could be intended, you don't think so?
|
||||||
|
if (nwritten != nread) {
|
||||||
|
fprintf(stderr, "Didn't write the same number of bytes as read. nread=%ld, nwritten=%ld\n", nread, nwritten);
|
||||||
|
perror("write errno");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to start sending from the server in sync with client
|
||||||
|
if (!mctx->is_timer_started) {
|
||||||
|
struct timespec next_tick = {0};
|
||||||
|
measure_next_tick(&mctx->mc, &next_tick);
|
||||||
|
register_timer (ctx, &next_tick);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int on_tcp_co(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
|
int conn_sock1, conn_sock2;
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t in_len;
|
||||||
|
char url[1024], port[6];
|
||||||
|
struct evt_core_cat local_cat = {0};
|
||||||
|
struct evt_core_fdinfo to_fdinfo = {0};
|
||||||
|
to_fdinfo.cat = &local_cat;
|
||||||
|
to_fdinfo.url = url;
|
||||||
|
|
||||||
|
in_len = sizeof(addr);
|
||||||
|
conn_sock1 = accept(fdinfo->fd, (struct sockaddr*)&addr, &in_len);
|
||||||
|
|
||||||
|
if (conn_sock1 == -1 && errno == EAGAIN) return 1;
|
||||||
|
if (conn_sock1 == -1) goto co_error;
|
||||||
|
|
||||||
|
url_get_port(port, fdinfo->url);
|
||||||
|
|
||||||
|
to_fdinfo.fd = conn_sock1;
|
||||||
|
to_fdinfo.cat->name = "tcp-read";
|
||||||
|
sprintf(to_fdinfo.url, "tcp:read:127.0.0.1:%s", port);
|
||||||
|
evt_core_add_fd (ctx, &to_fdinfo);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
co_error:
|
||||||
|
perror("Failed to handle new connection");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int on_timer(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
|
ssize_t s;
|
||||||
|
uint64_t ticks = 0;
|
||||||
|
struct measlat_ctx* mctx = fdinfo->cat->app_ctx;
|
||||||
|
|
||||||
|
s = read(fdinfo->fd, &ticks, sizeof(uint64_t));
|
||||||
|
if (s == -1 && errno == EAGAIN) return 1;
|
||||||
|
if (s != sizeof(uint64_t)) {
|
||||||
|
perror("Read error");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ticks != 1) {
|
||||||
|
fprintf(stderr, "Has ticked %lu times, expected 1 time. This is a bug\n", ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct measure_packet* head = measure_generate(&mctx->mc);
|
||||||
|
//printf("send(id=%ld,is_echo=%d)\n", head->counter, head->is_echo);
|
||||||
|
|
||||||
|
struct evt_core_fdinfo* tgtinfo = evt_core_get_first_from_cat (ctx, "udp-read");
|
||||||
|
if (tgtinfo == NULL) tgtinfo = evt_core_get_first_from_cat (ctx, "tcp-read");
|
||||||
|
if (tgtinfo == NULL) {
|
||||||
|
printf("No connection yet\n");
|
||||||
|
struct evt_core_fdinfo* timer_fd = evt_core_get_first_from_cat (ctx, "timer");
|
||||||
|
evt_core_rm_fd(ctx, timer_fd->fd);
|
||||||
|
mctx->is_timer_started = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (mctx->is_from_needed) s = sendto(tgtinfo->fd, mctx->mc.payload, mctx->mc.payload_size, 0, (struct sockaddr*)&mctx->addr, mctx->addrlen);
|
||||||
|
else s = send(tgtinfo->fd, mctx->mc.payload, mctx->mc.payload_size, 0);
|
||||||
|
|
||||||
|
if (s < 0) {
|
||||||
|
perror("Send error");
|
||||||
|
//exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int on_socks5_success_measlat(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
int on_socks5_success_measlat(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
char url[1024];
|
char url[1024];
|
||||||
struct evt_core_cat cat = {0};
|
struct evt_core_cat cat = {0};
|
||||||
|
@ -192,18 +194,16 @@ int on_socks5_success_measlat(struct evt_core_ctx* ctx, struct evt_core_fdinfo*
|
||||||
|
|
||||||
fdinfo_n.fd = dup(fdinfo->fd);
|
fdinfo_n.fd = dup(fdinfo->fd);
|
||||||
fdinfo_n.cat->name = "tcp-read";
|
fdinfo_n.cat->name = "tcp-read";
|
||||||
fdinfo_n.other = create_measure_conf (mctx->count, mctx->size);
|
|
||||||
fdinfo_n.free_other = free_mesure_conf;
|
|
||||||
sprintf(fdinfo_n.url, "tcp:read:%s:%d", s5ctx->addr, s5ctx->port);
|
sprintf(fdinfo_n.url, "tcp:read:%s:%d", s5ctx->addr, s5ctx->port);
|
||||||
|
|
||||||
evt_core_add_fd (ctx, &fdinfo_n);
|
evt_core_add_fd (ctx, &fdinfo_n);
|
||||||
printf("--- Tor socket registered\n");
|
printf("--- Tor socket registered\n");
|
||||||
|
|
||||||
register_timer(ctx, fdinfo->fd, mctx->interval, mctx->count, mctx->size);
|
register_timer(ctx, NULL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spawn_tor_socket(struct evt_core_ctx* evts) {
|
void spawn_tor_client(struct evt_core_ctx* evts) {
|
||||||
struct evt_core_cat* ucat = evt_core_get_from_cat (evts, "tcp-read");
|
struct evt_core_cat* ucat = evt_core_get_from_cat (evts, "tcp-read");
|
||||||
if (ucat == NULL) {
|
if (ucat == NULL) {
|
||||||
fprintf(stderr, "Category udp-read not found\n");
|
fprintf(stderr, "Category udp-read not found\n");
|
||||||
|
@ -212,11 +212,12 @@ void spawn_tor_socket(struct evt_core_ctx* evts) {
|
||||||
struct measlat_ctx* mctx = ucat->app_ctx;
|
struct measlat_ctx* mctx = ucat->app_ctx;
|
||||||
|
|
||||||
socks5_create_dns_client (evts, "127.0.0.1", "9050", mctx->host, atoi(mctx->port));
|
socks5_create_dns_client (evts, "127.0.0.1", "9050", mctx->host, atoi(mctx->port));
|
||||||
|
printf("--- Tor client SOCKS started\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int on_socks5_failed_measlat(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
int on_socks5_failed_measlat(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
evt_core_rm_fd (ctx, fdinfo->fd);
|
evt_core_rm_fd (ctx, fdinfo->fd);
|
||||||
spawn_tor_socket(ctx);
|
spawn_tor_client(ctx);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -231,18 +232,24 @@ void register_categories(struct evt_core_ctx* evts, struct measlat_ctx* mctx) {
|
||||||
template.flags = EPOLLIN | EPOLLET;
|
template.flags = EPOLLIN | EPOLLET;
|
||||||
evt_core_add_cat(evts, &template);
|
evt_core_add_cat(evts, &template);
|
||||||
|
|
||||||
template.cb = on_udp; // intended but not elegant
|
template.cb = on_receive_measure_packet; // intended but not elegant
|
||||||
template.err_cb = on_udp_err; // intended but not elegant
|
template.err_cb = NULL; // intended but not elegant
|
||||||
template.name = "tcp-read";
|
template.name = "tcp-read";
|
||||||
template.flags = EPOLLIN | EPOLLET;
|
template.flags = EPOLLIN | EPOLLET;
|
||||||
evt_core_add_cat(evts, &template);
|
evt_core_add_cat(evts, &template);
|
||||||
|
|
||||||
template.cb = on_udp;
|
template.cb = on_receive_measure_packet;
|
||||||
template.err_cb = on_udp_err;
|
template.err_cb = on_receive_measure_packet_err;
|
||||||
template.name = "udp-read";
|
template.name = "udp-read";
|
||||||
template.flags = EPOLLIN | EPOLLET;
|
template.flags = EPOLLIN | EPOLLET;
|
||||||
evt_core_add_cat(evts, &template);
|
evt_core_add_cat(evts, &template);
|
||||||
|
|
||||||
|
template.cb = on_tcp_co;
|
||||||
|
template.err_cb = NULL;
|
||||||
|
template.name = "tcp-co";
|
||||||
|
template.flags = EPOLLIN | EPOLLET;
|
||||||
|
evt_core_add_cat(evts, &template);
|
||||||
|
|
||||||
template.cb = on_socks5_success_measlat;
|
template.cb = on_socks5_success_measlat;
|
||||||
template.err_cb = on_socks5_failed_measlat;
|
template.err_cb = on_socks5_failed_measlat;
|
||||||
template.name = "socks5-success";
|
template.name = "socks5-success";
|
||||||
|
@ -260,7 +267,7 @@ void register_categories(struct evt_core_ctx* evts, struct measlat_ctx* mctx) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void spawn_udp_socket(struct evt_core_ctx* evts) {
|
void spawn_udp_client(struct evt_core_ctx* evts) {
|
||||||
struct evt_core_cat* ucat = evt_core_get_from_cat (evts, "udp-read");
|
struct evt_core_cat* ucat = evt_core_get_from_cat (evts, "udp-read");
|
||||||
if (ucat == NULL) {
|
if (ucat == NULL) {
|
||||||
fprintf(stderr, "Category udp-read not found\n");
|
fprintf(stderr, "Category udp-read not found\n");
|
||||||
|
@ -277,13 +284,72 @@ void spawn_udp_socket(struct evt_core_ctx* evts) {
|
||||||
|
|
||||||
fdinfo.fd = udp_sock;
|
fdinfo.fd = udp_sock;
|
||||||
fdinfo.cat->name = "udp-read";
|
fdinfo.cat->name = "udp-read";
|
||||||
fdinfo.other = create_measure_conf (mctx->count, mctx->size);
|
fdinfo.other = &mctx->mc;
|
||||||
fdinfo.free_other = free_mesure_conf;
|
fdinfo.free_other = NULL;
|
||||||
sprintf(fdinfo.url, "udp:read:%s:%s", mctx->host, mctx->port);
|
sprintf(fdinfo.url, "udp:read:%s:%s", mctx->host, mctx->port);
|
||||||
evt_core_add_fd (evts, &fdinfo);
|
evt_core_add_fd (evts, &fdinfo);
|
||||||
printf("--- UDP socket registered\n");
|
printf("--- UDP client registered\n");
|
||||||
|
|
||||||
register_timer(evts, fdinfo.fd, mctx->interval, mctx->count, mctx->size);
|
register_timer(evts, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void spawn_udp_server(struct evt_core_ctx* evts) {
|
||||||
|
struct evt_core_cat* ucat = evt_core_get_from_cat (evts, "udp-read");
|
||||||
|
if (ucat == NULL) {
|
||||||
|
fprintf(stderr, "Category udp-read not found\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
struct measlat_ctx* mctx = ucat->app_ctx;
|
||||||
|
int udp_sock = create_udp_server (mctx->host, mctx->port);
|
||||||
|
|
||||||
|
char url[1024];
|
||||||
|
struct evt_core_cat cat = {0};
|
||||||
|
struct evt_core_fdinfo fdinfo = {0};
|
||||||
|
fdinfo.cat = &cat;
|
||||||
|
fdinfo.url = url;
|
||||||
|
|
||||||
|
fdinfo.fd = udp_sock;
|
||||||
|
sprintf(url, "udp:rw:127.0.0.1:%s", mctx->port);
|
||||||
|
fdinfo.cat->name = "udp-read";
|
||||||
|
evt_core_add_fd(evts, &fdinfo);
|
||||||
|
printf("--- UDP server is listening\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void spawn_tor_server(struct evt_core_ctx* evts, uint16_t *ports) {
|
||||||
|
char buffer[1024];
|
||||||
|
int tcp_serv_sock, err;
|
||||||
|
|
||||||
|
sprintf(buffer, "%d", ports[0]);
|
||||||
|
tcp_serv_sock = create_tcp_server ("0.0.0.0", buffer);
|
||||||
|
err = listen(tcp_serv_sock, SOMAXCONN);
|
||||||
|
|
||||||
|
struct evt_core_cat cat = {0};
|
||||||
|
struct evt_core_fdinfo fdinfo = {0};
|
||||||
|
fdinfo.cat = &cat;
|
||||||
|
fdinfo.url = buffer;
|
||||||
|
|
||||||
|
fdinfo.fd = tcp_serv_sock;
|
||||||
|
sprintf(buffer, "tcp:co:127.0.0.1:%d", ports[0]);
|
||||||
|
fdinfo.cat->name = "tcp-co";
|
||||||
|
evt_core_add_fd(evts, &fdinfo);
|
||||||
|
printf("--- TCP server is listening\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void measlat_create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count, enum TOR_ONION_FLAGS tof) {
|
||||||
|
tor_os_create (tos, "onion_services.pub", "onion_services.txt", ports_count);
|
||||||
|
tor_os_read (tos);
|
||||||
|
|
||||||
|
int err = 0;
|
||||||
|
err = tor_ctl_connect (tctl, "127.0.0.1", "9051");
|
||||||
|
if (err < 0) {
|
||||||
|
fprintf(stderr, "Unable to open Tor Socket\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
err = tor_ctl_add_onion (tctl, tos, ports, tof);
|
||||||
|
if (err != 0) {
|
||||||
|
fprintf(stderr, "Unable to create Onion Services (error: %d)\n", err);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
@ -295,7 +361,7 @@ int main(int argc, char** argv) {
|
||||||
struct evt_core_ctx evts = {0};
|
struct evt_core_ctx evts = {0};
|
||||||
|
|
||||||
// 1. Parse parameters
|
// 1. Parse parameters
|
||||||
while ((opt = getopt(argc, argv, "vh:p:c:s:i:t:")) != -1) {
|
while ((opt = getopt(argc, argv, "vh:p:c:s:i:t:lrn")) != -1) {
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
case 'v':
|
case 'v':
|
||||||
mctx.verbose++;
|
mctx.verbose++;
|
||||||
|
@ -306,17 +372,26 @@ int main(int argc, char** argv) {
|
||||||
case 'p': // port
|
case 'p': // port
|
||||||
mctx.port = optarg;
|
mctx.port = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
mctx.mc.is_server = 1;
|
||||||
|
break;
|
||||||
case 't': // transport
|
case 't': // transport
|
||||||
mctx.transport = optarg;
|
mctx.transport = optarg;
|
||||||
break;
|
break;
|
||||||
case 'c': // count
|
case 'c': // count
|
||||||
mctx.count = atoi(optarg);
|
mctx.mc.max_measure = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 's': // size - payload in bytes
|
case 's': // size - payload in bytes
|
||||||
mctx.size = atoi(optarg);
|
mctx.mc.payload_size = atoi(optarg);
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
mctx.mc.is_rtt = 1;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
mctx.tor_flags |= TOR_ONION_FLAG_NON_ANONYMOUS;
|
||||||
break;
|
break;
|
||||||
case 'i': // interval - every ms
|
case 'i': // interval - every ms
|
||||||
mctx.interval = atoi(optarg);
|
mctx.mc.interval = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
goto usage;
|
goto usage;
|
||||||
|
@ -324,25 +399,41 @@ int main(int argc, char** argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Check and fix parameters
|
// 2. Check and fix parameters
|
||||||
size_t header_size = sizeof(struct packet_header);
|
measure_prepare (&mctx.mc);
|
||||||
if (mctx.interval <= 0) mctx.interval = 1000;
|
mctx.addrlen = sizeof(mctx.addr);
|
||||||
if (mctx.count <= 0) mctx.count = 1;
|
|
||||||
if (mctx.size < header_size) mctx.size = header_size;
|
|
||||||
if (mctx.transport == NULL) mctx.transport = "udp";
|
if (mctx.transport == NULL) mctx.transport = "udp";
|
||||||
if (mctx.host == NULL || mctx.port == NULL) goto usage;
|
if (mctx.host == NULL) mctx.host = "127.0.0.1";
|
||||||
printf("[measlat_conf] host=%s, port=%s, transport=%s, count=%d, size=%d, interval=%d\n",
|
if (mctx.port == NULL) mctx.port = strcmp(mctx.transport, "udp") == 0 ? "9000" : "7500";
|
||||||
mctx.host, mctx.port, mctx.transport, mctx.count, mctx.size, mctx.interval);
|
printf("[measlat_conf] host=%s, port=%s, listen=%d, transport=%s, count=%ld, size=%ld, interval=%ld, is_rtt=%d\n",
|
||||||
|
mctx.host, mctx.port, mctx.mc.is_server, mctx.transport, mctx.mc.max_measure, mctx.mc.payload_size, mctx.mc.interval, mctx.mc.is_rtt);
|
||||||
|
|
||||||
// 3. Bind events
|
// 3. Bind events
|
||||||
register_categories(&evts, &mctx);
|
register_categories(&evts, &mctx);
|
||||||
if (strcmp(mctx.transport, "udp") == 0) spawn_udp_socket(&evts);
|
|
||||||
else if (strcmp(mctx.transport, "tor") == 0) spawn_tor_socket(&evts);
|
struct tor_os_str tos = {0};
|
||||||
|
struct tor_ctl tctl = {0};
|
||||||
|
uint16_t ports[] = {7500};
|
||||||
|
int ports_count = sizeof(ports) / sizeof(ports[0]);
|
||||||
|
|
||||||
|
if (mctx.mc.is_server && strcmp(mctx.transport, "udp") == 0) {
|
||||||
|
spawn_udp_server (&evts);
|
||||||
|
mctx.is_from_needed = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (mctx.mc.is_server && strcmp(mctx.transport, "tor") == 0) {
|
||||||
|
spawn_tor_server(&evts, ports);
|
||||||
|
measlat_create_onion_services (&tos, &tctl, ports, ports_count, mctx.tor_flags);
|
||||||
|
printf("--- Onion services created\n");
|
||||||
|
}
|
||||||
|
else if (strcmp(mctx.transport, "udp") == 0) spawn_udp_client(&evts);
|
||||||
|
else if (strcmp(mctx.transport, "tor") == 0) spawn_tor_client(&evts);
|
||||||
|
else exit(EXIT_FAILURE);
|
||||||
|
|
||||||
// 4. Run main loop
|
// 4. Run main loop
|
||||||
evt_core_loop(&evts);
|
evt_core_loop(&evts);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
usage:
|
usage:
|
||||||
fprintf(stderr, "Usage: %s -h <host> -p <port> [-t <udp|tor>] [-c <count>] [-i <ms>] [-s <bytes>]\n", argv[0]);
|
fprintf(stderr, "Usage: %s -h <host> -p <port> [-l] [-r] [-t <udp|tor>] [-c <count>] [-i <ms>] [-s <bytes>]\n", argv[0]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
93
src/measure.c
Normal file
93
src/measure.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
#include "measure.h"
|
||||||
|
#define ONE_SEC 1000000000L
|
||||||
|
|
||||||
|
void measure_parse(int size, struct measure_conf* mc) {
|
||||||
|
struct timespec curr;
|
||||||
|
uint64_t micro_sec;
|
||||||
|
if (size != mc->payload_size) {
|
||||||
|
perror("read error");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
struct measure_packet* head = (struct measure_packet*) mc->payload;
|
||||||
|
if (clock_gettime(CLOCK_REALTIME, &curr) == -1){
|
||||||
|
perror("clock_gettime error");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
time_t now;
|
||||||
|
time(&now);
|
||||||
|
char* ctime_no_newline = strtok(ctime(&now), "\n");
|
||||||
|
|
||||||
|
micro_sec = elapsed_micros (&head->emit_time, &curr);
|
||||||
|
printf("[%s] Packet %llu latency %luµs\n", ctime_no_newline, (unsigned long long)head->counter, micro_sec);
|
||||||
|
|
||||||
|
if (!mc->is_server && head->counter >= mc->max_measure) {
|
||||||
|
printf("Measurement done\n");
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void measure_prepare(struct measure_conf* mc) {
|
||||||
|
if (mc->interval <= 0) mc->interval = 1000;
|
||||||
|
if (mc->max_measure <= 0) mc->max_measure = 1;
|
||||||
|
if (mc->payload_size < sizeof(struct measure_packet)) mc->payload_size = sizeof(struct measure_packet);
|
||||||
|
|
||||||
|
if ((mc->payload = malloc(sizeof(char) * mc->payload_size)) == NULL) {
|
||||||
|
perror("payload malloc failed");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
memset(mc->payload, 0, mc->payload_size);
|
||||||
|
|
||||||
|
char *my_msg = "Tu n'es pas tout a fait la misere,\nCar les levres les plus pauvres te denoncent\nPar un sourire.";
|
||||||
|
size_t msg_len = strlen(my_msg);
|
||||||
|
size_t cursor_msg = 0;
|
||||||
|
for (size_t i = sizeof(struct measure_packet); i < mc->payload_size; i++) {
|
||||||
|
mc->payload[i] = my_msg[cursor_msg];
|
||||||
|
cursor_msg = (cursor_msg + 1) % msg_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
struct measure_packet* measure_generate(struct measure_conf* mc) {
|
||||||
|
struct measure_packet* head = (struct measure_packet*)mc->payload;
|
||||||
|
mc->counter++;
|
||||||
|
|
||||||
|
head->counter = mc->counter;
|
||||||
|
head->is_echo = mc->is_rtt && !mc->is_server;
|
||||||
|
if (clock_gettime(CLOCK_REALTIME, &head->emit_time) == -1) {
|
||||||
|
perror("clock_gettime error");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t timespec_gt(struct timespec *t1, struct timespec *t2) {
|
||||||
|
return t1->tv_sec > t2->tv_sec || (t1->tv_sec == t2->tv_sec && t1->tv_nsec > t2->tv_nsec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void measure_next_tick(struct measure_conf *mc, struct timespec *next) {
|
||||||
|
struct measure_packet *head = (struct measure_packet*) mc->payload;
|
||||||
|
struct timespec now, *sent_at = &head->emit_time;
|
||||||
|
mc->counter = head->counter;
|
||||||
|
|
||||||
|
if (clock_gettime(CLOCK_REALTIME, &now) == -1) {
|
||||||
|
perror("clock_gettime error");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
memcpy(next, sent_at, sizeof(struct timespec));
|
||||||
|
|
||||||
|
while(!timespec_gt (next, &now)) {
|
||||||
|
next->tv_nsec += mc->interval * 1000000L;
|
||||||
|
if (next->tv_nsec > ONE_SEC) {
|
||||||
|
next->tv_sec += next->tv_nsec / ONE_SEC;
|
||||||
|
next->tv_nsec = next->tv_nsec % ONE_SEC;
|
||||||
|
}
|
||||||
|
mc->counter++;
|
||||||
|
}
|
||||||
|
mc->counter--;
|
||||||
|
printf("interval: %ld\n", mc->interval);
|
||||||
|
printf("sent_at: sec=%ld nsec=%ld \n", (uint64_t) sent_at->tv_sec, (uint64_t) sent_at->tv_nsec);
|
||||||
|
printf("now: sec=%ld nsec=%ld \n", (uint64_t) now.tv_sec, (uint64_t) now.tv_nsec);
|
||||||
|
printf("next: sec=%ld nsec=%ld \n", (uint64_t) next->tv_sec, (uint64_t) next->tv_nsec);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t measure_need_reply(struct measure_conf* mc) {
|
||||||
|
return mc->is_server && ((struct measure_packet*)mc->payload)->is_echo;
|
||||||
|
};
|
28
src/measure.h
Normal file
28
src/measure.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#pragma once
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
struct measure_conf {
|
||||||
|
uint64_t max_measure;
|
||||||
|
uint64_t payload_size;
|
||||||
|
uint64_t interval;
|
||||||
|
char* payload;
|
||||||
|
uint64_t counter;
|
||||||
|
uint8_t is_server, is_rtt;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct measure_packet {
|
||||||
|
uint64_t counter;
|
||||||
|
uint8_t is_echo;
|
||||||
|
struct timespec emit_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
void measure_parse(int size, struct measure_conf* mc);
|
||||||
|
void measure_prepare(struct measure_conf* mc);
|
||||||
|
struct measure_packet* measure_generate(struct measure_conf* mc);
|
||||||
|
uint8_t measure_need_reply(struct measure_conf* mc);
|
||||||
|
void measure_next_tick(struct measure_conf *mc, struct timespec *next);
|
|
@ -6,6 +6,12 @@
|
||||||
#include "evt_core.h"
|
#include "evt_core.h"
|
||||||
#include "net_tools.h"
|
#include "net_tools.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
|
#include "measure.h"
|
||||||
|
|
||||||
|
struct torecho_ctx {
|
||||||
|
uint8_t is_measlat;
|
||||||
|
struct measure_conf mc;
|
||||||
|
};
|
||||||
|
|
||||||
void te_create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count, enum TOR_ONION_FLAGS tof) {
|
void te_create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count, enum TOR_ONION_FLAGS tof) {
|
||||||
tor_os_create (tos, "onion_services.pub", "onion_services.txt", ports_count);
|
tor_os_create (tos, "onion_services.pub", "onion_services.txt", ports_count);
|
||||||
|
@ -55,21 +61,23 @@ co_error:
|
||||||
}
|
}
|
||||||
|
|
||||||
int te_on_tcp(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
int te_on_tcp(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
char buffer[1500];
|
|
||||||
ssize_t nread, nwritten;
|
ssize_t nread, nwritten;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
socklen_t addrlen = sizeof(addr);
|
socklen_t addrlen = sizeof(addr);
|
||||||
|
struct torecho_ctx *tctx = fdinfo->cat->app_ctx;
|
||||||
|
|
||||||
nread = recv(fdinfo->fd, buffer, sizeof(buffer), 0);
|
nread = recv(fdinfo->fd, tctx->mc.payload, tctx->mc.payload_size, 0);
|
||||||
if (nread == -1 && errno == EAGAIN) return 1; // Read done
|
if (nread == -1 && errno == EAGAIN) return 1; // Read done
|
||||||
if (nread == 0) { fprintf(stderr, "WARN! Read 0 bytes.\n"); return 1; }
|
if (nread == 0) { fprintf(stderr, "WARN! Read 0 bytes.\n"); return 1; }
|
||||||
if (nread < 0 || nread > sizeof(buffer)) {
|
if (nread < 0 || nread > tctx->mc.payload_size) {
|
||||||
fprintf(stderr, "Message is either truncated or an error occured. nread=%ld\n", nread);
|
fprintf(stderr, "Message is either truncated or an error occured. nread=%ld, expected=%ld\n", nread, tctx->mc.payload_size);
|
||||||
perror("read errno");
|
perror("read errno");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
nwritten = send(fdinfo->fd, buffer, nread, 0);
|
if (tctx->is_measlat) measure_parse (nread, &tctx->mc);
|
||||||
|
|
||||||
|
nwritten = send(fdinfo->fd, tctx->mc.payload, nread, 0);
|
||||||
// @FIXME don't support EAGAIN on write. Could be intended, you don't think so?
|
// @FIXME don't support EAGAIN on write. Could be intended, you don't think so?
|
||||||
if (nwritten != nread) {
|
if (nwritten != nread) {
|
||||||
fprintf(stderr, "Didn't write the same number of bytes as read - not supported. nread=%ld, nwritten=%ld\n", nread, nwritten);
|
fprintf(stderr, "Didn't write the same number of bytes as read - not supported. nread=%ld, nwritten=%ld\n", nread, nwritten);
|
||||||
|
@ -91,13 +99,21 @@ int main(int argc, char** argv) {
|
||||||
struct tor_ctl tctl;
|
struct tor_ctl tctl;
|
||||||
enum TOR_ONION_FLAGS tof = TOR_ONION_FLAG_NONE;
|
enum TOR_ONION_FLAGS tof = TOR_ONION_FLAG_NONE;
|
||||||
char url[1024];
|
char url[1024];
|
||||||
|
struct torecho_ctx tctx = {0};
|
||||||
|
tctx.mc.is_server = 1;
|
||||||
|
tctx.mc.payload_size = 1500;
|
||||||
|
|
||||||
|
while ((opt = getopt(argc, argv, "ns:m")) != -1) {
|
||||||
while ((opt = getopt(argc, argv, "n")) != -1) {
|
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
case 'n':
|
case 'n':
|
||||||
tof |= TOR_ONION_FLAG_NON_ANONYMOUS;
|
tof |= TOR_ONION_FLAG_NON_ANONYMOUS;
|
||||||
break;
|
break;
|
||||||
|
case 'm':
|
||||||
|
tctx.is_measlat = 1;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
tctx.mc.payload_size = atoi(optarg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -105,7 +121,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
// 1. Register categories
|
// 1. Register categories
|
||||||
struct evt_core_cat tcp_co = {
|
struct evt_core_cat tcp_co = {
|
||||||
.app_ctx = NULL,
|
.app_ctx = &tctx,
|
||||||
.free_app_ctx = NULL,
|
.free_app_ctx = NULL,
|
||||||
.cb = te_on_tcp_co,
|
.cb = te_on_tcp_co,
|
||||||
.err_cb = NULL,
|
.err_cb = NULL,
|
||||||
|
@ -114,7 +130,7 @@ int main(int argc, char** argv) {
|
||||||
.socklist = NULL
|
.socklist = NULL
|
||||||
};
|
};
|
||||||
struct evt_core_cat tcp_all = {
|
struct evt_core_cat tcp_all = {
|
||||||
.app_ctx = NULL,
|
.app_ctx = &tctx ,
|
||||||
.free_app_ctx = NULL,
|
.free_app_ctx = NULL,
|
||||||
.cb = te_on_tcp,
|
.cb = te_on_tcp,
|
||||||
.err_cb = NULL,
|
.err_cb = NULL,
|
||||||
|
@ -122,6 +138,8 @@ int main(int argc, char** argv) {
|
||||||
.flags = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP,
|
.flags = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP,
|
||||||
.socklist = NULL
|
.socklist = NULL
|
||||||
};
|
};
|
||||||
|
measure_prepare (&tctx.mc);
|
||||||
|
|
||||||
evt_core_init(&evts, 0);
|
evt_core_init(&evts, 0);
|
||||||
evt_core_add_cat(&evts, &tcp_co);
|
evt_core_add_cat(&evts, &tcp_co);
|
||||||
evt_core_add_cat(&evts, &tcp_all);
|
evt_core_add_cat(&evts, &tcp_all);
|
||||||
|
|
|
@ -4,22 +4,30 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "evt_core.h"
|
#include "evt_core.h"
|
||||||
#include "net_tools.h"
|
#include "net_tools.h"
|
||||||
|
#include "measure.h"
|
||||||
|
|
||||||
|
struct udpecho_ctx {
|
||||||
|
struct measure_conf mc;
|
||||||
|
uint8_t is_measlat;
|
||||||
|
};
|
||||||
|
|
||||||
int on_udp(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
int on_udp(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
char buffer[1500];
|
|
||||||
ssize_t nread, nwritten;
|
ssize_t nread, nwritten;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
socklen_t addrlen = sizeof(addr);
|
socklen_t addrlen = sizeof(addr);
|
||||||
|
struct udpecho_ctx *uctx = fdinfo->cat->app_ctx;
|
||||||
|
|
||||||
nread = recvfrom(fdinfo->fd, buffer, sizeof(buffer), MSG_TRUNC, (struct sockaddr*)&addr, &addrlen);
|
nread = recvfrom(fdinfo->fd, uctx->mc.payload, uctx->mc.payload_size, MSG_TRUNC, (struct sockaddr*)&addr, &addrlen);
|
||||||
if (nread == -1 && errno == EAGAIN) return 1; // Read done
|
if (nread == -1 && errno == EAGAIN) return 1; // Read done
|
||||||
if (nread <= 0 || nread > sizeof(buffer)) {
|
if (nread <= 0 || nread > uctx->mc.payload_size) {
|
||||||
fprintf(stderr, "Message is either truncated or an error occured. nread=%ld\n", nread);
|
fprintf(stderr, "Message is either truncated or an error occured. nread=%ld, expected=%ld\n", nread, uctx->mc.payload_size);
|
||||||
perror("read errno");
|
perror("read errno");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
nwritten = sendto(fdinfo->fd, buffer, nread, 0, (struct sockaddr*)&addr, addrlen);
|
if (uctx->is_measlat) measure_parse (nread, &uctx->mc);
|
||||||
|
|
||||||
|
nwritten = sendto(fdinfo->fd, uctx->mc.payload, nread, 0, (struct sockaddr*)&addr, addrlen);
|
||||||
// @FIXME don't support EAGAIN on write. Could be intended, you don't think so?
|
// @FIXME don't support EAGAIN on write. Could be intended, you don't think so?
|
||||||
if (nwritten != nread) {
|
if (nwritten != nread) {
|
||||||
fprintf(stderr, "Didn't write the same number of bytes as read. nread=%ld, nwritten=%ld\n", nread, nwritten);
|
fprintf(stderr, "Didn't write the same number of bytes as read. nread=%ld, nwritten=%ld\n", nread, nwritten);
|
||||||
|
@ -33,12 +41,15 @@ int main(int argc, char** argv) {
|
||||||
setvbuf(stdout, NULL, _IONBF, 0);
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
printf("~ udpecho ~\n");
|
printf("~ udpecho ~\n");
|
||||||
|
|
||||||
|
struct udpecho_ctx uctx = {0};
|
||||||
int opt, udp_sock, verbose = 0;
|
int opt, udp_sock, verbose = 0;
|
||||||
char *port = NULL, *bindhost = NULL;
|
char *port = NULL, *bindhost = NULL;
|
||||||
struct evt_core_ctx evts = {0};
|
struct evt_core_ctx evts = {0};
|
||||||
|
uctx.mc.is_server = 1;
|
||||||
|
uctx.mc.payload_size = 1500;
|
||||||
|
|
||||||
// 1. Parse parameters
|
// 1. Parse parameters
|
||||||
while ((opt = getopt(argc, argv, "b:p:v")) != -1) {
|
while ((opt = getopt(argc, argv, "b:p:vms:")) != -1) {
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose++;
|
verbose++;
|
||||||
|
@ -49,15 +60,22 @@ int main(int argc, char** argv) {
|
||||||
case 'b':
|
case 'b':
|
||||||
bindhost = optarg;
|
bindhost = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'm':
|
||||||
|
uctx.is_measlat = 1;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
uctx.mc.payload_size = atoi(optarg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
goto usage;
|
goto usage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bindhost == NULL) bindhost = "127.0.0.1";
|
if (bindhost == NULL) bindhost = "127.0.0.1";
|
||||||
|
measure_prepare (&uctx.mc);
|
||||||
|
|
||||||
// 2. Register category
|
// 2. Register category
|
||||||
struct evt_core_cat udp_read = {
|
struct evt_core_cat udp_read = {
|
||||||
.app_ctx = NULL,
|
.app_ctx = &uctx,
|
||||||
.free_app_ctx = NULL,
|
.free_app_ctx = NULL,
|
||||||
.cb = on_udp,
|
.cb = on_udp,
|
||||||
.err_cb = NULL,
|
.err_cb = NULL,
|
||||||
|
|
Loading…
Reference in a new issue