aos/sctp: Add client partial delivery stats

Change-Id: I40f8ab11cde88760215227e339715297e99e2d9f
diff --git a/aos/events/logging/logger_test.cc b/aos/events/logging/logger_test.cc
index 26aa8a3..f60a62a 100644
--- a/aos/events/logging/logger_test.cc
+++ b/aos/events/logging/logger_test.cc
@@ -2200,9 +2200,9 @@
 }
 
 constexpr std::string_view kCombinedConfigSha1(
-    "60f7907de2ce98f5df6cc433487165086595021fabf52176fe45f532305e447b");
+    "0184681f8b83b5b9902a88ab12504c06b780907f6d156353bd958ebcf9389ef9");
 constexpr std::string_view kSplitConfigSha1(
-    "49e1da5ed560f76252706d30f3180207b81ec2100ec9bd8adc10df45460022ce");
+    "1020274679a8f8c15ea20a48e4a35dd59a435203e5f31a57e15355e5a6ee31f7");
 
 INSTANTIATE_TEST_CASE_P(
     All, MultinodeLoggerTest,
diff --git a/aos/events/simulated_event_loop_test.cc b/aos/events/simulated_event_loop_test.cc
index 39dbe99..34e10ca 100644
--- a/aos/events/simulated_event_loop_test.cc
+++ b/aos/events/simulated_event_loop_test.cc
@@ -571,6 +571,7 @@
             LOG(FATAL) << "Unknown connection";
           }
 
+          EXPECT_EQ(connection->partial_deliveries(), 0);
           EXPECT_TRUE(connection->has_monotonic_offset());
           EXPECT_EQ(connection->monotonic_offset(), 150000);
         }
@@ -588,6 +589,7 @@
             stats.connections()->Get(0);
         EXPECT_EQ(connection->state(), message_bridge::State::CONNECTED);
         EXPECT_GT(connection->received_packets(), 50);
+        EXPECT_EQ(connection->partial_deliveries(), 0);
         EXPECT_TRUE(connection->has_monotonic_offset());
         EXPECT_EQ(connection->monotonic_offset(), 150000);
         ++pi2_client_statistics_count;
@@ -604,6 +606,7 @@
             stats.connections()->Get(0);
         EXPECT_EQ(connection->state(), message_bridge::State::CONNECTED);
         EXPECT_GE(connection->received_packets(), 5);
+        EXPECT_EQ(connection->partial_deliveries(), 0);
         EXPECT_TRUE(connection->has_monotonic_offset());
         EXPECT_EQ(connection->monotonic_offset(), 150000);
         ++pi3_client_statistics_count;
diff --git a/aos/network/message_bridge_client.fbs b/aos/network/message_bridge_client.fbs
index 7056506..6efe3a9 100644
--- a/aos/network/message_bridge_client.fbs
+++ b/aos/network/message_bridge_client.fbs
@@ -21,6 +21,10 @@
   // Number of duplicate packets we received and dropped.
   duplicate_packets:uint (id: 4);
 
+  // Number of extra calls needed to receive a single message
+  // (indicates congestion)
+  partial_deliveries:uint (id: 5);
+
   // TODO(austin): Per channel counts?
 }
 
diff --git a/aos/network/message_bridge_client_lib.cc b/aos/network/message_bridge_client_lib.cc
index a5113a0..08350a8 100644
--- a/aos/network/message_bridge_client_lib.cc
+++ b/aos/network/message_bridge_client_lib.cc
@@ -238,6 +238,8 @@
     // Duplicate message, ignore.
   } else {
     connection_->mutate_received_packets(connection_->received_packets() + 1);
+    connection_->mutate_partial_deliveries(connection_->partial_deliveries() +
+                                           message->partial_deliveries);
 
     channel_state->last_queue_index = remote_data->queue_index();
     channel_state->last_timestamp = monotonic_clock::time_point(
diff --git a/aos/network/message_bridge_client_status.cc b/aos/network/message_bridge_client_status.cc
index e8520cf..69f474a 100644
--- a/aos/network/message_bridge_client_status.cc
+++ b/aos/network/message_bridge_client_status.cc
@@ -33,6 +33,7 @@
     connection_builder.add_received_packets(0);
     connection_builder.add_duplicate_packets(0);
     connection_builder.add_monotonic_offset(0);
+    connection_builder.add_partial_deliveries(0);
     connection_offsets.emplace_back(connection_builder.Finish());
   }
   flatbuffers::Offset<
@@ -97,6 +98,8 @@
       client_connection_builder.add_duplicate_packets(
           connection->duplicate_packets());
     }
+    client_connection_builder.add_partial_deliveries(
+        connection->partial_deliveries());
 
     // Strip out the monotonic offset if it isn't populated.
     TimestampFilter *filter = &filters_[client_connection_offsets_.size()];
diff --git a/aos/network/message_bridge_test.cc b/aos/network/message_bridge_test.cc
index 1b6f594..7420579 100644
--- a/aos/network/message_bridge_test.cc
+++ b/aos/network/message_bridge_test.cc
@@ -1067,6 +1067,11 @@
                   ->duplicate_packets(),
               0u);
 
+    EXPECT_EQ(pi2_client_statistics_fetcher->connections()
+                  ->Get(0)
+                  ->partial_deliveries(),
+              0u);
+
     EXPECT_TRUE(ping_fetcher.Fetch());
     EXPECT_FALSE(unreliable_ping_fetcher.Fetch());
     EXPECT_EQ(ping_timestamp_count, 1);
@@ -1087,6 +1092,11 @@
                   ->duplicate_packets(),
               1u);
 
+    EXPECT_EQ(pi2_client_statistics_fetcher->connections()
+                  ->Get(0)
+                  ->partial_deliveries(),
+              0u);
+
     EXPECT_EQ(ping_timestamp_count, 1);
     EXPECT_FALSE(ping_fetcher.Fetch());
     EXPECT_FALSE(unreliable_ping_fetcher.Fetch());
@@ -1192,6 +1202,11 @@
                   ->duplicate_packets(),
               0u);
 
+    EXPECT_EQ(pi2_client_statistics_fetcher->connections()
+                  ->Get(0)
+                  ->partial_deliveries(),
+              0u);
+
     EXPECT_TRUE(ping_fetcher.Fetch());
     EXPECT_FALSE(unreliable_ping_fetcher.Fetch());
     EXPECT_EQ(ping_timestamp_count, 1);
@@ -1213,6 +1228,12 @@
                   ->duplicate_packets(),
               1u);
 
+
+    EXPECT_EQ(pi2_client_statistics_fetcher->connections()
+                  ->Get(0)
+                  ->partial_deliveries(),
+              0u);
+
     EXPECT_EQ(ping_timestamp_count, 1);
     EXPECT_FALSE(ping_fetcher.Fetch());
     EXPECT_FALSE(unreliable_ping_fetcher.Fetch());