12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /* Copyright (C) 2012-2016 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
- *
- * You can redistribute this program and/or modify it under the terms of
- * the GNU Lesser Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- */
- using System;
- using System.Collections.Generic;
- using System.Net;
- using System.Text;
- using SCSI;
- using Utilities;
- namespace ISCSI.Server
- {
- public class AuthorizationRequestArgs : EventArgs
- {
- public string InitiatorName;
- public IPEndPoint InitiatorEndPoint;
- public bool Accept = true;
- public AuthorizationRequestArgs(string initiatorName, IPEndPoint initiatorEndPoint)
- {
- InitiatorName = initiatorName;
- InitiatorEndPoint = initiatorEndPoint;
- }
- }
- public class ISCSITarget : SCSITarget
- {
- private string m_targetName; // ISCSI name
- private SCSITarget m_target;
- public event EventHandler<AuthorizationRequestArgs> OnAuthorizationRequest;
- public ISCSITarget(string targetName, List<Disk> disks) : this(targetName, new VirtualSCSITarget(disks))
- {
- }
- public ISCSITarget(string targetName, SCSITarget scsiTarget)
- {
- m_targetName = targetName;
- m_target = scsiTarget;
- m_target.OnStandardInquiry += new EventHandler<StandardInquiryEventArgs>(Target_OnStandardInquiry);
- m_target.OnDeviceIdentificationInquiry += new EventHandler<DeviceIdentificationInquiryEventArgs>(Target_OnDeviceIdentificationInquiry);
- }
- public override SCSIStatusCodeName ExecuteCommand(byte[] commandBytes, LUNStructure lun, byte[] data, out byte[] response)
- {
- return m_target.ExecuteCommand(commandBytes, lun, data, out response);
- }
- public void Target_OnStandardInquiry(object sender, StandardInquiryEventArgs args)
- {
- args.Data.VersionDescriptors.Add(VersionDescriptorName.iSCSI);
- NotifyStandardInquiry(this, args);
- }
- public void Target_OnDeviceIdentificationInquiry(object sender, DeviceIdentificationInquiryEventArgs args)
- {
- // ISCSI identifier is needed for WinPE to pick up the disk during boot (after iPXE's sanhook)
- args.Page.IdentificationDescriptorList.Add(IdentificationDescriptor.GetSCSINameStringIdentifier(m_targetName));
- NotifyDeviceIdentificationInquiry(this, args);
- }
- public bool AuthorizeInitiator(string initiatorName, IPEndPoint initiatorEndPoint)
- {
- // To be thread-safe we must capture the delegate reference first
- EventHandler<AuthorizationRequestArgs> handler = OnAuthorizationRequest;
- if (handler != null)
- {
- AuthorizationRequestArgs args = new AuthorizationRequestArgs(initiatorName, initiatorEndPoint);
- OnAuthorizationRequest(this, args);
- return args.Accept;
- }
- return true;
- }
- public string TargetName
- {
- get
- {
- return m_targetName;
- }
- }
- public SCSITarget SCSITarget
- {
- get
- {
- return m_target;
- }
- }
- }
- }
|