mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

The log_prefix frequently used in dcSCTP is intended to be used to separate logs from different sockets within the same log output, typically in unit tests. Every log entry always has the file and line, so it's not important to add more information to the log prefix that indicates _where_ it's logged. So those have been removed. Also, since log_prefix is a string (typically 32 bytes) and it's never changing during the lifetime of the socket, pass and store it as a absl::string_view to save memory. Bug: None Change-Id: I10466710ca6c2badfcd3adc5630426a90ca74204 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/274704 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/main@{#39571}
69 lines
2.5 KiB
C++
69 lines
2.5 KiB
C++
/*
|
|
* Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
#ifndef NET_DCSCTP_SOCKET_HEARTBEAT_HANDLER_H_
|
|
#define NET_DCSCTP_SOCKET_HEARTBEAT_HANDLER_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "absl/strings/string_view.h"
|
|
#include "net/dcsctp/packet/chunk/heartbeat_ack_chunk.h"
|
|
#include "net/dcsctp/packet/chunk/heartbeat_request_chunk.h"
|
|
#include "net/dcsctp/packet/sctp_packet.h"
|
|
#include "net/dcsctp/public/dcsctp_options.h"
|
|
#include "net/dcsctp/socket/context.h"
|
|
#include "net/dcsctp/timer/timer.h"
|
|
|
|
namespace dcsctp {
|
|
|
|
// HeartbeatHandler handles all logic around sending heartbeats and receiving
|
|
// the responses, as well as receiving incoming heartbeat requests.
|
|
//
|
|
// Heartbeats are sent on idle connections to ensure that the connection is
|
|
// still healthy and to measure the RTT. If a number of heartbeats time out,
|
|
// the connection will eventually be closed.
|
|
class HeartbeatHandler {
|
|
public:
|
|
HeartbeatHandler(absl::string_view log_prefix,
|
|
const DcSctpOptions& options,
|
|
Context* context,
|
|
TimerManager* timer_manager);
|
|
|
|
// Called when the heartbeat interval timer should be restarted. This is
|
|
// generally done every time data is sent, which makes the timer expire when
|
|
// the connection is idle.
|
|
void RestartTimer();
|
|
|
|
// Called on received HeartbeatRequestChunk chunks.
|
|
void HandleHeartbeatRequest(HeartbeatRequestChunk chunk);
|
|
|
|
// Called on received HeartbeatRequestChunk chunks.
|
|
void HandleHeartbeatAck(HeartbeatAckChunk chunk);
|
|
|
|
private:
|
|
absl::optional<DurationMs> OnIntervalTimerExpiry();
|
|
absl::optional<DurationMs> OnTimeoutTimerExpiry();
|
|
|
|
const absl::string_view log_prefix_;
|
|
Context* ctx_;
|
|
TimerManager* timer_manager_;
|
|
// The time for a connection to be idle before a heartbeat is sent.
|
|
const DurationMs interval_duration_;
|
|
// Adding RTT to the duration will add some jitter, which is good in
|
|
// production, but less good in unit tests, which is why it can be disabled.
|
|
const bool interval_duration_should_include_rtt_;
|
|
const std::unique_ptr<Timer> interval_timer_;
|
|
const std::unique_ptr<Timer> timeout_timer_;
|
|
};
|
|
} // namespace dcsctp
|
|
|
|
#endif // NET_DCSCTP_SOCKET_HEARTBEAT_HANDLER_H_
|