mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-02-17 16:10:45 +00:00
Added overall timer for main loop, minor tweaks to order and freq. of processes
This commit is contained in:
parent
b48fdb6567
commit
926d4296c4
23
lsif.c
23
lsif.c
@ -112,7 +112,7 @@ int scrapeProcNetRoute()
|
|||||||
|
|
||||||
int
|
int
|
||||||
lsif(void) {
|
lsif(void) {
|
||||||
char buf[8192], addrtxt[INET_ADDRSTRLEN], bcasttxt[INET_ADDRSTRLEN];
|
char buf[8192];
|
||||||
struct ifconf ifc;
|
struct ifconf ifc;
|
||||||
int sck, nInterfaces, ofs;
|
int sck, nInterfaces, ofs;
|
||||||
struct ifreq *ifr;
|
struct ifreq *ifr;
|
||||||
@ -165,12 +165,14 @@ lsif(void) {
|
|||||||
bcopy(&ifr->ifr_ifru.ifru_addr, &local, sizeof(local));
|
bcopy(&ifr->ifr_ifru.ifru_addr, &local, sizeof(local));
|
||||||
bcopy(&ifr->ifr_ifru.ifru_broadaddr, &broadcast ,sizeof(broadcast));
|
bcopy(&ifr->ifr_ifru.ifru_broadaddr, &broadcast ,sizeof(broadcast));
|
||||||
|
|
||||||
assert(inet_ntop(AF_INET, (const void *)&local.sin_addr, addrtxt, INET_ADDRSTRLEN) != NULL);
|
if (debug & DEBUG_OVERLAYINTERFACES) {
|
||||||
assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, bcasttxt, INET_ADDRSTRLEN) != NULL);
|
char addrtxt[INET_ADDRSTRLEN], bcasttxt[INET_ADDRSTRLEN];
|
||||||
|
assert(inet_ntop(AF_INET, (const void *)&local.sin_addr, addrtxt, INET_ADDRSTRLEN) != NULL);
|
||||||
if (debug & DEBUG_OVERLAYINTERFACES) INFOF("name=%s addr=%s, broad=%s\n",
|
assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, bcasttxt, INET_ADDRSTRLEN) != NULL);
|
||||||
|
INFOF("name=%s addr=%s, broad=%s\n",
|
||||||
ifr->ifr_name,
|
ifr->ifr_name,
|
||||||
addrtxt, bcasttxt);
|
addrtxt, bcasttxt);
|
||||||
|
}
|
||||||
overlay_interface_register(ifr->ifr_name, local, broadcast);
|
overlay_interface_register(ifr->ifr_name, local, broadcast);
|
||||||
nInterfaces++;
|
nInterfaces++;
|
||||||
}
|
}
|
||||||
@ -187,7 +189,6 @@ lsif(void) {
|
|||||||
int
|
int
|
||||||
doifaddrs(void) {
|
doifaddrs(void) {
|
||||||
struct ifaddrs *ifaddr, *ifa;
|
struct ifaddrs *ifaddr, *ifa;
|
||||||
char addrtxt[INET_ADDRSTRLEN], bcasttxt[INET_ADDRSTRLEN];
|
|
||||||
char *name;
|
char *name;
|
||||||
struct sockaddr_in local, netmask, broadcast;
|
struct sockaddr_in local, netmask, broadcast;
|
||||||
|
|
||||||
@ -217,10 +218,12 @@ doifaddrs(void) {
|
|||||||
/* Compute broadcast address */
|
/* Compute broadcast address */
|
||||||
broadcast.sin_addr.s_addr |= (~netmask.sin_addr.s_addr);
|
broadcast.sin_addr.s_addr |= (~netmask.sin_addr.s_addr);
|
||||||
|
|
||||||
assert(inet_ntop(AF_INET, (const void *)&local.sin_addr, addrtxt, INET_ADDRSTRLEN) != NULL);
|
if (debug & DEBUG_OVERLAYINTERFACES){
|
||||||
assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, bcasttxt, INET_ADDRSTRLEN) != NULL);
|
char addrtxt[INET_ADDRSTRLEN], bcasttxt[INET_ADDRSTRLEN];
|
||||||
|
assert(inet_ntop(AF_INET, (const void *)&local.sin_addr, addrtxt, INET_ADDRSTRLEN) != NULL);
|
||||||
if (debug & DEBUG_OVERLAYINTERFACES) INFOF("name=%s addr=%s broad=%s", name, addrtxt, bcasttxt);
|
assert(inet_ntop(AF_INET, (const void *)&broadcast.sin_addr, bcasttxt, INET_ADDRSTRLEN) != NULL);
|
||||||
|
INFOF("name=%s addr=%s broad=%s", name, addrtxt, bcasttxt);
|
||||||
|
}
|
||||||
|
|
||||||
overlay_interface_register(name,local,broadcast);
|
overlay_interface_register(name,local,broadcast);
|
||||||
}
|
}
|
||||||
|
90
overlay.c
90
overlay.c
@ -88,7 +88,7 @@ void _TIMING_CHECK(const char *file,const char *func,int line)
|
|||||||
{
|
{
|
||||||
long long now=overlay_gettime_ms();
|
long long now=overlay_gettime_ms();
|
||||||
if (last_valid) {
|
if (last_valid) {
|
||||||
if (now-last_time>5) {
|
if (now-last_time>10) {
|
||||||
// More than 5ms spent in a given task, complain
|
// More than 5ms spent in a given task, complain
|
||||||
char msg[1024];
|
char msg[1024];
|
||||||
snprintf(msg,1024,"Spent %lldms between %s:%d in %s() and here",
|
snprintf(msg,1024,"Spent %lldms between %s:%d in %s() and here",
|
||||||
@ -104,6 +104,19 @@ void _TIMING_CHECK(const char *file,const char *func,int line)
|
|||||||
last_time=now;
|
last_time=now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long long last_loop_time=0;
|
||||||
|
void LOOP_END()
|
||||||
|
{
|
||||||
|
long long now = overlay_gettime_ms();
|
||||||
|
if (last_loop_time!=0 && now - last_loop_time>15){
|
||||||
|
DEBUGF("Last loop took %lldms",now - last_loop_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LOOP_START()
|
||||||
|
{
|
||||||
|
last_loop_time = overlay_gettime_ms();
|
||||||
|
}
|
||||||
|
|
||||||
int overlayMode=0;
|
int overlayMode=0;
|
||||||
|
|
||||||
@ -146,6 +159,7 @@ int overlayServerMode()
|
|||||||
|
|
||||||
struct pollfd fds[128];
|
struct pollfd fds[128];
|
||||||
int fdcount;
|
int fdcount;
|
||||||
|
int r;
|
||||||
|
|
||||||
/* Create structures to use 1MB of RAM for testing */
|
/* Create structures to use 1MB of RAM for testing */
|
||||||
overlay_route_init(1);
|
overlay_route_init(1);
|
||||||
@ -213,26 +227,31 @@ int overlayServerMode()
|
|||||||
int vomp_tick_time=vomp_tick_interval();
|
int vomp_tick_time=vomp_tick_interval();
|
||||||
if (ms>vomp_tick_time) ms=vomp_tick_time;
|
if (ms>vomp_tick_time) ms=vomp_tick_time;
|
||||||
|
|
||||||
TIMING_CHECK();
|
LOOP_END();
|
||||||
if (debug&DEBUG_VERBOSE_IO)
|
|
||||||
DEBUGF("Waiting via poll() for up to %lldms", ms);
|
if (ms>0){
|
||||||
TIMING_PAUSE();
|
TIMING_CHECK();
|
||||||
int r = poll(fds, fdcount, ms);
|
if (debug&DEBUG_VERBOSE_IO)
|
||||||
TIMING_CHECK();
|
DEBUGF("Waiting via poll() for up to %lldms", ms);
|
||||||
if (r == -1)
|
TIMING_PAUSE();
|
||||||
WHY_perror("poll");
|
|
||||||
else if (debug&DEBUG_VERBOSE_IO) {
|
r = poll(fds, fdcount, ms);
|
||||||
DEBUGF("poll() says %d file descriptors are ready", r);
|
|
||||||
int i;
|
TIMING_CHECK();
|
||||||
for(i=0;i<fdcount;i++)
|
if (r == -1)
|
||||||
if (fds[i].revents)
|
WHY_perror("poll");
|
||||||
DEBUGF("fd #%d is ready (0x%x)\n", fds[i].fd, fds[i].revents);
|
else if (debug&DEBUG_VERBOSE_IO) {
|
||||||
}
|
DEBUGF("poll() says %d file descriptors are ready", r);
|
||||||
/* Do high-priority audio handling first */
|
int i;
|
||||||
TIMING_CHECK();
|
for(i=0;i<fdcount;i++)
|
||||||
vomp_tick();
|
if (fds[i].revents)
|
||||||
TIMING_CHECK();
|
DEBUGF("fd #%d is ready (0x%x)\n", fds[i].fd, fds[i].revents);
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
r=0;
|
||||||
|
|
||||||
|
LOOP_START();
|
||||||
|
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
/* We have data, so try to receive it */
|
/* We have data, so try to receive it */
|
||||||
if (debug&DEBUG_IO) {
|
if (debug&DEBUG_IO) {
|
||||||
@ -257,39 +276,28 @@ int overlayServerMode()
|
|||||||
overlay_rx_messages();
|
overlay_rx_messages();
|
||||||
TIMING_CHECK();
|
TIMING_CHECK();
|
||||||
if (rhizome_enabled()) {
|
if (rhizome_enabled()) {
|
||||||
TIMING_CHECK();
|
|
||||||
rhizome_server_poll();
|
rhizome_server_poll();
|
||||||
TIMING_CHECK();
|
TIMING_CHECK();
|
||||||
rhizome_fetch_poll();
|
rhizome_fetch_poll();
|
||||||
TIMING_CHECK();
|
TIMING_CHECK();
|
||||||
overlay_mdp_poll();
|
|
||||||
TIMING_CHECK();
|
|
||||||
monitor_poll();
|
|
||||||
TIMING_CHECK();
|
|
||||||
}
|
}
|
||||||
|
overlay_mdp_poll();
|
||||||
|
TIMING_CHECK();
|
||||||
|
monitor_poll();
|
||||||
|
TIMING_CHECK();
|
||||||
} else {
|
} else {
|
||||||
/* No data before tick occurred, so do nothing.
|
/* No data before tick occurred, so do nothing.
|
||||||
Well, for now let's just check anyway. */
|
Well, for now let's just check anyway. */
|
||||||
if (debug&DEBUG_IO) fprintf(stderr,"poll() timeout.\n");
|
if (debug&DEBUG_IO) fprintf(stderr,"poll() timeout.\n");
|
||||||
|
|
||||||
|
/* Do high-priority audio handling first */
|
||||||
TIMING_CHECK();
|
TIMING_CHECK();
|
||||||
overlay_rx_messages();
|
vomp_tick();
|
||||||
|
TIMING_CHECK();
|
||||||
|
/* Check if we need to trigger any ticks on any interfaces */
|
||||||
|
overlay_check_ticks();
|
||||||
TIMING_CHECK();
|
TIMING_CHECK();
|
||||||
if (rhizome_enabled()) {
|
|
||||||
TIMING_CHECK();
|
|
||||||
rhizome_server_poll();
|
|
||||||
TIMING_CHECK();
|
|
||||||
rhizome_fetch_poll();
|
|
||||||
TIMING_CHECK();
|
|
||||||
overlay_mdp_poll();
|
|
||||||
TIMING_CHECK();
|
|
||||||
monitor_poll();
|
|
||||||
TIMING_CHECK();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
TIMING_CHECK();
|
|
||||||
/* Check if we need to trigger any ticks on any interfaces */
|
|
||||||
overlay_check_ticks();
|
|
||||||
TIMING_CHECK();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -291,105 +291,91 @@ int overlay_interface_init(char *name,struct sockaddr_in src_addr,struct sockadd
|
|||||||
int overlay_rx_messages()
|
int overlay_rx_messages()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Grab packets, unpackage and dispatch frames to consumers */
|
/* Grab packets, unpackage and dispatch frames to consumers */
|
||||||
/* XXX Okay, so how are we managing out-of-process consumers?
|
/* XXX Okay, so how are we managing out-of-process consumers?
|
||||||
They need some way to register their interest in listening to a port.
|
They need some way to register their interest in listening to a port.
|
||||||
*/
|
*/
|
||||||
unsigned char packet[16384];
|
unsigned char packet[16384];
|
||||||
int plen=0;
|
int plen=0;
|
||||||
int c[OVERLAY_MAX_INTERFACES];
|
|
||||||
int count=0;
|
|
||||||
|
|
||||||
/* Look at all interfaces */
|
/* Grab one packet from each interface in round-robin fashion */
|
||||||
for(i=0;i<overlay_interface_count;i++) { c[i]=(overlay_interfaces[i].observed>0); count+=c[i]; }
|
for(i=0;i<overlay_interface_count;i++)
|
||||||
|
{
|
||||||
/* Grab packets from interfaces in round-robin fashion until all have been grabbed,
|
struct sockaddr src_addr;
|
||||||
or until we have spent too long (maybe 10ms?) */
|
unsigned int addrlen=sizeof(src_addr);
|
||||||
int now = overlay_gettime_ms();
|
unsigned char transaction_id[8];
|
||||||
while(count>0)
|
|
||||||
{
|
overlay_last_interface_number=i;
|
||||||
for(i=0;i<overlay_interface_count;i++)
|
|
||||||
|
/* Set socket non-blocking before we try to read from it */
|
||||||
|
fcntl(overlay_interfaces[i].fd, F_SETFL,
|
||||||
|
fcntl(overlay_interfaces[i].fd, F_GETFL, NULL)|O_NONBLOCK);
|
||||||
|
|
||||||
|
if (overlay_interfaces[i].fileP) {
|
||||||
|
/* Read from dummy interface file */
|
||||||
|
long long length=lseek(overlay_interfaces[i].fd,0,SEEK_END);
|
||||||
|
if (overlay_interfaces[i].offset>=length)
|
||||||
|
{
|
||||||
|
if (debug&DEBUG_OVERLAYINTERFACES)
|
||||||
|
fprintf(stderr,"At end of input on dummy interface #%d\n",i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lseek(overlay_interfaces[i].fd,overlay_interfaces[i].offset,SEEK_SET);
|
||||||
|
if (debug&DEBUG_OVERLAYINTERFACES)
|
||||||
|
fprintf(stderr,"Reading from interface #%d log at offset %d, end of file at %lld.\n",i,
|
||||||
|
overlay_interfaces[i].offset,length);
|
||||||
|
if (read(overlay_interfaces[i].fd,&packet[0],2048)==2048)
|
||||||
{
|
{
|
||||||
struct sockaddr src_addr;
|
overlay_interfaces[i].offset+=2048;
|
||||||
unsigned int addrlen=sizeof(src_addr);
|
plen=2048-128;
|
||||||
unsigned char transaction_id[8];
|
plen=packet[110]+(packet[111]<<8);
|
||||||
|
if (plen>(2048-128)) plen=-1;
|
||||||
overlay_last_interface_number=i;
|
if (debug&DEBUG_PACKETRX) {
|
||||||
|
fflush(stdout);
|
||||||
/* Set socket non-blocking before we try to read from it */
|
serval_packetvisualise(stderr,
|
||||||
fcntl(overlay_interfaces[i].fd, F_SETFL,
|
"Read from dummy interface",
|
||||||
fcntl(overlay_interfaces[i].fd, F_GETFL, NULL)|O_NONBLOCK);
|
&packet[128],plen);
|
||||||
|
fflush(stderr);
|
||||||
if (overlay_interfaces[i].fileP) {
|
|
||||||
/* Read from dummy interface file */
|
|
||||||
long long length=lseek(overlay_interfaces[i].fd,0,SEEK_END);
|
|
||||||
if (overlay_interfaces[i].offset>=length)
|
|
||||||
{
|
|
||||||
if (debug&DEBUG_OVERLAYINTERFACES)
|
|
||||||
fprintf(stderr,"At end of input on dummy interface #%d\n",i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lseek(overlay_interfaces[i].fd,overlay_interfaces[i].offset,SEEK_SET);
|
|
||||||
if (debug&DEBUG_OVERLAYINTERFACES)
|
|
||||||
fprintf(stderr,"Reading from interface #%d log at offset %d, end of file at %lld.\n",i,
|
|
||||||
overlay_interfaces[i].offset,length);
|
|
||||||
if (read(overlay_interfaces[i].fd,&packet[0],2048)==2048)
|
|
||||||
{
|
|
||||||
overlay_interfaces[i].offset+=2048;
|
|
||||||
plen=2048-128;
|
|
||||||
plen=packet[110]+(packet[111]<<8);
|
|
||||||
if (plen>(2048-128)) plen=-1;
|
|
||||||
if (debug&DEBUG_PACKETRX) {
|
|
||||||
fflush(stdout);
|
|
||||||
serval_packetvisualise(stderr,
|
|
||||||
"Read from dummy interface",
|
|
||||||
&packet[128],plen);
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
bzero(&transaction_id[0],8);
|
|
||||||
bzero(&src_addr,sizeof(src_addr));
|
|
||||||
if ((plen>=0)&&(packet[0]==0x01)&&!(packet[1]|packet[2]|packet[3])) {
|
|
||||||
{ if (packetOk(i,&packet[128],plen,transaction_id,
|
|
||||||
-1 /* fake TTL */,
|
|
||||||
&src_addr,addrlen,1))
|
|
||||||
WHY("Malformed or unsupported packet from dummy interface (packetOK() failed)"); } }
|
|
||||||
else WHY("Invalid packet version in dummy interface");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (debug&DEBUG_IO) fprintf(stderr,"Read NOTHING from dummy interface\n");
|
|
||||||
c[i]=0; count--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Read from UDP socket */
|
|
||||||
int recvttl=1;
|
|
||||||
plen=recvwithttl(overlay_interfaces[i].fd,packet,sizeof(packet),
|
|
||||||
&recvttl,&src_addr,&addrlen);
|
|
||||||
if (plen<0) {
|
|
||||||
c[i]=0; count--;
|
|
||||||
} else {
|
|
||||||
/* We have a frame from this interface */
|
|
||||||
if (debug&DEBUG_PACKETRX) {
|
|
||||||
fflush(stdout);
|
|
||||||
serval_packetvisualise(stderr,"Read from real interface",
|
|
||||||
packet,plen);
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
if (debug&DEBUG_OVERLAYINTERFACES)fprintf(stderr,"Received %d bytes on interface #%d (%s)\n",plen,i,overlay_interfaces[i].name);
|
|
||||||
|
|
||||||
if (packetOk(i,packet,plen,NULL,recvttl,&src_addr,addrlen,1)) {
|
|
||||||
WHY("Malformed packet");
|
|
||||||
serval_packetvisualise(stderr,"Malformed packet", packet,plen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
bzero(&transaction_id[0],8);
|
||||||
|
bzero(&src_addr,sizeof(src_addr));
|
||||||
|
if ((plen>=0)&&(packet[0]==0x01)&&!(packet[1]|packet[2]|packet[3])) {
|
||||||
|
{ if (packetOk(i,&packet[128],plen,transaction_id,
|
||||||
|
-1 /* fake TTL */,
|
||||||
|
&src_addr,addrlen,1))
|
||||||
|
WHY("Malformed or unsupported packet from dummy interface (packetOK() failed)"); } }
|
||||||
|
else WHY("Invalid packet version in dummy interface");
|
||||||
}
|
}
|
||||||
/* Don't sit here forever, or else we will never send any packets */
|
else {
|
||||||
if (overlay_gettime_ms()>(now+10)) break;
|
if (debug&DEBUG_IO) fprintf(stderr,"Read NOTHING from dummy interface\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Read from UDP socket */
|
||||||
|
int recvttl=1;
|
||||||
|
plen=recvwithttl(overlay_interfaces[i].fd,packet,sizeof(packet),
|
||||||
|
&recvttl,&src_addr,&addrlen);
|
||||||
|
if (plen>=0) {
|
||||||
|
/* We have a frame from this interface */
|
||||||
|
if (debug&DEBUG_PACKETRX) {
|
||||||
|
fflush(stdout);
|
||||||
|
serval_packetvisualise(stderr,"Read from real interface",
|
||||||
|
packet,plen);
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
if (debug&DEBUG_OVERLAYINTERFACES)
|
||||||
|
fprintf(stderr,"Received %d bytes on interface #%d (%s)\n",plen,i,overlay_interfaces[i].name);
|
||||||
|
|
||||||
|
if (packetOk(i,packet,plen,NULL,recvttl,&src_addr,addrlen,1)) {
|
||||||
|
WHY("Malformed packet");
|
||||||
|
serval_packetvisualise(stderr,"Malformed packet", packet,plen);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user