|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
mtr -- a network diagnostic tool
|
|
Packit |
b802ec |
Copyright (C) 2016 Matt Kimball
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
b802ec |
it under the terms of the GNU General Public License version 2 as
|
|
Packit |
b802ec |
published by the Free Software Foundation.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
This program is distributed in the hope that it will be useful,
|
|
Packit |
b802ec |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b802ec |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
b802ec |
GNU General Public License for more details.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
You should have received a copy of the GNU General Public License
|
|
Packit |
b802ec |
along with this program; if not, write to the Free Software
|
|
Packit |
b802ec |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#ifndef PROBE_H
|
|
Packit |
b802ec |
#define PROBE_H
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include "platform.h"
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include <netinet/in.h>
|
|
Packit |
b802ec |
#include <stdbool.h>
|
|
Packit |
b802ec |
#include <sys/socket.h>
|
|
Packit |
b802ec |
#include <sys/time.h>
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#include "portability/queue.h"
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#ifdef PLATFORM_CYGWIN
|
|
Packit |
b802ec |
#include "probe_cygwin.h"
|
|
Packit |
b802ec |
#else
|
|
Packit |
b802ec |
#include "probe_unix.h"
|
|
Packit |
b802ec |
#endif
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#define MAX_PROBES 1024
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Use the "jumbo" frame size as the max packet size */
|
|
Packit |
b802ec |
#define PACKET_BUFFER_SIZE 9000
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Parameters for sending a new probe */
|
|
Packit |
b802ec |
struct probe_param_t {
|
|
Packit |
b802ec |
/* The version of the Internet Protocol to use. (4 or 6) */
|
|
Packit |
b802ec |
int ip_version;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The command token used to identify a probe when it is completed */
|
|
Packit |
b802ec |
int command_token;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The IP address to probe */
|
|
Packit |
b802ec |
const char *remote_address;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The local address from which to send probes */
|
|
Packit |
b802ec |
const char *local_address;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Protocol for the probe, using the IPPROTO_* defines */
|
|
Packit |
b802ec |
int protocol;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The destination port for non-ICMP probes */
|
|
Packit |
b802ec |
int dest_port;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The local port number to use when sending probes */
|
|
Packit |
b802ec |
int local_port;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The "type of service" field in the IP header */
|
|
Packit |
b802ec |
int type_of_service;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The packet "mark" used for mark-based routing on Linux */
|
|
Packit |
b802ec |
int routing_mark;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Time to live for the transmited probe */
|
|
Packit |
b802ec |
int ttl;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The packet size (in bytes) including protocol headers */
|
|
Packit |
b802ec |
int packet_size;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The value with which to fill the bytes of the packet. */
|
|
Packit |
b802ec |
int bit_pattern;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The number of seconds to wait before assuming the probe was lost */
|
|
Packit |
b802ec |
int timeout;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Tracking information for an outstanding probe */
|
|
Packit |
b802ec |
struct probe_t {
|
|
Packit |
b802ec |
/* Our entry in the probe list */
|
|
Packit |
b802ec |
LIST_ENTRY(
|
|
Packit |
b802ec |
probe_t) probe_list_entry;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/*
|
|
Packit |
b802ec |
Also the ICMP sequence ID used to identify the probe.
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
Also used as the port number to use when binding stream protocol
|
|
Packit |
b802ec |
sockets for this probe. (i.e. TCP or SCTP)
|
|
Packit |
b802ec |
*/
|
|
Packit |
b802ec |
int sequence;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Command token of the probe request */
|
|
Packit |
b802ec |
int token;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* The address being probed */
|
|
Packit |
b802ec |
struct sockaddr_storage remote_addr;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Platform specific probe tracking */
|
|
Packit |
b802ec |
struct probe_platform_t platform;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Global state for interacting with the network */
|
|
Packit |
b802ec |
struct net_state_t {
|
|
Packit |
b802ec |
/* The number of entries in the outstanding_probes list */
|
|
Packit |
b802ec |
int outstanding_probe_count;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Tracking information for in-flight probes */
|
|
Packit |
b802ec |
LIST_HEAD(
|
|
Packit |
b802ec |
probe_list_head_t,
|
|
Packit |
b802ec |
probe_t) outstanding_probes;
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Platform specific tracking information */
|
|
Packit |
b802ec |
struct net_state_platform_t platform;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
/* Multiprotocol Label Switching information */
|
|
Packit |
b802ec |
struct mpls_label_t {
|
|
Packit |
b802ec |
uint32_t label;
|
|
Packit |
b802ec |
uint8_t experimental_use;
|
|
Packit |
b802ec |
uint8_t bottom_of_stack;
|
|
Packit |
b802ec |
uint8_t ttl;
|
|
Packit |
b802ec |
};
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void init_net_state_privileged(
|
|
Packit |
b802ec |
struct net_state_t *net_state);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void init_net_state(
|
|
Packit |
b802ec |
struct net_state_t *net_state);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
bool is_ip_version_supported(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
int ip_version);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
bool is_protocol_supported(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
int protocol);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
bool get_next_probe_timeout(
|
|
Packit |
b802ec |
const struct net_state_t *net_state,
|
|
Packit |
b802ec |
struct timeval *timeout);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void send_probe(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
const struct probe_param_t *param);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void receive_replies(
|
|
Packit |
b802ec |
struct net_state_t *net_state);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void check_probe_timeouts(
|
|
Packit |
b802ec |
struct net_state_t *net_state);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void respond_to_probe(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
struct probe_t *probe,
|
|
Packit |
b802ec |
int icmp_type,
|
|
Packit |
b802ec |
const struct sockaddr_storage *remote_addr,
|
|
Packit |
b802ec |
unsigned int round_trip_us,
|
|
Packit |
b802ec |
int mpls_count,
|
|
Packit |
b802ec |
const struct mpls_label_t *mpls);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
int decode_address_string(
|
|
Packit |
b802ec |
int ip_version,
|
|
Packit |
b802ec |
const char *address_string,
|
|
Packit |
b802ec |
struct sockaddr_storage *address);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
int resolve_probe_addresses(
|
|
Packit |
b802ec |
const struct probe_param_t *param,
|
|
Packit |
b802ec |
struct sockaddr_storage *dest_sockaddr,
|
|
Packit |
b802ec |
struct sockaddr_storage *src_sockaddr);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
struct probe_t *alloc_probe(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
int token);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void free_probe(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
struct probe_t *probe);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void platform_alloc_probe(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
struct probe_t *probe);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
void platform_free_probe(
|
|
Packit |
b802ec |
struct probe_t *probe);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
struct probe_t *find_probe(
|
|
Packit |
b802ec |
struct net_state_t *net_state,
|
|
Packit |
b802ec |
int protocol,
|
|
Packit |
b802ec |
int icmp_id,
|
|
Packit |
b802ec |
int icmp_sequence);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
int find_source_addr(
|
|
Packit |
b802ec |
struct sockaddr_storage *srcaddr,
|
|
Packit |
b802ec |
const struct sockaddr_storage *destaddr);
|
|
Packit |
b802ec |
|
|
Packit |
b802ec |
#endif
|