Lines Matching defs:bev_ssl
369 put_error(struct bufferevent_openssl *bev_ssl, unsigned long err)
371 if (bev_ssl->n_errors == NUM_ERRORS)
378 bev_ssl->errors[bev_ssl->n_errors++] = (ev_uint32_t) err;
385 start_reading(struct bufferevent_openssl *bev_ssl)
387 if (bev_ssl->underlying) {
388 bufferevent_unsuspend_read_(bev_ssl->underlying,
392 struct bufferevent *bev = &bev_ssl->bev.bev;
395 if (r == 0 && bev_ssl->read_blocked_on_write)
406 start_writing(struct bufferevent_openssl *bev_ssl)
409 if (bev_ssl->underlying) {
410 if (bev_ssl->write_blocked_on_read) {
411 bufferevent_unsuspend_read_(bev_ssl->underlying,
415 struct bufferevent *bev = &bev_ssl->bev.bev;
417 if (!r && bev_ssl->write_blocked_on_read)
425 stop_reading(struct bufferevent_openssl *bev_ssl)
427 if (bev_ssl->write_blocked_on_read)
429 if (bev_ssl->underlying) {
430 bufferevent_suspend_read_(bev_ssl->underlying,
433 struct bufferevent *bev = &bev_ssl->bev.bev;
439 stop_writing(struct bufferevent_openssl *bev_ssl)
441 if (bev_ssl->read_blocked_on_write)
443 if (bev_ssl->underlying) {
444 bufferevent_unsuspend_read_(bev_ssl->underlying,
447 struct bufferevent *bev = &bev_ssl->bev.bev;
453 set_rbow(struct bufferevent_openssl *bev_ssl)
455 if (!bev_ssl->underlying)
456 stop_reading(bev_ssl);
457 bev_ssl->read_blocked_on_write = 1;
458 return start_writing(bev_ssl);
462 set_wbor(struct bufferevent_openssl *bev_ssl)
464 if (!bev_ssl->underlying)
465 stop_writing(bev_ssl);
466 bev_ssl->write_blocked_on_read = 1;
467 return start_reading(bev_ssl);
471 clear_rbow(struct bufferevent_openssl *bev_ssl)
473 struct bufferevent *bev = &bev_ssl->bev.bev;
475 bev_ssl->read_blocked_on_write = 0;
477 stop_writing(bev_ssl);
479 r = start_reading(bev_ssl);
485 clear_wbor(struct bufferevent_openssl *bev_ssl)
487 struct bufferevent *bev = &bev_ssl->bev.bev;
489 bev_ssl->write_blocked_on_read = 0;
491 stop_reading(bev_ssl);
493 r = start_writing(bev_ssl);
498 conn_closed(struct bufferevent_openssl *bev_ssl, int when, int errcode, int ret)
507 if (SSL_get_shutdown(bev_ssl->ssl) & SSL_RECEIVED_SHUTDOWN)
516 put_error(bev_ssl, errcode);
520 put_error(bev_ssl, errcode);
524 put_error(bev_ssl, errcode);
538 put_error(bev_ssl, err);
541 if (dirty_shutdown && bev_ssl->allow_dirty_shutdown)
544 stop_reading(bev_ssl);
545 stop_writing(bev_ssl);
549 bufferevent_run_eventcb_(&bev_ssl->bev.bev, event, 0);
553 init_bio_counts(struct bufferevent_openssl *bev_ssl)
557 wbio = SSL_get_wbio(bev_ssl->ssl);
558 bev_ssl->counts.n_written = wbio ? BIO_number_written(wbio) : 0;
559 rbio = SSL_get_rbio(bev_ssl->ssl);
560 bev_ssl->counts.n_read = rbio ? BIO_number_read(rbio) : 0;
564 decrement_buckets(struct bufferevent_openssl *bev_ssl)
566 unsigned long num_w = BIO_number_written(SSL_get_wbio(bev_ssl->ssl));
567 unsigned long num_r = BIO_number_read(SSL_get_rbio(bev_ssl->ssl));
569 unsigned long w = num_w - bev_ssl->counts.n_written;
570 unsigned long r = num_r - bev_ssl->counts.n_read;
572 bufferevent_decrement_write_buckets_(&bev_ssl->bev, w);
574 bufferevent_decrement_read_buckets_(&bev_ssl->bev, r);
575 bev_ssl->counts.n_written = num_w;
576 bev_ssl->counts.n_read = num_r;
586 do_read(struct bufferevent_openssl *bev_ssl, int n_to_read) {
588 struct bufferevent *bev = &bev_ssl->bev.bev;
594 if (bev_ssl->bev.read_suspended)
597 atmost = bufferevent_get_read_max_(&bev_ssl->bev);
606 if (bev_ssl->bev.read_suspended)
609 r = SSL_read(bev_ssl->ssl, space[i].iov_base, space[i].iov_len);
612 if (bev_ssl->read_blocked_on_write)
613 if (clear_rbow(bev_ssl) < 0)
617 decrement_buckets(bev_ssl);
619 int err = SSL_get_error(bev_ssl->ssl, r);
624 if (bev_ssl->read_blocked_on_write)
625 if (clear_rbow(bev_ssl) < 0)
631 if (!bev_ssl->read_blocked_on_write)
632 if (set_rbow(bev_ssl) < 0)
636 conn_closed(bev_ssl, BEV_EVENT_READING, err, r);
646 if (bev_ssl->underlying)
656 do_write(struct bufferevent_openssl *bev_ssl, int atmost)
659 struct bufferevent *bev = &bev_ssl->bev.bev;
664 if (bev_ssl->last_write > 0)
665 atmost = bev_ssl->last_write;
667 atmost = bufferevent_get_write_max_(&bev_ssl->bev);
676 if (bev_ssl->bev.write_suspended)
686 r = SSL_write(bev_ssl->ssl, space[i].iov_base,
690 if (bev_ssl->write_blocked_on_read)
691 if (clear_wbor(bev_ssl) < 0)
694 bev_ssl->last_write = -1;
695 decrement_buckets(bev_ssl);
697 int err = SSL_get_error(bev_ssl->ssl, r);
702 if (bev_ssl->write_blocked_on_read)
703 if (clear_wbor(bev_ssl) < 0)
705 bev_ssl->last_write = space[i].iov_len;
710 if (!bev_ssl->write_blocked_on_read)
711 if (set_wbor(bev_ssl) < 0)
713 bev_ssl->last_write = space[i].iov_len;
716 conn_closed(bev_ssl, BEV_EVENT_WRITING, err, r);
717 bev_ssl->last_write = -1;
726 if (bev_ssl->underlying)
787 consider_reading(struct bufferevent_openssl *bev_ssl)
793 while (bev_ssl->write_blocked_on_read) {
794 r = do_write(bev_ssl, WRITE_FRAME);
798 if (bev_ssl->write_blocked_on_read)
801 n_to_read = bytes_to_read(bev_ssl);
804 r = do_read(bev_ssl, n_to_read);
810 if (bev_ssl->bev.read_suspended)
821 n_to_read = SSL_pending(bev_ssl->ssl);
833 * potentially not read any more from bev_ssl->underlying
837 if (!n_to_read && bev_ssl->underlying)
838 n_to_read = bytes_to_read(bev_ssl);
842 struct bufferevent *bev = &bev_ssl->bev.bev;
847 if (!bev_ssl->underlying) {
849 if (bev_ssl->bev.read_suspended ||
850 !(bev_ssl->bev.bev.enabled & EV_READ)) {
851 event_del(&bev_ssl->bev.bev.ev_read);
857 consider_writing(struct bufferevent_openssl *bev_ssl)
860 struct evbuffer *output = bev_ssl->bev.bev.output;
864 while (bev_ssl->read_blocked_on_write) {
865 r = do_read(bev_ssl, 1024); /* XXXX 1024 is a hack */
867 struct bufferevent *bev = &bev_ssl->bev.bev;
874 if (bev_ssl->read_blocked_on_write)
876 if (bev_ssl->underlying) {
877 target = bev_ssl->underlying->output;
878 wm = &bev_ssl->underlying->wm_write;
880 while ((bev_ssl->bev.bev.enabled & EV_WRITE) &&
881 (! bev_ssl->bev.write_suspended) &&
889 r = do_write(bev_ssl, n_to_write);
894 if (!bev_ssl->underlying) {
896 event_del(&bev_ssl->bev.bev.ev_write);
897 } else if (bev_ssl->bev.write_suspended ||
898 !(bev_ssl->bev.bev.enabled & EV_WRITE)) {
900 event_del(&bev_ssl->bev.bev.ev_write);
908 struct bufferevent_openssl *bev_ssl = ctx;
909 consider_reading(bev_ssl);
915 struct bufferevent_openssl *bev_ssl = ctx;
916 consider_writing(bev_ssl);
922 struct bufferevent_openssl *bev_ssl = ctx;
926 if (bev_ssl->allow_dirty_shutdown)
941 bufferevent_run_eventcb_(&bev_ssl->bev.bev, event, 0);
947 struct bufferevent_openssl *bev_ssl = ptr;
948 bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
950 bufferevent_run_eventcb_(&bev_ssl->bev.bev,
953 consider_reading(bev_ssl);
955 bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
961 struct bufferevent_openssl *bev_ssl = ptr;
962 bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
964 bufferevent_run_eventcb_(&bev_ssl->bev.bev,
967 consider_writing(bev_ssl);
969 bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
973 be_openssl_auto_fd(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
975 if (!bev_ssl->underlying) {
976 struct bufferevent *bev = &bev_ssl->bev.bev;
985 set_open_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
987 if (bev_ssl->underlying) {
988 bufferevent_setcb(bev_ssl->underlying,
990 bev_ssl);
993 struct bufferevent *bev = &bev_ssl->bev.bev;
1006 be_openssl_readeventcb, bev_ssl);
1009 be_openssl_writeeventcb, bev_ssl);
1021 do_handshake(struct bufferevent_openssl *bev_ssl)
1025 switch (bev_ssl->state) {
1033 r = SSL_do_handshake(bev_ssl->ssl);
1036 decrement_buckets(bev_ssl);
1039 evutil_socket_t fd = event_get_fd(&bev_ssl->bev.bev.ev_read);
1041 bev_ssl->state = BUFFEREVENT_SSL_OPEN;
1042 set_open_callbacks(bev_ssl, fd); /* XXXX handle failure */
1044 bufferevent_enable(&bev_ssl->bev.bev, bev_ssl->bev.bev.enabled);
1045 bufferevent_run_eventcb_(&bev_ssl->bev.bev,
1049 int err = SSL_get_error(bev_ssl->ssl, r);
1053 stop_reading(bev_ssl);
1054 return start_writing(bev_ssl);
1056 stop_writing(bev_ssl);
1057 return start_reading(bev_ssl);
1059 conn_closed(bev_ssl, BEV_EVENT_READING, err, r);
1068 struct bufferevent_openssl *bev_ssl = ctx;
1069 do_handshake(bev_ssl);/* XXX handle failure */
1075 struct bufferevent_openssl *bev_ssl = ptr;
1077 bufferevent_incref_and_lock_(&bev_ssl->bev.bev);
1079 bufferevent_run_eventcb_(&bev_ssl->bev.bev, BEV_EVENT_TIMEOUT, 0);
1081 do_handshake(bev_ssl);/* XXX handle failure */
1082 bufferevent_decref_and_unlock_(&bev_ssl->bev.bev);
1086 set_handshake_callbacks(struct bufferevent_openssl *bev_ssl, evutil_socket_t fd)
1088 if (bev_ssl->underlying) {
1089 bufferevent_setcb(bev_ssl->underlying,
1092 bev_ssl);
1097 if (bufferevent_setfd(bev_ssl->underlying, fd))
1100 return do_handshake(bev_ssl);
1102 struct bufferevent *bev = &bev_ssl->bev.bev;
1111 be_openssl_handshakeeventcb, bev_ssl);
1114 be_openssl_handshakeeventcb, bev_ssl);
1124 struct bufferevent_openssl *bev_ssl = upcast(bev);
1125 if (!bev_ssl)
1127 if (SSL_renegotiate(bev_ssl->ssl) < 0)
1129 bev_ssl->state = BUFFEREVENT_SSL_CONNECTING;
1130 if (set_handshake_callbacks(bev_ssl, be_openssl_auto_fd(bev_ssl, -1)) < 0)
1132 if (!bev_ssl->underlying)
1133 return do_handshake(bev_ssl);
1141 struct bufferevent_openssl *bev_ssl = arg;
1145 if (cbinfo->n_added && bev_ssl->state == BUFFEREVENT_SSL_OPEN) {
1147 r = bufferevent_add_event_(&bev_ssl->bev.bev.ev_write,
1148 &bev_ssl->bev.bev.timeout_write);
1150 if (bev_ssl->underlying)
1151 consider_writing(bev_ssl);
1161 struct bufferevent_openssl *bev_ssl = upcast(bev);
1165 r1 = start_reading(bev_ssl);
1167 r2 = start_writing(bev_ssl);
1169 if (bev_ssl->underlying) {
1176 consider_reading(bev_ssl);
1178 consider_writing(bev_ssl);
1186 struct bufferevent_openssl *bev_ssl = upcast(bev);
1189 stop_reading(bev_ssl);
1191 stop_writing(bev_ssl);
1193 if (bev_ssl->underlying) {
1205 struct bufferevent_openssl *bev_ssl = upcast(bev);
1207 if (bev_ssl->bev.options & BEV_OPT_CLOSE_ON_FREE) {
1208 if (bev_ssl->underlying) {
1209 if (BEV_UPCAST(bev_ssl->underlying)->refcnt < 2) {
1213 bufferevent_free(bev_ssl->underlying);
1216 // bev_ssl->underlying = NULL;
1220 if (bev_ssl->underlying) {
1221 if (bev_ssl->underlying->errorcb == be_openssl_eventcb)
1222 bufferevent_setcb(bev_ssl->underlying,
1224 bufferevent_unsuspend_read_(bev_ssl->underlying,
1233 struct bufferevent_openssl *bev_ssl = upcast(bev);
1235 if (bev_ssl->bev.options & BEV_OPT_CLOSE_ON_FREE) {
1236 if (! bev_ssl->underlying) {
1238 BIO *bio = SSL_get_wbio(bev_ssl->ssl);
1244 SSL_free(bev_ssl->ssl);
1251 struct bufferevent_openssl *bev_ssl = upcast(bev);
1253 if (bev_ssl->underlying) {
1269 be_openssl_set_fd(struct bufferevent_openssl *bev_ssl,
1272 bev_ssl->state = state;
1276 if (!SSL_clear(bev_ssl->ssl))
1278 SSL_set_accept_state(bev_ssl->ssl);
1279 if (set_handshake_callbacks(bev_ssl, fd) < 0)
1283 if (!SSL_clear(bev_ssl->ssl))
1285 SSL_set_connect_state(bev_ssl->ssl);
1286 if (set_handshake_callbacks(bev_ssl, fd) < 0)
1290 if (set_open_callbacks(bev_ssl, fd) < 0)
1304 struct bufferevent_openssl *bev_ssl = upcast(bev);
1307 if (!bev_ssl->underlying) {
1310 SSL_set_bio(bev_ssl->ssl, bio, bio);
1313 if (!(bio = BIO_new_bufferevent(bev_ssl->underlying)))
1315 SSL_set_bio(bev_ssl->ssl, bio, bio);
1318 return be_openssl_set_fd(bev_ssl, bev_ssl->old_state, data->fd);
1320 if (bev_ssl->underlying) {
1321 data->fd = event_get_fd(&bev_ssl->underlying->ev_read);
1327 data->ptr = bev_ssl->underlying;
1338 struct bufferevent_openssl *bev_ssl = upcast(bufev);
1339 if (!bev_ssl)
1341 return bev_ssl->ssl;
1352 struct bufferevent_openssl *bev_ssl = NULL;
1360 if (!(bev_ssl = mm_calloc(1, sizeof(struct bufferevent_openssl))))
1363 bev_p = &bev_ssl->bev;
1373 bev_ssl->underlying = underlying;
1374 bev_ssl->ssl = ssl;
1376 bev_ssl->outbuf_cb = evbuffer_add_cb(bev_p->bev.output,
1377 be_openssl_outbuf_cb, bev_ssl);
1380 bufferevent_enable_locking_(&bev_ssl->bev.bev, NULL);
1383 bufferevent_init_generic_timeout_cbs_(&bev_ssl->bev.bev);
1387 bev_ssl->old_state = state;
1388 bev_ssl->last_write = -1;
1390 init_bio_counts(bev_ssl);
1392 fd = be_openssl_auto_fd(bev_ssl, fd);
1393 if (be_openssl_set_fd(bev_ssl, state, fd))
1404 return &bev_ssl->bev.bev;
1408 if (bev_ssl) {
1409 bev_ssl->ssl = NULL;
1410 bufferevent_free(&bev_ssl->bev.bev);
1493 struct bufferevent_openssl *bev_ssl;
1495 bev_ssl = upcast(bev);
1496 if (bev_ssl)
1497 allow_dirty_shutdown = bev_ssl->allow_dirty_shutdown;
1506 struct bufferevent_openssl *bev_ssl;
1508 bev_ssl = upcast(bev);
1509 if (bev_ssl)
1510 bev_ssl->allow_dirty_shutdown = !!allow_dirty_shutdown;
1518 struct bufferevent_openssl *bev_ssl;
1520 bev_ssl = upcast(bev);
1521 if (bev_ssl && bev_ssl->n_errors) {
1522 err = bev_ssl->errors[--bev_ssl->n_errors];