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:
- 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.
- 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
)
- 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).
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
).
- 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.
- 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).
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
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