123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- // Copyright 2014 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library 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 Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package p2p
- import (
- "errors"
- "fmt"
- )
- const (
- errInvalidMsgCode = iota
- errInvalidMsg
- )
- var errorToString = map[int]string{
- errInvalidMsgCode: "invalid message code",
- errInvalidMsg: "invalid message",
- }
- type peerError struct {
- code int
- message string
- }
- func newPeerError(code int, format string, v ...interface{}) *peerError {
- desc, ok := errorToString[code]
- if !ok {
- panic("invalid error code")
- }
- err := &peerError{code, desc}
- if format != "" {
- err.message += ": " + fmt.Sprintf(format, v...)
- }
- return err
- }
- func (pe *peerError) Error() string {
- return pe.message
- }
- var errProtocolReturned = errors.New("protocol returned")
- type DiscReason uint
- const (
- DiscRequested DiscReason = iota
- DiscNetworkError
- DiscProtocolError
- DiscUselessPeer
- DiscTooManyPeers
- DiscAlreadyConnected
- DiscIncompatibleVersion
- DiscInvalidIdentity
- DiscQuitting
- DiscUnexpectedIdentity
- DiscSelf
- DiscReadTimeout
- DiscSubprotocolError = 0x10
- )
- var discReasonToString = [...]string{
- DiscRequested: "disconnect requested",
- DiscNetworkError: "network error",
- DiscProtocolError: "breach of protocol",
- DiscUselessPeer: "useless peer",
- DiscTooManyPeers: "too many peers",
- DiscAlreadyConnected: "already connected",
- DiscIncompatibleVersion: "incompatible p2p protocol version",
- DiscInvalidIdentity: "invalid node identity",
- DiscQuitting: "client quitting",
- DiscUnexpectedIdentity: "unexpected identity",
- DiscSelf: "connected to self",
- DiscReadTimeout: "read timeout",
- DiscSubprotocolError: "subprotocol error",
- }
- func (d DiscReason) String() string {
- if len(discReasonToString) < int(d) {
- return fmt.Sprintf("unknown disconnect reason %d", d)
- }
- return discReasonToString[d]
- }
- func (d DiscReason) Error() string {
- return d.String()
- }
- func discReasonForError(err error) DiscReason {
- if reason, ok := err.(DiscReason); ok {
- return reason
- }
- if err == errProtocolReturned {
- return DiscQuitting
- }
- peerError, ok := err.(*peerError)
- if ok {
- switch peerError.code {
- case errInvalidMsgCode, errInvalidMsg:
- return DiscProtocolError
- default:
- return DiscSubprotocolError
- }
- }
- return DiscSubprotocolError
- }
|