示例#1
0
 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);
                     }
                 }
             }
         }
     }
 }
示例#2
0
 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);
 }
示例#3
0
        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);
        }