int intf_get_src(intf_t *intf, struct intf_entry *entry, struct addr *src) { IP_ADAPTER_ADDRESSES *a; IP_ADAPTER_UNICAST_ADDRESS *addr; if (src->addr_type != ADDR_TYPE_IP) { errno = EINVAL; return (-1); } if (_refresh_tables(intf) < 0) return (-1); for (a = intf->iftable; a != NULL; a = a->Next) { for (addr = a->FirstUnicastAddress; addr != NULL; addr = addr->Next) { struct addr dnet_addr; addr_ston(addr->Address.lpSockaddr, &dnet_addr); if (addr_cmp(&dnet_addr, src) == 0) { _adapter_address_to_entry(intf, a, entry); return (0); } } } errno = ENXIO; return (-1); }
int intf_get_src(intf_t *intf, struct intf_entry *entry, struct addr *src) { MIB_IFROW ifrow; MIB_IPADDRROW *iprow; int i; if (src->addr_type != ADDR_TYPE_IP) { errno = EINVAL; return (-1); } if (_refresh_tables(intf) < 0) return (-1); for (i = 0; i < (int)intf->iptable->dwNumEntries; i++) { iprow = &intf->iptable->table[i]; if (iprow->dwAddr == src->addr_ip) { ifrow.dwIndex = iprow->dwIndex; if (GetIfEntry(&ifrow) != NO_ERROR) return (-1); _ifrow_to_entry(intf, &ifrow, entry); return (0); } } errno = ENXIO; return (-1); }
/* Converts a libdnet interface name to its pcap equivalent. The pcap name is stored in pcapdev up to a length of pcapdevlen, including the terminating '\0'. Returns -1 on error. */ int intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen) { IP_ADAPTER_ADDRESSES *a; pcap_if_t *pcapdevs; pcap_if_t *pdev, *selected; intf_t *intf; if ((intf = intf_open()) == NULL) return (-1); if (_refresh_tables(intf) < 0) { intf_close(intf); return (-1); } a = _find_adapter_address(intf, intf_name); if (a == NULL) { intf_close(intf); return (-1); } if (pcap_findalldevs(&pcapdevs, NULL) == -1) { intf_close(intf); return (-1); } /* Loop through all the pcap devices until we find a match. */ selected = NULL; for (pdev = pcapdevs; pdev != NULL; pdev = pdev->next) { char *name; if (pdev->name == NULL) continue; name = strchr(pdev->name, '{'); if (name == NULL) continue; if (strcmp(name, a->AdapterName) == 0) break; } if (pdev != NULL) strlcpy(pcapdev, pdev->name, pcapdevlen); intf_close(intf); pcap_freealldevs(pcapdevs); if (pdev == NULL) return -1; else return 0; }
/* Look up an interface from an index, such as a sockaddr_in6.sin6_scope_id. */ int intf_get_index(intf_t *intf, struct intf_entry *entry, int af, unsigned int index) { IP_ADAPTER_ADDRESSES *a; if (_refresh_tables(intf) < 0) return (-1); a = _find_adapter_address_by_index(intf, af, index); if (a == NULL) return (-1); _adapter_address_to_entry(intf, a, entry); return (0); }
int intf_get(intf_t *intf, struct intf_entry *entry) { IP_ADAPTER_ADDRESSES *a; if (_refresh_tables(intf) < 0) return (-1); a = _find_adapter_address(intf, entry->intf_name); if (a == NULL) return (-1); _adapter_address_to_entry(intf, a, entry); return (0); }
/* XXX - gross hack required by eth-win32:eth_open() */ const char * intf_get_desc(intf_t *intf, const char *name) { static char desc[MAXLEN_IFDESCR + 1]; MIB_IFROW ifrow; if (_refresh_tables(intf) < 0) return (NULL); ifrow.dwIndex = _find_ifindex(intf, name); if (GetIfEntry(&ifrow) != NO_ERROR) return (NULL); return (desc); }
int intf_get(intf_t *intf, struct intf_entry *entry) { MIB_IFROW ifrow; if (_refresh_tables(intf) < 0) return (-1); ifrow.dwIndex = _find_ifindex(intf, entry->intf_name); if (GetIfEntry(&ifrow) != NO_ERROR) return (-1); _ifrow_to_entry(intf, &ifrow, entry); return (0); }
int intf_loop(intf_t *intf, intf_handler callback, void *arg) { struct intf_entry *entry; u_char ebuf[1024]; int i, ret = 0; if (_refresh_tables(intf) < 0) return (-1); entry = (struct intf_entry *)ebuf; for (i = 0; i < (int)intf->iftable->dwNumEntries; i++) { entry->intf_len = sizeof(ebuf); _ifrow_to_entry(intf, &intf->iftable->table[i], entry); if ((ret = (*callback)(entry, arg)) != 0) break; } return (ret); }
int intf_loop(intf_t *intf, intf_handler callback, void *arg) { IP_ADAPTER_ADDRESSES *a; struct intf_entry *entry; u_char ebuf[1024]; int ret; if (_refresh_tables(intf) < 0) return (-1); entry = (struct intf_entry *)ebuf; for (a = intf->iftable; a != NULL; a = a->Next) { entry->intf_len = sizeof(ebuf); _adapter_address_to_entry(intf, a, entry); if ((ret = (*callback)(entry, arg)) != 0) break; } return (ret); }
int intf_get_dst(intf_t *intf, struct intf_entry *entry, struct addr *dst) { MIB_IFROW ifrow; if (dst->addr_type != ADDR_TYPE_IP) { errno = EINVAL; return (-1); } if (GetBestInterface(dst->addr_ip, &ifrow.dwIndex) != NO_ERROR) return (-1); if (GetIfEntry(&ifrow) != NO_ERROR) return (-1); if (_refresh_tables(intf) < 0) return (-1); _ifrow_to_entry(intf, &ifrow, entry); return (0); }