fix standard packet payload size for ipv6
[lcore.git] / lcore.pas
index 900bc96482e2d850e670ecb0fa6e7704693fc246..99fbe983c7b8f46831b6664f2b15f09639c0c973 100755 (executable)
--- a/lcore.pas
+++ b/lcore.pas
@@ -35,7 +35,12 @@ interface
 \r
 \r
   const\r
 \r
 \r
   const\r
-    receivebufsize=1460;\r
+    {for IPv6 it is 1440: 1500 - IP header (40) - TCP/UDP header (20). for ipv4 it is 1460}\r
+    packetbasesize = 1440;\r
+    receivebufsize=packetbasesize*8;\r
+\r
+  var\r
+    absoloutemaxs:integer=0;\r
 \r
   type\r
     {$ifdef ver1_0}\r
 \r
   type\r
     {$ifdef ver1_0}\r
@@ -96,6 +101,7 @@ interface
       onfdwrite           : procedure (Sender: TObject; Error: word) of object; //added for bewarehttpd\r
       lasterror:integer;\r
       destroying:boolean;\r
       onfdwrite           : procedure (Sender: TObject; Error: word) of object; //added for bewarehttpd\r
       lasterror:integer;\r
       destroying:boolean;\r
+      recvbufsize:integer;\r
       function receivestr:string; virtual;\r
       procedure close;\r
       procedure abort;\r
       function receivestr:string; virtual;\r
       procedure close;\r
       procedure abort;\r
@@ -117,7 +123,7 @@ interface
 \r
       //procedure messageloop;\r
       function Receive(Buf:Pointer;BufSize:integer):integer; virtual;\r
 \r
       //procedure messageloop;\r
       function Receive(Buf:Pointer;BufSize:integer):integer; virtual;\r
-      procedure flush;virtual;{$ifdef win32} abstract;{$endif}\r
+      procedure flush;virtual;\r
       procedure dodatasent(wparam,lparam:longint);\r
       procedure doreceiveloop(wparam,lparam:longint);\r
       procedure sinkdata(sender:tobject;error:word);\r
       procedure dodatasent(wparam,lparam:longint);\r
       procedure doreceiveloop(wparam,lparam:longint);\r
       procedure sinkdata(sender:tobject;error:word);\r
@@ -326,6 +332,7 @@ end;
 constructor tlasio.create;\r
 begin\r
   inherited create(AOwner);\r
 constructor tlasio.create;\r
 begin\r
   inherited create(AOwner);\r
+  if not assigned(eventcore) then raise exception.create('no event core');\r
   sendq := tfifo.create;\r
   recvq := tfifo.create;\r
   state := wsclosed;\r
   sendq := tfifo.create;\r
   recvq := tfifo.create;\r
   state := wsclosed;\r
@@ -351,8 +358,8 @@ begin
   if nextasin <> nil then begin\r
     nextasin.prevasin := prevasin;\r
   end;\r
   if nextasin <> nil then begin\r
     nextasin.prevasin := prevasin;\r
   end;\r
-  recvq.destroy;\r
-  sendq.destroy;\r
+  recvq.free;\r
+  sendq.free;\r
   inherited destroy;\r
 end;\r
 \r
   inherited destroy;\r
 end;\r
 \r
@@ -392,7 +399,7 @@ end;
 \r
 procedure tlasio.internalclose(error:word);\r
 begin\r
 \r
 procedure tlasio.internalclose(error:word);\r
 begin\r
-  if state<>wsclosed then begin\r
+  if (state<>wsclosed) and (state<>wsinvalidstate) then begin\r
     if (fdhandlein < 0) or (fdhandleout < 0) then raise exception.create('internalclose called with invalid fd handles');\r
     eventcore.rmasterclr(fdhandlein);//fd_clr(fdhandlein,fdsrmaster);\r
     eventcore.wmasterclr(fdhandleout);//fd_clr(fdhandleout,fdswmaster);\r
     if (fdhandlein < 0) or (fdhandleout < 0) then raise exception.create('internalclose called with invalid fd handles');\r
     eventcore.rmasterclr(fdhandlein);//fd_clr(fdhandlein,fdsrmaster);\r
     eventcore.wmasterclr(fdhandleout);//fd_clr(fdhandleout,fdswmaster);\r
