Multicast protocol behavior
{
MCast behaviour
Version 0.02 - unreleased
Last modified: 01-04-96
Written by G. Hiddink
}
<Datagram> on link l
if l is not the 'fastest link' of <Source> then
set l to be the 'fastest link' of <Source> /* so that links are symmetrically loaded */
Create a destination list for each existing link
For each ServerID in <Dest>
if ServerID is not the serverID of this server
lookup the 'fastest link' of the server with ServerID
put the serverid in the destination list for this link
For each non-empty destination list <LinkDest> of a link
send <Source> <Group> <Seq> <LinkDest> <Data> on this link
if the serverID of this server was in <dest>:
if this server has seen the tuple <Source> <Group> before:
if <Seq> is the 'previous seen <Seq>' +1:
pass the datagram to the layer above
n=2
while 'previous seen <Seq>' +n is in the sequencer storage:
pass its datagram to the layer above
increase n
define the 'previous seen <Seq>' as the <Seq> of the datagram that is last passed on
else:
store the datagram in the sequencer storage
<Broadcast> on link l
if this server hasn't seen the tuple <Source>, <LocalID> before:
set l to be the 'fastest link' of <Source>
resend <Broadcast> on all existing links except l
pass <Data> to the layer above
<Bounced>
/* During the process of the distributed algorithm, servers are not allowed to leave.
* Recovery mechanisms still need to be defined in case of silent or fail stops.
*/
<FW_sum>
if this server hasn't seen the tuple <Source>, <LocalID> before:
set l to be the 'fastest link' of <Source>
remember that <Source>, <LocalID> arrived on link l
remember which links the message was resent on
if l is not the only link this server has:
resend '/'<BroadcastID> <Data> to all existing links ecept l
else
pass <Data> to the layer above and await <SumData>
send '\'<BroadcastID> <SumData> to link l /* BroadcastID unchanged */
<BW_sum>
Mark the link on which the message was received
if a message has been received on all links one was sent on:
concatenate all replies into one message
pass on this data to the layer above and wait for return data
if the <Source> of the <BW_sum> was not the serverID of this server:
send a <BW_sum> message on the link the FW_sum was first received on
else:
store the message and the link it was received on
<Unreachable>
if <ServerID> is not known to this server then
rebroadcast the message to all links
except the one it arrived on
else if this server's primary route was the link the <Unreachable> arrived on then
mark the server as 'unreachable'
rebroadcast the message to all links except the one it arrived on
else
send a <Reachable> message with the hop level for the server that was supposed to be
unreachable
<Reachable>
if <ServerID> was marked 'unreachable',
or it didn't exist yet, or
if it was reachable and the hop level in the message is smaller than the one we registered then
mark the server to be reachable
use the link the <Reachable> arrived on as primary link for <ServerID>
set the hop_level to the one mentioned in the message.
rebroadcast the <Reachable> message with the hop level increased by 1.
(c) 1996 by G. Hiddink
If you have any comments, please mail to
grit@cal050031.student.utwente.nl