mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-03 23:02:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
             LUFA Library
 | 
						|
     Copyright (C) Dean Camera, 2013.
 | 
						|
 | 
						|
  dean [at] fourwalledcubicle [dot] com
 | 
						|
           www.lufa-lib.org
 | 
						|
*/
 | 
						|
 | 
						|
/*
 | 
						|
  Copyright 2013  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;
 | 
						|
}
 | 
						|
 |