diff --git a/mavlink.c b/mavlink.c
index 24d05f3a..5b53ecb4 100644
--- a/mavlink.c
+++ b/mavlink.c
@@ -204,11 +204,6 @@ int mavlink_heartbeat(unsigned char *frame,int *outlen)
return 0;
}
-extern unsigned long long last_rssi_time;
-extern int last_radio_rssi;
-extern int last_radio_temperature;
-extern int last_radio_rxpackets;
-
static int parse_heartbeat(struct overlay_interface *interface, const unsigned char *payload)
{
if (payload[0]==0xFE
@@ -218,9 +213,8 @@ static int parse_heartbeat(struct overlay_interface *interface, const unsigned c
&& payload[5]==MAVLINK_MSG_ID_RADIO){
// we can assume that radio status packets arrive without corruption
- last_radio_rssi=(1.0*payload[10]-payload[13])/1.9;
- last_radio_temperature=-999; // doesn't get reported
- last_radio_rxpackets=-999; // doesn't get reported
+ interface->radio_rssi=(1.0*payload[10]-payload[13])/1.9;
+ interface->remote_rssi=(1.0*payload[11] - payload[14])/1.9;
int free_space = payload[12];
int free_bytes = (free_space * 1280) / 100 - 30;
interface->remaining_space = free_bytes;
@@ -228,12 +222,11 @@ static int parse_heartbeat(struct overlay_interface *interface, const unsigned c
interface->next_tx_allowed = gettime_ms();
if (free_bytes>720)
interface->next_heartbeat=gettime_ms()+1000;
- if (config.debug.mavlink||gettime_ms()-last_rssi_time>30000) {
+ if (config.debug.packetradio) {
INFOF("Link budget = %+ddB, remote link budget = %+ddB, buffer space = %d%% (approx %d)",
- last_radio_rssi,
- (int)((1.0*payload[11] - payload[14])/1.9),
+ interface->radio_rssi,
+ interface->remote_rssi,
free_space, free_bytes);
- last_rssi_time=gettime_ms();
}
return 1;
}
diff --git a/overlay_interface.c b/overlay_interface.c
index f711df5d..ef356b52 100644
--- a/overlay_interface.c
+++ b/overlay_interface.c
@@ -63,6 +63,54 @@ overlay_interface_close(overlay_interface *interface){
interface->state=INTERFACE_STATE_DOWN;
}
+void interface_state_html(struct strbuf *b, struct overlay_interface *interface)
+{
+ switch(interface->state){
+ case INTERFACE_STATE_UP:
+ strbuf_sprintf(b, "Interface %s is Up
", interface->name);
+ break;
+ default:
+ strbuf_puts(b, "Interface Down");
+ return;
+ }
+ switch(interface->type){
+ case OVERLAY_INTERFACE_PACKETRADIO:
+ strbuf_puts(b, "Type: Packet Radio
");
+ strbuf_sprintf(b, "RSSI: %ddB
",interface->radio_rssi);
+ strbuf_sprintf(b, "Remote RSSI: %ddB
",interface->remote_rssi);
+ break;
+ case OVERLAY_INTERFACE_ETHERNET:
+ strbuf_puts(b, "Type: Ethernet
");
+ break;
+ case OVERLAY_INTERFACE_WIFI:
+ strbuf_puts(b, "Type: Wifi
");
+ break;
+ default:
+ case OVERLAY_INTERFACE_UNKNOWN:
+ strbuf_puts(b, "Type: Unknown
");
+ }
+ switch(interface->socket_type){
+ case SOCK_STREAM:
+ strbuf_puts(b, "Socket: Stream
");
+ break;
+ case SOCK_DGRAM:
+ {
+ char addrtxt[INET_ADDRSTRLEN];
+ strbuf_puts(b, "Socket: DGram
");
+ if (inet_ntop(AF_INET, (const void *)&interface->address.sin_addr, addrtxt, INET_ADDRSTRLEN))
+ strbuf_sprintf(b, "Address: %s:%d
", addrtxt, ntohs(interface->address.sin_port));
+ if (inet_ntop(AF_INET, (const void *)&interface->destination->address.sin_addr, addrtxt, INET_ADDRSTRLEN))
+ strbuf_sprintf(b, "Broadcast Address: %s:%d
", addrtxt, ntohs(interface->destination->address.sin_port));
+ }
+ break;
+ case SOCK_FILE:
+ strbuf_puts(b, "Socket: File
");
+ break;
+ }
+ strbuf_sprintf(b, "TX: %d
", interface->tx_count);
+ strbuf_sprintf(b, "RX: %d
", interface->recv_count);
+}
+
// create a socket with options common to all our UDP sockets
static int
overlay_bind_socket(const struct sockaddr *addr, size_t addr_size, char *interface_name){
@@ -230,7 +278,6 @@ overlay_interface_read_any(struct sched_ent *alarm){
DEBUGF("Could not find matching interface for packet received from %s", inet_ntoa(src));
return;
}
-
packetOkOverlay(interface, packet, plen, recvttl, &src_addr, addrlen);
}
if (alarm->poll.revents & (POLLHUP | POLLERR)) {
@@ -374,6 +421,8 @@ overlay_interface_init(const char *name, struct in_addr src_addr, struct in_addr
interface->state=INTERFACE_STATE_DOWN;
interface->alarm.poll.fd=0;
interface->debug = ifconfig->debug;
+ interface->tx_count=0;
+ interface->recv_count=0;
// How often do we announce ourselves on this interface?
int tick_ms=-1;
@@ -655,8 +704,6 @@ static void interface_read_stream(struct overlay_interface *interface){
OUT();
return;
}
- if (config.debug.packetradio)
- dump("read bytes", buffer, nread);
struct slip_decode_state *state=&interface->slip_decode_state;
int i;
@@ -681,14 +728,12 @@ static void write_stream_buffer(overlay_interface *interface){
// Queue a hearbeat now
mavlink_heartbeat(interface->txbuffer,&interface->tx_bytes_pending);
if (config.debug.packetradio)
- DEBUGF("Built %d byte heartbeat", interface->tx_bytes_pending);
+ DEBUGF("Sending heartbeat");
interface->next_heartbeat = now+1000;
}else if(interface->tx_packet && interface->remaining_space >= 256 + 8+9){
// prepare a new link layer packet in txbuffer
if (mavlink_encode_packet(interface))
break;
- if (config.debug.packetradio)
- DEBUGF("Built %d byte payload from packet (%d)", interface->tx_bytes_pending, interface->remaining_space);
if (interface->remaining_space - interface->tx_bytes_pending < 256 + 8+9)
interface->next_heartbeat = now;
}
@@ -703,8 +748,6 @@ static void write_stream_buffer(overlay_interface *interface){
if (bytes<=0)
break;
- if (config.debug.packetradio)
- DEBUGF("Trying to write %d bytes of %d%s", bytes, interface->tx_bytes_pending, interface->tx_packet?", pending packet":"");
int written=write(interface->alarm.poll.fd, interface->txbuffer, bytes);
if (written<=0){
DEBUGF("Blocking for POLLOUT");
@@ -720,8 +763,6 @@ static void write_stream_buffer(overlay_interface *interface){
interface->tx_bytes_pending);
DEBUGF("Partial write, %d left", interface->tx_bytes_pending);
}
- if (config.debug.packetradio)
- DEBUGF("Wrote %d bytes (%d left pending, %d remains)", written, interface->tx_bytes_pending, interface->remaining_space);
}
if (total_written>0){
@@ -867,6 +908,8 @@ int overlay_broadcast_ensemble(struct network_destination *destination, struct o
if (interface->debug)
DEBUGF("Sending on %s, len %d: %s", interface->name, len, alloca_tohex(bytes, len>64?64:len));
+ interface->tx_count++;
+
switch(interface->socket_type){
case SOCK_STREAM:
{
diff --git a/overlay_packetformats.c b/overlay_packetformats.c
index cd263b77..2dc1f87c 100644
--- a/overlay_packetformats.c
+++ b/overlay_packetformats.c
@@ -413,6 +413,7 @@ int packetOkOverlay(struct overlay_interface *interface,unsigned char *packet, s
RETURN(ret);
}
f.sender_interface = context.sender_interface;
+ interface->recv_count++;
while(ob_remaining(b)>0){
context.invalid_addresses=0;
diff --git a/rhizome_http.c b/rhizome_http.c
index 761a946f..997f3556 100644
--- a/rhizome_http.c
+++ b/rhizome_http.c
@@ -543,58 +543,71 @@ int rhizome_server_parse_http_request(rhizome_http_request *r)
if (strcmp(path, "/")==0) {
r->request_type = RHIZOME_HTTP_REQUEST_FROMBUFFER;
char temp[8192];
- snprintf(temp,8192,
- "