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; }
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; }