Implement pad
This commit is contained in:
parent
9c1971af34
commit
55f7bb3eef
3 changed files with 41 additions and 18 deletions
|
@ -5,6 +5,9 @@
|
||||||
#include "proxy.h"
|
#include "proxy.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
|
// A Tor cell size is 512 bytes but handle only 498 bytes of data
|
||||||
|
#define TOR_CELL_SIZE 498
|
||||||
|
|
||||||
struct thunder_ctx {
|
struct thunder_ctx {
|
||||||
uint16_t recv_id;
|
uint16_t recv_id;
|
||||||
uint16_t emit_id;
|
uint16_t emit_id;
|
||||||
|
@ -21,7 +24,7 @@ uint64_t compute_delta(struct timespec* prev_time, uint64_t max) {
|
||||||
int secs, nsecs;
|
int secs, nsecs;
|
||||||
uint64_t mili_sec;
|
uint64_t mili_sec;
|
||||||
|
|
||||||
// 4. We compute the time difference
|
// 1. We compute the time difference
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1){
|
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1){
|
||||||
perror("clock_gettime error");
|
perror("clock_gettime error");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
@ -39,9 +42,13 @@ void prepare(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo, struct bu
|
||||||
struct algo_ctx* app_ctx = fdinfo->cat->app_ctx;
|
struct algo_ctx* app_ctx = fdinfo->cat->app_ctx;
|
||||||
struct thunder_ctx* thunderc = app_ctx->misc;
|
struct thunder_ctx* thunderc = app_ctx->misc;
|
||||||
|
|
||||||
|
// 1. Put the raw buffer in cache
|
||||||
|
thunderc->emit_id++;
|
||||||
|
uint64_t ref = 0l + thunderc->emit_id;
|
||||||
|
dup_buffer_toa (&app_ctx->br, bp, (void *)ref);
|
||||||
|
|
||||||
uint64_t delta_pkt = compute_delta(&thunderc->prev_packet_time, 200);
|
uint64_t delta_pkt = compute_delta(&thunderc->prev_packet_time, 200);
|
||||||
|
|
||||||
thunderc->emit_id++;
|
|
||||||
union abstract_packet metadata = {
|
union abstract_packet metadata = {
|
||||||
.fmt.headers.cmd = CMD_UDP_METADATA_THUNDER,
|
.fmt.headers.cmd = CMD_UDP_METADATA_THUNDER,
|
||||||
.fmt.headers.size = sizeof(metadata.fmt.headers) + sizeof(metadata.fmt.content.udp_metadata_thunder),
|
.fmt.headers.size = sizeof(metadata.fmt.headers) + sizeof(metadata.fmt.content.udp_metadata_thunder),
|
||||||
|
@ -57,18 +64,28 @@ void pad(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo, struct buffer
|
||||||
struct thunder_ctx* thunderc = app_ctx->misc;
|
struct thunder_ctx* thunderc = app_ctx->misc;
|
||||||
uint64_t ref = 0l + thunderc->emit_id;
|
uint64_t ref = 0l + thunderc->emit_id;
|
||||||
|
|
||||||
dup_buffer_toa (&app_ctx->br, bp, (void *)ref);
|
// 1. Clean old buffers
|
||||||
|
|
||||||
if (ref > 10 && get_app_buffer (&app_ctx->br, (void *)ref - 10l)) {
|
if (ref > 10 && get_app_buffer (&app_ctx->br, (void *)ref - 10l)) {
|
||||||
mv_buffer_atof (&app_ctx->br, (void *)ref - 10l);
|
mv_buffer_atof (&app_ctx->br, (void *)ref - 10l);
|
||||||
}
|
}
|
||||||
|
|
||||||
//@FIXME we must add the delta t of the current packet
|
// 2. Append abstract packets stored in our buffers
|
||||||
for (uint64_t add_ref = ref; add_ref >= 0 && get_app_buffer (&app_ctx->br, (void *)add_ref); add_ref--) {
|
uint64_t add_ref = ref;
|
||||||
struct buffer_packet *bpa = get_app_buffer (&app_ctx->br, (void *)add_ref);
|
while(1) {
|
||||||
|
if (add_ref < 1) break;
|
||||||
|
add_ref--;
|
||||||
|
struct buffer_packet *bp_iter = get_app_buffer (&app_ctx->br, (void *)add_ref);
|
||||||
|
if (bp_iter == NULL) break;
|
||||||
|
union abstract_packet *ap = buffer_first_ap (bp_iter);
|
||||||
|
if (ap->fmt.headers.cmd != CMD_UDP_ENCAPSULATED || ap->fmt.headers.flags & FLAG_READ_NEXT) {
|
||||||
|
fprintf(stderr, "Invalid buffer!\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer_full_size (bp) + ap->fmt.headers.size > TOR_CELL_SIZE - thunderc->monit_pkt_size) break;
|
||||||
|
|
||||||
|
buffer_append_ap (bp, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int schedule(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo, struct buffer_packet* bp) {
|
int schedule(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo, struct buffer_packet* bp) {
|
||||||
|
|
14
src/packet.c
14
src/packet.c
|
@ -7,8 +7,12 @@ union abstract_packet* ap_next(union abstract_packet* ap) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
union abstract_packet* buffer_first_ap(struct buffer_packet* bp) {
|
||||||
|
return (union abstract_packet*) &bp->ip;
|
||||||
|
}
|
||||||
|
|
||||||
union abstract_packet* buffer_last_ap(struct buffer_packet* bp) {
|
union abstract_packet* buffer_last_ap(struct buffer_packet* bp) {
|
||||||
union abstract_packet* ap = (union abstract_packet*) &bp->ip, *apn = NULL;
|
union abstract_packet* ap = buffer_first_ap (bp), *apn = NULL;
|
||||||
while ((apn = ap_next(ap)) != NULL) ap = apn;
|
while ((apn = ap_next(ap)) != NULL) ap = apn;
|
||||||
|
|
||||||
return ap;
|
return ap;
|
||||||
|
@ -28,7 +32,7 @@ size_t buffer_count_ap(struct buffer_packet* bp) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t get_full_size(struct buffer_packet* bp) {
|
size_t buffer_full_size(struct buffer_packet* bp) {
|
||||||
return &(buffer_free_ap (bp))->raw - &bp->ip[0];
|
return &(buffer_free_ap (bp))->raw - &bp->ip[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,8 +97,8 @@ enum FD_STATE write_packet_to_tcp(struct evt_core_fdinfo* fdinfo, struct buffer_
|
||||||
|
|
||||||
//dump_buffer_packet (bp);
|
//dump_buffer_packet (bp);
|
||||||
if (bp->mode != BP_WRITING) return FDS_ERR;
|
if (bp->mode != BP_WRITING) return FDS_ERR;
|
||||||
while (bp->awrite < get_full_size(bp)) {
|
while (bp->awrite < buffer_full_size(bp)) {
|
||||||
nwrite = send(fdinfo->fd, &(ap->raw) + bp->awrite, get_full_size(bp) - bp->awrite, 0);
|
nwrite = send(fdinfo->fd, &(ap->raw) + bp->awrite, buffer_full_size(bp) - bp->awrite, 0);
|
||||||
if (nwrite == -1 && errno == EAGAIN) return FDS_AGAIN;
|
if (nwrite == -1 && errno == EAGAIN) return FDS_AGAIN;
|
||||||
if (nwrite == -1) return FDS_ERR;
|
if (nwrite == -1) return FDS_ERR;
|
||||||
bp->awrite += nwrite;
|
bp->awrite += nwrite;
|
||||||
|
@ -190,7 +194,7 @@ enum FD_STATE read_packet_from_udp (struct evt_core_fdinfo* fdinfo, struct buffe
|
||||||
|
|
||||||
void dump_buffer_packet(struct buffer_packet* bp) {
|
void dump_buffer_packet(struct buffer_packet* bp) {
|
||||||
printf("<Buffer Packet>\n");
|
printf("<Buffer Packet>\n");
|
||||||
printf(" mode=%d, aread=%d, awrite=%d, ap_count=%d, usage=%ld/%ld\n", bp->mode, bp->aread, bp->awrite, bp->ap_count, get_full_size (bp), sizeof(bp->ip));
|
printf(" mode=%d, aread=%d, awrite=%d, ap_count=%d, usage=%ld/%ld\n", bp->mode, bp->aread, bp->awrite, bp->ap_count, buffer_full_size (bp), sizeof(bp->ip));
|
||||||
union abstract_packet* ap = (union abstract_packet*) &bp->ip;
|
union abstract_packet* ap = (union abstract_packet*) &bp->ip;
|
||||||
for (int i = 0; i < bp->ap_count; i++) {
|
for (int i = 0; i < bp->ap_count; i++) {
|
||||||
dump_abstract_packet(ap);
|
dump_abstract_packet(ap);
|
||||||
|
|
12
src/packet.h
12
src/packet.h
|
@ -32,9 +32,9 @@ enum BP_MODE {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PKT_CMD {
|
enum PKT_CMD {
|
||||||
CMD_UDP_ENCAPSULATED,
|
CMD_UDP_ENCAPSULATED = 1,
|
||||||
CMD_LINK_MONITORING_THUNDER,
|
CMD_LINK_MONITORING_THUNDER = 2,
|
||||||
CMD_UDP_METADATA_THUNDER,
|
CMD_UDP_METADATA_THUNDER = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PKT_FLAGS {
|
enum PKT_FLAGS {
|
||||||
|
@ -89,8 +89,10 @@ struct udp_target {
|
||||||
size_t get_full_size(struct buffer_packet* bp);
|
size_t get_full_size(struct buffer_packet* bp);
|
||||||
|
|
||||||
union abstract_packet* buffer_append_ap(struct buffer_packet* bp, union abstract_packet* ap);
|
union abstract_packet* buffer_append_ap(struct buffer_packet* bp, union abstract_packet* ap);
|
||||||
union abstract_packet* buffer_free_ptr(struct buffer_packet* bp);
|
union abstract_packet* buffer_free_ap(struct buffer_packet* bp);
|
||||||
union abstract_packet* buffer_last_ptr(struct buffer_packet* bp);
|
union abstract_packet* buffer_first_ap(struct buffer_packet* bp);
|
||||||
|
union abstract_packet* buffer_last_ap(struct buffer_packet* bp);
|
||||||
|
size_t buffer_full_size(struct buffer_packet* bp);
|
||||||
union abstract_packet* ap_next(union abstract_packet* ap);
|
union abstract_packet* ap_next(union abstract_packet* ap);
|
||||||
|
|
||||||
enum FD_STATE read_packet_from_tcp(struct evt_core_fdinfo* fd, struct buffer_packet* bp);
|
enum FD_STATE read_packet_from_tcp(struct evt_core_fdinfo* fd, struct buffer_packet* bp);
|
||||||
|
|
Loading…
Reference in a new issue