private void IncomingOlsrTopologyControlMessageHandler(NetSimMessage message) { OlsrTopologyControlMessage topMessage = (OlsrTopologyControlMessage)message; // if own tc message if (topMessage.Sender.Equals(this.Client.Id)) { // drop message return; } // process tc message foreach (var mprSelector in topMessage.MultiPointRelaySelectorSet) { if ( !this.TopologyTable.Entries.Any( e => e.OriginatorId.Equals(topMessage.Sender) && e.MprSelectorId.Equals(mprSelector))) { this.TopologyTable.AddEntry(topMessage.Sender, mprSelector); this.IsTopologyUpdate = true; } } // A node P forwards control messages only from MPRsel(P) if (this.MultiPointRelaySelectorSet.Contains(topMessage.Sender)) { // forward message this.BroadcastTopologyControlMessages(topMessage); } }
/// <summary> /// Clones this instance. /// </summary> /// <returns> /// A new object that is a copy of this instance. /// </returns> public override object Clone() { var clone = new OlsrTopologyControlMessage() { SequenceNr = (OlsrSequence)this.SequenceNr?.Clone(), MultiPointRelaySelectorSet = new List <string>(this.MultiPointRelaySelectorSet) }; return(this.CopyTo(clone)); }
/// <summary> /// Broadcasts the topology control messages. /// </summary> /// <param name="message">The message.</param> private void BroadcastTopologyControlMessages(OlsrTopologyControlMessage message) { // TODO Check if send to every node or only to MPRsel set // broadcast topology control messages to mpr selector set neighbors foreach (var entry in this.OneHopNeighborTable.Entries) { // TODO .Where(e => MultiPointRelaySelectorSet.Contains(e.NeighborId)) // copy message before forwarding var localMessageCopy = (OlsrTopologyControlMessage)message.Clone(); // A node P sends control messages only to MPRsel(P) localMessageCopy.Receiver = entry.NeighborId; if (this.IsConnectionReachable(entry.NeighborId)) { this.Client.Connections[entry.NeighborId].StartTransportMessage( localMessageCopy, this.Client.Id, entry.NeighborId); } } }
/// <summary> /// Broadcasts the topology control messages. /// </summary> private void BroadcastTopologyControlMessages() { // broadcast topology control messages to mpr selector set neighbors foreach ( var entry in this.OneHopNeighborTable.Entries.Where(e => this.MultiPointRelaySelectorSet.Contains(e.NeighborId))) { // A node P sends control messages only to MPRsel(P) var message = new OlsrTopologyControlMessage() { Sender = this.Client.Id, Receiver = entry.NeighborId, MultiPointRelaySelectorSet = new List <string>(this.MultiPointRelaySelectorSet) }; if (this.IsConnectionReachable(entry.NeighborId)) { this.Client.Connections[entry.NeighborId].StartTransportMessage( message, this.Client.Id, entry.NeighborId); } } }