diff --git a/include/NetworkInterface.h b/include/NetworkInterface.h index 85b7a73e30..df323bc086 100644 --- a/include/NetworkInterface.h +++ b/include/NetworkInterface.h @@ -65,6 +65,7 @@ typedef struct { class NetworkInterface : public Checkpointable { protected: char *ifname, *ifDescription; + bpf_u_int32 ipv4_network_mask, ipv4_network; const char *customIftype; u_int8_t alertLevel, purgeRuns; u_int32_t bridge_lan_interface_id, bridge_wan_interface_id; @@ -241,10 +242,11 @@ class NetworkInterface : public Checkpointable { void checkAggregationMode(); inline void setCPUAffinity(int core_id) { cpu_affinity = core_id; }; + inline void getIPv4Address(bpf_u_int32 *a, bpf_u_int32 *m) { *a = ipv4_network, *m = ipv4_network_mask; }; virtual void startPacketPolling(); virtual void shutdown(); virtual void cleanup(); - virtual char *getScriptName() { return NULL; } + virtual char *getScriptName() { return NULL; }; virtual char *getEndpoint(u_int8_t id) { return NULL; }; virtual bool set_packet_filter(char *filter) { return(false); }; virtual void incrDrops(u_int32_t num) { ; } diff --git a/src/NetworkDiscovery.cpp b/src/NetworkDiscovery.cpp index 684a6b04bf..ecff2d5a86 100644 --- a/src/NetworkDiscovery.cpp +++ b/src/NetworkDiscovery.cpp @@ -94,7 +94,7 @@ u_int16_t NetworkDiscovery::in_cksum(u_int8_t *buf, u_int16_t buf_len, u_int32_t and Luca Peretti */ void NetworkDiscovery::arpScan(lua_State* vm) { - bpf_u_int32 maskp, netp; + bpf_u_int32 netp, maskp; u_int32_t first_ip, last_ip, host_ip, sender_ip = Utils::readIPv4(iface->get_name()); char macbuf[32], ipbuf[32], mdnsbuf[256]; u_char mdnsreply[1500]; @@ -103,20 +103,16 @@ void NetworkDiscovery::arpScan(lua_State* vm) { fd_set rset; struct timeval tv; struct pcap_pkthdr h; - char errbuf[PCAP_ERRBUF_SIZE]; int mdns_sock, max_sock = 0; ndpi_dns_packet_header *dns_h; u_int dns_query_len; struct sockaddr_in mdns_dest; - lua_newtable(vm); - if(!pd) return; - if(pcap_lookupnet(iface->get_name(), &netp, &maskp, errbuf) == -1) { - /* No IP/mask: can't do much then */ - return; - } + lua_newtable(vm); + + iface->getIPv4Address(&netp, &maskp); /* Purge existing packets */ while(pcap_next(pd, &h) != NULL) ; diff --git a/src/NetworkInterface.cpp b/src/NetworkInterface.cpp index ea816ec954..6d5a238130 100644 --- a/src/NetworkInterface.cpp +++ b/src/NetworkInterface.cpp @@ -45,7 +45,8 @@ NetworkInterface::NetworkInterface(const char *name, NDPI_PROTOCOL_BITMASK all; char _ifname[64], buf[64]; /* We need to do it as isView() is not yet initialized */ - + char pcap_error_buffer[PCAP_ERRBUF_SIZE]; + init(); customIftype = custom_interface_type, flowHashingMode = flowhashing_none; @@ -65,8 +66,6 @@ NetworkInterface::NetworkInterface(const char *name, purge_idle_flows_hosts = true; if(name == NULL) { - char pcap_error_buffer[PCAP_ERRBUF_SIZE]; - if(!help_printed) ntop->getTrace()->traceEvent(TRACE_WARNING, "No capture interface specified"); @@ -122,8 +121,14 @@ NetworkInterface::NetworkInterface(const char *name, ) ; /* Don't setup MDNS on ZC or RSS interfaces */ else { - mdns = new MDNS(this); - discovery = new NetworkDiscovery(this); + ipv4_network = ipv4_network_mask = 0; + if(pcap_lookupnet(ifname, &ipv4_network, &ipv4_network_mask, pcap_error_buffer) == -1) { + ntop->getTrace()->traceEvent(TRACE_WARNING, "Unable to read IPv4 address of %s: %s", + ifname, pcap_error_buffer); + } else { + mdns = new MDNS(this); + discovery = new NetworkDiscovery(this); + } } if(id >= 0) {