+ if(pcap_setnonblock(monitor->pcap, 1, err)==-1)
+ {
+ fprintf(stderr, "pcap_findalldevs: %s\n", err);
+ return -1;
+ }
+
+ monitor->n_addresses = 0;
+ monitor->addresses = NULL;
+ for(pcap_if_t *d=devs; d; d=d->next)
+ for(pcap_addr_t *a=d->addresses; a; a=a->next)
+ if(a->addr->sa_family==AF_INET || a->addr->sa_family==AF_INET6)
+ {
+ monitor->addresses = (Address *)realloc(monitor->addresses, (monitor->n_addresses+1)*sizeof(Address));
+ unsigned size = (a->addr->sa_family==AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in));
+ memcpy(&monitor->addresses[monitor->n_addresses].address, a->addr, size);
+ memcpy(&monitor->addresses[monitor->n_addresses].mask, a->netmask, size);
+ ++monitor->n_addresses;
+ }
+
+ pcap_freealldevs(devs);
+
+ monitor->last_receive = 0;
+ monitor->last_transmit = 0;
+ monitor->connection_status = 1;
+
+ return 0;
+}
+
+void monitor_check(Monitor *monitor, Time timestamp)
+{
+ pcap_dispatch(monitor->pcap, -1, &capture_handler, (uint8_t *)monitor);
+
+ if(monitor->last_transmit && monitor->last_receive)
+ {
+ /* If packets have been transmitted more recently than received, there
+ might be a problem */
+ if(monitor->last_transmit>monitor->last_receive)