summaryrefslogtreecommitdiff
path: root/toxav
diff options
context:
space:
mode:
Diffstat (limited to 'toxav')
-rw-r--r--toxav/bwcontroller.c50
-rw-r--r--toxav/bwcontroller.h6
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
42typedef 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
51typedef struct BWCRcvPkt {
52 uint32_t packet_length_array[BWC_AVG_PKT_COUNT];
53 RingBuffer *rb;
54} BWCRcvPkt;
55
42struct BWController_s { 56struct 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 {
71int bwc_handle_data(Messenger *m, uint32_t friendnumber, const uint8_t *data, uint16_t length, void *object); 75int bwc_handle_data(Messenger *m, uint32_t friendnumber, const uint8_t *data, uint16_t length, void *object);
72void send_update(BWController *bwc); 76void send_update(BWController *bwc);
73 77
74BWController *bwc_new(Messenger *m, uint32_t friendnumber, 78BWController *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
25typedef struct BWController_s BWController; 25typedef struct BWController_s BWController;
26 26
27BWController *bwc_new(Messenger *m, uint32_t friendnumber, 27typedef 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); 29BWController *bwc_new(Messenger *m, uint32_t friendnumber, m_cb *mcb, void *mcb_user_data);
30 30
31void bwc_kill(BWController *bwc); 31void bwc_kill(BWController *bwc);
32 32