Commit 21274517 authored by Jelte Jansen's avatar Jelte Jansen
Browse files

[357] update doxygen and comments

parent 2cefc695
......@@ -117,6 +117,7 @@ private:
AddrListPtr rollbackAddresses_;
};
/// \brief Configuration for TCP receive timeouts
class TCPRecvTimeoutConfig : public AuthConfigParser {
public:
TCPRecvTimeoutConfig(AuthSrv& server) : server_(server)
......
......@@ -320,6 +320,13 @@ public:
std::vector<isc::dns::RRClass> getClientListClasses() const;
/// \brief Sets the timeout for incoming TCP connections
///
/// Incoming TCP connections that have not sent their data
/// withing this time are dropped.
///
/// \param timeout The timeout (in milliseconds). If se to
/// zero, no timeouts are used, and the connection will remain
/// open forever.
void setTCPRecvTimeout(size_t timeout);
private:
......
......@@ -143,6 +143,7 @@ TEST_F(AuthConfigTest, listenAddressConfig) {
EXPECT_EQ(DNSService::SERVER_SYNC_OK, dnss_.getUDPFdParams().at(1).options);
}
// Try setting tcp receive timeout through config
TEST_F(AuthConfigTest, tcpRecvTimeoutConfig) {
configureAuthServer(server, Element::fromJSON(
"{ \"tcp_recv_timeout\": 123 }"));
......
......@@ -99,6 +99,16 @@ public:
virtual DNSServer* clone() { return (self_->clone()); }
//@}
/// \brief Set timeout for incoming TCP connections
///
/// Since this value is not relevant for every type of DNSServer
/// (like UDPServer), it has a no-op default implementation.
/// It is in the base class because the AuthSrv's DNSService has
/// no direct access to the derived API's after initialization,
/// and it does need to update running servers if the timeout
/// setting is changed.
///
/// \param timeout The timeout in milliseconds
virtual void setTCPRecvTimeout(size_t) {}
protected:
......
......@@ -40,7 +40,7 @@ public:
DNSServiceImpl(IOService& io_service, SimpleCallback* checkin,
DNSLookup* lookup, DNSAnswer* answer) :
io_service_(io_service), checkin_(checkin), lookup_(lookup),
answer_(answer)
answer_(answer), tcp_recv_timeout_(1000)
{}
IOService& io_service_;
......
......@@ -84,7 +84,19 @@ public:
ServerFlag options = SERVER_DEFAULT) = 0;
virtual void clearServers() = 0;
/// Sets the timeout TODO
/// \brief Set the timeout for TCP DNS services
///
/// The timeout is used for incoming TCP connections, so
/// that the connection is dropped if not all query data
/// is read.
///
/// For existing DNSServer objects, where the timeout is
/// relevant (i.e. TCPServer instances), the timeout value
/// is updated.
/// The given value is also kept to use for DNSServer instances
/// which are created later
///
/// \param timeout The timeout in milliseconds
virtual void setTCPRecvTimeout(size_t timeout) = 0;
virtual asiolink::IOService& getIOService() = 0;
......
......@@ -47,8 +47,6 @@ namespace asiodns {
/// The following functions implement the \c TCPServer class.
///
/// The constructor
// timeout is initialized to be sure, but it should be updated
// quite immediately anyway
TCPServer::TCPServer(io_service& io_service, int fd, int af,
const SimpleCallback* checkin,
const DNSLookup* lookup,
......@@ -73,7 +71,7 @@ TCPServer::TCPServer(io_service& io_service, int fd, int af,
isc_throw(IOError, exception.what());
}
// Set it to some value. It should be set to the right one
// immediately, but set something non-zero just in case.
// immediately, but set it to something non-zero just in case.
tcp_recv_timeout_.reset(new size_t(1000));
}
......@@ -133,11 +131,14 @@ TCPServer::operator()(asio::error_code ec, size_t length) {
/// asynchronous read call.
data_.reset(new char[MAX_LENGTH]);
timeout_.reset(new asio::deadline_timer(io_));
timeout_->expires_from_now(
boost::posix_time::milliseconds(*tcp_recv_timeout_));
timeout_->async_wait(boost::bind(&do_timeout, boost::ref(*socket_),
asio::placeholders::error));
/// Start a timer to drop the connection if it is idle
if (*tcp_recv_timeout_ > 0) {
timeout_.reset(new asio::deadline_timer(io_));
timeout_->expires_from_now(
boost::posix_time::milliseconds(*tcp_recv_timeout_));
timeout_->async_wait(boost::bind(&do_timeout, boost::ref(*socket_),
asio::placeholders::error));
}
/// Read the message, in two parts. First, the message length:
CORO_YIELD async_read(*socket_, asio::buffer(data_.get(),
......
......@@ -281,10 +281,16 @@ class TCPClient : public SimpleClient {
std::string(received_data_ + 2));
}
/// Set the delay before the data len is sent (in seconds)
/// If this is non-zero, the actual data is never sent
/// (it is used to test timeout, in which case the connection
/// should have been closed by the other side anyway)
void setSendDataLenDelay(size_t send_data_len_delay) {
send_data_len_delay_ = send_data_len_delay;
}
/// Set the delay before the packet data itself is sent
/// (in seconds)
void setSendDataDelay(size_t send_data_delay) {
send_data_delay_ = send_data_delay;
}
......@@ -328,8 +334,6 @@ class TCPClient : public SimpleClient {
std::string data_to_send_;
uint16_t data_to_send_len_;
// if 0, send body immediately
// if >0, send after the delay (in seconds)
size_t send_data_delay_;
size_t send_data_len_delay_;
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment