Add remote timestamps and queue_index to context

This gives us the knobs to expose the remote timestamps and queue_index
to anything receiving the events.  The first use case is the logger.  It
can now log forwarded entries *without* having to make the
message_gateway responsible for logging this data.

Change-Id: Ie34dd040d270f4fa90ecd6e463069e1adca1818a
diff --git a/aos/ipc_lib/lockless_queue.cc b/aos/ipc_lib/lockless_queue.cc
index 3fb506b..903150b 100644
--- a/aos/ipc_lib/lockless_queue.cc
+++ b/aos/ipc_lib/lockless_queue.cc
@@ -552,16 +552,30 @@
   return &message->data[0];
 }
 
-void LocklessQueue::Sender::Send(const char *data, size_t length) {
+void LocklessQueue::Sender::Send(
+    const char *data, size_t length,
+    aos::monotonic_clock::time_point monotonic_remote_time,
+    aos::realtime_clock::time_point realtime_remote_time,
+    uint32_t remote_queue_index,
+    aos::monotonic_clock::time_point *monotonic_sent_time,
+    aos::realtime_clock::time_point *realtime_sent_time,
+    uint32_t *queue_index) {
   CHECK_LE(length, size());
   // Flatbuffers write from the back of the buffer to the front.  If we are
   // going to write an explicit chunk of memory into the buffer, we need to
   // adhere to this convention and place it at the end.
   memcpy((reinterpret_cast<char *>(Data()) + size() - length), data, length);
-  Send(length);
+  Send(length, monotonic_remote_time, realtime_remote_time, remote_queue_index,
+       monotonic_sent_time, realtime_sent_time, queue_index);
 }
 
-void LocklessQueue::Sender::Send(size_t length) {
+void LocklessQueue::Sender::Send(
+    size_t length, aos::monotonic_clock::time_point monotonic_remote_time,
+    aos::realtime_clock::time_point realtime_remote_time,
+    uint32_t remote_queue_index,
+    aos::monotonic_clock::time_point *monotonic_sent_time,
+    aos::realtime_clock::time_point *realtime_sent_time,
+    uint32_t *queue_index) {
   const size_t queue_size = memory_->queue_size();
   CHECK_LE(length, size());
 
@@ -572,6 +586,11 @@
   Message *const message = memory_->GetMessage(scratch_index);
 
   message->header.length = length;
+  // Pass these through.  Any alternative behavior can be implemented out a
+  // layer.
+  message->header.remote_queue_index = remote_queue_index;
+  message->header.monotonic_remote_time = monotonic_remote_time;
+  message->header.realtime_remote_time = realtime_remote_time;
 
   while (true) {
     const QueueIndex actual_next_queue_index =
@@ -625,6 +644,15 @@
 
     message->header.monotonic_sent_time = ::aos::monotonic_clock::now();
     message->header.realtime_sent_time = ::aos::realtime_clock::now();
+    if (monotonic_sent_time != nullptr) {
+      *monotonic_sent_time = message->header.monotonic_sent_time;
+    }
+    if (realtime_sent_time != nullptr) {
+      *realtime_sent_time = message->header.realtime_sent_time;
+    }
+    if (queue_index != nullptr) {
+      *queue_index = next_queue_index.index();
+    }
 
     // Before we are fully done filling out the message, update the Sender state
     // with the new index to write.  This re-uses the barrier for the
@@ -676,8 +704,10 @@
 LocklessQueue::ReadResult LocklessQueue::Read(
     uint32_t uint32_queue_index,
     ::aos::monotonic_clock::time_point *monotonic_sent_time,
-    ::aos::realtime_clock::time_point *realtime_sent_time, size_t *length,
-    char *data) {
+    ::aos::realtime_clock::time_point *realtime_sent_time,
+    ::aos::monotonic_clock::time_point *monotonic_remote_time,
+    ::aos::realtime_clock::time_point *realtime_remote_time,
+    uint32_t *remote_queue_index, size_t *length, char *data) {
   const size_t queue_size = memory_->queue_size();
 
   // Build up the QueueIndex.
@@ -751,6 +781,13 @@
   // make length be from either end.
   *monotonic_sent_time = m->header.monotonic_sent_time;
   *realtime_sent_time = m->header.realtime_sent_time;
+  if (m->header.remote_queue_index == 0xffffffffu) {
+    *remote_queue_index = queue_index.index();
+  } else {
+    *remote_queue_index = m->header.remote_queue_index;
+  }
+  *monotonic_remote_time = m->header.monotonic_remote_time;
+  *realtime_remote_time = m->header.realtime_remote_time;
   memcpy(data, &m->data[0], message_data_size());
   *length = m->header.length;