aboutsummaryrefslogtreecommitdiffstats
path: root/p2p
Commit message (Collapse)AuthorAgeFilesLines
* p2p/simulations: various stability fixes (#15198)Lewis Marshall2017-12-019-56/+148
| | | | | | | | | | | | | | | | | | | | | | | | p2p/simulations: introduce dialBan - Refactor simulations/network connection getters to support avoiding simultaneous dials between two peers If two peers dial simultaneously, the connection will be dropped to help avoid that, we essentially lock the connection object with a timestamp which serves as a ban on dialing for a period of time (dialBanTimeout). - The connection getter InitConn can be wrapped and passed to the nodes via adapters.NodeConfig#Reachable field and then used by the respective services when they initiate connections. This massively stablise the emerging connectivity when running with hundreds of nodes bootstrapping a network. p2p: add Inbound public method to p2p.Peer p2p/simulations: Add server id to logs to support debugging in-memory network simulations when multiple peers are logging. p2p: SetupConn now returns error. The dialer checks the error and only calls resolve if the actual TCP dial fails.
* build: enable unconvert linter (#15456)ferhat elmas2017-11-111-1/+1
| | | | | | | | | * build: enable unconvert linter - fixes #15453 - update code base for failing cases * cmd/puppeth: replace syscall.Stdin with os.Stdin.Fd() for unconvert linter
* p2p/nat: delete port mapping before adding (#15222)Darrel Herbst2017-10-061-0/+1
| | | Fixes #1024
* p2p: snappy encoding for devp2p (version bump to 5) (#15106)Péter Szilágyi2017-09-262-1/+45
| | | | | | * p2p: snappy encoding for devp2p (version bump to 5) * p2p: remove lazy decompression, enforce 16MB limit
* p2p: add network simulation framework (#14982)Lewis Marshall2017-09-2522-14/+4513
| | | | | | This commit introduces a network simulation framework which can be used to run simulated networks of devp2p nodes. The intention is to use this for testing protocols, performing benchmarks and visualising emergent network behaviour.
* p2p: change ping ticker to timer (#15071)Martin Holst Swende2017-09-041-1/+2
| | | | | | Using a Timer over Ticker seems to be a lot better, though I cannot fully account for why that it behaves so (since Ticker should be more bursty, but not necessarily more active over time, but that may depend on how long window it uses to decide on when to tick next)
* discover: Changed Logging from Debug to Info (#14485)Ali Hajimirza2017-05-201-1/+1
|
* cmd/geth: add --config file flag (#13875)Felix Lange2017-04-124-17/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * p2p/discover, p2p/discv5: add marshaling methods to Node * p2p/netutil: make Netlist decodable from TOML * common/math: encode nil HexOrDecimal256 as 0x0 * cmd/geth: add --config file flag * cmd/geth: add missing license header * eth: prettify Config again, fix tests * eth: use gasprice.Config instead of duplicating its fields * eth/gasprice: hide nil default from dumpconfig output * cmd/geth: hide genesis block in dumpconfig output * node: make tests compile * console: fix tests * cmd/geth: make TOML keys look exactly like Go struct fields * p2p: use discovery by default This makes the zero Config slightly more useful. It also fixes package node tests because Node detects reuse of the datadir through the NodeDatabase. * cmd/geth: make ethstats URL settable through config file * cmd/faucet: fix configuration * cmd/geth: dedup attach tests * eth: add comment for DefaultConfig * eth: pass downloader.SyncMode in Config This removes the FastSync, LightSync flags in favour of a more general SyncMode flag. * cmd/utils: remove jitvm flags * cmd/utils: make mutually exclusive flag error prettier It now reads: Fatal: flags --dev, --testnet can't be used at the same time * p2p: fix typo * node: add DefaultConfig, use it for geth * mobile: add missing NoDiscovery option * cmd/utils: drop MakeNode This exposed a couple of places that needed to be updated to use node.DefaultConfig. * node: fix typo * eth: make fast sync the default mode * cmd/utils: remove IPCApiFlag (unused) * node: remove default IPC path Set it in the frontends instead. * cmd/geth: add --syncmode * cmd/utils: make --ipcdisable and --ipcpath mutually exclusive * cmd/utils: don't enable WS, HTTP when setting addr * cmd/utils: fix --identity
* p2p: if no nodes are connected, attempt dialing bootnodes (#13874)Péter Szilágyi2017-04-113-9/+121
|
* p2p, p2p/discover, p2p/nat: rework logging using context keysFelix Lange2017-02-2811-151/+171
|
* all: disable log message colors outside of gethFelix Lange2017-02-271-1/+1
| | | | Also tweak behaviour so colors are only enabled when stderr is a terminal.
* all: blidly swap out glog to our log15, logs need reworkPéter Szilágyi2017-02-2314-140/+118
|
* p2p: remove trailing newlines from log messagesPéter Szilágyi2017-02-235-19/+19
|
* crypto: add btcec fallback for sign/recover without cgo (#3680)Felix Lange2017-02-184-35/+4
| | | | | | | | | | | * vendor: add github.com/btcsuite/btcd/btcec * crypto: add btcec fallback for sign/recover without cgo This commit adds a non-cgo fallback implementation of secp256k1 operations. * crypto, core/vm: remove wrappers for sha256, ripemd160
* all: fix ineffectual assignments and remove uses of crypto.Sha3Felix Lange2017-01-091-3/+3
| | | | | go get github.com/gordonklaus/ineffassign ineffassign .
* all: fix spelling errorsPéter Szilágyi2017-01-072-2/+2
|
* logger, pow/dagger, pow/ezp: delete dead codeFelix Lange2017-01-071-12/+0
|
* all: fix issues reported by honnef.co/go/simple/cmd/gosimpleFelix Lange2017-01-074-10/+4
|
* all: gofmt -w -sFelix Lange2017-01-0610-38/+38
|
* p2p/nat: fix a bytes based net.IP comparisonPéter Szilágyi2016-12-151-2/+1
|
* p2p/discover, p2p/discv5: use flexible comparison for IPsPéter Szilágyi2016-12-154-5/+4
|
* p2p/discv5: search and lookup improvementZsolt Felfoldi2016-12-082-64/+99
|
* p2p, p2p/discover, p2p/discv5: add IP network restriction featureFelix Lange2016-11-239-34/+124
| | | | | | The p2p packages can now be configured to restrict all communication to a certain subset of IP networks. This feature is meant to be used for private networks.
* p2p/discover, p2p/discv5: prevent relay of invalid IPs and low portsFelix Lange2016-11-236-28/+56
| | | | | | | | | | | | | | | | | | | | | The discovery DHT contains a number of hosts with LAN and loopback IPs. These get relayed because some implementations do not perform any checks on the IP. go-ethereum already prevented relay in most cases because it verifies that the host actually exists before adding it to the local table. But this verification causes other issues. We have received several reports where people's VPSs got shut down by hosting providers because sending packets to random LAN hosts is indistinguishable from a slow port scan. The new check prevents sending random packets to LAN by discarding LAN IPs sent by Internet hosts (and loopback IPs from LAN and Internet hosts). The new check also blacklists almost all currently registered special-purpose networks assigned by IANA to avoid inciting random responses from services in the LAN. As another precaution against abuse of the DHT, ports below 1024 are now considered invalid.
* p2p/discover, p2p/discv5: use netutil.IsTemporaryErrorFelix Lange2016-11-238-248/+2
|
* p2p/netutil: new package for network utilitiesFelix Lange2016-11-236-0/+503
| | | | | | | | The new package contains three things for now: - IP network list parsing and matching - The WSAEMSGSIZE workaround, which is duplicated in p2p/discover and p2p/discv5.
* cmd, mobile, node, p2p: surface the discovery V5 bootnodesPéter Szilágyi2016-11-152-13/+13
|
* mobile: initial wrappers for mobile supportPéter Szilágyi2016-11-142-3/+3
|
* p2p/discv5: added new bootnodesZsolt Felfoldi2016-11-141-1/+2
|
* p2p/discv5: fixed bootnode connect issuesZsolt Felfoldi2016-11-144-67/+107
|
* discv5: fixed state machine lockup bugZsolt Felfoldi2016-11-111-0/+3
|
* all: update license informationFelix Lange2016-11-098-8/+8
|
* p2p/discv5: fix build with Go 1.5, delete package testimgFelix Lange2016-11-095-879/+18
|
* p2p/discv5: added new topic discovery packageZsolt Felfoldi2016-11-0926-0/+7906
|
* Merge pull request #2914 from fjl/node-coinhabitFelix Lange2016-09-291-5/+1
|\ | | | | cmd/utils, node: make datadir reusable for bzzd
| * p2p/nat: delay auto discovery until first useFelix Lange2016-09-161-5/+1
| | | | | | | | | | | | | | | | | | Port mapper auto discovery used to run immediately after parsing the --nat flag, giving it a slight performance boost. But this is becoming inconvenient because we create node.Node for all geth operations including account management and bare chain interaction. Delay autodiscovery until the first use instead, which avoids any network interaction until the node is actually started.
* | p2p/nat: fix parameter order for AddMappingken101001472016-09-281-2/+2
|/
* Merge pull request #2740 from Firescar96/removepeerFelix Lange2016-07-293-0/+27
|\ | | | | node, p2p, internal: Add ability to remove peers via admin interface
| * node, p2p, internal: Add ability to remove peers via admin interfaceFirescar962016-07-153-0/+27
| |
* | ethdb, p2p/discover: replace "alloted" with "allotted" (#2785)villesundell2016-07-121-1/+1
|/
* node, p2p: move network config out of ServerFelix Lange2016-05-183-23/+33
| | | | This silences a go vet message about copying p2p.Server in package node.
* p2p/discover: prevent bonding selfFelix Lange2016-05-031-0/+4
|
* p2p: improve readability of dial task scheduling codeFelix Lange2016-05-032-29/+78
|
* all: fix go vet warningsFelix Lange2016-04-154-8/+8
|
* p2p: enable EIP-8 handshake sendingFelix Lange2016-04-041-9/+1
| | | | | With the Ethereum Homestead fork is now behind us, we can assume that everyone runs an EIP-8 capable client.
* p2p/nat: fix #2291, NAT discovery did't abort on failurePéter Szilágyi2016-03-141-0/+1
|
* Merge pull request #2242 from jimenezrick/upstream-cryptoJeffrey Wilcke2016-02-248-19/+19
|\ | | | | Closes #2241: Use Keccak-256 from golang.org/x/crypto/sha3 and mention explicitly
| * all: Rename crypto.Sha3{,Hash}() to crypto.Keccak256{,Hash}()Ricardo Catalinas Jiménez2016-02-228-19/+19
| | | | | | | | As we aren't really using the standarized SHA-3
* | p2p/discover: emphasize warning, add 10 min cooldownPéter Szilágyi2016-02-242-18/+39
| |
* | psp/discovery: NTP sanity check clock drift in case of expirationsPéter Szilágyi2016-02-242-4/+128
|/
* p2p: EIP-8 changesFelix Lange2016-02-194-149/+443
|
* p2p/discover: EIP-8 changesFelix Lange2016-02-192-1/+122
|
* p2p/discover: fix Windows-specific issue for larger-than-buffer packetsFelix Lange2016-01-234-7/+124
| | | | | | | | | | On Windows, UDPConn.ReadFrom returns an error for packets larger than the receive buffer. The error is not marked temporary, causing our loop to exit when the first oversized packet arrived. The fix is to treat this particular error as temporary. Fixes: #1579, #2087 Updates: #2082
* p2p/discover: attempt to deflake TestUDP_responseTimeoutsFelix Lange2015-12-181-1/+2
| | | | | The test expected the timeout to fire after a matcher for the response was added, but the timeout is random and fired sooner sometimes.
* p2p: resolve incomplete dial targetsFelix Lange2015-12-182-63/+175
| | | | | | This change makes it possible to add peers without providing their IP address. The endpoint of the target node is resolved using the discovery protocol.
* p2p, p2p/discover: track bootstrap state in p2p/discoverFelix Lange2015-12-186-91/+110
| | | | | | This change simplifies the dial scheduling logic because it no longer needs to track whether the discovery table has been bootstrapped.
* p2p/discover: support incomplete node URLs, add ResolveFelix Lange2015-12-187-54/+158
|
* p2p: always allow dynamic dials if network not disabledPéter Szilágyi2015-12-031-1/+1
|
* crypto, crypto/ecies, crypto/secp256k1: libsecp256k1 scalar multGustav Simonsson2015-11-303-3/+5
| | | | thanks to Felix Lange (fjl) for help with design & impl
* node: customizable protocol and service stacksPéter Szilágyi2015-11-274-13/+20
|
* Merge pull request #1934 from karalabe/polish-protocol-infosJeffrey Wilcke2015-11-043-1/+123
|\ | | | | eth, p2p, rpc/api: polish protocol info gathering
| * eth, p2p, rpc/api: polish protocol info gatheringPéter Szilágyi2015-10-283-1/+123
| |
* | p2p/nat: add docs for discoverFelix Lange2015-10-301-0/+3
| |
* | Godeps: upgrade github.com/huin/goupnp to 90f71cb5Felix Lange2015-10-301-1/+6
|/
* p2p/discover: ignore packet version numbersFelix Lange2015-09-302-5/+0
| | | | The strict matching can get in the way of protocol upgrades.
* p2p/discover: remove unused lastLookup fieldFelix Lange2015-09-301-6/+1
|
* p2p/discover: fix race involving the seed node iteratorFelix Lange2015-09-305-172/+198
| | | | | | | | | | | | | | | | | | | nodeDB.querySeeds was not safe for concurrent use but could be called concurrenty on multiple goroutines in the following case: - the table was empty - a timed refresh started - a lookup was started and initiated refresh These conditions are unlikely to coincide during normal use, but are much more likely to occur all at once when the user's machine just woke from sleep. The root cause of the issue is that querySeeds reused the same leveldb iterator until it was exhausted. This commit moves the refresh scheduling logic into its own goroutine (so only one refresh is ever active) and changes querySeeds to not use a persistent iterator. The seed node selection is now more random and ignores nodes that have not been contacted in the last 5 days.
* eth, metrics, p2p: prepare metrics and net packets to eth/62Péter Szilágyi2015-08-211-1/+7
|
* Merge pull request #1694 from obscuren/hide-fdtrackJeffrey Wilcke2015-08-204-11/+5
|\ | | | | fdtrack: hide message
| * Revert "fdtrack: temporary hack for tracking file descriptor usage"Jeffrey Wilcke2015-08-204-11/+5
| | | | | | | | This reverts commit 5c949d3b3ba81ea0563575b19a7b148aeac4bf61.
* | p2p/discover: don't attempt to replace nodes that are being replacedFelix Lange2015-08-192-4/+15
| | | | | | | | | | | | | | | | PR #1621 changed Table locking so the mutex is not held while a contested node is being pinged. If multiple nodes ping the local node during this time window, multiple ping packets will be sent to the contested node. The changes in this commit prevent multiple packets by tracking whether the node is being replaced.
* | p2p: continue listening after temporary errorsFelix Lange2015-08-191-6/+25
| |
* | p2p/discover: continue reading after temporary errorsFelix Lange2015-08-191-1/+11
|/ | | | Might solve #1579
* Merge pull request #1470 from ebuchman/encHandshakeFelix Lange2015-08-131-4/+12
|\ | | | | p2p: validate recovered ephemeral pubkey
| * p2p: validate recovered ephemeral pubkey against checksum in decodeAuthMsgEthan Buchman2015-07-141-4/+12
| |
* | p2p: fix value of DiscSubprotocolErrorFelix Lange2015-08-121-1/+1
| | | | | | | | We had the wrong value (12) since forever.
* | p2p/discover: fix UDP reply packet timeout handlingFelix Lange2015-08-112-31/+120
| | | | | | | | | | | | | | | | | | | | | | | | If the timeout fired (even just nanoseconds) before the deadline of the next pending reply, the timer was not rescheduled. The timer would've been rescheduled anyway once the next packet was sent, but there were cases where no next packet could ever be sent due to the locking issue fixed in the previous commit. As timing-related bugs go, this issue had been present for a long time and I could never reproduce it. The test added in this commit did reproduce the issue on about one out of 15 runs.
* | p2p/discover: unlock the table during ping replacementFelix Lange2015-08-113-52/+77
| | | | | | | | | | | | Table.mutex was being held while waiting for a reply packet, which effectively made many parts of the whole stack block on that packet, including the net_peerCount RPC call.
* | p2p/nat: disable UPnP test on windowsFelix Lange2015-08-061-0/+5
| |
* | p2p/discover: close Table during testingFelix Lange2015-08-062-4/+8
| | | | | | | | Not closing the table used to be fine, but now the table has a database.
* | fdtrack: temporary hack for tracking file descriptor usageFelix Lange2015-08-044-5/+11
| | | | | | | | | | Package fdtrack logs statistics about open file descriptors. This should help identify the source of #1549.
* | all: fix license headers one more timeFelix Lange2015-07-2426-26/+26
| | | | | | | | I forgot to update one instance of "go-ethereum" in commit 3f047be5a.
* | all: update license headers to distiguish GPL/LGPLFelix Lange2015-07-2326-104/+104
|/ | | | | All code outside of cmd/ is licensed as LGPL. The headers now reflect this by calling the whole work "the go-ethereum library".
* all: add some godoc synopsis commentsFelix Lange2015-07-072-1/+2
|
* all: update license informationFelix Lange2015-07-0726-0/+416
|
* cmd, core, eth, metrics, p2p: require enabling metricsPéter Szilágyi2015-06-301-5/+5
|
* p2p: fix local/remote cap/protocol mixupPéter Szilágyi2015-06-271-23/+23
|
* p2p: support protocol version negotiationPéter Szilágyi2015-06-263-6/+110
|
* p2p: instrument P2P networking layerPéter Szilágyi2015-06-243-3/+56
|
* p2p: throttle all discovery lookupsFelix Lange2015-06-222-15/+16
| | | | | | | | | | | | | | Lookup calls would spin out of control when network connectivity was lost. The throttling that was in place only took effect when the table returned zero results, which doesn't happen very often. The new throttling should not have a negative impact when the host is online. Lookups against the network take some time and dials for all results must complete or hit the cache before a new one is started. This usually takes longer than four seconds, leaving online lookups unaffected. Fixes #1296
* p2p: improve disconnect loggingFelix Lange2015-06-152-6/+7
|
* p2p: track write errors and prevent writes during shutdownFelix Lange2015-06-151-25/+57
| | | | | | | As of this commit, we no longer rely on the protocol handler to report write errors in a timely fashion. When a write fails, shutdown is initiated immediately and no new writes can start. This will also prevent new writes from starting after Server.Stop has been called.
* p2p/discover: use separate rand.Source instances in testsFelix Lange2015-06-102-15/+19
| | | | rand.Source isn't safe for concurrent use.
* p2p/discover: deflake TestUDP_successfulPingFelix Lange2015-06-102-33/+30
|
* p2p: fix a close race in the dial testPéter Szilágyi2015-06-101-1/+2
|
* p2p: bump global write timeout to 20sFelix Lange2015-06-091-1/+1
| | | | | The previous value of 5 seconds causes timeouts for legitimate messages if large messages are sent.
* p2p: fix close data racePéter Szilágyi2015-06-091-0/+1
|
* p2p/nat: add timeout for UPnP SOAP requestsFelix Lange2015-06-051-0/+3
|
* p2p/nat: bump timeout in TestAutoDiscRaceFelix Lange2015-05-281-1/+1
|
* p2p/discover: bond with seed nodes too (runs only if findnode failed)Péter Szilágyi2015-05-271-7/+4
|
* p2p/discovery: fix a cornercase loop if no seeds or bootnodes are knownPéter Szilágyi2015-05-271-5/+9
|
* p2p/discover: force refresh if the table is emptyPéter Szilágyi2015-05-271-13/+41
|
* p2p/discover: permit temporary bond failures for previously known nodesPéter Szilágyi2015-05-271-12/+15
|
* p2p/discover: watch find failures, evacuate on too many, rebond if failedPéter Szilágyi2015-05-271-8/+47
|
* p2p/discover: add support for counting findnode failuresPéter Szilágyi2015-05-272-3/+25
|
* p2p: fix Self() panic if listening is disabledPéter Szilágyi2015-05-271-0/+9
|
* cmd/geth, cmd/utils, eth, p2p: pass and honor a no discovery flagPéter Szilágyi2015-05-271-8/+29
|
* eth, p2p: start the p2p server even if maxpeers == 0Péter Szilágyi2015-05-261-3/+0
|
* p2p: decrease frameReadTimeout to 30sFelix Lange2015-05-251-4/+5
| | | | | This detects hanging connections sooner. We send a ping every 15s and other implementation have similar limits.
* p2p: new dialer, peer management without locksFelix Lange2015-05-2511-1329/+2118
| | | | | | | | | | | | | | | | | | The most visible change is event-based dialing, which should be an improvement over the timer-based system that we have at the moment. The dialer gets a chance to compute new tasks whenever peers change or dials complete. This is better than checking peers on a timer because dials happen faster. The dialer can now make more precise decisions about whom to dial based on the peer set and we can test those decisions without actually opening any sockets. Peer management is easier to test because the tests can inject connections at checkpoints (after enc handshake, after protocol handshake). Most of the handshake stuff is now part of the RLPx code. It could be exported or move to its own package because it is no longer entangled with Server logic.
* p2p/discover: add ReadRandomNodesFelix Lange2015-05-252-1/+83
|
* p2p: decrease maximum message size for devp2p to 1kBFelix Lange2015-05-251-1/+1
| | | | | | The previous limit was 10MB which is unacceptable for all kinds of reasons, the most important one being that we don't want to allow the remote side to make us allocate 10MB at handshake time.
* p2p: delete Server.BroadcastFelix Lange2015-05-254-136/+0
|
* p2p/discover: fix #838, evacuate self entries from the node dbPéter Szilágyi2015-05-223-25/+99
|
* p2p/discover: fix database presistency test folderPéter Szilágyi2015-05-221-3/+3
|
* Merge pull request #971 from fjl/p2p-limit-tweaksJeffrey Wilcke2015-05-147-64/+16
|\ | | | | p2p: tweak connection limits
| * p2p/discover: limit open files for node databaseFelix Lange2015-05-141-2/+3
| |
| * p2p: remove testlogFelix Lange2015-05-143-51/+0
| |
| * p2p/discover: bump maxBondingPingPongs to 16Felix Lange2015-05-141-1/+1
| | | | | | | | | | This should increase the speed a bit because all findnode results (up to 16) can be verified at the same time.
| * p2p: log remote reason when disconnect is requestedFelix Lange2015-05-142-8/+10
| | | | | | | | | | | | The returned reason is currently not used except for the log message. This change makes the log messages a bit more useful. The handshake code also returns the remote reason.
| * p2p: bump maxAcceptConns and defaultDialTimoutFelix Lange2015-05-141-2/+2
| | | | | | | | | | On the test network, we've seen that it becomes harder to connect if the queues are so short.
* | p2p/nat: tweak port mapping log messages and levelsFelix Lange2015-05-141-7/+6
| | | | | | | | | | | | People stil get confused about the messages. This commit changes the levels so that the only thing printed at the default level (info) is a successful mapping.
* | p2p/nat: add test for UPnP auto discovery via SSDPFelix Lange2015-05-141-0/+223
| | | | | | | | | | | | | | | | | | The test listens for multicast UDP packets on the default interface because I couldn't get it to work reliably on loopback without massive changes to goupnp. This means that the test might fail when there is a UPnP-enabled router attached on that interface. I checked that locally by looping the test and it passes reliably because the local SSDP server always responds faster.
* | p2p/nat: fix concurrent access to autodisc InterfaceFelix Lange2015-05-142-17/+63
|/ | | | | | | | | | | | Concurrent calls to Interface methods on autodisc could return a "not discovered" error if the discovery did not finish before the call. autodisc.wait expected the done channel to carry the found Interface but it was closed instead. The fix is to use sync.Once for now, which is easier to get right. And there is a test. Finally. This will have to change again when we introduce re-discovery.
* p2p/discover: fix out-of-bounds slicing for chunked neighbors packetsFelix Lange2015-05-142-32/+49
| | | | | The code assumed that Table.closest always returns at least 13 nodes. This is not true for small tables (e.g. during bootstrap).
* fix test.subtly2015-05-141-1/+1
|
* Manual send of multiple neighbours packets. Test receiving multiple ↵subtly2015-05-142-3/+19
| | | | neighbours packets.
* UDP Interop. Limit datagrams to 1280bytes.subtly2015-05-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We don't have a UDP which specifies any messages that will be 4KB. Aside from being implemented for months and a necessity for encryption and piggy-backing packets, 1280bytes is ideal, and, means this TODO can be completed! Why 1280 bytes? * It's less than the default MTU for most WAN/LAN networks. That means fewer fragmented datagrams (esp on well-connected networks). * Fragmented datagrams and dropped packets suck and add latency while OS waits for a dropped fragment to never arrive (blocking readLoop()) * Most of our packets are < 1280 bytes. * 1280 bytes is minimum datagram size and MTU for IPv6 -- on IPv6, a datagram < 1280bytes will *never* be fragmented. UDP datagrams are dropped. A lot! And fragmented datagrams are worse. If a datagram has a 30% chance of being dropped, then a fragmented datagram has a 60% chance of being dropped. More importantly, we have signed packets and can't do anything with a packet unless we receive the entire datagram because the signature can't be verified. The same is true when we have encrypted packets. So the solution here to picking an ideal buffer size for receiving datagrams is a number under 1400bytes. And the lower-bound value for IPv6 of 1280 bytes make's it a non-decision. On IPv4 most ISPs and 3g/4g/let networks have an MTU just over 1400 -- and *never* over 1500. Never -- that means packets over 1500 (in reality: ~1450) bytes are fragmented. And probably dropped a lot. Just to prove the point, here are pings sending non-fragmented packets over wifi/ISP, and a second set of pings via cell-phone tethering. It's important to note that, if *any* router between my system and the EC2 node has a lower MTU, the message would not go through: On wifi w/normal ISP: localhost:Debug $ ping -D -s 1450 52.6.250.242 PING 52.6.250.242 (52.6.250.242): 1450 data bytes 1458 bytes from 52.6.250.242: icmp_seq=0 ttl=42 time=104.831 ms 1458 bytes from 52.6.250.242: icmp_seq=1 ttl=42 time=119.004 ms ^C --- 52.6.250.242 ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 104.831/111.918/119.004/7.087 ms localhost:Debug $ ping -D -s 1480 52.6.250.242 PING 52.6.250.242 (52.6.250.242): 1480 data bytes ping: sendto: Message too long ping: sendto: Message too long Request timeout for icmp_seq 0 ping: sendto: Message too long Request timeout for icmp_seq 1 Tethering to O2: localhost:Debug $ ping -D -s 1480 52.6.250.242 PING 52.6.250.242 (52.6.250.242): 1480 data bytes ping: sendto: Message too long ping: sendto: Message too long Request timeout for icmp_seq 0 ^C --- 52.6.250.242 ping statistics --- 2 packets transmitted, 0 packets received, 100.0% packet loss localhost:Debug $ ping -D -s 1450 52.6.250.242 PING 52.6.250.242 (52.6.250.242): 1450 data bytes 1458 bytes from 52.6.250.242: icmp_seq=0 ttl=42 time=107.844 ms 1458 bytes from 52.6.250.242: icmp_seq=1 ttl=42 time=105.127 ms 1458 bytes from 52.6.250.242: icmp_seq=2 ttl=42 time=120.483 ms 1458 bytes from 52.6.250.242: icmp_seq=3 ttl=42 time=102.136 ms
* removed redundant newlines in import blockBas van Kervel2015-05-121-1/+1
|
* replaced several path.* with filepath.* which is platform independentBas van Kervel2015-05-121-2/+2
|
* p2p: drop connections with no matching protocolsFelix Lange2015-05-082-4/+21
|
* p2p: use maxDialingConns instead of maxAcceptConns as dial limitFelix Lange2015-05-081-1/+1
|
* p2p: fix disconnect at capacityFelix Lange2015-05-084-33/+46
| | | | | | | With the introduction of static/trusted nodes, the peer count can go above MaxPeers. Update the capacity check to handle this. While here, decouple the trusted nodes check from the handshake by passing a function instead.
* p2p: increase the handshake timeout in the testsPéter Szilágyi2015-05-071-2/+2
|
* cmd, eth, p2p: introduce pending peer cli arg, add testsPéter Szilágyi2015-05-072-7/+148
|
* p2p: reduce the concurrent handshakes to 10/10 in/outPéter Szilágyi2015-05-071-2/+2
|
* p2p: fix dial throttling race conditionPéter Szilágyi2015-05-071-1/+1
|
* p2p: fix a dialing race in the throttlerPéter Szilágyi2015-05-071-1/+1
|
* p2p: limit the outbound dialing tooPéter Szilágyi2015-05-071-1/+11
|
* Merge pull request #866 from fjl/p2p-last-minuteJeffrey Wilcke2015-05-074-19/+16
|\ | | | | Last minute p2p fixes
| * p2p: stop dialing at half the maximum peer countFelix Lange2015-05-071-1/+1
| |
| * p2p, whisper: use glog for peer-level loggingFelix Lange2015-05-071-13/+8
| |
| * p2p/discover: bump packet timeouts to 500msFelix Lange2015-05-071-2/+2
| |
| * p2p/nat: less confusing error loggingFelix Lange2015-05-071-3/+5
| |
* | fixed merge issueobscuren2015-05-074-30/+263
|\ \ | |/ |/|
| * eth, p2p: add trusted node list beside static listPéter Szilágyi2015-05-044-39/+47
| |
| * p2p: add static node dialing testPéter Szilágyi2015-05-042-13/+108
| |
| * p2p: correct a leftover trusted -> staticPéter Szilágyi2015-05-011-4/+4
| |
| * eth, p2p: rename trusted nodes to static, drop inbound extra slotsPéter Szilágyi2015-05-014-46/+48
| |
| * cmd, eth, p2p: fix review issues enumerated by FelixPéter Szilágyi2015-04-302-21/+12
| |
| * p2p: add trust check to handshake, test privileged connectivityPéter Szilágyi2015-04-304-15/+88
| | | | | | | | | | Conflicts: p2p/server_test.go
| * p2p: reduce the severity of a debug logPéter Szilágyi2015-04-301-1/+1
| |
| * cmd/geth, cmd/mist, cmd/utils, eth, p2p: support trusted peersPéter Szilágyi2015-04-302-14/+78
| |
* | p2p/discover: new distance metric based on sha3(id)Felix Lange2015-05-066-106/+354
| | | | | | | | | | | | | | The previous metric was pubkey1^pubkey2, as specified in the Kademlia paper. We missed that EC public keys are not uniformly distributed. Using the hash of the public keys addresses that. It also makes it a bit harder to generate node IDs that are close to a particular node.
* | p2p/discover: track sha3(ID) in NodeFelix Lange2015-04-308-99/+166
| |
* | p2p, p2p/discover: protocol version 4Felix Lange2015-04-302-2/+2
| |
* | p2p/discover: new endpoint formatFelix Lange2015-04-3010-127/+158
|/ | | | | | This commit changes the discovery protocol to use the new "v4" endpoint format, which allows for separate UDP and TCP ports and makes it possible to discover the UDP address after NAT.
* p2p: added received at to peer messageobscuren2015-04-302-3/+5
| | | | | p2p.Msg.ReceivedAt can be used for determining block propagation from begining to end.
* p2p/discover: fix api issues caused by leveldb updatePéter Szilágyi2015-04-281-4/+6
|
* p2p/discover: fix goroutine leak due to blocking on sync.OncePéter Szilágyi2015-04-282-13/+24
|
* p2p/discover: add node expirer and related testsPéter Szilágyi2015-04-273-4/+116
|
* p2p/discover: parametrize nodedb version, add persistency testsPéter Szilágyi2015-04-273-11/+62
|
* p2p/discover: drop a superfluous warningPéter Szilágyi2015-04-271-1/+1
|
* p2p/discover: wrap the pinger to update the node db tooPéter Szilágyi2015-04-271-4/+15
|
* p2p/discover: use iterator based seeding, drop old protocol testPéter Szilágyi2015-04-272-45/+118
|
* p2p/discover: write the basic tests, catch RLP bugPéter Szilágyi2015-04-273-8/+150
|
* p2p/discovery: fix issues raised in the nodeDb PRPéter Szilágyi2015-04-272-36/+32
|
* cmd/bootnode, eth, p2p, p2p/discover: use a fancier db designPéter Szilágyi2015-04-247-160/+277
|
* cmd/bootnode, eth, p2p, p2p/discover: clean up the seeder and mesh into eth.Péter Szilágyi2015-04-247-140/+157
|
* p2p/discovery: fix broken tests due to API updatePéter Szilágyi2015-04-242-4/+4
|
* p2p/discovery: use the seed table for finding nodes, auto drop stale onesPéter Szilágyi2015-04-242-5/+38
|
* cmd, eth, p2p, p2p/discover: init and clean up the seed cachePéter Szilágyi2015-04-244-8/+26
|
* p2p/discover: store nodes in leveldbFelix Lange2015-04-242-13/+73
|
* p2p: return zero node from Self if the server is not runningFelix Lange2015-04-221-1/+6
| | | | This helps with fixing the tests for cmd/geth to run without networking.
* p2p: make DiscReason bigger than byteFelix Lange2015-04-171-1/+1
| | | | | We decode into [1]DiscReason in a few places. That doesn't work anymore because package rlp no longer accepts RLP lists for byte arrays.
* p2p/discover: use rlp.DecodeBytesFelix Lange2015-04-171-1/+1
|
* cmd/rlpdump, cmd/utils, eth, p2p, whisper: use rlp input limitFelix Lange2015-04-171-1/+2
|
* p2p: fix the dial timerFelix Lange2015-04-171-3/+8
| | | | | The dial timer was not reset properly when the peer count reached MaxPeers.
* p2p: added limiter function to limit package broadcastingobscuren2015-04-141-0/+13
|
* p2p/discover: improve timer handling for reply timeoutsFelix Lange2015-04-141-2/+3
|
* p2p/discover: remove unused field Node.activeStampFelix Lange2015-04-132-16/+0
|
* p2p: fix unsynchronized map access during Server shutdownFelix Lange2015-04-131-0/+2
| | | | removePeer can be called even after listenLoop and dialLoop have returned.
* p2p: fix yet another disconnect hangFelix Lange2015-04-131-22/+8
| | | | | | | | | Peer.readLoop will only terminate if the connection is closed. Fix the hang by closing the connection before waiting for readLoop to terminate. This also removes the british disconnect procedure where we're waiting for the remote end to close the connection. I have confirmed with @subtly that cpp-ethereum doesn't adhere to it either.
* p2p: fix goroutine leak when handshake read failsFelix Lange2015-04-131-1/+1
| | | | This regression was introduced in b3c058a9e4e9.
* p2p: limit number of lingering inbound pre-handshake connectionsFelix Lange2015-04-101-1/+19
| | | | | | | This is supposed to apply some back pressure so Server is not accepting more connections than it can actually handle. The current limit is 50. This doesn't really need to be configurable, but we'll see how it behaves in our test nodes and adjust accordingly.
* p2p: use RLock instead of Lock for pre-dial checksFelix Lange2015-04-101-10/+12
|
* p2p: improve disconnect signaling at handshake timeFelix Lange2015-04-104-35/+111
| | | | | | | As of this commit, p2p will disconnect nodes directly after the encryption handshake if too many peer connections are active. Errors in the protocol handshake packet are now handled more politely by sending a disconnect packet before closing the connection.
* p2p: don't mess with the socket deadline in Peer.readLoopFelix Lange2015-04-101-1/+0
| | | | netWrapper already sets a read deadline in ReadMsg.
* p2p: properly decrement peer wait group counter for setup errorsFelix Lange2015-04-101-0/+11
|
* p2p: fix Peer shutdown deadlocksFelix Lange2015-04-104-78/+139
| | | | | | | | | | There were multiple synchronization issues in the disconnect handling, all caused by the odd special-casing of Peer.readLoop errors. Remove the special handling of read errors and make readLoop part of the Peer WaitGroup. Thanks to @Gustav-Simonsson for pointing at arrows in a diagram and playing rubber-duck.
* p2p: improve peer selection logicFelix Lange2015-04-101-56/+61
| | | | | | | This commit introduces a new (temporary) peer selection strategy based on random lookups. While we're here, also implement the TODOs in dialLoop.
* p2p/discover: don't log packet contentFelix Lange2015-04-101-3/+4
|
* p2p/discover: make packet processing less concurrentFelix Lange2015-04-101-6/+4
|
* Updated loggingobscuren2015-04-073-29/+27
|
* p2p/discover: fix off by one error causing buckets to contain duplicatesFelix Lange2015-04-012-1/+43
|
* p2p/discover: implement node bondingFelix Lange2015-04-015-383/+649
| | | | | | | | | | | | | | | | This a fix for an attack vector where the discovery protocol could be used to amplify traffic in a DDOS attack. A malicious actor would send a findnode request with the IP address and UDP port of the target as the source address. The recipient of the findnode packet would then send a neighbors packet (which is 16x the size of findnode) to the victim. Our solution is to require a 'bond' with the sender of findnode. If no bond exists, the findnode packet is not processed. A bond between nodes α and β is created when α replies to a ping from β. This (initial) version of the bonding implementation might still be vulnerable against replay attacks during the expiration time window. We will add stricter source address validation later.
* p2p/discover: add version number to ping packetFelix Lange2015-04-011-0/+8
| | | | | | The primary motivation for doing this right now is that old PoC 8 nodes and newer PoC 9 nodes keep discovering each other, causing handshake failures.
* fix p2p/testlog_testzelig2015-03-241-5/+2
|
* Merge branch 'develop' into conversionobscuren2015-03-212-3/+3
|\
| * %#x => %xobscuren2015-03-202-3/+3
| |
* | p2p: interrupt MsgPipe payload read/writeFelix Lange2015-03-191-3/+6
| | | | | | | | | | | | This is better because protocols might not actually read the payload for some errors (msg too big, etc.) which can be a pain to test with the old behaviour.
* | p2p: log disconnect requestsFelix Lange2015-03-191-0/+1
| | | | | | | | This helps a lot with debugging.
* | p2p: use package rlp to encode messagesFelix Lange2015-03-198-68/+64
| | | | | | | | | | | | | | | | | | | | Message encoding functions have been renamed to catch any uses. The switch to the new encoder can cause subtle incompatibilities. If there are any users outside of our tree, they will at least be alerted that there was a change. NewMsg no longer exists. The replacements for EncodeMsg are called Send and SendItems.
* | p2p: export ExpectMsg (for eth protocol testing)Felix Lange2015-03-192-32/+32
|/
* Merge branch 'frontier/js' into frontier/nodeadmin.jszelig2015-03-162-5/+5
|\
| * Moved ethutil => commonobscuren2015-03-162-5/+5
| |
* | p2p: server>discover table Self=Node exportedzelig2015-03-152-8/+12
|/
* Move MakeName to ethutilTaylor Gerring2015-03-121-9/+1
|
* eth, p2p: delete p2p.BlacklistFelix Lange2015-03-041-59/+0
| | | | | It is unused and untested right now. We can bring it back later if required.
* p2p: reject messages that cannot be written as simple RLPx framesFelix Lange2015-03-041-0/+5
| | | | | Until chunked frames are implemented we cannot send messages with a size overflowing uint24.
* p2p: restore read/write timeoutsFelix Lange2015-03-045-37/+37
| | | | They got lost in the transition to rlpxFrameRW.
* p2p: msg.Payload contains list dataFelix Lange2015-03-047-75/+25
| | | | | | | | | With RLPx frames, the message code is contained in the frame and is no longer part of the encoded data. EncodeMsg, Msg.Decode have been updated to match. Code that decodes RLP directly from Msg.Payload will need to change.
* p2p: verify protocol handshake node IDFelix Lange2015-03-041-0/+3
|
* p2p: make encryption handshake code easier to followFelix Lange2015-03-042-302/+272
| | | | | | | | | This mostly changes how information is passed around. Instead of using many function parameters and return values, put the entire state in a struct and pass that. This also adds back derivation of ecdhe-shared-secret. I deleted it by accident in a previous refactoring.
* p2p/discover: add NodeID.PubkeyFelix Lange2015-03-042-0/+33
|
* p2p: make RLPx frame MAC 16 bytes as defined in the specFelix Lange2015-03-042-13/+19
|
* p2p: delete frameRWFelix Lange2015-03-042-184/+0
|
* p2p: use RLPx frames for messagingFelix Lange2015-03-046-50/+73
|
* p2p: encrypted and authenticated RLPx frame I/OFelix Lange2015-03-044-172/+197
|
* p2p: add basic RLPx frame I/OFelix Lange2015-03-042-0/+252
|
* p2p: emit JSON connect/disconnect eventsFelix Lange2015-02-201-0/+13
|
* p2p: initialize Server.ourHandshake before accepting connectionsFelix Lange2015-02-201-8/+9
|
* p2p: enable devp2p pingFelix Lange2015-02-191-11/+26
| | | | This should prevent connection drops.
* p2p: disable encryption handshakeFelix Lange2015-02-197-313/+273
| | | | | | The diff is a bit bigger than expected because the protocol handshake logic has moved out of Peer. This is necessary because the protocol handshake will have custom framing in the final protocol.
* Merge pull request #325 from fjl/deps-cleanupJeffrey Wilcke2015-02-182-4/+4
|\ | | | | Cleanup imports
| * p2p/nat: switch to github.com/huin/goupnpFelix Lange2015-02-171-3/+3
| | | | | | | | My temporary fix was merged upstream.
| * p2p: fix ecies dependency in testsFelix Lange2015-02-171-1/+1
| | | | | | | | | | We forgot to update this reference when moving ecies into the go-ethereum repo.
* | p2p/discover: fix pending replies iterationFelix Lange2015-02-171-1/+2
|/ | | | | | Range expressions capture the length of the slice once before the first iteration. A range expression cannot be used here since the loop modifies the slice variable (including length changes).
* Use a mutex write-lock for a write operationobscuren2015-02-151-4/+4
|
* Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into developobscuren2015-02-141-0/+6
|\
| * p2p: print Cap as name/versionFelix Lange2015-02-141-0/+6
| |
* | Moved ECIES to repo & added secondary title for webviewobscuren2015-02-141-1/+1
|/ | | | | * ECIES moved from obscuren to ethereum * Added html META[name=badge] to reflect menuItem.secondaryTitle
* p2p: bump devp2p protcol version to 3Felix Lange2015-02-131-1/+1
| | | | For compatibility with cpp-ethereum
* p2p: handle disconnect before protocol handshakeFelix Lange2015-02-131-0/+7
|
* p2p/discover: fix race in ListenUDPFelix Lange2015-02-131-24/+17
| | | | | udp.Table was assigned after the readLoop started, so packets could arrive and be processed before the Table was there.
* p2p: ensure we don't dial ourselfFelix Lange2015-02-131-1/+4
| | | | | addPeer doesn't allow self connects, but we can avoid opening connections in the first place.
* p2p: add I/O timeout for encrytion handshakeFelix Lange2015-02-131-1/+3
|
* p2p: fix goroutine leak for invalid peersFelix Lange2015-02-131-6/+5
| | | | | The deflect logic called Disconnect on the peer, but the peer never ran and wouldn't process the disconnect request.
* p2p: improve read deadlinesFelix Lange2015-02-132-15/+27
| | | | | | | | There are now two deadlines, frameReadTimeout and payloadReadTimeout. The frame timeout is longer and allows for connections that are idle. The message timeout is still short and ensures that we don't get stuck in the middle of a message.
* p2p/discover: map listening port using configured mechanismFelix Lange2015-02-133-15/+25
|
* p2p/discover: code review fixesFelix Lange2015-02-133-7/+9
|
* cmd/ethereum, cmd/mist, eth, p2p: use package p2p/natFelix Lange2015-02-134-478/+11
| | | | This deletes the old NAT implementation.
* p2p/nat: new package for port mapping stuffFelix Lange2015-02-133-0/+499
| | | | | | I have verified that UPnP and NAT-PMP work against an older version of the MiniUPnP daemon running on pfSense. This code is kind of hard to test automatically.
* p2p/discover: deflake UDP testsFelix Lange2015-02-094-59/+123
|
* cmd/ethereum, cmd/mist: add flag for discovery bootstrap nodesFelix Lange2015-02-072-3/+3
|
* cmd/mist, eth, javascript, p2p: use Node URLs for peer suggestionsFelix Lange2015-02-072-3/+3
|
* p2p: fixes for actual connectionsFelix Lange2015-02-076-29/+38
| | | | The unit test hooks were turned on 'in production'.
* p2p/discover: add node URL functions, distinguish TCP/UDP portsFelix Lange2015-02-078-326/+532
| | | | | The discovery RPC protocol does not yet distinguish TCP and UDP ports. But it can't hurt to do so in our internal model.
* p2p: integrate p2p/discoverFelix Lange2015-02-0615-1659/+1056
| | | | | | | | | | | | Overview of changes: - ClientIdentity has been removed, use discover.NodeID - Server now requires a private key to be set (instead of public key) - Server performs the encryption handshake before launching Peer - Dial logic takes peers from discover table - Encryption handshake code has been cleaned up a bit - baseProtocol is gone because we don't exchange peers anymore - Some parts of baseProtocol have moved into Peer instead
* p2p/discover: add some helper functionsFelix Lange2015-02-064-20/+41
|