htc: implement much of worker receive logic
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user