привязка к wifi интерфейсу в linux

Я работаю над системой на базе Linux, которая имеет интерфейсы LAN и WIFI. Но мне нужно связать свою розетку только с интерфейсом Wi-Fi. Есть ли какой-нибудь общий способ узнать, какой интерфейс является Wi-Fi, чтобы я мог связать с ним свою розетку? Если нет, то могу ли я связать и получить запрос с обоих интерфейсов?

В настоящее время я привязываюсь, используя INADDR_ANY. Я знаю, как выполнить привязку к определенному интерфейсу, такому как eth0, но я не могу найти способ определить, является ли eth0 интерфейсом Wi-Fi; по крайней мере, в C. С INADDR_ANY я буду получать пакеты, отправленные на любой интерфейс, но моя отправка может попытаться отправить их через интерфейс LAN; чего я не хочу.


person ata    schedule 30.10.2012    source источник
comment
Что вы пробовали? Кроме того, на каком языке вы хотите потенциальный ответ в?   -  person Some programmer dude    schedule 30.10.2012
comment
Если вы привязываете свой сокет к INADDR_ANY или in6addr_any, он должен быть привязан ко всем доступным интерфейсам.   -  person fuz    schedule 30.10.2012
comment
@JoachimPileborg тег говорит C   -  person Jon Egeland    schedule 30.10.2012
comment
Было бы полезно, если бы люди могли только сказать, почему отрицательный голос.   -  person ata    schedule 30.10.2012
comment
Я бы apt-get source wireless-tools (или эквивалентную команду для вашего дистрибутива) и проверил исходники. ОСС ура!   -  person hyde    schedule 30.10.2012
comment
Беспроводные интерфейсы должны быть перечислены в /proc/net/wireless. Вы всегда можете просто прочитать это.   -  person Duck    schedule 30.10.2012


Ответы (1)


Этот фрагмент может помочь вам, он более сложный, чем я предполагал:

if (getifaddrs(&ifaddrs) < 0) {
my_loge(CRIT, "address detection failed");
return(0);
}

// zero
count = 0;

// unset all but CAP_HOST and CAP_ROUTER
sysinfo->cap &= (CAP_HOST|CAP_ROUTER);
sysinfo->cap_active &= (CAP_HOST|CAP_ROUTER);
// reset counter
sysinfo->physif_count = 0;

// mark all interfaces
TAILQ_FOREACH(netif, netifs, entries) {
netif->type = NETIF_OLD;
}

for (ifaddr = ifaddrs; ifaddr != NULL; ifaddr = ifaddr->ifa_next) {

// skip interfaces without addresses
if (ifaddr->ifa_addr == NULL) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}

// only handle datalink addresses
if (ifaddr->ifa_addr->sa_family != NETIF_AF)
    continue;

// prepare ifr struct
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifaddr->ifa_name, sizeof(ifr.ifr_name));


// skip non-ethernet interfaces
memcpy(&saddrll, ifaddr->ifa_addr, sizeof(saddrll));
if (saddrll.sll_hatype != ARPHRD_ETHER) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}
index = saddrll.sll_ifindex;
memcpy(&saddrdl, ifaddr->ifa_addr, sizeof(saddrdl));
if ((saddrdl.sdl_type != IFT_BRIDGE) &&
    (saddrdl.sdl_type != IFT_ETHER)) {
if (saddrdl.sdl_type != IFT_ETHER) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}
index = saddrdl.sdl_index;

// check for interfaces that are down
enabled = 0;
if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t)&ifr) >= 0)
    enabled = (ifr.ifr_flags & IFF_UP);

// detect interface type
type = netif_type(sockfd, index, ifaddr, &ifr);

if (type == NETIF_REGULAR) { 
    my_log(INFO, "found ethernet interface %s", ifaddr->ifa_name);
    sysinfo->physif_count++;
} else if (type == NETIF_WIRELESS) {
    my_log(INFO, "found wireless interface %s", ifaddr->ifa_name);
    sysinfo->cap |= CAP_WLAN;
    sysinfo->cap_active |= (enabled == 1) ? CAP_WLAN : 0;
} else if (type == NETIF_TAP) {
    my_log(INFO, "found tun/tap interface %s", ifaddr->ifa_name);
} else if (type == NETIF_BONDING) {
    my_log(INFO, "found bond interface %s", ifaddr->ifa_name);
} else if (type == NETIF_BRIDGE) {
    my_log(INFO, "found bridge interface %s", ifaddr->ifa_name);
    sysinfo->cap |= CAP_BRIDGE; 
    sysinfo->cap_active |= (enabled == 1) ? CAP_BRIDGE : 0;
} else if (type == NETIF_VLAN) {
    my_log(INFO, "found vlan interface %s", ifaddr->ifa_name);
} else if (type == NETIF_INVALID) {
    my_log(INFO, "skipping interface %s", ifaddr->ifa_name);
    continue;
}

Полный файл находится здесь: здесь

person pedr0    schedule 30.10.2012
comment
какой заголовочный файл является константой, например. NETIF_WIRELESS найден в? - person Duck; 30.10.2012
comment
возможно #include ‹linux/wireless.h› - person pedr0; 30.10.2012
comment
Не в моей системе. Я сделал grep на /usr/include, и их нигде не найти. Возможно, есть пакет, который требует установки. - person Duck; 31.10.2012