Fixed Router to actually consider hop count and hop limit.
This commit is contained in:
parent
57c022f3d5
commit
108f326d8d
4 changed files with 48 additions and 11 deletions
|
@ -91,9 +91,9 @@ MUST NOT be changed by a forwarding node.
|
||||||
|
|
||||||
Hop Count specifies the number of nodes a message may pass. When
|
Hop Count specifies the number of nodes a message may pass. When
|
||||||
creating a package, it is initialized to 0. Whenever a node forwards
|
creating a package, it is initialized to 0. Whenever a node forwards
|
||||||
a package, it MUST increment the hop limit by one. If the hop limit
|
a package, it MUST increment the hop limit by one. If the hop count
|
||||||
BEFORE/AFTER? incrementing equals Hop Limit, the package MUST be
|
after incrementing equals or is greater than Hop Limit, the package
|
||||||
ignored.
|
MUST NOT be forwarded.
|
||||||
|
|
||||||
Length is the message size in bytes, including the header.
|
Length is the message size in bytes, including the header.
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package com.nutomic.ensichat.protocol
|
package com.nutomic.ensichat.protocol
|
||||||
|
|
||||||
import java.util.GregorianCalendar
|
import java.util.{Date, GregorianCalendar}
|
||||||
|
|
||||||
import android.test.AndroidTestCase
|
import android.test.AndroidTestCase
|
||||||
import com.nutomic.ensichat.protocol.body.UserName
|
import com.nutomic.ensichat.protocol.body.{Text, UserName}
|
||||||
import com.nutomic.ensichat.protocol.header.ContentHeader
|
import com.nutomic.ensichat.protocol.header.ContentHeader
|
||||||
import junit.framework.Assert._
|
import junit.framework.Assert._
|
||||||
|
|
||||||
|
@ -20,7 +20,6 @@ class RouterTest extends AndroidTestCase {
|
||||||
var sentTo = Set[Address]()
|
var sentTo = Set[Address]()
|
||||||
val router: Router = new Router(neighbors,
|
val router: Router = new Router(neighbors,
|
||||||
(a, m) => {
|
(a, m) => {
|
||||||
assertEquals(msg, m)
|
|
||||||
sentTo += a
|
sentTo += a
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -28,6 +27,21 @@ class RouterTest extends AndroidTestCase {
|
||||||
assertEquals(neighbors(), sentTo)
|
assertEquals(neighbors(), sentTo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def testMessageSame(): Unit = {
|
||||||
|
val router: Router = new Router(neighbors,
|
||||||
|
(a, m) => {
|
||||||
|
assertEquals(msg.header.origin, m.header.origin)
|
||||||
|
assertEquals(msg.header.target, m.header.target)
|
||||||
|
assertEquals(msg.header.seqNum, m.header.seqNum)
|
||||||
|
assertEquals(msg.header.protocolType, m.header.protocolType)
|
||||||
|
assertEquals(msg.header.hopCount + 1, m.header.hopCount)
|
||||||
|
assertEquals(msg.header.hopLimit, m.header.hopLimit)
|
||||||
|
assertEquals(msg.body, m.body)
|
||||||
|
assertEquals(msg.crypto, m.crypto)
|
||||||
|
})
|
||||||
|
router.onReceive(msg)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Messages from different senders with the same sequence number should be forwarded.
|
* Messages from different senders with the same sequence number should be forwarded.
|
||||||
*/
|
*/
|
||||||
|
@ -75,6 +89,13 @@ class RouterTest extends AndroidTestCase {
|
||||||
test(ContentHeader.SeqNumRange.last / 2, 1)
|
test(ContentHeader.SeqNumRange.last / 2, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def testHopLimit(): Unit = Range(19, 22).foreach { i =>
|
||||||
|
val msg = new Message(
|
||||||
|
new ContentHeader(AddressTest.a1, AddressTest.a2, 1, 1, 1, new Date(), i), new Text(""))
|
||||||
|
val router: Router = new Router(neighbors, (a, m) => fail())
|
||||||
|
router.onReceive(msg)
|
||||||
|
}
|
||||||
|
|
||||||
private def generateMessage(sender: Address, receiver: Address, seqNum: Int): Message = {
|
private def generateMessage(sender: Address, receiver: Address, seqNum: Int): Message = {
|
||||||
val header = new ContentHeader(sender, receiver, seqNum, UserName.Type, 5,
|
val header = new ContentHeader(sender, receiver, seqNum, UserName.Type, 5,
|
||||||
new GregorianCalendar(2014, 6, 10).getTime)
|
new GregorianCalendar(2014, 6, 10).getTime)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package com.nutomic.ensichat.protocol
|
package com.nutomic.ensichat.protocol
|
||||||
|
|
||||||
import com.nutomic.ensichat.protocol.header.ContentHeader
|
import com.nutomic.ensichat.protocol.header.{MessageHeader, ContentHeader}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forwards messages to all connected devices.
|
* Forwards messages to all connected devices.
|
||||||
|
@ -14,12 +14,29 @@ class Router(activeConnections: () => Set[Address], send: (Address, Message) =>
|
||||||
if (messageSeen.contains(info))
|
if (messageSeen.contains(info))
|
||||||
return
|
return
|
||||||
|
|
||||||
activeConnections().foreach(a => send(a, msg))
|
val updated = incHopCount(msg)
|
||||||
|
if (updated.header.hopCount >= updated.header.hopLimit)
|
||||||
|
return
|
||||||
|
|
||||||
|
activeConnections().foreach(a => send(a, updated))
|
||||||
|
|
||||||
trimMessageSeen(info._1, info._2)
|
trimMessageSeen(info._1, info._2)
|
||||||
messageSeen += info
|
messageSeen += info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns msg with hop count increased by one.
|
||||||
|
*/
|
||||||
|
private def incHopCount(msg: Message): Message = {
|
||||||
|
val updatedHeader = msg.header match {
|
||||||
|
case ch: ContentHeader => new ContentHeader(ch.origin, ch.target, ch.seqNum, ch.contentType,
|
||||||
|
ch.messageId, ch.time, ch.hopCount + 1, ch.hopLimit)
|
||||||
|
case mh: MessageHeader => new MessageHeader(mh.protocolType, mh.origin, mh.target, mh.seqNum,
|
||||||
|
mh.hopCount + 1, mh.hopLimit)
|
||||||
|
}
|
||||||
|
new Message(updatedHeader, msg.crypto, msg.body)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes old entries from [[messageSeen]].
|
* Removes old entries from [[messageSeen]].
|
||||||
*
|
*
|
||||||
|
|
|
@ -45,13 +45,12 @@ case class ContentHeader(override val origin: Address,
|
||||||
contentType: Int,
|
contentType: Int,
|
||||||
messageId: Long,
|
messageId: Long,
|
||||||
time: Date,
|
time: Date,
|
||||||
override val hopCount: Int = 0)
|
override val hopCount: Int = 0,
|
||||||
|
override val hopLimit: Int = AbstractHeader.DefaultHopLimit)
|
||||||
extends AbstractHeader {
|
extends AbstractHeader {
|
||||||
|
|
||||||
override val protocolType = ContentHeader.ContentMessageType
|
override val protocolType = ContentHeader.ContentMessageType
|
||||||
|
|
||||||
override val hopLimit = AbstractHeader.DefaultHopLimit
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes the header to byte array.
|
* Writes the header to byte array.
|
||||||
*/
|
*/
|
||||||
|
|
Reference in a new issue