int masktype;
int bits;
struct rb_sockaddr_storage sockaddr;
+ struct sockaddr_in ip4;
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,
- (struct sockaddr *)&sockaddr, bits))
+ 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,
+ (struct sockaddr *)&sockaddr, bits))
matched = 1;
break;
case HM_HOST:
if (match(kline->host, client_p->orighost))
matched = 1;
+ if (IsConfDoSpoofIp(client_p->localClient->att_conf) &&
+ IsConfKlineSpoof(client_p->localClient->att_conf))
+ continue;
if (match(kline->host, client_p->sockhost))
matched = 1;
break;