@@ -739,20 +739,23 @@ put_replace_router_port_mac_flows(struct ovsdb_idl_index
}
static void
-put_local_common_flows(uint32_t dp_key, uint32_t port_key,
- uint32_t parent_port_key,
+put_local_common_flows(uint32_t dp_key,
+ const struct sbrec_port_binding *pb,
+ const struct sbrec_port_binding *parent_pb,
const struct zone_ids *zone_ids,
struct ofpbuf *ofpacts_p,
struct ovn_desired_flow_table *flow_table)
{
struct match match;
- /* Table 33, priority 100.
+ uint32_t port_key = pb->tunnel_key;
+
+ /* Table 38, priority 100.
* =======================
*
* Implements output to local hypervisor. Each flow matches a
* logical output port on the local hypervisor, and resubmits to
- * table 34.
+ * table 39.
*/
match_init_catchall(&match);
@@ -774,12 +777,13 @@ put_local_common_flows(uint32_t dp_key, uint32_t port_key,
}
}
- /* Resubmit to table 34. */
+ /* Resubmit to table 39. */
put_resubmit(OFTABLE_CHECK_LOOPBACK, ofpacts_p);
- ofctrl_add_flow(flow_table, OFTABLE_LOCAL_OUTPUT, 100, 0,
- &match, ofpacts_p, hc_uuid);
+ ofctrl_add_flow(flow_table, OFTABLE_LOCAL_OUTPUT, 100,
+ pb->header_.uuid.parts[0], &match, ofpacts_p,
+ &pb->header_.uuid);
- /* Table 34, Priority 100.
+ /* Table 39, Priority 100.
* =======================
*
* Drop packets whose logical inport and outport are the same
@@ -791,8 +795,9 @@ put_local_common_flows(uint32_t dp_key, uint32_t port_key,
0, MLF_ALLOW_LOOPBACK);
match_set_reg(&match, MFF_LOG_INPORT - MFF_REG0, port_key);
match_set_reg(&match, MFF_LOG_OUTPORT - MFF_REG0, port_key);
- ofctrl_add_flow(flow_table, OFTABLE_CHECK_LOOPBACK, 100, 0,
- &match, ofpacts_p, hc_uuid);
+ ofctrl_add_flow(flow_table, OFTABLE_CHECK_LOOPBACK, 100,
+ pb->header_.uuid.parts[0], &match, ofpacts_p,
+ &pb->header_.uuid);
/* Table 64, Priority 100.
* =======================
@@ -806,7 +811,7 @@ put_local_common_flows(uint32_t dp_key, uint32_t port_key,
* table 65 for logical-to-physical translation, then restore
* the port number.
*
- * If 'parent_port_key' is set, then the 'port_key' represents a nested
+ * If 'parent_pb' is not NULL, then the 'pb' represents a nested
* container.
*
* Note:We can set in_port to 0 too. But if recirculation happens
@@ -815,7 +820,7 @@ put_local_common_flows(uint32_t dp_key, uint32_t port_key,
* in_port is 0.
* */
- bool nested_container = parent_port_key ? true: false;
+ bool nested_container = parent_pb ? true: false;
match_init_catchall(&match);
ofpbuf_clear(ofpacts_p);
match_set_metadata(&match, htonll(dp_key));
@@ -829,8 +834,9 @@ put_local_common_flows(uint32_t dp_key, uint32_t port_key,
put_load(ofp_to_u16(OFPP_NONE), MFF_IN_PORT, 0, 16, ofpacts_p);
put_resubmit(OFTABLE_LOG_TO_PHY, ofpacts_p);
put_stack(MFF_IN_PORT, ofpact_put_STACK_POP(ofpacts_p));
- ofctrl_add_flow(flow_table, OFTABLE_SAVE_INPORT, 100, 0,
- &match, ofpacts_p, hc_uuid);
+ ofctrl_add_flow(flow_table, OFTABLE_SAVE_INPORT, 100,
+ pb->header_.uuid.parts[0], &match, ofpacts_p,
+ &pb->header_.uuid);
if (nested_container) {
/* It's a nested container and when the packet from the nested
@@ -852,7 +858,8 @@ put_local_common_flows(uint32_t dp_key, uint32_t port_key,
match_init_catchall(&match);
ofpbuf_clear(ofpacts_p);
match_set_metadata(&match, htonll(dp_key));
- match_set_reg(&match, MFF_LOG_OUTPORT - MFF_REG0, parent_port_key);
+ match_set_reg(&match, MFF_LOG_OUTPORT - MFF_REG0,
+ parent_pb->tunnel_key);
match_set_reg_masked(&match, MFF_LOG_FLAGS - MFF_REG0,
MLF_NESTED_CONTAINER, MLF_NESTED_CONTAINER);
@@ -941,7 +948,7 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name,
}
struct zone_ids binding_zones = get_zone_ids(binding, ct_zones);
- put_local_common_flows(dp_key, port_key, 0, &binding_zones,
+ put_local_common_flows(dp_key, binding, NULL, &binding_zones,
ofpacts_p, flow_table);
match_init_catchall(&match);
@@ -1141,10 +1148,9 @@ consider_port_binding(struct ovsdb_idl_index *sbrec_port_binding_by_name,
*/
struct zone_ids zone_ids = get_zone_ids(binding, ct_zones);
- uint32_t parent_port_key = parent_port ? parent_port->tunnel_key : 0;
- /* Pass the parent port tunnel key if the port is a nested
+ /* Pass the parent port binding if the port is a nested
* container. */
- put_local_common_flows(dp_key, port_key, parent_port_key, &zone_ids,
+ put_local_common_flows(dp_key, binding, parent_port, &zone_ids,
ofpacts_p, flow_table);
/* Table 0, Priority 150 and 100.