Ejemplo n.º 1
0
static inline int
ctnetlink_dump_tuples(struct sk_buff *skb, 
		      const struct nf_conntrack_tuple *tuple)
{
	struct nfattr *nest_parms;
	struct nf_conntrack_l3proto *l3proto;
	int ret = 0;
	
	l3proto = nf_ct_l3proto_find_get(tuple->src.l3num);
	
	nest_parms = NFA_NEST(skb, CTA_TUPLE_IP);
	if (likely(l3proto->tuple_to_nfattr))
		ret = l3proto->tuple_to_nfattr(skb, tuple);
	NFA_NEST_END(skb, nest_parms);

	nf_ct_l3proto_put(l3proto);

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

	nest_parms = NFA_NEST(skb, CTA_TUPLE_PROTO);
	ret = ctnetlink_dump_tuples_proto(skb, tuple);
	NFA_NEST_END(skb, nest_parms);

	return ret;

nfattr_failure:
	return -1;
}
bool nat64_determine_incoming_tuple_init(void)
{
	l3proto_ip = nf_ct_l3proto_find_get((u_int16_t) NFPROTO_IPV4);
	if (l3proto_ip == NULL) {
		pr_warning("NAT64: couldn't load IPv4 l3proto");
		return false;
	} 

	l3proto_ipv6 = nf_ct_l3proto_find_get((u_int16_t) NFPROTO_IPV6);
	if (l3proto_ipv6 == NULL) {
		pr_warning("NAT64: couldn't load IPv6 l3proto");
		return false;
	}

	return true;
}
int
nf_ct_l3proto_try_module_get(unsigned short l3proto)
{
	int ret;
	struct nf_conntrack_l3proto *p;

retry:	p = nf_ct_l3proto_find_get(l3proto);
	if (p == &nf_conntrack_l3proto_generic) {
		ret = request_module("nf_conntrack-%d", l3proto);
		if (!ret)
			goto retry;

		return -EPROTOTYPE;
	}

	return 0;
}
Ejemplo n.º 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;
}