tor_multipath_voip/src/capture_traffic.c

66 lines
1.6 KiB
C
Raw Normal View History

2019-05-27 15:32:00 +00:00
#include "capture_traffic.h"
2019-05-28 09:45:20 +00:00
void dynbuf_init(struct dynbuf* db) {
db->content = malloc(MEGABYTE);
if (db->content == NULL) {
perror("malloc dynbuf failed");
exit(EXIT_FAILURE);
}
db->written = 0;
db->alloced = MEGABYTE;
}
void dynbuf_check_alloc(struct dynbuf* db, size_t len) {
if (db->written + len > db->alloced) {
size_t new_alloced = db->written + len > 2 * db->alloced ? db->written + len : 2 * db->alloced;
db->content = realloc(db->content, new_alloced);
if (db->content == NULL) {
perror("realloc dynbuf failed");
exit(EXIT_FAILURE);
}
db->alloced = new_alloced;
}
}
void dynbuf_append(struct dynbuf* db, char* ptr, size_t len) {
dynbuf_check_alloc(db, len);
memcpy(db->content + db->written, ptr, len);
db->written += len;
}
2019-05-27 16:14:21 +00:00
void traffic_capture_init(struct capture_ctx* ctx, char* filename) {
ctx->activated = filename == NULL ? 0 : 1;
if (!ctx->activated) return;
2019-05-27 15:32:00 +00:00
2019-05-27 16:14:21 +00:00
ctx->filename = strdup(filename);
2019-05-28 09:45:20 +00:00
dynbuf_init (&ctx->in);
dynbuf_init (&ctx->out);
}
void traffic_capture_notify(struct capture_ctx* ctx, struct buffer_packet *bp, char* dest) {
if (!ctx->activated) return;
if (clock_gettime(CLOCK_MONOTONIC, &bp->seen) == -1){
perror("clock_gettime error");
exit(EXIT_FAILURE);
}
dynbuf_append (
strcmp(dest, "in") == 0 ? &ctx->in : &ctx->out,
(char*)&bp,
sizeof(struct buffer_packet) - sizeof(struct internet_packet) + bp->ip.ap.fmt.headers.size);
2019-05-27 15:32:00 +00:00
}
2019-05-27 16:14:21 +00:00
void traffic_capture_stop(struct capture_ctx* ctx) {
if (!ctx->activated) return;
2019-05-27 15:32:00 +00:00
2019-05-27 16:14:21 +00:00
FILE* fd = NULL;
if ((fd = fopen(ctx->filename, "w")) == NULL) {
}
free(ctx->filename);
2019-05-27 15:32:00 +00:00
}