| 1197 | } |
| 1198 | |
| 1199 | Status CreateModule(ServerContext*, const CreateModuleRequest* request, |
| 1200 | CreateModuleResponse* response) override { |
| 1201 | std::lock_guard<std::recursive_mutex> lock(mutex_); |
| 1202 | |
| 1203 | VLOG(1) << "CreateModuleRequest from client:" << std::endl |
| 1204 | << request->DebugString(); |
| 1205 | |
| 1206 | if (!request->mclass().length()) { |
| 1207 | return return_with_error(response, EINVAL, "Missing 'mclass' field"); |
| 1208 | } |
| 1209 | |
| 1210 | const auto& builders = ModuleBuilder::all_module_builders(); |
| 1211 | const auto& it = builders.find(request->mclass()); |
| 1212 | if (it == builders.end()) { |
| 1213 | return return_with_error(response, ENOENT, "No mclass '%s' found", |
| 1214 | request->mclass().c_str()); |
| 1215 | } |
| 1216 | const ModuleBuilder& builder = it->second; |
| 1217 | |
| 1218 | std::string mod_name; |
| 1219 | if (request->name().length()) { |
| 1220 | const auto& it2 = ModuleGraph::GetAllModules().find(request->name()); |
| 1221 | if (it2 != ModuleGraph::GetAllModules().end()) { |
| 1222 | return return_with_error(response, EEXIST, "Module %s exists", |
| 1223 | request->name().c_str()); |
| 1224 | } |
| 1225 | mod_name = request->name(); |
| 1226 | } else { |
| 1227 | mod_name = ModuleGraph::GenerateDefaultName(builder.class_name(), |
| 1228 | builder.name_template()); |
| 1229 | } |
| 1230 | |
| 1231 | // DPDK functions may be called, so be prepared |
| 1232 | current_worker.SetNonWorker(); |
| 1233 | |
| 1234 | pb_error_t* error = response->mutable_error(); |
| 1235 | Module* module = |
| 1236 | ModuleGraph::CreateModule(builder, mod_name, request->arg(), error); |
| 1237 | if (module) { |
| 1238 | response->set_name(module->name()); |
| 1239 | bess::event_modules[bess::Event::PreResume].insert(module); |
| 1240 | } |
| 1241 | |
| 1242 | return Status::OK; |
| 1243 | } |
| 1244 | |
| 1245 | Status DestroyModule(ServerContext*, const DestroyModuleRequest* request, |
| 1246 | EmptyResponse* response) override { |
nothing calls this directly
no test coverage detected