Annotation of embedaddon/mtr/packet/probe.h, revision 1.1
1.1 ! misho 1: /*
! 2: mtr -- a network diagnostic tool
! 3: Copyright (C) 2016 Matt Kimball
! 4:
! 5: This program is free software; you can redistribute it and/or modify
! 6: it under the terms of the GNU General Public License version 2 as
! 7: published by the Free Software Foundation.
! 8:
! 9: This program is distributed in the hope that it will be useful,
! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 12: GNU General Public License for more details.
! 13:
! 14: You should have received a copy of the GNU General Public License
! 15: along with this program; if not, write to the Free Software
! 16: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
! 17: */
! 18:
! 19: #ifndef PROBE_H
! 20: #define PROBE_H
! 21:
! 22: #include "platform.h"
! 23:
! 24: #include <netinet/in.h>
! 25: #include <stdbool.h>
! 26: #include <sys/socket.h>
! 27: #include <sys/time.h>
! 28:
! 29: #include "portability/queue.h"
! 30:
! 31: #ifdef PLATFORM_CYGWIN
! 32: #include "probe_cygwin.h"
! 33: #else
! 34: #include "probe_unix.h"
! 35: #endif
! 36:
! 37: #define MAX_PROBES 1024
! 38:
! 39: /* Use the "jumbo" frame size as the max packet size */
! 40: #define PACKET_BUFFER_SIZE 9000
! 41:
! 42: /* Parameters for sending a new probe */
! 43: struct probe_param_t {
! 44: /* The version of the Internet Protocol to use. (4 or 6) */
! 45: int ip_version;
! 46:
! 47: /* The command token used to identify a probe when it is completed */
! 48: int command_token;
! 49:
! 50: /* The IP address to probe */
! 51: const char *remote_address;
! 52:
! 53: /* The local address from which to send probes */
! 54: const char *local_address;
! 55:
! 56: /* Protocol for the probe, using the IPPROTO_* defines */
! 57: int protocol;
! 58:
! 59: /* The destination port for non-ICMP probes */
! 60: int dest_port;
! 61:
! 62: /* The local port number to use when sending probes */
! 63: int local_port;
! 64:
! 65: /* The "type of service" field in the IP header */
! 66: int type_of_service;
! 67:
! 68: /* The packet "mark" used for mark-based routing on Linux */
! 69: int routing_mark;
! 70:
! 71: /* Time to live for the transmited probe */
! 72: int ttl;
! 73:
! 74: /* The packet size (in bytes) including protocol headers */
! 75: int packet_size;
! 76:
! 77: /* The value with which to fill the bytes of the packet. */
! 78: int bit_pattern;
! 79:
! 80: /* The number of seconds to wait before assuming the probe was lost */
! 81: int timeout;
! 82: };
! 83:
! 84: /* Tracking information for an outstanding probe */
! 85: struct probe_t {
! 86: /* Our entry in the probe list */
! 87: LIST_ENTRY(
! 88: probe_t) probe_list_entry;
! 89:
! 90: /*
! 91: Also the ICMP sequence ID used to identify the probe.
! 92:
! 93: Also used as the port number to use when binding stream protocol
! 94: sockets for this probe. (i.e. TCP or SCTP)
! 95: */
! 96: int sequence;
! 97:
! 98: /* Command token of the probe request */
! 99: int token;
! 100:
! 101: /* The address being probed */
! 102: struct sockaddr_storage remote_addr;
! 103:
! 104: /* Platform specific probe tracking */
! 105: struct probe_platform_t platform;
! 106: };
! 107:
! 108: /* Global state for interacting with the network */
! 109: struct net_state_t {
! 110: /* The number of entries in the outstanding_probes list */
! 111: int outstanding_probe_count;
! 112:
! 113: /* Tracking information for in-flight probes */
! 114: LIST_HEAD(
! 115: probe_list_head_t,
! 116: probe_t) outstanding_probes;
! 117:
! 118: /* Platform specific tracking information */
! 119: struct net_state_platform_t platform;
! 120: };
! 121:
! 122: /* Multiprotocol Label Switching information */
! 123: struct mpls_label_t {
! 124: uint32_t label;
! 125: uint8_t experimental_use;
! 126: uint8_t bottom_of_stack;
! 127: uint8_t ttl;
! 128: };
! 129:
! 130: void init_net_state_privileged(
! 131: struct net_state_t *net_state);
! 132:
! 133: void init_net_state(
! 134: struct net_state_t *net_state);
! 135:
! 136: bool is_ip_version_supported(
! 137: struct net_state_t *net_state,
! 138: int ip_version);
! 139:
! 140: bool is_protocol_supported(
! 141: struct net_state_t *net_state,
! 142: int protocol);
! 143:
! 144: bool get_next_probe_timeout(
! 145: const struct net_state_t *net_state,
! 146: struct timeval *timeout);
! 147:
! 148: void send_probe(
! 149: struct net_state_t *net_state,
! 150: const struct probe_param_t *param);
! 151:
! 152: void receive_replies(
! 153: struct net_state_t *net_state);
! 154:
! 155: void check_probe_timeouts(
! 156: struct net_state_t *net_state);
! 157:
! 158: void respond_to_probe(
! 159: struct net_state_t *net_state,
! 160: struct probe_t *probe,
! 161: int icmp_type,
! 162: const struct sockaddr_storage *remote_addr,
! 163: unsigned int round_trip_us,
! 164: int mpls_count,
! 165: const struct mpls_label_t *mpls);
! 166:
! 167: int decode_address_string(
! 168: int ip_version,
! 169: const char *address_string,
! 170: struct sockaddr_storage *address);
! 171:
! 172: int resolve_probe_addresses(
! 173: const struct probe_param_t *param,
! 174: struct sockaddr_storage *dest_sockaddr,
! 175: struct sockaddr_storage *src_sockaddr);
! 176:
! 177: struct probe_t *alloc_probe(
! 178: struct net_state_t *net_state,
! 179: int token);
! 180:
! 181: void free_probe(
! 182: struct net_state_t *net_state,
! 183: struct probe_t *probe);
! 184:
! 185: void platform_alloc_probe(
! 186: struct net_state_t *net_state,
! 187: struct probe_t *probe);
! 188:
! 189: void platform_free_probe(
! 190: struct probe_t *probe);
! 191:
! 192: struct probe_t *find_probe(
! 193: struct net_state_t *net_state,
! 194: int protocol,
! 195: int icmp_id,
! 196: int icmp_sequence);
! 197:
! 198: int find_source_addr(
! 199: struct sockaddr_storage *srcaddr,
! 200: const struct sockaddr_storage *destaddr);
! 201:
! 202: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>