Lines Matching +full:y +full:- +full:rc
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
92 /* Client-to-server msg types */
189 #define RFB_ENCODING_RESIZE -223
190 #define RFB_ENCODING_EXT_KEYEVENT -258
215 uint16_t y; member
244 uint16_t y; member
255 uint16_t y; member
268 rfb_send_server_init_msg(struct rfb_softc *rc, int cfd) in rfb_send_server_init_msg() argument
275 sinfo.width = htons(gc_image->width); in rfb_send_server_init_msg()
276 sinfo.height = htons(gc_image->height); in rfb_send_server_init_msg()
290 sinfo.namelen = htonl(rc->fbnamelen); in rfb_send_server_init_msg()
292 (void)stream_write(cfd, rc->fbname, rc->fbnamelen); in rfb_send_server_init_msg()
296 rfb_send_resize_update_msg(struct rfb_softc *rc, int cfd) in rfb_send_resize_update_msg() argument
309 srect_hdr.y = htons(0); in rfb_send_resize_update_msg()
310 srect_hdr.width = htons(rc->width); in rfb_send_resize_update_msg()
311 srect_hdr.height = htons(rc->height); in rfb_send_resize_update_msg()
317 rfb_send_extended_keyevent_update_msg(struct rfb_softc *rc, int cfd) in rfb_send_extended_keyevent_update_msg() argument
330 srect_hdr.y = htons(0); in rfb_send_extended_keyevent_update_msg()
331 srect_hdr.width = htons(rc->width); in rfb_send_extended_keyevent_update_msg()
332 srect_hdr.height = htons(rc->height); in rfb_send_extended_keyevent_update_msg()
338 rfb_recv_set_pixfmt_msg(struct rfb_softc *rc __unused, int cfd) in rfb_recv_set_pixfmt_msg()
346 sizeof(pixfmt_msg) - 1); in rfb_recv_set_pixfmt_msg()
393 pthread_mutex_lock(&rc->pixfmt_mtx); in rfb_recv_set_pixfmt_msg()
394 rc->new_pixfmt.red_shift = red_shift; in rfb_recv_set_pixfmt_msg()
395 rc->new_pixfmt.green_shift = green_shift; in rfb_recv_set_pixfmt_msg()
396 rc->new_pixfmt.blue_shift = blue_shift; in rfb_recv_set_pixfmt_msg()
397 rc->new_pixfmt.adjust_pixels = adjust_pixels; in rfb_recv_set_pixfmt_msg()
398 pthread_mutex_unlock(&rc->pixfmt_mtx); in rfb_recv_set_pixfmt_msg()
401 rc->update_pixfmt = true; in rfb_recv_set_pixfmt_msg()
405 rfb_recv_set_encodings_msg(struct rfb_softc *rc, int cfd) in rfb_recv_set_encodings_msg() argument
411 (void)stream_read(cfd, (uint8_t *)&enc_msg + 1, sizeof(enc_msg) - 1); in rfb_recv_set_encodings_msg()
417 rc->enc_raw_ok = true; in rfb_recv_set_encodings_msg()
420 if (!rc->enc_zlib_ok) { in rfb_recv_set_encodings_msg()
421 deflateInit(&rc->zstream, Z_BEST_SPEED); in rfb_recv_set_encodings_msg()
422 rc->enc_zlib_ok = true; in rfb_recv_set_encodings_msg()
426 rc->enc_resize_ok = true; in rfb_recv_set_encodings_msg()
429 rc->enc_extkeyevent_ok = true; in rfb_recv_set_encodings_msg()
444 while (q--) { in fast_crc32()
457 rfb_send_update_header(struct rfb_softc *rc __unused, int cfd, int numrects) in rfb_send_update_header()
470 rfb_adjust_pixels(struct rfb_softc *rc, uint32_t *gcptr, int width) in rfb_adjust_pixels() argument
477 if (!rc->pixfmt.adjust_pixels) { in rfb_adjust_pixels()
481 for (i = 0, pixelp = rc->pixrow; i < width; i++, pixelp++, gcptr++) { in rfb_adjust_pixels()
485 *pixelp = (red << rc->pixfmt.red_shift) | in rfb_adjust_pixels()
486 (green << rc->pixfmt.green_shift) | in rfb_adjust_pixels()
487 (blue << rc->pixfmt.blue_shift); in rfb_adjust_pixels()
490 return (rc->pixrow); in rfb_adjust_pixels()
494 rfb_send_rect(struct rfb_softc *rc, int cfd, struct bhyvegc_image *gc, in rfb_send_rect() argument
495 int x, int y, int w, int h) in rfb_send_rect() argument
505 * Send a single rectangle of the given x, y, w h dimensions. in rfb_send_rect()
510 srect_hdr.y = htons(y); in rfb_send_rect()
515 h = y + h; in rfb_send_rect()
517 if (rc->enc_zlib_ok) { in rfb_send_rect()
518 zbufp = rc->zbuf; in rfb_send_rect()
519 rc->zstream.total_in = 0; in rfb_send_rect()
520 rc->zstream.total_out = 0; in rfb_send_rect()
521 for (p = &gc->data[y * gc->width + x]; y < h; y++) { in rfb_send_rect()
522 pixelp = rfb_adjust_pixels(rc, p, width); in rfb_send_rect()
523 rc->zstream.next_in = (Bytef *)pixelp; in rfb_send_rect()
524 rc->zstream.avail_in = w; in rfb_send_rect()
525 rc->zstream.next_out = (Bytef *)zbufp; in rfb_send_rect()
526 rc->zstream.avail_out = RFB_ZLIB_BUFSZ + 16 - in rfb_send_rect()
527 rc->zstream.total_out; in rfb_send_rect()
528 rc->zstream.data_type = Z_BINARY; in rfb_send_rect()
531 err = deflate(&rc->zstream, Z_SYNC_FLUSH); in rfb_send_rect()
534 rc->enc_zlib_ok = false; in rfb_send_rect()
535 deflateEnd(&rc->zstream); in rfb_send_rect()
538 zbufp = rc->zbuf + rc->zstream.total_out; in rfb_send_rect()
539 p += gc->width; in rfb_send_rect()
547 zlen = htonl(rc->zstream.total_out); in rfb_send_rect()
551 return (stream_write(cfd, rc->zbuf, rc->zstream.total_out)); in rfb_send_rect()
557 zbufp = rc->zbuf; in rfb_send_rect()
558 for (p = &gc->data[y * gc->width + x]; y < h; y++) { in rfb_send_rect()
559 pixelp = rfb_adjust_pixels(rc, p, width); in rfb_send_rect()
563 p += gc->width; in rfb_send_rect()
572 total = stream_write(cfd, rc->zbuf, total); in rfb_send_rect()
578 rfb_send_all(struct rfb_softc *rc, int cfd, struct bhyvegc_image *gc) in rfb_send_all() argument
599 if (rc->pixfmt.adjust_pixels) { in rfb_send_all()
600 return (rfb_send_rect(rc, cfd, gc, 0, 0, in rfb_send_all()
601 gc->width, gc->height)); in rfb_send_all()
606 srect_hdr.y = 0; in rfb_send_all()
607 srect_hdr.width = htons(gc->width); in rfb_send_all()
608 srect_hdr.height = htons(gc->height); in rfb_send_all()
609 if (rc->enc_zlib_ok) { in rfb_send_all()
610 rc->zstream.next_in = (Bytef *)gc->data; in rfb_send_all()
611 rc->zstream.avail_in = gc->width * gc->height * in rfb_send_all()
613 rc->zstream.next_out = (Bytef *)rc->zbuf; in rfb_send_all()
614 rc->zstream.avail_out = RFB_ZLIB_BUFSZ + 16; in rfb_send_all()
615 rc->zstream.data_type = Z_BINARY; in rfb_send_all()
617 rc->zstream.total_in = 0; in rfb_send_all()
618 rc->zstream.total_out = 0; in rfb_send_all()
621 err = deflate(&rc->zstream, Z_SYNC_FLUSH); in rfb_send_all()
624 rc->enc_zlib_ok = false; in rfb_send_all()
625 deflateEnd(&rc->zstream); in rfb_send_all()
635 zlen = htonl(rc->zstream.total_out); in rfb_send_all()
639 return (stream_write(cfd, rc->zbuf, rc->zstream.total_out)); in rfb_send_all()
649 nwrite = stream_write(cfd, gc->data, in rfb_send_all()
650 gc->width * gc->height * sizeof(uint32_t)); in rfb_send_all()
660 rfb_set_pixel_adjustment(struct rfb_softc *rc) in rfb_set_pixel_adjustment() argument
662 pthread_mutex_lock(&rc->pixfmt_mtx); in rfb_set_pixel_adjustment()
663 rc->pixfmt = rc->new_pixfmt; in rfb_set_pixel_adjustment()
664 pthread_mutex_unlock(&rc->pixfmt_mtx); in rfb_set_pixel_adjustment()
668 rfb_send_screen(struct rfb_softc *rc, int cfd) in rfb_send_screen() argument
672 int x, y; in rfb_send_screen() local
685 if (atomic_compare_exchange_strong(&rc->sending, &expected, true) == false) in rfb_send_screen()
691 if (atomic_exchange(&rc->pending, false) == false) in rfb_send_screen()
694 if (atomic_exchange(&rc->update_pixfmt, false) == true) { in rfb_send_screen()
695 rfb_set_pixel_adjustment(rc); in rfb_send_screen()
702 if (rc->crc_width != gc_image->width || in rfb_send_screen()
703 rc->crc_height != gc_image->height) { in rfb_send_screen()
704 memset(rc->crc, 0, sizeof(uint32_t) * in rfb_send_screen()
707 rc->crc_width = gc_image->width; in rfb_send_screen()
708 rc->crc_height = gc_image->height; in rfb_send_screen()
712 if (rc->width != gc_image->width || in rfb_send_screen()
713 rc->height != gc_image->height) { in rfb_send_screen()
714 rc->width = gc_image->width; in rfb_send_screen()
715 rc->height = gc_image->height; in rfb_send_screen()
716 if (rc->enc_resize_ok) { in rfb_send_screen()
717 rfb_send_resize_update_msg(rc, cfd); in rfb_send_screen()
718 rc->update_all = true; in rfb_send_screen()
723 if (atomic_exchange(&rc->update_all, false) == true) { in rfb_send_screen()
724 retval = rfb_send_all(rc, cfd, gc_image); in rfb_send_screen()
733 w = rc->crc_width; in rfb_send_screen()
734 h = rc->crc_height; in rfb_send_screen()
735 xcells = howmany(rc->crc_width, PIX_PER_CELL); in rfb_send_screen()
736 ycells = howmany(rc->crc_height, PIX_PER_CELL); in rfb_send_screen()
744 p = gc_image->data; in rfb_send_screen()
752 crc_p = rc->crc_tmp - xcells; in rfb_send_screen()
753 orig_crc = rc->crc - xcells; in rfb_send_screen()
755 memset(rc->crc_tmp, 0, sizeof(uint32_t) * xcells * ycells); in rfb_send_screen()
756 for (y = 0; y < h; y++) { in rfb_send_screen()
757 if ((y & PIXCELL_MASK) == 0) { in rfb_send_screen()
763 if (x == (xcells - 1) && rem_x > 0) in rfb_send_screen()
768 if (rc->hw_crc) in rfb_send_screen()
780 if ((y & PIXCELL_MASK) == PIXCELL_MASK || y == (h-1)) { in rfb_send_screen()
798 rc->pending = true; in rfb_send_screen()
804 retval = rfb_send_all(rc, cfd, gc_image); in rfb_send_screen()
808 rfb_send_update_header(rc, cfd, changes); in rfb_send_screen()
811 crc_p = rc->crc_tmp; in rfb_send_screen()
812 for (y = 0; y < h; y += PIX_PER_CELL) { in rfb_send_screen()
814 celly = (y >> PIXCELL_SHIFT); in rfb_send_screen()
821 if (x == (xcells - 1) && rem_x > 0) in rfb_send_screen()
825 nwrite = rfb_send_rect(rc, cfd, in rfb_send_screen()
830 y + PIX_PER_CELL >= h ? rem_y : PIX_PER_CELL); in rfb_send_screen()
839 rc->sending = false; in rfb_send_screen()
846 rfb_recv_update_msg(struct rfb_softc *rc, int cfd) in rfb_recv_update_msg() argument
850 (void)stream_read(cfd, (uint8_t *)&updt_msg + 1 , sizeof(updt_msg) - 1); in rfb_recv_update_msg()
852 if (rc->enc_extkeyevent_ok && (!rc->enc_extkeyevent_send)) { in rfb_recv_update_msg()
853 rfb_send_extended_keyevent_update_msg(rc, cfd); in rfb_recv_update_msg()
854 rc->enc_extkeyevent_send = true; in rfb_recv_update_msg()
857 rc->pending = true; in rfb_recv_update_msg()
859 rc->update_all = true; in rfb_recv_update_msg()
863 rfb_recv_key_msg(struct rfb_softc *rc, int cfd) in rfb_recv_key_msg() argument
867 (void)stream_read(cfd, (uint8_t *)&key_msg + 1, sizeof(key_msg) - 1); in rfb_recv_key_msg()
870 rc->input_detected = true; in rfb_recv_key_msg()
874 rfb_recv_client_msg(struct rfb_softc *rc, int cfd) in rfb_recv_client_msg() argument
880 sizeof(client_msg) - 1); in rfb_recv_client_msg()
884 sizeof(extkey_msg) - 2); in rfb_recv_client_msg()
886 rc->input_detected = true; in rfb_recv_client_msg()
891 rfb_recv_ptr_msg(struct rfb_softc *rc, int cfd) in rfb_recv_ptr_msg() argument
895 (void)stream_read(cfd, (uint8_t *)&ptr_msg + 1, sizeof(ptr_msg) - 1); in rfb_recv_ptr_msg()
897 console_ptr_event(ptr_msg.button, htons(ptr_msg.x), htons(ptr_msg.y)); in rfb_recv_ptr_msg()
898 rc->input_detected = true; in rfb_recv_ptr_msg()
902 rfb_recv_cuttext_msg(struct rfb_softc *rc __unused, int cfd) in rfb_recv_cuttext_msg()
908 len = stream_read(cfd, (uint8_t *)&ct_msg + 1, sizeof(ct_msg) - 1); in rfb_recv_cuttext_msg()
913 ct_msg.length -= len; in rfb_recv_cuttext_msg()
921 n1 = now->tv_sec * 1000000 + now->tv_usec; in timeval_delta()
922 n2 = prev->tv_sec * 1000000 + prev->tv_usec; in timeval_delta()
923 return (n1 - n2); in timeval_delta()
929 struct rfb_softc *rc; in rfb_wr_thr() local
937 rc = arg; in rfb_wr_thr()
938 cfd = rc->cfd; in rfb_wr_thr()
942 while (rc->cfd >= 0) { in rfb_wr_thr()
959 input = atomic_exchange(&rc->input_detected, false); in rfb_wr_thr()
964 if ((++rc->wrcount & 1) || input) { in rfb_wr_thr()
965 if (rfb_send_screen(rc, cfd) <= 0) { in rfb_wr_thr()
971 usleep(SCREEN_POLL_DELAY - tdiff); in rfb_wr_thr()
979 rfb_handle(struct rfb_softc *rc, int cfd) in rfb_handle() argument
1000 rc->cfd = cfd; in rfb_handle()
1008 strncmp(vbuf, buf, VERSION_LENGTH - 2) != 0) { in rfb_handle()
1012 client_ver = buf[VERSION_LENGTH - 2]; in rfb_handle()
1021 /* In versions 3.7 & 3.8, it's 2-way handshake */ in rfb_handle()
1024 if (rc->password) { in rfb_handle()
1066 * The client then sends the resulting 16-bytes response. in rfb_handle()
1069 strncpy(keystr, rc->password, PASSWD_LENGTH); in rfb_handle()
1084 /* Initialize a 16-byte random challenge */ in rfb_handle()
1088 /* Receive the 16-byte challenge response */ in rfb_handle()
1146 /* 3a. Read client shared-flag byte */ in rfb_handle()
1149 /* 4a. Write server-init info */ in rfb_handle()
1150 rfb_send_server_init_msg(rc, cfd); in rfb_handle()
1152 if (!rc->zbuf) { in rfb_handle()
1153 rc->zbuf = malloc(RFB_ZLIB_BUFSZ + 16); in rfb_handle()
1154 assert(rc->zbuf != NULL); in rfb_handle()
1157 perror = pthread_create(&tid, NULL, rfb_wr_thr, rc); in rfb_handle()
1171 rfb_recv_set_pixfmt_msg(rc, cfd); in rfb_handle()
1174 rfb_recv_set_encodings_msg(rc, cfd); in rfb_handle()
1177 rfb_recv_update_msg(rc, cfd); in rfb_handle()
1180 rfb_recv_key_msg(rc, cfd); in rfb_handle()
1183 rfb_recv_ptr_msg(rc, cfd); in rfb_handle()
1186 rfb_recv_cuttext_msg(rc, cfd); in rfb_handle()
1189 rfb_recv_client_msg(rc, cfd); in rfb_handle()
1192 WPRINTF(("rfb unknown cli-code %d!", buf[0] & 0xff)); in rfb_handle()
1197 rc->cfd = -1; in rfb_handle()
1200 if (rc->enc_zlib_ok) in rfb_handle()
1201 deflateEnd(&rc->zstream); in rfb_handle()
1207 struct rfb_softc *rc; in rfb_thr() local
1212 rc = arg; in rfb_thr()
1222 rc->enc_raw_ok = false; in rfb_thr()
1223 rc->enc_zlib_ok = false; in rfb_thr()
1224 rc->enc_resize_ok = false; in rfb_thr()
1225 rc->enc_extkeyevent_ok = false; in rfb_thr()
1227 rc->enc_extkeyevent_send = false; in rfb_thr()
1229 cfd = accept(rc->sfd, NULL, NULL); in rfb_thr()
1230 if (rc->conn_wait) { in rfb_thr()
1231 pthread_mutex_lock(&rc->mtx); in rfb_thr()
1232 pthread_cond_signal(&rc->cond); in rfb_thr()
1233 pthread_mutex_unlock(&rc->mtx); in rfb_thr()
1234 rc->conn_wait = 0; in rfb_thr()
1236 rfb_handle(rc, cfd); in rfb_thr()
1261 struct rfb_softc *rc; in rfb_init() local
1270 rc = calloc(1, sizeof(struct rfb_softc)); in rfb_init()
1274 rc->crc = calloc(cnt, sizeof(uint32_t)); in rfb_init()
1275 rc->crc_tmp = calloc(cnt, sizeof(uint32_t)); in rfb_init()
1276 rc->crc_width = RFB_MAX_WIDTH; in rfb_init()
1277 rc->crc_height = RFB_MAX_HEIGHT; in rfb_init()
1278 rc->sfd = -1; in rfb_init()
1280 rc->password = password; in rfb_init()
1282 rc->fbnamelen = asprintf(&rc->fbname, "bhyve:%s", in rfb_init()
1284 if (rc->fbnamelen < 0) { in rfb_init()
1289 rc->pixrow = malloc(RFB_MAX_WIDTH * sizeof(uint32_t)); in rfb_init()
1290 if (rc->pixrow == NULL) { in rfb_init()
1314 rc->sfd = socket(ai->ai_family, ai->ai_socktype, 0); in rfb_init()
1315 if (rc->sfd < 0) { in rfb_init()
1320 setsockopt(rc->sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); in rfb_init()
1322 if (bind(rc->sfd, ai->ai_addr, ai->ai_addrlen) < 0) { in rfb_init()
1327 if (listen(rc->sfd, 1) < 0) { in rfb_init()
1334 if (caph_rights_limit(rc->sfd, &rights) == -1) in rfb_init()
1338 rc->hw_crc = sse42_supported(); in rfb_init()
1340 rc->conn_wait = wait; in rfb_init()
1342 pthread_mutex_init(&rc->mtx, NULL); in rfb_init()
1343 pthread_cond_init(&rc->cond, NULL); in rfb_init()
1346 pthread_mutex_init(&rc->pixfmt_mtx, NULL); in rfb_init()
1347 pthread_create(&rc->tid, NULL, rfb_thr, rc); in rfb_init()
1348 pthread_set_name_np(rc->tid, "rfb"); in rfb_init()
1352 pthread_mutex_lock(&rc->mtx); in rfb_init()
1353 pthread_cond_wait(&rc->cond, &rc->mtx); in rfb_init()
1354 pthread_mutex_unlock(&rc->mtx); in rfb_init()
1362 if (rc->pixfmt_mtx) in rfb_init()
1363 pthread_mutex_destroy(&rc->pixfmt_mtx); in rfb_init()
1366 if (rc->sfd != -1) in rfb_init()
1367 close(rc->sfd); in rfb_init()
1368 free(rc->crc); in rfb_init()
1369 free(rc->crc_tmp); in rfb_init()
1370 free(rc->pixrow); in rfb_init()
1371 free(rc->fbname); in rfb_init()
1372 free(rc); in rfb_init()
1373 return (-1); in rfb_init()