]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
Split cidr_bitlen into cidr_ipv4_bitlen and cidr_ipv6_bitlen.
authorJilles Tjoelker <redacted>
Sun, 30 Nov 2008 12:31:59 +0000 (13:31 +0100)
committerJilles Tjoelker <redacted>
Sun, 30 Nov 2008 12:31:59 +0000 (13:31 +0100)
Taken from ircd-ratbox 3 via shadowircd.

doc/example.conf
include/class.h
src/class.c
src/newconf.c
src/s_conf.c

index 688c2de49b4acbeed9bd0ce618ae3fed309b469c..932846e21f219ae375ab963828b917e54a4a7013 100755 (executable)
@@ -92,11 +92,12 @@ log {
  */
 class "users" {
        ping_time = 2 minutes;
-        number_per_ident = 10;
-       number_per_ip = 10;
-        number_per_ip_global = 50;
-       cidr_bitlen = 64;
-       number_per_cidr = 8;
+       number_per_ident = 2;
+       number_per_ip = 3;
+       number_per_ip_global = 5;
+       cidr_ipv4_bitlen = 24;
+       cidr_ipv6_bitlen = 64;
+       number_per_cidr = 4;
        max_number = 3000;
        sendq = 400 kbytes;
 };
index 058a0d69975730d97a8345a5224337d7899ca441..c076c185aa2f02f72f6e5aefda8b93ec3b505a7e 100644 (file)
@@ -44,7 +44,8 @@ struct Class
        int ping_freq;
        int total;
        rb_patricia_tree_t *ip_limits;
-       int cidr_bitlen;
+       int cidr_ipv4_bitlen;
+       int cidr_ipv6_bitlen;
        int cidr_amount;
 
 };
@@ -62,7 +63,8 @@ extern struct Class *default_class;
 #define MaxSendq(x)     ((x)->max_sendq)
 #define CurrUsers(x)    ((x)->total)
 #define IpLimits(x)     ((x)->ip_limits)
-#define CidrBitlen(x)   ((x)->cidr_bitlen)
+#define CidrIpv4Bitlen(x)   ((x)->cidr_ipv4_bitlen)
+#define CidrIpv6Bitlen(x)   ((x)->cidr_ipv6_bitlen)
 #define CidrAmount(x)  ((x)->cidr_amount)
 #define ClassPtr(x)      ((x)->c_class)
 
@@ -77,7 +79,8 @@ extern struct Class *default_class;
 #define ConfCurrUsers(x) (ClassPtr(x)->total)
 #define ConfIpLimits(x) (ClassPtr(x)->ip_limits)
 #define ConfCidrAmount(x) (ClassPtr(x)->cidr_amount)
-#define ConfCidrBitlen(x) (ClassPtr(x)->cidr_bitlen)
+#define ConfCidrIpv4Bitlen(x) (ClassPtr(x)->cidr_ipv4_bitlen)
+#define ConfCidrIpv6Bitlen(x) (ClassPtr(x)->cidr_ipv6_bitlen)
 
 void add_class(struct Class *);
 
index 4b4769eb82e4067845b6c267eefc805a935e16a5..3b55fffa14f6f3c1a561ed00aa800bd5ee4d9d10 100644 (file)
@@ -199,7 +199,8 @@ add_class(struct Class *classptr)
                PingFreq(tmpptr) = PingFreq(classptr);
                MaxSendq(tmpptr) = MaxSendq(classptr);
                ConFreq(tmpptr) = ConFreq(classptr);
-               CidrBitlen(tmpptr) = CidrBitlen(classptr);
+               CidrIpv4Bitlen(tmpptr) = CidrIpv4Bitlen(classptr);
+               CidrIpv6Bitlen(tmpptr) = CidrIpv6Bitlen(classptr);
                CidrAmount(tmpptr) = CidrAmount(classptr);
 
                free_class(classptr);
index 6fe62dddd5ef115f8038200b24a067c39662c736..35a18f81b91b02f334976bf6d613a9c90d7e551b 100644 (file)
@@ -723,21 +723,33 @@ conf_set_class_ping_time(void *data)
 }
 
 static void
-conf_set_class_cidr_bitlen(void *data)
+conf_set_class_cidr_ipv4_bitlen(void *data)
 {
+       unsigned int maxsize = 32;
+       if(*(unsigned int *) data > maxsize)
+               conf_report_error
+                       ("class::cidr_ipv4_bitlen argument exceeds maxsize (%d > %d) - ignoring.",
+                        *(unsigned int *) data, maxsize);
+       else
+               yy_class->cidr_ipv4_bitlen = *(unsigned int *) data;
+
+}
+
 #ifdef RB_IPV6
