diff --git a/src/interface.c b/src/interface.c index d8414bf..2709d47 100644 --- a/src/interface.c +++ b/src/interface.c @@ -533,6 +533,37 @@ ipx_interface_t *ipx_interface_by_addr(addr32_t net, addr48_t node) return iface; } +/* Search for an IPX interface by associated IP subnet. + * Returns NULL if no interfaces match or on malloc failure. +*/ +ipx_interface_t *ipx_interface_by_subnet(uint32_t ipaddr) +{ + EnterCriticalSection(&interface_cache_cs); + + renew_interface_cache(); + + ipx_interface_t *iface; + + DL_FOREACH(interface_cache, iface) + { + ipx_interface_ip_t *ip; + DL_FOREACH(iface->ipaddr, ip) + { + if((ip->ipaddr & ip->netmask) == (ipaddr & ip->netmask)) + { + iface = copy_ipx_interface(iface); + goto DONE; + } + } + } + + DONE: + + LeaveCriticalSection(&interface_cache_cs); + + return iface; +} + /* Search for an IPX interface by index. * Returns NULL if the interface doesn't exist or malloc failure. */ diff --git a/src/interface.h b/src/interface.h index 741ebe4..537f72c 100644 --- a/src/interface.h +++ b/src/interface.h @@ -67,6 +67,7 @@ void ipx_interfaces_cleanup(void); ipx_interface_t *get_ipx_interfaces(void); ipx_interface_t *ipx_interface_by_addr(addr32_t net, addr48_t node); +ipx_interface_t *ipx_interface_by_subnet(uint32_t ipaddr); ipx_interface_t *ipx_interface_by_index(int index); int ipx_interface_count(void);