static size_t
 compose_dsts(const struct bridge *br, const struct flow *flow, uint16_t vlan,
              const struct port *in_port, const struct port *out_port,
-             struct ft_dst dsts[])
+             struct ft_dst dsts[], tag_type *tags)
 {
     if (out_port == FLOOD_PORT) {
         /* Flood. */
             if (port != in_port && (!port->vlan || vlan == port->vlan)) {
                 /* Put destinations for original VLAN at the front, so that we
                  * don't have to add actions to set the VLAN tag for those. */
-                set_dst(dst, flow, in_port, port);
+                *tags |= set_dst(dst, flow, in_port, port);
                 if (dst->vlan == ntohs(flow->dl_vlan)) {
                     swap_dst(dst, vlan_dsts++);
                 }
         return dst - dsts;
     } else if (out_port) {
         /* Unicast. */
-        set_dst(dsts, flow, in_port, out_port);
+        *tags |= set_dst(dsts, flow, in_port, out_port);
         return 1;
     } else {
         /* Drop. */
     size_t actions_len;         /* Estimated length of actions, in bytes. */
     size_t n_dsts;
 
-    n_dsts = compose_dsts(br, flow, vlan, in_port, out_port, dsts);
+    n_dsts = compose_dsts(br, flow, vlan, in_port, out_port, dsts, &tags);
     actions_len = (sizeof(struct ofp_action_header) + 2) * n_dsts;
 
     if (setup_flow) {