private void HandleRouteError( MacAddress srcAddr, MacAddress dstAddr, ref Frame sdu) { Message.RouteError re = new Message.RouteError(); if (re.ReadFromFrame(sdu)) { // check message Trace.Print("Received " + re.ToString()); if (re.UnreachableAddr != cInvalidShortAddr && srcAddr.Mode == MacAddressingMode.ShortAddress) { bool validRoute = _routingTable.HandleRouteError(re.UnreachableAddr, srcAddr.ShortAddress, re.FatalError); if (validRoute) { if (re.TargetAddr == _addrShort) { // sent to us SendRouteRequest(re.UnreachableAddr); } else { // forward error if (re.HopsLeft > 0) { re.HopsLeft--; SendRouteError(re); } } } } } }
private void SendRouteError( UInt16 tgtAddr, UInt16 unrAddr, bool fatalError) { Message.RouteError re = new Message.RouteError(); re.FatalError = fatalError; re.HopsLeft = cDefaultHopLimit; // time-to-live, drop when 0 re.TargetAddr = tgtAddr; re.OriginatorAddr = _addrShort; re.UnreachableAddr = unrAddr; SendRouteError(re); }
private void SendRouteError(Message.RouteError re) { Frame frame = Frame.GetFrame(_macHeader + Message.RouteError.cLength + _macTailer); if (frame == null) return; frame.ReserveHeader(_macHeader); if (re.WriteToFrame(frame)) { UInt16 nextHop; if (_routingTable.GetRoute(re.TargetAddr, out nextHop)) { MacDataRequest(nextHop, ref frame); } } Frame.Release(ref frame); }