diff --git a/monitor/analyze.c b/monitor/analyze.c
index b4a7cf7..db02619 100644
--- a/monitor/analyze.c
+++ b/monitor/analyze.c
TV_MSEC(conn->tx_l.med));
print_field("%u-%u octets (~%u octets) TX packet size",
conn->tx_pkt_min, conn->tx_pkt_max, conn->tx_pkt_med);
+ print_field("~%lld Kb/s TX transfer speed",
+ conn->tx_bytes * 8 / TV_MSEC(conn->tx_l.total));
plot_draw(conn->plot);
diff --git a/monitor/packet.c b/monitor/packet.c
index fb469cd..84af03a 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
void packet_latency_add(struct packet_latency *latency, struct timeval *delta)
{
+ timeradd(&latency->total, delta, &latency->total);
+
if ((!timerisset(&latency->min) || timercmp(delta, &latency->min, <))
&& delta->tv_sec >= 0 && delta->tv_usec >= 0)
latency->min = *delta;
static void packet_dequeue_tx(struct timeval *tv, uint16_t handle)
{
struct packet_conn_data *conn;
- struct timeval *tx;
+ struct packet_frame *frame;
struct timeval delta;
conn = packet_get_conn_data(handle);
if (!conn)
return;
- tx = queue_pop_head(conn->tx_q);
- if (!tx)
+ frame = queue_pop_head(conn->tx_q);
+ if (!frame)
return;
- timersub(tv, tx, &delta);
+ timersub(tv, &frame->tv, &delta);
packet_latency_add(&conn->tx_l, &delta);
+ print_field("#%zu: len %zu (%lld Kb/s)", frame->num, frame->len,
+ frame->len * 8 / TV_MSEC(delta));
print_field("Latency: %lld msec (%lld-%lld msec ~%lld msec)",
TV_MSEC(delta), TV_MSEC(conn->tx_l.min),
TV_MSEC(conn->tx_l.max), TV_MSEC(conn->tx_l.med));
l2cap_dequeue_frame(&delta, conn);
- free(tx);
+ free(frame);
}
static void num_completed_packets_evt(struct timeval *tv, uint16_t index,
event_data->func(tv, index, data, hdr->plen);
}
-static void packet_queue_tx(struct timeval *tv, uint16_t handle)
+static void packet_enqueue_tx(struct timeval *tv, uint16_t handle,
+ size_t num, uint16_t len)
{
struct packet_conn_data *conn;
- struct timeval *tx;
+ struct packet_frame *frame;
conn = packet_get_conn_data(handle);
if (!conn)
if (!conn->tx_q)
conn->tx_q = queue_new();
- tx = new0(struct timeval, 1);
- memcpy(tx, tv, sizeof(*tv));
- queue_push_tail(conn->tx_q, tx);
+ frame = new0(struct packet_frame, 1);
+ if (tv)
+ memcpy(&frame->tv, tv, sizeof(*tv));
+ frame->num = num;
+ frame->len = len;
+ queue_push_tail(conn->tx_q, frame);
}
void packet_hci_acldata(struct timeval *tv, struct ucred *cred, uint16_t index,
handle_str, extra_str);
if (!in)
- packet_queue_tx(tv, acl_handle(handle));
+ packet_enqueue_tx(tv, acl_handle(handle),
+ index_list[index].frame, dlen);
if (size != dlen) {
print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
handle_str, extra_str);
if (!in)
- packet_queue_tx(tv, acl_handle(handle));
+ packet_enqueue_tx(tv, acl_handle(handle),
+ index_list[index].frame, hdr->dlen);
if (size != hdr->dlen) {
print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
handle_str, extra_str);
if (!in)
- packet_queue_tx(tv, acl_handle(handle));
+ packet_enqueue_tx(tv, acl_handle(handle),
+ index_list[index].frame, hdr->dlen);
if (size != hdr->dlen) {
print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
diff --git a/monitor/packet.h b/monitor/packet.h
index 12cb68d..750ce40 100644
--- a/monitor/packet.h
+++ b/monitor/packet.h
#define TV_MSEC(_tv) (long long)((_tv).tv_sec * 1000 + (_tv).tv_usec / 1000)
struct packet_latency {
+ struct timeval total;
struct timeval min;
struct timeval max;
struct timeval med;
};
+struct packet_frame {
+ struct timeval tv;
+ size_t num;
+ size_t len;
+};
+
struct packet_conn_data {
uint16_t index;
uint8_t src[6];