mirror of
git://git.code.sf.net/p/xtables-addons/xtables-addons
synced 2025-09-07 21:25:12 +02:00
xt_psd: move parts of main match function to helpers
The match function is way too large, start to split this into smaller chunks.
This commit is contained in:

committed by
Jan Engelhardt

parent
12d0a8702c
commit
2f18ab31ec
@@ -119,6 +119,36 @@ static bool port_in_list(struct host *host, uint8_t proto, uint16_t port)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint16_t get_port_weight(const struct xt_psd_info *psd, __be16 port)
|
||||||
|
{
|
||||||
|
return ntohs(port) < 1024 ? psd->lo_ports_weight : psd->hi_ports_weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_portscan(struct host *host, const struct xt_psd_info *psdinfo,
|
||||||
|
uint8_t proto, __be16 dest_port)
|
||||||
|
{
|
||||||
|
host->timestamp = jiffies;
|
||||||
|
|
||||||
|
if (host->weight >= psdinfo->weight_threshold) /* already matched */
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Update the total weight */
|
||||||
|
host->weight += get_port_weight(psdinfo, dest_port);
|
||||||
|
|
||||||
|
/* Got enough destination ports to decide that this is a scan? */
|
||||||
|
if (host->weight >= psdinfo->weight_threshold)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Remember the new port */
|
||||||
|
if (host->count < ARRAY_SIZE(host->ports)) {
|
||||||
|
host->ports[host->count].number = dest_port;
|
||||||
|
host->ports[host->count].proto = proto;
|
||||||
|
host->count++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
xt_psd_match(const struct sk_buff *pskb, struct xt_action_param *match)
|
xt_psd_match(const struct sk_buff *pskb, struct xt_action_param *match)
|
||||||
{
|
{
|
||||||
@@ -201,31 +231,10 @@ xt_psd_match(const struct sk_buff *pskb, struct xt_action_param *match)
|
|||||||
if (proto == IPPROTO_TCP && (tcph->ack || tcph->rst))
|
if (proto == IPPROTO_TCP && (tcph->ack || tcph->rst))
|
||||||
goto out_no_match;
|
goto out_no_match;
|
||||||
|
|
||||||
/* Packet to a new port, and not TCP/ACK: update the timestamp */
|
if (is_portscan(curr, psdinfo, proto, dest_port))
|
||||||
curr->timestamp = now;
|
|
||||||
|
|
||||||
/* Matched this scan already? Then Leave. */
|
|
||||||
if (curr->weight >= psdinfo->weight_threshold)
|
|
||||||
goto out_match;
|
goto out_match;
|
||||||
|
|
||||||
/* Update the total weight */
|
|
||||||
curr->weight += (ntohs(dest_port) < 1024) ?
|
|
||||||
psdinfo->lo_ports_weight : psdinfo->hi_ports_weight;
|
|
||||||
|
|
||||||
/* Got enough destination ports to decide that this is a scan? */
|
|
||||||
if (curr->weight >= psdinfo->weight_threshold)
|
|
||||||
goto out_match;
|
|
||||||
|
|
||||||
/* Remember the new port */
|
|
||||||
if (curr->count < ARRAY_SIZE(curr->ports)) {
|
|
||||||
curr->ports[curr->count].number = dest_port;
|
|
||||||
curr->ports[curr->count].proto = proto;
|
|
||||||
curr->count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
goto out_no_match;
|
goto out_no_match;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We know this address, but the entry is outdated. Mark it unused, and
|
/* We know this address, but the entry is outdated. Mark it unused, and
|
||||||
* remove from the hash table. We'll allocate a new entry instead since
|
* remove from the hash table. We'll allocate a new entry instead since
|
||||||
* this one might get re-used too soon. */
|
* this one might get re-used too soon. */
|
||||||
@@ -288,7 +297,7 @@ xt_psd_match(const struct sk_buff *pskb, struct xt_action_param *match)
|
|||||||
curr->dest_addr.s_addr = iph->daddr;
|
curr->dest_addr.s_addr = iph->daddr;
|
||||||
curr->src_port = src_port;
|
curr->src_port = src_port;
|
||||||
curr->count = 1;
|
curr->count = 1;
|
||||||
curr->weight = (ntohs(dest_port) < 1024) ? psdinfo->lo_ports_weight : psdinfo->hi_ports_weight;
|
curr->weight = get_port_weight(psdinfo, dest_port);
|
||||||
curr->ports[0].number = dest_port;
|
curr->ports[0].number = dest_port;
|
||||||
curr->ports[0].proto = proto;
|
curr->ports[0].proto = proto;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user