diff options
author | Jianfeng Tan <henry.tjf@antfin.com> | 2019-11-18 06:59:50 +0000 |
---|---|---|
committer | Jianfeng Tan <henry.tjf@antfin.com> | 2020-03-05 01:31:33 +0800 |
commit | 78c896b3b3127515478090c19447e27dc406427e (patch) | |
tree | d6d67d4683e9ca0409f9984a834547a572fb5310 /test/packetdrill/config.h | |
parent | e4380f4866091fd92a7a57667dd938a99144f9cd (diff) |
TLDKv2dev-next-socket
Signed-off-by: Jianfeng Tan <henry.tjf@antfin.com>
Signed-off-by: Jielong Zhou <jielong.zjl@antfin.com>
Signed-off-by: Jian Zhang <wuzai.zj@antfin.com>
Signed-off-by: Chen Zhao <winters.zc@antfin.com>
Change-Id: I55c39de4c6cd30f991f35631eb507f770230f08e
Diffstat (limited to 'test/packetdrill/config.h')
-rw-r--r-- | test/packetdrill/config.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/test/packetdrill/config.h b/test/packetdrill/config.h new file mode 100644 index 0000000..649a8c4 --- /dev/null +++ b/test/packetdrill/config.h @@ -0,0 +1,204 @@ +/* + * Copyright 2013 Google Inc. + * + * 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 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., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ +/* + * Author: ncardwell@google.com (Neal Cardwell) + * + * Configuration information for a test run, and helper functions. + */ + +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#include "types.h" + +#include <netinet/in.h> +#include <sys/socket.h> +#include <unistd.h> +#include <getopt.h> +#include "ip_address.h" +#include "ip_prefix.h" +#include "script.h" + +#define TUN_DRIVER_SPEED_CUR 0 /* don't change current speed */ +#define TUN_DRIVER_DEFAULT_MTU 1500 /* default MTU for tun device */ + +extern struct option options[]; + +/* A linked list of symbol->value (FOO=bar) definitions from command line. */ +struct definition { + char *symbol; /* name of the symbol; owns the string */ + char *value; /* value of the symbol; owns the string */ + struct definition *next; /* link for linked list */ +}; + +/* Return the definition in the linked list with a matching symbol, or NULL */ +static inline struct definition *definition_find(struct definition *defs, + char *symbol) +{ + struct definition *def = NULL; + + for (def = defs; def != NULL; def = def->next) { + if (strcmp(def->symbol, symbol) == 0) + return def; + } + return NULL; +} + +/* Set the value of the given symbol to the given value. */ +static inline void definition_set(struct definition **defs, + char *symbol, char *value) +{ + struct definition *def = definition_find(*defs, symbol); + + if (def) { + free(def->value); + def->value = value; + } else { + def = calloc(1, sizeof(struct definition)); + def->symbol = symbol; + def->value = value; + def->next = *defs; /* link to existing entries */ + *defs = def; /* insert at head of linked list */ + } +} + +/* Return the value of the given symbol, or NULL if not found. */ +static inline char *definition_get(struct definition *defs, char *symbol) +{ + struct definition *def = definition_find(defs, symbol); + + return def ? def->value : NULL; +} + +struct config { + const char **argv; /* a copy of process argv */ + + enum ip_version_t ip_version; /* v4, v4-mapped-v6, v6 */ + int socket_domain; /* AF_INET or AF_INET6 */ + int wire_protocol; /* AF_INET or AF_INET6 */ + + u16 live_bind_port; /* local port for bind() */ + u16 live_connect_port; /* remote port for connect() */ + + struct ip_address live_bind_ip; /* address for bind() */ + struct ip_address live_connect_ip; /* address for connect() */ + + struct ip_address live_local_ip; /* local interface IP */ + struct ip_address live_remote_ip; /* remote interface IP */ + struct ip_prefix live_remote_prefix; /* remote prefix under test */ + struct ip_address live_gateway_ip; /* gateway interface IP */ + + char live_local_ip_string[ADDR_STR_LEN]; /* human-readable IP */ + char live_remote_ip_string[ADDR_STR_LEN]; /* human-readable IP */ + char live_remote_prefix_string[ADDR_STR_LEN]; /* <addr>/<prefixlen> */ + + char live_gateway_ip_string[ADDR_STR_LEN]; /* local gateway IP */ + char live_netmask_ip_string[ADDR_STR_LEN]; /* local netmask */ + + int live_prefix_len; /* IPv4/IPv6 interface prefix len */ + + int tolerance_usecs; /* tolerance for time divergence */ + bool tcp_ts_ecr_scaled; /* scale arbitrary inbound TS ECR? */ + int tcp_ts_tick_usecs; /* microseconds per TS val tick */ + + u32 speed; /* speed reported by tun driver; + * may require special tun driver + */ + int mss; /* gso_size for GRO packets to tun device */ + int mtu; /* MTU of tun device */ + + bool strict_segments; /* check exact segmentation? */ + + bool non_fatal_packet; /* treat packet asserts as non-fatal */ + bool non_fatal_syscall; /* treat syscall asserts as non-fatal */ + bool send_omit_free; /* do not call free() */ + + bool dry_run; /* parse script but don't execute? */ + + bool verbose; /* print detailed debug info? */ + char *script_path; /* pathname of script file */ + + /* Shell command to invoke via system(3) to run post-processing code */ + char *code_command_line; + + /* Language to emit when generating post-processing code */ + char *code_format; + + /* setsockopt option number (TCP_INFO, ...) for code */ + char *code_sockopt; + + /* File scripts to run at beginning of test (using system) */ + char *init_scripts; + + /* For remote on-the-wire testing using a real NIC. */ + bool is_wire_client; /* use a real NIC and be client? */ + bool is_wire_server; /* use a real NIC and be server? */ + char *wire_client_device; /* iface name for send/receive */ + char *wire_server_device; /* iface name for send/receive */ + struct ip_address wire_server_ip; /* IP of on-the-wire server */ + char *wire_server_ip_string; /* malloc-ed server IP string */ + u16 wire_server_port; /* the port the server listens on */ + + /* For testing against a shared object (*.so) file. */ + char *so_filename; + char *so_flags; + + /* For anyip testing */ + bool is_anyip; + + /* List of FOO=bar definitions from command line. */ + struct definition *defines; +}; + +/* Top-level info about the invocation of a test script */ +struct invocation { + int argc; /* count of process command line args */ + char **argv; /* process command line args */ + struct config *config; /* run-time configuration */ + struct script *script; /* parse tree of the script to run */ +}; + +/* Set default configuration */ +extern void set_default_config(struct config *config); + +/* Parse the "non-fatal" command line options given the (comma-delimited) string + * from the command line. Modifies the associated booleans in the given + * config. + */ +extern void parse_non_fatal_arg(char *arg, struct config *config); + +/* Perform configuration processing that can only be done after we've + * seen the full config. For example, we only know how to use IP + * addresses after we know if we're doing ipv4, ipv4-mapped-ipv6, or + * ipv6. Call this after all options have been parsed. + */ +extern void finalize_config(struct config *config); + +extern void show_usage(void); + +/* Parse command line options. Returns a pointer to the first argument + * beyond the options. + */ +extern char **parse_command_line_options(int argc, char *argv[], + struct config *config); + +/* The parser calls this function to finalize processing of config info. */ +extern void parse_and_finalize_config(struct invocation *invocation); + +#endif /* __CONFIG_H__ */ |