Hello,

My program is written in Delphi 6.0


I use 2 interfaces

in    : card 0
out   : card 1


I use 4 handlers:


Adapter_R_in   : Reading data in the interface 0
Adapter_W_in   : Writing data in the interface 0

Adapter_R_out  : Reading data in the interface 1
Adapter_W_out  : Writing data in the interface 1



NetworkSetup_in          : Registre for set parameters in interface 0
NetworkSetup_out        : Registre for set parameters in interface 1
(these parameters are similar for both interfaces)


I use 2 process

demo_in.    : read data from the interface 0 and then write to the interface
1

demo_out   : read data from the interface 1 and then write to the interface
0





Part of my code is here:


Procedure Setup
begin

      Adapter_R_in:=nil;
      Adapter_R_in:=  PacketOpenAdapter(@s_in);
       asm     add esp,4  end;

      Adapter_W_in:=nil;
      Adapter_W_in:=  PacketOpenAdapter(@s_in);
       asm     add esp,4  end;


  if (Adapter_R_in^.hFile=INVALID_HANDLE_VALUE)  then
  begin halt; end;

  if (Adapter_W_in^.hFile=INVALID_HANDLE_VALUE)  then
  begin halt; end;



// mode promiscous
if not(PacketSetHwFilter(Adapter_R_in,NetworkSetup_in.mode)) then halt;
  asm
     add esp,8
  end;



if not(PacketSetBuff(Adapter_R_in,NetworkSetup_in.memoriesize)) then halt;
  asm
     add esp,8
  end;

l:=NetworkSetup_in.memoriesize;


  PacketSetReadTimeout(Adapter_R_in,0);
  asm
     add esp,8
  end;


Packet_R_in :=NIL;
Packet_R_in := PacketAllocatePacket();
if Packet_R_in=NIL then halt;

Packet_w_in :=NIL;
Packet_w_in := PacketAllocatePacket();
if Packet_w_in=NIL then halt;



l:=NetworkSetup_in.memoriesize;

PacketInitPacket(Packet_R_in,@buffer_in,l);
asm
     add esp,12
end;



/// end of the interface in



      Adapter_R_out:=nil;
      Adapter_R_out:=  PacketOpenAdapter(@s_out);
       asm     add esp,4  end;

      Adapter_W_out:=nil;
      Adapter_W_out:=  PacketOpenAdapter(@s_out);
       asm     add esp,4  end;


  if (Adapter_R_out^.hFile=INVALID_HANDLE_VALUE)  then
  begin halt; end;

  if (Adapter_W_out^.hFile=INVALID_HANDLE_VALUE)  then
  begin halt; end;


// mode promiscous

if not(PacketSetHwFilter(Adapter_R_out,NetworkSetup_out.mode)) then halt;
  asm
     add esp,8
  end;


if not(PacketSetBuff(Adapter_R_out,NetworkSetup_out.memoriesize)) then halt;
  asm
     add esp,8
  end;



  PacketSetReadTimeout(Adapter_R_out,0);
  asm
     add esp,8
  end;


Packet_R_out :=NIL;
Packet_R_out := PacketAllocatePacket();
if Packet_R_out=NIL then halt;

Packet_w_out :=NIL;
Packet_w_out := PacketAllocatePacket();
if Packet_w_out=NIL then halt;



l:=NetworkSetup_in.memoriesize;

PacketInitPacket(Packet_R_out,@buffer_out,l);
asm
     add esp,12
end;





/// end of the interface out


finalizo:=false;

lin_mac   :=0;
lout_mac  :=0;


vdemo:=demo.create;
vdemo.Priority:=tplowest;

vdemo_out:=demo_out.create;
vdemo_out.Priority:=tpTimeCritical;


vdemo_in:=demo_in.create;
vdemo_in.Priority:=tpTimeCritical;


//  vdemo_in : process 0
//  vdemo_out   : process 1
//
//  by the moment I dont use events



end;


/// Begin of the process demo_in

Procedure demo_in.execute;

{$A-}
type header=record

     tv_sec      :integer;
     tv_microsec :integer;
     bh_caplen   :integer;
     bh_datalen  :integer;
     cabecera    :byte;
     end;
{$A+}
var ps:pointer;

    pheader :^header;
    i,j     :Integer;
    s       :string[255];
    P,P1       :pointer;
    ports_in,portd_in :word;


    IP_D_in :Cardinal;
    IP_S_in :Cardinal;

    MAC_D:tmac;
    MAC_S:tmac;





    TAMANO_IP : WORD;

    SeqNumber     :Cardinal;
    Acknolegment  :Cardinal;

    LL      :Integer;


    chk_IP        :Cardinal;
    chk_IP_Word   :Word;
    ii,jj:integer;

    length_user  :integer;
    length_number:integer;
    index_number :integer;


    // new variables

    existe_usuario    :boolean;
    existe_usuario_i  :integer;


begin



repeat

 if(PacketReceivePacket(Adapter_R_in,Packet_R_in,TRUE)=FALSE) then
begin
 halt;
end; asm     add esp,12;  end;

offset_in:=0;

  if packet_R_in^.ulBytesReceived<>0 then

repeat

pheader:=@buffer_in;

