Split cidr_bitlen into cidr_ipv4_bitlen and cidr_ipv6_bitlen.

Taken from ircd-ratbox 3 via shadowircd.
This commit is contained in:
Jilles Tjoelker 2008-11-30 13:31:59 +01:00
parent e752dd2618
commit c8d8588915
5 changed files with 53 additions and 26 deletions

View File

@ -92,11 +92,12 @@ log {
*/ */
class "users" { class "users" {
ping_time = 2 minutes; ping_time = 2 minutes;
number_per_ident = 10; number_per_ident = 2;
number_per_ip = 10; number_per_ip = 3;
number_per_ip_global = 50; number_per_ip_global = 5;
cidr_bitlen = 64; cidr_ipv4_bitlen = 24;
number_per_cidr = 8; cidr_ipv6_bitlen = 64;
number_per_cidr = 4;
max_number = 3000; max_number = 3000;
sendq = 400 kbytes; sendq = 400 kbytes;
}; };

View File

@ -44,7 +44,8 @@ struct Class
int ping_freq; int ping_freq;
int total; int total;
rb_patricia_tree_t *ip_limits; rb_patricia_tree_t *ip_limits;
int cidr_bitlen; int cidr_ipv4_bitlen;
int cidr_ipv6_bitlen;
int cidr_amount; int cidr_amount;
}; };
@ -62,7 +63,8 @@ extern struct Class *default_class;
#define MaxSendq(x) ((x)->max_sendq) #define MaxSendq(x) ((x)->max_sendq)
#define CurrUsers(x) ((x)->total) #define CurrUsers(x) ((x)->total)
#define IpLimits(x) ((x)->ip_limits) #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 CidrAmount(x) ((x)->cidr_amount)
#define ClassPtr(x) ((x)->c_class) #define ClassPtr(x) ((x)->c_class)
@ -77,7 +79,8 @@ extern struct Class *default_class;
#define ConfCurrUsers(x) (ClassPtr(x)->total) #define ConfCurrUsers(x) (ClassPtr(x)->total)
#define ConfIpLimits(x) (ClassPtr(x)->ip_limits) #define ConfIpLimits(x) (ClassPtr(x)->ip_limits)
#define ConfCidrAmount(x) (ClassPtr(x)->cidr_amount) #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 *); void add_class(struct Class *);

View File

@ -199,7 +199,8 @@ add_class(struct Class *classptr)
PingFreq(tmpptr) = PingFreq(classptr); PingFreq(tmpptr) = PingFreq(classptr);
MaxSendq(tmpptr) = MaxSendq(classptr); MaxSendq(tmpptr) = MaxSendq(classptr);
ConFreq(tmpptr) = ConFreq(classptr); ConFreq(tmpptr) = ConFreq(classptr);
CidrBitlen(tmpptr) = CidrBitlen(classptr); CidrIpv4Bitlen(tmpptr) = CidrIpv4Bitlen(classptr);
CidrIpv6Bitlen(tmpptr) = CidrIpv6Bitlen(classptr);
CidrAmount(tmpptr) = CidrAmount(classptr); CidrAmount(tmpptr) = CidrAmount(classptr);
free_class(classptr); free_class(classptr);

View File

@ -723,21 +723,33 @@ conf_set_class_ping_time(void *data)
} }
static void static void
conf_set_class_cidr_bitlen(void *data) conf_set_class_cidr_ipv4_bitlen(void *data)
{ {
#ifdef RB_IPV6
unsigned int maxsize = 128;
#else
unsigned int maxsize = 32; unsigned int maxsize = 32;
#endif
if(*(unsigned int *) data > maxsize) if(*(unsigned int *) data > maxsize)
conf_report_error conf_report_error
("class::cidr_bitlen argument exceeds maxsize (%d > %d) - ignoring.", ("class::cidr_ipv4_bitlen argument exceeds maxsize (%d > %d) - ignoring.",
*(unsigned int *) data, maxsize); *(unsigned int *) data, maxsize);
else else
yy_class->cidr_bitlen = *(unsigned int *) data; 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;
if(*(unsigned int *) data > maxsize)
conf_report_error
("class::cidr_ipv6_bitlen argument exceeds maxsize (%d > %d) - ignoring.",
*(unsigned int *) data, maxsize);
else
yy_class->cidr_ipv6_bitlen = *(unsigned int *) data;
}
#endif
static void static void
conf_set_class_number_per_cidr(void *data) conf_set_class_number_per_cidr(void *data)
{ {
@ -2036,7 +2048,10 @@ static struct ConfEntry conf_privset_table[] =
static struct ConfEntry conf_class_table[] = static struct ConfEntry conf_class_table[] =
{ {
{ "ping_time", CF_TIME, conf_set_class_ping_time, 0, NULL }, { "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_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", 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 }, { "number_per_ip_global", CF_INT,conf_set_class_number_per_ip_global, 0, NULL },

View File

@ -397,32 +397,38 @@ static int
add_ip_limit(struct Client *client_p, struct ConfItem *aconf) add_ip_limit(struct Client *client_p, struct ConfItem *aconf)
{ {
rb_patricia_node_t *pnode; rb_patricia_node_t *pnode;
int bitlen;
/* If the limits are 0 don't do anything.. */ /* 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; return -1;
pnode = rb_match_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip); 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) 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); s_assert(pnode != NULL);
if(pnode != NULL) if(pnode != NULL)
{ {
if(((long) pnode->data) >= ConfCidrAmount(aconf) if(((intptr_t)pnode->data) >= ConfCidrAmount(aconf) && !IsConfExemptLimits(aconf))
&& !IsConfExemptLimits(aconf))
{ {
/* This should only happen if the limits are set to 0 */ /* 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); rb_patricia_remove(ConfIpLimits(aconf), pnode);
} }
return (0); return (0);
} }
pnode->data++; pnode->data = (void *)(((intptr_t)pnode->data) + 1);
} }
return 1; return 1;
} }
@ -433,15 +439,16 @@ remove_ip_limit(struct Client *client_p, struct ConfItem *aconf)
rb_patricia_node_t *pnode; rb_patricia_node_t *pnode;
/* If the limits are 0 don't do anything.. */ /* 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; return;
pnode = rb_match_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip); pnode = rb_match_ip(ConfIpLimits(aconf), (struct sockaddr *)&client_p->localClient->ip);
if(pnode == NULL) if(pnode == NULL)
return; return;
pnode->data--; pnode->data = (void *)(((intptr_t)pnode->data) - 1);
if(((unsigned long) pnode->data) == 0) if(((intptr_t)pnode->data) == 0)
{ {
rb_patricia_remove(ConfIpLimits(aconf), pnode); rb_patricia_remove(ConfIpLimits(aconf), pnode);
} }