| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // 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. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | package p2p | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-02-24 09:58:04 +01:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2015-05-16 00:38:28 +02:00
										 |  |  | 	errInvalidMsgCode = iota | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	errInvalidMsg | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | var errorToString = map[int]string{ | 
					
						
							| 
									
										
										
										
											2015-05-16 00:38:28 +02:00
										 |  |  | 	errInvalidMsgCode: "invalid message code", | 
					
						
							|  |  |  | 	errInvalidMsg:     "invalid message", | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | type peerError struct { | 
					
						
							| 
									
										
										
										
											2015-05-16 00:38:28 +02:00
										 |  |  | 	code    int | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | 	message string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | func newPeerError(code int, format string, v ...interface{}) *peerError { | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | 	desc, ok := errorToString[code] | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		panic("invalid error code") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	err := &peerError{code, desc} | 
					
						
							|  |  |  | 	if format != "" { | 
					
						
							|  |  |  | 		err.message += ": " + fmt.Sprintf(format, v...) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-08 04:08:43 -07:00
										 |  |  | func (pe *peerError) Error() string { | 
					
						
							|  |  |  | 	return pe.message | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 09:58:04 +01:00
										 |  |  | var errProtocolReturned = errors.New("protocol returned") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-17 02:13:32 +02:00
										 |  |  | type DiscReason uint | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | 	DiscRequested DiscReason = iota | 
					
						
							|  |  |  | 	DiscNetworkError | 
					
						
							|  |  |  | 	DiscProtocolError | 
					
						
							|  |  |  | 	DiscUselessPeer | 
					
						
							|  |  |  | 	DiscTooManyPeers | 
					
						
							|  |  |  | 	DiscAlreadyConnected | 
					
						
							|  |  |  | 	DiscIncompatibleVersion | 
					
						
							|  |  |  | 	DiscInvalidIdentity | 
					
						
							|  |  |  | 	DiscQuitting | 
					
						
							|  |  |  | 	DiscUnexpectedIdentity | 
					
						
							|  |  |  | 	DiscSelf | 
					
						
							|  |  |  | 	DiscReadTimeout | 
					
						
							| 
									
										
										
										
											2015-08-12 14:15:54 +02:00
										 |  |  | 	DiscSubprotocolError = 0x10 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | var discReasonToString = [...]string{ | 
					
						
							| 
									
										
										
										
											2017-02-24 09:58:04 +01:00
										 |  |  | 	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", | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (d DiscReason) String() string { | 
					
						
							| 
									
										
										
										
											2021-07-06 15:33:51 +08:00
										 |  |  | 	if len(discReasonToString) <= int(d) { | 
					
						
							| 
									
										
										
										
											2017-02-24 09:58:04 +01:00
										 |  |  | 		return fmt.Sprintf("unknown disconnect reason %d", d) | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return discReasonToString[d] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-08 17:37:11 +02:00
										 |  |  | func (d DiscReason) Error() string { | 
					
						
							|  |  |  | 	return d.String() | 
					
						
							| 
									
										
										
										
											2014-12-12 11:58:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | func discReasonForError(err error) DiscReason { | 
					
						
							| 
									
										
										
										
											2015-04-08 17:37:11 +02:00
										 |  |  | 	if reason, ok := err.(DiscReason); ok { | 
					
						
							|  |  |  | 		return reason | 
					
						
							| 
									
										
										
										
											2014-12-12 11:58:39 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-24 09:58:04 +01:00
										 |  |  | 	if err == errProtocolReturned { | 
					
						
							|  |  |  | 		return DiscQuitting | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	peerError, ok := err.(*peerError) | 
					
						
							| 
									
										
										
										
											2015-05-16 00:38:28 +02:00
										 |  |  | 	if ok { | 
					
						
							|  |  |  | 		switch peerError.code { | 
					
						
							|  |  |  | 		case errInvalidMsgCode, errInvalidMsg: | 
					
						
							|  |  |  | 			return DiscProtocolError | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			return DiscSubprotocolError | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-16 00:38:28 +02:00
										 |  |  | 	return DiscSubprotocolError | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | } |