Merge "Sort the RemoteMessageSender queue"
diff --git a/aos/events/event_loop_param_test.cc b/aos/events/event_loop_param_test.cc
index d92927b..a5b6b19 100644
--- a/aos/events/event_loop_param_test.cc
+++ b/aos/events/event_loop_param_test.cc
@@ -1053,23 +1053,31 @@
 // Verify that we can change a timer's parameters during execution.
 TEST_P(AbstractEventLoopTest, TimerChangeParameters) {
   auto loop = MakePrimary();
-  ::std::vector<::aos::monotonic_clock::time_point> iteration_list;
+  std::vector<monotonic_clock::time_point> iteration_list;
 
   auto test_timer = loop->AddTimer([&iteration_list, &loop]() {
-    iteration_list.push_back(loop->monotonic_now());
+    iteration_list.push_back(loop->context().monotonic_event_time);
   });
 
-  auto modifier_timer = loop->AddTimer([&loop, &test_timer]() {
-    test_timer->Setup(loop->monotonic_now(), ::std::chrono::milliseconds(30));
+  monotonic_clock::time_point s;
+  auto modifier_timer = loop->AddTimer([&test_timer, &s]() {
+    test_timer->Setup(s + chrono::milliseconds(45), chrono::milliseconds(30));
   });
 
-  test_timer->Setup(loop->monotonic_now(), ::std::chrono::milliseconds(20));
-  modifier_timer->Setup(loop->monotonic_now() +
-                        ::std::chrono::milliseconds(45));
-  EndEventLoop(loop.get(), ::std::chrono::milliseconds(150));
+  s = loop->monotonic_now();
+  test_timer->Setup(s, chrono::milliseconds(20));
+  modifier_timer->Setup(s + chrono::milliseconds(45));
+  EndEventLoop(loop.get(), chrono::milliseconds(150));
   Run();
 
   EXPECT_EQ(iteration_list.size(), 7);
+  EXPECT_EQ(iteration_list[0], s);
+  EXPECT_EQ(iteration_list[1], s + chrono::milliseconds(20));
+  EXPECT_EQ(iteration_list[2], s + chrono::milliseconds(40));
+  EXPECT_EQ(iteration_list[3], s + chrono::milliseconds(45));
+  EXPECT_EQ(iteration_list[4], s + chrono::milliseconds(75));
+  EXPECT_EQ(iteration_list[5], s + chrono::milliseconds(105));
+  EXPECT_EQ(iteration_list[6], s + chrono::milliseconds(135));
 }
 
 // Verify that we can disable a timer during execution.
diff --git a/aos/network/timestamp_filter.cc b/aos/network/timestamp_filter.cc
index b4455a5..6479607 100644
--- a/aos/network/timestamp_filter.cc
+++ b/aos/network/timestamp_filter.cc
@@ -520,16 +520,15 @@
           std::tuple<monotonic_clock::time_point, chrono::nanoseconds>>
 NoncausalTimestampFilter::FindTimestamps(monotonic_clock::time_point ta) const {
   CHECK_GT(timestamps_size(), 1u);
-  // Linear search until this is proven to be a measurable slowdown.
-  // If ta is outside our timestamp range, return the closest pair
-  size_t index = 0;
-  while (index < timestamps_size() - 2u) {
-    if (std::get<0>(timestamp(index + 1)) > ta) {
-      break;
-    }
-    ++index;
-  }
-  return std::make_pair(timestamp(index), timestamp(index + 1));
+  auto it = std::upper_bound(timestamps_.begin() + 1, timestamps_.end() - 1, ta,
+                             [](monotonic_clock::time_point ta,
+                                std::tuple<aos::monotonic_clock::time_point,
+                                           std::chrono::nanoseconds, bool>
+                                    t) { return ta < std::get<0>(t); });
+
+  const size_t index = std::distance(timestamps_.begin(), it);
+
+  return std::make_pair(timestamp(index - 1), timestamp(index));
 }
 
 chrono::nanoseconds NoncausalTimestampFilter::ExtrapolateOffset(