/*#######################################################################################
AVR Small Webserver 

Copyright (C) 2004 Ulrich Radig

#######################################################################################*/

#include "main.h"
#include "arp.h"
#include "ethernet.h"

//############################################################################
//Diese Routine erzeugt ein ARP buffer
void ARP_Reply (char *buffer,int *bufferlen)
//############################################################################
{
	struct Ethernet_Header *ethernet;
	ethernet = (struct Ethernet_Header *)&buffer[ETHER_OFFSET];

	struct ARP_Header *arp;
	arp = (struct ARP_Header *)&buffer[ARP_OFFSET];

	//2 Byte Hardware Typ: Enthält den Code für Ethernet
	if(arp->ARP_HWType == 0x0100 &&

	//2 Byte Protokoll Typ: Enthält den Code für IP
	arp->ARP_PRType == 0x0008 &&

	//1Byte Länge der Hardwareadresse:Enthält 6 für 6 Byte MAC Addresse
	arp->ARP_HWLen == 0x06 && 

	//1Byte Länge der Protokolladresse:Enthält 4 für 4 Byte Adressen 
	arp->ARP_PRLen == 0x04 &&

	//Operation handelt es sich um eine anfrage
	arp->ARP_Op == 0x0100 &&

	//Ist das ARP Packet für meine IP Addresse bestimmt
	//Vergleiche ARP Target IP Adresse mit meiner IP
	arp->ARP_TIPAddr == *((unsigned long *)&MYIP[0]))
		{
		for(unsigned char a = 0; a < 6; a++)
			{
			//MAC Destadresse wird geschrieben mit MAC Sourceadresse
			ethernet->EnetPacketDest[a] = ethernet->EnetPacketSrc[a];
			//Meine MAC Adresse wird in Sourceadresse geschrieben
			ethernet->EnetPacketSrc[a] = mymac[a];
			//das gleiche für die MAC Adresse
			//ARP MAC Targetadresse wird geschrieben mit ARP Sourceadresse
			arp->ARP_THAddr[a] = ethernet->EnetPacketDest[a];
			//ARP MAC Sourceadresse wird geschrieben mit My MAC Adresse
			arp->ARP_SHAddr[a] = mymac[a];
			}

		//ARP operation wird auf 2 gesetzt damit der andere merkt es ist ein ECHO	
		arp->ARP_Op = 0x0200;	
		//ARP Target IP Adresse wird geschrieben mit ARP Source IP Adresse 
		arp->ARP_TIPAddr = arp->ARP_SIPAddr;
		//Meine IP Adresse wird in ARP Source IP Adresse geschrieben
		arp->ARP_SIPAddr = *((unsigned long *)&MYIP[0]);

		//Nun ist das ARP buffer fertig zum Senden !!!
		//Sendet das erzeugte ARP Packet 
		Write_Ethernet_Frame (buffer,*bufferlen);
	}
	return;
}
