Whamcloud - gitweb
LU-5427 lbuild: Fix compilation with MPSS 3.3
[fs/lustre-release.git] / libcfs / include / libcfs / winnt / winnt-tcpip.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2012, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 #ifndef __LIBCFS_WINNT_TCPIP_H__
38 #define __LIBCFS_WINNT_TCPIP_H__
39
40 #ifndef __LIBCFS_LIBCFS_H__
41 #error Do not #include this file directly. #include <libcfs/libcfs.h> instead
42 #endif
43
44
45 #ifdef __KERNEL__
46
47 //
48 //  ks definitions
49 //
50
51 // iovec is defined in libcfs: winnt_prim.h
52 // lnetkiov_t is defined in lnet/types.h
53
54 typedef struct socket ks_tconn_t, cfs_socket_t;
55
56 // completion notification callback routine
57
58 typedef VOID (*ks_schedule_cb)(struct socket*, int);
59
60 #define SOCK_TEST_NOSPACE(s)   (1)
61
62 //
63 // tdinal definitions
64 //
65
66
67 #if DBG
68 #define KsPrint(X)     KsPrintf X
69 #else
70 #define KsPrint(X)
71 #endif
72
73
74 //
75 // Socket Addresses Related ...
76 //
77
78 #define     INADDR_ANY          (ULONG)0x00000000
79 #define     INADDR_LOOPBACK     (ULONG)0x7f000001
80 #define     INADDR_BROADCAST    (ULONG)0xffffffff
81 #define     INADDR_NONE         (ULONG)0xffffffff
82
83 /*
84  *  TCP / IP options
85  */
86
87 #define     SOL_TCP             6
88 #define     SOL_UD              17
89
90
91 #define TL_INSTANCE             0
92
93 #define TCP_SOCKET_NODELAY      1 //  disabling "Nagle"
94 #define TCP_SOCKET_KEEPALIVE    2
95 #define TCP_SOCKET_OOBINLINE    3
96 #define TCP_SOCKET_BSDURGENT    4
97 #define TCP_SOCKET_ATMARK       5
98 #define TCP_SOCKET_WINDOW       6
99
100
101 /* Flags we can use with send/ and recv.
102    Added those for 1003.1g not all are supported yet
103  */
104
105 #define MSG_OOB         1
106 #define MSG_PEEK        2
107 #define MSG_DONTROUTE   4
108 #define MSG_TRYHARD     4       /* Synonym for MSG_DONTROUTE for DECnet */
109 #define MSG_CTRUNC      8
110 #define MSG_PROBE       0x10    /* Do not send. Only probe path f.e. for MTU */
111 #define MSG_TRUNC       0x20
112 #define MSG_DONTWAIT    0x40    /* Nonblocking io                */
113 #define MSG_EOR         0x80    /* End of record */
114 #define MSG_WAITALL     0x100   /* Wait for a full request */
115 #define MSG_FIN         0x200
116 #define MSG_SYN         0x400
117 #define MSG_CONFIRM     0x800   /* Confirm path validity */
118 #define MSG_RST         0x1000
119 #define MSG_ERRQUEUE    0x2000  /* Fetch message from error queue */
120 #define MSG_NOSIGNAL    0x4000  /* Do not generate SIGPIPE */
121 #define MSG_MORE        0x8000  /* Sender will send more */
122
123 #define MSG_EOF         MSG_FIN
124
125
126 //
127 // Maximum TRANSPORT_ADDRESS Length
128 //
129 // it must >= FIELD_OFFSET(TRANSPORT_ADDRESS, Address->Address)
130 //            + TDI_ADDRESS_LENGTH_IP
131 //
132 // I define it a little large and 16 bytes aligned to avoid possible overflow.
133 //
134
135 #define MAX_ADDRESS_LENGTH              (0x30)
136
137
138 //
139 // Maximum Listers Children Sockets
140 //
141
142 #define MAX_CHILD_LISTENERS             (4)
143
144 //
145 // Maximum EA Information Length
146 //
147
148 #define EA_MAX_LENGTH                   ( sizeof(FILE_FULL_EA_INFORMATION) - 1 + \
149                                           TDI_TRANSPORT_ADDRESS_LENGTH + 1 + \
150                                           MAX_ADDRESS_LENGTH )
151
152
153 #define UDP_DEVICE_NAME L"\\Device\\Udp"
154 #define TCP_DEVICE_NAME L"\\Device\\Tcp"
155
156
157 /*
158  * TSDU definitions
159  */
160
161 #define TDINAL_TSDU_DEFAULT_SIZE  (0x10000)
162
163 #define KS_TSDU_MAGIC       'KSTD'
164
165 #define KS_TSDU_ATTACHED    0x00000001  // Attached to the socket receive tsdu list
166
167 typedef struct _KS_TSDU {
168
169     ULONG               Magic;          /* magic */
170     ULONG               Flags;          /* flags */
171
172     struct list_head    Link;           /* link list */
173
174     ULONG               TotalLength;    /* total size of KS_TSDU */
175     ULONG               StartOffset;    /* offset of the first Tsdu unit */
176     ULONG               LastOffset;     /* end offset of the last Tsdu unit */
177
178 /*
179     union {
180         KS_TSDU_DAT[];
181         KS_TSDU_BUF[];
182         KS_TSDU_MDL[];
183     }
184 */
185
186 } KS_TSDU, *PKS_TSDU;
187
188 #define TSDU_TYPE_BUF   ((USHORT)0x5401)
189 #define TSDU_TYPE_DAT   ((USHORT)0x5402)
190 #define TSDU_TYPE_MDL   ((USHORT)0x5403)
191
192 #define KS_TSDU_COMM_PARTIAL         0x0001
193
194 typedef struct _KS_TSDU_BUF {
195
196     USHORT              TsduType;
197     USHORT              TsduFlags;
198
199     ULONG               DataLength;
200     ULONG               StartOffset;
201
202     PVOID               UserBuffer;
203     PMDL                Mdl;         /* mdl */
204 } KS_TSDU_BUF, *PKS_TSDU_BUF;
205
206 typedef struct _KS_TSDU_DAT {
207
208     USHORT              TsduType;
209     USHORT              TsduFlags;
210
211     ULONG               DataLength;
212     ULONG               StartOffset;
213
214     ULONG               TotalLength;
215     PMDL                Mdl;        /* mdl */
216
217     UCHAR               Data[0];
218
219 } KS_TSDU_DAT, *PKS_TSDU_DAT;
220
221 #define KS_QWORD_ALIGN(x)      (((x) + 0x07) & 0xFFFFFFF8)
222 #define KS_TSDU_STRU_SIZE(Len) (KS_QWORD_ALIGN((Len) + FIELD_OFFSET(KS_TSDU_DAT, Data[0])))
223
224 typedef struct _KS_TSDU_MDL {
225     USHORT              TsduType;      /* TSDU_TYPE_MDL */
226     USHORT              TsduFlags;     /* */
227
228     ULONG               DataLength;    /* total valid data length */
229     ULONG               BaseOffset;    /* payload offset in Tsdu */
230     ULONG               StartOffset;   /* offset in payload */
231
232     PVOID               Descriptor;    /* tdi descriptor for receiving */
233     PMDL                Mdl;
234 } KS_TSDU_MDL, *PKS_TSDU_MDL;
235
236 typedef struct ks_engine_mgr {
237         spinlock_t       lock;
238         int              stop;
239         event_t          exit;
240         event_t          start;
241         struct list_head list;
242 } ks_engine_mgr_t;
243
244 typedef struct ks_engine_slot {
245     ks_tconn_t          *tconn;
246     void                *tsdumgr;
247     struct list_head    link;
248     int                 queued;
249     ks_engine_mgr_t     *emgr;
250 } ks_engine_slot_t;
251
252 typedef struct _KS_TSDUMGR {
253         struct list_head        TsduList;
254         ULONG                   NumOfTsdu;
255         ULONG                   TotalBytes;
256         KEVENT                  Event;
257         spinlock_t              Lock;
258         ks_engine_slot_t        Slot;
259         ULONG                   Payload;
260         int                     Busy:1;
261         int                     OOB:1;
262 } KS_TSDUMGR, *PKS_TSDUMGR;
263
264 #define ks_lock_tsdumgr(mgr)    spin_lock(&((mgr)->Lock))
265 #define ks_unlock_tsdumgr(mgr)  spin_unlock(&((mgr)->Lock))
266
267 typedef struct _KS_CHAIN {
268     KS_TSDUMGR          Normal;      /* normal queue */
269     KS_TSDUMGR          Expedited;   /* OOB/expedited queue */
270 } KS_CHAIN, *PKS_CHAIN;
271
272
273 #define KS_CAN_SCHED(TM) ((TM)->TotalBytes >= ((TM)->Payload >> 2))
274
275 //
276 // Handler Settings Indictor 
277 //
278
279 #define TDI_EVENT_MAXIMUM_HANDLER (TDI_EVENT_ERROR_EX + 1)
280
281
282 typedef struct _KS_EVENT_HANDLERS {
283     BOOLEAN     IsActive[TDI_EVENT_MAXIMUM_HANDLER];
284     PVOID       Handler [TDI_EVENT_MAXIMUM_HANDLER];
285 } KS_EVENT_HANDLERS, *PKS_EVENT_HANDLERS;
286
287 #define SetEventHandler(ha, ht, hr) do {        \
288             ha.IsActive[ht] = TRUE;             \
289             ha.Handler[ht] = (PVOID) (hr);      \
290         } while(0)
291
292 //
293 // KSock Internal Structures
294 //
295
296 typedef struct _KS_ADDRESS {
297
298     union {
299         TRANSPORT_ADDRESS   Tdi;
300         UCHAR               Pading[MAX_ADDRESS_LENGTH];
301     };
302
303     HANDLE                  Handle;
304     PFILE_OBJECT            FileObject;
305
306 } KS_ADDRESS, *PKS_ADDRESS;
307
308 //
309 // Structures for Disconnect Workitem
310 //
311
312 typedef struct _KS_DISCONNECT_WORKITEM {
313
314     WORK_QUEUE_ITEM         WorkItem;       // Workitem to perform disconnection
315     ks_tconn_t *            tconn;          // tdi connecton
316     ULONG                   Flags;          // connection broken/discnnection flags
317     KEVENT                  Event;          // sync event
318
319 } KS_DISCONNECT_WORKITEM, *PKS_DISCONNECT_WORKITEM;
320
321
322 typedef struct _KS_CONNECTION {
323
324     HANDLE                      Handle;     // Handle of the tdi connection
325     PFILE_OBJECT                FileObject; // FileObject if the conn object
326
327     PTRANSPORT_ADDRESS          Remote;     // the ConnectionInfo of this connection
328     PTDI_CONNECTION_INFORMATION ConnectionInfo;
329
330     ULONG                       nagle;      // Tcp options 
331
332 } KS_CONNECTION, *PKS_CONNECTION;
333
334
335 //
336 // type definitions
337 //
338
339 typedef MDL                         ks_mdl_t;
340 typedef UNICODE_STRING              ks_unicode_name_t;
341 typedef WORK_QUEUE_ITEM             ks_workitem_t;
342
343
344 typedef KS_CHAIN                    ks_chain_t;
345 typedef KS_ADDRESS                  ks_tdi_addr_t;
346 typedef KS_CONNECTION               ks_tconn_info_t;
347 typedef KS_DISCONNECT_WORKITEM      ks_disconnect_t;
348
349
350 //
351 // Structures for transmission done Workitem
352 //
353
354 typedef struct ks_backlogs {
355         struct list_head        list;   /* list to link the backlog connections */
356         int                     num;    /* number of backlogs in the list */
357 } ks_backlogs_t;
358
359
360 typedef struct ks_daemon {
361     ks_tconn_t          *tconn;         /* the listener connection object */
362     unsigned short      nbacklogs;      /* number of listening backlog conns */
363     unsigned short      port;           /* listening port number */
364     int                 shutdown;       /* daemon threads is to exit */
365     struct list_head    list;           /* to be attached into ks_nal_data_t */
366
367 } ks_daemon_t;
368
369 typedef enum {
370
371     kstt_sender = 0,    // normal sending connection type, it's active connection, while
372                         // child tconn is for passive connection.
373
374     kstt_listener,      // listener daemon type, it just acts as a daemon, and it does
375                         // not have real connection. It manages children tcons to accept
376                         // or refuse the connecting request from remote peers.
377
378     kstt_child,         // accepted child connection type, it's parent must be Listener
379
380     kstt_lasttype
381
382 } ks_tconn_type_t;
383
384 typedef enum {
385
386     ksts_uninited = 0,  // tconn is just allocated (zero values), not initialized yet
387
388     ksts_inited,        // tconn structure initialized: so it now can be identified as
389                         // a sender, listener or a child
390
391     ksts_bind,          // tconn is bound: the local address object (ip/port) is created.
392                         // after being bound, we must call ksocknal_put_tconn to release
393                         // the tconn objects, it's not safe just to free the memory of tconn.
394
395     ksts_associated,    // the connection object is created and associated with the address
396                         // object. so it's ready for connection. only for child and sender.
397
398     ksts_connecting,    // only used by child tconn: in the ConnectEvent handler routine,
399                         // it indicts the child tconn is busy to be connected to the peer.
400
401     ksts_connected,     // the connection is built already: for sender and child
402
403     ksts_listening,     // listener daemon is working, only for listener tconn
404
405     ksts_disconnected,  // disconnected by user
406     ksts_aborted,       // un-exptected broken status
407
408     ksts_last           // total number of tconn statuses
409
410 } ks_tconn_state_t;
411
412 #define KS_TCONN_MAGIC              'KSTM'
413
414 #define KS_TCONN_HANDLERS_SET       0x00000001  // Conection handlers are set.
415 #define KS_TCONN_DISCONNECT_BUSY    0x00010000  // Disconnect Workitem is queued ...
416 #define KS_TCONN_DESTROY_BUSY       0x00020000  // Destory Workitem is queued ...
417
418 #define KS_TCONN_DAEMON_STARTED     0x00100000  // indict the daemon is started,
419                                                 // only valid for listener
420 struct socket {
421
422         ulong                       kstc_magic;      /* Magic & Flags */
423         ulong                       kstc_flags;
424
425         spinlock_t                  kstc_lock;       /* serialise lock*/
426         void *                      kstc_conn;       /* ks_conn_t */
427
428         ks_tconn_type_t             kstc_type;           /* tdi connection Type */
429         ks_tconn_state_t            kstc_state;      /* tdi connection state flag */
430
431         ks_unicode_name_t           kstc_dev;        /* tcp transport device name */
432
433         ks_tdi_addr_t               kstc_addr;       /* local address handlers / Objects */
434
435         atomic_t                    kstc_refcount;   /* reference count of ks_tconn_t */
436
437         struct list_head        kstc_list;      /* linked to global ksocknal_data */
438
439         union {
440
441             struct {
442                 int                 nbacklog;         /* total number of backlog tdi connections */
443                 ks_backlogs_t       kstc_listening;   /* listeing backlog child connections */
444                 ks_backlogs_t       kstc_accepted;    /* connected backlog child connections */
445                 event_t             kstc_accept_event;   /* Signaled by AcceptedHander, 
446                                                             ksocknal_wait_accpeted_conns waits on */
447                 event_t             kstc_destroy_event;  /* Signaled when accepted child is released */
448             } listener; 
449
450             struct  {
451                 ks_tconn_info_t       kstc_info;      /* Connection Info if Connected */
452                 ks_chain_t            kstc_recv;      /* tsdu engine for data receiving */
453                 ks_chain_t            kstc_send;      /* tsdu engine for data sending */
454
455                 int                   kstc_queued;    /* Attached to Parent->ChildList ... */
456                 int                   kstc_queueno;   /* 0: Attached to Listening list 
457                                                        1: Attached to Accepted list */
458
459                 int                   kstc_busy;      /* referred by ConnectEventCallback ? */
460                 int                   kstc_accepted;  /* the connection is built ready ? */
461
462                 struct list_head        kstc_link;      /* linked to parent tdi connection */
463                 ks_tconn_t              *kstc_parent;   /* pointers to it's listener parent */
464             } child;
465
466             struct {
467                 ks_tconn_info_t     kstc_info;      /* Connection Info if Connected */
468                 ks_chain_t          kstc_recv;      /* tsdu engine for data receiving */
469                 ks_chain_t          kstc_send;      /* tsdu engine for data sending */
470             } sender; 
471         };
472
473         ulong                       kstc_snd_wnd;   /* Sending window size */
474         ulong                       kstc_rcv_wnd;   /* Recving window size */
475
476         ks_workitem_t               kstc_destroy;    /* tconn destruction workitem */
477         ks_disconnect_t             kstc_disconnect; /* connection disconnect workitem */
478
479         ks_schedule_cb              kstc_sched_cb;   /* notification callback routine of completion */
480 };
481
482 static inline int
483 libcfs_sock_error(struct socket *sock)
484 {
485         return (sock->kstc_state >= ksts_disconnected) ? ECONNRESET : 0;
486 }
487
488
489 static inline int
490 libcfs_sock_wmem_queued(struct socket *sock)
491 {
492         return 0;
493 }
494
495 #define TDINAL_WINDOW_DEFAULT_SIZE  (0x100000)
496 #define TDINAL_MAX_TSDU_QUEUE_SIZE  (0x200000)
497
498 struct _KS_UDP_COMPLETION_CONTEXT;
499 struct _KS_TCP_COMPLETION_CONTEXT;
500
501
502 typedef
503 NTSTATUS
504 (*PKS_UDP_COMPLETION_ROUTINE) (
505     IN PIRP     Irp,
506     IN struct _KS_UDP_COMPLETION_CONTEXT
507                 *UdpContext
508     );
509
510
511 typedef
512 NTSTATUS
513 (*PKS_TCP_COMPLETION_ROUTINE) (
514     IN PIRP     Irp,
515     IN struct _KS_TCP_COMPLETION_CONTEXT
516                 *TcpContext
517     );
518
519 //
520 // Udp Irp Completion Context
521 //
522
523 typedef struct _KS_UDP_COMPLETION_CONTEXT {
524
525     PKEVENT                             Event;
526     union {
527         PFILE_OBJECT                    AddressObject;
528         ks_tconn_t *                    tconn;
529     };
530
531     PKS_UDP_COMPLETION_ROUTINE          CompletionRoutine;
532     PVOID                               CompletionContext;
533
534 } KS_UDP_COMPLETION_CONTEXT, *PKS_UDP_COMPLETION_CONTEXT;
535
536
537 //
538 // Tcp Irp Completion Context (used by tcp data recv/send)
539 //
540
541 #define KS_TCP_CONTEXT_MAGIC 'CCTK'
542
543 typedef struct _KS_TCP_COMPLETION_CONTEXT {
544     PKEVENT                             Event;      // Event to be waited on by Irp caller ...
545     ks_tconn_t *                        tconn;      // the tdi connection
546     PKS_TCP_COMPLETION_ROUTINE          CompletionRoutine;
547     PVOID                               CompletionContext;
548     PKS_TSDUMGR                         TsduMgr;    // Tsdu buffer manager
549     ULONG                               Length;     // Payload length in KsTsdu queue
550     PCHAR                               Buffer;     // User allocated buffer
551     ULONG                               Magic;      // Magic key
552 } KS_TCP_COMPLETION_CONTEXT, *PKS_TCP_COMPLETION_CONTEXT;
553
554 typedef KS_TCP_COMPLETION_CONTEXT  ks_tdi_tx_t, ks_tdi_rx_t;
555
556
557 /*
558  * tdi extensions
559  */
560
561 #define IOCTL_TCP_QUERY_INFORMATION_EX        \
562                         CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
563 #define IOCTL_TCP_SET_INFORMATION_EX        \
564                         CTL_CODE(FILE_DEVICE_NETWORK, 1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
565
566
567 #define TcpBuildSetInformationEx(Irp, DevObj, FileObj, CompRoutine, Contxt, Buffer, BufferLen)\
568     {                                                                        \
569         PIO_STACK_LOCATION _IRPSP;                                           \
570         if ( CompRoutine != NULL) {                                          \
571             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
572         } else {                                                             \
573             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
574         }                                                                    \
575         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
576         _IRPSP->MajorFunction = IRP_MJ_DEVICE_CONTROL;                       \
577         _IRPSP->DeviceObject = DevObj;                                       \
578         _IRPSP->FileObject = FileObj;                                        \
579         _IRPSP->Parameters.DeviceIoControl.OutputBufferLength = 0;           \
580         _IRPSP->Parameters.DeviceIoControl.InputBufferLength = BufferLen;    \
581         _IRPSP->Parameters.DeviceIoControl.IoControlCode = IOCTL_TCP_SET_INFORMATION_EX;  \
582         Irp->AssociatedIrp.SystemBuffer = Buffer;                            \
583     }
584
585
586 #define TcpBuildQueryInformationEx(Irp, DevObj, FileObj, CompRoutine, Contxt, InBuffer, InLength, OutBuffer, OutLength)\
587     {                                                                        \
588         PIO_STACK_LOCATION _IRPSP;                                           \
589         if ( CompRoutine != NULL) {                                          \
590             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
591         } else {                                                             \
592             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
593         }                                                                    \
594         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
595         _IRPSP->MajorFunction = IRP_MJ_DEVICE_CONTROL;                       \
596         _IRPSP->DeviceObject = DevObj;                                       \
597         _IRPSP->FileObject = FileObj;                                        \
598         _IRPSP->Parameters.DeviceIoControl.OutputBufferLength = OutLength;           \
599         _IRPSP->Parameters.DeviceIoControl.InputBufferLength = InLength;    \
600         _IRPSP->Parameters.DeviceIoControl.IoControlCode = IOCTL_TCP_QUERY_INFORMATION_EX;  \
601         _IRPSP->Parameters.DeviceIoControl.Type3InputBuffer = InBuffer;    \
602         Irp->UserBuffer = OutBuffer;                            \
603     }
604
605 typedef struct ks_addr_slot {
606     LIST_ENTRY      link;
607     int             up;
608     char            iface[40];
609     __u32           ip_addr;
610     __u32           netmask;
611     UNICODE_STRING  devname;
612     WCHAR           buffer[1];
613 } ks_addr_slot_t;
614
615 typedef struct {
616         /*
617          * Tdi client information
618          */
619
620         UNICODE_STRING  ksnd_client_name;       /* tdi client module name */
621         HANDLE          ksnd_pnp_handle;        /* the handle for pnp changes */
622
623         spinlock_t      ksnd_addrs_lock;        /* serialize ip address list */
624         LIST_ENTRY      ksnd_addrs_list;        /* list of the ip addresses */
625         int             ksnd_naddrs;            /* number of the ip addresses */
626
627         /*
628          *  Tdilnd internal defintions
629          */
630         int             ksnd_init;              /* initialisation state */
631
632         TDI_PROVIDER_INFO ksnd_provider;        /* tdi tcp/ip provider's information */
633
634         spinlock_t      ksnd_tconn_lock;        /* tdi connections access lock*/
635
636         int             ksnd_ntconns;           /* number of tconns in list */
637         struct list_head ksnd_tconns;   /* tdi connections list */
638         struct kmem_cache *ksnd_tconn_slab;     /* ks_tconn_t allocation slabs*/
639         event_t         ksnd_tconn_exit;        /* event signal by last tconn */
640
641         spinlock_t      ksnd_tsdu_lock;         /* tsdu access serialise */
642
643         int             ksnd_ntsdus;            /* number of tsdu buffers allocated */
644         ulong           ksnd_tsdu_size;         /* the size of a signel tsdu buffer */
645         struct kmem_cache *ksnd_tsdu_slab;      /* slab cache for tsdu buffer allocation */
646
647         int              ksnd_nfreetsdus;       /* number of tsdu buffers in the freed list */
648         struct list_head ksnd_freetsdus;        /* List of the freed Tsdu buffer. */
649
650         int             ksnd_engine_nums;       /* number of tcp sending engine threads */
651         ks_engine_mgr_t *ksnd_engine_mgr;       /* tcp sending engine structure */
652 } ks_tdi_data_t;
653
654 int
655 ks_init_tdi_data();
656
657 void
658 ks_fini_tdi_data();
659
660
661 int
662 ks_query_local_ipaddr(
663     ks_tconn_t *     tconn
664     );
665
666 void
667 ks_get_tconn(
668     ks_tconn_t * tconn
669     );
670
671 void
672 ks_put_tconn(
673     ks_tconn_t * tconn
674     );
675
676 void
677 ks_abort_tconn(
678   ks_tconn_t *     tconn
679     );
680 int
681 ks_disconnect_tconn(
682     ks_tconn_t *    tconn,
683     ulong           flags
684     );
685
686 void
687 ks_destroy_tconn(
688     ks_tconn_t *     tconn
689     );
690
691 NTSTATUS
692 KsLockUserBuffer (
693     IN PVOID            UserBuffer,
694     IN BOOLEAN          bPaged,
695     IN ULONG            Length,
696     IN LOCK_OPERATION   Operation,
697     OUT PMDL *          pMdl
698     );
699
700 VOID
701 KsReleaseMdl (IN PMDL   Mdl,
702               IN int    Paged );
703
704 void
705 KsQueueTdiEngine(ks_tconn_t * tconn, PKS_TSDUMGR);
706
707 void
708 KsRemoveTdiEngine(PKS_TSDUMGR);
709
710 NTSTATUS
711 ks_set_tcp_option (
712     ks_tconn_t *    tconn,
713     ULONG           ID,
714     PVOID           OptionValue,
715     ULONG           Length
716     );
717
718 int
719 ks_get_tcp_option (
720     ks_tconn_t *        tconn,
721     ULONG               ID,
722     PVOID               OptionValue,
723     PULONG              Length
724     );
725
726 #endif /* __KERNEL__ */
727 #endif /* __LIBCFS_WINNT_TCPIP_H__ */
728
729 /*
730  * Local variables:
731  * c-indentation-style: "K&R"
732  * c-basic-offset: 8
733  * tab-width: 8
734  * fill-column: 80
735  * scroll-step: 1
736  * End:
737  */