Blame packet/probe.h

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