Home | History | Annotate | Download | only in server
      1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 #define _GNU_SOURCE /* Needed for Linux socket credential passing. */
      7 
      8 #ifdef CRAS_DBUS
      9 #include <dbus/dbus.h>
     10 #endif
     11 #include <errno.h>
     12 #include <poll.h>
     13 #include <stdint.h>
     14 #include <stdio.h>
     15 #include <stdlib.h>
     16 #include <string.h>
     17 #include <sys/param.h>
     18 #include <sys/select.h>
     19 #include <sys/socket.h>
     20 #include <sys/stat.h>
     21 #include <sys/types.h>
     22 #include <sys/un.h>
     23 #include <syslog.h>
     24 #include <unistd.h>
     25 
     26 #ifdef CRAS_DBUS
     27 #include "cras_a2dp_endpoint.h"
     28 #include "cras_bt_manager.h"
     29 #include "cras_bt_device.h"
     30 #include "cras_bt_player.h"
     31 #include "cras_dbus.h"
     32 #include "cras_dbus_control.h"
     33 #include "cras_hfp_ag_profile.h"
     34 #include "cras_telephony.h"
     35 #endif
     36 #include "cras_alert.h"
     37 #include "cras_audio_thread_monitor.h"
     38 #include "cras_config.h"
     39 #include "cras_device_monitor.h"
     40 #include "cras_hotword_handler.h"
     41 #include "cras_iodev_list.h"
     42 #include "cras_main_message.h"
     43 #include "cras_messages.h"
     44 #include "cras_metrics.h"
     45 #include "cras_non_empty_audio_handler.h"
     46 #include "cras_observer.h"
     47 #include "cras_rclient.h"
     48 #include "cras_server.h"
     49 #include "cras_server_metrics.h"
     50 #include "cras_system_state.h"
     51 #include "cras_tm.h"
     52 #include "cras_udev.h"
     53 #include "cras_util.h"
     54 #include "cras_mix.h"
     55 #include "utlist.h"
     56 
     57 /* Store a list of clients that are attached to the server.
     58  * Members:
     59  *    id - Unique identifier for this client.
     60  *    fd - socket file descriptor used to communicate with client.
     61  *    ucred - Process, user, and group ID of the client.
     62  *    client - rclient to handle messages from this client.
     63  *    pollfd - Pointer to struct pollfd for this callback.
     64  */
     65 struct attached_client {
     66 	size_t id;
     67 	int fd;
     68 	struct ucred ucred;
     69 	struct cras_rclient *client;
     70 	struct pollfd *pollfd;
     71 	struct attached_client *next, *prev;
     72 };
     73 
     74 /* Stores file descriptors to callback mappings for clients. Callback/fd/data
     75  * args are registered by clients.  When fd is ready, the callback will be
     76  * called on the main server thread and the callback data will be passed back to
     77  * it.  This allows the use of the main server loop instead of spawning a thread
     78  * to watch file descriptors.  The client can then read or write the fd.
     79  * Members:
     80  *    fd - The file descriptor passed to select.
     81  *    callack - The funciton to call when fd is ready.
     82  *    callback_data - Pointer passed to the callback.
     83  *    pollfd - Pointer to struct pollfd for this callback.
     84  */
     85 struct client_callback {
     86 	int select_fd;
     87 	void (*callback)(void *);
     88 	void *callback_data;
     89 	struct pollfd *pollfd;
     90 	int deleted;
     91 	struct client_callback *prev, *next;
     92 };
     93 
     94 /* Stores callback function and argument data to be executed later. */
     95 struct system_task {
     96 	void (*callback)(void *);
     97 	void *callback_data;
     98 	struct system_task *next, *prev;
     99 };
    100 
    101 /* Local server data. */
    102 struct server_data {
    103 	struct attached_client *clients_head;
    104 	size_t num_clients;
    105 	struct client_callback *client_callbacks;
    106 	struct system_task *system_tasks;
    107 	size_t num_client_callbacks;
    108 	size_t next_client_id;
    109 } server_instance;
    110 
    111 /* Remove a client from the list and destroy it.  Calling rclient_destroy will
    112  * also free all the streams owned by the client */
    113 static void remove_client(struct attached_client *client)
    114 {
    115 	close(client->fd);
    116 	DL_DELETE(server_instance.clients_head, client);
    117 	server_instance.num_clients--;
    118 	cras_rclient_destroy(client->client);
    119 	free(client);
    120 }
    121 
    122 /* This is called when "select" indicates that the client has written data to
    123  * the socket.  Read out one message and pass it to the client message handler.
    124  */
    125 static void handle_message_from_client(struct attached_client *client)
    126 {
    127 	uint8_t buf[CRAS_SERV_MAX_MSG_SIZE];
    128 	int nread;
    129 	int fd;
    130 	unsigned int num_fds = 1;
    131 
    132 	nread = cras_recv_with_fds(client->fd, buf, sizeof(buf), &fd, &num_fds);
    133         if (nread < 0)
    134                 goto read_error;
    135         if (cras_rclient_buffer_from_client(client->client, buf, nread, fd) < 0)
    136 		goto read_error;
    137 	return;
    138 
    139 read_error:
    140 	if (fd != -1)
    141 		close(fd);
    142 	switch (nread) {
    143 	case 0:
    144 		break;
    145 	default:
    146 		syslog(LOG_DEBUG, "read err [%d] '%s', removing client %zu",
    147 		       -nread, strerror(-nread), client->id);
    148 		break;
    149 	}
    150 	remove_client(client);
    151 }
    152 
    153 /* Discovers and fills in info about the client that can be obtained from the
    154  * socket. The pid of the attaching client identifies it in logs. */
    155 static void fill_client_info(struct attached_client *client)
    156 {
    157 	socklen_t ucred_length = sizeof(client->ucred);
    158 
    159 	if (getsockopt(client->fd, SOL_SOCKET, SO_PEERCRED,
    160 		       &client->ucred, &ucred_length))
    161 		syslog(LOG_INFO, "Failed to get client socket info\n");
    162 }
    163 
    164 /* Fills the server_state with the current list of attached clients. */
    165 static void send_client_list_to_clients(struct server_data *serv)
    166 {
    167 	struct attached_client *c;
    168 	struct cras_attached_client_info *info;
    169 	struct cras_server_state *state;
    170 	unsigned i;
    171 
    172 	state = cras_system_state_update_begin();
    173 	if (!state)
    174 		return;
    175 
    176 	state->num_attached_clients =
    177 		MIN(CRAS_MAX_ATTACHED_CLIENTS, serv->num_clients);
    178 
    179 	info = state->client_info;
    180 	i = 0;
    181 	DL_FOREACH(serv->clients_head, c) {
    182 		info->id = c->id;
    183 		info->pid = c->ucred.pid;
    184 		info->uid = c->ucred.uid;
    185 		info->gid = c->ucred.gid;
    186 		info++;
    187 		if (++i == CRAS_MAX_ATTACHED_CLIENTS)
    188 			break;
    189 	}
    190 
    191 	cras_system_state_update_complete();
    192 }
    193 
    194 /* Handles requests from a client to attach to the server.  Create a local
    195  * structure to track the client, assign it a unique id and let it attach */
    196 static void handle_new_connection(struct sockaddr_un *address, int fd)
    197 {
    198 	int connection_fd;
    199 	struct attached_client *poll_client;
    200 	socklen_t address_length;
    201 
    202 	poll_client = malloc(sizeof(struct attached_client));
    203 	if (poll_client == NULL) {
    204 		syslog(LOG_ERR, "Allocating poll_client");
    205 		return;
    206 	}
    207 
    208 	memset(&address_length, 0, sizeof(address_length));
    209 	connection_fd = accept(fd, (struct sockaddr *) address,
    210 			       &address_length);
    211 	if (connection_fd < 0) {
    212 		syslog(LOG_ERR, "connecting");
    213 		free(poll_client);
    214 		return;
    215 	}
    216 
    217 	/* find next available client id */
    218 	while (1) {
    219 		struct attached_client *out;
    220 		DL_SEARCH_SCALAR(server_instance.clients_head, out, id,
    221 				 server_instance.next_client_id);
    222 		poll_client->id = server_instance.next_client_id;
    223 		server_instance.next_client_id++;
    224 		if (out == NULL)
    225 			break;
    226 	}
    227 
    228 	/* When full, getting an error is preferable to blocking. */
    229 	cras_make_fd_nonblocking(connection_fd);
    230 
    231 	poll_client->fd = connection_fd;
    232 	poll_client->next = NULL;
    233 	poll_client->pollfd = NULL;
    234 	fill_client_info(poll_client);
    235 	poll_client->client = cras_rclient_create(connection_fd,
    236 						  poll_client->id);
    237 	if (poll_client->client == NULL) {
    238 		syslog(LOG_ERR, "failed to create client");
    239 		close(connection_fd);
    240 		free(poll_client);
    241 		return;
    242 	}
    243 
    244 	DL_APPEND(server_instance.clients_head, poll_client);
    245 	server_instance.num_clients++;
    246 	/* Send a current list of available inputs and outputs. */
    247 	cras_iodev_list_update_device_list();
    248 	send_client_list_to_clients(&server_instance);
    249 }
    250 
    251 /* Add a file descriptor to be passed to select in the main loop. This is
    252  * registered with system state so that it is called when any client asks to
    253  * have a callback triggered based on an fd being readable. */
    254 static int add_select_fd(int fd, void (*cb)(void *data),
    255 			 void *callback_data, void *server_data)
    256 {
    257 	struct client_callback *new_cb;
    258 	struct client_callback *client_cb;
    259 	struct server_data *serv;
    260 
    261 	serv = (struct server_data *)server_data;
    262 	if (serv == NULL)
    263 		return -EINVAL;
    264 
    265 	/* Check if fd already exists. */
    266 	DL_FOREACH(serv->client_callbacks, client_cb)
    267 		if (client_cb->select_fd == fd && !client_cb->deleted)
    268 			return -EEXIST;
    269 
    270 	new_cb = (struct  client_callback *)calloc(1, sizeof(*new_cb));
    271 	if (new_cb == NULL)
    272 		return -ENOMEM;
    273 
    274 	new_cb->select_fd = fd;
    275 	new_cb->callback = cb;
    276 	new_cb->callback_data = callback_data;
    277 	new_cb->deleted = 0;
    278 	new_cb->pollfd = NULL;
    279 
    280 	DL_APPEND(serv->client_callbacks, new_cb);
    281 	server_instance.num_client_callbacks++;
    282 	return 0;
    283 }
    284 
    285 /* Removes a file descriptor to be passed to select in the main loop. This is
    286  * registered with system state so that it is called when any client asks to
    287  * remove a callback added with add_select_fd. */
    288 static void rm_select_fd(int fd, void *server_data)
    289 {
    290 	struct server_data *serv;
    291 	struct client_callback *client_cb;
    292 
    293 	serv = (struct server_data *)server_data;
    294 	if (serv == NULL)
    295 		return;
    296 
    297 	DL_FOREACH(serv->client_callbacks, client_cb)
    298 		if (client_cb->select_fd == fd)
    299 			client_cb->deleted = 1;
    300 }
    301 
    302 /* Creates a new task entry and append to system_tasks list, which will be
    303  * executed in main loop later without wait time.
    304  */
    305 static int add_task(void (*cb)(void *data),
    306 		    void *callback_data,
    307 		    void *server_data)
    308 {
    309 	struct server_data *serv;
    310 	struct system_task *new_task;
    311 
    312 	serv = (struct server_data *)server_data;
    313 	if (serv == NULL)
    314 		return -EINVAL;
    315 
    316 	new_task = (struct system_task *)calloc(1, sizeof(*new_task));
    317 	if (new_task == NULL)
    318 		return -ENOMEM;
    319 
    320 	new_task->callback = cb;
    321 	new_task->callback_data = callback_data;
    322 
    323 	DL_APPEND(serv->system_tasks, new_task);
    324 	return 0;
    325 }
    326 
    327 /* Cleans up the file descriptor list removing items deleted during the main
    328  * loop iteration. */
    329 static void cleanup_select_fds(void *server_data)
    330 {
    331 	struct server_data *serv;
    332 	struct client_callback *client_cb;
    333 
    334 	serv = (struct server_data *)server_data;
    335 	if (serv == NULL)
    336 		return;
    337 
    338 	DL_FOREACH(serv->client_callbacks, client_cb)
    339 		if (client_cb->deleted) {
    340 			DL_DELETE(serv->client_callbacks, client_cb);
    341 			server_instance.num_client_callbacks--;
    342 			free(client_cb);
    343 		}
    344 }
    345 
    346 /* Checks that at least two outputs are present (one will be the "empty"
    347  * default device. */
    348 void check_output_exists(struct cras_timer *t, void *data)
    349 {
    350 	if (cras_iodev_list_get_outputs(NULL) < 2)
    351 		cras_metrics_log_event(kNoCodecsFoundMetric);
    352 }
    353 
    354 #if defined(__amd64__)
    355 /* CPU detection - probaby best to move this elsewhere */
    356 static void cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx,
    357 	          unsigned int *edx, unsigned int op)
    358 {
    359 	__asm__ __volatile__ (
    360 		"cpuid"
    361 		: "=a" (*eax),
    362 		  "=b" (*ebx),
    363 		  "=c" (*ecx),
    364 		  "=d" (*edx)
    365 		: "a" (op), "c" (0)
    366     );
    367 }
    368 
    369 static unsigned int cpu_x86_flags(void)
    370 {
    371 	unsigned int eax, ebx, ecx, edx, id;
    372 	unsigned int cpu_flags = 0;
    373 
    374 	cpuid(&id, &ebx, &ecx, &edx, 0);
    375 
    376 	if (id >= 1) {
    377 		cpuid(&eax, &ebx, &ecx, &edx, 1);
    378 
    379 		if (ecx & (1 << 20))
    380 			cpu_flags |= CPU_X86_SSE4_2;
    381 
    382 		if (ecx & (1 << 28))
    383 			cpu_flags |= CPU_X86_AVX;
    384 
    385 		if (ecx & (1 << 12))
    386 			cpu_flags |= CPU_X86_FMA;
    387 	}
    388 
    389 	if (id >= 7) {
    390 		cpuid(&eax, &ebx, &ecx, &edx, 7);
    391 
    392 		if (ebx & (1 << 5))
    393 			cpu_flags |= CPU_X86_AVX2;
    394 	}
    395 
    396 	return cpu_flags;
    397 }
    398 #endif
    399 
    400 int cpu_get_flags(void)
    401 {
    402 #if defined(__amd64__)
    403 	return cpu_x86_flags();
    404 #endif
    405 	return 0;
    406 }
    407 
    408 /*
    409  * Exported Interface.
    410  */
    411 
    412 int cras_server_init()
    413 {
    414 	/* Log to syslog. */
    415 	openlog("cras_server", LOG_PID, LOG_USER);
    416 
    417 	server_instance.next_client_id = RESERVED_CLIENT_IDS;
    418 
    419 	/* Initialize global observer. */
    420 	cras_observer_server_init();
    421 
    422 	/* init mixer with CPU capabilities */
    423 	cras_mix_init(cpu_get_flags());
    424 
    425 	/* Allow clients to register callbacks for file descriptors.
    426 	 * add_select_fd and rm_select_fd will add and remove file descriptors
    427 	 * from the list that are passed to select in the main loop below. */
    428 	cras_system_set_select_handler(add_select_fd, rm_select_fd,
    429 				       &server_instance);
    430 	cras_system_set_add_task_handler(add_task, &server_instance);
    431 	cras_main_message_init();
    432 
    433 	return 0;
    434 }
    435 
    436 int cras_server_run(unsigned int profile_disable_mask)
    437 {
    438 	static const unsigned int OUTPUT_CHECK_MS = 5 * 1000;
    439 #ifdef CRAS_DBUS
    440 	DBusConnection *dbus_conn;
    441 #endif
    442 	int socket_fd = -1;
    443 	int rc = 0;
    444 	const char *sockdir;
    445 	struct sockaddr_un addr;
    446 	struct attached_client *elm;
    447 	struct client_callback *client_cb;
    448 	struct system_task *tasks;
    449 	struct system_task *system_task;
    450 	struct cras_tm *tm;
    451 	struct timespec ts, *poll_timeout;
    452 	int timers_active;
    453 	struct pollfd *pollfds;
    454 	unsigned int pollfds_size = 32;
    455 	unsigned int num_pollfds, poll_size_needed;
    456 
    457 	pollfds = malloc(sizeof(*pollfds) * pollfds_size);
    458 
    459 	cras_udev_start_sound_subsystem_monitor();
    460 #ifdef CRAS_DBUS
    461 	cras_bt_device_start_monitor();
    462 #endif
    463 
    464 	cras_server_metrics_init();
    465 
    466 	cras_device_monitor_init();
    467 
    468 	cras_hotword_handler_init();
    469 
    470 	cras_non_empty_audio_handler_init();
    471 
    472 	cras_audio_thread_monitor_init();
    473 
    474 #ifdef CRAS_DBUS
    475 	dbus_threads_init_default();
    476 	dbus_conn = cras_dbus_connect_system_bus();
    477 	if (dbus_conn) {
    478 		cras_bt_start(dbus_conn);
    479 		if (!(profile_disable_mask & CRAS_SERVER_PROFILE_MASK_HFP))
    480 			cras_hfp_ag_profile_create(dbus_conn);
    481 		if (!(profile_disable_mask & CRAS_SERVER_PROFILE_MASK_HSP))
    482 			cras_hsp_ag_profile_create(dbus_conn);
    483 		cras_telephony_start(dbus_conn);
    484 		if (!(profile_disable_mask & CRAS_SERVER_PROFILE_MASK_A2DP))
    485 			cras_a2dp_endpoint_create(dbus_conn);
    486 		cras_bt_player_create(dbus_conn);
    487 		cras_dbus_control_start(dbus_conn);
    488 	}
    489 #endif
    490 
    491 	socket_fd = socket(PF_UNIX, SOCK_SEQPACKET, 0);
    492 	if (socket_fd < 0) {
    493 		syslog(LOG_ERR, "Main server socket failed.");
    494 		rc = socket_fd;
    495 		goto bail;
    496 	}
    497 
    498 	sockdir = cras_config_get_system_socket_file_dir();
    499 	if (sockdir == NULL) {
    500 		rc = -ENOTDIR;
    501 		goto bail;
    502 	}
    503 
    504 	memset(&addr, 0, sizeof(addr));
    505 	addr.sun_family = AF_UNIX;
    506 	snprintf(addr.sun_path, sizeof(addr.sun_path),
    507 		 "%s/%s", sockdir, CRAS_SOCKET_FILE);
    508 	unlink(addr.sun_path);
    509 
    510 	/* Linux quirk: calling fchmod before bind, sets the permissions of the
    511 	 * file created by bind, leaving no window for it to be modified. Start
    512 	 * with very restricted permissions. */
    513 	rc = fchmod(socket_fd, 0700);
    514 	if (rc < 0)
    515 		goto bail;
    516 
    517 	if (bind(socket_fd, (struct sockaddr *) &addr,
    518 		 sizeof(struct sockaddr_un)) != 0) {
    519 		syslog(LOG_ERR, "Bind to server socket failed.");
    520 		rc = errno;
    521 		goto bail;
    522 	}
    523 
    524 	/* Let other members in our group play audio through this socket. */
    525 	rc = chmod(addr.sun_path, 0770);
    526 	if (rc < 0)
    527 		goto bail;
    528 
    529 	if (listen(socket_fd, 5) != 0) {
    530 		syslog(LOG_ERR, "Listen on server socket failed.");
    531 		rc = errno;
    532 		goto bail;
    533 	}
    534 
    535 	tm = cras_system_state_get_tm();
    536 	if (!tm) {
    537 		syslog(LOG_ERR, "Getting timer manager.");
    538 		rc = -ENOMEM;
    539 		goto bail;
    540 	}
    541 
    542 	/* After a delay, make sure there is at least one real output device. */
    543 	cras_tm_create_timer(tm, OUTPUT_CHECK_MS, check_output_exists, 0);
    544 
    545 	/* Main server loop - client callbacks are run from this context. */
    546 	while (1) {
    547 		poll_size_needed = 1 + server_instance.num_clients +
    548 					server_instance.num_client_callbacks;
    549 		if (poll_size_needed > pollfds_size) {
    550 			pollfds_size = 2 * poll_size_needed;
    551 			pollfds = realloc(pollfds,
    552 					sizeof(*pollfds) * pollfds_size);
    553 		}
    554 
    555 		pollfds[0].fd = socket_fd;
    556 		pollfds[0].events = POLLIN;
    557 		num_pollfds = 1;
    558 
    559 		DL_FOREACH(server_instance.clients_head, elm) {
    560 			pollfds[num_pollfds].fd = elm->fd;
    561 			pollfds[num_pollfds].events = POLLIN;
    562 			elm->pollfd = &pollfds[num_pollfds];
    563 			num_pollfds++;
    564 		}
    565 		DL_FOREACH(server_instance.client_callbacks, client_cb) {
    566 			if (client_cb->deleted)
    567 				continue;
    568 			pollfds[num_pollfds].fd = client_cb->select_fd;
    569 			pollfds[num_pollfds].events = POLLIN;
    570 			client_cb->pollfd = &pollfds[num_pollfds];
    571 			num_pollfds++;
    572 		}
    573 
    574 		tasks = server_instance.system_tasks;
    575 		server_instance.system_tasks = NULL;
    576 		DL_FOREACH(tasks, system_task) {
    577 			system_task->callback(system_task->callback_data);
    578 			DL_DELETE(tasks, system_task);
    579 			free(system_task);
    580 		}
    581 
    582 		timers_active = cras_tm_get_next_timeout(tm, &ts);
    583 
    584 		/*
    585 		 * If new client task has been scheduled, no need to wait
    586 		 * for timeout, just do another loop to execute them.
    587 		 */
    588 		if (server_instance.system_tasks)
    589 			poll_timeout = NULL;
    590 		else
    591 			poll_timeout = timers_active ? &ts : NULL;
    592 
    593 		rc = ppoll(pollfds, num_pollfds, poll_timeout, NULL);
    594 		if  (rc < 0)
    595 			continue;
    596 
    597 		cras_tm_call_callbacks(tm);
    598 
    599 		/* Check for new connections. */
    600 		if (pollfds[0].revents & POLLIN)
    601 			handle_new_connection(&addr, socket_fd);
    602 		/* Check if there are messages pending for any clients. */
    603 		DL_FOREACH(server_instance.clients_head, elm)
    604 			if (elm->pollfd && elm->pollfd->revents & POLLIN)
    605 				handle_message_from_client(elm);
    606 		/* Check any client-registered fd/callback pairs. */
    607 		DL_FOREACH(server_instance.client_callbacks, client_cb)
    608 			if (!client_cb->deleted &&
    609 			    client_cb->pollfd &&
    610 			    (client_cb->pollfd->revents & POLLIN))
    611 				client_cb->callback(client_cb->callback_data);
    612 
    613 		cleanup_select_fds(&server_instance);
    614 
    615 #ifdef CRAS_DBUS
    616 		if (dbus_conn)
    617 			cras_dbus_dispatch(dbus_conn);
    618 #endif
    619 
    620 		cras_alert_process_all_pending_alerts();
    621 	}
    622 
    623 bail:
    624 	if (socket_fd >= 0) {
    625 		close(socket_fd);
    626 		unlink(addr.sun_path);
    627 	}
    628 	free(pollfds);
    629 	cras_observer_server_free();
    630 	return rc;
    631 }
    632 
    633 void cras_server_send_to_all_clients(const struct cras_client_message *msg)
    634 {
    635 	struct attached_client *client;
    636 
    637 	DL_FOREACH(server_instance.clients_head, client)
    638 		cras_rclient_send_message(client->client, msg, NULL, 0);
    639 }
    640