Reworked measlat
This commit is contained in:
parent
bb57457257
commit
7538d2d9e9
1 changed files with 49 additions and 11 deletions
|
@ -10,12 +10,14 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "measure.h"
|
#include "measure.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
|
#include "tor_os.h"
|
||||||
|
#include "tor_ctl.h"
|
||||||
|
|
||||||
struct measlat_ctx {
|
struct measlat_ctx {
|
||||||
struct measure_conf mc;
|
struct measure_conf mc;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
int verbose, is_timer_started, is_from_needed;
|
int verbose, is_timer_started, is_from_needed, tor_flags;
|
||||||
char *host, *port, *transport;
|
char *host, *port, *transport;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,9 +74,9 @@ int on_receive_measure_packet(struct evt_core_ctx* ctx, struct evt_core_fdinfo*
|
||||||
struct measlat_ctx* mctx = fdinfo->cat->app_ctx;
|
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);
|
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, MSG_TRUNC);
|
else nread = recv(fdinfo->fd, mctx->mc.payload, mctx->mc.payload_size, 0);
|
||||||
|
|
||||||
if (nread == -1 && errno == EAGAIN) return 1;
|
if ((nread == -1 && errno == EAGAIN) || nread == 0) return 1;
|
||||||
// @FIXME logic is wrong for TCP here but would lead (hopefully) to a crash
|
// @FIXME logic is wrong for TCP here but would lead (hopefully) to a crash
|
||||||
|
|
||||||
// First we parse the packet and exit if needed
|
// First we parse the packet and exit if needed
|
||||||
|
@ -153,11 +155,15 @@ int on_timer(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct measure_packet* head = measure_generate(&mctx->mc);
|
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");
|
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) tgtinfo = evt_core_get_first_from_cat (ctx, "tcp-read");
|
||||||
if (tgtinfo == NULL) {
|
if (tgtinfo == NULL) {
|
||||||
printf("No connection yet\n");
|
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;
|
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);
|
if (mctx->is_from_needed) s = sendto(tgtinfo->fd, mctx->mc.payload, mctx->mc.payload_size, 0, (struct sockaddr*)&mctx->addr, mctx->addrlen);
|
||||||
|
@ -227,7 +233,7 @@ void register_categories(struct evt_core_ctx* evts, struct measlat_ctx* mctx) {
|
||||||
evt_core_add_cat(evts, &template);
|
evt_core_add_cat(evts, &template);
|
||||||
|
|
||||||
template.cb = on_receive_measure_packet; // intended but not elegant
|
template.cb = on_receive_measure_packet; // intended but not elegant
|
||||||
template.err_cb = on_receive_measure_packet_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);
|
||||||
|
@ -309,8 +315,7 @@ void spawn_udp_server(struct evt_core_ctx* evts) {
|
||||||
printf("--- UDP server is listening\n");
|
printf("--- UDP server is listening\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void spawn_tor_server(struct evt_core_ctx* evts) {
|
void spawn_tor_server(struct evt_core_ctx* evts, uint16_t *ports) {
|
||||||
uint16_t ports[] = {7500};
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
int tcp_serv_sock, err;
|
int tcp_serv_sock, err;
|
||||||
|
|
||||||
|
@ -330,6 +335,23 @@ void spawn_tor_server(struct evt_core_ctx* evts) {
|
||||||
printf("--- TCP server is listening\n");
|
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) {
|
||||||
setvbuf(stdout, NULL, _IONBF, 0);
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
printf("~ measlat ~\n");
|
printf("~ measlat ~\n");
|
||||||
|
@ -339,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:lr")) != -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++;
|
||||||
|
@ -365,6 +387,9 @@ int main(int argc, char** argv) {
|
||||||
case 'r':
|
case 'r':
|
||||||
mctx.mc.is_rtt = 1;
|
mctx.mc.is_rtt = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'n':
|
||||||
|
mctx.tor_flags |= TOR_ONION_FLAG_NON_ANONYMOUS;
|
||||||
|
break;
|
||||||
case 'i': // interval - every ms
|
case 'i': // interval - every ms
|
||||||
mctx.mc.interval = atoi(optarg);
|
mctx.mc.interval = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
@ -379,14 +404,27 @@ int main(int argc, char** argv) {
|
||||||
if (mctx.transport == NULL) mctx.transport = "udp";
|
if (mctx.transport == NULL) mctx.transport = "udp";
|
||||||
if (mctx.host == NULL) mctx.host = "127.0.0.1";
|
if (mctx.host == NULL) mctx.host = "127.0.0.1";
|
||||||
if (mctx.port == NULL) mctx.port = strcmp(mctx.transport, "udp") == 0 ? "9000" : "7500";
|
if (mctx.port == NULL) mctx.port = strcmp(mctx.transport, "udp") == 0 ? "9000" : "7500";
|
||||||
printf("[measlat_conf] host=%s, port=%s, listen=%d, transport=%s, count=%ld, size=%ld, interval=%ld\n",
|
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.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 (mctx.mc.is_server && strcmp(mctx.transport, "udp") == 0) { spawn_udp_server (&evts); mctx.is_from_needed = 1; }
|
struct tor_os_str tos = {0};
|
||||||
else if (mctx.mc.is_server && strcmp(mctx.transport, "tor") == 0) spawn_tor_server(&evts);
|
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, "udp") == 0) spawn_udp_client(&evts);
|
||||||
else if (strcmp(mctx.transport, "tor") == 0) spawn_tor_client(&evts);
|
else if (strcmp(mctx.transport, "tor") == 0) spawn_tor_client(&evts);
|
||||||
else exit(EXIT_FAILURE);
|
else exit(EXIT_FAILURE);
|
||||||
|
|
Loading…
Reference in a new issue