144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "../src/utils.h"
244d362409d5469aed47d19e7908d19bd194493aThomas Graf
344d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void change_cb(struct nl_cache *cache, struct nl_object *obj,
444d362409d5469aed47d19e7908d19bd194493aThomas Graf		      int action)
544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nfnl_ct *ct = (struct nfnl_ct *) obj;
744d362409d5469aed47d19e7908d19bd194493aThomas Graf	static struct nl_addr *hack = NULL;
844d362409d5469aed47d19e7908d19bd194493aThomas Graf
944d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!hack)
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf		hack = nl_addr_parse("194.88.212.233", AF_INET);
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!nl_addr_cmp(hack, nfnl_ct_get_src(ct, 1)) ||
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf	    !nl_addr_cmp(hack, nfnl_ct_get_dst(ct, 1))) {
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf		struct nl_dump_params dp = {
15562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf			.dp_type = NL_DUMP_LINE,
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf			.dp_fd = stdout,
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf		};
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("UPDATE ");
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf		nl_object_dump(obj, &dp);
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf
2444d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[])
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache_mngr *mngr;
27562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	struct nl_sock *sock;
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache *ct;
2944d362409d5469aed47d19e7908d19bd194493aThomas Graf
30562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	sock = nlt_socket_alloc();
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf
32562c5323af89b4386eabf90aaf47bb67dca0fb6eThomas Graf	mngr = nl_cache_mngr_alloc(sock, NETLINK_NETFILTER, NL_AUTO_PROVIDE);
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!mngr) {
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf		nl_perror("nl_cache_mngr_alloc");
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf		return -1;
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
3744d362409d5469aed47d19e7908d19bd194493aThomas Graf
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf	ct = nl_cache_mngr_add(mngr, "netfilter/ct", &change_cb);
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (ct == NULL) {
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf		nl_perror("nl_cache_mngr_add(netfilter/ct)");
4144d362409d5469aed47d19e7908d19bd194493aThomas Graf		return -1;
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf	for (;;) {
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf		int err = nl_cache_mngr_poll(mngr, 5000);
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf		if (err < 0) {
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf			nl_perror("nl_cache_mngr_poll()");
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf			return -1;
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf		}
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_cache_mngr_free(mngr);
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf	return 0;
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf}
57