Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed payload size issue #659

Merged
merged 4 commits into from
Apr 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions source/custom/nixnet_converters.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ void SetSessionInfoResponse(const u32& input, nixnet_grpc::SessionInfoResponse*
} // namespace converters

constexpr auto ENET_FRAME_HEADER_LENGTH = static_cast<u16>(sizeof(nxFrameEnet_t) - 1); // last byte in nxFrameEnet_t is u8 FrameData[1]
constexpr auto ENET_FRAME_FCS_SIZE = 4;

u32 get_frame_buffer_size(int32 number_of_frames, u32 max_payload_size, u32 protocol);
Akshata440 marked this conversation as resolved.
Show resolved Hide resolved

struct FrameHolder {
FrameHolder(const pb_::RepeatedPtrField<FrameBufferRequest>& input, std::map<std::int32_t, std::int32_t> enetflags_input_map)
Expand Down Expand Up @@ -103,7 +106,7 @@ struct FrameHolder {
throw std::invalid_argument("All FrameBufferRequest instances in repeated field should have same oneof set for the frame");
}

size_t frame_size = ENET_FRAME_HEADER_LENGTH + grpc_frame.enet().frame_data().length();
u32 frame_size = get_frame_buffer_size(1, grpc_frame.enet().frame_data().length(),Protocol::PROTOCOL_ENET);
frame_data.resize(frame_size, 0);
nxFrameEnet_t* current_frame = (nxFrameEnet_t*)frame_data.data();
// The Length field in ENET write frame is big-endian. Typecast to u16 before doing the conversion
Expand Down Expand Up @@ -205,8 +208,6 @@ void convert_to_grpc(std::vector<u8>& input, google::protobuf::RepeatedPtrField<

void convert_to_grpc(const void* input, nixnet_grpc::FrameBufferResponse* output, u32 protocol, std::map<std::int32_t, std::int32_t> enetflags_output_map);

u32 get_frame_buffer_size(int32 number_of_frames, u32 max_payload_size, u32 protocol);

template <typename TFrame>
nixnet_grpc::FrameHolder convert_from_grpc(const pb_::RepeatedPtrField<nixnet_grpc::FrameBufferRequest>& input, std::map<std::int32_t, std::int32_t> enetflags_input_map)
{
Expand Down
5 changes: 2 additions & 3 deletions source/custom/nixnet_service.custom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1197,8 +1197,7 @@ void convert_enet_frame_to_grpc(const void* input, nixnet_grpc::FrameBufferRespo
}
}
enet_frame->set_flags_raw(nxEnetFrame->Flags);
auto enet_header_length = sizeof(nxFrameEnet_t) - 1; // last byte in nxFrameEnet_t is u8 FrameData[1]
auto frame_data_length = nxEnetFrame->Length - enet_header_length;
auto frame_data_length = nxEnetFrame->Length - ENET_FRAME_HEADER_LENGTH - ENET_FRAME_FCS_SIZE;
enet_frame->mutable_frame_data()->assign((const char*)nxEnetFrame->FrameData, frame_data_length);

output->set_allocated_enet(enet_frame);
Expand Down Expand Up @@ -1276,7 +1275,7 @@ void convert_to_grpc(std::vector<f64>& input, google::protobuf::RepeatedField<do
u32 get_frame_buffer_size(int32 number_of_frames, u32 max_payload_per_frame, u32 protocol)
{
if (protocol == Protocol::PROTOCOL_ENET) {
return number_of_frames * (ENET_FRAME_HEADER_LENGTH + max_payload_per_frame);
return number_of_frames * (ENET_FRAME_HEADER_LENGTH + ENET_FRAME_FCS_SIZE + max_payload_per_frame);
}
else {
return number_of_frames * nxFrameSize(max_payload_per_frame);
Expand Down
4 changes: 2 additions & 2 deletions source/tests/unit/xnet_converters_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ void assert_enet_frames_are_equal(nxFrameEnet_t* frame1, nixnet_grpc::EnetFrameR
EXPECT_EQ(frame1->NetworkTimestamp, frame2.network_timestamp());
EXPECT_EQ(nixnet_grpc::EnetFlags::ENET_FLAGS_TRANSMIT, frame2.flags_mapped()[0]);
EXPECT_EQ(frame1->Flags, frame2.flags_raw());
EXPECT_EQ(frame1->Length - nixnet_grpc::ENET_FRAME_HEADER_LENGTH, frame2.frame_data().size());
ASSERT_THAT(std::vector<u8>(frame1->FrameData, frame1->FrameData + frame1->Length - nixnet_grpc::ENET_FRAME_HEADER_LENGTH), ::testing::ElementsAreArray(frame2.frame_data()));
EXPECT_EQ(frame1->Length - nixnet_grpc::ENET_FRAME_HEADER_LENGTH - nixnet_grpc::ENET_FRAME_FCS_SIZE, frame2.frame_data().size());
ASSERT_THAT(std::vector<u8>(frame1->FrameData, frame1->FrameData + frame1->Length - nixnet_grpc::ENET_FRAME_HEADER_LENGTH - nixnet_grpc::ENET_FRAME_FCS_SIZE), ::testing::ElementsAreArray(frame2.frame_data()));
}

void assert_frames_are_equal(nxFrameVar_t* frame1, nixnet_grpc::FrameResponse frame2)
Expand Down