Skip to content

Commit

Permalink
NetworkCaptureLogger: Add GameCube BBA support
Browse files Browse the repository at this point in the history
  • Loading branch information
sepalani committed Jul 10, 2022
1 parent 6e09b13 commit e10eca9
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 2 deletions.
1 change: 1 addition & 0 deletions Source/Core/Core/Config/MainSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,7 @@ const Info<bool> MAIN_NETWORK_SSL_VERIFY_CERTIFICATES{
const Info<bool> MAIN_NETWORK_SSL_DUMP_ROOT_CA{{System::Main, "Network", "SSLDumpRootCA"}, false};
const Info<bool> MAIN_NETWORK_SSL_DUMP_PEER_CERT{{System::Main, "Network", "SSLDumpPeerCert"},
false};
const Info<bool> MAIN_NETWORK_DUMP_BBA{{System::Main, "Network", "DumpBBA"}, false};
const Info<bool> MAIN_NETWORK_DUMP_AS_PCAP{{System::Main, "Network", "DumpAsPCAP"}, false};
// Default value based on:
// - [RFC 1122] 4.2.3.5 TCP Connection Failures (at least 3 minutes)
Expand Down
1 change: 1 addition & 0 deletions Source/Core/Core/Config/MainSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ extern const Info<bool> MAIN_NETWORK_SSL_DUMP_WRITE;
extern const Info<bool> MAIN_NETWORK_SSL_VERIFY_CERTIFICATES;
extern const Info<bool> MAIN_NETWORK_SSL_DUMP_ROOT_CA;
extern const Info<bool> MAIN_NETWORK_SSL_DUMP_PEER_CERT;
extern const Info<bool> MAIN_NETWORK_DUMP_BBA;
extern const Info<bool> MAIN_NETWORK_DUMP_AS_PCAP;
extern const Info<int> MAIN_NETWORK_TIMEOUT;

Expand Down
8 changes: 6 additions & 2 deletions Source/Core/Core/HW/EXI/EXI_DeviceEthernet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "Core/CoreTiming.h"
#include "Core/HW/EXI/EXI.h"
#include "Core/HW/Memmap.h"
#include "Core/PowerPC/PowerPC.h"

namespace ExpansionInterface
{
Expand Down Expand Up @@ -441,7 +442,10 @@ void CEXIETHERNET::DirectFIFOWrite(const u8* data, u32 size)

void CEXIETHERNET::SendFromDirectFIFO()
{
m_network_interface->SendFrame(tx_fifo.get(), *(u16*)&mBbaMem[BBA_TXFIFOCNT]);
const u8* frame = tx_fifo.get();
const u16 size = *(u16*)&mBbaMem[BBA_TXFIFOCNT];
if (m_network_interface->SendFrame(frame, size))
PowerPC::debug_interface.NetworkLogger()->LogBBA(frame, size);
}

void CEXIETHERNET::SendFromPacketBuffer()
Expand Down Expand Up @@ -554,7 +558,7 @@ bool CEXIETHERNET::RecvHandlePacket()
INFO_LOG_FMT(SP1, "{:x} {:x} {:x} {:x}", page_ptr(BBA_BP), page_ptr(BBA_RRP), page_ptr(BBA_RWP),
page_ptr(BBA_RHBP));
#endif

PowerPC::debug_interface.NetworkLogger()->LogBBA(mRecvBuffer.get(), mRecvBufferLength);
write_ptr = &mBbaMem[page_ptr(BBA_RWP) << 8];

descriptor = (Descriptor*)write_ptr;
Expand Down
11 changes: 11 additions & 0 deletions Source/Core/Core/NetworkCaptureLogger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s
{
}

void DummyNetworkCaptureLogger::LogBBA(const void* data, std::size_t length)
{
}

NetworkCaptureType DummyNetworkCaptureLogger::GetCaptureType() const
{
return NetworkCaptureType::None;
Expand Down Expand Up @@ -115,6 +119,13 @@ void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 so
Log(LogType::Write, data, length, socket, to);
}

void PCAPSSLCaptureLogger::LogBBA(const void* data, std::size_t length)
{
if (!Config::Get(Config::MAIN_NETWORK_DUMP_BBA))
return;
m_file->AddPacket(static_cast<const u8*>(data), length);
}

void PCAPSSLCaptureLogger::Log(LogType log_type, const void* data, std::size_t length, s32 socket,
sockaddr* other)
{
Expand Down
6 changes: 6 additions & 0 deletions Source/Core/Core/NetworkCaptureLogger.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ class NetworkCaptureLogger
virtual void LogRead(const void* data, std::size_t length, s32 socket, sockaddr* from) = 0;
virtual void LogWrite(const void* data, std::size_t length, s32 socket, sockaddr* to) = 0;

virtual void LogBBA(const void* data, std::size_t length) = 0;

virtual NetworkCaptureType GetCaptureType() const = 0;
};

Expand All @@ -65,6 +67,8 @@ class DummyNetworkCaptureLogger : public NetworkCaptureLogger
void LogRead(const void* data, std::size_t length, s32 socket, sockaddr* from) override;
void LogWrite(const void* data, std::size_t length, s32 socket, sockaddr* to) override;

void LogBBA(const void* data, std::size_t length) override;

NetworkCaptureType GetCaptureType() const override;
};

Expand All @@ -91,6 +95,8 @@ class PCAPSSLCaptureLogger final : public NetworkCaptureLogger
void LogRead(const void* data, std::size_t length, s32 socket, sockaddr* from) override;
void LogWrite(const void* data, std::size_t length, s32 socket, sockaddr* to) override;

void LogBBA(const void* data, std::size_t length) override;

NetworkCaptureType GetCaptureType() const override;

private:
Expand Down
10 changes: 10 additions & 0 deletions Source/Core/DolphinQt/Debugger/NetworkWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,9 @@ void NetworkWidget::ConnectWidgets()
connect(m_verify_certificates_checkbox, &QCheckBox::stateChanged, [](int state) {
Config::SetBaseOrCurrent(Config::MAIN_NETWORK_SSL_VERIFY_CERTIFICATES, state == Qt::Checked);
});
connect(m_dump_bba_checkbox, &QCheckBox::stateChanged, [](int state) {
Config::SetBaseOrCurrent(Config::MAIN_NETWORK_DUMP_BBA, state == Qt::Checked);
});
connect(m_open_dump_folder, &QPushButton::pressed, [] {
const std::string location = File::GetUserPath(D_DUMPSSL_IDX);
const QUrl url = QUrl::fromLocalFile(QString::fromStdString(location));
Expand Down Expand Up @@ -352,6 +355,7 @@ QGroupBox* NetworkWidget::CreateDumpOptionsGroup()
// i18n: CA stands for certificate authority
m_dump_root_ca_checkbox = new QCheckBox(tr("Dump root CA certificates"));
m_dump_peer_cert_checkbox = new QCheckBox(tr("Dump peer certificates"));
m_dump_bba_checkbox = new QCheckBox(tr("Dump GameCube BBA traffic"));
m_open_dump_folder = new QPushButton(tr("Open dump folder"));
m_open_dump_folder->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

Expand All @@ -370,6 +374,7 @@ QGroupBox* NetworkWidget::CreateDumpOptionsGroup()
dump_options_layout->addWidget(m_dump_ssl_write_checkbox);
dump_options_layout->addWidget(m_dump_root_ca_checkbox);
dump_options_layout->addWidget(m_dump_peer_cert_checkbox);
dump_options_layout->addWidget(m_dump_bba_checkbox);
dump_options_layout->addWidget(m_open_dump_folder);

dump_options_layout->setSpacing(1);
Expand Down Expand Up @@ -414,23 +419,28 @@ void NetworkWidget::OnDumpFormatComboChanged(int index)
case FormatComboId::BinarySSL:
m_dump_ssl_read_checkbox->setChecked(true);
m_dump_ssl_write_checkbox->setChecked(true);
m_dump_bba_checkbox->setChecked(false);
break;
case FormatComboId::BinarySSLRead:
m_dump_ssl_read_checkbox->setChecked(true);
m_dump_ssl_write_checkbox->setChecked(false);
m_dump_bba_checkbox->setChecked(false);
break;
case FormatComboId::BinarySSLWrite:
m_dump_ssl_read_checkbox->setChecked(false);
m_dump_ssl_write_checkbox->setChecked(true);
m_dump_bba_checkbox->setChecked(false);
break;
default:
m_dump_ssl_read_checkbox->setChecked(false);
m_dump_ssl_write_checkbox->setChecked(false);
m_dump_bba_checkbox->setChecked(false);
break;
}
// Enable raw or decrypted SSL choices for PCAP
const bool is_pcap = combo_id == FormatComboId::PCAP;
m_dump_ssl_read_checkbox->setEnabled(is_pcap);
m_dump_ssl_write_checkbox->setEnabled(is_pcap);
m_dump_bba_checkbox->setEnabled(is_pcap);
Config::SetBaseOrCurrent(Config::MAIN_NETWORK_DUMP_AS_PCAP, is_pcap);
}
1 change: 1 addition & 0 deletions Source/Core/DolphinQt/Debugger/NetworkWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,6 @@ class NetworkWidget : public QDockWidget
QCheckBox* m_dump_root_ca_checkbox;
QCheckBox* m_dump_peer_cert_checkbox;
QCheckBox* m_verify_certificates_checkbox;
QCheckBox* m_dump_bba_checkbox;
QPushButton* m_open_dump_folder;
};

0 comments on commit e10eca9

Please sign in to comment.