diff options
Diffstat (limited to 'lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c')
| -rw-r--r-- | lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c new file mode 100644 index 000000000..b144c4c51 --- /dev/null +++ b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | /* | ||
| 2 | LUFA Library | ||
| 3 | Copyright (C) Dean Camera, 2017. | ||
| 4 | |||
| 5 | dean [at] fourwalledcubicle [dot] com | ||
| 6 | www.lufa-lib.org | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||
| 11 | |||
| 12 | Permission to use, copy, modify, distribute, and sell this | ||
| 13 | software and its documentation for any purpose is hereby granted | ||
| 14 | without fee, provided that the above copyright notice appear in | ||
| 15 | all copies and that both that the copyright notice and this | ||
| 16 | permission notice and warranty disclaimer appear in supporting | ||
| 17 | documentation, and that the name of the author not be used in | ||
| 18 | advertising or publicity pertaining to distribution of the | ||
| 19 | software without specific, written prior permission. | ||
| 20 | |||
| 21 | The author disclaims all warranties with regard to this | ||
| 22 | software, including all implied warranties of merchantability | ||
| 23 | and fitness. In no event shall the author be liable for any | ||
| 24 | special, indirect or consequential damages or any damages | ||
| 25 | whatsoever resulting from loss of use, data or profits, whether | ||
| 26 | in an action of contract, negligence or other tortious action, | ||
| 27 | arising out of or in connection with the use or performance of | ||
| 28 | this software. | ||
| 29 | */ | ||
| 30 | |||
| 31 | /** \file | ||
| 32 | * | ||
| 33 | * Internet Control Message Protocol (ICMP) packet handling routines. This protocol handles | ||
| 34 | * Echo requests from the host, to indicate a successful network connection between the host | ||
| 35 | * and the virtual server. | ||
| 36 | */ | ||
| 37 | |||
| 38 | #include "ICMP.h" | ||
| 39 | |||
| 40 | /** Processes an ICMP packet inside an Ethernet frame, and writes the appropriate response | ||
| 41 | * to the output Ethernet frame if the host is issuing a ICMP ECHO request. | ||
| 42 | * | ||
| 43 | * \param[in] InDataStart Pointer to the start of the incoming packet's ICMP header | ||
| 44 | * \param[out] OutDataStart Pointer to the start of the outgoing packet's ICMP header | ||
| 45 | * | ||
| 46 | * \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise | ||
| 47 | */ | ||
| 48 | int16_t ICMP_ProcessICMPPacket(void* InDataStart, | ||
| 49 | void* OutDataStart) | ||
| 50 | { | ||
| 51 | ICMP_Header_t* ICMPHeaderIN = (ICMP_Header_t*)InDataStart; | ||
| 52 | ICMP_Header_t* ICMPHeaderOUT = (ICMP_Header_t*)OutDataStart; | ||
| 53 | |||
| 54 | DecodeICMPHeader(InDataStart); | ||
| 55 | |||
| 56 | /* Determine if the ICMP packet is an echo request (ping) */ | ||
| 57 | if (ICMPHeaderIN->Type == ICMP_TYPE_ECHOREQUEST) | ||
| 58 | { | ||
| 59 | /* Fill out the ICMP response packet */ | ||
| 60 | ICMPHeaderOUT->Type = ICMP_TYPE_ECHOREPLY; | ||
| 61 | ICMPHeaderOUT->Code = 0; | ||
| 62 | ICMPHeaderOUT->Checksum = 0; | ||
| 63 | ICMPHeaderOUT->Id = ICMPHeaderIN->Id; | ||
| 64 | ICMPHeaderOUT->Sequence = ICMPHeaderIN->Sequence; | ||
| 65 | |||
| 66 | intptr_t DataSize = FrameIN.FrameLength - ((((intptr_t)InDataStart + sizeof(ICMP_Header_t)) - (intptr_t)FrameIN.FrameData)); | ||
| 67 | |||
| 68 | /* Copy the remaining payload to the response - echo requests should echo back any sent data */ | ||
| 69 | memmove(&((uint8_t*)OutDataStart)[sizeof(ICMP_Header_t)], | ||
| 70 | &((uint8_t*)InDataStart)[sizeof(ICMP_Header_t)], | ||
| 71 | DataSize); | ||
| 72 | |||
| 73 | ICMPHeaderOUT->Checksum = Ethernet_Checksum16(ICMPHeaderOUT, (DataSize + sizeof(ICMP_Header_t))); | ||
| 74 | |||
| 75 | /* Return the size of the response so far */ | ||
| 76 | return (DataSize + sizeof(ICMP_Header_t)); | ||
| 77 | } | ||
| 78 | |||
| 79 | return NO_RESPONSE; | ||
| 80 | } | ||
| 81 | |||
