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.