Start of UPnP.

This commit is contained in:
Gav Wood
2016-02-10 16:45:54 +01:00
parent 015aaad2c4
commit 35374ac09c
3 changed files with 63 additions and 6 deletions

View File

@@ -86,6 +86,26 @@ impl NetworkConfiguration {
config.public_address = SocketAddr::from_str(&format!("0.0.0.0:{}", port)).unwrap();
config
}
/// Conduct NAT if needed.
pub fn prepared(self) -> Self {
let listen = self.listen_address;
let public = self.public_address;
if self.nat_enabled {
info!("Enabling NAT");
}
NetworkConfiguration {
listen_address: listen,
public_address: public,
nat_enabled: false,
discovery_enabled: self.discovery_enabled,
pin: self.pin,
boot_nodes: self.boot_nodes,
use_secret: self.use_secret,
}
}
}
// Tokens
@@ -296,6 +316,8 @@ pub struct Host<Message> where Message: Send + Sync + Clone {
impl<Message> Host<Message> where Message: Send + Sync + Clone {
/// Create a new instance
pub fn new(config: NetworkConfiguration) -> Host<Message> {
let config = config.prepared();
let addr = config.listen_address;
// Setup the server socket
let tcp_listener = TcpListener::bind(&addr).unwrap();

View File

@@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
use std::sync::RwLock;
use std::cell::RefCell;
use hash::*;
use sha3::*;
use hashdb::*;
@@ -21,11 +23,26 @@ use rlp::*;
use super::triedbmut::*;
use super::trietraits::*;
lazy_static! {
static ref COMMIT_COUNT: RwLock<usize> = RwLock::new(0);
static ref UPDATE_COUNT: RwLock<usize> = RwLock::new(0);
}
/// Get mean number of updates per commit so far.
pub fn updates_per_commit() -> f64 {
let cc = *COMMIT_COUNT.read().unwrap();
if cc > 0 {
(*UPDATE_COUNT.read().unwrap() as f64) / (cc as f64)
} else { 0.0 }
}
/// A mutable `Trie` implementation which hashes keys and uses a generic `HashDB` backing database.
///
/// Use it as a `Trie` or `TrieMut` trait object. You can use `raw()` to get the backing TrieDBMut object.
pub struct SecTrieDBMut<'db> {
raw: TrieDBMut<'db>
raw: TrieDBMut<'db>,
/// Get number of updates done on this trie so far.
pub update_count: RefCell<usize>,
}
impl<'db> SecTrieDBMut<'db> {
@@ -33,13 +50,13 @@ impl<'db> SecTrieDBMut<'db> {
/// Initialise to the state entailed by the genesis block.
/// This guarantees the trie is built correctly.
pub fn new(db: &'db mut HashDB, root: &'db mut H256) -> Self {
SecTrieDBMut { raw: TrieDBMut::new(db, root) }
SecTrieDBMut { raw: TrieDBMut::new(db, root), update_count: RefCell::new(0) }
}
/// Create a new trie with the backing database `db` and `root`
/// Panics, if `root` does not exist
pub fn from_existing(db: &'db mut HashDB, root: &'db mut H256) -> Self {
SecTrieDBMut { raw: TrieDBMut::from_existing(db, root) }
SecTrieDBMut { raw: TrieDBMut::from_existing(db, root), update_count: RefCell::new(0) }
}
/// Get the backing database.
@@ -50,7 +67,9 @@ impl<'db> SecTrieDBMut<'db> {
}
impl<'db> Trie for SecTrieDBMut<'db> {
fn root(&self) -> &H256 { self.raw.root() }
fn root(&self) -> &H256 {
self.raw.root()
}
fn contains(&self, key: &[u8]) -> bool {
self.raw.contains(&key.sha3())
@@ -63,14 +82,27 @@ impl<'db> Trie for SecTrieDBMut<'db> {
impl<'db> TrieMut for SecTrieDBMut<'db> {
fn insert(&mut self, key: &[u8], value: &[u8]) {
*self.update_count.borrow_mut() += 1;
self.raw.insert(&key.sha3(), value);
}
fn remove(&mut self, key: &[u8]) {
*self.update_count.borrow_mut() += 1;
self.raw.remove(&key.sha3());
}
}
impl<'db> Drop for SecTrieDBMut<'db> {
fn drop(&mut self) {
let uc = *self.update_count.borrow();
if uc > 0 {
*COMMIT_COUNT.write().unwrap() += 1;
*UPDATE_COUNT.write().unwrap() += uc;
*self.update_count.borrow_mut() = 0;
}
}
}
#[test]
fn sectrie_to_trie() {
use memorydb::*;