18

Ho passato gli ultimi giorni a leggere le pagine man, i documenti e qualsiasi altra cosa su Google, ma suppongo di essere ancora più confuso adesso di quanto lo fossi all'inizio.Accesso all'interfaccia wireless (802.11) al livello MAC (Linux)

Ecco cosa voglio fare: Desidero inviare e ricevere pacchetti di dati con il mio livello 3-x protocol (s) tramite un'interfaccia wireless (802.11) su sistemi Linux con C/C++. Finora, tutto bene. Non sono necessari beacons, associazioni o materiale correlato all'AP/SSID. Tuttavia, per le trasmissioni di dati, vorrei che il livello MAC si comportasse "come al solito", nel senso che i pacchetti unicast sono ACK, ritrasmissioni, backoff ecc. Mi piacerebbe anche godere dei capabiliti QoS estesi (802.11e con 4 code e diverse categorie di accesso). La modalità promiscua, d'altra parte, non è un problema, io richiedo solo pacchetti e pacchetti trasmessi alla stazione specifica.

Quale sarebbe la strada giusta da fare? La maggior parte della documentazione disponibile sull'accesso raw socket sembra focalizzata sullo sniffing della rete e questo non aiuta. Ho giocato con la modalità monitor per un po 'di tempo, ma da quello che ho letto finora, i pacchetti ricevuti non sono ACK in modalità monitor ecc. Senza la modalità monitor, quale sarebbe l'alternativa? Utilizzando la modalità ad hoc e unix raw socket? O devo giocherellare con i piloti?

Non sto cercando una soluzione completa, solo alcune buone idee, da dove cominciare. Ho letto le pagine man per socket (2), socket (7) e packet (7), ma ciò non mi ha aiutato riguardo al comportamento del livello MAC in diverse modalità.

Grazie in anticipo.

+1

È possibile visualizzare e verificare se esiste una soluzione * software * open source per generare traffico di prova, ovvero un insieme di pacchetti validi e non validi per vedere come l'apparecchiatura dall'altra parte gestisce tale. Presumibilmente, questo avrebbe la capacità di eseguire entrambe le normali operazioni, ma anche variazioni arbitrarie (al fine di introdurre gli errori desiderati). Se esiste, potresti essere in grado di usarlo o imparare da esso. –

risposta

0

Sembra che si stiano mescolando i supporti e i livelli di trasporto.

802.11 è quello che viene comunemente definito livello "link", "physical" o "media", vale a dire che si occupa solo della trasmissione di datagrammi grezzi.

Concetti come ACK, ritrasmissioni, backoff (controllo del flusso) si applicano al livello "trasporto" e quei termini particolari sono fortemente associati a TCP/IP.

Implementare il proprio livello di trasporto completo da zero è molto difficile e quasi certamente non è quello che si vuole fare. Se invece si desidera utilizzare lo stack TCP/IP esistente in aggiunta all'interpretazione personalizzata di 802.11, è probabile che si desideri creare un'interfaccia di rete virtuale. Ciò fungerebbe da intermediario tra TCP/IP e il livello multimediale.

Speriamo che questo ti offra un contesto e parole chiave migliori da cercare.

+2

OP non mischia i livelli. Ci sono acks e ritrasmissioni 802.11, vedere www.sss-mag.com/pdf/802_11tut.pdf – abb

+0

Il mio male, ho visto ACK, ritrasmissioni e backoff e associato tutto ciò con il livello di trasporto. –

1

Probabilmente desideri qualcosa come libpcap.

Libpcap consente di leggere/iniettare pacchetti grezzi da/in un'interfaccia di rete.

3

Poiché si desidera creare il proprio protocollo di livello di rete (sostituzione per IP), la parola chiave è: "raw socket ethernet". Quindi ignora la roba "Raw IP socket".

Questo è da dove cominciare:

int sockfd = socket(PF_PACKET, SOCK_RAW, htons(XXX)); 

pagina man corretta è: packet(7).

Trova ulteriori informazioni googling con la parola chiave. Un esempio abbastanza completo here.

+0

Il collegamento di esempio non sembra più essere attivo. Potresti per favore condividere un link aggiornato (o dare qualche riferimento a cosa cercare per ottenerlo)? –

7

802.11 è la specifica del protocollo di livello 2 (e 1). È stato progettato in un modo che consente ai protocolli di livello superiore di trattarlo come una rete Ethernet. Indirizzamento e comportamento sono generalmente gli stessi. Quindi per un protocollo di livello 3 non dovresti preoccuparti affatto dell'802.11 e scrivere il tuo codice come se ti aspettassi che fosse eseguito sulla rete Ethernet.

Per farlo funzionare è necessario innanzitutto connettersi a una rete wireless di qualche tipo (che è concettualmente uguale a collegare un cavo in una scheda Ethernet). Qui è possibile scegliere una rete ad-hoc (alias IBSS) o infrastrutturale (alias BSS) (o PBSS dopo l'approvazione dell'802.11ad;).

Le schede operative senza alcun tipo di associazione con la rete (solo sputare pacchetti in aria) non è una buona idea per un paio di motivi. La cosa più importante è molto dipendente dall'hardware e inaffidabile. Puoi ancora farlo usando l'interfaccia RF mon (modalità monitor AKA) da un lato e l'iniezione a pacchetti (usando l'intestazione del radiotap) dall'altro, ma io non lo consiglio. Anche se hai un set di carte identiche, molto probabilmente incontrerai un comportamento difficile da spiegare e casuale a un certo punto. Le schede NIC 802.11 non sono progettate per questo tipo di operazioni e mantengono diversi stati di stato all'interno del firmware (leggi le schede FullMAC e SoftMAC). Anche le schede SoftMAC differiscono in modo significativo. Ad esempio, in teoria in modalità monitor, come hai detto, la scheda non dovrebbe ricevere pacchetti ACK. Ci sono carte però che lo corrisponderà allo frame ACK, perché basano la loro decisione esclusivamente sul fatto che il frame è indirizzato a loro. Alcune carte possono anche provare ad ACK tutte le cornici che vedono. Una cosa simile succederà con le ritrasmissioni: alcune carte invieranno il pacchetto iniettato una sola volta (è così che dovrebbe funzionare). In altre schede NIC, le ritrasmissioni vengono gestite dall'hardware (e dal firmware) e il driver non può spegnerlo, quindi si otterrà la ritrasmissione automatica anche con dati iniettati.

Attaccare con il livello 3 e utilizzare le modalità esistenti (come ad hoc), ti darà tutte le funzionalità che desideri e altro (QoS ecc.). frame Ethernet che si invia a interfaccia sarà "tradotto" dal kernel in formato 802.11 con QoS mappatura ecc

Se si vuole scoprire il comportamento MAC in varie modalità dovrete neanche leggere la mac80211 codice o lo standard 802.11 stesso. http://linuxwireless.org wiki il mio aiuto con alcune cose, ma gli hacker del kernel di solito sono impegnati a scrivere documentazione diversa dai commenti nel codice;)

L'implementazione del protocollo L3 può essere eseguita anche in modalità kernel o utente (utilizzando socket raw). Come al solito, il lato kernel sarà più difficile da fare, ma più potente.