peer_error.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package p2p
  2. import (
  3. "fmt"
  4. )
  5. const (
  6. errMagicTokenMismatch = iota
  7. errRead
  8. errWrite
  9. errMisc
  10. errInvalidMsgCode
  11. errInvalidMsg
  12. errP2PVersionMismatch
  13. errPubkeyInvalid
  14. errPubkeyForbidden
  15. errProtocolBreach
  16. errPingTimeout
  17. errInvalidNetworkId
  18. errInvalidProtocolVersion
  19. )
  20. var errorToString = map[int]string{
  21. errMagicTokenMismatch: "magic token mismatch",
  22. errRead: "read error",
  23. errWrite: "write error",
  24. errMisc: "misc error",
  25. errInvalidMsgCode: "invalid message code",
  26. errInvalidMsg: "invalid message",
  27. errP2PVersionMismatch: "P2P Version Mismatch",
  28. errPubkeyInvalid: "public key invalid",
  29. errPubkeyForbidden: "public key forbidden",
  30. errProtocolBreach: "protocol Breach",
  31. errPingTimeout: "ping timeout",
  32. errInvalidNetworkId: "invalid network id",
  33. errInvalidProtocolVersion: "invalid protocol version",
  34. }
  35. type peerError struct {
  36. Code int
  37. message string
  38. }
  39. func newPeerError(code int, format string, v ...interface{}) *peerError {
  40. desc, ok := errorToString[code]
  41. if !ok {
  42. panic("invalid error code")
  43. }
  44. err := &peerError{code, desc}
  45. if format != "" {
  46. err.message += ": " + fmt.Sprintf(format, v...)
  47. }
  48. return err
  49. }
  50. func (self *peerError) Error() string {
  51. return self.message
  52. }
  53. type DiscReason byte
  54. const (
  55. DiscRequested DiscReason = iota
  56. DiscNetworkError
  57. DiscProtocolError
  58. DiscUselessPeer
  59. DiscTooManyPeers
  60. DiscAlreadyConnected
  61. DiscIncompatibleVersion
  62. DiscInvalidIdentity
  63. DiscQuitting
  64. DiscUnexpectedIdentity
  65. DiscSelf
  66. DiscReadTimeout
  67. DiscSubprotocolError
  68. )
  69. var discReasonToString = [...]string{
  70. DiscRequested: "Disconnect requested",
  71. DiscNetworkError: "Network error",
  72. DiscProtocolError: "Breach of protocol",
  73. DiscUselessPeer: "Useless peer",
  74. DiscTooManyPeers: "Too many peers",
  75. DiscAlreadyConnected: "Already connected",
  76. DiscIncompatibleVersion: "Incompatible P2P protocol version",
  77. DiscInvalidIdentity: "Invalid node identity",
  78. DiscQuitting: "Client quitting",
  79. DiscUnexpectedIdentity: "Unexpected identity",
  80. DiscSelf: "Connected to self",
  81. DiscReadTimeout: "Read timeout",
  82. DiscSubprotocolError: "Subprotocol error",
  83. }
  84. func (d DiscReason) String() string {
  85. if len(discReasonToString) < int(d) {
  86. return fmt.Sprintf("Unknown Reason(%d)", d)
  87. }
  88. return discReasonToString[d]
  89. }
  90. type discRequestedError DiscReason
  91. func (err discRequestedError) Error() string {
  92. return fmt.Sprintf("disconnect requested: %v", DiscReason(err))
  93. }
  94. func discReasonForError(err error) DiscReason {
  95. if reason, ok := err.(discRequestedError); ok {
  96. return DiscReason(reason)
  97. }
  98. peerError, ok := err.(*peerError)
  99. if !ok {
  100. return DiscSubprotocolError
  101. }
  102. switch peerError.Code {
  103. case errP2PVersionMismatch:
  104. return DiscIncompatibleVersion
  105. case errPubkeyInvalid:
  106. return DiscInvalidIdentity
  107. case errPubkeyForbidden:
  108. return DiscUselessPeer
  109. case errInvalidMsgCode, errMagicTokenMismatch, errProtocolBreach:
  110. return DiscProtocolError
  111. case errPingTimeout:
  112. return DiscReadTimeout
  113. case errRead, errWrite:
  114. return DiscNetworkError
  115. default:
  116. return DiscSubprotocolError
  117. }
  118. }