+
+static void
+sts_server_echo (sock_server_conn_t * conn, int rx_bytes)
+{
+ int tx_bytes, nbytes, pos;
+
+ /* If it looks vaguely like a string make sure it's terminated */
+ pos = rx_bytes < conn->buf_size ? rx_bytes : conn->buf_size - 1;
+ ((char *) conn->buf)[pos] = 0;
+
+ if (conn->cfg.verbose)
+ stinf ("(fd %d): Echoing back\n", conn->fd);
+
+ nbytes = strlen ((const char *) conn->buf) + 1;
+
+ tx_bytes = sock_test_write (conn->fd, conn->buf, nbytes, &conn->stats,
+ conn->cfg.verbose);
+ if (tx_bytes >= 0)
+ stinf ("(fd %d): TX (%d bytes) - '%s'\n", conn->fd, tx_bytes, conn->buf);
+}
+
+static int
+sts_handle_cfg (vcl_test_cfg_t * rx_cfg, sock_server_conn_t * conn,
+ int rx_bytes)
+{
+ sock_server_main_t *ssm = &sock_server_main;
+
+ if (rx_cfg->verbose)
+ {
+ stinf ("(fd %d): Received a cfg message!\n", conn->fd);
+ vcl_test_cfg_dump (rx_cfg, 0 /* is_client */ );
+ }
+
+ if (rx_bytes != sizeof (*rx_cfg))
+ {
+ stinf ("(fd %d): Invalid cfg message size (%d) expected %lu!", conn->fd,
+ rx_bytes, sizeof (*rx_cfg));
+ conn->cfg.rxbuf_size = 0;
+ conn->cfg.num_writes = 0;
+ if (conn->cfg.verbose)
+ {
+ stinf ("(fd %d): Replying to cfg message!\n", conn->fd);
+ vcl_test_cfg_dump (rx_cfg, 0 /* is_client */ );
+ }
+ sock_test_write (conn->fd, (uint8_t *) & conn->cfg, sizeof (conn->cfg),
+ NULL, conn->cfg.verbose);
+ return -1;
+ }
+
+ switch (rx_cfg->test)
+ {
+ case VCL_TEST_TYPE_NONE:
+ sync_config_and_reply (conn, rx_cfg);
+ break;
+
+ case VCL_TEST_TYPE_ECHO:
+ if (socket_server_echo_af_unix_init (ssm))
+ goto done;
+
+ sync_config_and_reply (conn, rx_cfg);
+ break;
+
+ case VCL_TEST_TYPE_BI:
+ case VCL_TEST_TYPE_UNI:
+ stream_test_server_start_stop (conn, rx_cfg);
+ break;
+
+ case VCL_TEST_TYPE_EXIT:
+ stinf ("Have a great day connection %d!", conn->fd);
+ close (conn->fd);
+ conn_pool_free (conn);
+ stinf ("Closed client fd %d", conn->fd);
+ ssm->nfds--;
+ break;
+
+ default:
+ stinf ("ERROR: Unknown test type!\n");
+ vcl_test_cfg_dump (rx_cfg, 0 /* is_client */ );
+ break;
+ }
+
+done:
+ return 0;
+}
+
+static int
+sts_conn_expect_config (sock_server_conn_t * conn)
+{
+ if (conn->cfg.test == VCL_TEST_TYPE_ECHO)
+ return 1;
+
+ return (conn->stats.rx_bytes < 128
+ || conn->stats.rx_bytes > conn->cfg.total_bytes);
+}
+