Oops, sorry, I didn't realize that my patches was rather big (75K). I didn't
compress them. I guess that's why my mail hasn't been delivered yet. However
here it is again. You can download it at:
http://www.dtek.chalmers.se/~d97gozem/hashslot_superlimit.tar.bz2 (16K)

Thank you!

----- Forwarded message from gozem -----

Subject: [PATCH] superlimit (and hashslot)
Date: Wed, 10 Apr 2002 02:21:20 +0200
To: [EMAIL PROTECTED]
User-Agent: Mutt/1.3.28i

I have now finished my superlimit. Its a new version of limit with the same
purpose but far more features. This is two patches: superlimit and hashslot.
Hashslot is not a match, target nor conntrack helper. Its just a data
structure, hash-table with slots in one memory chunk. Its is used by
superlimit and upcoming ippool. Recent and psd should be rewritten using it.
As recent only uses one large linked list (last time I check, I might be
wrong here) and psd only uses a static hash-table using a roundrobin
algorithm for replacing slots. A carefully selected attack can get it to
overwrite each slot in a "perfect" order. I'll just paste the help no how it
works from the .h file below.

superlimit changes one smal thing in iptables.c (userspace). iptables.c
isn't exporting mask_to_dotted() which is clearly needed in superlimit when
parsing command line. I changed that, one line in iptables.c and one line in
iptables.h

This one can limit on both packets and bytes. More flexable syntax. You can
now limit to 3/2sec (1,5 / sec). It uses 64bits counters and a new algorithm
which is faster and more accurate. And best of all, you can limit on per net
pairs. If one host or net is flooding you it will automaticlly only limit
that host or net, all after your own settings. Not having impact on the
other normal traffic passing.

I have seen discussion about that we shouldn't have bytes limits since
traffic shaping should do that. I belive its requested very highly of users
and its not that many more lines of code in my solution. I have not tested
if this really works good to shape traffic. Its not a good way but its
works. Should probaly not be used for shaping but rather for pure limiting.

Apply the hashslot patch first.

Please send me comments and bugreports.

I'm, also pasting the iptables -m superlimit --help to show how it works.

-----8<------
superlimit v0.1.0 options:
--slimit-packets avg   Max average match for packet rate.
--slimit-bytes avg     Max average match for byte rate.
--slimit-start num     Number to match in a burst, default the same as avg.
                         Must be more than avg. The starting condition is an
                         absolut value and not a multiplier for avg.
--slimit-srcmask num   Mask to group source address on. Bits or mask.
                         Defaults is to not use per net limit.
--slimit-dstmask num   Mask to group destination address on. Bits or mask.
                         Default is to not use per net limit.
--slimit-wholepacket   In bytes limit, calcute the the entire packet size,
                         not only the IP-packet size.
--slimit-maxslots num  The max number of slots to hold data for
                          sourcenet,destnet pairs. Each slot uses 24 bytes
                          of memory. Default is to use max 4 pages of
memory,
                          thats 680 slot.You can also specify the number of
                          pages you want to use, eg. num=5pages.
                          The algorithm uses one page of memory to start
with
                          and increases, decreases as nessesary.
--slimit-outmem-match  If we run out of slots, instead of not matching the
                         packet, match it.

Both --slimit-packets and --slimit-bytes have the following syntax:
number[unit]/[number][timeunit], where
unit can be K (times 1000), M (times 10^6), G (times 10^9), T (times 10^12).
timeunit can be second (s), minute (m), hour (h), day (d), default second
Example: 4/second 7/d 6K/h 5M/3sec

Examples:
-m superlimit --slimit-packets 2/s --slimit-start 4
  Match only 2 packets per second, but only do that after going
  above 4 packets per second.

-m superlimit --slimit-bytes ! 10K/s --slimit-wholepacket
  Match 10Kilobytes (10000 bytes) per second. Count the wire size of
  the packet.

-m superlimit --slimit-packets ! 5/3sec --slimit-start 10
  Match every packet ABOVE 5 packets per 3 second. Starting at 10 packets
  per 3 second.

-m superlimit --slimit-packets 3K/5min --slimit-srcmask 24
  Match 3000 packets per 5min form each /24 subnet. Great if you get
  flooded from host(s) at X.Y.Z.*, but don't want to limit the rest of
  the world.

-m superlimit --slimit-packets 1/s --slimit-srcmask 32 \ 
              --slimit-maxslots 1024
  Limit all the hosts on internet, but don't use more than 1024 source-dest
  pairs of memory for this so a flood can't eat up all our memory.

-m superlimit --slimit-bytes 2G/day --slimit-dstmask 32 \ 
              --slimit-maxslots 16pages --slimit-outmem-match
  Limit all the hosts we are routing for to 5GigaByte per day, don't use
  more than 16 pages of memory. If we are out of memory let the packet pass.

-m superlimit --slimit-packets 1/sec --slimit-start 50 \ 
              --slimit-srcmask 24 --slimit-dstmask 32
  Limit (eg. SYN and/or PING floods) so that internet can't flood per
  computer behind us that we are routing for.

-------8<-----



-----8<------
Description of hashslot:

This is a container structure. It uses one memory chunk in order to keep the
use of malloc() and free() down. It splits this memory chunk into slots.
Each slot of the same size can be used to what ever purpose you like. It
also handles a hashtable in order to be able to lookup a slot fast.

It supports garabage collection in order to free up slots. This freature can
be disabled.

It supports rehashing in order to keep the memory usage down when alot of
slots are free, and to increase the number of available slots when running
out of free slots. This freature can also be disabled.

All operations are O(1) except hashslot_foreach() and
hashslot_garbagecollect() which visits each used slot once.

The structure keeps track of the free slots by linking them up in a list. It
does not link up every slot in this queue on startup. It instead keeps an
index (hash->inited) of which slots havn't even been used once. Therefor is
the number of freeslots always: (slots_number - inited) + freecount

You can change any of the parameters during use but these: hashtable,
hashtable_number, slots, slots_number first_free, last_free, freecount


Who should use this? 

Anyone that wants a fast cointainer for thier objects. When disabling the
garbage collection it wont give you any more overhead but one compare in
each function. Same goes for rehashing, but only affects hashslot_newslot
and hashslot_delslot.

This code and be both be used as a module in the kernel or as a library in
any userspace program. Both is supported.
-------8<---

-- 
/Gozem A.K.A. Joakim Axelsson


Reply via email to