diff --git a/client/src/client_sync/v17/mod.rs b/client/src/client_sync/v17/mod.rs index 01355169..b1b2785d 100644 --- a/client/src/client_sync/v17/mod.rs +++ b/client/src/client_sync/v17/mod.rs @@ -73,6 +73,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v17/network.rs b/client/src/client_sync/v17/network.rs index e55201a1..ae04f828 100644 --- a/client/src/client_sync/v17/network.rs +++ b/client/src/client_sync/v17/network.rs @@ -41,6 +41,22 @@ macro_rules! impl_client_v17__clearbanned { }; } +/// Implements Bitcoin Core JSON-RPC API method `disconnectnode` +#[macro_export] +macro_rules! impl_client_v17__disconnectnode { + () => { + impl Client { + pub fn disconnect_node(&self, address: &str) -> Result<()> { + match self.call("disconnectnode", &[into_json(address)?]) { + Ok(serde_json::Value::Null) => Ok(()), + Ok(res) => Err(Error::Returned(res.to_string())), + Err(err) => Err(err.into()), + } + } + } + }; +} + /// Implements Bitcoin Core JSON-RPC API method `getaddednodeinfo` #[macro_export] macro_rules! impl_client_v17__getaddednodeinfo { diff --git a/client/src/client_sync/v18/mod.rs b/client/src/client_sync/v18/mod.rs index 3d8d66ad..0c876569 100644 --- a/client/src/client_sync/v18/mod.rs +++ b/client/src/client_sync/v18/mod.rs @@ -77,6 +77,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v19/mod.rs b/client/src/client_sync/v19/mod.rs index 65b4640f..3d97087f 100644 --- a/client/src/client_sync/v19/mod.rs +++ b/client/src/client_sync/v19/mod.rs @@ -75,6 +75,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v20.rs b/client/src/client_sync/v20.rs index ea6b308d..80816ef8 100644 --- a/client/src/client_sync/v20.rs +++ b/client/src/client_sync/v20.rs @@ -72,6 +72,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v21/mod.rs b/client/src/client_sync/v21/mod.rs index 9f31fcd4..c6f37d9b 100644 --- a/client/src/client_sync/v21/mod.rs +++ b/client/src/client_sync/v21/mod.rs @@ -74,6 +74,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index f67f0bd4..a0dcd3ac 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -74,6 +74,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index c8eebe27..d1476e80 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -76,6 +76,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v24.rs b/client/src/client_sync/v24.rs index 46ae8c1c..27cd4b59 100644 --- a/client/src/client_sync/v24.rs +++ b/client/src/client_sync/v24.rs @@ -73,6 +73,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v25.rs b/client/src/client_sync/v25.rs index 9260748c..77cf2a70 100644 --- a/client/src/client_sync/v25.rs +++ b/client/src/client_sync/v25.rs @@ -73,6 +73,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index 8fa34e67..e8a49745 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -78,6 +78,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v27.rs b/client/src/client_sync/v27.rs index ba837d57..f206c123 100644 --- a/client/src/client_sync/v27.rs +++ b/client/src/client_sync/v27.rs @@ -74,6 +74,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index bd95a274..40502ec5 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -76,6 +76,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/client/src/client_sync/v29/mod.rs b/client/src/client_sync/v29/mod.rs index de3f9e7f..080265cf 100644 --- a/client/src/client_sync/v29/mod.rs +++ b/client/src/client_sync/v29/mod.rs @@ -76,6 +76,7 @@ crate::impl_client_v17__submitblock!(); // == Network == crate::impl_client_v17__addnode!(); crate::impl_client_v17__clearbanned!(); +crate::impl_client_v17__disconnectnode!(); crate::impl_client_v17__getaddednodeinfo!(); crate::impl_client_v17__getnettotals!(); crate::impl_client_v17__getnetworkinfo!(); diff --git a/integration_test/tests/network.rs b/integration_test/tests/network.rs index f1826646..77e9cf24 100644 --- a/integration_test/tests/network.rs +++ b/integration_test/tests/network.rs @@ -33,6 +33,16 @@ fn network__clear_banned() { node.client.clear_banned().expect("clearbanned"); } +#[test] +fn network__disconnect_node() { + let (_node1, node2, _node3) = integration_test::three_node_network(); + + let peers = node2.client.get_peer_info().expect("getpeerinfo"); + let peer = peers.0.first().expect("should have at least one peer"); + + node2.client.disconnect_node(&peer.address).expect("disconnectnode"); +} + #[test] fn network__get_added_node_info() { let node = Node::with_wallet(Wallet::None, &[]);