/****************************************************************************
* Pathneck: locating network path bottlenecks
* Copyright (C) 2004
* Ningning Hu and the Carnegie Mellon University
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License (in the COPYING file) for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
****************************************************************************/
#ifndef pathneck_h
#define pathneck_h
#include <stdio.h>
#include <stdlib.h>
#ifdef _BSD
#include <sys/param.h>
#endif
#ifdef __APPLE__
#include <stdint.h>
#endif
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/udp.h>
#include <unistd.h>
#if !defined SUN && !defined _BSD && !defined __APPLE__
#define LINUX
#endif
#define MAX_ECHO 1500 /* max probing packet size */
#define PKT_SIZE 500 /* max probing packet size */
#define PORT_NONEXISTENT 7000
/* NOTE: because we always start TTL from 1, the 0 index array is not
* used, so the real usage max ttl should be (MAX_TTL-1) */
#define MAX_TTL 51
/* the number of probing packet for each node */
#define TRAIN_LEN 2
#define UDP_TRAIN_LEN 60
#define MAX_UDP_NUM 1024 /* max number of udp pkts */
#define MAX_REC (MAX_TTL * TRAIN_LEN)
/* used for dst replied ICMP packets */
#define MAX_RTT_NUM 5
/* used for the configuration processing */
#define CONF_COMPLETE 1
#define CONF_NO_SRC 2
#define CONF_DST_EXPIRE 3
#define CONF_NO_FILE 4
#define ONE_DAY (24 * 3600)
#define ONE_HOUR (3600)
#define MAX_CONFIG_NUM 1024 /* store at most 1024 items */
#define MAGIC_NUM 0xabcdef78 /* used for matching pkts */
#if defined SUN || defined _BSD || defined __APPLE__
struct iphdr
{
#if defined BYTE_ORDER == LITTLE_ENDIAN || defined _BSD
unsigned int ihl:4;
unsigned int version:4;
#else
unsigned int version:4;
unsigned int ihl:4;
#endif
uint8_t tos;
uint16_t tot_len;
uint16_t id;
uint16_t frag_off;
uint8_t ttl;
uint8_t protocol;
uint16_t check;
uint32_t saddr;
uint32_t daddr;
/*The options start here. */
};
#endif /* SUN */
struct outdata {
u_char seq; /* sequence number of this packet */
u_char ttl; /* ttl packet left with */
struct timeval tv; /* time packet left */
};
/*
* Overlay for ip header used by other protocols (tcp, udp).
*/
struct ip_overlay {
caddr_t ih_next, ih_prev; /* for protocol sequence q's */
u_char ih_x1; /* (unused) */
u_char ih_pr; /* protocol */
u_short ih_len; /* protocol length */
struct in_addr ih_src; /* source internet address */
struct in_addr ih_dst; /* destination internet address */
};
/*
* UDP kernel structures and variables.
*/
struct udpip_header {
struct ip_overlay ui_i; /* overlaid ip structure */
struct udphdr ui_u; /* udp header */
};
#define ui_next ui_i.ih_next
#define ui_prev ui_i.ih_prev
#define ui_x1 ui_i.ih_x1
#define ui_pr ui_i.ih_pr
#define ui_len ui_i.ih_len
#define ui_src ui_i.ih_src
#define ui_dst ui_i.ih_dst
#define ui_sport ui_u.source
#define ui_dport ui_u.dest
#define ui_ulen ui_u.len
#define ui_sum ui_u.check
/* path node time sequence */
struct ip_icmp_hdr {
struct iphdr iph;
struct icmp icmph;
double stime;
double rtime;
};
/* ip_path */
struct time_arr {
int index[TRAIN_LEN]; /* index to time_path */
int cnt; /* number of indexes each phase */
double avg_gap;
int cong_order;
uint32_t ip;
int as;
};
/* used for sort the gap array */
struct value_pair {
int index; /* index to the position in ip_path */
double gap; /* average gap value */
};
extern struct ip_icmp_hdr time_path[MAX_REC];
extern int path_i;
extern struct time_arr ip_path[MAX_TTL];
extern int ip_path_len;
#define USAGE_TXT "\
Pathenck V1.2 Usage: \n\
\n\
./pathneck [-e end_pkt_num] [-l udp_pkt_num] [-s pkt_size] \n\
[-i self_ip] [-y delay_num] [-coptx] [-dvh] \n\
<dst_ip | dst_hostname> \n\
\n\
[probing configuration]\n\
-e end_pkt_num number of measurement packets [30] \n\
-l udp_pkt_num number of load packets [60] \n\
-s pkt_size the load packet size in byte [500] \n\
-c use ICMP probing packets, [UDP] \n\
-p use the planetlab raw socket interface [0] \n\
-y delay_num specify the src gap within the packet train [0] \n\
-i self_ip sproof the probing pkt source ip [not set] \n\
\n\
[output setting] \n\
-x enable the DNS lookup [0] \n\
-o enable on-line detection processing [0] \n\
-t dump the packet sending times [0] \n\
-d debug mode [0] \n\
-v verbose mode [0] \n\
-h print this message [0] \n\
"
#endif /* pathneck_h */
syntax highlighted by Code2HTML, v. 0.9.1