Non l'ho mai fatto prima personalmente, ma ecco alcune informazioni per indirizzarti nella giusta direzione.
Dal punto di vista del protocollo, è sicuramente possibile avere una singola radio che funziona sia come AP che come client STA. Funziona meglio (o forse è quasi obbligatorio) se l'AP che stai creando e quello a cui ti unisci come cliente si trovano sullo stesso canale. Avere la scheda radio per continuare a cambiare canale alle richieste di servizio è una ricetta per frame persi e prestazioni terribili.
Dal punto di vista del software, sta diventando possibile. Diversi driver di schede 802.11 su Linux supportano il concetto di VAP (AP virtuali) che consente a una singola scheda di agire come più AP (più SSID, anche BSSID) contemporaneamente. Controintuitivamente, il termine VAP è arrivato a significare qualsiasi tipo di interfaccia virtuale sulla stessa scheda 802.11, indipendentemente dal fatto che l'interfaccia virtuale sia in modalità AP o meno. Quindi, su queste combinazioni scheda/conducente, potresti creare due VAP -- un VAP in modalità STA
Il driver MadWifi per le schede basate su Atheros è uno che supporta i VAP. Se la tua scheda 802.11 utilizza un chipset Atheros e installi la versione corretta del driver MadWifi, potresti essere in grado di configurare la tua scheda per la modalità STA + AP simultanea in questo modo:
wlanconfig ath0 create wlandev wifi0 wlanmode sta
wlanconfig ath1 create wlandev wifi0 wlanmode ap
Tieni presente che queste non sono istruzioni complete per impostare tutto, ma solo un tentativo per iniziare.
Potresti voler cercare su Google qualcosa come "wifi vap" per ulteriori informazioni. Ho copiato i comandi precedenti da qui.
Oh, e qualche mito sfatato:le carte Atheros non sono rare nelle macchine di consumo. Sono uno dei principali attori nei chipset 802.11, insieme a Broadcom, Marvell, Intel e Ralink. E solo perché ho usato l'esempio di MadWifi/Atheros, non significa che non ci siano driver Linux per i chip degli altri principali giocatori che possono fare una cosa simile. Inoltre, 802.11s non richiesto per questo. Dire che devi utilizzare 802.11 per farlo è come dire che devi supportare il protocollo Spanning Tree solo per inoltrare i frame da un'interfaccia all'altra.
fonte e ulteriori informazioni:
https://wiki.archlinux.org/index.php/Software_access_point
Risposta breve
sudo iw dev wlan0 interface add wlan0_ap type managed
sudo create_ap wlan0_ap wlan0 createap mypassword
Il dispositivo Wi-Fi deve supportare la modalità AP
È necessario un dispositivo wireless compatibile nl80211, che supporti la modalità operativa AP. Ciò può essere verificato eseguendo il comando iw list, sotto il blocco Modalità interfaccia supportate dovrebbe essere elencato l'AP:
...
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
...
Client wireless e AP software con un unico dispositivo Wi-Fi
La creazione di un AP software è indipendente dalla propria connessione di rete (Ethernet, wireless, ...). Molti dispositivi wireless supportano anche il funzionamento simultaneo sia come AP che come "client" wireless allo stesso tempo. Utilizzando tale funzionalità è possibile creare un AP software che funge da "ripetitore wireless" per una rete esistente, utilizzando un singolo dispositivo wireless. La funzionalità è elencata nella sezione seguente nell'output di iw list:
combinazioni di interfaccia valide:
$ iw list
...
valid interface combinations:
* #{ managed } <= 1, #{ AP, P2P-client, P2P-GO } <= 1, #{ P2P-device } <= 1,
total <= 3, #channels <= 2
...
Il vincolo #channels <=1 significa che il tuo AP software deve operare sullo stesso canale della tua connessione client Wi-Fi; vedere l'impostazione del canale in hostapd.conf di seguito.
Se si desidera utilizzare la capacità/caratteristica, magari perché non è disponibile una connessione Ethernet, è necessario creare due interfacce virtuali separate per utilizzarla. Le interfacce virtuali per un dispositivo fisico wlan0 possono essere create come segue:Le interfacce virtuali con indirizzo MAC univoco vengono create per la connessione di rete (wlan0_sta) stessa e per il software AP/hostapd "ripetitore wireless":
# iw dev wlan0 interface add wlan0_sta type managed
# iw dev wlan0 interface add wlan0_ap type managed
Configurazione
La configurazione di un punto di accesso consiste di due parti principali:
- Impostazione del livello di collegamento Wi-Fi, in modo che i client wireless possano associarsi al punto di accesso software del tuo computer e scambiare pacchetti IP con esso.
- Impostazione della configurazione di rete sul tuo computer, in modo che inoltri correttamente i pacchetti IP tra la propria connessione Internet e i client wireless.
Strumenti
create_ap
Il pacchetto create_ap fornisce uno script che può creare un punto di accesso con bridge o NAT per la condivisione Internet. Combina hostapd, dnsmasq e iptables per il buon funzionamento del punto di accesso. La sintassi di base per creare una rete virtuale NAT è la seguente:
# create_ap wlan0 eth0 MyAccessPoint MyPassPhrase
Il driver nl80211 ha qualcosa chiamato modalità di interfaccia "gestita". Puoi configurarlo usando l'utility "iw" in questo modo:
iw phy phy0 interface add wlan1 type managed
Maggiori informazioni su questo sono disponibili su https://wireless.wiki.kernel.org/en/users/documentation/iw. Phy0 si riferisce a ciò che vedi in /sys/class/ieee80211/.
Ho anche visto l'rPI3 fare qualcosa di simile, ma con una modalità di interfaccia "__ap" più ombreggiata. In questo modo l'utente crea una seconda interfaccia che funziona solo in modalità AP e utilizza l'interfaccia iniziale come modalità client.
In qualunque modo tu lo realizzi (ovviamente il driver deve supportarlo), avrai bisogno di due interfacce (dallo stesso dispositivo fisico). Un'interfaccia può semplicemente eseguire wpa_supplicant come modalità client, l'altra (modalità AP) utilizza in genere hostapd per riprodurre accesspoint.
[MODIFICA:]
Il codice sorgente dello strumento iw chiarisce molto sulla modalità losca __ap:
..
} else if (strcmp(tpstr, "__ap") == 0) {
*type = NL80211_IFTYPE_AP;
return 0;
} else if (strcmp(tpstr, "__ap_vlan") == 0) {
*type = NL80211_IFTYPE_AP_VLAN;
return 0;
} else if (strcmp(tpstr, "wds") == 0) {
*type = NL80211_IFTYPE_WDS;
return 0;
} else if (strcmp(tpstr, "managed") == 0 ||
strcmp(tpstr, "mgd") == 0 ||
strcmp(tpstr, "station") == 0) {
*type = NL80211_IFTYPE_STATION;
return 0;
}
..
La modalità __ap si traduce in un tipo di netlink NL80211_IFTYPE_AP. Ho anche provato questo, e funziona bene. Strano che il wiki della documentazione del kernel non lo menzioni però.