e731a5719c1315f5394a99b489fe39630e156de2
[samba.git] / source4 / rpc_server / dcerpc_server.h
1 /* 
2    Unix SMB/CIFS implementation.
3
4    server side dcerpc defines
5
6    Copyright (C) Andrew Tridgell 2003
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23
24 enum endpoint_type {ENDPOINT_SMB, ENDPOINT_TCP};
25
26 /* a description of a single dcerpc endpoint. Not as flexible as a full epm tower,
27    but much easier to work with */
28 struct dcesrv_endpoint {
29         enum endpoint_type type;
30         union {
31                 const char *smb_pipe;
32                 uint32 tcp_port;
33         } info;
34 };
35
36 /* a endpoint combined with an interface description */
37 struct dcesrv_ep_iface {
38         const char *name;
39         struct dcesrv_endpoint endpoint;
40         const char *uuid;
41         uint32 if_version;
42 };
43
44 struct dcesrv_state;
45
46 /* the dispatch functions for an interface take this form */
47 typedef NTSTATUS (*dcesrv_dispatch_fn_t)(struct dcesrv_state *, TALLOC_CTX *, void *); 
48
49 /* the state of an ongoing dcerpc call */
50 struct dcesrv_call_state {
51         struct dcesrv_call_state *next, *prev;
52         struct dcesrv_state *dce;
53         TALLOC_CTX *mem_ctx;
54         struct dcerpc_packet pkt;
55
56         DATA_BLOB input;
57
58         struct dcesrv_call_reply {
59                 struct dcesrv_call_reply *next, *prev;
60                 DATA_BLOB data;
61         } *replies;
62 };
63
64
65 /* a dcerpc handle in internal format */
66 struct dcesrv_handle {
67         struct dcesrv_handle *next, *prev;
68         struct policy_handle wire_handle;
69         TALLOC_CTX *mem_ctx;
70         void *data;
71 };
72
73 /* hold the authentication state information */
74 struct dcesrv_auth {
75         struct auth_ntlmssp_state *ntlmssp_state;
76         struct dcerpc_auth *auth_info;
77 };
78
79
80 /* the state associated with a dcerpc server connection */
81 struct dcesrv_state {
82         /* the top level context for this server */
83         struct dcesrv_context *dce;
84
85         TALLOC_CTX *mem_ctx;
86
87         /* the endpoint that was opened */
88         struct dcesrv_endpoint endpoint;
89
90         /* endpoint operations provided by the endpoint server */
91         const struct dcesrv_endpoint_ops *ops;
92
93         /* the ndr function table for the chosen interface */
94         const struct dcerpc_interface_table *ndr;
95
96         /* the dispatch table for the chosen interface. Must contain
97            enough entries for all entries in the ndr table */
98         const dcesrv_dispatch_fn_t *dispatch;
99
100         /* the state of the current calls */
101         struct dcesrv_call_state *call_list;
102
103         /* the maximum size the client wants to receive */
104         uint32 cli_max_recv_frag;
105
106         /* private data for the endpoint server */
107         void *private;
108
109         /* current rpc handles - this is really the wrong scope for
110            them, but it will do for now */
111         uint32 next_handle;
112         struct dcesrv_handle *handles;
113
114         DATA_BLOB partial_input;
115
116         /* the current authentication state */
117         struct dcesrv_auth auth_state;
118 };
119
120
121 struct dcesrv_endpoint_ops {
122         /* this function is used to ask an endpoint server if it
123            handles a particular endpoint */
124         BOOL (*query_endpoint)(const struct dcesrv_endpoint *);
125
126         /* this function sets up the dispatch table for this
127            connection */
128         BOOL (*set_interface)(struct dcesrv_state *, const char *, uint32);
129
130         /* connect() is called when a connection is made to an endpoint */
131         NTSTATUS (*connect)(struct dcesrv_state *);
132
133         /* disconnect() is called when the endpoint is disconnected */
134         void (*disconnect)(struct dcesrv_state *);
135
136         /* this function is used to ask an endpoint server for a list
137            of endpoints/interfaces it wants to handle */
138         int (*lookup_endpoints)(TALLOC_CTX *mem_ctx, struct dcesrv_ep_iface **);
139 };
140
141
142 /* server-wide context information for the dcerpc server */
143 struct dcesrv_context {
144         
145         /* the list of endpoints servers that have registered */
146         struct dce_endpoint {
147                 struct dce_endpoint *next, *prev;
148                 struct dcesrv_endpoint endpoint;
149                 const struct dcesrv_endpoint_ops *endpoint_ops;
150         } *endpoint_list;
151 };