Răsfoiți Sursa

channel+protocol_version: add Option<VersionMessage> into Channel

When we receive a version message from a node we are connected
to, update to Some(VersionMessage).
draoi 2 ani în urmă
părinte
comite
740a539bfd
2 a modificat fișierele cu 15 adăugiri și 3 ștergeri
  1. 13 1
      src/net/channel.rs
  2. 2 2
      src/net/protocol/protocol_version.rs

+ 13 - 1
src/net/channel.rs

@@ -39,7 +39,7 @@ use super::{
     dnet::{self, dnetev, DnetEvent},
     hosts::HostColor,
     message,
-    message::Packet,
+    message::{Packet, VersionMessage},
     message_subscriber::{MessageSubscription, MessageSubsystem},
     p2p::P2pPtr,
     session::{Session, SessionBitFlag, SessionWeakPtr, SESSION_ALL, SESSION_REFINE},
@@ -84,6 +84,10 @@ pub struct Channel {
     stopped: AtomicBool,
     /// Weak pointer to respective session
     session: SessionWeakPtr,
+    /// The version message of the node we are connected to.
+    /// Some if the version exchange has already occurred, None
+    /// otherwise.
+    version: Mutex<Option<Arc<VersionMessage>>>,
     /// Channel debug info
     pub info: ChannelInfo,
 }
@@ -105,6 +109,7 @@ impl Channel {
         let message_subsystem = MessageSubsystem::new();
         Self::setup_dispatchers(&message_subsystem).await;
 
+        let version = Mutex::new(None);
         let info = ChannelInfo::new(resolve_addr, connect_addr.clone());
 
         Arc::new(Self {
@@ -115,6 +120,7 @@ impl Channel {
             receive_task: StoppableTask::new(),
             stopped: AtomicBool::new(false),
             session,
+            version,
             info,
         })
     }
@@ -354,6 +360,12 @@ impl Channel {
         &self.info.connect_addr
     }
 
+    /// Set the VersionMessage of the node this channel is connected
+    /// to. Called on receiving a version message in `ProtocolVersion`.
+    pub(crate) async fn set_version(&self, version: Arc<VersionMessage>) {
+        *self.version.lock().await = Some(version);
+    }
+
     /// Returns the inner [`MessageSubsystem`] reference
     pub fn message_subsystem(&self) -> &MessageSubsystem {
         &self.message_subsystem

+ 2 - 2
src/net/protocol/protocol_version.rs

@@ -184,8 +184,8 @@ impl ProtocolVersion {
         );
 
         // Receive version message
-        let _version = self.version_sub.receive().await?;
-        // TODO: self.channel.set_remote_node_id(version.node_id.clone()).await;
+        let version = self.version_sub.receive().await?;
+        self.channel.set_version(version).await;
 
         // Send verack
         let verack = VerackMessage { app_version: self.settings.app_version.clone() };