Main Page   Modules   Data Structures   File List   Data Fields   Globals  

Packet.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 1999, 2000
00003  *  Politecnico di Torino.  All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that: (1) source code distributions
00007  * retain the above copyright notice and this paragraph in its entirety, (2)
00008  * distributions including binary code include the above copyright notice and
00009  * this paragraph in its entirety in the documentation or other materials
00010  * provided with the distribution, and (3) all advertising materials mentioning
00011  * features or use of this software display the following acknowledgement:
00012  * ``This product includes software developed by the Politecnico
00013  * di Torino, and its contributors.'' Neither the name of
00014  * the University nor the names of its contributors may be used to endorse
00015  * or promote products derived from this software without specific prior
00016  * written permission.
00017  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
00018  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
00019  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00020  */
00021 
00030 #ifndef __PACKET_INCLUDE______
00031 #define __PACKET_INCLUDE______
00032 
00033 #define NTKERNEL    
00034 
00035 #include "jitter.h"
00036 #include "tme.h"
00037 
00038 #define  MAX_REQUESTS   32 
00039 
00040 #define Packet_ALIGNMENT sizeof(int) 
00041 #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1))  
00042 
00043 
00044 
00045 /***************************/
00046 /*         IOCTLs          */
00047 /***************************/
00048 
00057 #define  BIOCSETBUFFERSIZE 9592
00058 
00069 #define  BIOCSETF 9030
00070 
00077 #define  BIOCGSTATS 9031
00078 
00084 #define  BIOCSRTIMEOUT 7416
00085 
00093 #define  BIOCSMODE 7412
00094 
00101 #define  BIOCSWRITEREP 7413
00102 
00108 #define  BIOCSMINTOCOPY 7414
00109 
00115 #define  BIOCSETOID 2147483648
00116 
00122 #define  BIOCQUERYOID 2147483652
00123 
00131 #define  BIOCSETDUMPFILENAME 9029
00132 
00139 #define  BIOCGEVNAME 7415
00140 
00148 #define  BIOCSENDPACKETSNOSYNC 9032
00149 
00158 #define  BIOCSENDPACKETSSYNC 9033
00159 
00166 #define  BIOCSETDUMPLIMITS 9034
00167 
00174 #define BIOCISDUMPENDED 7411
00175 
00176 // Working modes
00177 #define MODE_CAPT 0x0       
00178 #define MODE_STAT 0x1       
00179 #define MODE_MON  0x2       
00180 #define MODE_DUMP 0x10      
00181 
00182 
00183 #define IMMEDIATE 1         
00184 
00185 
00186 // The following definitions are used to provide compatibility 
00187 // of the dump files with the ones of libpcap
00188 #define TCPDUMP_MAGIC 0xa1b2c3d4    
00189 #define PCAP_VERSION_MAJOR 2        
00190 #define PCAP_VERSION_MINOR 4        
00191 
00192 
00197 struct packet_file_header 
00198 {
00199     UINT magic;             
00200     USHORT version_major;   
00201     USHORT version_minor;   
00202     UINT thiszone;          
00203     UINT sigfigs;           
00204     UINT snaplen;           
00205     UINT linktype;          
00206 };
00207 
00212 struct sf_pkthdr {
00213     struct timeval  ts;         
00214     UINT            caplen;     
00215 
00216 
00217     UINT            len;        
00218 };
00219 
00229 typedef struct _INTERNAL_REQUEST {
00230     LIST_ENTRY     ListElement;     
00231     PIRP           Irp;             
00232     NDIS_REQUEST   Request;         
00233 } INTERNAL_REQUEST, *PINTERNAL_REQUEST;
00234 
00242 typedef struct _PACKET_RESERVED {
00243     LIST_ENTRY      ListElement;        
00244     PIRP            Irp;                
00245     PMDL            pMdl;               
00246     BOOLEAN         FreeBufAfterWrite;  
00247 
00248 }  PACKET_RESERVED, *PPACKET_RESERVED;
00249 
00250 #define RESERVED(_p) ((PPACKET_RESERVED)((_p)->ProtocolReserved)) 
00251 
00252 
00257 typedef struct _DEVICE_EXTENSION {
00258     PDEVICE_OBJECT DeviceObject;        
00259     NDIS_HANDLE    NdisProtocolHandle;  
00260     NDIS_STRING    AdapterName;         
00261     PWSTR          BindString;          
00262     PWSTR          ExportString;        
00263 
00264 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
00265 
00273 typedef struct _OPEN_INSTANCE
00274 {
00275     PDEVICE_EXTENSION   DeviceExtension;    
00276 
00277     NDIS_HANDLE         AdapterHandle;      
00278     UINT                Medium;             
00279 
00280     NDIS_HANDLE         PacketPool;         
00281     PIRP                OpenCloseIrp;       
00282 
00283     KSPIN_LOCK          RequestSpinLock;    
00284     LIST_ENTRY          RequestList;        
00285     LIST_ENTRY          ResetIrpList;       
00286     INTERNAL_REQUEST    Requests[MAX_REQUESTS]; 
00287     PMDL                BufferMdl;          
00288     PKEVENT             ReadEvent;          
00289     HANDLE              ReadEventHandle;    
00290     UNICODE_STRING      ReadEventName;      
00291 
00292 
00293 
00294     INT                 Received;           
00295 
00296 
00297     INT                 Dropped;            
00298 
00299 
00300     INT                 Accepted;           
00301 
00302 
00303     PUCHAR              bpfprogram;         
00304 
00305 
00306 
00307 
00308     JIT_BPF_Filter      *Filter;            
00309 
00310     PUCHAR              Buffer;             
00311 
00312     UINT                Bhead;              
00313     UINT                Btail;              
00314     UINT                BufSize;            
00315     UINT                BLastByte;          
00316     PMDL                TransferMdl;        
00317 
00318     NDIS_SPIN_LOCK      BufLock;            
00319     UINT                MinToCopy;          
00320 
00321     LARGE_INTEGER       TimeOut;            
00322 
00323                                             
00324     int                 mode;               
00325     LARGE_INTEGER       Nbytes;             
00326     LARGE_INTEGER       Npackets;           
00327     NDIS_SPIN_LOCK      CountersLock;       
00328     UINT                Nwrites;            
00329 
00330     UINT                Multiple_Write_Counter; 
00331     NDIS_EVENT          WriteEvent;         
00332     NDIS_EVENT          IOEvent;            
00333     NDIS_STATUS         IOStatus;           
00334     BOOLEAN             Bound;              
00335 
00336     HANDLE              DumpFileHandle;     
00337     PFILE_OBJECT        DumpFileObject;     
00338     PKTHREAD            DumpThreadObject;   
00339     HANDLE              DumpThreadHandle;   
00340     NDIS_EVENT          DumpEvent;          
00341     LARGE_INTEGER       DumpOffset;         
00342     UNICODE_STRING      DumpFileName;       
00343     UINT                MaxDumpBytes;       
00344 
00345     UINT                MaxDumpPacks;       
00346 
00347 
00348     BOOLEAN             DumpLimitReached;   
00349 
00350     MEM_TYPE            mem_ex;             
00351     TME_CORE            tme;                
00352     NDIS_SPIN_LOCK      machine_lock;       
00353 
00354 }
00355 OPEN_INSTANCE, *POPEN_INSTANCE;
00356 
00357 
00358 #define TRANSMIT_PACKETS 256    
00359 
00360 
00361 
00363 #define EXIT_SUCCESS(quantity) Irp->IoStatus.Information=quantity;\
00364 Irp->IoStatus.Status = STATUS_SUCCESS;\
00365 IoCompleteRequest(Irp, IO_NO_INCREMENT);\
00366 return STATUS_SUCCESS;\
00367 
00368 
00369 #define EXIT_FAILURE(quantity) Irp->IoStatus.Information=quantity;\
00370 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;\
00371 IoCompleteRequest(Irp, IO_NO_INCREMENT);\
00372 return STATUS_UNSUCCESSFUL;\
00373 
00374 
00379 /***************************/
00380 /*       Prototypes        */
00381 /***************************/
00382 
00399 NTSTATUS
00400 DriverEntry(
00401     IN PDRIVER_OBJECT DriverObject,
00402     IN PUNICODE_STRING RegistryPath
00403     );
00404 
00414 PWCHAR getAdaptersList(VOID);
00415 
00422 PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID);
00423 
00435 BOOLEAN createDevice(
00436     IN OUT PDRIVER_OBJECT adriverObjectP,
00437     IN PUNICODE_STRING amacNameP,
00438     NDIS_HANDLE aProtoHandle);
00439 
00451 NTSTATUS
00452 NPF_Open(
00453     IN PDEVICE_OBJECT DeviceObject,
00454     IN PIRP Irp
00455     );
00456 
00466 VOID
00467 NPF_OpenAdapterComplete(
00468     IN NDIS_HANDLE  ProtocolBindingContext,
00469     IN NDIS_STATUS  Status,
00470     IN NDIS_STATUS  OpenErrorStatus
00471     );
00472 
00483 NTSTATUS
00484 NPF_Close(
00485     IN PDEVICE_OBJECT DeviceObject,
00486     IN PIRP Irp
00487     );
00488 
00497 VOID
00498 NPF_CloseAdapterComplete(
00499     IN NDIS_HANDLE  ProtocolBindingContext,
00500     IN NDIS_STATUS  Status
00501     );
00502 
00525 NDIS_STATUS
00526 NPF_tap(
00527     IN NDIS_HANDLE ProtocolBindingContext,
00528     IN NDIS_HANDLE MacReceiveContext,
00529     IN PVOID HeaderBuffer,
00530     IN UINT HeaderBufferSize,
00531     IN PVOID LookAheadBuffer,
00532     IN UINT LookaheadBufferSize,
00533     IN UINT PacketSize
00534     );
00535 
00546 VOID
00547 NPF_TransferDataComplete(
00548     IN NDIS_HANDLE ProtocolBindingContext,
00549     IN PNDIS_PACKET Packet,
00550     IN NDIS_STATUS Status,
00551     IN UINT BytesTransferred
00552     );
00553 
00560 VOID
00561 NPF_ReceiveComplete(IN NDIS_HANDLE  ProtocolBindingContext);
00562 
00586 NTSTATUS
00587 NPF_IoControl(
00588     IN PDEVICE_OBJECT DeviceObject,
00589     IN PIRP Irp
00590     );
00591 
00592 VOID
00593 
00603 NPF_RequestComplete(
00604     IN NDIS_HANDLE   ProtocolBindingContext,
00605     IN PNDIS_REQUEST pRequest,
00606     IN NDIS_STATUS   Status
00607     );
00608 
00621 NTSTATUS
00622 NPF_Write(
00623             IN PDEVICE_OBJECT DeviceObject,
00624             IN PIRP Irp
00625             );
00626 
00627 
00646 INT NPF_BufferedWrite(IN PIRP Irp, 
00647                         IN PCHAR UserBuff, 
00648                         IN ULONG UserBuffSize,
00649                         BOOLEAN sync);
00650 
00660 VOID
00661 NPF_SendComplete(
00662     IN NDIS_HANDLE   ProtocolBindingContext,
00663     IN PNDIS_PACKET  pPacket,
00664     IN NDIS_STATUS   Status
00665     );
00666 
00676 VOID
00677 NPF_ResetComplete(
00678     IN NDIS_HANDLE  ProtocolBindingContext,
00679     IN NDIS_STATUS  Status
00680     );
00681 
00685 VOID
00686 NPF_Status(
00687     IN NDIS_HANDLE   ProtocolBindingContext,
00688     IN NDIS_STATUS   Status,
00689     IN PVOID         StatusBuffer,
00690     IN UINT          StatusBufferSize
00691     );
00692 
00693 
00697 VOID
00698 NPF_StatusComplete(IN NDIS_HANDLE  ProtocolBindingContext);
00699 
00708 VOID
00709 NPF_Unload(IN PDRIVER_OBJECT DriverObject);
00710 
00711 
00730 NTSTATUS
00731 NPF_Read(
00732     IN PDEVICE_OBJECT DeviceObject,
00733     IN PIRP Irp
00734     );
00735 
00741 NTSTATUS
00742 NPF_ReadRegistry(
00743     IN  PWSTR              *MacDriverName,
00744     IN  PWSTR              *PacketDriverName,
00745     IN  PUNICODE_STRING     RegistryPath
00746     );
00747 
00754 NTSTATUS
00755 NPF_QueryRegistryRoutine(
00756     IN PWSTR     ValueName,
00757     IN ULONG     ValueType,
00758     IN PVOID     ValueData,
00759     IN ULONG     ValueLength,
00760     IN PVOID     Context,
00761     IN PVOID     EntryContext
00762     );
00763 
00769 VOID NPF_BindAdapter(
00770     OUT PNDIS_STATUS            Status,
00771     IN  NDIS_HANDLE             BindContext,
00772     IN  PNDIS_STRING            DeviceName,
00773     IN  PVOID                   SystemSpecific1,
00774     IN  PVOID                   SystemSpecific2
00775     );
00776 
00788 VOID
00789 NPF_UnbindAdapter(
00790     OUT PNDIS_STATUS        Status,
00791     IN  NDIS_HANDLE         ProtocolBindingContext,
00792     IN  NDIS_HANDLE         UnbindContext
00793     );
00794 
00807 int bpf_validate(struct bpf_insn *f,int len, uint32 mem_ex_size);
00808 
00825 UINT bpf_filter(register struct bpf_insn *pc,
00826                 register UCHAR *p,
00827                 UINT wirelen,
00828                 register UINT buflen,
00829                 PMEM_TYPE mem_ex,
00830                 PTME_CORE tme,
00831                 struct time_conv *time_ref);
00832 
00850 UINT bpf_filter_with_2_buffers(register struct bpf_insn *pc,
00851                                register UCHAR *p,
00852                                register UCHAR *pd,
00853                                register int headersize,
00854                                UINT wirelen,
00855                                register UINT buflen,
00856                                PMEM_TYPE mem_ex,
00857                                PTME_CORE tme,
00858                                struct time_conv *time_ref);
00859 
00867 NTSTATUS NPF_OpenDumpFile(POPEN_INSTANCE Open , PUNICODE_STRING fileName, BOOLEAN append);
00868 
00877 NTSTATUS NPF_StartDump(POPEN_INSTANCE Open);
00878 
00886 VOID NPF_DumpThread(PVOID Open);
00887 
00894 NTSTATUS NPF_SaveCurrentBuffer(POPEN_INSTANCE Open);
00895 
00908 VOID NPF_WriteDumpFile(PFILE_OBJECT FileObject,
00909                                 PLARGE_INTEGER Offset,
00910                                 ULONG Length,
00911                                 PMDL Mdl,
00912                                 PIO_STATUS_BLOCK IoStatusBlock);
00913 
00914 
00915 
00921 NTSTATUS NPF_CloseDumpFile(POPEN_INSTANCE Open);
00922 
00927 UINT GetBuffOccupation(POPEN_INSTANCE Open);
00928 
00940 #ifdef NDIS50
00941 NDIS_STATUS NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent);
00942 #endif
00943 
00952 #endif  /*main ifndef/define*/

documentation. Copyright (c) 2002 Politecnico di Torino. All rights reserved.