private void ReceiveBeacon(
            Header hdr,
            ref Frame frame,
            Byte linkQuality)
        {
            bool ok = true;
            ok &= hdr.fcs.DstAddrMode == AddressingMode.None;
            ok &= (hdr.fcs.SrcAddrMode == AddressingMode.Short || hdr.fcs.SrcAddrMode == AddressingMode.Extended);
            ok &= (_state.macPromiscousMode || hdr.srcPanId == _state.macPanId || _state.macPanId == State.cBroadcastPanId);
            if (hdr.fcs.Security)
                ok &= (hdr.fcs.Version == Microsoft.SPOT.Wireless.IEEE_802_15_4.Mac.Frames.Version.IEEE2006);
            else
                ok &= (hdr.fcs.Version == Microsoft.SPOT.Wireless.IEEE_802_15_4.Mac.Frames.Version.IEEE2003);
            if (!ok)
                return;

            Beacon beacon = new Beacon();
            if (beacon.ReadFromFrame(ref frame))
            {
                PanDescriptor pd = new PanDescriptor();
                if (hdr.fcs.SrcAddrMode == AddressingMode.Short)
                    pd.coordAddr.ShortAddress = hdr.srcAddrShort;
                else
                    pd.coordAddr.ExtendedAddress = hdr.srcAddrExt;
                pd.coordPanId = hdr.srcPanId;
                pd.logicalChannel = _state.phyChannelNumber;
                pd.channelPage = _state.phyChannelPage;
                //pd.superframeSpec
                pd.gtsPermit = (beacon.gtsPermit > 0);
                pd.linkQuality = linkQuality;
                //pd.timeStamp
                //pd.securityFailure
                //pd.securityOptions

                if (!_state.scanning || beacon.payload != null)
                { // signal upper layer
                    BeaconNotifyIndicationHandler ind = _BeaconNotifyIndication;
                    if (ind != null)
                    {
                        ind.Invoke(this, hdr.seqNo, pd, beacon.shortAddrPending, beacon.extAddrPending, beacon.payload);
                        beacon.payload = null;
                    }
                }

                if (_state.scanning)
                {
                    lock (_scannedBeacons)
                    {
                        _scannedBeacons.Add(pd);
                    }
                }
            }
        }
        private void BeaconRequest()
        {
            bool send = true;
            Frame frame = null;

            lock (_state)
            {
                if (_state.autoBeacon)
                {
                    Header hdr = new Header();
                    hdr.fcs.SrcAddrMode = AddressingMode.Short;
                    hdr.srcAddrShort = _state.macShortAddr;
                    hdr.srcPanId = _state.macPanId;
                    hdr.seqNo = _state.macBSN++;

                    Beacon bc = new Beacon();
                    bc.beaconOrder = _state.macBeaconOrder;
                    bc.superframeOrder = _state.macSuperframeOrder;
                    // finalCapSlot
                    // batteryLifeExtension
                    if (_state.panCoordinator)
                        bc.panCoordinator = 1;
                    bc.associationPermit = 0;
                    // gtsPermit
                    // gtsDirectionsMask
                    // gtsDescriptor;
                    // shortAddrPending;
                    // extAddrPending;
                    bc.payload = _state.macBeaconPayload;

                    int lenHeader = hdr.Length();
                    int len = _state.phyFrameHead + lenHeader; ;
                    frame = Frame.GetFrame(len + bc.Length() + _state.phyFrameTail);
                    frame.ReserveHeader(len);
                    if (bc.WriteToFrame(frame) && hdr.WriteToFrameHeader(frame))
                    {
                        send = true;
                    }
                }
            }

            if (send)
            {
                _sendReceive.SendFrame(ref frame, false, 0);
            }

            Frame.Release(ref frame);
        }