static inline int
ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct nf_conn *ct)
{
	struct nf_conntrack_l4proto *l4proto = nf_ct_l4proto_find_get(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num, ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum);
	struct nlattr *nest_proto;
	int ret;

	if (!l4proto->to_nlattr) {
		nf_ct_l4proto_put(l4proto);
		return 0;
	}

	nest_proto = nla_nest_start(skb, CTA_PROTOINFO | NLA_F_NESTED);
	if (!nest_proto)
		goto nla_put_failure;

	ret = l4proto->to_nlattr(skb, nest_proto, ct);

	nf_ct_l4proto_put(l4proto);

	nla_nest_end(skb, nest_proto);

	return ret;

nla_put_failure:
	nf_ct_l4proto_put(l4proto);
	return -1;
}
Пример #2
0
static inline int
ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct nf_conn *ct)
{
	struct nf_conntrack_l4proto *l4proto = nf_ct_l4proto_find_get(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num, ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum);
	struct nfattr *nest_proto;
	int ret;

	if (!l4proto->to_nfattr) {
		nf_ct_l4proto_put(l4proto);
		return 0;
	}

	nest_proto = NFA_NEST(skb, CTA_PROTOINFO);

	ret = l4proto->to_nfattr(skb, nest_proto, ct);

	nf_ct_l4proto_put(l4proto);

	NFA_NEST_END(skb, nest_proto);

	return ret;

nfattr_failure:
	nf_ct_l4proto_put(l4proto);
	return -1;
}
Пример #3
0
static inline int
ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct nf_conn *ct)
{
	struct nf_conntrack_l4proto *l4proto;
	struct nlattr *nest_proto;
	int ret;

	l4proto = nf_ct_l4proto_find_get(nf_ct_l3num(ct), nf_ct_protonum(ct));
	if (!l4proto->to_nlattr) {
		nf_ct_l4proto_put(l4proto);
		return 0;
	}

	nest_proto = nla_nest_start(skb, CTA_PROTOINFO | NLA_F_NESTED);
	if (!nest_proto)
		goto nla_put_failure;

	ret = l4proto->to_nlattr(skb, nest_proto, ct);

	nf_ct_l4proto_put(l4proto);

	nla_nest_end(skb, nest_proto);

	return ret;

nla_put_failure:
	nf_ct_l4proto_put(l4proto);
	return -1;
}
Пример #4
0
static inline int
ctnetlink_dump_tuples(struct sk_buff *skb,
		      const struct nf_conntrack_tuple *tuple)
{
	int ret;
	struct nf_conntrack_l3proto *l3proto;
	struct nf_conntrack_l4proto *l4proto;

	l3proto = nf_ct_l3proto_find_get(tuple->src.l3num);
	ret = ctnetlink_dump_tuples_ip(skb, tuple, l3proto);
	nf_ct_l3proto_put(l3proto);

	if (unlikely(ret < 0))
		return ret;

	l4proto = nf_ct_l4proto_find_get(tuple->src.l3num, tuple->dst.protonum);
	ret = ctnetlink_dump_tuples_proto(skb, tuple, l4proto);
	nf_ct_l4proto_put(l4proto);

	return ret;
}