ISCSITarget.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /* Copyright (C) 2012-2016 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Net;
  10. using System.Text;
  11. using SCSI;
  12. using Utilities;
  13. namespace ISCSI.Server
  14. {
  15. public class AuthorizationRequestArgs : EventArgs
  16. {
  17. public string InitiatorName;
  18. public IPEndPoint InitiatorEndPoint;
  19. public bool Accept = true;
  20. public AuthorizationRequestArgs(string initiatorName, IPEndPoint initiatorEndPoint)
  21. {
  22. InitiatorName = initiatorName;
  23. InitiatorEndPoint = initiatorEndPoint;
  24. }
  25. }
  26. public class ISCSITarget : SCSITarget
  27. {
  28. private string m_targetName; // ISCSI name
  29. private SCSITarget m_target;
  30. public event EventHandler<AuthorizationRequestArgs> OnAuthorizationRequest;
  31. public ISCSITarget(string targetName, List<Disk> disks) : this(targetName, new VirtualSCSITarget(disks))
  32. {
  33. }
  34. public ISCSITarget(string targetName, SCSITarget scsiTarget)
  35. {
  36. m_targetName = targetName;
  37. m_target = scsiTarget;
  38. m_target.OnStandardInquiry += new EventHandler<StandardInquiryEventArgs>(Target_OnStandardInquiry);
  39. m_target.OnDeviceIdentificationInquiry += new EventHandler<DeviceIdentificationInquiryEventArgs>(Target_OnDeviceIdentificationInquiry);
  40. }
  41. public override SCSIStatusCodeName ExecuteCommand(byte[] commandBytes, LUNStructure lun, byte[] data, out byte[] response)
  42. {
  43. return m_target.ExecuteCommand(commandBytes, lun, data, out response);
  44. }
  45. public void Target_OnStandardInquiry(object sender, StandardInquiryEventArgs args)
  46. {
  47. args.Data.VersionDescriptors.Add(VersionDescriptorName.iSCSI);
  48. NotifyStandardInquiry(this, args);
  49. }
  50. public void Target_OnDeviceIdentificationInquiry(object sender, DeviceIdentificationInquiryEventArgs args)
  51. {
  52. // ISCSI identifier is needed for WinPE to pick up the disk during boot (after iPXE's sanhook)
  53. args.Page.IdentificationDescriptorList.Add(IdentificationDescriptor.GetSCSINameStringIdentifier(m_targetName));
  54. NotifyDeviceIdentificationInquiry(this, args);
  55. }
  56. public bool AuthorizeInitiator(string initiatorName, IPEndPoint initiatorEndPoint)
  57. {
  58. // To be thread-safe we must capture the delegate reference first
  59. EventHandler<AuthorizationRequestArgs> handler = OnAuthorizationRequest;
  60. if (handler != null)
  61. {
  62. AuthorizationRequestArgs args = new AuthorizationRequestArgs(initiatorName, initiatorEndPoint);
  63. OnAuthorizationRequest(this, args);
  64. return args.Accept;
  65. }
  66. return true;
  67. }
  68. public string TargetName
  69. {
  70. get
  71. {
  72. return m_targetName;
  73. }
  74. }
  75. public SCSITarget SCSITarget
  76. {
  77. get
  78. {
  79. return m_target;
  80. }
  81. }
  82. }
  83. }