On Fri, May 12, 2017 at 12:06 AM, Mickey Spiegel <mickeys....@gmail.com> wrote:
> The OVN ingress pipeline for a logical switch is maxed out at 16 stages. > > This patch takes the simple approach of starting the ingress pipeline at > table 8 rather than table 16, and starting the egress pipeline at > table 40 rather than table 48. > > You also need to increase the range of the Logical_Flow.table_id column in south bound db [1]. The present range is 0 to 15. [1]- https://github.com/openvswitch/ovs/blob/master/ovn/ovn-sb.ovsschema#L66 Numan Signed-off-by: Mickey Spiegel <mickeys....@gmail.com> > --- > ovn/controller/lflow.h | 6 +++--- > ovn/ovn-architecture.7.xml | 27 ++++++++++++++------------- > ovn/utilities/ovn-trace.c | 2 +- > tests/ovn.at | 40 ++++++++++++++++++++-------------------- > tests/test-ovn.c | 6 +++--- > 5 files changed, 41 insertions(+), 40 deletions(-) > > diff --git a/ovn/controller/lflow.h b/ovn/controller/lflow.h > index 8761b1e..a23cde0 100644 > --- a/ovn/controller/lflow.h > +++ b/ovn/controller/lflow.h > @@ -49,17 +49,17 @@ struct uuid; > * These are heavily documented in ovn-architecture(7), please update it > if > * you make any changes. */ > #define OFTABLE_PHY_TO_LOG 0 > -#define OFTABLE_LOG_INGRESS_PIPELINE 16 /* First of LOG_PIPELINE_LEN > tables. */ > +#define OFTABLE_LOG_INGRESS_PIPELINE 8 /* First of LOG_PIPELINE_LEN > tables. */ > #define OFTABLE_REMOTE_OUTPUT 32 > #define OFTABLE_LOCAL_OUTPUT 33 > #define OFTABLE_CHECK_LOOPBACK 34 > -#define OFTABLE_LOG_EGRESS_PIPELINE 48 /* First of LOG_PIPELINE_LEN > tables. */ > +#define OFTABLE_LOG_EGRESS_PIPELINE 40 /* First of LOG_PIPELINE_LEN > tables. */ > #define OFTABLE_SAVE_INPORT 64 > #define OFTABLE_LOG_TO_PHY 65 > #define OFTABLE_MAC_BINDING 66 > > /* The number of tables for the ingress and egress pipelines. */ > -#define LOG_PIPELINE_LEN 16 > +#define LOG_PIPELINE_LEN 24 > > void lflow_init(void); > void lflow_run(struct controller_ctx *, > diff --git a/ovn/ovn-architecture.7.xml b/ovn/ovn-architecture.7.xml > index d8114f1..eb6744b 100644 > --- a/ovn/ovn-architecture.7.xml > +++ b/ovn/ovn-architecture.7.xml > @@ -774,7 +774,7 @@ > VXLAN tunnels do not transmit the logical output port field. > Since VXLAN tunnels do not carry a logical output port field in > the tunnel key, when a packet is received from VXLAN tunnel by > - an OVN hypervisor, the packet is resubmitted to table 16 to > + an OVN hypervisor, the packet is resubmitted to table 8 to > determine the output port(s); when the packet reaches table 32, > these packets are resubmitted to table 33 for local delivery by > checking a MLF_RCV_FROM_VXLAN flag, which is set when the packet > @@ -835,7 +835,7 @@ > the packet's ingress port. Its actions annotate the packet with > logical metadata, by setting the logical datapath field to > identify the > logical datapath that the packet is traversing and the logical > input > - port field to identify the ingress port. Then it resubmits to > table 16 > + port field to identify the ingress port. Then it resubmits to > table 8 > to enter the logical ingress pipeline. > </p> > > @@ -864,13 +864,13 @@ > > <li> > <p> > - OpenFlow tables 16 through 31 execute the logical ingress > pipeline from > + OpenFlow tables 8 through 31 execute the logical ingress pipeline > from > the <code>Logical_Flow</code> table in the OVN Southbound > database. > These tables are expressed entirely in terms of logical concepts > like > logical ports and logical datapaths. A big part of > <code>ovn-controller</code>'s job is to translate them into > equivalent > OpenFlow (in particular it translates the table numbers: > - <code>Logical_Flow</code> tables 0 through 15 become OpenFlow > tables 16 > + <code>Logical_Flow</code> tables 0 through 23 become OpenFlow > tables 8 > through 31). > </p> > > @@ -999,7 +999,7 @@ > and resubmit these packets to table 33 for local delivery. Packets > received from VXLAN tunnels reach here because of a lack of > logical > output port field in the tunnel key and thus these packets needed > to > - be submitted to table 16 to determine the output port. > + be submitted to table 8 to determine the output port. > </p> > > <p> > @@ -1024,13 +1024,13 @@ > <p> > Table 34 matches and drops packets for which the logical input and > output ports are the same and the MLF_ALLOW_LOOPBACK flag is not > - set. It resubmits other packets to table 48. > + set. It resubmits other packets to table 40. > </p> > </li> > > <li> > <p> > - OpenFlow tables 48 through 63 execute the logical egress pipeline > from > + OpenFlow tables 40 through 63 execute the logical egress pipeline > from > the <code>Logical_Flow</code> table in the OVN Southbound > database. > The egress pipeline can perform a final stage of validation before > packet delivery. Eventually, it may execute an > <code>output</code> > @@ -1110,27 +1110,28 @@ > > <li> > In OVS versions 2.7 and later, the packet is cloned and resubmitted > - directly to OpenFlow flow table 16, setting the logical ingress > - port to the peer logical patch port, and using the peer logical > - patch port's logical datapath (that represents the logical router). > + directly to the first OpenFlow flow table in the ingress pipeline, > + setting the logical ingress port to the peer logical patch port, and > + using the peer logical patch port's logical datapath (that > + represents the logical router). > </li> > </ul> > > <p> > The packet re-enters the ingress pipeline in order to traverse tables > - 16 to 65 again, this time using the logical datapath representing the > + 8 to 65 again, this time using the logical datapath representing the > logical router. The processing continues as described in the previous > section <code>Architectural Physical Life Cycle of a Packet</code>. > When the packet reachs table 65, the logical egress port will once > again be a logical patch port. In the same manner as described above, > this logical patch port will cause the packet to be resubmitted to > - OpenFlow tables 16 to 65, this time using the logical datapath > + OpenFlow tables 8 to 65, this time using the logical datapath > representing the logical switch that the destination VM or container > is attached to. > </p> > > <p> > - The packet traverses tables 16 to 65 a third and final time. If the > + The packet traverses tables 8 to 65 a third and final time. If the > destination VM or container resides on a remote hypervisor, then table > 32 will send the packet on a tunnel port from the sender's hypervisor > to the remote hypervisor. Finally table 65 will output the packet > diff --git a/ovn/utilities/ovn-trace.c b/ovn/utilities/ovn-trace.c > index a9970af..149f70d 100644 > --- a/ovn/utilities/ovn-trace.c > +++ b/ovn/utilities/ovn-trace.c > @@ -826,7 +826,7 @@ read_flows(void) > .pipeline = (!strcmp(sblf->pipeline, "ingress") > ? OVNACT_P_INGRESS > : OVNACT_P_EGRESS), > - .n_tables = 16, > + .n_tables = 24, > .cur_ltable = sblf->table_id, > }; > uint64_t stub[1024 / 8]; > diff --git a/tests/ovn.at b/tests/ovn.at > index b30315e..61661c3 100644 > --- a/tests/ovn.at > +++ b/tests/ovn.at > @@ -643,41 +643,41 @@ output; > > # next > next; > - encodes as resubmit(,27) > + encodes as resubmit(,19) > next(11); > formats as next; > - encodes as resubmit(,27) > + encodes as resubmit(,19) > next(0); > - encodes as resubmit(,16) > -next(15); > + encodes as resubmit(,8) > +next(23); > encodes as resubmit(,31) > > next(); > Syntax error at `)' expecting "pipeline" or "table". > next(10; > Syntax error at `;' expecting `)'. > -next(16); > - "next" action cannot advance beyond table 15. > +next(24); > + "next" action cannot advance beyond table 23. > > next(table=11); > formats as next; > - encodes as resubmit(,27) > + encodes as resubmit(,19) > next(pipeline=ingress); > formats as next; > - encodes as resubmit(,27) > + encodes as resubmit(,19) > next(table=11, pipeline=ingress); > formats as next; > - encodes as resubmit(,27) > + encodes as resubmit(,19) > next(pipeline=ingress, table=11); > formats as next; > - encodes as resubmit(,27) > + encodes as resubmit(,19) > > next(pipeline=egress); > "next" action cannot advance from ingress to egress pipeline (use > "output" action instead) > > next(table=10); > formats as next(10); > - encodes as resubmit(,26) > + encodes as resubmit(,18) > > # Loading a constant value. > tcp.dst=80; > @@ -699,7 +699,7 @@ ip.ttl=4; > has prereqs eth.type == 0x800 || eth.type == 0x86dd > outport="eth0"; next; outport="LOCAL"; next; > formats as outport = "eth0"; next; outport = "LOCAL"; next; > - encodes as set_field:0x5->reg15,resubmit( > ,27),set_field:0xfffe->reg15,resubmit(,27) > + encodes as set_field:0x5->reg15,resubmit( > ,19),set_field:0xfffe->reg15,resubmit(,19) > > inport[1] = 1; > Cannot select subfield of string field inport. > @@ -780,11 +780,11 @@ ip.ttl > > # load balancing. > ct_lb; > - encodes as ct(table=27,zone=NXM_NX_REG13[0..15],nat) > + encodes as ct(table=19,zone=NXM_NX_REG13[0..15],nat) > has prereqs ip > ct_lb(); > formats as ct_lb; > - encodes as ct(table=27,zone=NXM_NX_REG13[0..15],nat) > + encodes as ct(table=19,zone=NXM_NX_REG13[0..15],nat) > has prereqs ip > ct_lb(192.168.1.2:80, 192.168.1.3:80); > encodes as group:1 > @@ -803,7 +803,7 @@ ct_lb(foo); > > # ct_next > ct_next; > - encodes as ct(table=27,zone=NXM_NX_REG13[0..15]) > + encodes as ct(table=19,zone=NXM_NX_REG13[0..15]) > has prereqs ip > > # ct_commit > @@ -855,10 +855,10 @@ ct_commit(ct_label=18446744073709551616); > > # ct_dnat > ct_dnat; > - encodes as ct(table=27,zone=NXM_NX_REG11[0..15],nat) > + encodes as ct(table=19,zone=NXM_NX_REG11[0..15],nat) > has prereqs ip > ct_dnat(192.168.1.2); > - encodes as ct(commit,table=27,zone=NXM_NX_REG11[0..15],nat(dst=192. > 168.1.2)) > + encodes as ct(commit,table=19,zone=NXM_NX_REG11[0..15],nat(dst=192. > 168.1.2)) > has prereqs ip > > ct_dnat(192.168.1.2, 192.168.1.3); > @@ -872,10 +872,10 @@ ct_dnat(); > > # ct_snat > ct_snat; > - encodes as ct(table=27,zone=NXM_NX_REG12[0..15],nat) > + encodes as ct(table=19,zone=NXM_NX_REG12[0..15],nat) > has prereqs ip > ct_snat(192.168.1.2); > - encodes as ct(commit,table=27,zone=NXM_NX_REG12[0..15],nat(src=192. > 168.1.2)) > + encodes as ct(commit,table=19,zone=NXM_NX_REG12[0..15],nat(src=192. > 168.1.2)) > has prereqs ip > > ct_snat(192.168.1.2, 192.168.1.3); > @@ -893,7 +893,7 @@ ct_clear; > > # clone > clone { ip4.dst = 255.255.255.255; output; }; next; > - encodes as clone(set_field:255.255.255.255->ip_dst,resubmit(,64)), > resubmit(,27) > + encodes as clone(set_field:255.255.255.255->ip_dst,resubmit(,64)), > resubmit(,19) > has prereqs eth.type == 0x800 > > # arp > diff --git a/tests/test-ovn.c b/tests/test-ovn.c > index 18860ae..32efac4 100644 > --- a/tests/test-ovn.c > +++ b/tests/test-ovn.c > @@ -1224,7 +1224,7 @@ test_parse_actions(struct ovs_cmdl_context *ctx > OVS_UNUSED) > .symtab = &symtab, > .dhcp_opts = &dhcp_opts, > .dhcpv6_opts = &dhcpv6_opts, > - .n_tables = 16, > + .n_tables = 24, > .cur_ltable = 10, > }; > error = ovnacts_parse_string(ds_cstr(&input), &pp, &ovnacts, > &prereqs); > @@ -1245,8 +1245,8 @@ test_parse_actions(struct ovs_cmdl_context *ctx > OVS_UNUSED) > .group_table = &group_table, > > .pipeline = OVNACT_P_INGRESS, > - .ingress_ptable = 16, > - .egress_ptable = 48, > + .ingress_ptable = 8, > + .egress_ptable = 40, > .output_ptable = 64, > .mac_bind_ptable = 65, > }; > -- > 1.9.1 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev