| 72 |
|
{ |
| 73 |
|
struct ClassItem *class = MyMalloc(sizeof(*class)); |
| 74 |
|
|
| 75 |
+ |
class->active = 1; |
| 76 |
+ |
class->con_freq = DEFAULT_CONNECTFREQUENCY; |
| 77 |
+ |
class->ping_freq = DEFAULT_PINGFREQUENCY; |
| 78 |
+ |
class->max_total = MAXIMUM_LINKS_DEFAULT; |
| 79 |
+ |
class->max_sendq = DEFAULT_SENDQ; |
| 80 |
+ |
class->max_recvq = DEFAULT_RECVQ; |
| 81 |
+ |
|
| 82 |
|
dlinkAdd(class, &class->node, &class_list); |
| 83 |
|
|
| 84 |
|
return class; |
| 99 |
|
void |
| 100 |
|
class_init(void) |
| 101 |
|
{ |
| 102 |
< |
class_default = class_make(); |
| 96 |
< |
|
| 97 |
< |
DupString(class_default->name, "default"); |
| 98 |
< |
|
| 99 |
< |
class_default->active = 1; |
| 100 |
< |
class_default->con_freq = DEFAULT_CONNECTFREQUENCY; |
| 101 |
< |
class_default->ping_freq = DEFAULT_PINGFREQUENCY; |
| 102 |
< |
class_default->max_total = MAXIMUM_LINKS_DEFAULT; |
| 103 |
< |
class_default->max_sendq = DEFAULT_SENDQ; |
| 104 |
< |
class_default->max_recvq = DEFAULT_RECVQ; |
| 102 |
> |
(class_default = class_make())->name = xstrdup("default"); |
| 103 |
|
} |
| 104 |
|
|
| 105 |
|
const char * |
| 199 |
|
{ |
| 200 |
|
dlink_node *ptr = NULL; |
| 201 |
|
|
| 202 |
< |
DLINK_FOREACH(ptr, class_list.head) |
| 203 |
< |
{ |
| 206 |
< |
struct ClassItem *class = ptr->data; |
| 207 |
< |
|
| 208 |
< |
if (class != class_default) |
| 209 |
< |
class->active = 0; |
| 210 |
< |
} |
| 202 |
> |
DLINK_FOREACH_PREV(ptr, class_list.tail->prev) |
| 203 |
> |
((struct ClassItem *)ptr->data)->active = 0; |
| 204 |
|
} |
| 205 |
|
|
| 206 |
|
void |
| 344 |
|
#endif |
| 345 |
|
} |
| 346 |
|
|
| 347 |
< |
static void |
| 348 |
< |
rebuild_cidr_list(int aftype, struct ClassItem *oldcl, struct ClassItem *newcl, |
| 356 |
< |
dlink_list *old_list, dlink_list *new_list, int changed) |
| 347 |
> |
void |
| 348 |
> |
rebuild_cidr_list(struct ClassItem *class) |
| 349 |
|
{ |
| 350 |
|
dlink_node *ptr; |
| 359 |
– |
struct Client *client_p; |
| 360 |
– |
struct MaskItem *conf; |
| 351 |
|
|
| 352 |
< |
if (!changed) |
| 363 |
< |
{ |
| 364 |
< |
*new_list = *old_list; |
| 365 |
< |
old_list->head = old_list->tail = NULL; |
| 366 |
< |
old_list->length = 0; |
| 367 |
< |
return; |
| 368 |
< |
} |
| 352 |
> |
destroy_cidr_class(class); |
| 353 |
|
|
| 354 |
|
DLINK_FOREACH(ptr, local_client_list.head) |
| 355 |
|
{ |
| 356 |
< |
client_p = ptr->data; |
| 357 |
< |
if (client_p->localClient->aftype != aftype) |
| 374 |
< |
continue; |
| 375 |
< |
if (dlink_list_length(&client_p->localClient->confs) == 0) |
| 376 |
< |
continue; |
| 377 |
< |
|
| 378 |
< |
conf = client_p->localClient->confs.tail->data; |
| 379 |
< |
if (conf->type == CONF_CLIENT) |
| 380 |
< |
if (conf->class == oldcl) |
| 381 |
< |
cidr_limit_reached(1, &client_p->localClient->ip, newcl); |
| 382 |
< |
} |
| 383 |
< |
} |
| 356 |
> |
struct Client *client_p = ptr->data; |
| 357 |
> |
struct MaskItem *conf = client_p->localClient->confs.tail->data; |
| 358 |
|
|
| 359 |
< |
/* |
| 360 |
< |
* rebuild_cidr_class |
| 361 |
< |
* |
| 388 |
< |
* inputs - pointer to old conf |
| 389 |
< |
* - pointer to new_class |
| 390 |
< |
* output - none |
| 391 |
< |
* side effects - rebuilds the class link list of cidr blocks |
| 392 |
< |
*/ |
| 393 |
< |
void |
| 394 |
< |
rebuild_cidr_class(struct ClassItem *old_class, struct ClassItem *new_class) |
| 395 |
< |
{ |
| 396 |
< |
if (old_class->number_per_cidr > 0 && new_class->number_per_cidr > 0) |
| 397 |
< |
{ |
| 398 |
< |
if (old_class->cidr_bitlen_ipv4 > 0 && new_class->cidr_bitlen_ipv4 > 0) |
| 399 |
< |
rebuild_cidr_list(AF_INET, old_class, new_class, |
| 400 |
< |
&old_class->list_ipv4, &new_class->list_ipv4, |
| 401 |
< |
old_class->cidr_bitlen_ipv4 != new_class->cidr_bitlen_ipv4); |
| 402 |
< |
|
| 403 |
< |
#ifdef IPV6 |
| 404 |
< |
if (old_class->cidr_bitlen_ipv6 > 0 && new_class->cidr_bitlen_ipv6 > 0) |
| 405 |
< |
rebuild_cidr_list(AF_INET6, old_class, new_class, |
| 406 |
< |
&old_class->list_ipv6, &new_class->list_ipv6, |
| 407 |
< |
old_class->cidr_bitlen_ipv6 != new_class->cidr_bitlen_ipv6); |
| 408 |
< |
#endif |
| 359 |
> |
if (conf && (conf->type == CONF_CLIENT)) |
| 360 |
> |
if (conf->class == class) |
| 361 |
> |
cidr_limit_reached(1, &client_p->localClient->ip, class); |
| 362 |
|
} |
| 410 |
– |
|
| 411 |
– |
destroy_cidr_class(old_class); |
| 363 |
|
} |
| 364 |
|
|
| 365 |
|
/* |