| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | package p2p | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	errMagicTokenMismatch = iota | 
					
						
							|  |  |  | 	errRead | 
					
						
							|  |  |  | 	errWrite | 
					
						
							|  |  |  | 	errMisc | 
					
						
							|  |  |  | 	errInvalidMsgCode | 
					
						
							|  |  |  | 	errInvalidMsg | 
					
						
							|  |  |  | 	errP2PVersionMismatch | 
					
						
							|  |  |  | 	errPubkeyInvalid | 
					
						
							|  |  |  | 	errPubkeyForbidden | 
					
						
							|  |  |  | 	errProtocolBreach | 
					
						
							|  |  |  | 	errPingTimeout | 
					
						
							|  |  |  | 	errInvalidNetworkId | 
					
						
							|  |  |  | 	errInvalidProtocolVersion | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | var errorToString = map[int]string{ | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | 	errMagicTokenMismatch:     "magic token mismatch", | 
					
						
							|  |  |  | 	errRead:                   "read error", | 
					
						
							|  |  |  | 	errWrite:                  "write error", | 
					
						
							|  |  |  | 	errMisc:                   "misc error", | 
					
						
							|  |  |  | 	errInvalidMsgCode:         "invalid message code", | 
					
						
							|  |  |  | 	errInvalidMsg:             "invalid message", | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	errP2PVersionMismatch:     "P2P Version Mismatch", | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | 	errPubkeyInvalid:          "public key invalid", | 
					
						
							|  |  |  | 	errPubkeyForbidden:        "public key forbidden", | 
					
						
							|  |  |  | 	errProtocolBreach:         "protocol Breach", | 
					
						
							|  |  |  | 	errPingTimeout:            "ping timeout", | 
					
						
							|  |  |  | 	errInvalidNetworkId:       "invalid network id", | 
					
						
							|  |  |  | 	errInvalidProtocolVersion: "invalid protocol version", | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | type peerError struct { | 
					
						
							|  |  |  | 	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
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | func (self *peerError) Error() string { | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | 	return self.message | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | type DiscReason byte | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | 	DiscRequested DiscReason = iota | 
					
						
							|  |  |  | 	DiscNetworkError | 
					
						
							|  |  |  | 	DiscProtocolError | 
					
						
							|  |  |  | 	DiscUselessPeer | 
					
						
							|  |  |  | 	DiscTooManyPeers | 
					
						
							|  |  |  | 	DiscAlreadyConnected | 
					
						
							|  |  |  | 	DiscIncompatibleVersion | 
					
						
							|  |  |  | 	DiscInvalidIdentity | 
					
						
							|  |  |  | 	DiscQuitting | 
					
						
							|  |  |  | 	DiscUnexpectedIdentity | 
					
						
							|  |  |  | 	DiscSelf | 
					
						
							|  |  |  | 	DiscReadTimeout | 
					
						
							|  |  |  | 	DiscSubprotocolError | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | var discReasonToString = [...]string{ | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +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", | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (d DiscReason) String() string { | 
					
						
							|  |  |  | 	if len(discReasonToString) < int(d) { | 
					
						
							|  |  |  | 		return fmt.Sprintf("Unknown Reason(%d)", d) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return discReasonToString[d] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-12 11:58:39 +01:00
										 |  |  | type discRequestedError DiscReason | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (err discRequestedError) Error() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf("disconnect requested: %v", DiscReason(err)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | func discReasonForError(err error) DiscReason { | 
					
						
							| 
									
										
										
										
											2014-12-12 11:58:39 +01:00
										 |  |  | 	if reason, ok := err.(discRequestedError); ok { | 
					
						
							|  |  |  | 		return DiscReason(reason) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 	peerError, ok := err.(*peerError) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return DiscSubprotocolError | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	switch peerError.Code { | 
					
						
							|  |  |  | 	case errP2PVersionMismatch: | 
					
						
							|  |  |  | 		return DiscIncompatibleVersion | 
					
						
							| 
									
										
										
										
											2015-02-05 03:07:58 +01:00
										 |  |  | 	case errPubkeyInvalid: | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 		return DiscInvalidIdentity | 
					
						
							|  |  |  | 	case errPubkeyForbidden: | 
					
						
							|  |  |  | 		return DiscUselessPeer | 
					
						
							|  |  |  | 	case errInvalidMsgCode, errMagicTokenMismatch, errProtocolBreach: | 
					
						
							|  |  |  | 		return DiscProtocolError | 
					
						
							|  |  |  | 	case errPingTimeout: | 
					
						
							|  |  |  | 		return DiscReadTimeout | 
					
						
							| 
									
										
										
										
											2015-02-07 00:13:22 +01:00
										 |  |  | 	case errRead, errWrite: | 
					
						
							| 
									
										
										
										
											2014-11-21 21:48:49 +01:00
										 |  |  | 		return DiscNetworkError | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return DiscSubprotocolError | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-10-23 16:57:54 +01:00
										 |  |  | } |