Revert "Revert "Open loop sync/async multithreaded testing""
diff --git a/test/cpp/qps/qps_driver.cc b/test/cpp/qps/qps_driver.cc
index 4ae7207..eceb510 100644
--- a/test/cpp/qps/qps_driver.cc
+++ b/test/cpp/qps/qps_driver.cc
@@ -63,11 +63,15 @@
 DEFINE_int32(payload_size, 1, "Payload size");
 DEFINE_string(client_type, "SYNCHRONOUS_CLIENT", "Client type");
 DEFINE_int32(async_client_threads, 1, "Async client threads");
+DEFINE_string(load_type, "CLOSED_LOOP", "Load type");
+DEFINE_double(load_param_1, 0.0, "Load parameter 1");
+DEFINE_double(load_param_2, 0.0, "Load parameter 2");
 
 using grpc::testing::ClientConfig;
 using grpc::testing::ServerConfig;
 using grpc::testing::ClientType;
 using grpc::testing::ServerType;
+using grpc::testing::LoadType;
 using grpc::testing::RpcType;
 using grpc::testing::ResourceUsage;
 
@@ -80,11 +84,14 @@
 
   ClientType client_type;
   ServerType server_type;
+  LoadType load_type;
   GPR_ASSERT(ClientType_Parse(FLAGS_client_type, &client_type));
   GPR_ASSERT(ServerType_Parse(FLAGS_server_type, &server_type));
+  GPR_ASSERT(LoadType_Parse(FLAGS_load_type, &load_type));
 
   ClientConfig client_config;
   client_config.set_client_type(client_type);
+  client_config.set_load_type(load_type);
   client_config.set_enable_ssl(FLAGS_enable_ssl);
   client_config.set_outstanding_rpcs_per_channel(
       FLAGS_outstanding_rpcs_per_channel);
@@ -93,6 +100,40 @@
   client_config.set_async_client_threads(FLAGS_async_client_threads);
   client_config.set_rpc_type(rpc_type);
 
+  // set up the load parameters
+  switch (load_type) {
+    case grpc::testing::CLOSED_LOOP:
+      break;
+    case grpc::testing::POISSON: {
+      auto poisson = client_config.mutable_load_params()->mutable_poisson();
+      GPR_ASSERT(FLAGS_load_param_1 != 0.0);
+      poisson->set_offered_load(FLAGS_load_param_1);
+      break;
+    }
+    case grpc::testing::UNIFORM: {
+      auto uniform = client_config.mutable_load_params()->mutable_uniform();
+      GPR_ASSERT(FLAGS_load_param_1 != 0.0);
+      GPR_ASSERT(FLAGS_load_param_2 != 0.0);
+      uniform->set_interarrival_lo(FLAGS_load_param_1 / 1e6);
+      uniform->set_interarrival_hi(FLAGS_load_param_2 / 1e6);
+      break;
+    }
+    case grpc::testing::DETERMINISTIC: {
+      auto determ = client_config.mutable_load_params()->mutable_determ();
+      GPR_ASSERT(FLAGS_load_param_1 != 0.0);
+      determ->set_offered_load(FLAGS_load_param_1);
+      break;
+    }
+    case grpc::testing::PARETO: {
+      auto pareto = client_config.mutable_load_params()->mutable_pareto();
+      GPR_ASSERT(FLAGS_load_param_1 != 0.0);
+      GPR_ASSERT(FLAGS_load_param_2 != 0.0);
+      pareto->set_interarrival_base(FLAGS_load_param_1 / 1e6);
+      pareto->set_alpha(FLAGS_load_param_2);
+      break;
+    }
+  }
+
   ServerConfig server_config;
   server_config.set_server_type(server_type);
   server_config.set_threads(FLAGS_server_threads);