@@ -303,11 +303,13 @@ void tracecmd_enable_tracing(void);
enum tracecmd_msg_bits {
TRACECMD_MSG_BIT_CLIENT = 0,
TRACECMD_MSG_BIT_SERVER = 1,
+ TRACECMD_MSG_BIT_USE_TCP = 2,
};
enum tracecmd_msg_flags {
TRACECMD_MSG_FL_CLIENT = (1 << TRACECMD_MSG_BIT_CLIENT),
TRACECMD_MSG_FL_SERVER = (1 << TRACECMD_MSG_BIT_SERVER),
+ TRACECMD_MSG_FL_USE_TCP = (1 << TRACECMD_MSG_BIT_USE_TCP),
};
/* for both client and server */
@@ -112,11 +112,11 @@ static int read_string(int fd, char *buf, size_t size)
return i;
}
-static int process_option(char *option)
+static int process_option(struct tracecmd_msg_handle *msg_handle, char *option)
{
/* currently the only option we have is to us TCP */
if (strcmp(option, "TCP") == 0) {
- use_tcp = 1;
+ msg_handle->flags |= TRACECMD_MSG_FL_USE_TCP;
return 1;
}
return 0;
@@ -225,7 +225,7 @@ void pdie(const char *fmt, ...)
}
static int process_udp_child(int sfd, const char *host, const char *port,
- int cpu, int page_size)
+ int cpu, int page_size, int use_tcp)
{
struct sockaddr_storage peer_addr;
socklen_t peer_addr_len;
@@ -292,7 +292,7 @@ static int process_udp_child(int sfd, const char *host, const char *port,
#define START_PORT_SEARCH 1500
#define MAX_PORT_SEARCH 6000
-static int udp_bind_a_port(int start_port, int *sfd)
+static int udp_bind_a_port(int start_port, int *sfd, int use_tcp)
{
struct addrinfo hints;
struct addrinfo *result, *rp;
@@ -337,7 +337,7 @@ static int udp_bind_a_port(int start_port, int *sfd)
}
static void fork_udp_reader(int sfd, const char *node, const char *port,
- int *pid, int cpu, int pagesize)
+ int *pid, int cpu, int pagesize, int use_tcp)
{
int ret;
@@ -347,7 +347,7 @@ static void fork_udp_reader(int sfd, const char *node, const char *port,
pdie("creating udp reader");
if (!*pid) {
- ret = process_udp_child(sfd, node, port, cpu, pagesize);
+ ret = process_udp_child(sfd, node, port, cpu, pagesize, use_tcp);
if (ret < 0)
pdie("Problem with udp reader %d", ret);
}
@@ -356,7 +356,7 @@ static void fork_udp_reader(int sfd, const char *node, const char *port,
}
static int open_udp(const char *node, const char *port, int *pid,
- int cpu, int pagesize, int start_port)
+ int cpu, int pagesize, int start_port, int use_tcp)
{
int sfd;
int num_port;
@@ -365,11 +365,11 @@ static int open_udp(const char *node, const char *port, int *pid,
* udp_bind_a_port() currently does not return an error, but if that
* changes in the future, we have a check for it now.
*/
- num_port = udp_bind_a_port(start_port, &sfd);
+ num_port = udp_bind_a_port(start_port, &sfd, use_tcp);
if (num_port < 0)
return num_port;
- fork_udp_reader(sfd, node, port, pid, cpu, pagesize);
+ fork_udp_reader(sfd, node, port, pid, cpu, pagesize, use_tcp);
return num_port;
}
@@ -495,7 +495,7 @@ static int communicate_with_client(struct tracecmd_msg_handle *msg_handle,
s = size - t;
} while (t);
- s = process_option(option);
+ s = process_option(msg_handle, option);
free(option);
/* do we understand this option? */
ret = -EINVAL;
@@ -504,7 +504,7 @@ static int communicate_with_client(struct tracecmd_msg_handle *msg_handle,
}
}
- if (use_tcp)
+ if (msg_handle->flags & TRACECMD_MSG_FL_USE_TCP)
plog("Using TCP for live connection\n");
ret = 0;
@@ -547,6 +547,7 @@ static void destroy_all_readers(int cpus, int *pid_array, const char *node,
static int *create_all_readers(int cpus, const char *node, const char *port,
int pagesize, struct tracecmd_msg_handle *msg_handle)
{
+ int use_tcp = msg_handle->flags & TRACECMD_MSG_FL_USE_TCP;
char buf[BUFSIZ];
int *port_array;
int *pid_array;
@@ -572,7 +573,7 @@ static int *create_all_readers(int cpus, const char *node, const char *port,
/* Now create a UDP port for each CPU */
for (cpu = 0; cpu < cpus; cpu++) {
udp_port = open_udp(node, port, &pid, cpu,
- pagesize, start_port);
+ pagesize, start_port, use_tcp);
if (udp_port < 0)
goto out_free;
port_array[cpu] = udp_port;
@@ -75,10 +75,6 @@ static inline void dprint(const char *fmt, ...)
#define MIN_META_SIZE (sizeof(struct tracecmd_msg_header) + \
sizeof(struct tracecmd_msg_meta))
-/* for both client and server */
-bool use_tcp;
-
-/* for client */
unsigned int page_size;
struct tracecmd_msg_server {
@@ -198,13 +194,14 @@ enum msg_opt_command {
MSGOPT_USETCP = 1,
};
-static int make_tinit(struct tracecmd_msg *msg, int total_cpus)
+static int make_tinit(struct tracecmd_msg_handle *msg_handle,
+ struct tracecmd_msg *msg, int total_cpus)
{
struct tracecmd_msg_opt *opt;
int opt_num = 0;
int size = MIN_TINIT_SIZE;
- if (use_tcp) {
+ if (msg_handle->flags & TRACECMD_MSG_FL_USE_TCP) {
opt_num++;
opt = malloc(sizeof(*opt));
if (!opt)
@@ -434,7 +431,7 @@ int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle,
*client_ports = NULL;
tracecmd_msg_init(MSG_TINIT, &send_msg);
- ret = make_tinit(&send_msg, total_cpus);
+ ret = make_tinit(msg_handle, &send_msg, total_cpus);
if (ret < 0)
return ret;
@@ -459,11 +456,12 @@ int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle,
return 0;
}
-static bool process_option(struct tracecmd_msg_opt *opt)
+static bool process_option(struct tracecmd_msg_handle *msg_handle,
+ struct tracecmd_msg_opt *opt)
{
/* currently the only option we have is to us TCP */
if (ntohl(opt->opt_cmd) == MSGOPT_USETCP) {
- use_tcp = true;
+ msg_handle->flags |= TRACECMD_MSG_FL_USE_TCP;
return true;
}
return false;
@@ -539,7 +537,7 @@ int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle,
ret = -EINVAL;
goto error;
}
- s = process_option(opt);
+ s = process_option(msg_handle, opt);
/* do we understand this option? */
if (!s) {
plog("Cannot understand(%d:%d:%d)\n",
@@ -10,10 +10,6 @@
#define V1_PROTOCOL 1
#define V2_PROTOCOL 2
-/* for both client and server */
-extern bool use_tcp;
-
-/* for client */
extern unsigned int page_size;
void plog(const char *fmt, ...);
@@ -95,6 +95,8 @@ static struct tracecmd_output *network_handle;
/* Max size to let a per cpu file get */
static int max_kb;
+static bool use_tcp;
+
static int do_ptrace;
static int filter_task;
@@ -2719,6 +2721,7 @@ static void communicate_with_listener_v1(struct tracecmd_msg_handle *msg_handle)
if (page_size >= UDP_MAX_PACKET) {
warning("page size too big for UDP using TCP in live read");
use_tcp = 1;
+ msg_handle->flags |= TRACECMD_MSG_FL_USE_TCP;
}
if (use_tcp) {
@@ -2859,6 +2862,9 @@ again:
if (!msg_handle)
die("Failed to allocate message handle");
+ if (use_tcp)
+ msg_handle->flags |= TRACECMD_MSG_FL_USE_TCP;
+
if (proto_ver == V2_PROTOCOL) {
check_protocol_version(msg_handle);
if (proto_ver == V1_PROTOCOL) {