2 changed files with 206 additions and 34 deletions
@ -0,0 +1,174 @@ |
|||||
|
-- vi: et ai ts=2 |
||||
|
-- |
||||
|
-- Warning: postgresql >= 8.2 is required for the 'DROP .. IF EXISTS' |
||||
|
-- Warning: this script DESTROYS EVERYTHING ! |
||||
|
-- |
||||
|
-- NOTE : - we could / should use types cidr / inet / macaddr for IP ? (see http://www.postgresql.org/docs/8.2/static/datatype-net-types.html) |
||||
|
-- - ON UPDATE is not supported ? |
||||
|
-- - type 'integer' is used (we have to check for overflows ..) |
||||
|
-- - type 'datetime' has been replaced by 'timestamp' |
||||
|
|
||||
|
|
||||
|
DROP TABLE IF EXISTS ulog2_ct CASCADE; |
||||
|
|
||||
|
-- |
||||
|
-- conntrack |
||||
|
-- |
||||
|
CREATE TABLE ulog2_ct ( |
||||
|
ct_id bigint PRIMARY KEY UNIQUE NOT NULL, |
||||
|
oob_family smallint default NULL, |
||||
|
orig_ip_saddr_str inet default NULL, |
||||
|
orig_ip_daddr_str inet default NULL, |
||||
|
orig_ip_protocol smallint default NULL, |
||||
|
orig_l4_sport integer default NULL, |
||||
|
orig_l4_dport integer default NULL, |
||||
|
orig_raw_pktlen bigint default 0, |
||||
|
orig_raw_pktcount bigint default 0, |
||||
|
reply_ip_saddr_str inet default NULL, |
||||
|
reply_ip_daddr_str inet default NULL, |
||||
|
reply_ip_protocol smallint default NULL, |
||||
|
reply_l4_sport integer default NULL, |
||||
|
reply_l4_dport integer default NULL, |
||||
|
reply_raw_pktlen bigint default 0, |
||||
|
reply_raw_pktcount bigint default 0, |
||||
|
icmp_code smallint default NULL, |
||||
|
icmp_type smallint default NULL, |
||||
|
ct_mark bigint default 0, |
||||
|
flow_start_sec bigint default 0, |
||||
|
flow_start_usec bigint default 0, |
||||
|
flow_end_sec bigint default 0, |
||||
|
flow_end_usec bigint default 0, |
||||
|
ct_event smallint default 0 |
||||
|
); |
||||
|
|
||||
|
-- |
||||
|
-- Additional INDEX |
||||
|
-- |
||||
|
|
||||
|
-- CREATE INDEX ulog2_ct_oob_family ON ulog2_ct(oob_family); |
||||
|
-- CREATE INDEX ulog2_ct_orig_ip_saddr ON ulog2_ct(orig_ip_saddr_str); |
||||
|
-- CREATE INDEX ulog2_ct_orig_ip_daddr ON ulog2_ct(orig_ip_daddr_str); |
||||
|
-- CREATE INDEX ulog2_ct_reply_ip_saddr ON ulog2_ct(reply_ip_saddr_str); |
||||
|
-- CREATE INDEX ulog2_ct_reply_ip_daddr ON ulog2_ct(reply_ip_daddr_str); |
||||
|
-- CREATE INDEX ulog2_ct_orig_l4_sport ON ulog2_ct(orig_l4_sport); |
||||
|
-- CREATE INDEX ulog2_ct_orig_l4_dport ON ulog2_ct(orig_l4_dport); |
||||
|
-- CREATE INDEX ulog2_ct_reply_l4_sport ON ulog2_ct(reply_l4_sport); |
||||
|
-- CREATE INDEX ulog2_ct_reply_l4_dport ON ulog2_ct(reply_l4_dport); |
||||
|
-- CREATE INDEX ulog2_ct_event ON ulog2_ct(ct_event); |
||||
|
|
||||
|
-- |
||||
|
-- Procedures |
||||
|
-- |
||||
|
|
||||
|
CREATE OR REPLACE FUNCTION INSERT_CT( |
||||
|
IN _ct_id integer, |
||||
|
IN _oob_family integer, |
||||
|
IN _orig_ip_saddr inet, |
||||
|
IN _orig_ip_daddr inet, |
||||
|
IN _orig_ip_protocol integer, |
||||
|
IN _orig_l4_sport integer, |
||||
|
IN _orig_l4_dport integer, |
||||
|
IN _orig_raw_pktlen bigint, |
||||
|
IN _orig_raw_pktcount bigint, |
||||
|
IN _reply_ip_saddr inet, |
||||
|
IN _reply_ip_daddr inet, |
||||
|
IN _reply_ip_protocol integer, |
||||
|
IN _reply_l4_sport integer, |
||||
|
IN _reply_l4_dport integer, |
||||
|
IN _reply_raw_pktlen bigint, |
||||
|
IN _reply_raw_pktcount bigint, |
||||
|
IN _icmp_code integer, |
||||
|
IN _icmp_type integer, |
||||
|
IN _ct_mark bigint, |
||||
|
IN _flow_start_sec bigint, |
||||
|
IN _flow_start_usec bigint, |
||||
|
IN _flow_end_sec bigint, |
||||
|
IN _flow_end_usec bigint, |
||||
|
IN _ct_event integer |
||||
|
) |
||||
|
RETURNS bigint AS $$ |
||||
|
INSERT INTO ulog2_ct (ct_id, oob_family, orig_ip_saddr_str, orig_ip_daddr_str, orig_ip_protocol, |
||||
|
orig_l4_sport, orig_l4_dport, orig_raw_pktlen, orig_raw_pktcount, |
||||
|
reply_ip_saddr_str, reply_ip_daddr_str, reply_ip_protocol, |
||||
|
reply_l4_sport, reply_l4_dport, reply_raw_pktlen, reply_raw_pktcount, |
||||
|
icmp_code, icmp_type, ct_mark, |
||||
|
flow_start_sec, flow_start_usec, |
||||
|
flow_end_sec, flow_end_usec, ct_event) |
||||
|
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24); |
||||
|
RETURN _ct_id; |
||||
|
$$ LANGUAGE SQL SECURITY INVOKER; |
||||
|
|
||||
|
CREATE OR REPLACE FUNCTION INSERT_OR_REPLACE_CT( |
||||
|
IN _ct_id integer, |
||||
|
IN _oob_family integer, |
||||
|
IN _orig_ip_saddr inet, |
||||
|
IN _orig_ip_daddr inet, |
||||
|
IN _orig_ip_protocol integer, |
||||
|
IN _orig_l4_sport integer, |
||||
|
IN _orig_l4_dport integer, |
||||
|
IN _orig_raw_pktlen bigint, |
||||
|
IN _orig_raw_pktcount bigint, |
||||
|
IN _reply_ip_saddr inet, |
||||
|
IN _reply_ip_daddr inet, |
||||
|
IN _reply_ip_protocol integer, |
||||
|
IN _reply_l4_sport integer, |
||||
|
IN _reply_l4_dport integer, |
||||
|
IN _reply_raw_pktlen bigint, |
||||
|
IN _reply_raw_pktcount bigint, |
||||
|
IN _icmp_code integer, |
||||
|
IN _icmp_type integer, |
||||
|
IN _ct_mark bigint, |
||||
|
IN _flow_start_sec bigint, |
||||
|
IN _flow_start_usec bigint, |
||||
|
IN _flow_end_sec bigint, |
||||
|
IN _flow_end_usec bigint, |
||||
|
IN _ct_event integer |
||||
|
) |
||||
|
RETURNS bigint AS $$ |
||||
|
DECLARE |
||||
|
_id bigint; |
||||
|
BEGIN |
||||
|
IF (_ct_event = 4) THEN |
||||
|
if (_orig_ip_protocol = 1) THEN |
||||
|
UPDATE ulog2_ct SET (orig_raw_pktlen, orig_raw_pktcount, |
||||
|
reply_raw_pktlen, reply_raw_pktcount, |
||||
|
ct_mark, flow_end_sec, flow_end_usec, ct_event) |
||||
|
= ($8,$9,$15,$16,$19,$22,$23,$24) |
||||
|
WHERE ct_id=$1 AND oob_family=$2 AND orig_ip_saddr_str = $3 |
||||
|
AND orig_ip_daddr_str = $4 AND orig_ip_protocol = $5 |
||||
|
AND reply_ip_saddr_str = $10 AND reply_ip_daddr_str = $11 |
||||
|
AND reply_ip_protocol = $12 |
||||
|
AND icmp_code = $17 AND icmp_type = $18 |
||||
|
AND ct_event < 4; |
||||
|
ELSE |
||||
|
UPDATE ulog2_ct SET (orig_raw_pktlen, orig_raw_pktcount, |
||||
|
reply_raw_pktlen, reply_raw_pktcount, |
||||
|
ct_mark, flow_end_sec, flow_end_usec, ct_event) |
||||
|
= ($8,$9,$15,$16,$19,$22,$23,$24) |
||||
|
WHERE ct_id=$1 AND oob_family=$2 AND orig_ip_saddr_str = $3 |
||||
|
AND orig_ip_daddr_str = $4 AND orig_ip_protocol = $5 |
||||
|
AND orig_l4_sport = $6 AND orig_l4_dport = $7 |
||||
|
AND reply_ip_saddr_str = $10 AND reply_ip_daddr_str = $11 |
||||
|
AND reply_ip_protocol = $12 AND reply_l4_sport = $13 |
||||
|
AND reply_l4_dport = $14 |
||||
|
AND ct_event < 4; |
||||
|
END IF; |
||||
|
ELSE |
||||
|
_id := INSERT_CT($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24); |
||||
|
END IF; |
||||
|
RETURN _id; |
||||
|
END |
||||
|
$$ LANGUAGE plpgsql SECURITY INVOKER; |
||||
|
|
||||
|
|
||||
|
CREATE OR REPLACE FUNCTION DELETE_CT_FLOW( |
||||
|
IN _ct_packet_id bigint |
||||
|
) |
||||
|
RETURNS void AS $$ |
||||
|
-- remember : table with most constraints first |
||||
|
DELETE FROM ulog2_ct WHERE ulog2_ct._ct_id = $1; |
||||
|
$$ LANGUAGE SQL SECURITY INVOKER; |
||||
|
|
||||
|
|
||||
|
-- Created by Pierre Chifflier <chifflier AT inl DOT fr> |
||||
|
-- Adapted by Thomas Chevalier <contact AT tchevalier DOT fr> |
||||
Loading…
Reference in new issue