projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: deny the same port for data and control URL
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
cmd.c
diff --git
a/src/bin/lttng-sessiond/cmd.c
b/src/bin/lttng-sessiond/cmd.c
index a47c504c718736e86425bd4c58d95134ec4f8b9c..7819002d04472b3f67cfd2501f3f87deb0cf251c 100644
(file)
--- a/
src/bin/lttng-sessiond/cmd.c
+++ b/
src/bin/lttng-sessiond/cmd.c
@@
-28,6
+28,7
@@
#include "channel.h"
#include "consumer.h"
#include "event.h"
#include "channel.h"
#include "consumer.h"
#include "event.h"
+#include "health.h"
#include "kernel.h"
#include "kernel-consumer.h"
#include "lttng-sessiond.h"
#include "kernel.h"
#include "kernel-consumer.h"
#include "lttng-sessiond.h"
@@
-38,12
+39,11
@@
/*
* Used to keep a unique index for each relayd socket created where this value
* is associated with streams on the consumer so it can match the right relayd
/*
* Used to keep a unique index for each relayd socket created where this value
* is associated with streams on the consumer so it can match the right relayd
- * to send to.
- *
- * This value should be incremented atomically for safety purposes and future
- * possible concurrent access.
+ * to send to. It must be accessed with the relayd_net_seq_idx_lock
+ * held.
*/
*/
-static unsigned int relayd_net_seq_idx;
+static pthread_mutex_t relayd_net_seq_idx_lock = PTHREAD_MUTEX_INITIALIZER;
+static uint64_t relayd_net_seq_idx;
/*
* Create a session path used by list_lttng_sessions for the case that the
/*
* Create a session path used by list_lttng_sessions for the case that the
@@
-306,8
+306,12
@@
static int list_lttng_kernel_events(char *channel_name,
case LTTNG_KERNEL_TRACEPOINT:
(*events)[i].type = LTTNG_EVENT_TRACEPOINT;
break;
case LTTNG_KERNEL_TRACEPOINT:
(*events)[i].type = LTTNG_EVENT_TRACEPOINT;
break;
- case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_KRETPROBE:
+ (*events)[i].type = LTTNG_EVENT_FUNCTION;
+ memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
+ sizeof(struct lttng_kernel_kprobe));
+ break;
+ case LTTNG_KERNEL_KPROBE:
(*events)[i].type = LTTNG_EVENT_PROBE;
memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
sizeof(struct lttng_kernel_kprobe));
(*events)[i].type = LTTNG_EVENT_PROBE;
memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
sizeof(struct lttng_kernel_kprobe));
@@
-376,20
+380,24
@@
static int add_uri_to_consumer(struct consumer_output *consumer,
case LTTNG_DST_IPV6:
DBG2("Setting network URI to consumer");
case LTTNG_DST_IPV6:
DBG2("Setting network URI to consumer");
- consumer->type = CONSUMER_DST_NET;
-
- if ((uri->stype == LTTNG_STREAM_CONTROL &&
+ if (consumer->type == CONSUMER_DST_NET) {
+ if ((uri->stype == LTTNG_STREAM_CONTROL &&
consumer->dst.net.control_isset) ||
(uri->stype == LTTNG_STREAM_DATA &&
consumer->dst.net.data_isset)) {
consumer->dst.net.control_isset) ||
(uri->stype == LTTNG_STREAM_DATA &&
consumer->dst.net.data_isset)) {
- ret = LTTNG_ERR_URL_EXIST;
- goto error;
+ ret = LTTNG_ERR_URL_EXIST;
+ goto error;
+ }
+ } else {
+ memset(&consumer->dst.net, 0, sizeof(consumer->dst.net));
}
}
+ consumer->type = CONSUMER_DST_NET;
+
/* Set URI into consumer output object */
ret = consumer_set_network_uri(consumer, uri);
if (ret < 0) {
/* Set URI into consumer output object */
ret = consumer_set_network_uri(consumer, uri);
if (ret < 0) {
- ret =
LTTNG_ERR_FATAL
;
+ ret =
-ret
;
goto error;
} else if (ret == 1) {
/*
goto error;
} else if (ret == 1) {
/*
@@
-430,6
+438,8
@@
static int add_uri_to_consumer(struct consumer_output *consumer,
break;
}
break;
}
+ ret = LTTNG_OK;
+
error:
return ret;
}
error:
return ret;
}
@@
-474,22
+484,15
@@
error:
* On success, the relayd_sock pointer is set to the created socket.
* Else, it's stays untouched and a lttcomm error code is returned.
*/
* On success, the relayd_sock pointer is set to the created socket.
* Else, it's stays untouched and a lttcomm error code is returned.
*/
-static int create_connect_relayd(struct consumer_output *output,
- const char *session_name, struct lttng_uri *uri,
- struct lttcomm_sock **relayd_sock)
+static int create_connect_relayd(struct lttng_uri *uri,
+ struct lttcomm_relayd_sock **relayd_sock)
{
int ret;
{
int ret;
- struct lttcomm_sock *sock;
-
- /* Create socket object from URI */
- sock = lttcomm_alloc_sock_from_uri(uri);
- if (sock == NULL) {
- ret = LTTNG_ERR_FATAL;
- goto error;
- }
+ struct lttcomm_relayd_sock *rsock;
- ret = lttcomm_create_sock(sock);
- if (ret < 0) {
+ rsock = lttcomm_alloc_relayd_sock(uri, RELAYD_VERSION_COMM_MAJOR,
+ RELAYD_VERSION_COMM_MINOR);
+ if (!rsock) {
ret = LTTNG_ERR_FATAL;
goto error;
}
ret = LTTNG_ERR_FATAL;
goto error;
}
@@
-500,7
+503,7
@@
static int create_connect_relayd(struct consumer_output *output,
* state to be in poll execution.
*/
health_poll_entry();
* state to be in poll execution.
*/
health_poll_entry();
- ret = relayd_connect(sock);
+ ret = relayd_connect(
r
sock);
health_poll_exit();
if (ret < 0) {
ERR("Unable to reach lttng-relayd");
health_poll_exit();
if (ret < 0) {
ERR("Unable to reach lttng-relayd");
@@
-513,8
+516,7
@@
static int create_connect_relayd(struct consumer_output *output,
DBG3("Creating relayd stream socket from URI");
/* Check relayd version */
DBG3("Creating relayd stream socket from URI");
/* Check relayd version */
- ret = relayd_version_check(sock, RELAYD_VERSION_COMM_MAJOR,
- RELAYD_VERSION_COMM_MINOR);
+ ret = relayd_version_check(rsock);
if (ret < 0) {
ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
goto close_sock;
if (ret < 0) {
ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
goto close_sock;
@@
-528,18
+530,15
@@
static int create_connect_relayd(struct consumer_output *output,
goto close_sock;
}
goto close_sock;
}
- *relayd_sock = sock;
+ *relayd_sock =
r
sock;
return LTTNG_OK;
close_sock:
return LTTNG_OK;
close_sock:
- if (sock) {
- (void) relayd_close(sock);
- }
+ /* The returned value is not useful since we are on an error path. */
+ (void) relayd_close(rsock);
free_sock:
free_sock:
- if (sock) {
- lttcomm_destroy_sock(sock);
- }
+ free(rsock);
error:
return ret;
}
error:
return ret;
}
@@
-552,13
+551,14
@@
static int send_consumer_relayd_socket(int domain, struct ltt_session *session,
struct consumer_socket *consumer_sock)
{
int ret;
struct consumer_socket *consumer_sock)
{
int ret;
- struct lttcomm_
sock *
sock = NULL;
+ struct lttcomm_
relayd_sock *r
sock = NULL;
/* Connect to relayd and make version check if uri is the control. */
/* Connect to relayd and make version check if uri is the control. */
- ret = create_connect_relayd(
consumer, session->name, relayd_uri, &
sock);
+ ret = create_connect_relayd(
relayd_uri, &r
sock);
if (ret != LTTNG_OK) {
if (ret != LTTNG_OK) {
- goto
close_sock
;
+ goto
error
;
}
}
+ assert(rsock);
/* If the control socket is connected, network session is ready */
if (relayd_uri->stype == LTTNG_STREAM_CONTROL) {
/* If the control socket is connected, network session is ready */
if (relayd_uri->stype == LTTNG_STREAM_CONTROL) {
@@
-566,20
+566,20
@@
static int send_consumer_relayd_socket(int domain, struct ltt_session *session,
}
/* Set the network sequence index if not set. */
}
/* Set the network sequence index if not set. */
- if (consumer->net_seq_index == -1) {
+ if (consumer->net_seq_index == (uint64_t) -1ULL) {
+ pthread_mutex_lock(&relayd_net_seq_idx_lock);
/*
* Increment net_seq_idx because we are about to transfer the
* new relayd socket to the consumer.
/*
* Increment net_seq_idx because we are about to transfer the
* new relayd socket to the consumer.
+ * Assign unique key so the consumer can match streams.
*/
*/
- uatomic_inc(&relayd_net_seq_idx);
- /* Assign unique key so the consumer can match streams */
- uatomic_set(&consumer->net_seq_index,
- uatomic_read(&relayd_net_seq_idx));
+ consumer->net_seq_index = ++relayd_net_seq_idx;
+ pthread_mutex_unlock(&relayd_net_seq_idx_lock);
}
/* Send relayd socket to consumer. */
}
/* Send relayd socket to consumer. */
- ret = consumer_send_relayd_socket(consumer_sock,
sock
,
-
consumer,
relayd_uri->stype, session->id);
+ ret = consumer_send_relayd_socket(consumer_sock,
rsock, consumer
,
+ relayd_uri->stype, session->id);
if (ret < 0) {
ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL;
goto close_sock;
if (ret < 0) {
ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL;
goto close_sock;
@@
-600,11
+600,10
@@
static int send_consumer_relayd_socket(int domain, struct ltt_session *session,
*/
close_sock:
*/
close_sock:
- if (sock) {
- (void) relayd_close(sock);
- lttcomm_destroy_sock(sock);
- }
+ (void) relayd_close(rsock);
+ free(rsock);
+error:
if (ret != LTTNG_OK) {
/*
* On error, nullify the consumer sequence index so streams are not
if (ret != LTTNG_OK) {
/*
* On error, nullify the consumer sequence index so streams are not
@@
-612,7
+611,6
@@
close_sock:
*/
uatomic_set(&consumer->net_seq_index, -1);
}
*/
uatomic_set(&consumer->net_seq_index, -1);
}
-
return ret;
}
return ret;
}
@@
-817,7
+815,7
@@
int cmd_disable_channel(struct ltt_session *session, int domain,
goto error;
}
goto error;
}
- ret = channel_ust_disable(usess,
domain,
uchan);
+ ret = channel_ust_disable(usess, uchan);
if (ret != LTTNG_OK) {
goto error;
}
if (ret != LTTNG_OK) {
goto error;
}
@@
-846,7
+844,7
@@
error:
* The wpipe arguments is used as a notifier for the kernel thread.
*/
int cmd_enable_channel(struct ltt_session *session,
* The wpipe arguments is used as a notifier for the kernel thread.
*/
int cmd_enable_channel(struct ltt_session *session,
-
int
domain, struct lttng_channel *attr, int wpipe)
+
struct lttng_domain *
domain, struct lttng_channel *attr, int wpipe)
{
int ret;
struct ltt_ust_session *usess = session->ust_session;
{
int ret;
struct ltt_ust_session *usess = session->ust_session;
@@
-854,12
+852,13
@@
int cmd_enable_channel(struct ltt_session *session,
assert(session);
assert(attr);
assert(session);
assert(attr);
+ assert(domain);
DBG("Enabling channel %s for session %s", attr->name, session->name);
rcu_read_lock();
DBG("Enabling channel %s for session %s", attr->name, session->name);
rcu_read_lock();
- switch (domain) {
+ switch (domain
->type
) {
case LTTNG_DOMAIN_KERNEL:
{
struct ltt_kernel_channel *kchan;
case LTTNG_DOMAIN_KERNEL:
{
struct ltt_kernel_channel *kchan;
@@
-899,9
+898,9
@@
int cmd_enable_channel(struct ltt_session *session,
uchan = trace_ust_find_channel_by_name(chan_ht, attr->name);
if (uchan == NULL) {
uchan = trace_ust_find_channel_by_name(chan_ht, attr->name);
if (uchan == NULL) {
- ret = channel_ust_create(usess,
domain, attr
);
+ ret = channel_ust_create(usess,
attr, domain->buf_type
);
} else {
} else {
- ret = channel_ust_enable(usess,
domain,
uchan);
+ ret = channel_ust_enable(usess, uchan);
}
/* Start the UST session if the session was already started. */
}
/* Start the UST session if the session was already started. */
@@
-916,11
+915,6
@@
int cmd_enable_channel(struct ltt_session *session,
}
break;
}
}
break;
}
-#if 0
- case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
- case LTTNG_DOMAIN_UST_EXEC_NAME:
- case LTTNG_DOMAIN_UST_PID:
-#endif
default:
ret = LTTNG_ERR_UNKNOWN_DOMAIN;
goto error;
default:
ret = LTTNG_ERR_UNKNOWN_DOMAIN;
goto error;
@@
-978,7
+972,7
@@
int cmd_disable_event(struct ltt_session *session, int domain,
goto error;
}
goto error;
}
- ret = event_ust_disable_tracepoint(usess,
domain,
uchan, event_name);
+ ret = event_ust_disable_tracepoint(usess, uchan, event_name);
if (ret != LTTNG_OK) {
goto error;
}
if (ret != LTTNG_OK) {
goto error;
}
@@
-1050,7
+1044,7
@@
int cmd_disable_event_all(struct ltt_session *session, int domain,
goto error;
}
goto error;
}
- ret = event_ust_disable_all_tracepoints(usess,
domain,
uchan);
+ ret = event_ust_disable_all_tracepoints(usess, uchan);
if (ret != 0) {
goto error;
}
if (ret != 0) {
goto error;
}
@@
-1118,7
+1112,7
@@
int cmd_add_context(struct ltt_session *session, int domain,
goto error;
}
goto error;
}
- ret = channel_ust_create(usess,
domain, attr
);
+ ret = channel_ust_create(usess,
attr, usess->buffer_type
);
if (ret != LTTNG_OK) {
free(attr);
goto error;
if (ret != LTTNG_OK) {
free(attr);
goto error;
@@
-1151,7
+1145,7
@@
error:
/*
* Command LTTNG_ENABLE_EVENT processed by the client thread.
*/
/*
* Command LTTNG_ENABLE_EVENT processed by the client thread.
*/
-int cmd_enable_event(struct ltt_session *session,
int
domain,
+int cmd_enable_event(struct ltt_session *session,
struct lttng_domain *
domain,
char *channel_name, struct lttng_event *event,
struct lttng_filter_bytecode *filter, int wpipe)
{
char *channel_name, struct lttng_event *event,
struct lttng_filter_bytecode *filter, int wpipe)
{
@@
-1164,7
+1158,7
@@
int cmd_enable_event(struct ltt_session *session, int domain,
rcu_read_lock();
rcu_read_lock();
- switch (domain) {
+ switch (domain
->type
) {
case LTTNG_DOMAIN_KERNEL:
{
struct ltt_kernel_channel *kchan;
case LTTNG_DOMAIN_KERNEL:
{
struct ltt_kernel_channel *kchan;
@@
-1172,7
+1166,7
@@
int cmd_enable_event(struct ltt_session *session, int domain,
kchan = trace_kernel_get_channel_by_name(channel_name,
session->kernel_session);
if (kchan == NULL) {
kchan = trace_kernel_get_channel_by_name(channel_name,
session->kernel_session);
if (kchan == NULL) {
- attr = channel_new_default_attr(
domain
);
+ attr = channel_new_default_attr(
LTTNG_DOMAIN_KERNEL
);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
@@
-1222,7
+1216,7
@@
int cmd_enable_event(struct ltt_session *session, int domain,
channel_name);
if (uchan == NULL) {
/* Create default channel */
channel_name);
if (uchan == NULL) {
/* Create default channel */
- attr = channel_new_default_attr(
domain
);
+ attr = channel_new_default_attr(
LTTNG_DOMAIN_UST
);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
@@
-1243,7
+1237,7
@@
int cmd_enable_event(struct ltt_session *session, int domain,
}
/* At this point, the session and channel exist on the tracer */
}
/* At this point, the session and channel exist on the tracer */
- ret = event_ust_enable_tracepoint(usess,
domain,
uchan, event, filter);
+ ret = event_ust_enable_tracepoint(usess, uchan, event, filter);
if (ret != LTTNG_OK) {
goto error;
}
if (ret != LTTNG_OK) {
goto error;
}
@@
-1269,8
+1263,8
@@
error:
/*
* Command LTTNG_ENABLE_ALL_EVENT processed by the client thread.
*/
/*
* Command LTTNG_ENABLE_ALL_EVENT processed by the client thread.
*/
-int cmd_enable_event_all(struct ltt_session *session,
int domain,
- char *channel_name, int event_type,
+int cmd_enable_event_all(struct ltt_session *session,
+
struct lttng_domain *domain,
char *channel_name, int event_type,
struct lttng_filter_bytecode *filter, int wpipe)
{
int ret;
struct lttng_filter_bytecode *filter, int wpipe)
{
int ret;
@@
-1281,7
+1275,7
@@
int cmd_enable_event_all(struct ltt_session *session, int domain,
rcu_read_lock();
rcu_read_lock();
- switch (domain) {
+ switch (domain
->type
) {
case LTTNG_DOMAIN_KERNEL:
{
struct ltt_kernel_channel *kchan;
case LTTNG_DOMAIN_KERNEL:
{
struct ltt_kernel_channel *kchan;
@@
-1292,7
+1286,7
@@
int cmd_enable_event_all(struct ltt_session *session, int domain,
session->kernel_session);
if (kchan == NULL) {
/* Create default channel */
session->kernel_session);
if (kchan == NULL) {
/* Create default channel */
- attr = channel_new_default_attr(
domain
);
+ attr = channel_new_default_attr(
LTTNG_DOMAIN_KERNEL
);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
@@
-1356,7
+1350,7
@@
int cmd_enable_event_all(struct ltt_session *session, int domain,
channel_name);
if (uchan == NULL) {
/* Create default channel */
channel_name);
if (uchan == NULL) {
/* Create default channel */
- attr = channel_new_default_attr(
domain
);
+ attr = channel_new_default_attr(
LTTNG_DOMAIN_UST
);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
@@
-1381,8
+1375,7
@@
int cmd_enable_event_all(struct ltt_session *session, int domain,
switch (event_type) {
case LTTNG_EVENT_ALL:
case LTTNG_EVENT_TRACEPOINT:
switch (event_type) {
case LTTNG_EVENT_ALL:
case LTTNG_EVENT_TRACEPOINT:
- ret = event_ust_enable_all_tracepoints(usess, domain, uchan,
- filter);
+ ret = event_ust_enable_all_tracepoints(usess, uchan, filter);
if (ret != LTTNG_OK) {
goto error;
}
if (ret != LTTNG_OK) {
goto error;
}
@@
-1655,7
+1648,7
@@
int cmd_set_consumer_uri(int domain, struct ltt_session *session,
for (i = 0; i < nb_uri; i++) {
ret = add_uri_to_consumer(consumer, &uris[i], domain, session->name);
for (i = 0; i < nb_uri; i++) {
ret = add_uri_to_consumer(consumer, &uris[i], domain, session->name);
- if (ret
< 0
) {
+ if (ret
!= LTTNG_OK
) {
goto error;
}
}
goto error;
}
}
@@
-1933,6
+1926,7
@@
ssize_t cmd_list_domains(struct ltt_session *session,
if (session->ust_session != NULL) {
(*domains)[index].type = LTTNG_DOMAIN_UST;
if (session->ust_session != NULL) {
(*domains)[index].type = LTTNG_DOMAIN_UST;
+ (*domains)[index].buf_type = session->ust_session->buffer_type;
index++;
}
index++;
}
@@
-2136,10
+2130,12
@@
error:
void cmd_init(void)
{
/*
void cmd_init(void)
{
/*
- * Set network sequence index to 1 for streams to match a relayd
socket on
- * the consumer side.
+ * Set network sequence index to 1 for streams to match a relayd
+ *
socket on
the consumer side.
*/
*/
- uatomic_set(&relayd_net_seq_idx, 1);
+ pthread_mutex_lock(&relayd_net_seq_idx_lock);
+ relayd_net_seq_idx = 1;
+ pthread_mutex_unlock(&relayd_net_seq_idx_lock);
DBG("Command subsystem initialized");
}
DBG("Command subsystem initialized");
}
This page took
0.031978 seconds
and
4
git commands to generate.