1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
// -*- c++ -*-
//
// $Id: Pctest.h 1082 2005-02-12 19:40:04Z bmah $
//
// Pctest.h
// Bruce A. Mah <bmah@acm.org>
//
// This work was first produced by an employee of Sandia National
// Laboratories under a contract with the U.S. Department of Energy.
// Sandia National Laboratories dedicates whatever right, title or
// interest it may have in this software to the public. Although no
// license from Sandia is needed to copy and use this software,
// copying and using the software might infringe the rights of
// others. This software is provided as-is. SANDIA DISCLAIMS ANY
// WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.
//
// Header for virtual base class of tests. A particular protocol (e.g.
// IPv4, IPv6) will override the methods of this base class
// with protocol-specific implementations.
//
//
#ifndef PCTEST_H
#define PCTEST_H
#include <stdio.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <string.h>
#endif /* STDC_HEADERS */
#if HAVE_UNISTD_H
#include <sys/types.h>
#endif /* HAVE_UNISTD_H */
#include <sys/socket.h>
#include <sys/time.h>
#if HAVE_PCAP
#include <pcap.h>
#endif /* HAVE_PCAP */
#include "pc.h"
// #include "TestRecord.h"
class TestRecord;
// Action codes. ICMPv4 and ICMPv6 have different values for their type
// and code fields. The Pctest abstracts these differences.
typedef enum {
PctestActionReserved = 0, // reserved code
PctestActionValid = 1, // store valid measurement (e.g. ICMP
// time exceeded)
PctestActionValidLasthop = 2, // store valid measurement, this
// is last hop (e.g. ICMP port unreachable)
PctestActionFiltered = 3, // packets filtered, give up (e.g.
// ICMP prohibited)
PctestActionTimeout = 4, // Timeout
PctestActionAbort = 255 // huh? we haven't a clue
} PctestActionType;
class Pctest {
public:
Pctest();
virtual ~Pctest();
// Get gettimeofday() system call overhead.
virtual void TimeSyscall(struct timeval &diff);
// Get random payload buffer
virtual char *GeneratePayload(int size);
// Determine origin address for our tests (resolve if necessary)
virtual int SetOriginName(char *origin) = 0;
// Get origin host name and address
char *GetOriginName() { return originName; };
virtual void *GetOriginAddress() = 0;
// Set target host for our tests (resolve if necessary)
virtual int SetTargetName(char *target) = 0;
// Get target host name and address
char *GetTargetName() { return targetName; };
virtual char *GetPrintableAddress() = 0;
virtual char *GetPrintableAddress(void *a) = 0;
virtual char *GetName(void *a) = 0;
virtual char *GetAddressFamilyString() = 0;
virtual int GetAddressFamily() = 0;
// Get input and output sockets needed
virtual int GetSocketOut() = 0;
virtual int GetSocketIn() = 0;
// Perform a test and return statistics
virtual int Test(TestRecord &tr) = 0;
virtual unsigned int GetMinSize() = 0;
protected:
int initialized; // initialization flag
char *originName; // origin hostname
char *targetName; // target hostname
struct timeval tvBefore, tvAfter; // timestamps
struct timeval syscallTime; // estimated overhead for gettimeofday()
#if HAVE_PCAP
pcap_t *pc; // pcap structure
bpf_u_int32 netp, maskp; // net and mask parameters
struct bpf_program fp; // filter program
// pcap callback
static void callback(u_char *puc,
const struct pcap_pkthdr *ph,
const u_char *pd);
// Fields for callback to communicate information back to the
// main object's methods
u_char *packet; // start of IP packet
unsigned int packetLength; // packet length
#endif /* HAVE_PCAP */
u_short InCksum(u_short *addr, int len); // IP checksum routine
};
#endif /* PCTEST_H */
|