|
@@ -485,6 +485,7 @@ static int __ovs_ct_lookup(struct net *net, struct sw_flow_key *key,
|
|
|
*/
|
|
|
if (!skb_nfct_cached(net, key, info, skb)) {
|
|
|
struct nf_conn *tmpl = info->ct;
|
|
|
+ int err;
|
|
|
|
|
|
/* Associate skb with specified zone. */
|
|
|
if (tmpl) {
|
|
@@ -495,8 +496,13 @@ static int __ovs_ct_lookup(struct net *net, struct sw_flow_key *key,
|
|
|
skb->nfctinfo = IP_CT_NEW;
|
|
|
}
|
|
|
|
|
|
- if (nf_conntrack_in(net, info->family, NF_INET_PRE_ROUTING,
|
|
|
- skb) != NF_ACCEPT)
|
|
|
+ /* Repeat if requested, see nf_iterate(). */
|
|
|
+ do {
|
|
|
+ err = nf_conntrack_in(net, info->family,
|
|
|
+ NF_INET_PRE_ROUTING, skb);
|
|
|
+ } while (err == NF_REPEAT);
|
|
|
+
|
|
|
+ if (err != NF_ACCEPT)
|
|
|
return -ENOENT;
|
|
|
|
|
|
ovs_ct_update_key(skb, info, key, true);
|