fix(netbios): Return interface address for NetBIOS name lookup (#9885)
* fix(netbios): Return interface address for NetBIOS When NetBIOS returns a match, it should return the IP address of the device. Presently, however, it returns the address of multicast IP for the subnet since the incoming NBNS packet's UDP target will be multicast (i.e. 192.168.1.255). Iterate over the active network interfaces and check netmasks to determine where the packet came from, and return the appropriate IP interface address instead. * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
This commit is contained in:
parent
76b6ff6500
commit
6b223391c1
1 changed files with 13 additions and 1 deletions
|
|
@ -1,5 +1,8 @@
|
|||
#include "NetBIOS.h"
|
||||
#include <functional>
|
||||
extern "C" {
|
||||
#include <lwip/netif.h>
|
||||
}; // extern "C"
|
||||
|
||||
#define NBNS_PORT 137
|
||||
#define NBNS_MAX_HOSTNAME_LEN 32
|
||||
|
|
@ -91,7 +94,16 @@ void NetBIOS::_onPacket(AsyncUDPPacket &packet) {
|
|||
append_32((void *)&nbnsa.ttl, 300000);
|
||||
append_16((void *)&nbnsa.data_len, 6);
|
||||
append_16((void *)&nbnsa.flags, 0);
|
||||
nbnsa.addr = packet.localIP();
|
||||
nbnsa.addr = packet.localIP(); // By default, should be overridden below
|
||||
// Iterate over all netifs, see if the incoming address matches one of the netmaskes networks
|
||||
for (auto netif = netif_list; netif; netif = netif->next) {
|
||||
auto maskedip = ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif));
|
||||
auto maskedin = ((uint32_t)packet.localIP()) & ip4_addr_get_u32(netif_ip4_netmask(netif));
|
||||
if (maskedip == maskedin) {
|
||||
nbnsa.addr = ip4_addr_get_u32(netif_ip4_addr(netif));
|
||||
break;
|
||||
}
|
||||
}
|
||||
_udp.writeTo((uint8_t *)&nbnsa, sizeof(nbnsa), packet.remoteIP(), NBNS_PORT);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue