struct xlate_out {
enum slow_path_reason slow; /* 0 if fast path may be used. */
bool fail_open; /* Initial rule is fail open? */
- bool has_learn; /* Actions include NXAST_LEARN? */
- bool has_normal; /* Actions output to OFPP_NORMAL? */
- bool has_fin_timeout; /* Actions include NXAST_FIN_TIMEOUT? */
- ofp_port_t nf_output_iface; /* Output interface index for NetFlow. */
- mirror_mask_t mirrors; /* Bitmap of associated mirrors. */
/* Recirculation IDs on which references are held. */
unsigned n_recircs;
uint32_t recirc[2]; /* When n_recircs == 1 or 2 */
uint32_t *recircs; /* When 'n_recircs' > 2 */
};
-
- uint64_t odp_actions_stub[256 / 8];
- struct ofpbuf odp_actions_buf;
- struct ofpbuf *odp_actions;
};
/* Helpers to abstract the recirculation union away. */
* calling xlate_in_init(). */
const struct dpif_flow_stats *resubmit_stats;
+ /* Recursion and resubmission levels carried over from a pre-existing
+ * translation of a related flow. An example of when this can occur is
+ * the translation of an ARP packet that was generated as the result of
+ * outputting to a tunnel port. In this case, the original flow going to
+ * the tunnel is the related flow. Since the two flows are different, they
+ * should not use the same xlate_ctx structure. However, we still need
+ * limit the maximum recursion across the entire translation.
+ *
+ * These fields are normally set to zero, so the client has to set them
+ * manually after calling xlate_in_init(). In that case, they should be
+ * copied from the same-named fields in the related flow's xlate_ctx. */
+ int recurse;
+ int resubmits;
+
/* If nonnull, flow translation populates this cache with references to all
* modules that are affected by translation. This 'xlate_cache' may be
* passed to xlate_push_stats() to perform the same function as
* calling xlate_in_init(). */
struct xlate_cache *xcache;
- /* Allows callers to optionally supply their own buffer for the resulting
- * odp_actions stored in xlate_out. If NULL, the default buffer will be
- * used. */
+ /* If nonnull, flow translation puts the resulting datapath actions in this
+ * buffer. If null, flow translation will not produce datapath actions. */
struct ofpbuf *odp_actions;
/* If nonnull, flow translation populates this with wildcards relevant in
void xlate_in_init(struct xlate_in *, struct ofproto_dpif *,
const struct flow *, ofp_port_t in_port, struct rule_dpif *,
uint16_t tcp_flags, const struct dp_packet *packet,
- struct flow_wildcards *);
+ struct flow_wildcards *, struct ofpbuf *odp_actions);
void xlate_out_uninit(struct xlate_out *);
void xlate_actions_for_side_effects(struct xlate_in *);