|  |  |  | /*
 | 
					
						
							|  |  |  |              LUFA Library | 
					
						
							|  |  |  |      Copyright (C) Dean Camera, 2014. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   dean [at] fourwalledcubicle [dot] com | 
					
						
							|  |  |  |            www.lufa-lib.org | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |   Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Permission to use, copy, modify, distribute, and sell this | 
					
						
							|  |  |  |   software and its documentation for any purpose is hereby granted | 
					
						
							|  |  |  |   without fee, provided that the above copyright notice appear in | 
					
						
							|  |  |  |   all copies and that both that the copyright notice and this | 
					
						
							|  |  |  |   permission notice and warranty disclaimer appear in supporting | 
					
						
							|  |  |  |   documentation, and that the name of the author not be used in | 
					
						
							|  |  |  |   advertising or publicity pertaining to distribution of the | 
					
						
							|  |  |  |   software without specific, written prior permission. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   The author disclaims all warranties with regard to this | 
					
						
							|  |  |  |   software, including all implied warranties of merchantability | 
					
						
							|  |  |  |   and fitness.  In no event shall the author be liable for any | 
					
						
							|  |  |  |   special, indirect or consequential damages or any damages | 
					
						
							|  |  |  |   whatsoever resulting from loss of use, data or profits, whether | 
					
						
							|  |  |  |   in an action of contract, negligence or other tortious action, | 
					
						
							|  |  |  |   arising out of or in connection with the use or performance of | 
					
						
							|  |  |  |   this software. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \file
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Address Resolution Protocol (ARP) packet handling routines. This protocol handles the | 
					
						
							|  |  |  |  *  conversion of physical MAC addresses to protocol IP addresses between the host and the | 
					
						
							|  |  |  |  *  device. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ARP.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** Processes an ARP packet inside an Ethernet frame, and writes the appropriate response
 | 
					
						
							|  |  |  |  *  to the output Ethernet frame if the host is requesting the IP or MAC address of the | 
					
						
							|  |  |  |  *  virtual server device on the network. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  \param[in] InDataStart    Pointer to the start of the incoming packet's ARP header | 
					
						
							|  |  |  |  *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ARP header | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int16_t ARP_ProcessARPPacket(void* InDataStart, | 
					
						
							|  |  |  |                              void* OutDataStart) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	DecodeARPHeader(InDataStart); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ARP_Header_t* ARPHeaderIN  = (ARP_Header_t*)InDataStart; | 
					
						
							|  |  |  | 	ARP_Header_t* ARPHeaderOUT = (ARP_Header_t*)OutDataStart; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Ensure that the ARP request is a IPv4 request packet */ | 
					
						
							|  |  |  | 	if ((SwapEndian_16(ARPHeaderIN->ProtocolType) == ETHERTYPE_IPV4) && | 
					
						
							|  |  |  | 	    (SwapEndian_16(ARPHeaderIN->Operation) == ARP_OPERATION_REQUEST)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		/* If the ARP packet is requesting the MAC or IP of the virtual webserver, return the response */ | 
					
						
							|  |  |  | 		if (IP_COMPARE(&ARPHeaderIN->TPA, &ServerIPAddress) || | 
					
						
							|  |  |  | 		    MAC_COMPARE(&ARPHeaderIN->THA, &ServerMACAddress)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			/* Fill out the ARP response header */ | 
					
						
							|  |  |  | 			ARPHeaderOUT->HardwareType = ARPHeaderIN->HardwareType; | 
					
						
							|  |  |  | 			ARPHeaderOUT->ProtocolType = ARPHeaderIN->ProtocolType; | 
					
						
							|  |  |  | 			ARPHeaderOUT->HLEN         = ARPHeaderIN->HLEN; | 
					
						
							|  |  |  | 			ARPHeaderOUT->PLEN         = ARPHeaderIN->PLEN; | 
					
						
							|  |  |  | 			ARPHeaderOUT->Operation    = SwapEndian_16(ARP_OPERATION_REPLY); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* Copy over the sender MAC/IP to the target fields for the response */ | 
					
						
							|  |  |  | 			ARPHeaderOUT->THA = ARPHeaderIN->SHA; | 
					
						
							|  |  |  | 			ARPHeaderOUT->TPA = ARPHeaderIN->SPA; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* Copy over the new sender MAC/IP - MAC and IP addresses of the virtual webserver */ | 
					
						
							|  |  |  | 			ARPHeaderOUT->SHA = ServerMACAddress; | 
					
						
							|  |  |  | 			ARPHeaderOUT->SPA = ServerIPAddress; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* Return the size of the response so far */ | 
					
						
							|  |  |  | 			return sizeof(ARP_Header_t); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return NO_RESPONSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |