- {
- int matched = 0;
- int masktype;
- int bits;
- struct rb_sockaddr_storage sockaddr;
-
- masktype = parse_netmask(kline->host, (struct sockaddr_storage *)&sockaddr, &bits);
-
- switch (masktype) {
- case HM_IPV4:
- case HM_IPV6:
- if(comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
+ switch (masktype) {
+ case HM_IPV4:
+ case HM_IPV6:
+ if (IsConfDoSpoofIp(client_p->localClient->att_conf) &&
+ IsConfKlineSpoof(client_p->localClient->att_conf))
+ continue;
+ if (client_p->localClient->ip.ss_family == AF_INET6 && sockaddr.ss_family == AF_INET &&
+ rb_ipv4_from_ipv6((struct sockaddr_in6 *)&client_p->localClient->ip, &ip4)
+ && comp_with_mask_sock((struct sockaddr *)&ip4, (struct sockaddr *)&sockaddr, bits))
+ matched = 1;
+ else if (client_p->localClient->ip.ss_family == sockaddr.ss_family &&
+ comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,