aos/sctp: Add client partial delivery stats

Change-Id: I40f8ab11cde88760215227e339715297e99e2d9f
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());