This section describes the operations that take place when a flow is sent by the controller to be programmed in the OpenFlow
device.
Typically a device has flow tables arranged in a pipeline. The pipeline capabilities information specifies the structure of
the pipeline, such as the number of tables or stages, what each stage is capable of doing (match or actions), and the size
of each table.
When the controller sends a flow request, the OpenFlow agent verifies whether the flow can be handled by the hardware. It
compares the flow against the capabilities of the hardware that are defined when the switch is booted up. If the flow is valid,
it is programmed in the appropriate flow table.
If the new pipeline is validated (whether the hardware can support the pipeline), it becomes the new set of capabilities used
to check if a flow can be installed or not.
After the pipeline is instantiated and flows are installed, packets are forwarded by the switch. Ingress packets are matched
against the flows in each flow table, until the highest-priority matching flow entry is found. Packet matching may be exact
(match all fields of the table exactly), or partial (match some or all fields, and fields with bit masks may be partially
matched). Packets can be modified or forwarded based on the configured actions. Actions can be applied in the pipeline at
any time. An action can determine the next flow table to match, the set of egress ports for the packet, and whether the packet
should be routed to the controller.