internal void OnHelloReceive(IPHeader ipHeader, OspfHeader ospfHeader, OspfHelloHeader ospfHelloHeader) { lock (Lock) { LastSeen = DateTime.Now; Log.Write("OSPF", "NEIGHBOR", string.Format("Hello received. From: {0}, State: {1}", ospfHeader.RouterID, OspfNeighborState)); RaiseEvent(NeighborEventType.HelloReceived); if (ospfHelloHeader.Neighbor.Any(p => p == Module.RouterID)) { var tupleData = new Tuple<IPHeader, OspfHeader, Tuple<IPAddress, IPAddress>>(ipHeader, ospfHeader, new Tuple<IPAddress, IPAddress>(ospfHelloHeader.Dr, ospfHelloHeader.Bdr)); RaiseEvent(NeighborEventType.TwoWayReceived, tupleData); } else { var tupleData = new Tuple<IPHeader, OspfHeader, object>(ipHeader, ospfHeader, ospfHelloHeader); RaiseEvent(NeighborEventType.OneWayReceived, tupleData); } } }
//private void HandleHelloMessage(IPHeader ipHeader, OspfHeader ospfHeader, OspfHelloHeader ospfHelloHeader) //{ // return; // Neighbor neighbor = NeighborMap[ospfHeader.rid] ?? Neighbor.Create(ipHeader, ospfHeader, ospfHelloHeader); // NeighborEventArgs args = NeighborEventArgs.Create(ipHeader, ospfHeader, ospfHelloHeader); // neighbor.RaiseEvent(NeighborEventType.HelloReceived, args); // if (ospfHelloHeader.neighbor.Any(p => p == RouterID)) // { // neighbor.RaiseEvent(NeighborEventType.TwoWayReceived, args); // } // if (neighbor.IsNew && IsPotentialNeighbor(ipHeader, ospfHeader, ospfHelloHeader)) // { // NeighborMap.Add(neighbor.RouterId, neighbor); // neighbor.IsNew = false; // } // else // { // Log.Write("OSPF", "HELLO", string.Format("Incompatible OSPF hello message from .", ipHeader.saddr.StandardFormat)); // } //} private bool IsPotentialNeighbor(IPHeader ipHeader, OspfHeader ospfHeader, OspfHelloHeader ospfHelloHeader) { //if (!ospfHeader.aid.Equals(Area)) //{ // return false; //} //if (ospfHelloHeader.interval != HelloInterval) //{ // return false; //} //if (ospfHelloHeader.routerdeadintvl != RouterDeadInterval) //{ // return false; //} //if (((ospfHelloHeader.Options & OspfHelloOptions.ExternalRoutingCapable) == OspfHelloOptions.ExternalRoutingCapable) == IsStub) //{ // return false; //} return true; }