1/*
2 * Copyright (c) 2001-2007 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License").  You may not use this file except in compliance with the
9 * License.  Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22
23#ifndef _APPLERAIDUSERCLIENT_H
24#define _APPLERAIDUSERCLIENT_H
25
26// User Client method names
27enum
28{
29    kAppleRAIDClientOpen = 0,
30    kAppleRAIDClientClose,		// 1
31    kAppleRAIDGetListOfSets,		// 2
32    kAppleRAIDGetSetProperties,		// 3
33    kAppleRAIDGetMemberProperties,	// 4
34    kAppleRAIDUpdateSet,		// 5
35    kAppleLVMGetVolumesForGroup,	// 6
36    kAppleLVMGetVolumeProperties,	// 7
37    kAppleLVMGetVolumeExtents,		// 8
38    kAppleLVMUpdateLogicalVolume,	// 9
39    kAppleLVMDestroyLogicalVolume,	// 10
40    kAppleRAIDUserClientMethodsCount
41};
42
43#define kAppleRAIDMessageSetChanged	('raid')
44#define kAppleLVMMessageVolumeChanged	('lvol')
45
46enum {
47    kAppleRAIDMaxUUIDStringSize = 64				// 128bit UUID (in ascii hex plus some dashes) "uuidgen | wc" == 37
48};
49
50// update set sub commands
51enum {
52    kAppleRAIDUpdateResetSet = 1,
53    kAppleRAIDUpdateDestroySet = 2
54};
55
56#ifdef KERNEL
57
58class AppleRAIDUserClient : public IOUserClient
59{
60    OSDeclareDefaultStructors(AppleRAIDUserClient)
61
62 protected:
63    AppleRAID *				ucController;
64    task_t				ucClient;
65
66public:
67
68    virtual bool initWithTask(task_t owningTask, void * security_id, UInt32 type);
69
70    virtual bool start(IOService * provider);
71
72    virtual IOReturn clientClose(void);
73
74    virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments * arguments,
75				    IOExternalMethodDispatch * dispatch = 0,
76				    OSObject * target = 0, void * reference = 0);
77
78    // IOUserClient shims
79    static IOReturn openShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
80	{ return ((AppleRAIDUserClient *)target)->openController(); };
81    static IOReturn closeShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
82	{ return ((AppleRAIDUserClient *)target)->closeController(); };
83    static IOReturn getListOfSetsShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
84	{ return ((AppleRAIDUserClient *)target)->getListOfSets(args); };
85    static IOReturn getSetPropertiesShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
86	{ return ((AppleRAIDUserClient *)target)->getSetProperties(args); };
87    static IOReturn getMemberPropertiesShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
88	{ return ((AppleRAIDUserClient *)target)->getMemberProperties(args); };
89    static IOReturn updateSetShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
90	{ return ((AppleRAIDUserClient *)target)->updateSet(args); };
91    static IOReturn getVolumesForGroupShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
92	{ return ((AppleRAIDUserClient *)target)->getVolumesForGroup(args); };
93    static IOReturn getVolumePropertiesShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
94	{ return ((AppleRAIDUserClient *)target)->getVolumeProperties(args); };
95    static IOReturn getVolumeExtentsShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
96	{ return ((AppleRAIDUserClient *)target)->getVolumeExtents(args); };
97    static IOReturn updateLogicalVolumeShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
98	{ return ((AppleRAIDUserClient *)target)->updateLogicalVolume(args); };
99    static IOReturn destroyLogicalVolumeShim(OSObject * target, void * reference, IOExternalMethodArguments * args)
100	{ return ((AppleRAIDUserClient *)target)->destroyLogicalVolume(args); };
101
102    // IOUserClient methods
103    virtual IOReturn openController(void);
104    virtual IOReturn closeController(void);
105    virtual IOReturn getListOfSets(IOExternalMethodArguments * args);
106    virtual IOReturn getSetProperties(IOExternalMethodArguments * args);
107    virtual IOReturn getMemberProperties(IOExternalMethodArguments * args);
108    virtual IOReturn updateSet(IOExternalMethodArguments * args);
109    virtual IOReturn getVolumesForGroup(IOExternalMethodArguments * args);
110    virtual IOReturn getVolumeProperties(IOExternalMethodArguments * args);
111    virtual IOReturn getVolumeExtents(IOExternalMethodArguments * args);
112    virtual IOReturn updateLogicalVolume(IOExternalMethodArguments * args);
113    virtual IOReturn destroyLogicalVolume(IOExternalMethodArguments * args);
114};
115
116#endif KERNEL
117
118#endif _APPLERAIDUSERCLIENT_H
119