18a44513648da0c5f5551f96b329cf56b66f5b303pkanwar/*
28a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * (C) 2005-2011 by Pablo Neira Ayuso <pablo@netfilter.org>
38a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *
48a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * This program is free software; you can redistribute it and/or modify it
58a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * under the terms of the GNU General Public License as published by
68a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * the Free Software Foundation; either version 2 of the License, or
78a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * (at your option) any later version.
88a44513648da0c5f5551f96b329cf56b66f5b303pkanwar */
98a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
108a44513648da0c5f5551f96b329cf56b66f5b303pkanwar#include "internal/internal.h"
118a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
128a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_orig_ipv4(const struct nf_conntrack *ct, void *data)
138a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
148a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ipv4 *this = data;
158a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->src = ct->head.orig.src.v4;
168a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->dst = ct->head.orig.dst.v4;
178a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
188a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
198a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_repl_ipv4(const struct nf_conntrack *ct, void *data)
208a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
218a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ipv4 *this = data;
228a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->src = ct->repl.src.v4;
238a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->dst = ct->repl.dst.v4;
248a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
258a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
268a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_orig_ipv6(const struct nf_conntrack *ct, void *data)
278a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
288a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ipv6 *this = data;
298a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(this->src, &ct->head.orig.src.v6, sizeof(uint32_t)*4);
308a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(this->dst, &ct->head.orig.dst.v6, sizeof(uint32_t)*4);
318a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
328a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
338a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_repl_ipv6(const struct nf_conntrack *ct, void *data)
348a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
358a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ipv6 *this = data;
368a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(this->src, &ct->repl.src.v6, sizeof(uint32_t)*4);
378a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(this->dst, &ct->repl.dst.v6, sizeof(uint32_t)*4);
388a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
398a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
408a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_orig_port(const struct nf_conntrack *ct, void *data)
418a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
428a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_port *this = data;
438a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->sport = ct->head.orig.l4src.all;
448a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->dport = ct->head.orig.l4dst.all;
458a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
468a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
478a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_repl_port(const struct nf_conntrack *ct, void *data)
488a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
498a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_port *this = data;
508a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->sport = ct->repl.l4src.all;
518a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->dport = ct->repl.l4dst.all;
528a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
538a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
548a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_icmp(const struct nf_conntrack *ct, void *data)
558a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
568a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_icmp *this = data;
578a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->type = ct->head.orig.l4dst.icmp.type;
588a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->code = ct->head.orig.l4dst.icmp.code;
598a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->id = ct->head.orig.l4src.icmp.id;
608a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
618a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
628a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_master_ipv4(const struct nf_conntrack *ct, void *data)
638a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
648a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ipv4 *this = data;
658a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->src = ct->master.src.v4;
668a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->dst = ct->master.dst.v4;
678a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
688a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
698a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_master_ipv6(const struct nf_conntrack *ct, void *data)
708a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
718a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ipv6 *this = data;
728a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(this->src, &ct->master.src.v6, sizeof(uint32_t)*4);
738a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(this->dst, &ct->master.dst.v6, sizeof(uint32_t)*4);
748a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
758a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
768a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_master_port(const struct nf_conntrack *ct, void *data)
778a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
788a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_port *this = data;
798a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->sport = ct->master.l4src.all;
808a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->dport = ct->master.l4dst.all;
818a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
828a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
838a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_orig_ctrs(const struct nf_conntrack *ct, void *data)
848a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
858a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ctrs *this = data;
868a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->packets = ct->counters[__DIR_ORIG].packets;
878a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->bytes = ct->counters[__DIR_ORIG].bytes;
888a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
898a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
908a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void get_attr_grp_repl_ctrs(const struct nf_conntrack *ct, void *data)
918a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
928a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	struct nfct_attr_grp_ctrs *this = data;
938a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->packets = ct->counters[__DIR_REPL].packets;
948a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	this->bytes = ct->counters[__DIR_REPL].bytes;
958a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
968a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
978a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void
988a44513648da0c5f5551f96b329cf56b66f5b303pkanwarget_attr_grp_orig_addr_src(const struct nf_conntrack *ct, void *data)
998a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
1008a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	union nfct_attr_grp_addr *this = data;
1018a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(&this->addr, &ct->head.orig.src, sizeof(ct->head.orig.src));
1028a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
1038a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1048a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void
1058a44513648da0c5f5551f96b329cf56b66f5b303pkanwarget_attr_grp_orig_addr_dst(const struct nf_conntrack *ct, void *data)
1068a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
1078a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	union nfct_attr_grp_addr *this = data;
1088a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(&this->addr, &ct->head.orig.dst, sizeof(ct->head.orig.dst));
1098a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
1108a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1118a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void
1128a44513648da0c5f5551f96b329cf56b66f5b303pkanwarget_attr_grp_repl_addr_src(const struct nf_conntrack *ct, void *data)
1138a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
1148a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	union nfct_attr_grp_addr *this = data;
1158a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(&this->addr, &ct->repl.src, sizeof(ct->repl.src));
1168a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
1178a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1188a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic void
1198a44513648da0c5f5551f96b329cf56b66f5b303pkanwarget_attr_grp_repl_addr_dst(const struct nf_conntrack *ct, void *data)
1208a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
1218a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	union nfct_attr_grp_addr *this = data;
1228a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	memcpy(&this->addr, &ct->repl.dst, sizeof(ct->repl.dst));
1238a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
1248a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1258a44513648da0c5f5551f96b329cf56b66f5b303pkanwarconst get_attr_grp get_attr_grp_array[ATTR_GRP_MAX] = {
1268a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ORIG_IPV4]		= get_attr_grp_orig_ipv4,
1278a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_REPL_IPV4]		= get_attr_grp_repl_ipv4,
1288a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ORIG_IPV6]		= get_attr_grp_orig_ipv6,
1298a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_REPL_IPV6]		= get_attr_grp_repl_ipv6,
1308a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ORIG_PORT]		= get_attr_grp_orig_port,
1318a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_REPL_PORT]		= get_attr_grp_repl_port,
1328a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ICMP]			= get_attr_grp_icmp,
1338a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_MASTER_IPV4]		= get_attr_grp_master_ipv4,
1348a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_MASTER_IPV6]		= get_attr_grp_master_ipv6,
1358a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_MASTER_PORT]		= get_attr_grp_master_port,
1368a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ORIG_COUNTERS]	= get_attr_grp_orig_ctrs,
1378a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_REPL_COUNTERS]	= get_attr_grp_repl_ctrs,
1388a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ORIG_ADDR_SRC]	= get_attr_grp_orig_addr_src,
1398a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_ORIG_ADDR_DST]	= get_attr_grp_orig_addr_dst,
1408a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_REPL_ADDR_SRC]	= get_attr_grp_repl_addr_src,
1418a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	[ATTR_GRP_REPL_ADDR_DST]	= get_attr_grp_repl_addr_dst,
1428a44513648da0c5f5551f96b329cf56b66f5b303pkanwar};
143