2011-08-23 12 views
11

Ci sono così tante strutture nel driver wireless Linux mac80211. Cose come struct net_device, struct ieee80211_hw, struct ieee80211_vif e struct ieee80211_local e così via. Tante strutture che non capisco quali informazioni contengono e quando sono state inizializzate.Come imparare la struttura dei driver wireless Linux (mac80211)?

Come posso conoscerli e l'intera architettura dei driver wireless?

+2

Ciao, benvenuto in stackoverflow. Le buone domande, che ottengono buone risposte, di solito hanno una domanda più ristretta e più specifica di quella che hai chiesto qui, che è molto ampia e aperta. – Flexo

+1

Il meglio che posso veramente suggerire da questa domanda è la lettura della fonte (http://lxr.linux.no/#linux+v3.0.3/ è molto utile), in agguato su alcune delle mailing list (http: // linuxwireless .org/it/developers/MailingLists) e provare alcuni dei tuoi cambiamenti. Se sei in grado di farlo e poi poni una domanda più specifica, penso che otterrai risposte molto migliori. – Flexo

risposta

36

Si consiglia di controllare (mac80211 manutentore) di Johannes Berg scivola qui: http://wireless.kernel.org/en/developers/Documentation/mac80211?action=AttachFile&do=get&target=mac80211.pdf

Essi possono essere un po 'datato, ma dovrebbe darvi un punto di partenza.

Una descrizione di alto livello del kernel di Linux WiFi stack:

  1. E 'importante capire che ci sono 2 percorsi in cui userspace comunica con il kernel, quando si parla di WiFi:
    • Percorso dati: i dati ricevuti vengono passati dal driver wireless al core netdev (di solito utilizzando netif_rx()). Da lì il net core lo passerà attraverso il codice stack TCP/IP e lo accoderà ai socket rilevanti dai quali il processo userspace lo leggerà. Sul percorso Tx i pacchetti verranno inviati dal core netdev al driver wireless utilizzando la richiamata ndo_start_xmit(). Il driver registra (come altri dispositivi net come un driver ethernet) un insieme di callback delle operazioni utilizzando lo struct net_device_ops.
    • percorso di controllo: Questo percorso è come spazio utente controlla l'interfaccia WiFi/dispositivo ed esegue operazioni quali scansione/autenticazione/associazione. L'interfaccia userspace si basa su netlink e viene chiamata nl80211 (vedere include/uapi/linux/nl80211.h). È possibile inviare comandi e ottenere eventi in risposta.
  2. Quando si invia un comando nl80211 esso viene inizialmente gestita dal cfg80211 modulo del kernel (è il codice è sotto net/wireless ed i gestori sono in net/wireless/nl80211.c). cfg80211 di solito chiamerà un driver di livello inferiore. In caso di hardware MAC completo, il driver HW specifico è proprio sotto cfg80211. Il driver inferiore a cfg80211 registra un set di operazioni con cfg80211 utilizzando cfg80211_ops struct. Per esempio vedi driver brcmfmac (drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c)
  3. Per hardware MAC soft c'è il modulo mac80211 che è un modulo del kernel che implementa il livello MAC 802.11. In questo caso, cfg80211 parlerà con mac80211 che a sua volta utilizzerà il driver di livello inferiore specifico dell'hardware. Un esempio di ciò è iwlwifi (per i chip Intel).
  4. mac80211 si registra con cfg80211 utilizzando cfg80211_ops (vedere net/mac80211/cfg.c). Il driver HW specifico si registra con mac80211 utilizzando ieee80211_ops struct (ad esempio drivers/net/wireless/iwlwifi/mvm/mac80211.c).
  5. L'inizializzazione di una nuova scheda NIC collegata si verifica dal basso verso l'alto nello stack. Il driver specifico HW chiamerà il numero ieee80211_allow_hw() di mac80211 di solito dopo aver sondato l'HW. ieee80211_alloc_hw() ottiene la dimensione della struttura di dati privati ​​utilizzata dal driver HW. A turno chiama cfg80211 wiphy_new() che esegue l'allocazione effettiva dello spazio sufficiente per la struttura wiphy, il ieee80211_local struct (che viene utilizzato da mac80211) e i dati privati ​​del driver HW (il layering è visualizzato nel codice ieee80211_alloc_hw). ieee80211_hw è una struttura incorporata all'interno di ieee80211_local che è "visibile" per il driver HW. Tutti questi (wiphy, ieee80211_local, ieee80211_hw) rappresentano un singolo dispositivo fisico connesso.
  6. Sopra un singolo dispositivo fisico (noto anche come phy) è possibile impostare più interfacce virtuali. Questi sono essenzialmente ciò che conosci come wlan0 o wlan1 che controlli con ifconfig. Ogni tale interfaccia virtuale è rappresentata da un ieee80211_vif. Questa struttura contiene anche le strutture private alla fine accessibili dal driver HW. È possibile utilizzare più interfacce per eseguire qualcosa come una stazione su wlan0 e un AP su wlan1 (ciò è possibile a seconda delle capacità HW).
Problemi correlati