复用rtp/rtcp判断逻辑过滤非rtp包: #2247

This commit is contained in:
xiongziliang 2023-02-28 22:23:30 +08:00
parent dc8508c58f
commit c2e1083493
5 changed files with 31 additions and 21 deletions

View File

@ -70,14 +70,9 @@ RtpProcess::~RtpProcess() {
} }
} }
static bool is_rtp(const char *buf) {
RtpHeader *header = (RtpHeader *)buf;
return ((header->pt < 64) || (header->pt >= 96));
}
bool RtpProcess::inputRtp(bool is_udp, const Socket::Ptr &sock, const char *data, size_t len, const struct sockaddr *addr, uint64_t *dts_out) { bool RtpProcess::inputRtp(bool is_udp, const Socket::Ptr &sock, const char *data, size_t len, const struct sockaddr *addr, uint64_t *dts_out) {
if (!is_rtp(data)) { if (!isRtp(data, len)) {
WarnL << "Not rtp packet"; WarnP(this) << "Not rtp packet";
return false; return false;
} }
if (_sock != sock) { if (_sock != sock) {

View File

@ -12,6 +12,7 @@
#include "RtpSession.h" #include "RtpSession.h"
#include "RtpSelector.h" #include "RtpSelector.h"
#include "Network/TcpServer.h" #include "Network/TcpServer.h"
#include "Rtsp/Rtsp.h"
#include "Rtsp/RtpReceiver.h" #include "Rtsp/RtpReceiver.h"
#include "Common/config.h" #include "Common/config.h"
@ -93,6 +94,10 @@ void RtpSession::onRtpPacket(const char *data, size_t len) {
} }
} }
if (!_process) { if (!_process) {
if (!isRtp(data, len)) {
WarnP(this) << "Not rtp packet";
return;
}
//未设置ssrc时尝试获取ssrc //未设置ssrc时尝试获取ssrc
if (!_ssrc && !RtpSelector::getSSRC(data, len, _ssrc)) { if (!_ssrc && !RtpSelector::getSSRC(data, len, _ssrc)) {
return; return;

View File

@ -442,6 +442,22 @@ string printSSRC(uint32_t ui32Ssrc) {
return tmp; return tmp;
} }
bool isRtp(const char *buf, size_t size) {
if (size < 2) {
return false;
}
RtpHeader *header = (RtpHeader *)buf;
return ((header->pt < 64) || (header->pt >= 96));
}
bool isRtcp(const char *buf, size_t size) {
if (size < 2) {
return false;
}
RtpHeader *header = (RtpHeader *)buf;
return ((header->pt >= 64) && (header->pt < 96));
}
Buffer::Ptr makeRtpOverTcpPrefix(uint16_t size, uint8_t interleaved) { Buffer::Ptr makeRtpOverTcpPrefix(uint16_t size, uint8_t interleaved) {
auto rtp_tcp = BufferRaw::create(); auto rtp_tcp = BufferRaw::create();
rtp_tcp->setCapacity(RtpPacket::kRtpTcpHeaderSize); rtp_tcp->setCapacity(RtpPacket::kRtpTcpHeaderSize);

View File

@ -337,5 +337,8 @@ void makeSockPair(std::pair<toolkit::Socket::Ptr, toolkit::Socket::Ptr> &pair, c
//十六进制方式打印ssrc //十六进制方式打印ssrc
std::string printSSRC(uint32_t ui32Ssrc); std::string printSSRC(uint32_t ui32Ssrc);
bool isRtp(const char *buf, size_t size);
bool isRtcp(const char *buf, size_t size);
} //namespace mediakit } //namespace mediakit
#endif //RTSP_RTSP_H_ #endif //RTSP_RTSP_H_

View File

@ -15,6 +15,7 @@
#include "Rtcp/Rtcp.h" #include "Rtcp/Rtcp.h"
#include "Rtcp/RtcpFCI.h" #include "Rtcp/RtcpFCI.h"
#include "Rtcp/RtcpContext.h" #include "Rtcp/RtcpContext.h"
#include "Rtsp/Rtsp.h"
#include "Rtsp/RtpReceiver.h" #include "Rtsp/RtpReceiver.h"
#include "WebRtcTransport.h" #include "WebRtcTransport.h"
@ -287,20 +288,10 @@ std::string WebRtcTransport::getAnswerSdp(const string &offer) {
} }
} }
static bool is_dtls(char *buf) { static bool isDtls(char *buf) {
return ((*buf > 19) && (*buf < 64)); return ((*buf > 19) && (*buf < 64));
} }
static bool is_rtp(char *buf) {
RtpHeader *header = (RtpHeader *)buf;
return ((header->pt < 64) || (header->pt >= 96));
}
static bool is_rtcp(char *buf) {
RtpHeader *header = (RtpHeader *)buf;
return ((header->pt >= 64) && (header->pt < 96));
}
static string getPeerAddress(RTC::TransportTuple *tuple) { static string getPeerAddress(RTC::TransportTuple *tuple) {
return SockUtil::inet_ntoa(tuple); return SockUtil::inet_ntoa(tuple);
} }
@ -315,11 +306,11 @@ void WebRtcTransport::inputSockData(char *buf, int len, RTC::TransportTuple *tup
_ice_server->ProcessStunPacket(packet.get(), tuple); _ice_server->ProcessStunPacket(packet.get(), tuple);
return; return;
} }
if (is_dtls(buf)) { if (isDtls(buf)) {
_dtls_transport->ProcessDtlsData((uint8_t *)buf, len); _dtls_transport->ProcessDtlsData((uint8_t *)buf, len);
return; return;
} }
if (is_rtp(buf)) { if (isRtp(buf, len)) {
if (!_srtp_session_recv) { if (!_srtp_session_recv) {
WarnL << "received rtp packet when dtls not completed from:" << getPeerAddress(tuple); WarnL << "received rtp packet when dtls not completed from:" << getPeerAddress(tuple);
return; return;
@ -329,7 +320,7 @@ void WebRtcTransport::inputSockData(char *buf, int len, RTC::TransportTuple *tup
} }
return; return;
} }
if (is_rtcp(buf)) { if (isRtcp(buf, len)) {
if (!_srtp_session_recv) { if (!_srtp_session_recv) {
WarnL << "received rtcp packet when dtls not completed from:" << getPeerAddress(tuple); WarnL << "received rtcp packet when dtls not completed from:" << getPeerAddress(tuple);
return; return;