Как определить, какой драйвер используется USB-устройством WLAN - PullRequest
0 голосов
/ 26 января 2012

Коротко: есть ли способ posix, чтобы проверить, какой драйвер используется определенным устройством USB, например, с помощью ioctl()?

А теперь, зачем мне это нужно:

У меня есть приложение для сканирования WLAN (предназначенное для устройств, использующих USB-адаптеры Wlan), которое получено из iwlist и использует iwlib.

Я коротко, что делает, инициализирует сканирование примерно так:

struct iwreq wrq;
ioctl(skfd, SIOCSIWSCAN, &wrq);

Затем дождитесь результатов, которые сохраняются в wrq.u.data.pointer, а затем анализируются с использованием iw_extract_event_stream, который разбивает данные на токены struct iw_event iwe, которые содержат информацию об обнаруженных сетях.

Это фон, теперь моя настоящая проблема начинается. Чтобы получить качество сигнала, нам нужно найти токен, помеченный как IWEVQUAL, а затем прочитать значение из iwe.u.qual.qual. К сожалению, для некоторых драйверов и системных архитектур это значение всегда неверно. Поскольку по каким-то причинам я не мог / не хотел менять драйвер, мне пришлось применить какой-то обходной путь, который вычисляет качество сигнала, используя уровень сигнала:

case IWEVQUAL:
{
  const int lvl_max = (0.9) * (range.max_qual.level?range.max_qual.level : 255);
  const int lvl_min = lvl_max * 0.6; //we assume that signal below this sevel is not received
  int lvl = (iwe.u.qual.level > lvl_min)?iwe.u.qual.level : lvl_min; //however it might happen, since our assumption is very weak
  int lvl_scaled;

  (lvl > lvl_max)?(lvl=lvl_max):0;//it may also happen that actual level is higher that the max we assumed 
  lvl_scaled = ((lvl - lvl_min) * lvl_max) / (lvl_max - lvl_min);

  if(ap_info == NULL) break;
  ap_info->ubRssi = (100 * lvl_scaled) / lvl_max;
}

Как видите, это довольно грязный способ, основанный на множестве произвольных предположений, поэтому лучше использовать исходное значение из iwe.u.qual.qual, когда это возможно. Поэтому я хотел бы проверить, может ли драйвер, используемый подключенным в данный момент устройством, стандартным способом, или мне следует использовать фокус-фокус, описанный выше.

...