Fixed problem with init messages

This commit is contained in:
Dennis Schwerdel 2015-11-26 10:52:58 +01:00
parent f933c541f8
commit 748f9363a6
2 changed files with 20 additions and 17 deletions

View File

@ -164,7 +164,7 @@ impl<P: Protocol> GenericCloud<P> {
self.reconnect_peers.push(addr); self.reconnect_peers.push(addr);
} }
let addrs = self.addresses.clone(); let addrs = self.addresses.clone();
self.send_msg(addr, &Message::Init(addrs)) self.send_msg(addr, &Message::Init(0, addrs))
} }
fn housekeep(&mut self) -> Result<(), Error> { fn housekeep(&mut self) -> Result<(), Error> {
@ -252,18 +252,17 @@ impl<P: Protocol> GenericCloud<P> {
} }
} }
}, },
Message::Init(ranges) => { Message::Init(stage, ranges) => {
if self.peers.contains(&peer) {
return Ok(());
}
self.peers.add(&peer); self.peers.add(&peer);
let peers = self.peers.as_vec(); let peers = self.peers.as_vec();
let own_addrs = self.addresses.clone(); let own_addrs = self.addresses.clone();
try!(self.send_msg(peer, &Message::Init(own_addrs)));
try!(self.send_msg(peer, &Message::Peers(peers)));
for range in ranges { for range in ranges {
self.table.learn(range.base, Some(range.prefix_len), peer.clone()); self.table.learn(range.base, Some(range.prefix_len), peer.clone());
} }
if stage == 0 {
try!(self.send_msg(peer, &Message::Init(stage+1, own_addrs)));
try!(self.send_msg(peer, &Message::Peers(peers)));
}
}, },
Message::Close => { Message::Close => {
self.peers.remove(&peer); self.peers.remove(&peer);

View File

@ -65,7 +65,7 @@ pub struct Options {
pub enum Message<'a> { pub enum Message<'a> {
Data(&'a[u8]), Data(&'a[u8]),
Peers(Vec<SocketAddr>), Peers(Vec<SocketAddr>),
Init(Vec<Range>), Init(u8, Vec<Range>),
Close, Close,
} }
@ -85,7 +85,7 @@ impl<'a> fmt::Debug for Message<'a> {
} }
write!(formatter, "]") write!(formatter, "]")
}, },
&Message::Init(ref data) => write!(formatter, "Init{:?}", data), &Message::Init(stage, ref data) => write!(formatter, "Init(stage= {}, {:?})", stage, data),
&Message::Close => write!(formatter, "Close"), &Message::Close => write!(formatter, "Close"),
} }
} }
@ -166,9 +166,11 @@ pub fn decode<'a>(data: &'a mut [u8], crypto: &mut Crypto) -> Result<(Options, M
Message::Peers(peers) Message::Peers(peers)
}, },
2 => { 2 => {
if end < pos + 1 { if end < pos + 2 {
return Err(Error::ParseError("Init data too short")); return Err(Error::ParseError("Init data too short"));
} }
let stage = data[pos];
pos += 1;
let count = data[pos] as usize; let count = data[pos] as usize;
pos += 1; pos += 1;
let mut addrs = Vec::with_capacity(count); let mut addrs = Vec::with_capacity(count);
@ -177,7 +179,7 @@ pub fn decode<'a>(data: &'a mut [u8], crypto: &mut Crypto) -> Result<(Options, M
pos += read; pos += read;
addrs.push(range); addrs.push(range);
} }
Message::Init(addrs) Message::Init(stage, addrs)
}, },
3 => Message::Close, 3 => Message::Close,
_ => return Err(Error::ParseError("Unknown message type")) _ => return Err(Error::ParseError("Unknown message type"))
@ -191,7 +193,7 @@ pub fn encode(options: &Options, msg: &Message, buf: &mut [u8], crypto: &mut Cry
header.msgtype = match msg { header.msgtype = match msg {
&Message::Data(_) => 0, &Message::Data(_) => 0,
&Message::Peers(_) => 1, &Message::Peers(_) => 1,
&Message::Init(_) => 2, &Message::Init(_, _) => 2,
&Message::Close => 3 &Message::Close => 3
}; };
header.crypto_method = crypto.method(); header.crypto_method = crypto.method();
@ -245,8 +247,10 @@ pub fn encode(options: &Options, msg: &Message, buf: &mut [u8], crypto: &mut Cry
pos += 2; pos += 2;
}; };
}, },
&Message::Init(ref ranges) => { &Message::Init(stage, ref ranges) => {
assert!(buf.len() >= pos + 1); assert!(buf.len() >= pos + 2);
buf[pos] = stage;
pos += 1;
assert!(ranges.len() <= 255); assert!(ranges.len() <= 255);
buf[pos] = ranges.len() as u8; buf[pos] = ranges.len() as u8;
pos += 1; pos += 1;
@ -335,11 +339,11 @@ fn encode_message_init() {
let mut crypto = Crypto::None; let mut crypto = Crypto::None;
let addrs = vec![Range{base: Address{data: [0,1,2,3,0,0,0,0,0,0,0,0,0,0,0,0], len: 4}, prefix_len: 24}, let addrs = vec![Range{base: Address{data: [0,1,2,3,0,0,0,0,0,0,0,0,0,0,0,0], len: 4}, prefix_len: 24},
Range{base: Address{data: [0,1,2,3,4,5,0,0,0,0,0,0,0,0,0,0], len: 6}, prefix_len: 16}]; Range{base: Address{data: [0,1,2,3,4,5,0,0,0,0,0,0,0,0,0,0], len: 6}, prefix_len: 16}];
let msg = Message::Init(addrs); let msg = Message::Init(0, addrs);
let mut buf = [0; 1024]; let mut buf = [0; 1024];
let size = encode(&mut options, &msg, &mut buf[..], &mut crypto); let size = encode(&mut options, &msg, &mut buf[..], &mut crypto);
assert_eq!(size, 23); assert_eq!(size, 24);
assert_eq!(&buf[..size], &[118,112,110,1,0,0,0,2,2,4,0,1,2,3,24,6,0,1,2,3,4,5,16]); assert_eq!(&buf[..size], &[118,112,110,1,0,0,0,2,0,2,4,0,1,2,3,24,6,0,1,2,3,4,5,16]);
let (options2, msg2) = decode(&mut buf[..size], &mut crypto).unwrap(); let (options2, msg2) = decode(&mut buf[..size], &mut crypto).unwrap();
assert_eq!(options, options2); assert_eq!(options, options2);
assert_eq!(msg, msg2); assert_eq!(msg, msg2);