Skip to content
Snippets Groups Projects
Commit 9d7a7202 authored by Pierre Krieger's avatar Pierre Krieger Committed by Bastian Köcher
Browse files

Fix #2403 (#2404)


* Fix #2403

* Apply suggestions from code review

Co-Authored-By: default avatartomaka <pierre.krieger1708@gmail.com>
parent 39197f58
Branches
No related merge requests found
......@@ -612,31 +612,25 @@ where
}
fn inject_connected(&mut self, peer_id: PeerId, connected_point: ConnectedPoint) {
match (self.peers.entry(peer_id), connected_point) {
(Entry::Occupied(mut entry), connected_point) => {
match mem::replace(entry.get_mut(), PeerState::Poisoned) {
PeerState::Requested | PeerState::PendingRequest { .. } |
PeerState::Banned { .. } => {
debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Connection \
requested by PSM (through {:?})", entry.key(), connected_point);
debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", entry.key());
self.events.push(NetworkBehaviourAction::SendEvent {
peer_id: entry.key().clone(),
event: CustomProtoHandlerIn::Enable(connected_point.clone().into()),
});
*entry.into_mut() = PeerState::Enabled { open: false, connected_point };
}
st @ _ => {
// This is a serious bug either in this state machine or in libp2p.
error!(target: "sub-libp2p", "Received inject_connected for \
already-connected node; state is {:?}", st);
*entry.into_mut() = st;
return
}
}
match (self.peers.entry(peer_id.clone()).or_insert(PeerState::Poisoned), connected_point) {
(st @ &mut PeerState::Requested, connected_point) |
(st @ &mut PeerState::PendingRequest { .. }, connected_point) => {
debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Connection \
requested by PSM (through {:?})", peer_id, connected_point
);
debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", peer_id);
self.events.push(NetworkBehaviourAction::SendEvent {
peer_id: peer_id.clone(),
event: CustomProtoHandlerIn::Enable(connected_point.clone().into()),
});
*st = PeerState::Enabled { open: false, connected_point };
}
(Entry::Vacant(entry), connected_point @ ConnectedPoint::Listener { .. }) => {
// Note: it may seem weird that "Banned" nodes get treated as if there were absent.
// This is because the word "Banned" means "temporarily prevent outgoing connections to
// this node", and not "banned" in the sense that we would refuse the node altogether.
(st @ &mut PeerState::Poisoned, connected_point @ ConnectedPoint::Listener { .. }) |
(st @ &mut PeerState::Banned { .. }, connected_point @ ConnectedPoint::Listener { .. }) => {
let incoming_id = self.next_incoming_index.clone();
self.next_incoming_index.0 = match self.next_incoming_index.0.checked_add(1) {
Some(v) => v,
......@@ -646,27 +640,40 @@ where
}
};
debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Incoming connection",
entry.key());
peer_id);
debug!(target: "sub-libp2p", "PSM <= Incoming({:?}, {:?}): Through {:?}",
incoming_id, entry.key(), connected_point);
self.peerset.incoming(entry.key().clone(), incoming_id);
incoming_id, peer_id, connected_point);
self.peerset.incoming(peer_id.clone(), incoming_id);
self.incoming.push(IncomingPeer {
peer_id: entry.key().clone(),
peer_id: peer_id.clone(),
alive: true,
incoming_id,
});
entry.insert(PeerState::Incoming { connected_point });
*st = PeerState::Incoming { connected_point };
}
(Entry::Vacant(entry), connected_point) => {
(st @ &mut PeerState::Poisoned, connected_point) |
(st @ &mut PeerState::Banned { .. }, connected_point) => {
let banned_until = if let PeerState::Banned { until } = st {
Some(*until)
} else {
None
};
debug!(target: "sub-libp2p", "Libp2p => Connected({:?}): Requested by something \
else than PSM, disabling", entry.key());
debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", entry.key());
else than PSM, disabling", peer_id);
debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", peer_id);
self.events.push(NetworkBehaviourAction::SendEvent {
peer_id: entry.key().clone(),
peer_id: peer_id.clone(),
event: CustomProtoHandlerIn::Disable,
});
entry.insert(PeerState::Disabled { open: false, connected_point, banned_until: None });
*st = PeerState::Disabled { open: false, connected_point, banned_until };
}
st => {
// This is a serious bug either in this state machine or in libp2p.
error!(target: "sub-libp2p", "Received inject_connected for \
already-connected node; state is {:?}", st
);
}
}
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment