Spagnolo Inglese
11365 Users    

Ethernet 5/7

  Download in PDF
Ethernet  tutorial

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;
Commenta!Feed Rss

Invia nuovo commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.
  • Linee e paragrafi vanno a capo automaticamente.

Maggiori informazioni sulle opzioni di formattazione.

Articoli di elettronica correlati

  • Il checksum è un metodo per controllare l'integrità di un pacchetto, ovvero permette di stabilire se questo contiene errori (ed è quindi inutilizzabile).

  • Il protocollo IP è alla base della comunicazione attraverso la rete internet, non per niente IP sta per Internet Protocol; il suo ruolo è quello di permettere l'instradamento dei pacchetti attraverso la rete, affinché questi possano giungere al destinatario.

  • A questo punto abbiamo tutto il codice necessario per scambiare dati con il controller, possiamo quindi leggere il registro EREVID, situato nel banco 3, il quale contiene il numero di revisione del Chip.

  • La comunicazione tra ENC28J60 e PIC avviene tramite l'interfaccia SPI; questa supporta soltanto la modalità 0,0 ed il controller è uno slave, quindi è il PIC che fornisce il clock e gestisce la trasmissione.

  • L'Ethernet è un protocollo di tipo CSMA/CD (Carrier Sense Multiple Access / Collision Detect) sviluppato nel 1973, al fine di avere trasmissioni su cavo affidabili in condizioni di traffico moderato.

Commenti recenti

Nuovi utenti

  • franckys58
  • harrison3001
  • Edi82
  • 1lampo1
  • Marco Inzolia
  • sante44
  • bassanocarrelli
  • swutz

Chi è online

Ci sono attualmente 0 utenti e 8 visitatori collegati.