quarta-feira, 28 de dezembro de 2011

4º Passo – ethernet.h

Nesta biblioteca, vamos criar o cabeçalho ethernet com o MAC destino, fonte e tipo de pacote IP ou ARP. Vamos criar a função checksun para verificar a integridade do pacote TCP

#ifndef ETHERNET_H_
#define ETHERNET_H_


#define ETH_TIPO_ARP_V 0x0806            //idetificador para tipo pacote ARP
#define ETH_TIPO_ARP_H_V 0x08
#define ETH_TIPO_ARP_L_V 0x06
#define ETH_TIPO_IP_V 0x0800             //identificador para tipo pacote IP
#define ETH_TIPO_IP_H_V 0x08
#define ETH_TIPO_IP_L_V 0x00
#define ETH_HEADER_LEN 14
#define ETH_DST_MAC_P 0              //endereço MAC destino
#define ETH_SRC_MAC_P 6              //endereço MAC fonte
#define ETH_TIPO_H_P 12
#define ETH_TIPO_L_P 13


***************************************************
Função: gerando_cabeçalho ethernet(WORD type)
Descrição: gera o cabeçalho ethernet, destino MAC e fonte MAC
***************************************************
extern void gerando_cabecalho_ethernet (WORD type);

***************************************************
Função: software_checksum(BYTE endereco_ram, WORD len, DWORD sum)
Descrição: cálculo do checksun para a integridade do pacote 

***************************************************


extern WORD software_checksum(BYTE endereco_ram, WORD len, DWORD sum);

#endif


********************************************************************

#include "ethernet.h"

void gerando_cabecalho_ethernet (WORD type)


{

BYTE i;

for ( i=0; i< MAC; i++)
{
Escrita_Ram(ETH_DST_MAC_P + i,Ler_Ram((WORD)AD_MAC_RAM +i));
Escrita_Ram(ETH_SRC_MAC_P + i,Ler_Ram(MY_MAC+i));
}

Escrita_Ram( ETH_TIPO_L_P,type);
Escrita_Ram( ETH_TIPO_H_P, type>>8);

}



WORD software_checksum(BYTE endereco_ram, WORD len, DWORD sum)
{

while(len>1)
{

sum += (0xFFFF & (Ler_Ram(endereco_ram)<<8
Ler_Ram(endereco_ram+1)));
endereco_ram
+=2;
len-=2;
}

if (len)

{
sum += (0xFF & Ler_Ram(endereco_ram))<<8;
}

while (sum>>16)
{
sum = (sum & 0xFFFF)+(sum >> 16);
}

return( (WORD) sum ^ 0xFFFF);

}

Vamos testar a função gerando_cabecalho_ethernet() este cabecalho é o primeiro a ser carregado na pilha TCP-IP que é a nossa memoria RAM externa e envia-lo ao ENC.