1 /* 2 * dnstap/dtstream.c - Frame Streams thread for unbound DNSTAP 3 * 4 * Copyright (c) 2020, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * Neither the name of the NLNET LABS nor the names of its contributors may 20 * be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 * 35 */ 36 37 /** 38 * \file 39 * 40 * An implementation of the Frame Streams data transport protocol for 41 * the Unbound DNSTAP message logging facility. 42 */ 43 44 #include "config.h" 45 #include "dnstap/dtstream.h" 46 #include "dnstap/dnstap_fstrm.h" 47 #include "util/config_file.h" 48 #include "util/ub_event.h" 49 #include "util/net_help.h" 50 #include "services/outside_network.h" 51 #include "sldns/sbuffer.h" 52 #ifdef HAVE_SYS_UN_H 53 #include <sys/un.h> 54 #endif 55 #include <fcntl.h> 56 #ifdef HAVE_OPENSSL_SSL_H 57 #include <openssl/ssl.h> 58 #endif 59 #ifdef HAVE_OPENSSL_ERR_H 60 #include <openssl/err.h> 61 #endif 62 63 /** number of messages to process in one output callback */ 64 #define DTIO_MESSAGES_PER_CALLBACK 100 65 /** the msec to wait for reconnect (if not immediate, the first attempt) */ 66 #define DTIO_RECONNECT_TIMEOUT_MIN 10 67 /** the msec to wait for reconnect max after backoff */ 68 #define DTIO_RECONNECT_TIMEOUT_MAX 1000 69 /** the msec to wait for reconnect slow, to stop busy spinning on reconnect */ 70 #define DTIO_RECONNECT_TIMEOUT_SLOW 1000 71 /** number of messages before wakeup of thread */ 72 #define DTIO_MSG_FOR_WAKEUP 32 73 74 /** maximum length of received frame */ 75 #define DTIO_RECV_FRAME_MAX_LEN 1000 76 77 struct stop_flush_info; 78 /** DTIO command channel commands */ 79 enum { 80 /** DTIO command channel stop */ 81 DTIO_COMMAND_STOP = 0, 82 /** DTIO command channel wakeup */ 83 DTIO_COMMAND_WAKEUP = 1 84 } dtio_channel_command; 85 86 /** open the output channel */ 87 static void dtio_open_output(struct dt_io_thread* dtio); 88 /** add output event for read and write */ 89 static int dtio_add_output_event_write(struct dt_io_thread* dtio); 90 /** start reconnection attempts */ 91 static void dtio_reconnect_enable(struct dt_io_thread* dtio); 92 /** stop from stop_flush event loop */ 93 static void dtio_stop_flush_exit(struct stop_flush_info* info); 94 /** setup a start control message */ 95 static int dtio_control_start_send(struct dt_io_thread* dtio); 96 #ifdef HAVE_SSL 97 /** enable briefly waiting for a read event, for SSL negotiation */ 98 static int dtio_enable_brief_read(struct dt_io_thread* dtio); 99 /** enable briefly waiting for a write event, for SSL negotiation */ 100 static int dtio_enable_brief_write(struct dt_io_thread* dtio); 101 #endif 102 103 struct dt_msg_queue* 104 dt_msg_queue_create(struct comm_base* base) 105 { 106 struct dt_msg_queue* mq = calloc(1, sizeof(*mq)); 107 if(!mq) return NULL; 108 mq->maxsize = 1*1024*1024; /* set max size of buffer, per worker, 109 about 1 M should contain 64K messages with some overhead, 110 or a whole bunch smaller ones */ 111 mq->wakeup_timer = comm_timer_create(base, mq_wakeup_cb, mq); 112 if(!mq->wakeup_timer) { 113 free(mq); 114 return NULL; 115 } 116 lock_basic_init(&mq->lock); 117 lock_protect(&mq->lock, mq, sizeof(*mq)); 118 return mq; 119 } 120 121 /** clear the message list, caller must hold the lock */ 122 static void 123 dt_msg_queue_clear(struct dt_msg_queue* mq) 124 { 125 struct dt_msg_entry* e = mq->first, *next=NULL; 126 while(e) { 127 next = e->next; 128 free(e->buf); 129 free(e); 130 e = next; 131 } 132 mq->first = NULL; 133 mq->last = NULL; 134 mq->cursize = 0; 135 mq->msgcount = 0; 136 } 137 138 void 139 dt_msg_queue_delete(struct dt_msg_queue* mq) 140 { 141 if(!mq) return; 142 lock_basic_destroy(&mq->lock); 143 dt_msg_queue_clear(mq); 144 comm_timer_delete(mq->wakeup_timer); 145 free(mq); 146 } 147 148 /** make the dtio wake up by sending a wakeup command */ 149 static void dtio_wakeup(struct dt_io_thread* dtio) 150 { 151 uint8_t cmd = DTIO_COMMAND_WAKEUP; 152 if(!dtio) return; 153 if(!dtio->started) return; 154 155 while(1) { 156 ssize_t r = write(dtio->commandpipe[1], &cmd, sizeof(cmd)); 157 if(r == -1) { 158 #ifndef USE_WINSOCK 159 if(errno == EINTR || errno == EAGAIN) 160 continue; 161 #else 162 if(WSAGetLastError() == WSAEINPROGRESS) 163 continue; 164 if(WSAGetLastError() == WSAEWOULDBLOCK) 165 continue; 166 #endif 167 log_err("dnstap io wakeup: write: %s", 168 sock_strerror(errno)); 169 break; 170 } 171 break; 172 } 173 } 174 175 void 176 mq_wakeup_cb(void* arg) 177 { 178 struct dt_msg_queue* mq = (struct dt_msg_queue*)arg; 179 180 lock_basic_lock(&mq->dtio->wakeup_timer_lock); 181 mq->dtio->wakeup_timer_enabled = 0; 182 lock_basic_unlock(&mq->dtio->wakeup_timer_lock); 183 dtio_wakeup(mq->dtio); 184 } 185 186 /** start timer to wakeup dtio because there is content in the queue */ 187 static void 188 dt_msg_queue_start_timer(struct dt_msg_queue* mq, int wakeupnow) 189 { 190 struct timeval tv = {0}; 191 /* Start a timer to process messages to be logged. 192 * If we woke up the dtio thread for every message, the wakeup 193 * messages take up too much processing power. If the queue 194 * fills up the wakeup happens immediately. The timer wakes it up 195 * if there are infrequent messages to log. */ 196 197 /* we cannot start a timer in dtio thread, because it is a different 198 * thread and its event base is in use by the other thread, it would 199 * give race conditions if we tried to modify its event base, 200 * and locks would wait until it woke up, and this is what we do. */ 201 202 /* do not start the timer if a timer already exists, perhaps 203 * in another worker. So this variable is protected by a lock in 204 * dtio. */ 205 206 /* If we need to wakeupnow, 0 the timer to force the callback. */ 207 lock_basic_lock(&mq->dtio->wakeup_timer_lock); 208 if(mq->dtio->wakeup_timer_enabled) { 209 if(wakeupnow) { 210 tv.tv_sec = 0; 211 tv.tv_usec = 0; 212 comm_timer_set(mq->wakeup_timer, &tv); 213 } 214 lock_basic_unlock(&mq->dtio->wakeup_timer_lock); 215 return; 216 } 217 mq->dtio->wakeup_timer_enabled = 1; /* we are going to start one */ 218 219 /* start the timer, in mq, in the event base of our worker */ 220 if(!wakeupnow) { 221 tv.tv_sec = 1; 222 tv.tv_usec = 0; 223 /* If it is already set, keep it running. */ 224 if(!comm_timer_is_set(mq->wakeup_timer)) 225 comm_timer_set(mq->wakeup_timer, &tv); 226 } else { 227 tv.tv_sec = 0; 228 tv.tv_usec = 0; 229 comm_timer_set(mq->wakeup_timer, &tv); 230 } 231 lock_basic_unlock(&mq->dtio->wakeup_timer_lock); 232 } 233 234 void 235 dt_msg_queue_submit(struct dt_msg_queue* mq, void* buf, size_t len) 236 { 237 int wakeupnow = 0, wakeupstarttimer = 0; 238 struct dt_msg_entry* entry; 239 240 /* check conditions */ 241 if(!buf) return; 242 if(len == 0) { 243 /* it is not possible to log entries with zero length, 244 * because the framestream protocol does not carry it. 245 * However the protobuf serialization does not create zero 246 * length datagrams for dnstap, so this should not happen. */ 247 free(buf); 248 return; 249 } 250 if(!mq) { 251 free(buf); 252 return; 253 } 254 255 /* allocate memory for queue entry */ 256 entry = malloc(sizeof(*entry)); 257 if(!entry) { 258 log_err("out of memory logging dnstap"); 259 free(buf); 260 return; 261 } 262 entry->next = NULL; 263 entry->buf = buf; 264 entry->len = len; 265 266 /* acquire lock */ 267 lock_basic_lock(&mq->lock); 268 /* if list was empty, start timer for (eventual) wakeup, 269 * or if dtio is not writing now an eventual wakeup is needed. */ 270 if(mq->first == NULL || !mq->dtio->event_added_is_write) 271 wakeupstarttimer = 1; 272 /* if list contains more than wakeupnum elements, wakeup now, 273 * or if list is (going to be) almost full */ 274 if(mq->msgcount == DTIO_MSG_FOR_WAKEUP || 275 (mq->cursize < mq->maxsize * 9 / 10 && 276 mq->cursize+len >= mq->maxsize * 9 / 10)) 277 wakeupnow = 1; 278 /* see if it is going to fit */ 279 if(mq->cursize + len > mq->maxsize) { 280 /* buffer full, or congested. */ 281 /* drop */ 282 lock_basic_unlock(&mq->lock); 283 free(buf); 284 free(entry); 285 return; 286 } 287 mq->cursize += len; 288 mq->msgcount ++; 289 /* append to list */ 290 if(mq->last) { 291 mq->last->next = entry; 292 } else { 293 mq->first = entry; 294 } 295 mq->last = entry; 296 /* release lock */ 297 lock_basic_unlock(&mq->lock); 298 299 if(wakeupnow || wakeupstarttimer) { 300 dt_msg_queue_start_timer(mq, wakeupnow); 301 } 302 } 303 304 struct dt_io_thread* dt_io_thread_create(void) 305 { 306 struct dt_io_thread* dtio = calloc(1, sizeof(*dtio)); 307 lock_basic_init(&dtio->wakeup_timer_lock); 308 lock_protect(&dtio->wakeup_timer_lock, &dtio->wakeup_timer_enabled, 309 sizeof(dtio->wakeup_timer_enabled)); 310 return dtio; 311 } 312 313 void dt_io_thread_delete(struct dt_io_thread* dtio) 314 { 315 struct dt_io_list_item* item, *nextitem; 316 if(!dtio) return; 317 lock_basic_destroy(&dtio->wakeup_timer_lock); 318 item=dtio->io_list; 319 while(item) { 320 nextitem = item->next; 321 free(item); 322 item = nextitem; 323 } 324 free(dtio->socket_path); 325 free(dtio->ip_str); 326 free(dtio->tls_server_name); 327 free(dtio->client_key_file); 328 free(dtio->client_cert_file); 329 if(dtio->ssl_ctx) { 330 #ifdef HAVE_SSL 331 SSL_CTX_free(dtio->ssl_ctx); 332 #endif 333 } 334 free(dtio); 335 } 336 337 int dt_io_thread_apply_cfg(struct dt_io_thread* dtio, struct config_file *cfg) 338 { 339 if(!cfg->dnstap) { 340 log_warn("cannot setup dnstap because dnstap-enable is no"); 341 return 0; 342 } 343 344 /* what type of connectivity do we have */ 345 if(cfg->dnstap_ip && cfg->dnstap_ip[0]) { 346 if(cfg->dnstap_tls) 347 dtio->upstream_is_tls = 1; 348 else dtio->upstream_is_tcp = 1; 349 } else { 350 dtio->upstream_is_unix = 1; 351 } 352 dtio->is_bidirectional = cfg->dnstap_bidirectional; 353 354 if(dtio->upstream_is_unix) { 355 char* nm; 356 if(!cfg->dnstap_socket_path || 357 cfg->dnstap_socket_path[0]==0) { 358 log_err("dnstap setup: no dnstap-socket-path for " 359 "socket connect"); 360 return 0; 361 } 362 nm = cfg->dnstap_socket_path; 363 if(cfg->chrootdir && cfg->chrootdir[0] && strncmp(nm, 364 cfg->chrootdir, strlen(cfg->chrootdir)) == 0) 365 nm += strlen(cfg->chrootdir); 366 free(dtio->socket_path); 367 dtio->socket_path = strdup(nm); 368 if(!dtio->socket_path) { 369 log_err("dnstap setup: malloc failure"); 370 return 0; 371 } 372 } 373 374 if(dtio->upstream_is_tcp || dtio->upstream_is_tls) { 375 if(!cfg->dnstap_ip || cfg->dnstap_ip[0] == 0) { 376 log_err("dnstap setup: no dnstap-ip for TCP connect"); 377 return 0; 378 } 379 free(dtio->ip_str); 380 dtio->ip_str = strdup(cfg->dnstap_ip); 381 if(!dtio->ip_str) { 382 log_err("dnstap setup: malloc failure"); 383 return 0; 384 } 385 } 386 387 if(dtio->upstream_is_tls) { 388 #ifdef HAVE_SSL 389 if(cfg->dnstap_tls_server_name && 390 cfg->dnstap_tls_server_name[0]) { 391 free(dtio->tls_server_name); 392 dtio->tls_server_name = strdup( 393 cfg->dnstap_tls_server_name); 394 if(!dtio->tls_server_name) { 395 log_err("dnstap setup: malloc failure"); 396 return 0; 397 } 398 if(!check_auth_name_for_ssl(dtio->tls_server_name)) 399 return 0; 400 } 401 if(cfg->dnstap_tls_client_key_file && 402 cfg->dnstap_tls_client_key_file[0]) { 403 dtio->use_client_certs = 1; 404 free(dtio->client_key_file); 405 dtio->client_key_file = strdup( 406 cfg->dnstap_tls_client_key_file); 407 if(!dtio->client_key_file) { 408 log_err("dnstap setup: malloc failure"); 409 return 0; 410 } 411 if(!cfg->dnstap_tls_client_cert_file || 412 cfg->dnstap_tls_client_cert_file[0]==0) { 413 log_err("dnstap setup: client key " 414 "authentication enabled with " 415 "dnstap-tls-client-key-file, but " 416 "no dnstap-tls-client-cert-file " 417 "is given"); 418 return 0; 419 } 420 free(dtio->client_cert_file); 421 dtio->client_cert_file = strdup( 422 cfg->dnstap_tls_client_cert_file); 423 if(!dtio->client_cert_file) { 424 log_err("dnstap setup: malloc failure"); 425 return 0; 426 } 427 } else { 428 dtio->use_client_certs = 0; 429 dtio->client_key_file = NULL; 430 dtio->client_cert_file = NULL; 431 } 432 433 if(cfg->dnstap_tls_cert_bundle) { 434 dtio->ssl_ctx = connect_sslctx_create( 435 dtio->client_key_file, 436 dtio->client_cert_file, 437 cfg->dnstap_tls_cert_bundle, 0); 438 } else { 439 dtio->ssl_ctx = connect_sslctx_create( 440 dtio->client_key_file, 441 dtio->client_cert_file, 442 cfg->tls_cert_bundle, cfg->tls_win_cert); 443 } 444 if(!dtio->ssl_ctx) { 445 log_err("could not setup SSL CTX"); 446 return 0; 447 } 448 dtio->tls_use_sni = cfg->tls_use_sni; 449 #endif /* HAVE_SSL */ 450 } 451 #ifdef HAVE_GETTID 452 dtio->thread_tid_log = cfg->log_thread_id; 453 #endif 454 return 1; 455 } 456 457 int dt_io_thread_register_queue(struct dt_io_thread* dtio, 458 struct dt_msg_queue* mq) 459 { 460 struct dt_io_list_item* item = malloc(sizeof(*item)); 461 if(!item) return 0; 462 lock_basic_lock(&mq->lock); 463 mq->dtio = dtio; 464 lock_basic_unlock(&mq->lock); 465 item->queue = mq; 466 item->next = dtio->io_list; 467 dtio->io_list = item; 468 dtio->io_list_iter = NULL; 469 return 1; 470 } 471 472 void dt_io_thread_unregister_queue(struct dt_io_thread* dtio, 473 struct dt_msg_queue* mq) 474 { 475 struct dt_io_list_item* item, *prev=NULL; 476 if(!dtio) return; 477 item = dtio->io_list; 478 while(item) { 479 if(item->queue == mq) { 480 /* found it */ 481 if(prev) prev->next = item->next; 482 else dtio->io_list = item->next; 483 /* the queue itself only registered, not deleted */ 484 lock_basic_lock(&item->queue->lock); 485 item->queue->dtio = NULL; 486 lock_basic_unlock(&item->queue->lock); 487 free(item); 488 dtio->io_list_iter = NULL; 489 return; 490 } 491 prev = item; 492 item = item->next; 493 } 494 } 495 496 /** pick a message from the queue, the routine locks and unlocks, 497 * returns true if there is a message */ 498 static int dt_msg_queue_pop(struct dt_msg_queue* mq, void** buf, 499 size_t* len) 500 { 501 lock_basic_lock(&mq->lock); 502 if(mq->first) { 503 struct dt_msg_entry* entry = mq->first; 504 mq->first = entry->next; 505 if(!entry->next) mq->last = NULL; 506 mq->cursize -= entry->len; 507 mq->msgcount --; 508 lock_basic_unlock(&mq->lock); 509 510 *buf = entry->buf; 511 *len = entry->len; 512 free(entry); 513 return 1; 514 } 515 lock_basic_unlock(&mq->lock); 516 return 0; 517 } 518 519 /** find message in queue, false if no message, true if message to send */ 520 static int dtio_find_in_queue(struct dt_io_thread* dtio, 521 struct dt_msg_queue* mq) 522 { 523 void* buf=NULL; 524 size_t len=0; 525 if(dt_msg_queue_pop(mq, &buf, &len)) { 526 dtio->cur_msg = buf; 527 dtio->cur_msg_len = len; 528 dtio->cur_msg_done = 0; 529 dtio->cur_msg_len_done = 0; 530 return 1; 531 } 532 return 0; 533 } 534 535 /** find a new message to write, search message queues, false if none */ 536 static int dtio_find_msg(struct dt_io_thread* dtio) 537 { 538 struct dt_io_list_item *spot, *item; 539 540 spot = dtio->io_list_iter; 541 /* use the next queue for the next message lookup, 542 * if we hit the end(NULL) the NULL restarts the iter at start. */ 543 if(spot) 544 dtio->io_list_iter = spot->next; 545 else if(dtio->io_list) 546 dtio->io_list_iter = dtio->io_list->next; 547 548 /* scan from spot to end-of-io_list */ 549 item = spot; 550 while(item) { 551 if(dtio_find_in_queue(dtio, item->queue)) 552 return 1; 553 item = item->next; 554 } 555 /* scan starting at the start-of-list (to wrap around the end) */ 556 item = dtio->io_list; 557 while(item) { 558 if(dtio_find_in_queue(dtio, item->queue)) 559 return 1; 560 item = item->next; 561 } 562 return 0; 563 } 564 565 /** callback for the dnstap reconnect, to start reconnecting to output */ 566 void dtio_reconnect_timeout_cb(int ATTR_UNUSED(fd), 567 short ATTR_UNUSED(bits), void* arg) 568 { 569 struct dt_io_thread* dtio = (struct dt_io_thread*)arg; 570 dtio->reconnect_is_added = 0; 571 verbose(VERB_ALGO, "dnstap io: reconnect timer"); 572 573 dtio_open_output(dtio); 574 if(dtio->event) { 575 if(!dtio_add_output_event_write(dtio)) 576 return; 577 /* nothing wrong so far, wait on the output event */ 578 return; 579 } 580 /* exponential backoff and retry on timer */ 581 dtio_reconnect_enable(dtio); 582 } 583 584 /** attempt to reconnect to the output, after a timeout */ 585 static void dtio_reconnect_enable(struct dt_io_thread* dtio) 586 { 587 struct timeval tv; 588 int msec; 589 if(dtio->want_to_exit) return; 590 if(dtio->reconnect_is_added) 591 return; /* already done */ 592 593 /* exponential backoff, store the value for next timeout */ 594 msec = dtio->reconnect_timeout; 595 if(msec == 0) { 596 dtio->reconnect_timeout = DTIO_RECONNECT_TIMEOUT_MIN; 597 } else { 598 dtio->reconnect_timeout = msec*2; 599 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MAX) 600 dtio->reconnect_timeout = DTIO_RECONNECT_TIMEOUT_MAX; 601 } 602 verbose(VERB_ALGO, "dnstap io: set reconnect attempt after %d msec", 603 msec); 604 605 /* setup wait timer */ 606 memset(&tv, 0, sizeof(tv)); 607 tv.tv_sec = msec/1000; 608 tv.tv_usec = (msec%1000)*1000; 609 if(ub_timer_add(dtio->reconnect_timer, dtio->event_base, 610 &dtio_reconnect_timeout_cb, dtio, &tv) != 0) { 611 log_err("dnstap io: could not reconnect ev timer add"); 612 return; 613 } 614 dtio->reconnect_is_added = 1; 615 } 616 617 /** remove dtio reconnect timer */ 618 static void dtio_reconnect_del(struct dt_io_thread* dtio) 619 { 620 if(!dtio->reconnect_is_added) 621 return; 622 ub_timer_del(dtio->reconnect_timer); 623 dtio->reconnect_is_added = 0; 624 } 625 626 /** clear the reconnect exponential backoff timer. 627 * We have successfully connected so we can try again with short timeouts. */ 628 static void dtio_reconnect_clear(struct dt_io_thread* dtio) 629 { 630 dtio->reconnect_timeout = 0; 631 dtio_reconnect_del(dtio); 632 } 633 634 /** reconnect slowly, because we already know we have to wait for a bit */ 635 static void dtio_reconnect_slow(struct dt_io_thread* dtio, int msec) 636 { 637 dtio_reconnect_del(dtio); 638 dtio->reconnect_timeout = msec; 639 dtio_reconnect_enable(dtio); 640 } 641 642 /** delete the current message in the dtio, and reset counters */ 643 static void dtio_cur_msg_free(struct dt_io_thread* dtio) 644 { 645 free(dtio->cur_msg); 646 dtio->cur_msg = NULL; 647 dtio->cur_msg_len = 0; 648 dtio->cur_msg_done = 0; 649 dtio->cur_msg_len_done = 0; 650 } 651 652 /** delete the buffer and counters used to read frame */ 653 static void dtio_read_frame_free(struct dt_frame_read_buf* rb) 654 { 655 if(rb->buf) { 656 free(rb->buf); 657 rb->buf = NULL; 658 } 659 rb->buf_count = 0; 660 rb->buf_cap = 0; 661 rb->frame_len = 0; 662 rb->frame_len_done = 0; 663 rb->control_frame = 0; 664 } 665 666 /** del the output file descriptor event for listening */ 667 static void dtio_del_output_event(struct dt_io_thread* dtio) 668 { 669 if(!dtio->event_added) 670 return; 671 ub_event_del(dtio->event); 672 dtio->event_added = 0; 673 dtio->event_added_is_write = 0; 674 } 675 676 /** close dtio socket and set it to -1 */ 677 static void dtio_close_fd(struct dt_io_thread* dtio) 678 { 679 sock_close(dtio->fd); 680 dtio->fd = -1; 681 } 682 683 /** close and stop the output file descriptor event */ 684 static void dtio_close_output(struct dt_io_thread* dtio) 685 { 686 if(!dtio->event) 687 return; 688 ub_event_free(dtio->event); 689 dtio->event = NULL; 690 if(dtio->ssl) { 691 #ifdef HAVE_SSL 692 SSL_shutdown(dtio->ssl); 693 SSL_free(dtio->ssl); 694 dtio->ssl = NULL; 695 #endif 696 } 697 dtio_close_fd(dtio); 698 699 /* if there is a (partial) message, discard it 700 * we cannot send (the remainder of) it, and a new 701 * connection needs to start with a control frame. */ 702 if(dtio->cur_msg) { 703 dtio_cur_msg_free(dtio); 704 } 705 706 dtio->ready_frame_sent = 0; 707 dtio->accept_frame_received = 0; 708 dtio_read_frame_free(&dtio->read_frame); 709 710 dtio_reconnect_enable(dtio); 711 } 712 713 /** check for pending nonblocking connect errors, 714 * returns 1 if it is okay. -1 on error (close it), 0 to try later */ 715 static int dtio_check_nb_connect(struct dt_io_thread* dtio) 716 { 717 int error = 0; 718 socklen_t len = (socklen_t)sizeof(error); 719 if(!dtio->check_nb_connect) 720 return 1; /* everything okay */ 721 if(getsockopt(dtio->fd, SOL_SOCKET, SO_ERROR, (void*)&error, 722 &len) < 0) { 723 #ifndef USE_WINSOCK 724 error = errno; /* on solaris errno is error */ 725 #else 726 error = WSAGetLastError(); 727 #endif 728 } 729 #ifndef USE_WINSOCK 730 #if defined(EINPROGRESS) && defined(EWOULDBLOCK) 731 if(error == EINPROGRESS || error == EWOULDBLOCK) 732 return 0; /* try again later */ 733 #endif 734 #else 735 if(error == WSAEINPROGRESS) { 736 return 0; /* try again later */ 737 } else if(error == WSAEWOULDBLOCK) { 738 ub_winsock_tcp_wouldblock((dtio->stop_flush_event? 739 dtio->stop_flush_event:dtio->event), UB_EV_WRITE); 740 return 0; /* try again later */ 741 } 742 #endif 743 if(error != 0) { 744 char* to = dtio->socket_path; 745 if(!to) to = dtio->ip_str; 746 if(!to) to = ""; 747 log_err("dnstap io: failed to connect to \"%s\": %s", 748 to, sock_strerror(error)); 749 return -1; /* error, close it */ 750 } 751 752 if(dtio->ip_str) 753 verbose(VERB_DETAIL, "dnstap io: connected to %s", 754 dtio->ip_str); 755 else if(dtio->socket_path) 756 verbose(VERB_DETAIL, "dnstap io: connected to \"%s\"", 757 dtio->socket_path); 758 dtio_reconnect_clear(dtio); 759 dtio->check_nb_connect = 0; 760 return 1; /* everything okay */ 761 } 762 763 #ifdef HAVE_SSL 764 /** write to ssl output 765 * returns number of bytes written, 0 if nothing happened, 766 * try again later, or -1 if the channel is to be closed. */ 767 static int dtio_write_ssl(struct dt_io_thread* dtio, uint8_t* buf, 768 size_t len) 769 { 770 int r; 771 ERR_clear_error(); 772 r = SSL_write(dtio->ssl, buf, len); 773 if(r <= 0) { 774 int want = SSL_get_error(dtio->ssl, r); 775 if(want == SSL_ERROR_ZERO_RETURN) { 776 /* closed */ 777 return -1; 778 } else if(want == SSL_ERROR_WANT_READ) { 779 /* we want a brief read event */ 780 dtio_enable_brief_read(dtio); 781 return 0; 782 } else if(want == SSL_ERROR_WANT_WRITE) { 783 /* write again later */ 784 return 0; 785 } else if(want == SSL_ERROR_SYSCALL) { 786 #ifdef EPIPE 787 if(errno == EPIPE && verbosity < 2) 788 return -1; /* silence 'broken pipe' */ 789 #endif 790 #ifdef ECONNRESET 791 if(errno == ECONNRESET && verbosity < 2) 792 return -1; /* silence reset by peer */ 793 #endif 794 if(errno != 0) { 795 log_err("dnstap io, SSL_write syscall: %s", 796 strerror(errno)); 797 } 798 return -1; 799 } 800 log_crypto_err_io("dnstap io, could not SSL_write", want); 801 return -1; 802 } 803 return r; 804 } 805 #endif /* HAVE_SSL */ 806 807 /** write buffer to output. 808 * returns number of bytes written, 0 if nothing happened, 809 * try again later, or -1 if the channel is to be closed. */ 810 static int dtio_write_buf(struct dt_io_thread* dtio, uint8_t* buf, 811 size_t len) 812 { 813 ssize_t ret; 814 if(dtio->fd == -1) 815 return -1; 816 #ifdef HAVE_SSL 817 if(dtio->ssl) 818 return dtio_write_ssl(dtio, buf, len); 819 #endif 820 ret = send(dtio->fd, (void*)buf, len, 0); 821 if(ret == -1) { 822 #ifndef USE_WINSOCK 823 if(errno == EINTR || errno == EAGAIN) 824 return 0; 825 #else 826 if(WSAGetLastError() == WSAEINPROGRESS) 827 return 0; 828 if(WSAGetLastError() == WSAEWOULDBLOCK) { 829 ub_winsock_tcp_wouldblock((dtio->stop_flush_event? 830 dtio->stop_flush_event:dtio->event), 831 UB_EV_WRITE); 832 return 0; 833 } 834 #endif 835 log_err("dnstap io: failed send: %s", sock_strerror(errno)); 836 return -1; 837 } 838 return ret; 839 } 840 841 #ifdef HAVE_WRITEV 842 /** write with writev, len and message, in one write, if possible. 843 * return true if message is done, false if incomplete */ 844 static int dtio_write_with_writev(struct dt_io_thread* dtio) 845 { 846 uint32_t sendlen = htonl(dtio->cur_msg_len); 847 struct iovec iov[2]; 848 ssize_t r; 849 iov[0].iov_base = ((uint8_t*)&sendlen)+dtio->cur_msg_len_done; 850 iov[0].iov_len = sizeof(sendlen)-dtio->cur_msg_len_done; 851 iov[1].iov_base = dtio->cur_msg; 852 iov[1].iov_len = dtio->cur_msg_len; 853 log_assert(iov[0].iov_len > 0); 854 r = writev(dtio->fd, iov, 2); 855 if(r == -1) { 856 #ifndef USE_WINSOCK 857 if(errno == EINTR || errno == EAGAIN) 858 return 0; 859 #else 860 if(WSAGetLastError() == WSAEINPROGRESS) 861 return 0; 862 if(WSAGetLastError() == WSAEWOULDBLOCK) { 863 ub_winsock_tcp_wouldblock((dtio->stop_flush_event? 864 dtio->stop_flush_event:dtio->event), 865 UB_EV_WRITE); 866 return 0; 867 } 868 #endif 869 log_err("dnstap io: failed writev: %s", sock_strerror(errno)); 870 /* close the channel */ 871 dtio_del_output_event(dtio); 872 dtio_close_output(dtio); 873 return 0; 874 } 875 /* written r bytes */ 876 dtio->cur_msg_len_done += r; 877 if(dtio->cur_msg_len_done < 4) 878 return 0; 879 if(dtio->cur_msg_len_done > 4) { 880 dtio->cur_msg_done = dtio->cur_msg_len_done-4; 881 dtio->cur_msg_len_done = 4; 882 } 883 if(dtio->cur_msg_done < dtio->cur_msg_len) 884 return 0; 885 return 1; 886 } 887 #endif /* HAVE_WRITEV */ 888 889 /** write more of the length, preceding the data frame. 890 * return true if message is done, false if incomplete. */ 891 static int dtio_write_more_of_len(struct dt_io_thread* dtio) 892 { 893 uint32_t sendlen; 894 int r; 895 if(dtio->cur_msg_len_done >= 4) 896 return 1; 897 #ifdef HAVE_WRITEV 898 if(!dtio->ssl) { 899 /* we try writev for everything.*/ 900 return dtio_write_with_writev(dtio); 901 } 902 #endif /* HAVE_WRITEV */ 903 sendlen = htonl(dtio->cur_msg_len); 904 r = dtio_write_buf(dtio, 905 ((uint8_t*)&sendlen)+dtio->cur_msg_len_done, 906 sizeof(sendlen)-dtio->cur_msg_len_done); 907 if(r == -1) { 908 /* close the channel */ 909 dtio_del_output_event(dtio); 910 dtio_close_output(dtio); 911 return 0; 912 } else if(r == 0) { 913 /* try again later */ 914 return 0; 915 } 916 dtio->cur_msg_len_done += r; 917 if(dtio->cur_msg_len_done < 4) 918 return 0; 919 return 1; 920 } 921 922 /** write more of the data frame. 923 * return true if message is done, false if incomplete. */ 924 static int dtio_write_more_of_data(struct dt_io_thread* dtio) 925 { 926 int r; 927 if(dtio->cur_msg_done >= dtio->cur_msg_len) 928 return 1; 929 r = dtio_write_buf(dtio, 930 ((uint8_t*)dtio->cur_msg)+dtio->cur_msg_done, 931 dtio->cur_msg_len - dtio->cur_msg_done); 932 if(r == -1) { 933 /* close the channel */ 934 dtio_del_output_event(dtio); 935 dtio_close_output(dtio); 936 return 0; 937 } else if(r == 0) { 938 /* try again later */ 939 return 0; 940 } 941 dtio->cur_msg_done += r; 942 if(dtio->cur_msg_done < dtio->cur_msg_len) 943 return 0; 944 return 1; 945 } 946 947 /** write more of the current message. false if incomplete, true if 948 * the message is done */ 949 static int dtio_write_more(struct dt_io_thread* dtio) 950 { 951 if(dtio->cur_msg_len_done < 4) { 952 if(!dtio_write_more_of_len(dtio)) 953 return 0; 954 } 955 if(dtio->cur_msg_done < dtio->cur_msg_len) { 956 if(!dtio_write_more_of_data(dtio)) 957 return 0; 958 } 959 return 1; 960 } 961 962 /** Receive bytes from dtio->fd, store in buffer. Returns 0: closed, 963 * -1: continue, >0: number of bytes read into buffer */ 964 static ssize_t receive_bytes(struct dt_io_thread* dtio, void* buf, size_t len) { 965 ssize_t r; 966 r = recv(dtio->fd, (void*)buf, len, MSG_DONTWAIT); 967 if(r == -1) { 968 char* to = dtio->socket_path; 969 if(!to) to = dtio->ip_str; 970 if(!to) to = ""; 971 #ifndef USE_WINSOCK 972 if(errno == EINTR || errno == EAGAIN) 973 return -1; /* try later */ 974 #else 975 if(WSAGetLastError() == WSAEINPROGRESS) { 976 return -1; /* try later */ 977 } else if(WSAGetLastError() == WSAEWOULDBLOCK) { 978 ub_winsock_tcp_wouldblock( 979 (dtio->stop_flush_event? 980 dtio->stop_flush_event:dtio->event), 981 UB_EV_READ); 982 return -1; /* try later */ 983 } 984 #endif 985 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MIN && 986 verbosity < 4) 987 return 0; /* no log retries on low verbosity */ 988 log_err("dnstap io: output closed, recv %s: %s", to, 989 strerror(errno)); 990 /* and close below */ 991 return 0; 992 } 993 if(r == 0) { 994 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MIN && 995 verbosity < 4) 996 return 0; /* no log retries on low verbosity */ 997 verbose(VERB_DETAIL, "dnstap io: output closed by the other side"); 998 /* and close below */ 999 return 0; 1000 } 1001 /* something was received */ 1002 return r; 1003 } 1004 1005 #ifdef HAVE_SSL 1006 /** Receive bytes over TLS from dtio->fd, store in buffer. Returns 0: closed, 1007 * -1: continue, >0: number of bytes read into buffer */ 1008 static int ssl_read_bytes(struct dt_io_thread* dtio, void* buf, size_t len) 1009 { 1010 int r; 1011 ERR_clear_error(); 1012 r = SSL_read(dtio->ssl, buf, len); 1013 if(r <= 0) { 1014 int want = SSL_get_error(dtio->ssl, r); 1015 if(want == SSL_ERROR_ZERO_RETURN) { 1016 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MIN && 1017 verbosity < 4) 1018 return 0; /* no log retries on low verbosity */ 1019 verbose(VERB_DETAIL, "dnstap io: output closed by the " 1020 "other side"); 1021 return 0; 1022 } else if(want == SSL_ERROR_WANT_READ) { 1023 /* continue later */ 1024 return -1; 1025 } else if(want == SSL_ERROR_WANT_WRITE) { 1026 (void)dtio_enable_brief_write(dtio); 1027 return -1; 1028 } else if(want == SSL_ERROR_SYSCALL) { 1029 #ifdef ECONNRESET 1030 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MIN && 1031 errno == ECONNRESET && verbosity < 4) 1032 return 0; /* silence reset by peer */ 1033 #endif 1034 if(errno != 0) 1035 log_err("SSL_read syscall: %s", 1036 strerror(errno)); 1037 verbose(VERB_DETAIL, "dnstap io: output closed by the " 1038 "other side"); 1039 return 0; 1040 } 1041 log_crypto_err_io("could not SSL_read", want); 1042 verbose(VERB_DETAIL, "dnstap io: output closed by the " 1043 "other side"); 1044 return 0; 1045 } 1046 return r; 1047 } 1048 #endif /* HAVE_SSL */ 1049 1050 /** check if the output fd has been closed, 1051 * it returns false if the stream is closed. */ 1052 static int dtio_check_close(struct dt_io_thread* dtio) 1053 { 1054 /* we don't want to read any packets, but if there are we can 1055 * discard the input (ignore it). Ignore of unknown (control) 1056 * packets is okay for the framestream protocol. And also, the 1057 * read call can return that the stream has been closed by the 1058 * other side. */ 1059 uint8_t buf[1024]; 1060 int r = -1; 1061 1062 1063 if(dtio->fd == -1) return 0; 1064 1065 while(r != 0) { 1066 /* not interested in buffer content, overwrite */ 1067 r = receive_bytes(dtio, (void*)buf, sizeof(buf)); 1068 if(r == -1) 1069 return 1; 1070 } 1071 /* the other end has been closed */ 1072 /* close the channel */ 1073 dtio_del_output_event(dtio); 1074 dtio_close_output(dtio); 1075 return 0; 1076 } 1077 1078 /** Read accept frame. Returns -1: continue reading, 0: closed, 1079 * 1: valid accept received. */ 1080 static int dtio_read_accept_frame(struct dt_io_thread* dtio) 1081 { 1082 int r; 1083 size_t read_frame_done; 1084 while(dtio->read_frame.frame_len_done < 4) { 1085 #ifdef HAVE_SSL 1086 if(dtio->ssl) { 1087 r = ssl_read_bytes(dtio, 1088 (uint8_t*)&dtio->read_frame.frame_len+ 1089 dtio->read_frame.frame_len_done, 1090 4-dtio->read_frame.frame_len_done); 1091 } else { 1092 #endif 1093 r = receive_bytes(dtio, 1094 (uint8_t*)&dtio->read_frame.frame_len+ 1095 dtio->read_frame.frame_len_done, 1096 4-dtio->read_frame.frame_len_done); 1097 #ifdef HAVE_SSL 1098 } 1099 #endif 1100 if(r == -1) 1101 return -1; /* continue reading */ 1102 if(r == 0) { 1103 /* connection closed */ 1104 goto close_connection; 1105 } 1106 dtio->read_frame.frame_len_done += r; 1107 if(dtio->read_frame.frame_len_done < 4) 1108 return -1; /* continue reading */ 1109 1110 if(dtio->read_frame.frame_len == 0) { 1111 dtio->read_frame.frame_len_done = 0; 1112 dtio->read_frame.control_frame = 1; 1113 continue; 1114 } 1115 dtio->read_frame.frame_len = ntohl(dtio->read_frame.frame_len); 1116 if(dtio->read_frame.frame_len > DTIO_RECV_FRAME_MAX_LEN) { 1117 verbose(VERB_OPS, "dnstap: received frame exceeds max " 1118 "length of %d bytes, closing connection", 1119 DTIO_RECV_FRAME_MAX_LEN); 1120 goto close_connection; 1121 } 1122 dtio->read_frame.buf = calloc(1, dtio->read_frame.frame_len); 1123 dtio->read_frame.buf_cap = dtio->read_frame.frame_len; 1124 if(!dtio->read_frame.buf) { 1125 log_err("dnstap io: out of memory (creating read " 1126 "buffer)"); 1127 goto close_connection; 1128 } 1129 } 1130 if(dtio->read_frame.buf_count < dtio->read_frame.frame_len) { 1131 #ifdef HAVE_SSL 1132 if(dtio->ssl) { 1133 r = ssl_read_bytes(dtio, dtio->read_frame.buf+ 1134 dtio->read_frame.buf_count, 1135 dtio->read_frame.buf_cap- 1136 dtio->read_frame.buf_count); 1137 } else { 1138 #endif 1139 r = receive_bytes(dtio, dtio->read_frame.buf+ 1140 dtio->read_frame.buf_count, 1141 dtio->read_frame.buf_cap- 1142 dtio->read_frame.buf_count); 1143 #ifdef HAVE_SSL 1144 } 1145 #endif 1146 if(r == -1) 1147 return -1; /* continue reading */ 1148 if(r == 0) { 1149 /* connection closed */ 1150 goto close_connection; 1151 } 1152 dtio->read_frame.buf_count += r; 1153 if(dtio->read_frame.buf_count < dtio->read_frame.frame_len) 1154 return -1; /* continue reading */ 1155 } 1156 1157 /* Complete frame received, check if this is a valid ACCEPT control 1158 * frame. */ 1159 if(dtio->read_frame.frame_len < 4) { 1160 verbose(VERB_OPS, "dnstap: invalid data received"); 1161 goto close_connection; 1162 } 1163 if(sldns_read_uint32(dtio->read_frame.buf) != 1164 FSTRM_CONTROL_FRAME_ACCEPT) { 1165 verbose(VERB_ALGO, "dnstap: invalid control type received, " 1166 "ignored"); 1167 dtio->ready_frame_sent = 0; 1168 dtio->accept_frame_received = 0; 1169 dtio_read_frame_free(&dtio->read_frame); 1170 return -1; 1171 } 1172 read_frame_done = 4; /* control frame type */ 1173 1174 /* Iterate over control fields, ignore unknown types. 1175 * Need to be able to read at least 8 bytes (control field type + 1176 * length). */ 1177 while(read_frame_done+8 < dtio->read_frame.frame_len) { 1178 uint32_t type = sldns_read_uint32(dtio->read_frame.buf + 1179 read_frame_done); 1180 uint32_t len = sldns_read_uint32(dtio->read_frame.buf + 1181 read_frame_done + 4); 1182 if(type == FSTRM_CONTROL_FIELD_TYPE_CONTENT_TYPE) { 1183 if(len == strlen(DNSTAP_CONTENT_TYPE) && 1184 read_frame_done+8+len <= 1185 dtio->read_frame.frame_len && 1186 memcmp(dtio->read_frame.buf + read_frame_done + 1187 + 8, DNSTAP_CONTENT_TYPE, len) == 0) { 1188 if(!dtio_control_start_send(dtio)) { 1189 verbose(VERB_OPS, "dnstap io: out of " 1190 "memory while sending START frame"); 1191 goto close_connection; 1192 } 1193 dtio->accept_frame_received = 1; 1194 if(!dtio_add_output_event_write(dtio)) 1195 goto close_connection; 1196 return 1; 1197 } else { 1198 /* unknown content type */ 1199 verbose(VERB_ALGO, "dnstap: ACCEPT frame " 1200 "contains unknown content type, " 1201 "closing connection"); 1202 goto close_connection; 1203 } 1204 } 1205 /* unknown option, try next */ 1206 read_frame_done += 8+len; 1207 } 1208 1209 1210 close_connection: 1211 dtio_del_output_event(dtio); 1212 dtio_reconnect_slow(dtio, DTIO_RECONNECT_TIMEOUT_SLOW); 1213 dtio_close_output(dtio); 1214 return 0; 1215 } 1216 1217 /** add the output file descriptor event for listening, read only */ 1218 static int dtio_add_output_event_read(struct dt_io_thread* dtio) 1219 { 1220 if(!dtio->event) 1221 return 0; 1222 if(dtio->event_added && !dtio->event_added_is_write) 1223 return 1; 1224 /* we have to (re-)register the event */ 1225 if(dtio->event_added) 1226 ub_event_del(dtio->event); 1227 ub_event_del_bits(dtio->event, UB_EV_WRITE); 1228 if(ub_event_add(dtio->event, NULL) != 0) { 1229 log_err("dnstap io: out of memory (adding event)"); 1230 dtio->event_added = 0; 1231 dtio->event_added_is_write = 0; 1232 /* close output and start reattempts to open it */ 1233 dtio_close_output(dtio); 1234 return 0; 1235 } 1236 dtio->event_added = 1; 1237 dtio->event_added_is_write = 0; 1238 return 1; 1239 } 1240 1241 /** add the output file descriptor event for listening, read and write */ 1242 static int dtio_add_output_event_write(struct dt_io_thread* dtio) 1243 { 1244 if(!dtio->event) 1245 return 0; 1246 if(dtio->event_added && dtio->event_added_is_write) 1247 return 1; 1248 /* we have to (re-)register the event */ 1249 if(dtio->event_added) 1250 ub_event_del(dtio->event); 1251 ub_event_add_bits(dtio->event, UB_EV_WRITE); 1252 if(ub_event_add(dtio->event, NULL) != 0) { 1253 log_err("dnstap io: out of memory (adding event)"); 1254 dtio->event_added = 0; 1255 dtio->event_added_is_write = 0; 1256 /* close output and start reattempts to open it */ 1257 dtio_close_output(dtio); 1258 return 0; 1259 } 1260 dtio->event_added = 1; 1261 dtio->event_added_is_write = 1; 1262 return 1; 1263 } 1264 1265 /** put the dtio thread to sleep */ 1266 static void dtio_sleep(struct dt_io_thread* dtio) 1267 { 1268 /* unregister the event polling for write, because there is 1269 * nothing to be written */ 1270 (void)dtio_add_output_event_read(dtio); 1271 1272 /* Set wakeuptimer enabled off; so that the next worker thread that 1273 * wants to log starts a timer if needed, since the writer thread 1274 * has gone to sleep. */ 1275 lock_basic_lock(&dtio->wakeup_timer_lock); 1276 dtio->wakeup_timer_enabled = 0; 1277 lock_basic_unlock(&dtio->wakeup_timer_lock); 1278 } 1279 1280 #ifdef HAVE_SSL 1281 /** enable the brief read condition */ 1282 static int dtio_enable_brief_read(struct dt_io_thread* dtio) 1283 { 1284 dtio->ssl_brief_read = 1; 1285 if(dtio->stop_flush_event) { 1286 ub_event_del(dtio->stop_flush_event); 1287 ub_event_del_bits(dtio->stop_flush_event, UB_EV_WRITE); 1288 if(ub_event_add(dtio->stop_flush_event, NULL) != 0) { 1289 log_err("dnstap io, stop flush, could not ub_event_add"); 1290 return 0; 1291 } 1292 return 1; 1293 } 1294 return dtio_add_output_event_read(dtio); 1295 } 1296 #endif /* HAVE_SSL */ 1297 1298 #ifdef HAVE_SSL 1299 /** disable the brief read condition */ 1300 static int dtio_disable_brief_read(struct dt_io_thread* dtio) 1301 { 1302 dtio->ssl_brief_read = 0; 1303 if(dtio->stop_flush_event) { 1304 ub_event_del(dtio->stop_flush_event); 1305 ub_event_add_bits(dtio->stop_flush_event, UB_EV_WRITE); 1306 if(ub_event_add(dtio->stop_flush_event, NULL) != 0) { 1307 log_err("dnstap io, stop flush, could not ub_event_add"); 1308 return 0; 1309 } 1310 return 1; 1311 } 1312 return dtio_add_output_event_write(dtio); 1313 } 1314 #endif /* HAVE_SSL */ 1315 1316 #ifdef HAVE_SSL 1317 /** enable the brief write condition */ 1318 static int dtio_enable_brief_write(struct dt_io_thread* dtio) 1319 { 1320 dtio->ssl_brief_write = 1; 1321 return dtio_add_output_event_write(dtio); 1322 } 1323 #endif /* HAVE_SSL */ 1324 1325 #ifdef HAVE_SSL 1326 /** disable the brief write condition */ 1327 static int dtio_disable_brief_write(struct dt_io_thread* dtio) 1328 { 1329 dtio->ssl_brief_write = 0; 1330 return dtio_add_output_event_read(dtio); 1331 } 1332 #endif /* HAVE_SSL */ 1333 1334 #ifdef HAVE_SSL 1335 /** check peer verification after ssl handshake connection, false if closed*/ 1336 static int dtio_ssl_check_peer(struct dt_io_thread* dtio) 1337 { 1338 if((SSL_get_verify_mode(dtio->ssl)&SSL_VERIFY_PEER)) { 1339 /* verification */ 1340 if(SSL_get_verify_result(dtio->ssl) == X509_V_OK) { 1341 #ifdef HAVE_SSL_GET1_PEER_CERTIFICATE 1342 X509* x = SSL_get1_peer_certificate(dtio->ssl); 1343 #else 1344 X509* x = SSL_get_peer_certificate(dtio->ssl); 1345 #endif 1346 if(!x) { 1347 verbose(VERB_ALGO, "dnstap io, %s, SSL " 1348 "connection failed no certificate", 1349 dtio->ip_str); 1350 return 0; 1351 } 1352 log_cert(VERB_ALGO, "dnstap io, peer certificate", 1353 x); 1354 #ifdef HAVE_SSL_GET0_PEERNAME 1355 if(SSL_get0_peername(dtio->ssl)) { 1356 verbose(VERB_ALGO, "dnstap io, %s, SSL " 1357 "connection to %s authenticated", 1358 dtio->ip_str, 1359 SSL_get0_peername(dtio->ssl)); 1360 } else { 1361 #endif 1362 verbose(VERB_ALGO, "dnstap io, %s, SSL " 1363 "connection authenticated", 1364 dtio->ip_str); 1365 #ifdef HAVE_SSL_GET0_PEERNAME 1366 } 1367 #endif 1368 X509_free(x); 1369 } else { 1370 #ifdef HAVE_SSL_GET1_PEER_CERTIFICATE 1371 X509* x = SSL_get1_peer_certificate(dtio->ssl); 1372 #else 1373 X509* x = SSL_get_peer_certificate(dtio->ssl); 1374 #endif 1375 if(x) { 1376 log_cert(VERB_ALGO, "dnstap io, peer " 1377 "certificate", x); 1378 X509_free(x); 1379 } 1380 verbose(VERB_ALGO, "dnstap io, %s, SSL connection " 1381 "failed: failed to authenticate", 1382 dtio->ip_str); 1383 return 0; 1384 } 1385 } else { 1386 /* unauthenticated, the verify peer flag was not set 1387 * in ssl when the ssl object was created from ssl_ctx */ 1388 verbose(VERB_ALGO, "dnstap io, %s, SSL connection", 1389 dtio->ip_str); 1390 } 1391 return 1; 1392 } 1393 #endif /* HAVE_SSL */ 1394 1395 #ifdef HAVE_SSL 1396 /** perform ssl handshake, returns 1 if okay, 0 to stop */ 1397 static int dtio_ssl_handshake(struct dt_io_thread* dtio, 1398 struct stop_flush_info* info) 1399 { 1400 int r; 1401 if(dtio->ssl_brief_read) { 1402 /* assume the brief read condition is satisfied, 1403 * if we need more or again, we can set it again */ 1404 if(!dtio_disable_brief_read(dtio)) { 1405 if(info) dtio_stop_flush_exit(info); 1406 return 0; 1407 } 1408 } 1409 if(dtio->ssl_handshake_done) 1410 return 1; 1411 1412 ERR_clear_error(); 1413 r = SSL_do_handshake(dtio->ssl); 1414 if(r != 1) { 1415 int want = SSL_get_error(dtio->ssl, r); 1416 if(want == SSL_ERROR_WANT_READ) { 1417 /* we want to read on the connection */ 1418 if(!dtio_enable_brief_read(dtio)) { 1419 if(info) dtio_stop_flush_exit(info); 1420 return 0; 1421 } 1422 return 0; 1423 } else if(want == SSL_ERROR_WANT_WRITE) { 1424 /* we want to write on the connection */ 1425 return 0; 1426 } else if(r == 0) { 1427 /* closed */ 1428 if(info) dtio_stop_flush_exit(info); 1429 dtio_del_output_event(dtio); 1430 dtio_reconnect_slow(dtio, DTIO_RECONNECT_TIMEOUT_SLOW); 1431 dtio_close_output(dtio); 1432 return 0; 1433 } else if(want == SSL_ERROR_SYSCALL) { 1434 /* SYSCALL and errno==0 means closed uncleanly */ 1435 int silent = 0; 1436 #ifdef EPIPE 1437 if(errno == EPIPE && verbosity < 2) 1438 silent = 1; /* silence 'broken pipe' */ 1439 #endif 1440 #ifdef ECONNRESET 1441 if(errno == ECONNRESET && verbosity < 2) 1442 silent = 1; /* silence reset by peer */ 1443 #endif 1444 if(errno == 0) 1445 silent = 1; 1446 if(!silent) 1447 log_err("dnstap io, SSL_handshake syscall: %s", 1448 strerror(errno)); 1449 /* closed */ 1450 if(info) dtio_stop_flush_exit(info); 1451 dtio_del_output_event(dtio); 1452 dtio_reconnect_slow(dtio, DTIO_RECONNECT_TIMEOUT_SLOW); 1453 dtio_close_output(dtio); 1454 return 0; 1455 } else { 1456 unsigned long err = ERR_get_error(); 1457 if(!squelch_err_ssl_handshake(err)) { 1458 log_crypto_err_io_code("dnstap io, ssl handshake failed", 1459 want, err); 1460 verbose(VERB_OPS, "dnstap io, ssl handshake failed " 1461 "from %s", dtio->ip_str); 1462 } 1463 /* closed */ 1464 if(info) dtio_stop_flush_exit(info); 1465 dtio_del_output_event(dtio); 1466 dtio_reconnect_slow(dtio, DTIO_RECONNECT_TIMEOUT_SLOW); 1467 dtio_close_output(dtio); 1468 return 0; 1469 } 1470 1471 } 1472 /* check peer verification */ 1473 dtio->ssl_handshake_done = 1; 1474 1475 if(!dtio_ssl_check_peer(dtio)) { 1476 /* closed */ 1477 if(info) dtio_stop_flush_exit(info); 1478 dtio_del_output_event(dtio); 1479 dtio_reconnect_slow(dtio, DTIO_RECONNECT_TIMEOUT_SLOW); 1480 dtio_close_output(dtio); 1481 return 0; 1482 } 1483 return 1; 1484 } 1485 #endif /* HAVE_SSL */ 1486 1487 /** callback for the dnstap events, to write to the output */ 1488 void dtio_output_cb(int ATTR_UNUSED(fd), short bits, void* arg) 1489 { 1490 struct dt_io_thread* dtio = (struct dt_io_thread*)arg; 1491 int i; 1492 1493 if(dtio->check_nb_connect) { 1494 int connect_err = dtio_check_nb_connect(dtio); 1495 if(connect_err == -1) { 1496 /* close the channel */ 1497 dtio_del_output_event(dtio); 1498 dtio_close_output(dtio); 1499 return; 1500 } else if(connect_err == 0) { 1501 /* try again later */ 1502 return; 1503 } 1504 /* nonblocking connect check passed, continue */ 1505 } 1506 1507 #ifdef HAVE_SSL 1508 if(dtio->ssl && 1509 (!dtio->ssl_handshake_done || dtio->ssl_brief_read)) { 1510 if(!dtio_ssl_handshake(dtio, NULL)) 1511 return; 1512 } 1513 #endif 1514 1515 if((bits&UB_EV_READ) || dtio->ssl_brief_write) { 1516 #ifdef HAVE_SSL 1517 if(dtio->ssl_brief_write) 1518 (void)dtio_disable_brief_write(dtio); 1519 #endif 1520 if(dtio->ready_frame_sent && !dtio->accept_frame_received) { 1521 if(dtio_read_accept_frame(dtio) <= 0) 1522 return; 1523 } else if(!dtio_check_close(dtio)) 1524 return; 1525 } 1526 1527 /* loop to process a number of messages. This improves throughput, 1528 * because selecting on write-event if not needed for busy messages 1529 * (dnstap log) generation and if they need to all be written back. 1530 * The write event is usually not blocked up. But not forever, 1531 * because the event loop needs to stay responsive for other events. 1532 * If there are no (more) messages, or if the output buffers get 1533 * full, it returns out of the loop. */ 1534 for(i=0; i<DTIO_MESSAGES_PER_CALLBACK; i++) { 1535 /* see if there are messages that need writing */ 1536 if(!dtio->cur_msg) { 1537 if(!dtio_find_msg(dtio)) { 1538 if(i == 0) { 1539 /* no messages on the first iteration, 1540 * the queues are all empty */ 1541 dtio_sleep(dtio); 1542 /* After putting to sleep, see if 1543 * a message is in a message queue, 1544 * if so, resume service. Stops a 1545 * race condition where a thread could 1546 * have one message but the dtio 1547 * also just went to sleep. With the 1548 * message queued between the 1549 * dtio_find_msg and dtio_sleep 1550 * calls. */ 1551 if(dtio_find_msg(dtio)) { 1552 if(!dtio_add_output_event_write(dtio)) 1553 return; 1554 } 1555 } 1556 if(!dtio->cur_msg) 1557 return; /* nothing to do */ 1558 } 1559 } 1560 1561 /* write it */ 1562 if(dtio->cur_msg_done < dtio->cur_msg_len) { 1563 if(!dtio_write_more(dtio)) 1564 return; 1565 } 1566 1567 /* done with the current message */ 1568 dtio_cur_msg_free(dtio); 1569 1570 /* If this is a bidirectional stream the first message will be 1571 * the READY control frame. We can only continue writing after 1572 * receiving an ACCEPT control frame. */ 1573 if(dtio->is_bidirectional && !dtio->ready_frame_sent) { 1574 dtio->ready_frame_sent = 1; 1575 (void)dtio_add_output_event_read(dtio); 1576 break; 1577 } 1578 } 1579 } 1580 1581 /** callback for the dnstap commandpipe, to stop the dnstap IO */ 1582 void dtio_cmd_cb(int fd, short ATTR_UNUSED(bits), void* arg) 1583 { 1584 struct dt_io_thread* dtio = (struct dt_io_thread*)arg; 1585 uint8_t cmd; 1586 ssize_t r; 1587 if(dtio->want_to_exit) 1588 return; 1589 r = read(fd, &cmd, sizeof(cmd)); 1590 if(r == -1) { 1591 #ifndef USE_WINSOCK 1592 if(errno == EINTR || errno == EAGAIN) 1593 return; /* ignore this */ 1594 #else 1595 if(WSAGetLastError() == WSAEINPROGRESS) 1596 return; 1597 if(WSAGetLastError() == WSAEWOULDBLOCK) 1598 return; 1599 #endif 1600 log_err("dnstap io: failed to read: %s", sock_strerror(errno)); 1601 /* and then fall through to quit the thread */ 1602 } else if(r == 0) { 1603 verbose(VERB_ALGO, "dnstap io: cmd channel closed"); 1604 } else if(r == 1 && cmd == DTIO_COMMAND_STOP) { 1605 verbose(VERB_ALGO, "dnstap io: cmd channel cmd quit"); 1606 } else if(r == 1 && cmd == DTIO_COMMAND_WAKEUP) { 1607 verbose(VERB_ALGO, "dnstap io: cmd channel cmd wakeup"); 1608 1609 if(dtio->is_bidirectional && !dtio->accept_frame_received) { 1610 verbose(VERB_ALGO, "dnstap io: cmd wakeup ignored, " 1611 "waiting for ACCEPT control frame"); 1612 return; 1613 } 1614 1615 /* reregister event */ 1616 if(!dtio_add_output_event_write(dtio)) 1617 return; 1618 return; 1619 } else if(r == 1) { 1620 verbose(VERB_ALGO, "dnstap io: cmd channel unknown command"); 1621 } 1622 dtio->want_to_exit = 1; 1623 if(ub_event_base_loopexit((struct ub_event_base*)dtio->event_base) 1624 != 0) { 1625 log_err("dnstap io: could not loopexit"); 1626 } 1627 } 1628 1629 #ifndef THREADS_DISABLED 1630 /** setup the event base for the dnstap io thread */ 1631 static void dtio_setup_base(struct dt_io_thread* dtio, time_t* secs, 1632 struct timeval* now) 1633 { 1634 memset(now, 0, sizeof(*now)); 1635 dtio->event_base = ub_default_event_base(0, secs, now); 1636 if(!dtio->event_base) { 1637 fatal_exit("dnstap io: could not create event_base"); 1638 } 1639 } 1640 #endif /* THREADS_DISABLED */ 1641 1642 /** setup the cmd event for dnstap io */ 1643 static void dtio_setup_cmd(struct dt_io_thread* dtio) 1644 { 1645 struct ub_event* cmdev; 1646 fd_set_nonblock(dtio->commandpipe[0]); 1647 cmdev = ub_event_new(dtio->event_base, dtio->commandpipe[0], 1648 UB_EV_READ | UB_EV_PERSIST, &dtio_cmd_cb, dtio); 1649 if(!cmdev) { 1650 fatal_exit("dnstap io: out of memory"); 1651 } 1652 dtio->command_event = cmdev; 1653 if(ub_event_add(cmdev, NULL) != 0) { 1654 fatal_exit("dnstap io: out of memory (adding event)"); 1655 } 1656 } 1657 1658 /** setup the reconnect event for dnstap io */ 1659 static void dtio_setup_reconnect(struct dt_io_thread* dtio) 1660 { 1661 dtio_reconnect_clear(dtio); 1662 dtio->reconnect_timer = ub_event_new(dtio->event_base, -1, 1663 UB_EV_TIMEOUT, &dtio_reconnect_timeout_cb, dtio); 1664 if(!dtio->reconnect_timer) { 1665 fatal_exit("dnstap io: out of memory"); 1666 } 1667 } 1668 1669 /** 1670 * structure to keep track of information during stop flush 1671 */ 1672 struct stop_flush_info { 1673 /** the event base during stop flush */ 1674 struct ub_event_base* base; 1675 /** did we already want to exit this stop-flush event base */ 1676 int want_to_exit_flush; 1677 /** has the timer fired */ 1678 int timer_done; 1679 /** the dtio */ 1680 struct dt_io_thread* dtio; 1681 /** the stop control frame */ 1682 void* stop_frame; 1683 /** length of the stop frame */ 1684 size_t stop_frame_len; 1685 /** how much we have done of the stop frame */ 1686 size_t stop_frame_done; 1687 }; 1688 1689 /** exit the stop flush base */ 1690 static void dtio_stop_flush_exit(struct stop_flush_info* info) 1691 { 1692 if(info->want_to_exit_flush) 1693 return; 1694 info->want_to_exit_flush = 1; 1695 if(ub_event_base_loopexit(info->base) != 0) { 1696 log_err("dnstap io: could not loopexit"); 1697 } 1698 } 1699 1700 /** send the stop control, 1701 * return true if completed the frame. */ 1702 static int dtio_control_stop_send(struct stop_flush_info* info) 1703 { 1704 struct dt_io_thread* dtio = info->dtio; 1705 int r; 1706 if(info->stop_frame_done >= info->stop_frame_len) 1707 return 1; 1708 r = dtio_write_buf(dtio, ((uint8_t*)info->stop_frame) + 1709 info->stop_frame_done, info->stop_frame_len - 1710 info->stop_frame_done); 1711 if(r == -1) { 1712 verbose(VERB_ALGO, "dnstap io: stop flush: output closed"); 1713 dtio_stop_flush_exit(info); 1714 return 0; 1715 } 1716 if(r == 0) { 1717 /* try again later, or timeout */ 1718 return 0; 1719 } 1720 info->stop_frame_done += r; 1721 if(info->stop_frame_done < info->stop_frame_len) 1722 return 0; /* not done yet */ 1723 return 1; 1724 } 1725 1726 void dtio_stop_timer_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(bits), 1727 void* arg) 1728 { 1729 struct stop_flush_info* info = (struct stop_flush_info*)arg; 1730 if(info->want_to_exit_flush) 1731 return; 1732 verbose(VERB_ALGO, "dnstap io: stop flush timer expired, stop flush"); 1733 info->timer_done = 1; 1734 dtio_stop_flush_exit(info); 1735 } 1736 1737 void dtio_stop_ev_cb(int ATTR_UNUSED(fd), short bits, void* arg) 1738 { 1739 struct stop_flush_info* info = (struct stop_flush_info*)arg; 1740 struct dt_io_thread* dtio = info->dtio; 1741 if(info->want_to_exit_flush) 1742 return; 1743 if(dtio->check_nb_connect) { 1744 /* we don't start the stop_flush if connect still 1745 * in progress, but the check code is here, just in case */ 1746 int connect_err = dtio_check_nb_connect(dtio); 1747 if(connect_err == -1) { 1748 /* close the channel, exit the stop flush */ 1749 dtio_stop_flush_exit(info); 1750 dtio_del_output_event(dtio); 1751 dtio_close_output(dtio); 1752 return; 1753 } else if(connect_err == 0) { 1754 /* try again later */ 1755 return; 1756 } 1757 /* nonblocking connect check passed, continue */ 1758 } 1759 #ifdef HAVE_SSL 1760 if(dtio->ssl && 1761 (!dtio->ssl_handshake_done || dtio->ssl_brief_read)) { 1762 if(!dtio_ssl_handshake(dtio, info)) 1763 return; 1764 } 1765 #endif 1766 1767 if((bits&UB_EV_READ)) { 1768 if(!dtio_check_close(dtio)) { 1769 if(dtio->fd == -1) { 1770 verbose(VERB_ALGO, "dnstap io: " 1771 "stop flush: output closed"); 1772 dtio_stop_flush_exit(info); 1773 } 1774 return; 1775 } 1776 } 1777 /* write remainder of last frame */ 1778 if(dtio->cur_msg) { 1779 if(dtio->cur_msg_done < dtio->cur_msg_len) { 1780 if(!dtio_write_more(dtio)) { 1781 if(dtio->fd == -1) { 1782 verbose(VERB_ALGO, "dnstap io: " 1783 "stop flush: output closed"); 1784 dtio_stop_flush_exit(info); 1785 } 1786 return; 1787 } 1788 } 1789 verbose(VERB_ALGO, "dnstap io: stop flush completed " 1790 "last frame"); 1791 dtio_cur_msg_free(dtio); 1792 } 1793 /* write stop frame */ 1794 if(info->stop_frame_done < info->stop_frame_len) { 1795 if(!dtio_control_stop_send(info)) 1796 return; 1797 verbose(VERB_ALGO, "dnstap io: stop flush completed " 1798 "stop control frame"); 1799 } 1800 /* when last frame and stop frame are sent, exit */ 1801 dtio_stop_flush_exit(info); 1802 } 1803 1804 /** flush at end, last packet and stop control */ 1805 static void dtio_control_stop_flush(struct dt_io_thread* dtio) 1806 { 1807 /* briefly attempt to flush the previous packet to the output, 1808 * this could be a partial packet, or even the start control frame */ 1809 time_t secs = 0; 1810 struct timeval now; 1811 struct stop_flush_info info; 1812 struct timeval tv; 1813 struct ub_event* timer, *stopev; 1814 1815 if(dtio->fd == -1 || dtio->check_nb_connect) { 1816 /* no connection or we have just connected, so nothing is 1817 * sent yet, so nothing to stop or flush */ 1818 return; 1819 } 1820 if(dtio->ssl && !dtio->ssl_handshake_done) { 1821 /* no SSL connection has been established yet */ 1822 return; 1823 } 1824 1825 memset(&info, 0, sizeof(info)); 1826 memset(&now, 0, sizeof(now)); 1827 info.dtio = dtio; 1828 info.base = ub_default_event_base(0, &secs, &now); 1829 if(!info.base) { 1830 log_err("dnstap io: malloc failure"); 1831 return; 1832 } 1833 timer = ub_event_new(info.base, -1, UB_EV_TIMEOUT, 1834 &dtio_stop_timer_cb, &info); 1835 if(!timer) { 1836 log_err("dnstap io: malloc failure"); 1837 ub_event_base_free(info.base); 1838 return; 1839 } 1840 memset(&tv, 0, sizeof(tv)); 1841 tv.tv_sec = 2; 1842 if(ub_timer_add(timer, info.base, &dtio_stop_timer_cb, &info, 1843 &tv) != 0) { 1844 log_err("dnstap io: cannot event_timer_add"); 1845 ub_event_free(timer); 1846 ub_event_base_free(info.base); 1847 return; 1848 } 1849 stopev = ub_event_new(info.base, dtio->fd, UB_EV_READ | 1850 UB_EV_WRITE | UB_EV_PERSIST, &dtio_stop_ev_cb, &info); 1851 if(!stopev) { 1852 log_err("dnstap io: malloc failure"); 1853 ub_timer_del(timer); 1854 ub_event_free(timer); 1855 ub_event_base_free(info.base); 1856 return; 1857 } 1858 if(ub_event_add(stopev, NULL) != 0) { 1859 log_err("dnstap io: cannot event_add"); 1860 ub_event_free(stopev); 1861 ub_timer_del(timer); 1862 ub_event_free(timer); 1863 ub_event_base_free(info.base); 1864 return; 1865 } 1866 info.stop_frame = fstrm_create_control_frame_stop( 1867 &info.stop_frame_len); 1868 if(!info.stop_frame) { 1869 log_err("dnstap io: malloc failure"); 1870 ub_event_del(stopev); 1871 ub_event_free(stopev); 1872 ub_timer_del(timer); 1873 ub_event_free(timer); 1874 ub_event_base_free(info.base); 1875 return; 1876 } 1877 dtio->stop_flush_event = stopev; 1878 1879 /* wait briefly, or until finished */ 1880 verbose(VERB_ALGO, "dnstap io: stop flush started"); 1881 if(ub_event_base_dispatch(info.base) < 0) { 1882 log_err("dnstap io: dispatch flush failed, errno is %s", 1883 strerror(errno)); 1884 } 1885 verbose(VERB_ALGO, "dnstap io: stop flush ended"); 1886 free(info.stop_frame); 1887 dtio->stop_flush_event = NULL; 1888 ub_event_del(stopev); 1889 ub_event_free(stopev); 1890 ub_timer_del(timer); 1891 ub_event_free(timer); 1892 ub_event_base_free(info.base); 1893 } 1894 1895 /** perform desetup and free stuff when the dnstap io thread exits */ 1896 static void dtio_desetup(struct dt_io_thread* dtio) 1897 { 1898 dtio_control_stop_flush(dtio); 1899 dtio_del_output_event(dtio); 1900 dtio_close_output(dtio); 1901 ub_event_del(dtio->command_event); 1902 ub_event_free(dtio->command_event); 1903 #ifndef USE_WINSOCK 1904 close(dtio->commandpipe[0]); 1905 #else 1906 _close(dtio->commandpipe[0]); 1907 #endif 1908 dtio->commandpipe[0] = -1; 1909 dtio_reconnect_del(dtio); 1910 ub_event_free(dtio->reconnect_timer); 1911 dtio_cur_msg_free(dtio); 1912 #ifndef THREADS_DISABLED 1913 ub_event_base_free(dtio->event_base); 1914 #endif 1915 } 1916 1917 /** setup a start control message */ 1918 static int dtio_control_start_send(struct dt_io_thread* dtio) 1919 { 1920 log_assert(dtio->cur_msg == NULL && dtio->cur_msg_len == 0); 1921 dtio->cur_msg = fstrm_create_control_frame_start(DNSTAP_CONTENT_TYPE, 1922 &dtio->cur_msg_len); 1923 if(!dtio->cur_msg) { 1924 return 0; 1925 } 1926 /* setup to send the control message */ 1927 /* set that the buffer needs to be sent, but the length 1928 * of that buffer is already written, that way the buffer can 1929 * start with 0 length and then the length of the control frame 1930 * in it */ 1931 dtio->cur_msg_done = 0; 1932 dtio->cur_msg_len_done = 4; 1933 return 1; 1934 } 1935 1936 /** setup a ready control message */ 1937 static int dtio_control_ready_send(struct dt_io_thread* dtio) 1938 { 1939 log_assert(dtio->cur_msg == NULL && dtio->cur_msg_len == 0); 1940 dtio->cur_msg = fstrm_create_control_frame_ready(DNSTAP_CONTENT_TYPE, 1941 &dtio->cur_msg_len); 1942 if(!dtio->cur_msg) { 1943 return 0; 1944 } 1945 /* setup to send the control message */ 1946 /* set that the buffer needs to be sent, but the length 1947 * of that buffer is already written, that way the buffer can 1948 * start with 0 length and then the length of the control frame 1949 * in it */ 1950 dtio->cur_msg_done = 0; 1951 dtio->cur_msg_len_done = 4; 1952 return 1; 1953 } 1954 1955 /** open the output file descriptor for af_local */ 1956 static int dtio_open_output_local(struct dt_io_thread* dtio) 1957 { 1958 #ifdef HAVE_SYS_UN_H 1959 struct sockaddr_un s; 1960 dtio->fd = socket(AF_LOCAL, SOCK_STREAM, 0); 1961 if(dtio->fd == -1) { 1962 log_err("dnstap io: failed to create socket: %s", 1963 sock_strerror(errno)); 1964 return 0; 1965 } 1966 memset(&s, 0, sizeof(s)); 1967 #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN 1968 /* this member exists on BSDs, not Linux */ 1969 s.sun_len = (unsigned)sizeof(s); 1970 #endif 1971 s.sun_family = AF_LOCAL; 1972 /* length is 92-108, 104 on FreeBSD */ 1973 (void)strlcpy(s.sun_path, dtio->socket_path, sizeof(s.sun_path)); 1974 fd_set_nonblock(dtio->fd); 1975 if(connect(dtio->fd, (struct sockaddr*)&s, (socklen_t)sizeof(s)) 1976 == -1) { 1977 char* to = dtio->socket_path; 1978 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MIN && 1979 verbosity < 4) { 1980 dtio_close_fd(dtio); 1981 return 0; /* no log retries on low verbosity */ 1982 } 1983 log_err("dnstap io: failed to connect to \"%s\": %s", 1984 to, sock_strerror(errno)); 1985 dtio_close_fd(dtio); 1986 return 0; 1987 } 1988 return 1; 1989 #else 1990 log_err("cannot create af_local socket"); 1991 return 0; 1992 #endif /* HAVE_SYS_UN_H */ 1993 } 1994 1995 /** open the output file descriptor for af_inet and af_inet6 */ 1996 static int dtio_open_output_tcp(struct dt_io_thread* dtio) 1997 { 1998 struct sockaddr_storage addr; 1999 socklen_t addrlen; 2000 memset(&addr, 0, sizeof(addr)); 2001 addrlen = (socklen_t)sizeof(addr); 2002 2003 if(!extstrtoaddr(dtio->ip_str, &addr, &addrlen, UNBOUND_DNS_PORT)) { 2004 log_err("could not parse IP '%s'", dtio->ip_str); 2005 return 0; 2006 } 2007 dtio->fd = socket(addr.ss_family, SOCK_STREAM, 0); 2008 if(dtio->fd == -1) { 2009 log_err("can't create socket: %s", sock_strerror(errno)); 2010 return 0; 2011 } 2012 fd_set_nonblock(dtio->fd); 2013 if(connect(dtio->fd, (struct sockaddr*)&addr, addrlen) == -1) { 2014 if(errno == EINPROGRESS) 2015 return 1; /* wait until connect done*/ 2016 if(dtio->reconnect_timeout > DTIO_RECONNECT_TIMEOUT_MIN && 2017 verbosity < 4) { 2018 dtio_close_fd(dtio); 2019 return 0; /* no log retries on low verbosity */ 2020 } 2021 #ifndef USE_WINSOCK 2022 if(tcp_connect_errno_needs_log( 2023 (struct sockaddr *)&addr, addrlen)) { 2024 log_err("dnstap io: failed to connect to %s: %s", 2025 dtio->ip_str, strerror(errno)); 2026 } 2027 #else 2028 if(WSAGetLastError() == WSAEINPROGRESS || 2029 WSAGetLastError() == WSAEWOULDBLOCK) 2030 return 1; /* wait until connect done*/ 2031 if(tcp_connect_errno_needs_log( 2032 (struct sockaddr *)&addr, addrlen)) { 2033 log_err("dnstap io: failed to connect to %s: %s", 2034 dtio->ip_str, wsa_strerror(WSAGetLastError())); 2035 } 2036 #endif 2037 dtio_close_fd(dtio); 2038 return 0; 2039 } 2040 return 1; 2041 } 2042 2043 /** setup the SSL structure for new connection */ 2044 static int dtio_setup_ssl(struct dt_io_thread* dtio) 2045 { 2046 dtio->ssl = outgoing_ssl_fd(dtio->ssl_ctx, dtio->fd); 2047 if(!dtio->ssl) return 0; 2048 dtio->ssl_handshake_done = 0; 2049 dtio->ssl_brief_read = 0; 2050 2051 if(!set_auth_name_on_ssl(dtio->ssl, dtio->tls_server_name, 2052 dtio->tls_use_sni)) { 2053 return 0; 2054 } 2055 return 1; 2056 } 2057 2058 /** open the output file descriptor */ 2059 static void dtio_open_output(struct dt_io_thread* dtio) 2060 { 2061 struct ub_event* ev; 2062 if(dtio->upstream_is_unix) { 2063 if(!dtio_open_output_local(dtio)) { 2064 dtio_reconnect_enable(dtio); 2065 return; 2066 } 2067 } else if(dtio->upstream_is_tcp || dtio->upstream_is_tls) { 2068 if(!dtio_open_output_tcp(dtio)) { 2069 dtio_reconnect_enable(dtio); 2070 return; 2071 } 2072 if(dtio->upstream_is_tls) { 2073 if(!dtio_setup_ssl(dtio)) { 2074 dtio_close_fd(dtio); 2075 dtio_reconnect_enable(dtio); 2076 return; 2077 } 2078 } 2079 } 2080 dtio->check_nb_connect = 1; 2081 2082 /* the EV_READ is to read ACCEPT control messages, and catch channel 2083 * close. EV_WRITE is to write packets */ 2084 ev = ub_event_new(dtio->event_base, dtio->fd, 2085 UB_EV_READ | UB_EV_WRITE | UB_EV_PERSIST, &dtio_output_cb, 2086 dtio); 2087 if(!ev) { 2088 log_err("dnstap io: out of memory"); 2089 if(dtio->ssl) { 2090 #ifdef HAVE_SSL 2091 SSL_free(dtio->ssl); 2092 dtio->ssl = NULL; 2093 #endif 2094 } 2095 dtio_close_fd(dtio); 2096 dtio_reconnect_enable(dtio); 2097 return; 2098 } 2099 dtio->event = ev; 2100 2101 /* setup protocol control message to start */ 2102 if((!dtio->is_bidirectional && !dtio_control_start_send(dtio)) || 2103 (dtio->is_bidirectional && !dtio_control_ready_send(dtio)) ) { 2104 log_err("dnstap io: out of memory"); 2105 ub_event_free(dtio->event); 2106 dtio->event = NULL; 2107 if(dtio->ssl) { 2108 #ifdef HAVE_SSL 2109 SSL_free(dtio->ssl); 2110 dtio->ssl = NULL; 2111 #endif 2112 } 2113 dtio_close_fd(dtio); 2114 dtio_reconnect_enable(dtio); 2115 return; 2116 } 2117 } 2118 2119 /** perform the setup of the writer thread on the established event_base */ 2120 static void dtio_setup_on_base(struct dt_io_thread* dtio) 2121 { 2122 dtio_setup_cmd(dtio); 2123 dtio_setup_reconnect(dtio); 2124 dtio_open_output(dtio); 2125 if(!dtio_add_output_event_write(dtio)) 2126 return; 2127 } 2128 2129 #ifndef THREADS_DISABLED 2130 /** the IO thread function for the DNSTAP IO */ 2131 static void* dnstap_io(void* arg) 2132 { 2133 struct dt_io_thread* dtio = (struct dt_io_thread*)arg; 2134 time_t secs = 0; 2135 struct timeval now; 2136 const char name[16] = "unbound/dnstap"; /* seems to be the safest size 2137 between different OSes */ 2138 2139 #if defined(HAVE_GETTID) && !defined(THREADS_DISABLED) 2140 dtio->thread_tid = gettid(); 2141 if(dtio->thread_tid_log) 2142 log_thread_set(&dtio->thread_tid); 2143 else 2144 #endif 2145 log_thread_set(&dtio->threadnum); 2146 2147 ub_thread_setname(dtio->tid, name); 2148 2149 /* setup */ 2150 verbose(VERB_ALGO, "start dnstap io thread"); 2151 dtio_setup_base(dtio, &secs, &now); 2152 dtio_setup_on_base(dtio); 2153 2154 /* run */ 2155 if(ub_event_base_dispatch(dtio->event_base) < 0) { 2156 log_err("dnstap io: dispatch failed, errno is %s", 2157 strerror(errno)); 2158 } 2159 2160 /* cleanup */ 2161 verbose(VERB_ALGO, "stop dnstap io thread"); 2162 dtio_desetup(dtio); 2163 return NULL; 2164 } 2165 #endif /* THREADS_DISABLED */ 2166 2167 int dt_io_thread_start(struct dt_io_thread* dtio, void* event_base_nothr, 2168 int numworkers) 2169 { 2170 /* set up the thread, can fail */ 2171 #ifndef USE_WINSOCK 2172 if(pipe(dtio->commandpipe) == -1) { 2173 log_err("failed to create pipe: %s", strerror(errno)); 2174 return 0; 2175 } 2176 #else 2177 if(_pipe(dtio->commandpipe, 4096, _O_BINARY) == -1) { 2178 log_err("failed to create _pipe: %s", 2179 wsa_strerror(WSAGetLastError())); 2180 return 0; 2181 } 2182 #endif 2183 2184 /* start the thread */ 2185 dtio->threadnum = numworkers+1; 2186 dtio->started = 1; 2187 #ifndef THREADS_DISABLED 2188 ub_thread_create(&dtio->tid, dnstap_io, dtio); 2189 (void)event_base_nothr; 2190 #else 2191 dtio->event_base = event_base_nothr; 2192 dtio_setup_on_base(dtio); 2193 #endif 2194 return 1; 2195 } 2196 2197 void dt_io_thread_stop(struct dt_io_thread* dtio) 2198 { 2199 #ifndef THREADS_DISABLED 2200 uint8_t cmd = DTIO_COMMAND_STOP; 2201 #endif 2202 if(!dtio) return; 2203 if(!dtio->started) return; 2204 verbose(VERB_ALGO, "dnstap io: send stop cmd"); 2205 2206 #ifndef THREADS_DISABLED 2207 while(1) { 2208 ssize_t r = write(dtio->commandpipe[1], &cmd, sizeof(cmd)); 2209 if(r == -1) { 2210 #ifndef USE_WINSOCK 2211 if(errno == EINTR || errno == EAGAIN) 2212 continue; 2213 #else 2214 if(WSAGetLastError() == WSAEINPROGRESS) 2215 continue; 2216 if(WSAGetLastError() == WSAEWOULDBLOCK) 2217 continue; 2218 #endif 2219 log_err("dnstap io stop: write: %s", 2220 sock_strerror(errno)); 2221 break; 2222 } 2223 break; 2224 } 2225 dtio->started = 0; 2226 #endif /* THREADS_DISABLED */ 2227 2228 #ifndef USE_WINSOCK 2229 close(dtio->commandpipe[1]); 2230 #else 2231 _close(dtio->commandpipe[1]); 2232 #endif 2233 dtio->commandpipe[1] = -1; 2234 #ifndef THREADS_DISABLED 2235 ub_thread_join(dtio->tid); 2236 #else 2237 dtio->want_to_exit = 1; 2238 dtio_desetup(dtio); 2239 #endif 2240 } 2241