mirror of
https://github.com/wanghongenpin/proxypin.git
synced 2026-04-18 21:29:15 +08:00
81 lines
2.2 KiB
C
81 lines
2.2 KiB
C
//
|
|
// ICMPHeader.h
|
|
// GBPing
|
|
//
|
|
// Created by Luka Mirosevic on 15/11/2012.
|
|
// Copyright (c) 2012 Goonbee. All rights reserved.
|
|
//
|
|
|
|
#ifndef GBPing_ICMPHeader_h
|
|
#define GBPing_ICMPHeader_h
|
|
|
|
#include <AssertMacros.h>
|
|
|
|
#pragma mark - IP and ICMP On-The-Wire Format
|
|
|
|
// The following declarations specify the structure of ping packets on the wire.
|
|
|
|
// IP header structure:
|
|
|
|
struct IPHeader {
|
|
uint8_t versionAndHeaderLength;
|
|
uint8_t differentiatedServices;
|
|
uint16_t totalLength;
|
|
uint16_t identification;
|
|
uint16_t flagsAndFragmentOffset;
|
|
uint8_t timeToLive;
|
|
uint8_t protocol;
|
|
uint16_t headerChecksum;
|
|
uint8_t sourceAddress[4];
|
|
uint8_t destinationAddress[4];
|
|
// options...
|
|
// data...
|
|
};
|
|
typedef struct IPHeader IPHeader;
|
|
|
|
__Check_Compile_Time(sizeof(IPHeader) == 20);
|
|
__Check_Compile_Time(offsetof(IPHeader, versionAndHeaderLength) == 0);
|
|
__Check_Compile_Time(offsetof(IPHeader, differentiatedServices) == 1);
|
|
__Check_Compile_Time(offsetof(IPHeader, totalLength) == 2);
|
|
__Check_Compile_Time(offsetof(IPHeader, identification) == 4);
|
|
__Check_Compile_Time(offsetof(IPHeader, flagsAndFragmentOffset) == 6);
|
|
__Check_Compile_Time(offsetof(IPHeader, timeToLive) == 8);
|
|
__Check_Compile_Time(offsetof(IPHeader, protocol) == 9);
|
|
__Check_Compile_Time(offsetof(IPHeader, headerChecksum) == 10);
|
|
__Check_Compile_Time(offsetof(IPHeader, sourceAddress) == 12);
|
|
__Check_Compile_Time(offsetof(IPHeader, destinationAddress) == 16);
|
|
|
|
// ICMP type and code combinations:
|
|
|
|
enum {
|
|
kICMPv4TypeEchoRequest = 8,
|
|
kICMPv4TypeEchoReply = 0
|
|
};
|
|
|
|
enum {
|
|
kICMPv6TypeEchoRequest = 128,
|
|
kICMPv6TypeEchoReply = 129
|
|
};
|
|
|
|
// ICMP header structure:
|
|
|
|
struct ICMPHeader {
|
|
uint8_t type;
|
|
uint8_t code;
|
|
uint16_t checksum;
|
|
uint16_t identifier;
|
|
uint16_t sequenceNumber;
|
|
// data...
|
|
};
|
|
typedef struct ICMPHeader ICMPHeader;
|
|
|
|
__Check_Compile_Time(sizeof(ICMPHeader) == 8);
|
|
__Check_Compile_Time(offsetof(ICMPHeader, type) == 0);
|
|
__Check_Compile_Time(offsetof(ICMPHeader, code) == 1);
|
|
__Check_Compile_Time(offsetof(ICMPHeader, checksum) == 2);
|
|
__Check_Compile_Time(offsetof(ICMPHeader, identifier) == 4);
|
|
__Check_Compile_Time(offsetof(ICMPHeader, sequenceNumber) == 6);
|
|
|
|
|
|
#endif
|