//sends routing messages to all the immediate neighbors private void SendRoutingMessages() { foreach (int n in m_routers.Keys) { RoutingMessage new_routing_message = new RoutingMessage(ID, n, m_distances); baton.WaitOne(); m_dNeighbors[n].Send(new_routing_message); baton.ReleaseMutex(); } }
//handles an incoming routing neighbors according to the Bellman-Ford algorithm private void HandleRoutingMessage(RoutingMessage rmsg) { int iDistance; bool is_changed = false; if (!m_distances.ContainsKey(ID)) { m_distances.Add(ID, 0); m_routers.Add(ID, ID); } foreach (int dist_id in m_dNeighbors.Keys) { if (!m_distances.ContainsKey(dist_id)) { m_distances.Add(dist_id, 1); m_routers.Add(dist_id, dist_id); } } SendRoutingMessages(); List <int> nodes = rmsg.GetAllNodes(); foreach (int iNode in nodes) { iDistance = rmsg.GetDistance(iNode); if (!m_distances.ContainsKey(iNode) || m_distances[iNode] > iDistance + 1) { m_distances[iNode] = iDistance + 1; m_routers[iNode] = rmsg.Sender; is_changed = true; } } if (is_changed) { baton.WaitOne(); SendRoutingMessages(); baton.ReleaseMutex(); } }