htc: implement much of worker receive logic

This commit is contained in:
Michael Scire
2021-02-08 14:11:01 -08:00
committed by SciresM
parent 8f85cc17dc
commit 679fec2ddc
19 changed files with 565 additions and 12 deletions

View File

@@ -15,11 +15,59 @@
*/
#pragma once
#include <stratosphere.hpp>
#include "../htclow_packet.hpp"
namespace ams::htclow::ctrl {
class HtcctrlPacket : public util::IntrusiveListBaseNode<HtcctrlPacket> {
/* TODO */
enum HtcctrlPacketType : u16 {
HtcctrlPacketType_ConnectFromHost = 16,
HtcctrlPacketType_ConnectFromTarget = 17,
HtcctrlPacketType_ReadyFromHost = 18,
HtcctrlPacketType_ReadyFromTarget = 19,
HtcctrlPacketType_SuspendFromHost = 20,
HtcctrlPacketType_SuspendFromTarget = 21,
HtcctrlPacketType_ResumeFromHost = 22,
HtcctrlPacketType_ResumeFromTarget = 23,
HtcctrlPacketType_DisconnectFromHost = 24,
HtcctrlPacketType_DisconnectFromTarget = 25,
HtcctrlPacketType_BeaconQuery = 28,
HtcctrlPacketType_BeaconResponse = 29,
HtcctrlPacketType_InformationFromTarget = 33,
};
static constexpr inline u32 HtcctrlSignature = 0x78825637;
struct HtcctrlPacketHeader {
u32 signature;
u32 offset;
u32 reserved;
u32 body_size;
s16 version;
HtcctrlPacketType packet_type;
impl::ChannelInternalType channel;
u64 share;
};
static_assert(util::is_pod<HtcctrlPacketHeader>::value);
static_assert(sizeof(HtcctrlPacketHeader) == 0x20);
static constexpr inline size_t HtcctrlPacketBodySizeMax = 0x1000;
struct HtcctrlPacketBody {
u8 data[HtcctrlPacketBodySizeMax];
};
class HtcctrlPacket : public BasePacket<HtcctrlPacketHeader>, public util::IntrusiveListBaseNode<HtcctrlPacket> {
public:
using BasePacket<HtcctrlPacketHeader>::BasePacket;
};
struct HtcctrlPacketDeleter {
mem::StandardAllocator *m_allocator;
void operator()(HtcctrlPacket *packet) {
std::destroy_at(packet);
m_allocator->Free(packet);
}
};
}

View File

@@ -83,6 +83,37 @@ namespace ams::htclow::ctrl {
this->UpdateBeaconResponse(this->GetConnectionType(driver_type));
}
Result HtcctrlService::CheckReceivedHeader(const HtcctrlPacketHeader &header) const {
/* Check the packet signature. */
AMS_ASSERT(header.signature == HtcctrlSignature);
/* Validate version. */
R_UNLESS(header.version == 1, htclow::ResultProtocolError());
/* Switch on the packet type. */
switch (header.packet_type) {
case HtcctrlPacketType_ConnectFromHost:
case HtcctrlPacketType_SuspendFromHost:
case HtcctrlPacketType_ResumeFromHost:
case HtcctrlPacketType_DisconnectFromHost:
case HtcctrlPacketType_BeaconQuery:
R_UNLESS(header.body_size == 0, htclow::ResultProtocolError());
break;
case HtcctrlPacketType_ReadyFromHost:
R_UNLESS(0 <= header.body_size && header.body_size <= sizeof(HtcctrlPacketBody), htclow::ResultProtocolError());
break;
default:
return htclow::ResultProtocolError();
}
return ResultSuccess();
}
Result HtcctrlService::ProcessReceivePacket(const HtcctrlPacketHeader &header, const void *body, size_t body_size) {
/* TODO */
AMS_ABORT("HtcctrlService::ProcessReceivePacket");
}
Result HtcctrlService::NotifyDriverConnected() {
/* Lock ourselves. */
std::scoped_lock lk(m_mutex);

View File

@@ -64,6 +64,9 @@ namespace ams::htclow::ctrl {
void SetDriverType(impl::DriverType driver_type);
Result CheckReceivedHeader(const HtcctrlPacketHeader &header) const;
Result ProcessReceivePacket(const HtcctrlPacketHeader &header, const void *body, size_t body_size);
Result NotifyDriverConnected();
Result NotifyDriverDisconnected();
};