@@ -419,7 +426,7 @@ begin
 \r
     if assigned(onsessionclosed) then if not destroying then onsessionclosed(self,error);\r
   end;\r
 \r
     if assigned(onsessionclosed) then if not destroying then onsessionclosed(self,error);\r
   end;\r
-  sendq.del(maxlongint);\r
+  if assigned(sendq) then sendq.del(maxlongint);\r
 end;\r
 \r
 \r
 end;\r
 \r
 \r
@@ -485,7 +492,7 @@ var
 begin\r
   if state <> wsconnected then exit;\r
 \r
 begin\r
   if state <> wsconnected then exit;\r
 \r
-  lensent := sendq.get(data,2920);\r
+  lensent := sendq.get(data,packetbasesize*2);\r
   if assigned(data) then result := myfdwrite(fdhandleout,data^,lensent) else result := 0;\r
 \r
   if result = -1 then lensent := 0 else lensent := result;\r
   if assigned(data) then result := myfdwrite(fdhandleout,data^,lensent) else result := 0;\r
 \r
   if result = -1 then lensent := 0 else lensent := result;\r
@@ -548,6 +555,7 @@ procedure tlasio.handlefdtrigger(readtrigger,writetrigger:boolean);
 var\r
   sendflushresult : integer;\r
   tempbuf:array[0..receivebufsize-1] of byte;\r
 var\r
   sendflushresult : integer;\r
   tempbuf:array[0..receivebufsize-1] of byte;\r
+  a:integer;\r
 begin\r
   if (state=wsconnected) and writetrigger then begin\r
     //writeln('write trigger');\r
 begin\r
   if (state=wsconnected) and writetrigger then begin\r
     //writeln('write trigger');\r
@@ -574,7 +582,9 @@ begin
   writtenthiscycle := false;\r
   if (state =wsconnected) and readtrigger then begin\r
     if recvq.size=0 then begin\r
   writtenthiscycle := false;\r
   if (state =wsconnected) and readtrigger then begin\r
     if recvq.size=0 then begin\r
-      numread := myfdread(fdhandlein,tempbuf,sizeof(tempbuf));\r
+      a := recvbufsize;\r
+      if (a <= 0) or (a > sizeof(tempbuf)) then a := sizeof(tempbuf);\r
+      numread := myfdread(fdhandlein,tempbuf,a);\r
       if (numread=0) and (not mustrefreshfds) then begin\r
         {if i remember correctly numread=0 is caused by eof\r
         if this isn't dealt with then you get a cpu eating infinite loop\r
       if (numread=0) and (not mustrefreshfds) then begin\r
         {if i remember correctly numread=0 is caused by eof\r
         if this isn't dealt with then you get a cpu eating infinite loop\r
@@ -609,19 +619,20 @@ begin
   end;\r
 end;\r
 \r
   end;\r
 end;\r
 \r
-{$ifndef win32}\r
-  procedure tlasio.flush;\r
-  var\r
-    fds : fdset;\r
-  begin\r
-    fd_zero(fds);\r
-    fd_set(fdhandleout,fds);\r
-    while sendq.size>0 do begin\r
-      select(fdhandleout+1,nil,@fds,nil,nil);\r
-      if sendflush <= 0 then exit;\r
-    end;\r
-  end;\r
+procedure tlasio.flush;\r
+{$ifdef win32}\r
+type fdset = tfdset;\r
 {$endif}\r
 {$endif}\r
+var\r
+  fds : fdset;\r
+begin\r
+  fd_zero(fds);\r
+  fd_set(fdhandleout,fds);\r
+  while sendq.size>0 do begin\r
+    select(fdhandleout+1,nil,@fds,nil,nil);\r
+    if sendflush <= 0 then exit;\r
+  end;\r
+end;\r
 \r
 procedure tlasio.dodatasent(wparam,lparam:longint);\r
 begin\r
 \r
 procedure tlasio.dodatasent(wparam,lparam:longint);\r
 begin\r