2017-01-25 18:51:41 +01:00
|
|
|
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
2016-11-09 15:36:26 +01:00
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
//! Defines error types and levels of punishment to use upon
|
|
|
|
//! encountering.
|
|
|
|
|
|
|
|
use std::fmt;
|
2017-11-13 14:37:08 +01:00
|
|
|
use {rlp, network};
|
2016-11-09 15:36:26 +01:00
|
|
|
|
|
|
|
/// Levels of punishment.
|
|
|
|
///
|
|
|
|
/// Currently just encompasses two different kinds of disconnect and
|
|
|
|
/// no punishment, but this is where reputation systems might come into play.
|
|
|
|
// In ascending order
|
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
|
|
pub enum Punishment {
|
|
|
|
/// Perform no punishment.
|
|
|
|
None,
|
|
|
|
/// Disconnect the peer, but don't prevent them from reconnecting.
|
|
|
|
Disconnect,
|
|
|
|
/// Disconnect the peer and prevent them from reconnecting.
|
|
|
|
Disable,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Kinds of errors which can be encountered in the course of LES.
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum Error {
|
|
|
|
/// An RLP decoding error.
|
2017-11-13 14:37:08 +01:00
|
|
|
Rlp(rlp::DecoderError),
|
2016-11-09 15:36:26 +01:00
|
|
|
/// A network error.
|
2017-11-13 14:37:08 +01:00
|
|
|
Network(network::Error),
|
2017-03-08 14:39:44 +01:00
|
|
|
/// Out of credits.
|
|
|
|
NoCredits,
|
2016-11-09 15:36:26 +01:00
|
|
|
/// Unrecognized packet code.
|
|
|
|
UnrecognizedPacket(u8),
|
|
|
|
/// Unexpected handshake.
|
|
|
|
UnexpectedHandshake,
|
|
|
|
/// Peer on wrong network (wrong NetworkId or genesis hash)
|
|
|
|
WrongNetwork,
|
2016-11-18 19:12:20 +01:00
|
|
|
/// Unknown peer.
|
|
|
|
UnknownPeer,
|
2016-12-07 15:27:04 +01:00
|
|
|
/// Unsolicited response.
|
|
|
|
UnsolicitedResponse,
|
2017-03-23 13:17:05 +01:00
|
|
|
/// Bad back-reference in request.
|
|
|
|
BadBackReference,
|
2016-12-09 01:06:51 +01:00
|
|
|
/// Not a server.
|
|
|
|
NotServer,
|
2016-12-09 15:04:54 +01:00
|
|
|
/// Unsupported protocol version.
|
|
|
|
UnsupportedProtocolVersion(u8),
|
|
|
|
/// Bad protocol version.
|
|
|
|
BadProtocolVersion,
|
2016-12-19 12:28:42 +01:00
|
|
|
/// Peer is overburdened.
|
|
|
|
Overburdened,
|
2017-06-30 10:58:48 +02:00
|
|
|
/// No handler kept the peer.
|
|
|
|
RejectedByHandlers,
|
2016-11-09 15:36:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Error {
|
|
|
|
/// What level of punishment does this error warrant?
|
|
|
|
pub fn punishment(&self) -> Punishment {
|
|
|
|
match *self {
|
|
|
|
Error::Rlp(_) => Punishment::Disable,
|
|
|
|
Error::Network(_) => Punishment::None,
|
2017-03-08 14:39:44 +01:00
|
|
|
Error::NoCredits => Punishment::Disable,
|
2016-11-09 15:36:26 +01:00
|
|
|
Error::UnrecognizedPacket(_) => Punishment::Disconnect,
|
|
|
|
Error::UnexpectedHandshake => Punishment::Disconnect,
|
|
|
|
Error::WrongNetwork => Punishment::Disable,
|
2016-11-18 19:12:20 +01:00
|
|
|
Error::UnknownPeer => Punishment::Disconnect,
|
2016-12-07 15:27:04 +01:00
|
|
|
Error::UnsolicitedResponse => Punishment::Disable,
|
2017-03-23 13:17:05 +01:00
|
|
|
Error::BadBackReference => Punishment::Disable,
|
2016-12-09 01:06:51 +01:00
|
|
|
Error::NotServer => Punishment::Disable,
|
2016-12-09 15:04:54 +01:00
|
|
|
Error::UnsupportedProtocolVersion(_) => Punishment::Disable,
|
|
|
|
Error::BadProtocolVersion => Punishment::Disable,
|
2016-12-19 12:28:42 +01:00
|
|
|
Error::Overburdened => Punishment::None,
|
2017-06-30 10:58:48 +02:00
|
|
|
Error::RejectedByHandlers => Punishment::Disconnect,
|
2016-11-09 15:36:26 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-13 14:37:08 +01:00
|
|
|
impl From<rlp::DecoderError> for Error {
|
|
|
|
fn from(err: rlp::DecoderError) -> Self {
|
2016-11-09 15:36:26 +01:00
|
|
|
Error::Rlp(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-13 14:37:08 +01:00
|
|
|
impl From<network::Error> for Error {
|
|
|
|
fn from(err: network::Error) -> Self {
|
2016-11-09 15:36:26 +01:00
|
|
|
Error::Network(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Error {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
match *self {
|
|
|
|
Error::Rlp(ref err) => err.fmt(f),
|
|
|
|
Error::Network(ref err) => err.fmt(f),
|
2017-03-08 14:39:44 +01:00
|
|
|
Error::NoCredits => write!(f, "Out of request credits"),
|
2016-11-09 15:36:26 +01:00
|
|
|
Error::UnrecognizedPacket(code) => write!(f, "Unrecognized packet: 0x{:x}", code),
|
|
|
|
Error::UnexpectedHandshake => write!(f, "Unexpected handshake"),
|
|
|
|
Error::WrongNetwork => write!(f, "Wrong network"),
|
2016-12-07 15:27:04 +01:00
|
|
|
Error::UnknownPeer => write!(f, "Unknown peer"),
|
|
|
|
Error::UnsolicitedResponse => write!(f, "Peer provided unsolicited data"),
|
2017-03-23 13:17:05 +01:00
|
|
|
Error::BadBackReference => write!(f, "Bad back-reference in request."),
|
2016-12-09 01:06:51 +01:00
|
|
|
Error::NotServer => write!(f, "Peer not a server."),
|
2016-12-19 12:28:42 +01:00
|
|
|
Error::UnsupportedProtocolVersion(pv) => write!(f, "Unsupported protocol version: {}", pv),
|
2016-12-09 15:04:54 +01:00
|
|
|
Error::BadProtocolVersion => write!(f, "Bad protocol version in handshake"),
|
2016-12-19 12:28:42 +01:00
|
|
|
Error::Overburdened => write!(f, "Peer overburdened"),
|
2017-06-30 10:58:48 +02:00
|
|
|
Error::RejectedByHandlers => write!(f, "No handler kept this peer"),
|
2016-11-09 15:36:26 +01:00
|
|
|
}
|
|
|
|
}
|
2016-12-19 12:28:42 +01:00
|
|
|
}
|