diff options
Diffstat (limited to 'toxav')
-rw-r--r-- | toxav/bwcontroller.c | 50 | ||||
-rw-r--r-- | toxav/bwcontroller.h | 6 |
2 files changed, 30 insertions, 26 deletions
diff --git a/toxav/bwcontroller.c b/toxav/bwcontroller.c index 05fac704..460cf118 100644 --- a/toxav/bwcontroller.c +++ b/toxav/bwcontroller.c | |||
@@ -35,30 +35,34 @@ | |||
35 | #include "../toxcore/util.h" | 35 | #include "../toxcore/util.h" |
36 | 36 | ||
37 | #define BWC_PACKET_ID 196 | 37 | #define BWC_PACKET_ID 196 |
38 | #define BWC_SEND_INTERVAL_MS 950 /* 0.95s */ | 38 | #define BWC_SEND_INTERVAL_MS 950 // 0.95s |
39 | #define BWC_AVG_PKT_COUNT 20 | 39 | #define BWC_AVG_PKT_COUNT 20 |
40 | #define BWC_AVG_LOSS_OVER_CYCLES_COUNT 30 | 40 | #define BWC_AVG_LOSS_OVER_CYCLES_COUNT 30 |
41 | 41 | ||
42 | typedef struct BWCCycle { | ||
43 | uint32_t last_recv_timestamp; /* Last recv update time stamp */ | ||
44 | uint32_t last_sent_timestamp; /* Last sent update time stamp */ | ||
45 | uint32_t last_refresh_timestamp; /* Last refresh time stamp */ | ||
46 | |||
47 | uint32_t lost; | ||
48 | uint32_t recv; | ||
49 | } BWCCycle; | ||
50 | |||
51 | typedef struct BWCRcvPkt { | ||
52 | uint32_t packet_length_array[BWC_AVG_PKT_COUNT]; | ||
53 | RingBuffer *rb; | ||
54 | } BWCRcvPkt; | ||
55 | |||
42 | struct BWController_s { | 56 | struct BWController_s { |
43 | void (*mcb)(BWController *, uint32_t, float, void *); | 57 | m_cb *mcb; |
44 | void *mcb_data; | 58 | void *mcb_user_data; |
45 | 59 | ||
46 | Messenger *m; | 60 | Messenger *m; |
47 | uint32_t friend_number; | 61 | uint32_t friend_number; |
48 | 62 | ||
49 | struct { | 63 | BWCCycle cycle; |
50 | uint32_t last_recv_timestamp; /* Last recv update time stamp */ | ||
51 | uint32_t last_sent_timestamp; /* Last sent update time stamp */ | ||
52 | uint32_t last_refresh_timestamp; /* Last refresh time stamp */ | ||
53 | |||
54 | uint32_t lost; | ||
55 | uint32_t recv; | ||
56 | } cycle; | ||
57 | 64 | ||
58 | struct { | 65 | BWCRcvPkt rcvpkt; /* To calculate average received packet (this means split parts, not the full message!) */ |
59 | uint32_t packet_length_array[BWC_AVG_PKT_COUNT]; | ||
60 | RingBuffer *rb; | ||
61 | } rcvpkt; /* To calculate average received packet (this means split parts, not the full message!) */ | ||
62 | 66 | ||
63 | uint32_t packet_loss_counted_cycles; | 67 | uint32_t packet_loss_counted_cycles; |
64 | }; | 68 | }; |
@@ -71,24 +75,24 @@ struct BWCMessage { | |||
71 | int bwc_handle_data(Messenger *m, uint32_t friendnumber, const uint8_t *data, uint16_t length, void *object); | 75 | int bwc_handle_data(Messenger *m, uint32_t friendnumber, const uint8_t *data, uint16_t length, void *object); |
72 | void send_update(BWController *bwc); | 76 | void send_update(BWController *bwc); |
73 | 77 | ||
74 | BWController *bwc_new(Messenger *m, uint32_t friendnumber, | 78 | BWController *bwc_new(Messenger *m, uint32_t friendnumber, m_cb *mcb, void *mcb_user_data) |
75 | void (*mcb)(BWController *, uint32_t, float, void *), | ||
76 | void *udata) | ||
77 | { | 79 | { |
78 | BWController *retu = (BWController *)calloc(sizeof(struct BWController_s), 1); | 80 | BWController *retu = (BWController *)calloc(sizeof(struct BWController_s), 1); |
79 | LOGGER_DEBUG(m->log, "Creating bandwidth controller"); | 81 | LOGGER_DEBUG(m->log, "Creating bandwidth controller"); |
80 | retu->mcb = mcb; | 82 | retu->mcb = mcb; |
81 | retu->mcb_data = udata; | 83 | retu->mcb_user_data = mcb_user_data; |
82 | retu->m = m; | 84 | retu->m = m; |
83 | retu->friend_number = friendnumber; | 85 | retu->friend_number = friendnumber; |
84 | retu->cycle.last_sent_timestamp = retu->cycle.last_refresh_timestamp = current_time_monotonic(); | 86 | uint64_t now = current_time_monotonic(); |
87 | retu->cycle.last_sent_timestamp = now; | ||
88 | retu->cycle.last_refresh_timestamp = now; | ||
85 | retu->rcvpkt.rb = rb_new(BWC_AVG_PKT_COUNT); | 89 | retu->rcvpkt.rb = rb_new(BWC_AVG_PKT_COUNT); |
86 | retu->cycle.lost = 0; | 90 | retu->cycle.lost = 0; |
87 | retu->cycle.recv = 0; | 91 | retu->cycle.recv = 0; |
88 | retu->packet_loss_counted_cycles = 0; | 92 | retu->packet_loss_counted_cycles = 0; |
89 | 93 | ||
90 | /* Fill with zeros */ | 94 | /* Fill with zeros */ |
91 | for (int i = 0; i < BWC_AVG_PKT_COUNT; i++) { | 95 | for (int i = 0; i < BWC_AVG_PKT_COUNT; ++i) { |
92 | rb_write(retu->rcvpkt.rb, &retu->rcvpkt.packet_length_array[i]); | 96 | rb_write(retu->rcvpkt.rb, &retu->rcvpkt.packet_length_array[i]); |
93 | } | 97 | } |
94 | 98 | ||
@@ -126,7 +130,7 @@ void bwc_add_recv(BWController *bwc, uint32_t recv_bytes) | |||
126 | return; | 130 | return; |
127 | } | 131 | } |
128 | 132 | ||
129 | bwc->packet_loss_counted_cycles++; | 133 | ++bwc->packet_loss_counted_cycles; |
130 | bwc->cycle.recv += recv_bytes; | 134 | bwc->cycle.recv += recv_bytes; |
131 | send_update(bwc); | 135 | send_update(bwc); |
132 | } | 136 | } |
@@ -181,7 +185,7 @@ static int on_update(BWController *bwc, const struct BWCMessage *msg) | |||
181 | (((double) lost / (recv + lost)) * 100.0)); | 185 | (((double) lost / (recv + lost)) * 100.0)); |
182 | bwc->mcb(bwc, bwc->friend_number, | 186 | bwc->mcb(bwc, bwc->friend_number, |
183 | ((float) lost / (recv + lost)), | 187 | ((float) lost / (recv + lost)), |
184 | bwc->mcb_data); | 188 | bwc->mcb_user_data); |
185 | } | 189 | } |
186 | 190 | ||
187 | return 0; | 191 | return 0; |
diff --git a/toxav/bwcontroller.h b/toxav/bwcontroller.h index fdbc1746..c0e2dfc9 100644 --- a/toxav/bwcontroller.h +++ b/toxav/bwcontroller.h | |||
@@ -24,9 +24,9 @@ | |||
24 | 24 | ||
25 | typedef struct BWController_s BWController; | 25 | typedef struct BWController_s BWController; |
26 | 26 | ||
27 | BWController *bwc_new(Messenger *m, uint32_t friendnumber, | 27 | typedef void m_cb(BWController *bwc, uint32_t friend_number, float todo, void *user_data); |
28 | void (*mcb)(BWController *, uint32_t, float, void *), | 28 | |
29 | void *udata); | 29 | BWController *bwc_new(Messenger *m, uint32_t friendnumber, m_cb *mcb, void *mcb_user_data); |
30 | 30 | ||
31 | void bwc_kill(BWController *bwc); | 31 | void bwc_kill(BWController *bwc); |
32 | 32 | ||