+static void
+conf_set_class_cidr_ipv6_bitlen(void *data)
+{
        unsigned int maxsize = 128;
-#else
-       unsigned int maxsize = 32;
-#endif
        if(*(unsigned int *) data > maxsize)
                conf_report_error
-                       ("class::cidr_bitlen argument exceeds maxsize (%d > %d) - ignoring.",
+                       ("class::cidr_ipv6_bitlen argument exceeds maxsize (%d > %d) - ignoring.",
                         *(unsigned int *) data, maxsize);
        else
-               yy_class->cidr_bitlen = *(unsigned int *) data;
+               yy_class->cidr_ipv6_bitlen = *(unsigned int *) data;
 
 }
+#endif
+
 static void
 conf_set_class_number_per_cidr(void *data)
 {
@@ -2036,7 +2048,10 @@ static struct ConfEntry conf_privset_table[] =
 static struct ConfEntry conf_class_table[] =
 {
        { "ping_time",          CF_TIME, conf_set_class_ping_time,              0, NULL },
-       { "cidr_bitlen",        CF_INT,  conf_set_class_cidr_bitlen,            0, NULL },
+       { "cidr_ipv4_bitlen",   CF_INT,  conf_set_class_cidr_ipv4_bitlen,               0, NULL },
+#ifdef RB_IPV6
+       { "cidr_ipv6_bitlen",   CF_INT,  conf_set_class_cidr_ipv6_bitlen,               0, NULL },
+#endif
        { "number_per_cidr",    CF_INT,  conf_set_class_number_per_cidr,        0, NULL },
        { "number_per_ip",      CF_INT,  conf_set_class_number_per_ip,          0, NULL },
        { "number_per_ip_global", CF_INT,conf_set_class_number_per_ip_global,   0, NULL },
index 11f6f2a9e96b1b9c1dbb29e0dcc4a6360cd8aa1d..b78fa51855ed3d69a7426b10328c9218b5d2065b 100644 (file)
@@ -397,32 +397,38 @@ static int
 add_ip_limit(struct Client *client_p, struct ConfItem *aconf)
 {
        rb_patricia_node_t *pnode;
+       int bitlen;
 
        /* If the limits are 0 don't do anything.. */
-       if(ConfCidrAmount(aconf) == 0 || ConfCidrBitlen(aconf) == 0)
+       if(ConfCidrAmount(aconf) == 0
+          || (ConfCidrIpv4Bitlen(aconf) == 0 && ConfCidrIpv6Bitlen(aconf) == 0))
                return -1;
 
        pnode = rb_match_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip);
 
+       if(GET_SS_FAMILY(&client_p->localClient->ip) == AF_INET)
+               bitlen = ConfCidrIpv4Bitlen(aconf);
+       else
+               bitlen = ConfCidrIpv6Bitlen(aconf);
+
        if(pnode == NULL)
-               pnode = make_and_lookup_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip, ConfCidrBitlen(aconf));
+               pnode = make_and_lookup_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip, bitlen);
 
        s_assert(pnode != NULL);
 
        if(pnode != NULL)
        {
-               if(((long) pnode->data) >= ConfCidrAmount(aconf)
-                  && !IsConfExemptLimits(aconf))
+               if(((intptr_t)pnode->data) >= ConfCidrAmount(aconf) && !IsConfExemptLimits(aconf))
                {
                        /* This should only happen if the limits are set to 0 */
-                       if((unsigned long) pnode->data == 0)
+                       if((intptr_t)pnode->data == 0)
                        {
                                rb_patricia_remove(ConfIpLimits(aconf), pnode);
                        }
                        return (0);
                }
 
-               pnode->data++;
+               pnode->data = (void *)(((intptr_t)pnode->data) + 1);
        }
        return 1;
 }
@@ -433,15 +439,16 @@ remove_ip_limit(struct Client *client_p, struct ConfItem *aconf)
        rb_patricia_node_t *pnode;
 
        /* If the limits are 0 don't do anything.. */
-       if(ConfCidrAmount(aconf) == 0 || ConfCidrBitlen(aconf) == 0)
+       if(ConfCidrAmount(aconf) == 0
+          || (ConfCidrIpv4Bitlen(aconf) == 0 && ConfCidrIpv6Bitlen(aconf) == 0))
                return;
 
        pnode = rb_match_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip);
        if(pnode == NULL)
                return;
 
-       pnode->data--;
-       if(((unsigned long) pnode->data) == 0)
+       pnode->data = (void *)(((intptr_t)pnode->data) - 1);
+       if(((intptr_t)pnode->data) == 0)
        {
                rb_patricia_remove(ConfIpLimits(aconf), pnode);
        }