]> jfr.im git - solanum.git/blobdiff - src/packet.c
Merge pull request #33 from Argure/master
[solanum.git] / src / packet.c
index fdba54e55935aaaa0cc934f03c388e9f82ef1c38..73f08c18acaddfaaeb3c94ec75b58f6158425d6e 100644 (file)
@@ -38,7 +38,6 @@
 static char readBuf[READBUF_SIZE];
 static void client_dopacket(struct Client *client_p, char *buffer, size_t length);
 
-
 /*
  * parse_client_queued - parse client queued messages
  */
@@ -46,16 +45,17 @@ static void
 parse_client_queued(struct Client *client_p)
 {
        int dolen = 0;
-       int checkflood = 1;
+       int allow_read;
 
        if(IsAnyDead(client_p))
                return;
 
        if(IsUnknown(client_p))
        {
+               allow_read = ConfigFileEntry.client_flood_burst_max;
                for (;;)
                {
-                       if(client_p->localClient->sent_parsed >= client_p->localClient->allow_read)
+                       if(client_p->localClient->sent_parsed >= allow_read)
                                break;
 
                        dolen = rb_linebuf_get(&client_p->localClient->
@@ -84,6 +84,11 @@ parse_client_queued(struct Client *client_p)
                        }
 
                }
+               /* If sent_parsed is impossibly high, drop it down.
+                * This is useful if the configuration is changed.
+                */
+               if(client_p->localClient->sent_parsed > allow_read)
+                       client_p->localClient->sent_parsed = allow_read;
        }
 
        if(IsAnyServer(client_p) || IsExemptFlood(client_p))
@@ -97,9 +102,16 @@ parse_client_queued(struct Client *client_p)
        }
        else if(IsClient(client_p))
        {
-
+               if(IsFloodDone(client_p))
+                       allow_read = ConfigFileEntry.client_flood_burst_max;
+               else
+                       allow_read = ConfigFileEntry.client_flood_burst_rate;
+               allow_read *= ConfigFileEntry.client_flood_message_time;
+               /* allow opers 4 times the amount of messages as users. why 4?
+                * why not. :) --fl_
+                */
                if(IsOper(client_p) && ConfigFileEntry.no_oper_flood)
-                       checkflood = 0;
+                       allow_read *= 4;
                /*
                 * Handle flood protection here - if we exceed our flood limit on
                 * messages in this loop, we simply drop out of the loop prematurely.
@@ -120,16 +132,7 @@ parse_client_queued(struct Client *client_p)
                         * as sent_parsed will always hover around the allow_read limit
                         * and no 'bursts' will be permitted.
                         */
-                       if(checkflood)
-                       {
-                               if(client_p->localClient->sent_parsed >= client_p->localClient->allow_read)
-                                       break;
-                       }
-
-                       /* allow opers 4 times the amount of messages as users. why 4?
-                        * why not. :) --fl_
-                        */
-                       else if(client_p->localClient->sent_parsed >= (4 * client_p->localClient->allow_read))
+                       if(client_p->localClient->sent_parsed >= allow_read)
                                break;
 
                        dolen = rb_linebuf_get(&client_p->localClient->
@@ -142,8 +145,16 @@ parse_client_queued(struct Client *client_p)
                        client_dopacket(client_p, readBuf, dolen);
                        if(IsAnyDead(client_p))
                                return;
-                       client_p->localClient->sent_parsed++;
+
+                       client_p->localClient->sent_parsed += ConfigFileEntry.client_flood_message_time;
                }
+               /* If sent_parsed is impossibly high, drop it down.
+                * This is useful if the configuration is changed.
+                */
+               if(client_p->localClient->sent_parsed > allow_read +
+                               ConfigFileEntry.client_flood_message_time - 1)
+                       client_p->localClient->sent_parsed = allow_read +
+                               ConfigFileEntry.client_flood_message_time - 1;
        }
 }
 
@@ -156,11 +167,8 @@ flood_endgrace(struct Client *client_p)
 {
        SetFloodDone(client_p);
 
-       /* Drop their flood limit back down */
-       client_p->localClient->allow_read = MAX_FLOOD;
-
-       /* sent_parsed could be way over MAX_FLOOD but under MAX_FLOOD_BURST,
-        * so reset it.
+       /* sent_parsed could be way over client_flood_burst_max but under
+        * client_flood_burst_rate so reset it.
         */
        client_p->localClient->sent_parsed = 0;
 }
@@ -181,26 +189,23 @@ flood_recalc(void *unused)
        {
                client_p = ptr->data;
 
-               if(unlikely(IsMe(client_p)))
+               if(rb_unlikely(IsMe(client_p)))
                        continue;
                        
-               if(unlikely(client_p->localClient == NULL))
+               if(rb_unlikely(client_p->localClient == NULL))
                        continue;
                
                if(IsFloodDone(client_p))
-                       client_p->localClient->sent_parsed -= 2;
+                       client_p->localClient->sent_parsed -= ConfigFileEntry.client_flood_message_num;
                else
                        client_p->localClient->sent_parsed = 0;
                        
                if(client_p->localClient->sent_parsed < 0)
                        client_p->localClient->sent_parsed = 0;
 
-               if(--client_p->localClient->actually_read < 0)
-                       client_p->localClient->actually_read = 0;
-
                parse_client_queued(client_p);
                
-               if(unlikely(IsAnyDead(client_p)))
+               if(rb_unlikely(IsAnyDead(client_p)))
                        continue;
 
        }
@@ -217,9 +222,6 @@ flood_recalc(void *unused)
                if(client_p->localClient->sent_parsed < 0)
                        client_p->localClient->sent_parsed = 0;
 
-               if(--client_p->localClient->actually_read < 0)
-                       client_p->localClient->actually_read = 0;
-
                parse_client_queued(client_p);
        }
 }
@@ -231,7 +233,6 @@ void
 read_packet(rb_fde_t * F, void *data)
 {
        struct Client *client_p = data;
-       struct LocalUser *lclient_p = client_p->localClient;
        int length = 0;
        int lbuf_len;
 
@@ -288,8 +289,6 @@ read_packet(rb_fde_t * F, void *data)
 
                lbuf_len = rb_linebuf_parse(&client_p->localClient->buf_recvq, readBuf, length, binary);
 
-               lclient_p->actually_read += lbuf_len;
-
                if(IsAnyDead(client_p))
                        return;
                        
@@ -301,7 +300,7 @@ read_packet(rb_fde_t * F, void *data)
                        
                /* Check to make sure we're not flooding */
                if(!IsAnyServer(client_p) &&
-                  (rb_linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood))
+                  (rb_linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood_max_lines))
                {
                        if(!(ConfigFileEntry.no_oper_flood && IsOper(client_p)))
                        {