Browse Source

Stats initial commit

Murat Dogan 5 years ago
parent
commit
94561ec7e5
4 changed files with 55 additions and 0 deletions
  1. 5 0
      include/rtc/peerconnection.hpp
  2. 21 0
      src/peerconnection.cpp
  3. 20 0
      src/sctptransport.cpp
  4. 9 0
      src/sctptransport.hpp

+ 5 - 0
include/rtc/peerconnection.hpp

@@ -91,6 +91,11 @@ public:
 	bool getSelectedCandidatePair(CandidateInfo *local, CandidateInfo *remote);
 #endif
 
+	// Stats
+	const unsigned int bytesSent();
+	const unsigned int bytesReceived();
+	const unsigned int rttInMs();
+
 private:
 	init_token mInitToken = Init::Token();
 

+ 21 - 0
src/peerconnection.cpp

@@ -576,6 +576,27 @@ bool PeerConnection::getSelectedCandidatePair(CandidateInfo *local, CandidateInf
 }
 #endif
 
+const unsigned int PeerConnection::bytesSent() {
+	auto sctpTransport = std::atomic_load(&mSctpTransport);
+	if (sctpTransport)
+		return sctpTransport->bytesSent();
+	return 0;
+}
+
+const unsigned int PeerConnection::bytesReceived() {
+	auto sctpTransport = std::atomic_load(&mSctpTransport);
+	if (sctpTransport)
+		return sctpTransport->bytesReceived();
+	return 0;
+}
+
+const unsigned int PeerConnection::rttInMs() {
+	auto sctpTransport = std::atomic_load(&mSctpTransport);
+	if (sctpTransport)
+		return sctpTransport->rttInMs();
+	return 0;
+}
+
 } // namespace rtc
 
 std::ostream &operator<<(std::ostream &out, const rtc::PeerConnection::State &state) {

+ 20 - 0
src/sctptransport.cpp

@@ -445,6 +445,7 @@ int SctpTransport::handleWrite(byte *data, size_t len, uint8_t tos, uint8_t set_
 		mWritten = true;
 		mWrittenOnce = true;
 		mWrittenCondition.notify_all();
+		mBytesSent += len;
 
 	} catch (const std::exception &e) {
 		PLOG_ERROR << "SCTP write: " << e.what();
@@ -471,6 +472,7 @@ void SctpTransport::processData(const byte *data, size_t len, uint16_t sid, Payl
 	case PPID_STRING:
 		if (mPartialStringData.empty()) {
 			recv(make_message(data, data + len, Message::String, sid));
+			mBytesReceived += len;
 		} else {
 			mPartialStringData.insert(mPartialStringData.end(), data, data + len);
 			recv(make_message(mPartialStringData.begin(), mPartialStringData.end(), Message::String,
@@ -493,6 +495,7 @@ void SctpTransport::processData(const byte *data, size_t len, uint16_t sid, Payl
 	case PPID_BINARY:
 		if (mPartialBinaryData.empty()) {
 			recv(make_message(data, data + len, Message::Binary, sid));
+			mBytesReceived += len;
 		} else {
 			mPartialBinaryData.insert(mPartialBinaryData.end(), data, data + len);
 			recv(make_message(mPartialBinaryData.begin(), mPartialBinaryData.end(), Message::Binary,
@@ -578,6 +581,23 @@ void SctpTransport::processNotification(const union sctp_notification *notify, s
 	}
 }
 
+void SctpTransport::clearStats() {
+	mBytesReceived = 0;
+	mBytesSent = 0;
+}
+
+const unsigned int SctpTransport::bytesSent() { return mBytesSent; }
+
+const unsigned int SctpTransport::bytesReceived() { return mBytesReceived; }
+
+const unsigned int SctpTransport::rttInMs() {
+	sctp_paddrinfo info= {0};
+	socklen_t optlen = sizeof(info);
+	if (usrsctp_getsockopt(mSock, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, &info, &optlen))
+		return 0;
+	return info.spinfo_srtt;
+}
+
 int SctpTransport::RecvCallback(struct socket *sock, union sctp_sockstore addr, void *data,
                                 size_t len, struct sctp_rcvinfo recv_info, int flags, void *ptr) {
 	int ret = static_cast<SctpTransport *>(ptr)->handleRecv(

+ 9 - 0
src/sctptransport.hpp

@@ -54,6 +54,12 @@ public:
 	void flush();
 	void reset(unsigned int stream);
 
+	// Stats
+	void clearStats();
+	const unsigned int bytesSent();
+	const unsigned int bytesReceived();
+	const unsigned int rttInMs();
+
 private:
 	// Order seems wrong but these are the actual values
 	// See https://tools.ietf.org/html/draft-ietf-rtcweb-data-channel-13#section-8
@@ -101,6 +107,9 @@ private:
 	state_callback mStateChangeCallback;
 	std::atomic<State> mState;
 
+	// Stats
+	unsigned int mBytesSent = 0, mBytesReceived = 0;
+
 	binary mPartialRecv, mPartialStringData, mPartialBinaryData;
 
 	static int RecvCallback(struct socket *sock, union sctp_sockstore addr, void *data, size_t len,