ISCSITarget.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 ISCSITarget : SCSITarget
  16. {
  17. private string m_targetName; // ISCSI name
  18. private SCSITarget m_target;
  19. public event EventHandler<AuthorizationRequestArgs> OnAuthorizationRequest;
  20. public event EventHandler<SessionTerminationArgs> OnSessionTermination;
  21. public ISCSITarget(string targetName, List<Disk> disks) : this(targetName, new VirtualSCSITarget(disks))
  22. {
  23. }
  24. public ISCSITarget(string targetName, SCSITarget scsiTarget)
  25. {
  26. m_targetName = targetName;
  27. m_target = scsiTarget;
  28. m_target.OnStandardInquiry += new EventHandler<StandardInquiryEventArgs>(Target_OnStandardInquiry);
  29. m_target.OnDeviceIdentificationInquiry += new EventHandler<DeviceIdentificationInquiryEventArgs>(Target_OnDeviceIdentificationInquiry);
  30. }
  31. public override SCSIStatusCodeName ExecuteCommand(byte[] commandBytes, LUNStructure lun, byte[] data, out byte[] response)
  32. {
  33. return m_target.ExecuteCommand(commandBytes, lun, data, out response);
  34. }
  35. public void Target_OnStandardInquiry(object sender, StandardInquiryEventArgs args)
  36. {
  37. args.Data.VersionDescriptors.Add(VersionDescriptorName.iSCSI);
  38. NotifyStandardInquiry(this, args);
  39. }
  40. public void Target_OnDeviceIdentificationInquiry(object sender, DeviceIdentificationInquiryEventArgs args)
  41. {
  42. // ISCSI identifier is needed for WinPE to pick up the disk during boot (after iPXE's sanhook)
  43. args.Page.IdentificationDescriptorList.Add(IdentificationDescriptor.GetSCSINameStringIdentifier(m_targetName));
  44. NotifyDeviceIdentificationInquiry(this, args);
  45. }
  46. public bool AuthorizeInitiator(string initiatorName, ulong isid, IPEndPoint initiatorEndPoint)
  47. {
  48. // To be thread-safe we must capture the delegate reference first
  49. EventHandler<AuthorizationRequestArgs> handler = OnAuthorizationRequest;
  50. if (handler != null)
  51. {
  52. AuthorizationRequestArgs args = new AuthorizationRequestArgs(initiatorName, isid, initiatorEndPoint);
  53. OnAuthorizationRequest(this, args);
  54. return args.Accept;
  55. }
  56. return true;
  57. }
  58. internal void NotifySessionTermination(string initiatorName, ulong isid, SessionTerminationReason reason)
  59. {
  60. EventHandler<SessionTerminationArgs> handler = OnSessionTermination;
  61. if (handler != null)
  62. {
  63. SessionTerminationArgs args = new SessionTerminationArgs(initiatorName, isid, reason);
  64. OnSessionTermination(this, args);
  65. }
  66. }
  67. public string TargetName
  68. {
  69. get
  70. {
  71. return m_targetName;
  72. }
  73. }
  74. public SCSITarget SCSITarget
  75. {
  76. get
  77. {
  78. return m_target;
  79. }
  80. }
  81. }
  82. }