Ethernet 5/7

Piccoli e grandi indiani
Nei comuni computer e microcontrollori le locazioni di memoria minime sono comunemente di 8 bit; quando, pero, si devono rappresentare valori di
16 bit, bisogna decidere come vengono salvati in memoria.
Un dato da 16bit ovviamente occupa due locazioni di memoria, quindi ci sono due possibilità :
- il byte meno significativo si trova all'indirizzo più basso rispetto al MSB.
- viceversa, il byte meno significativo si trova all'indirizzo di memoria maggiore dei due.
Queste due opzioni sono chiamate rispettivamente Little Endian e Big Endian.
I comuni computer (con processori x86) e anche i PIC, utilizzano la prima notazione, mentre nei protocolli di rete è diffuso l'utilizzo della seconda.
Il compito della funzione htons è di convertire un dato a 16bit tra le due notazioni. Nel corso dell'articolo sarà usato spesso e bisogna porre molta attenzione al suo utilizzo.

u16 htons(u16 val){
	return (((u16)val >> 8 ) | ((u16)val << 8 ));
}

Come già visto il registro ERXWRPT contiene l'indirizzo dove il controller sta scrivendo i dati ricevuti, mentre il registro ERXRDPT, punta all'indirizzo dove il nostro software sta leggendo i dati ricevuti; la zona che si trova tra questi due indirizzi è interdetta alla scrittura, per impedire la perdita dei dati durante la loro elaborazione.
Detto questo, risulta necessario, terminata l'esaminazione del pacchetto, l'aggiornamento del registro ERXRDPT con l'indirizzo del prossimo pacchetto da leggere (RdPt).

void freeRxSpace(){
	u16 NewRdPt;
	setBank(0);
	NewRdPt = RdPt -1;
	if ((NewRdPt > RX_BUF_END) || (NewRdPt < RX_BUF_START)) NewRdPt = RX_BUF_END;
	BFSReg(ECON2, 0b01000000);    		// decrementa EPKTCNT
	writeReg(ERXRDPTL, LOW(NewRdPt));
	writeReg(ERXRDPTH, HIGH(NewRdPt)); 	// libera lo spazio del buffer
}

In questo metodo viene aggiornato il registro sopracitato, e viene decrementato EPKTCNT.

A causa di un problema descritto nell'Errata, il valore di ERXRDPT deve essere dispari; sappiamo pero che RdPt è sicuramente pari
(il controller aggiunge un padding in modo che sia pari), quindi basta sottrarre uno a questo valore, e poi controllare che non vada fuori dai
limiti del buffer (RX_BUF_START e RX_BUF_END).

Internet Protocol Suite
TCP/IP è una famiglia di protocolli (Internet Protocol Suite)
largamente usata per lo scambio di dati
via internet (ed anche intranet); essa comprende i noti protocolli TCP (livello 4)
ed IP (livello 3) che ne sono i rappresentanti nonché i primi ad essere stati ideati, più
molti altri (UDP, ICMP, ARP, RARP, ecc.).
Questi protocolli occupano i livelli 3 e 4 del modello OSI, quindi fondamentalmente
si occupano del trasporto, più o meno affidabile, dei dati generati dalle Applicazioni.

Nelle prossime pagine ci occuperemo in dettaglio dei seguenti protocolli:

  • ARP : come già accennato, permette la conversione di un indirizzo IP con il corrispondente indirizzo MAC.
  • IP : è il protocollo di livello 3 su cui si basa principalmente la Rete; è indispensabile per il corretto instradamento dei
    pacchetti, tramite l'indirizzo IP del destinatario.
  • ICMP : si trova ufficialmente al livello 3, ma è comunque al di sopra dell'IP; svolge funzioni utili per l'instradamento
    e di diagnostica (vedi ping).
  • TCP : è un protocollo di trasporto molto affidabile (e anche complesso).
  • UDP : è un altro protocollo di trasporto, ma meno affidabile del TCP; ha il vantaggio di essere di facile
    implementazione e generalmente offre prestazioni migliori.

ARP
L'ARP (Address Resolution Protocol) è un protocollo di terzo livello, impiegato all'interno di reti LAN, per tradurre indirizzi IP nei corrispondenti indirizzi fisici (MAC).
Abbiamo già analizzato in questa pagina il meccanismo che lega i due indirizzi.

L'intestazione
Questo protocollo non è pensato soltanto per reti ethernet e protocollo IP, quindi un pacchetto ARP contiene vari campi che specificano di quali indirizzi si sta parlando:

  • Hardware Type: indica il tipo dell'indirizzo fisico (per Ethernet vale 1).
  • Protocol Type: continene il tipo di indirizzo di protocollo (per IP vale 0x800).
  • Hardware Address Length: la lunghezza dell'indirizzo fisico (per Ethernet è 6).
  • Protocol Address Length: la lunghezza dell'indirizzo di protocollo (per IPv4 è 4).
  • Operation: rappresenta il comando; nel nostro caso vedremo ARP Request e ARP Replay.

A questi segue un campo dati di lunghezza variabile (che dipende dall'intestazione), che per le operation nominate conterrà 4 indirizzi, come indicato dall seguente figura:

ARP Header

ARP Request
Il pacchetto di richiesta di indirizzo MAC contiene, oltre che l'intestazione, gli indirizzi IP e MAC del mittente, e come Target IP Address, l'indirizzo di cui si vuole conoscere l'indirizzo fisico.
Perciò, quando arriva un pacchetto ARP è sufficiente controllare i campi Operation e appunto Target IP Address che deve corrispondere al nostro IP, altrimenti ignoriamo la richiesta.

ARP Reply
Il pacchetto di risposta è del tutto simile a quello appena visto: basta indicare nel campo Operation che si tratta di una risposta, e riempire i vari campi con gli indirizzi del mittente e del destinatario.

Tutto ciò è raccolto in un'unica, breve, funzione:

void processARP(){
	ARPPacket packet;
	IPAddr tmp;	
	
	encGetArray((u8*)&packet, sizeof(packet));
	packet.operation = htons(packet.operation);

	if (packet.operation == ARP_REQUEST){
		if (ipMatch(packet.TargetIP,MyIP)){
			packet.operation = htons(ARP_REPLY);
			tmp = packet.TargetIP;
			packet.TargetMAC = packet.SourceMAC;
			packet.TargetIP = packet.SourceIP;
			packet.SourceIP = tmp;
			packet.SourceMAC.b[0] = MY_MAC1;
			packet.SourceMAC.b[1] = MY_MAC2;
			packet.SourceMAC.b[2] = MY_MAC3;
			packet.SourceMAC.b[3] = MY_MAC4;
			packet.SourceMAC.b[4] = MY_MAC5;
			packet.SourceMAC.b[5] = MY_MAC6;
			MACPutHeader(packet.TargetMAC, TYPE_ARP);
			encPutArray((u8*)&packet,sizeof(packet));
			MACSend();
		}
	}
}

Il pacchetto ARP è cosi definito:

typedef struct {
  u16          hardware;
  u16          protocol;
  u8           MacLen;
  u8           ProtocolLen;
  u16          operation;
  MACAddr      SourceMAC;
  IPAddr       SourceIP;
  MACAddr      TargetMAC;
  IPAddr       TargetIP;
} ARPPacket;
Scarica subito una copia gratis
Tags:

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend