rtbsd: Include necessary headers on rtbsd.h.
[cascardo/ovs.git] / ofproto / ofproto-dpif-xlate.h
index 6296cf0..bf3a34d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #ifndef OFPROTO_DPIF_XLATE_H
 #define OFPROTO_DPIF_XLATE_H 1
 
+#include "dp-packet.h"
 #include "flow.h"
 #include "meta-flow.h"
 #include "odp-util.h"
 #include "ofpbuf.h"
 #include "ofproto-dpif-mirror.h"
+#include "ofproto-dpif-rid.h"
 #include "ofproto-dpif.h"
 #include "ofproto.h"
 #include "stp.h"
+#include "ovs-lldp.h"
 
 struct bfd;
 struct bond;
@@ -34,12 +37,6 @@ struct mac_learning;
 struct mcast_snooping;
 struct xlate_cache;
 
-struct xlate_recirc {
-    uint32_t recirc_id;  /* !0 Use recirculation instead of output. */
-    uint8_t  hash_alg;   /* !0 Compute hash for recirc before. */
-    uint32_t hash_basis;  /* Compute hash for recirc before. */
-};
-
 struct xlate_out {
     /* Wildcards relevant in translation.  Any fields that were used to
      * calculate the action must be set for caching and kernel
@@ -58,11 +55,72 @@ struct xlate_out {
     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;
+    union {
+        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. */
+static inline void
+xlate_out_add_recirc(struct xlate_out *xout, uint32_t id)
+{
+    if (OVS_LIKELY(xout->n_recircs < ARRAY_SIZE(xout->recirc))) {
+        xout->recirc[xout->n_recircs++] = id;
+    } else {
+        if (xout->n_recircs == ARRAY_SIZE(xout->recirc)) {
+            uint32_t *recircs = xmalloc(sizeof xout->recirc + sizeof id);
+
+            memcpy(recircs, xout->recirc, sizeof xout->recirc);
+            xout->recircs = recircs;
+        } else {
+            xout->recircs = xrealloc(xout->recircs,
+                                     (xout->n_recircs + 1) * sizeof id);
+        }
+        xout->recircs[xout->n_recircs++] = id;
+    }
+}
+
+static inline const uint32_t *
+xlate_out_get_recircs(const struct xlate_out *xout)
+{
+    if (OVS_LIKELY(xout->n_recircs <= ARRAY_SIZE(xout->recirc))) {
+        return xout->recirc;
+    } else {
+        return xout->recircs;
+    }
+}
+
+static inline void
+xlate_out_take_recircs(struct xlate_out *xout)
+{
+    if (OVS_UNLIKELY(xout->n_recircs > ARRAY_SIZE(xout->recirc))) {
+        free(xout->recircs);
+    }
+    xout->n_recircs = 0;
+}
+
+static inline void
+xlate_out_free_recircs(struct xlate_out *xout)
+{
+    if (OVS_LIKELY(xout->n_recircs <= ARRAY_SIZE(xout->recirc))) {
+        for (int i = 0; i < xout->n_recircs; i++) {
+            recirc_free_id(xout->recirc[i]);
+        }
+    } else {
+        for (int i = 0; i < xout->n_recircs; i++) {
+            recirc_free_id(xout->recircs[i]);
+        }
+        free(xout->recircs);
+    }
+}
+
 struct xlate_in {
     struct ofproto_dpif *ofproto;
 
@@ -72,7 +130,7 @@ struct xlate_in {
 
     /* The packet corresponding to 'flow', or a null pointer if we are
      * revalidating without a packet to refer to. */
-    const struct ofpbuf *packet;
+    const struct dp_packet *packet;
 
     /* Should OFPP_NORMAL update the MAC learning table?  Should "learn"
      * actions update the flow table?
@@ -119,7 +177,8 @@ struct xlate_in {
      * significant decision, e.g. to explain why OFPP_NORMAL translation
      * dropped a packet.  'recurse' is the resubmit recursion depth at time of
      * invocation. */
-    void (*report_hook)(struct xlate_in *, const char *s, int recurse);
+    void (*report_hook)(struct xlate_in *, int recurse,
+                        const char *format, va_list args);
 
     /* If nonnull, flow translation credits the specified statistics to each
      * rule reached through a resubmit or OFPP_TABLE action.
@@ -141,19 +200,19 @@ struct xlate_in {
      * odp_actions stored in xlate_out.  If NULL, the default buffer will be
      * used. */
     struct ofpbuf *odp_actions;
+
+    /* The recirculation context related to this translation, as returned by
+     * xlate_lookup. */
+    const struct recirc_id_node *recirc;
 };
 
-void xlate_ofproto_set(struct ofproto_dpif *, const char *name,
-                       struct dpif *, struct rule_dpif *miss_rule,
-                       struct rule_dpif *no_packet_in_rule,
+void xlate_ofproto_set(struct ofproto_dpif *, const char *name, struct dpif *,
                        const struct mac_learning *, struct stp *,
                        struct rstp *, const struct mcast_snooping *,
                        const struct mbridge *, const struct dpif_sflow *,
                        const struct dpif_ipfix *, const struct netflow *,
-                       enum ofp_config_flags, bool forward_bpdu,
-                       bool has_in_band, bool enable_recirc,
-                       bool variable_length_userdata,
-                       size_t mpls_label_stack_length);
+                       bool forward_bpdu, bool has_in_band,
+                       const struct dpif_backer_support *support);
 void xlate_remove_ofproto(struct ofproto_dpif *);
 
 void xlate_bundle_set(struct ofproto_dpif *, struct ofbundle *,
@@ -165,10 +224,9 @@ void xlate_bundle_remove(struct ofbundle *);
 
 void xlate_ofport_set(struct ofproto_dpif *, struct ofbundle *,
                       struct ofport_dpif *, ofp_port_t, odp_port_t,
-                      const struct netdev *, const struct cfm *,
-                      const struct bfd *, struct ofport_dpif *peer,
-                      int stp_port_no,
-                      const struct rstp_port *rstp_port,
+                      const struct netdev *, const struct cfm *, const struct bfd *,
+                      const struct lldp *, struct ofport_dpif *peer,
+                      int stp_port_no, const struct rstp_port *rstp_port,
                       const struct ofproto_port_queue *qdscp,
                       size_t n_qdscp, enum ofputil_port_config,
                       enum ofputil_port_state, bool is_tunnel,
@@ -186,12 +244,11 @@ int xlate_lookup(const struct dpif_backer *, const struct flow *,
 void xlate_actions(struct xlate_in *, struct xlate_out *);
 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 ofpbuf *packet);
+                   uint16_t tcp_flags, const struct dp_packet *packet);
 void xlate_out_uninit(struct xlate_out *);
 void xlate_actions_for_side_effects(struct xlate_in *);
-void xlate_out_copy(struct xlate_out *dst, const struct xlate_out *src);
 
-int xlate_send_packet(const struct ofport_dpif *, struct ofpbuf *);
+int xlate_send_packet(const struct ofport_dpif *, struct dp_packet *);
 
 struct xlate_cache *xlate_cache_new(void);
 void xlate_push_stats(struct xlate_cache *, const struct dpif_flow_stats *);