xref: /haiku/headers/private/kernel/boot/net/iSCSITarget.h (revision 5b086e27e874a6c81f5d6043f7bbcf7643840553)
1 /*
2  * Copyright 2010, Andreas Färber <andreas.faerber@web.de>
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 #ifndef BOOT_NET_ISCSITARGET_H
6 #define BOOT_NET_ISCSITARGET_H
7 
8 
9 #include <SupportDefs.h>
10 #include <util/kernel_cpp.h>
11 
12 #include <boot/platform.h>
13 #include <boot/stdio.h>
14 #include <boot/vfs.h>
15 #include <boot/net/NetDefs.h>
16 
17 
18 #define ISCSI_PORT 3260
19 
20 class TCPSocket;
21 
22 class iSCSISession;
23 
24 struct iscsi_basic_header_segment;
25 
26 #define kTcpTimeout	10000000ULL
27 
28 
29 class iSCSIConnection {
30 public:
31 	iSCSIConnection();
32 	virtual ~iSCSIConnection();
33 
34 	status_t Init(iSCSISession* session);
35 	status_t Open(ip_addr_t address, uint16 port);
36 	status_t Login(const char* targetName = NULL, char** targetAlias = NULL);
37 	status_t Logout(bool closeSession = false);
38 	status_t GetText(const char* request, size_t requestLength, char** response, size_t* responseLength);
39 	status_t SendCommand(const void* command, size_t commandSize,
40 		bool r, bool w, uint32 expectedDataTransferLength,
41 		void* response, uint32 responseOffset, size_t responseLength);
42 
Active()43 	bool Active() const { return fConnected; }
44 
45 private:
46 	status_t	_ReadResponse(iscsi_basic_header_segment* buffer, bigtime_t timeout = kTcpTimeout);
47 	status_t	_Read(void* buffer, size_t bufferSize, bigtime_t timeout = kTcpTimeout);
48 
49 	iSCSISession* fSession;
50 	TCPSocket* fSocket;
51 	bool fConnected;
52 	uint16 fConnectionID;
53 	uint32 fStatusSequenceNumber;
54 };
55 
56 class iSCSISession {
57 public:
58 	iSCSISession(const char* targetName = NULL);
59 	virtual ~iSCSISession();
60 
61 	status_t Init(ip_addr_t address, uint16 port, char** targetAlias = NULL);
62 	status_t Close();
63 
CommandSequenceNumber()64 	uint32 CommandSequenceNumber() const { return fCommandSequenceNumber; }
NextCommandSequenceNumber()65 	uint32 NextCommandSequenceNumber() { return fCommandSequenceNumber++; }
Connection()66 	iSCSIConnection* Connection() const { return fConnection; }
67 
Active()68 	bool Active() { return fConnection != NULL && fConnection->Active(); }
69 
70 private:
71 	bool fDiscovery;
72 	const char* fTargetName;
73 	uint32 fCommandSequenceNumber;
74 	iSCSIConnection* fConnection;
75 		// XXX should allow for multiple
76 };
77 
78 class iSCSITarget : public Node {
79 public:
80 	iSCSITarget();
81 	virtual ~iSCSITarget();
82 	status_t Init(ip_addr_t address, uint16 port, const char* targetName);
83 
84 	virtual ssize_t ReadAt(void* cookie, off_t pos, void* buffer,
85 		size_t bufferSize);
86 	virtual ssize_t WriteAt(void* cookie, off_t pos, const void* buffer,
87 		size_t bufferSize);
88 
89 	virtual status_t GetName(char* buffer, size_t bufferSize) const;
90 	virtual off_t Size() const;
91 
92 	static bool DiscoverTargets(ip_addr_t address, uint16 port,
93 		NodeList* devicesList);
94 	static bool _AddDevice(ip_addr_t address, uint16 port,
95 		const char* targetName, NodeList* devicesList);
96 
97 private:
98 	status_t _GetSize();
99 
100 	iSCSISession* fSession;
101 	char* fTargetName;
102 	char* fTargetAlias;
103 	uint32 fLastLBA;
104 	uint32 fBlockSize;
105 };
106 
107 
108 #endif
109