コード例 #1
0
ファイル: callback.c プロジェクト: millken/zhuxianB30
int __callback(struct nlmsghdr *nlh, struct nfattr *nfa[], void *data)
{
	int ret = NFNL_CB_STOP;
	unsigned int type;
	struct nf_conntrack *ct;
	int len = nlh->nlmsg_len;
	struct __data_container *container = data;

	len -= NLMSG_LENGTH(sizeof(struct nfgenmsg));
	if (len < 0)
		return NFNL_CB_CONTINUE;

	type = __parse_message_type(nlh);
	if (!(type & container->type))
		return NFNL_CB_CONTINUE;

	ct = nfct_new();
	if (!ct)
		return NFNL_CB_CONTINUE;

	__parse_conntrack(nlh, (const struct nfattr **)nfa, ct);

	if (container->h->cb)
		ret = container->h->cb(type, ct, container->data);
	else if (container->h->cb2)
		ret = container->h->cb2(nlh, type, ct, container->data);

	switch(ret) {
	case NFCT_CB_FAILURE:
		free(ct);
		ret = NFNL_CB_FAILURE;
		break;
	case NFCT_CB_STOP:
		free(ct);
		ret = NFNL_CB_STOP;
		break;
	case NFCT_CB_CONTINUE:
		free(ct);
		ret = NFNL_CB_CONTINUE;
		break;
	case NFCT_CB_STOLEN:
		ret = NFNL_CB_CONTINUE;
		break;
	}
	return ret;
}
コード例 #2
0
ファイル: callback.c プロジェクト: OPSF/uClinux
int __expect_callback(struct nlmsghdr *nlh, struct nfattr *nfa[], void *data)
{
	int ret = NFNL_CB_STOP;
	unsigned int type;
	struct nf_expect *exp;
	int len = nlh->nlmsg_len;
	struct __data_container *container = data;

	len -= NLMSG_LENGTH(sizeof(struct nfgenmsg));
	if (len < 0)
		return NFNL_CB_CONTINUE;

	type = __parse_message_type(nlh);
	if (!(type & container->type))
		return NFNL_CB_CONTINUE;

	exp = nfexp_new();
	if (!exp)
		return NFNL_CB_CONTINUE;

	__parse_expect(nlh, nfa, exp);

	if (container->h->expect_cb)
		ret = container->h->expect_cb(type, exp, container->data);

	switch(ret) {
	case NFCT_CB_FAILURE:
		free(exp);
		ret = NFNL_CB_FAILURE;
		break;
	case NFCT_CB_STOP:
		free(exp);
		ret = NFNL_CB_STOP;
		break;
	case NFCT_CB_CONTINUE:
		free(exp);
		ret = NFNL_CB_CONTINUE;
		break;
	case NFCT_CB_STOLEN:
		ret = NFNL_CB_CONTINUE;
		break;
	}
	return ret;
}