Fix some bugs
This commit is contained in:
parent
8cb871e0d2
commit
d4c0af56a4
3 changed files with 39 additions and 30 deletions
|
@ -30,6 +30,8 @@ void free_ms(void* obj) {
|
||||||
free(obj);
|
free(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct measure_state ms_transi = {0};
|
||||||
|
|
||||||
int streq(char* s1, char* s2) {
|
int streq(char* s1, char* s2) {
|
||||||
return strcmp(s1, s2) == 0;
|
return strcmp(s1, s2) == 0;
|
||||||
}
|
}
|
||||||
|
@ -118,7 +120,6 @@ void measlat_stop(
|
||||||
|
|
||||||
int on_receive_measure_packet(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
int on_receive_measure_packet(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
|
||||||
struct measlat_ctx* mctx = fdinfo->cat->app_ctx;
|
struct measlat_ctx* mctx = fdinfo->cat->app_ctx;
|
||||||
struct measure_state msbuf = {0};
|
|
||||||
struct measure_state* ms;
|
struct measure_state* ms;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
char url[255];
|
char url[255];
|
||||||
|
@ -130,38 +131,36 @@ int on_receive_measure_packet(struct evt_core_ctx* ctx, struct evt_core_fdinfo*
|
||||||
// Measurement state exists
|
// Measurement state exists
|
||||||
ms = assoc_timer->other;
|
ms = assoc_timer->other;
|
||||||
} else {
|
} else {
|
||||||
// Does not exist yet, we create it.
|
// Does not exist yet, we use a tmp stub.
|
||||||
ms = &msbuf;
|
ms = &ms_transi;
|
||||||
ms->fd = fdinfo->fd;
|
|
||||||
measure_state_init (&mctx->mp, ms);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Read data in our measurement object
|
// 2. Read data in our measurement object
|
||||||
if (ms->mp_nin >= mctx->mp.payload_size || strcmp(mctx->transport, "udp") == 0) ms->mp_nin = 0;
|
ms->mp_nin = mctx->connectionless && mctx->role == MEASLAT_SERVER ?
|
||||||
|
|
||||||
nread = mctx->connectionless && mctx->role == MEASLAT_SERVER ?
|
|
||||||
recvfrom(fdinfo->fd, ms->mp_in, mctx->mp.payload_size, MSG_TRUNC, (struct sockaddr*)&mctx->addr, &mctx->addrlen) :
|
recvfrom(fdinfo->fd, ms->mp_in, mctx->mp.payload_size, MSG_TRUNC, (struct sockaddr*)&mctx->addr, &mctx->addrlen) :
|
||||||
recv(fdinfo->fd, ms->mp_in + ms->mp_nin, mctx->mp.payload_size - ms->mp_nin, 0);
|
recv(fdinfo->fd, ms->mp_in, mctx->mp.payload_size, 0);
|
||||||
|
|
||||||
if (nread > 0) ms->mp_nin += nread;
|
if (ms->mp_nin <= 0) return 1;
|
||||||
|
|
||||||
if (nread == -1 && errno == EAGAIN || nread == 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (!streq("udp", mctx->transport) && ms->mp_nin < mctx->mp.payload_size) {
|
|
||||||
printf("Packet has been fragmented, %ld/%ld\n",ms->mp_nin, mctx->mp.payload_size);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Process data in our measurement object
|
// 3. Process data in our measurement object
|
||||||
measure_parse (&mctx->mp, ms);
|
measure_parse (&mctx->mp, ms);
|
||||||
|
|
||||||
// 4. Persist our measurement object if needed
|
// 4. Persist our measurement object if needed
|
||||||
// It includes starting a timer.
|
// It includes starting a timer.
|
||||||
if (ms == &msbuf) {
|
if (ms == &ms_transi) {
|
||||||
|
if (ms->mp_in->counter != 1) {
|
||||||
|
if (!(mctx->connectionless && mctx->role == MEASLAT_SERVER))
|
||||||
|
evt_core_rm_fd (ctx, fdinfo->fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
struct timespec next_tick = {0};
|
struct timespec next_tick = {0};
|
||||||
measure_next_tick(&mctx->mp, ms, &next_tick);
|
struct measure_state ms_new = {0};
|
||||||
assoc_timer = register_timer (ctx, mctx, ms, &next_tick);
|
measure_state_init(&mctx->mp, &ms_new);
|
||||||
|
ms_new.fd = fdinfo->fd;
|
||||||
|
ms_new.mp_nin = ms->mp_nin;
|
||||||
|
memcpy(ms_new.mp_in, ms->mp_in, mctx->mp.payload_size);
|
||||||
|
measure_next_tick(&mctx->mp, &ms_new, &next_tick);
|
||||||
|
assoc_timer = register_timer (ctx, mctx, &ms_new, &next_tick);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Check if our measurements are done
|
// 5. Check if our measurements are done
|
||||||
|
@ -267,8 +266,8 @@ int on_socks5_success_measlat(struct evt_core_ctx* ctx, struct evt_core_fdinfo*
|
||||||
printf("--- Tor socket registered\n");
|
printf("--- Tor socket registered\n");
|
||||||
|
|
||||||
struct measure_state ms = {0};
|
struct measure_state ms = {0};
|
||||||
ms.fd = fdinfo_n.fd;
|
|
||||||
measure_state_init (&mctx->mp, &ms);
|
measure_state_init (&mctx->mp, &ms);
|
||||||
|
ms.fd = fdinfo_n.fd;
|
||||||
register_timer (ctx, mctx, &ms, NULL);
|
register_timer (ctx, mctx, &ms, NULL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -365,8 +364,8 @@ void spawn_udp_client(struct evt_core_ctx* evts) {
|
||||||
printf("client port is %u\n", myPort);
|
printf("client port is %u\n", myPort);
|
||||||
|
|
||||||
struct measure_state ms = {0};
|
struct measure_state ms = {0};
|
||||||
ms.fd = udp_sock;
|
|
||||||
measure_state_init (&mctx->mp, &ms);
|
measure_state_init (&mctx->mp, &ms);
|
||||||
|
ms.fd = udp_sock;
|
||||||
|
|
||||||
register_timer (evts, mctx, &ms, NULL);
|
register_timer (evts, mctx, &ms, NULL);
|
||||||
}
|
}
|
||||||
|
@ -421,8 +420,8 @@ void spawn_tcp_client(struct evt_core_ctx* evts) {
|
||||||
printf("client port is %u\n", myPort);
|
printf("client port is %u\n", myPort);
|
||||||
|
|
||||||
struct measure_state ms = {0};
|
struct measure_state ms = {0};
|
||||||
ms.fd = tcp_sock;
|
|
||||||
measure_state_init (&mctx->mp, &ms);
|
measure_state_init (&mctx->mp, &ms);
|
||||||
|
ms.fd = tcp_sock;
|
||||||
|
|
||||||
register_timer (evts, mctx, &ms, NULL);
|
register_timer (evts, mctx, &ms, NULL);
|
||||||
}
|
}
|
||||||
|
@ -520,6 +519,8 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
// 2. Check and fix parameters
|
// 2. Check and fix parameters
|
||||||
measure_params_init (&mctx.mp);
|
measure_params_init (&mctx.mp);
|
||||||
|
measure_state_init (&mctx.mp, &ms_transi);
|
||||||
|
|
||||||
mctx.addrlen = sizeof(mctx.addr);
|
mctx.addrlen = sizeof(mctx.addr);
|
||||||
if (mctx.transport == NULL) mctx.transport = "udp";
|
if (mctx.transport == NULL) mctx.transport = "udp";
|
||||||
if (strcmp(mctx.transport, "udp") == 0) mctx.connectionless = 1;
|
if (strcmp(mctx.transport, "udp") == 0) mctx.connectionless = 1;
|
||||||
|
|
|
@ -8,16 +8,23 @@ void measure_params_init(struct measure_params* mp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void measure_state_init(struct measure_params* mp, struct measure_state* ms) {
|
void measure_state_init(struct measure_params* mp, struct measure_state* ms) {
|
||||||
|
ms->mp_nin = 0;
|
||||||
|
ms->fd = 0;
|
||||||
|
|
||||||
|
if (ms->mp_out == NULL) {
|
||||||
if ((ms->mp_out = malloc(sizeof(char) * mp->payload_size)) == NULL) {
|
if ((ms->mp_out = malloc(sizeof(char) * mp->payload_size)) == NULL) {
|
||||||
perror("payload malloc failed");
|
perror("payload malloc failed");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
memset(ms->mp_out, 0, mp->payload_size);
|
memset(ms->mp_out, 0, mp->payload_size);
|
||||||
|
|
||||||
|
if (ms->mp_in == NULL) {
|
||||||
if ((ms->mp_in = malloc(sizeof(char) * mp->payload_size)) == NULL) {
|
if ((ms->mp_in = malloc(sizeof(char) * mp->payload_size)) == NULL) {
|
||||||
perror("payload malloc failed");
|
perror("payload malloc failed");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
memset(ms->mp_in, 0, mp->payload_size);
|
memset(ms->mp_in, 0, mp->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.";
|
char *my_msg = "Tu n'es pas tout a fait la misere,\nCar les levres les plus pauvres te denoncent\nPar un sourire.";
|
||||||
|
|
|
@ -20,6 +20,7 @@ struct measure_state {
|
||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
struct measure_packet {
|
struct measure_packet {
|
||||||
uint64_t counter;
|
uint64_t counter;
|
||||||
uint8_t flag;
|
uint8_t flag;
|
||||||
|
|
Loading…
Reference in a new issue