public void DataRequest( MacAddressingMode srcAddrMode, MacAddress dstAddr, UInt16 dstPanId, ref Frame msdu, Byte msduHandle, TxOptions options, SecurityOptions securityOptions, DataConfirmHandler handler) { TaskDataRequest task = new TaskDataRequest( srcAddrMode, dstAddr, dstPanId, msdu, msduHandle, options, securityOptions, handler); if (!_taskQueue.Add(task)) { Frame.Release(ref msdu); if (handler != null) { handler.Invoke(this, msduHandle, MacEnum.Congested); } } msdu = null; // in any case, remove frame ownership from caller }
private void DataRequest(TaskDataRequest task) { if (task == null) return; MacEnum result = MacEnum.Success; bool is2006 = false; // check frame if (task.msdu == null || task.msdu.LengthDataUsed == 0) { result = MacEnum.InvalidParameter; } else if (task.msdu.LengthDataUsed > State.aMaxMACSafePayloadSize) { if (_state.phySupports2006) { is2006 = true; } else { result = MacEnum.FrameTooLong; } } if (result == MacEnum.Success) { // data request is a value type, cannot be null Header hdr = new Header(); hdr.fcs.Type = Frames.Type.Data; if (is2006) hdr.fcs.Version = Frames.Version.IEEE2006; else hdr.fcs.Version = Frames.Version.IEEE2003; if (task.options.AcknowledgedTransmission) hdr.fcs.Ack = true; // FIXME: security lock (_state) { hdr.seqNo = _state.macDSN++; // dst address hdr.dstPanId = task.dstPANId; switch (task.dstAddr.Mode) { case MacAddressingMode.NoAddress: hdr.fcs.DstAddrMode = AddressingMode.None; break; case MacAddressingMode.ShortAddress: hdr.fcs.DstAddrMode = AddressingMode.Short; hdr.dstAddrShort = task.dstAddr.ShortAddress; break; case MacAddressingMode.ExtendedAddress: hdr.fcs.DstAddrMode = AddressingMode.Extended; hdr.dstAddrExt = task.dstAddr.ExtendedAddress; break; } // src addr if (_state.macPanId == task.dstPANId) { hdr.fcs.PanIdCompression = true; } else { hdr.srcPanId = _state.macPanId; } switch (task.srcAddrMode) { case MacAddressingMode.NoAddress: hdr.fcs.SrcAddrMode = AddressingMode.None; break; case MacAddressingMode.ShortAddress: hdr.fcs.SrcAddrMode = AddressingMode.Short; hdr.srcAddrShort = _state.macShortAddr; break; case MacAddressingMode.ExtendedAddress: hdr.fcs.SrcAddrMode = AddressingMode.Extended; hdr.srcAddrExt = _state.aExtendedAddress; break; } } // encode result = MacEnum.Congested; if (hdr.WriteToFrameHeader(task.msdu)) { if (task.msdu.LengthDataUsed > State.aMaxPhyPacketSize) { result = MacEnum.FrameTooLong; } else { result = _sendReceive.SendFrame(ref task.msdu, task.options.AcknowledgedTransmission, hdr.seqNo); } } else { Trace.Print("Mac: DataRequest: cannot add Mac header"); } } Frame.Release(ref task.msdu); if (task.handler != null) { task.handler.Invoke(this, task.msduHandle, result); } }
public void DataRequest( MacAddressingMode srcAddrMode, MacAddress dstAddr, UInt16 dstPanId, ref Frame msdu, Byte msduHandle, TxOptions options, SecurityOptions securityOptions, DataConfirmHandler handler) { TaskDataRequest task = new TaskDataRequest( srcAddrMode, dstAddr, dstPanId, msdu, msduHandle, options, securityOptions, handler); if (!_taskQueue.Add(task)) { Frame.Release(ref msdu); if (handler != null) handler.Invoke(this, msduHandle, MacEnum.Congested); } msdu = null; // in any case, remove frame ownership from caller }
private void DataRequest(TaskDataRequest task) { if (task == null) { return; } MacEnum result = MacEnum.Success; bool is2006 = false; // check frame if (task.msdu == null || task.msdu.LengthDataUsed == 0) { result = MacEnum.InvalidParameter; } else if (task.msdu.LengthDataUsed > State.aMaxMACSafePayloadSize) { if (_state.phySupports2006) { is2006 = true; } else { result = MacEnum.FrameTooLong; } } if (result == MacEnum.Success) { // data request is a value type, cannot be null Header hdr = new Header(); hdr.fcs.Type = Frames.Type.Data; if (is2006) { hdr.fcs.Version = Frames.Version.IEEE2006; } else { hdr.fcs.Version = Frames.Version.IEEE2003; } if (task.options.AcknowledgedTransmission) { hdr.fcs.Ack = true; } // FIXME: security lock (_state) { hdr.seqNo = _state.macDSN++; // dst address hdr.dstPanId = task.dstPANId; switch (task.dstAddr.Mode) { case MacAddressingMode.NoAddress: hdr.fcs.DstAddrMode = AddressingMode.None; break; case MacAddressingMode.ShortAddress: hdr.fcs.DstAddrMode = AddressingMode.Short; hdr.dstAddrShort = task.dstAddr.ShortAddress; break; case MacAddressingMode.ExtendedAddress: hdr.fcs.DstAddrMode = AddressingMode.Extended; hdr.dstAddrExt = task.dstAddr.ExtendedAddress; break; } // src addr if (_state.macPanId == task.dstPANId) { hdr.fcs.PanIdCompression = true; } else { hdr.srcPanId = _state.macPanId; } switch (task.srcAddrMode) { case MacAddressingMode.NoAddress: hdr.fcs.SrcAddrMode = AddressingMode.None; break; case MacAddressingMode.ShortAddress: hdr.fcs.SrcAddrMode = AddressingMode.Short; hdr.srcAddrShort = _state.macShortAddr; break; case MacAddressingMode.ExtendedAddress: hdr.fcs.SrcAddrMode = AddressingMode.Extended; hdr.srcAddrExt = _state.aExtendedAddress; break; } } // encode result = MacEnum.Congested; if (hdr.WriteToFrameHeader(task.msdu)) { if (task.msdu.LengthDataUsed > State.aMaxPhyPacketSize) { result = MacEnum.FrameTooLong; } else { result = _sendReceive.SendFrame(ref task.msdu, task.options.AcknowledgedTransmission, hdr.seqNo); } } else { Trace.Print("Mac: DataRequest: cannot add Mac header"); } } Frame.Release(ref task.msdu); if (task.handler != null) { task.handler.Invoke(this, task.msduHandle, result); } }