| 255 | } |
| 256 | |
| 257 | int FlowControlProtocol::sendReportReq() { |
| 258 | uint16_t port = this->_serverPort; |
| 259 | |
| 260 | if (this->_socket <= 0) |
| 261 | this->_socket = connectServer(_serverName.c_str(), port); |
| 262 | |
| 263 | if (this->_socket <= 0) |
| 264 | return -1; |
| 265 | |
| 266 | // Calculate the total payload msg size |
| 267 | uint32_t payloadSize = FlowControlMsgIDEncodingLen(FLOW_YML_NAME, gsl::narrow<int>(this->_controller->getName().size() + 1)); |
| 268 | const size_t size = sizeof(FlowControlProtocolHeader) + payloadSize; |
| 269 | |
| 270 | std::vector<uint8_t> buffer; |
| 271 | buffer.resize(size); |
| 272 | auto* data = buffer.data(); |
| 273 | |
| 274 | // encode the HDR |
| 275 | FlowControlProtocolHeader hdr; |
| 276 | hdr.msgType = REPORT_REQ; |
| 277 | hdr.payloadLen = payloadSize; |
| 278 | hdr.seqNumber = this->_seqNumber; |
| 279 | hdr.status = RESP_SUCCESS; |
| 280 | data = this->encode(data, hdr.msgType); |
| 281 | data = this->encode(data, hdr.seqNumber); |
| 282 | data = this->encode(data, hdr.status); |
| 283 | data = this->encode(data, hdr.payloadLen); |
| 284 | |
| 285 | // encode the YAML name |
| 286 | data = this->encode(data, FLOW_YML_NAME); |
| 287 | data = this->encode(data, this->_controller->getName()); |
| 288 | |
| 289 | // send it |
| 290 | int status = sendData(buffer.data(), gsl::narrow<int>(size)); |
| 291 | buffer.clear(); |
| 292 | if (status <= 0) { |
| 293 | utils::file::FileUtils::close(_socket); |
| 294 | _socket = 0; |
| 295 | logger_->log_error("Flow Control Protocol Send Report Req failed"); |
| 296 | return -1; |
| 297 | } |
| 298 | |
| 299 | // Looking for report respond |
| 300 | status = readHdr(&hdr); |
| 301 | |
| 302 | if (status <= 0) { |
| 303 | utils::file::FileUtils::close(_socket); |
| 304 | _socket = 0; |
| 305 | logger_->log_error("Flow Control Protocol Read Report Resp header failed"); |
| 306 | return -1; |
| 307 | } |
| 308 | logger_->log_debug("Flow Control Protocol receive MsgType %s", FlowControlMsgTypeToStr((FlowControlMsgType) hdr.msgType)); |
| 309 | logger_->log_debug("Flow Control Protocol receive Seq Num %" PRIu32, hdr.seqNumber); |
| 310 | logger_->log_debug("Flow Control Protocol receive Resp Code %s", FlowControlRespCodeToStr((FlowControlRespCode) hdr.status)); |
| 311 | logger_->log_debug("Flow Control Protocol receive Payload len %" PRIu32, hdr.payloadLen); |
| 312 | |
| 313 | if (hdr.status == RESP_SUCCESS && hdr.seqNumber == this->_seqNumber) { |
| 314 | this->_seqNumber++; |
no test coverage detected