tv_seg          :=pheader^.tv_sec;
tv_microseg     :=pheader^.tv_microsec;

tlen1_in        :=pheader^.bh_datalen; // the real size of the packet
tlen_in         :=pheader^.bh_caplen;

offset_in:=offset_in+pheader^.cabecera;


real_time:=pheader^.tv_sec;




// Here my code that modifies the packet for a H323 application
//






// writing data to the interface out

  Move((@buffer_in[offset_in])^,buffer_w_out,tlen1_in);
  ll:=tlen1_in;

  PacketInitPacket(Packet_W_out,@buffer_W_out,ll);asm add esp,12  end;
  ll:=1;
  PacketSetNumWrites(Adapter_W_out,ll);asm add esp,8;end;
  PacketSendPacket(Adapter_W_out,Packet_W_out,TRUE);asm add esp,12  end;





offset_in:=Packet_WORDALING(offset_in+tlen1_in);



until(offset_in>=packet_R_in^.ulBytesReceived) or (finalizo);

// finalizo is a variable to finish the process

until(finalizo);
finalizo:=false;
end;



// the same procedure for demo_out process

// Note:   the function integer is 4 bytes length


Function Packet_WORDALING(L:integer):integer;
begin
        Result:=(L+3) and (not (integer(3)));
end;




----- Original Message -----
From: "Jesper Munkholm Jensen (JMJ)" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, July 30, 2002 9:02 AM
Subject: RE: [WinPcap-users] Loosing Packets or truncated packets


> You could try publishing the relevant code parts, and see what the
response
> is. I'll be glad to browse through it and se if I can see something you've
> missed. I've been through most aspects of the library about know...
>
> - Jesper
>
> -----Original Message-----
> From: David Rodriguez [mailto:[EMAIL PROTECTED]]
> Sent: 8. august 2002 16:03
> To: [EMAIL PROTECTED]
> Subject: Re: [WinPcap-users] Loosing Packets or truncated packets
>
>
> I use packet.ddl lybrary, I dont use pcaplib
>
> The strange thing is that when I use more memory more problems.
> When I used 256k of buffer user and system I got rarely errors.
>
> I dont set any kind of filter the one is promiscous mode.
>
> David
>
>
>
>
> ----- Original Message -----
> From: "Jesper Munkholm Jensen (JMJ)" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Tuesday, July 30, 2002 8:11 AM
> Subject: RE: [WinPcap-users] Loosing Packets or truncated packets
>
>
> > Do you use the Packet.dll or the Winpcap?
> >
> > A thing to remember is that WinPcap library function pcap_next(),
returns
> a
> > pointer to the packet in its own buffer, so if you hang on to the packet
> to
> > long you may risk it being overwritten. In bursts maybe this could cause
> the
> > error, but the depends on your code. Can't see how using a greater
buffer
> > would enhance this error, so maybe i'm of track. Just a thought...
> >
> > - Jesper
> >
> > -----Original Message-----
> > From: David Rodriguez [mailto:[EMAIL PROTECTED]]
> > Sent: 8. august 2002 15:06
> > To: [EMAIL PROTECTED]
> > Subject: Re: [WinPcap-users] Loosing Packets or truncated packets
> >
> >
> > I dont use any filter
> >
> > I use the following:
> >
> >  NdisSetPacketFlags(pPacket, NDIS_FLAGS_SKIP_LOOPBACK);  //
> >    for avoid reading packets writing in one interface were read it
again.
> >
> > I use also win 2000
> >
> > David
> >
> >
> > ----- Original Message -----
> > From: "Loris Degioanni" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Sent: Tuesday, July 30, 2002 3:53 AM
> > Subject: Re: [WinPcap-users] Loosing Packets or truncated packets
> >
> >
> > > Do you set a filter? If yes, what is its snaplen?
> > >
> > > Loris
> > >
> > > > Hello
> > > >
> > > > I am doing an application using 2 nic cards, I read information from
> one
> > > interface
> > > >
> > > > and then send for the other interface.
> > > >
> > > > The problem is when I do ping from a router (the router send the
ping
> > > >
> > > > every 1  ms ) the packet is truncated to 64 bytes. The size of the
> ping
> > > >
> > > > is 74 bytes.
> > > >
> > > > The strange thing is tha if I use 256K of buffer for 2 interfaces I
> > rarely
> > > get the
> > > >
> > > > error. But when I increase the buffer to 2M I get a lot of error
> > specially
> > > when the
> > > >
> > > > traffic is burstly.
> > > >
> > > > What the increase of the buffer produce this error, does the driver
> copy
> > > all
> > > >
> > > > the content of the kernel memory to the user memory even the memory
> has
> > > >
> > > > little information ?
> > > >
> > > > Note: My timeout in PacketSetReadTimeout is Zero
> > > >
> > > >
> > > >
> > > > Thaks in advanced
> > > >
> > > >
> > > >
> > > > David
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > David Rodriguez
> > > > davidgrs
> > > >
> > > >
> > >
> >
>
> --------------------------------------------------------------------------
> > > ------
> > > > Join the world's largest e-mail service with MSN Hotmail. Click Here
> > > >
> > > >
> > >
> >
>

Reply via email to