From a8bb29e1bfc4a75bedb5f1cc61f802b5e234074f Mon Sep 17 00:00:00 2001 From: Anay Wadhera Date: Mon, 10 Apr 2023 12:55:38 -0700 Subject: [PATCH] Weave port [3/n]: Introduce weave packet counter generator PiperOrigin-RevId: 523189849 --- Package.swift | 1 + internal/weave/BUILD | 16 +++++ .../weave/packet_sequence_number_generator.cc | 39 ++++++++++++ .../weave/packet_sequence_number_generator.h | 45 ++++++++++++++ .../packet_sequence_number_generator_test.cc | 60 +++++++++++++++++++ 5 files changed, 161 insertions(+) create mode 100644 internal/weave/packet_sequence_number_generator.cc create mode 100644 internal/weave/packet_sequence_number_generator.h create mode 100644 internal/weave/packet_sequence_number_generator_test.cc diff --git a/Package.swift b/Package.swift index e504174b..3c995484 100644 --- a/Package.swift +++ b/Package.swift @@ -547,6 +547,7 @@ let package = Package( "internal/test/fake_device_info_test.cc", "internal/test/fake_task_runner_test.cc", "internal/weave/packet_test.cc", + "internal/weave/packet_sequence_number_generator_test.cc", "internal/weave/packetizer_test.cc", // simulation "connections/implementation/offline_simulation_user.cc", diff --git a/internal/weave/BUILD b/internal/weave/BUILD index d6b76853..074929c5 100644 --- a/internal/weave/BUILD +++ b/internal/weave/BUILD @@ -2,15 +2,18 @@ cc_library( name = "weave", srcs = [ "packet.cc", + "packet_sequence_number_generator.cc", "packetizer.cc", ], hdrs = [ "packet.h", + "packet_sequence_number_generator.h", "packetizer.h", ], deps = [ "//internal/platform:base", "//internal/platform:types", + "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", "@com_google_absl//absl/strings", @@ -33,6 +36,19 @@ cc_test( ], ) +cc_test( + name = "packet_sequence_number_generator_test", + srcs = [ + "packet_sequence_number_generator_test.cc", + ], + deps = [ + ":weave", + "//internal/platform/implementation/g3", # build_cleaner: keep + "@com_github_protobuf_matchers//protobuf-matchers", + "@com_google_googletest//:gtest_main", + ], +) + cc_test( name = "packetizer_test", srcs = [ diff --git a/internal/weave/packet_sequence_number_generator.cc b/internal/weave/packet_sequence_number_generator.cc new file mode 100644 index 00000000..26ab3ca6 --- /dev/null +++ b/internal/weave/packet_sequence_number_generator.cc @@ -0,0 +1,39 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/weave/packet_sequence_number_generator.h" + +#include "internal/platform/mutex_lock.h" +#include "internal/weave/packet.h" + +namespace nearby { +namespace weave { + +int PacketSequenceNumberGenerator::Next() { + MutexLock lock(&mutex_); + int next_packet_counter = packet_counter_; + if (next_packet_counter == Packet::kMaxPacketCounter) { + packet_counter_ = 0; + } else { + ++packet_counter_; + } + return next_packet_counter; +} + +void PacketSequenceNumberGenerator::Reset() { + MutexLock lock(&mutex_); + packet_counter_ = 0; +} +} // namespace weave +} // namespace nearby diff --git a/internal/weave/packet_sequence_number_generator.h b/internal/weave/packet_sequence_number_generator.h new file mode 100644 index 00000000..cbf5eb6c --- /dev/null +++ b/internal/weave/packet_sequence_number_generator.h @@ -0,0 +1,45 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef THIRD_PARTY_NEARBY_INTERNAL_WEAVE_PACKET_SEQUENCE_NUMBER_GENERATOR_H_ +#define THIRD_PARTY_NEARBY_INTERNAL_WEAVE_PACKET_SEQUENCE_NUMBER_GENERATOR_H_ + +#include "absl/base/thread_annotations.h" +#include "internal/platform/mutex.h" + +namespace nearby { +namespace weave { + +// Keeps a counter of the next Weave packet to set the new Weave packet sequence +// number in a connection. This counter automatically rolls over once it hits 7, +// since 3 bits are allocated in the packet to the counter, making its max value +// 0b111, or 7. +class PacketSequenceNumberGenerator { + public: + // Returns the next counter in the sequence, incrementing the counter + // internally. + int Next(); + + // Resets the counter to 0. + void Reset(); + + private: + Mutex mutex_; + int packet_counter_ ABSL_GUARDED_BY(mutex_) = 0; +}; + +} // namespace weave +} // namespace nearby + +#endif // THIRD_PARTY_NEARBY_INTERNAL_WEAVE_PACKET_SEQUENCE_NUMBER_GENERATOR_H_ diff --git a/internal/weave/packet_sequence_number_generator_test.cc b/internal/weave/packet_sequence_number_generator_test.cc new file mode 100644 index 00000000..ce8d9246 --- /dev/null +++ b/internal/weave/packet_sequence_number_generator_test.cc @@ -0,0 +1,60 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/weave/packet_sequence_number_generator.h" + +#include "gmock/gmock.h" +#include "protobuf-matchers/protocol-buffer-matchers.h" +#include "gtest/gtest.h" + +namespace nearby { +namespace weave { +namespace { + +TEST(PacketSequenceNumberGeneratorTest, TestNext) { + PacketSequenceNumberGenerator generator; + EXPECT_EQ(generator.Next(), 0); + EXPECT_EQ(generator.Next(), 1); + EXPECT_EQ(generator.Next(), 2); + EXPECT_EQ(generator.Next(), 3); +} + +TEST(PacketSequenceNumberGeneratorTest, TestNextWrapping) { + PacketSequenceNumberGenerator generator; + EXPECT_EQ(generator.Next(), 0); + EXPECT_EQ(generator.Next(), 1); + EXPECT_EQ(generator.Next(), 2); + EXPECT_EQ(generator.Next(), 3); + EXPECT_EQ(generator.Next(), 4); + EXPECT_EQ(generator.Next(), 5); + EXPECT_EQ(generator.Next(), 6); + EXPECT_EQ(generator.Next(), 7); + EXPECT_EQ(generator.Next(), 0); + EXPECT_EQ(generator.Next(), 1); +} + +TEST(PacketSequenceNumberGeneratorTest, TestReset) { + PacketSequenceNumberGenerator generator; + EXPECT_EQ(generator.Next(), 0); + EXPECT_EQ(generator.Next(), 1); + EXPECT_EQ(generator.Next(), 2); + generator.Reset(); + EXPECT_EQ(generator.Next(), 0); + EXPECT_EQ(generator.Next(), 1); + EXPECT_EQ(generator.Next(), 2); +} + +} // namespace +} // namespace weave +} // namespace nearby