Annotation of embedaddon/mtr/packet/probe.h, revision 1.1.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>