IPv6 addresses use four standard OVS registers, so move the existing named registers back to make room for using more logical registers.
Signed-off-by: Justin Pettit <jpet...@ovn.org> --- ovn/lib/logical-fields.h | 19 +++++++++----- ovn/ovn-architecture.7.xml | 15 +++++++---- ovn/ovn-sb.xml | 4 +-- tests/ovn.at | 64 +++++++++++++++++++++++----------------------- tests/test-ovn.c | 4 +-- 5 files changed, 59 insertions(+), 47 deletions(-) diff --git a/ovn/lib/logical-fields.h b/ovn/lib/logical-fields.h index f0f97a9..24c15c7 100644 --- a/ovn/lib/logical-fields.h +++ b/ovn/lib/logical-fields.h @@ -23,14 +23,14 @@ * These values are documented in ovn-architecture(7), please update the * documentation if you change any of them. */ #define MFF_LOG_DATAPATH MFF_METADATA /* Logical datapath (64 bits). */ -#define MFF_LOG_DNAT_ZONE MFF_REG3 /* conntrack dnat zone for gateway router +#define MFF_LOG_DNAT_ZONE MFF_REG11 /* conntrack dnat zone for gateway router * (32 bits). */ -#define MFF_LOG_SNAT_ZONE MFF_REG4 /* conntrack snat zone for gateway router +#define MFF_LOG_SNAT_ZONE MFF_REG12 /* conntrack snat zone for gateway router * (32 bits). */ -#define MFF_LOG_CT_ZONE MFF_REG5 /* Logical conntrack zone for lports +#define MFF_LOG_CT_ZONE MFF_REG13 /* Logical conntrack zone for lports * (32 bits). */ -#define MFF_LOG_INPORT MFF_REG6 /* Logical input port (32 bits). */ -#define MFF_LOG_OUTPORT MFF_REG7 /* Logical output port (32 bits). */ +#define MFF_LOG_INPORT MFF_REG14 /* Logical input port (32 bits). */ +#define MFF_LOG_OUTPORT MFF_REG15 /* Logical output port (32 bits). */ /* Logical registers. * @@ -38,6 +38,13 @@ #define MFF_LOG_REGS \ MFF_LOG_REG(MFF_REG0) \ MFF_LOG_REG(MFF_REG1) \ - MFF_LOG_REG(MFF_REG2) + MFF_LOG_REG(MFF_REG2) \ + MFF_LOG_REG(MFF_REG3) \ + MFF_LOG_REG(MFF_REG4) \ + MFF_LOG_REG(MFF_REG5) \ + MFF_LOG_REG(MFF_REG6) \ + MFF_LOG_REG(MFF_REG7) \ + MFF_LOG_REG(MFF_REG8) \ + MFF_LOG_REG(MFF_REG9) #endif /* ovn/lib/logical-fields.h */ diff --git a/ovn/ovn-architecture.7.xml b/ovn/ovn-architecture.7.xml index 72786bc..ead4feb 100644 --- a/ovn/ovn-architecture.7.xml +++ b/ovn/ovn-architecture.7.xml @@ -641,7 +641,7 @@ entered the logical datapath. <!-- Keep the following in sync with MFF_LOG_INPORT in ovn/lib/logical-fields.h. --> - OVN stores this in Nicira extension register number 6. + OVN stores this in Nicira extension register number 14. </p> <p> @@ -662,7 +662,7 @@ beginning of the logical ingress pipeline. <!-- Keep the following in sync with MFF_LOG_OUTPORT in ovn/lib/logical-fields.h. --> - OVN stores this in Nicira extension register number 7. + OVN stores this in Nicira extension register number 15. </p> <p> @@ -676,7 +676,10 @@ A field that denotes the connection tracking zone for logical ports. The value only has local significance and is not meaningful between chassis. This is initialized to 0 at the beginning of the logical - ingress pipeline. OVN stores this in Nicira extension register number 5. + <!-- Keep the following in sync with MFF_LOG_CT_ZONE in + ovn/lib/logical-fields.h. --> + ingress pipeline. OVN stores this in Nicira extension register + number 13. </dd> <dt>conntrack zone fields for Gateway router</dt> @@ -685,8 +688,10 @@ These values only have local significance (only on chassis that have Gateway routers instantiated) and is not meaningful between chassis. OVN stores the zone information for DNATting in Nicira - extension register number 3 and zone information for SNATing in Nicira - extension register number 4. + <!-- Keep the following in sync with MFF_LOG_DNAT_ZONE and + MFF_LOG_SNAT_ZONE in ovn/lib/logical-fields.h. --> + extension register number 11 and zone information for SNATing in Nicira + extension register number 12. </dd> <dt>VLAN ID</dt> diff --git a/ovn/ovn-sb.xml b/ovn/ovn-sb.xml index 9628256..00a92e0 100644 --- a/ovn/ovn-sb.xml +++ b/ovn/ovn-sb.xml @@ -344,7 +344,7 @@ the <code>output</code> as a no-op. In the common case, where they are different, the packet enters the egress pipeline. This transition to the egress pipeline discards register data, e.g. <code>reg0</code> ... - <code>reg4</code> and connection tracking state, to achieve + <code>reg9</code> and connection tracking state, to achieve uniform behavior regardless of whether the egress pipeline is on a different hypervisor (because registers aren't preserve across tunnel encapsulation). @@ -739,7 +739,7 @@ </p> <ul> - <li><code>reg0</code>...<code>reg4</code></li> + <li><code>reg0</code>...<code>reg9</code></li> <li><code>inport</code> <code>outport</code></li> <li><code>eth.src</code> <code>eth.dst</code> <code>eth.type</code></li> <li><code>vlan.tci</code> <code>vlan.vid</code> <code>vlan.pcp</code> <code>vlan.present</code></li> diff --git a/tests/ovn.at b/tests/ovn.at index 16262cd..63d68e9 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -411,32 +411,32 @@ AT_SETUP([ovn -- converting expressions to flows -- string fields]) expr_to_flow () { echo "$1" | ovstest test-ovn expr-to-flows | sort } -AT_CHECK([expr_to_flow 'inport == "eth0"'], [0], [reg6=0x5 +AT_CHECK([expr_to_flow 'inport == "eth0"'], [0], [reg14=0x5 ]) -AT_CHECK([expr_to_flow 'inport == "eth1"'], [0], [reg6=0x6 +AT_CHECK([expr_to_flow 'inport == "eth1"'], [0], [reg14=0x6 ]) AT_CHECK([expr_to_flow 'inport == "eth2"'], [0], [(no flows) ]) AT_CHECK([expr_to_flow 'inport == "eth0" && ip'], [0], [dnl -ip,reg6=0x5 -ipv6,reg6=0x5 +ip,reg14=0x5 +ipv6,reg14=0x5 ]) AT_CHECK([expr_to_flow 'inport == "eth1" && ip'], [0], [dnl -ip,reg6=0x6 -ipv6,reg6=0x6 +ip,reg14=0x6 +ipv6,reg14=0x6 ]) AT_CHECK([expr_to_flow 'inport == "eth2" && ip'], [0], [(no flows) ]) AT_CHECK([expr_to_flow 'inport == {"eth0", "eth1", "eth2", "LOCAL"}'], [0], -[reg6=0x5 -reg6=0x6 -reg6=0xfffe +[reg14=0x5 +reg14=0x6 +reg14=0xfffe ]) AT_CHECK([expr_to_flow 'inport == {"eth0", "eth1", "eth2"} && ip'], [0], [dnl -ip,reg6=0x5 -ip,reg6=0x6 -ipv6,reg6=0x5 -ipv6,reg6=0x6 +ip,reg14=0x5 +ip,reg14=0x6 +ipv6,reg14=0x5 +ipv6,reg14=0x6 ]) AT_CHECK([expr_to_flow 'inport == "eth0" && inport == "eth1"'], [0], [dnl (no flows) @@ -524,9 +524,9 @@ tcp.dst=80; => actions=set_field:80->tcp_dst, prereqs=ip.proto == 0x6 && (eth.ty eth.dst[40] = 1; => actions=set_field:01:00:00:00:00:00/01:00:00:00:00:00->eth_dst, prereqs=1 vlan.pcp = 2; => actions=set_field:0x4000/0xe000->vlan_tci, prereqs=vlan.tci[12] vlan.tci[13..15] = 2; => actions=set_field:0x4000/0xe000->vlan_tci, prereqs=1 -inport = ""; => actions=set_field:0->reg6,set_field:0->in_port, prereqs=1 +inport = ""; => actions=set_field:0->reg14,set_field:0->in_port, prereqs=1 ip.ttl = 4; => actions=set_field:4->nw_ttl, prereqs=eth.type == 0x800 || eth.type == 0x86dd -outport="eth0"; next; outport="LOCAL"; next; => actions=set_field:0x5->reg7,resubmit(,27),set_field:0xfffe->reg7,resubmit(,27), prereqs=1 +outport="eth0"; next; outport="LOCAL"; next; => actions=set_field:0x5->reg15,resubmit(,27),set_field:0xfffe->reg15,resubmit(,27), prereqs=1 inport[1] = 1; => Cannot select subfield of string field inport. ip.proto[1] = 1; => Cannot select subfield of nominal field ip.proto. @@ -543,7 +543,7 @@ vlan.present = 0; => Predicate symbol vlan.present used where lvalue required. reg0 = reg1; => actions=move:OXM_OF_PKT_REG0[0..31]->OXM_OF_PKT_REG0[32..63], prereqs=1 vlan.pcp = reg0[0..2]; => actions=move:OXM_OF_PKT_REG0[32..34]->NXM_OF_VLAN_TCI[13..15], prereqs=vlan.tci[12] reg0[10] = vlan.pcp[1]; => actions=move:NXM_OF_VLAN_TCI[14]->OXM_OF_PKT_REG0[42], prereqs=vlan.tci[12] -outport = inport; => actions=move:NXM_NX_REG6[]->NXM_NX_REG7[], prereqs=1 +outport = inport; => actions=move:NXM_NX_REG14[]->NXM_NX_REG15[], prereqs=1 reg0[0] = vlan.present; => Predicate symbol vlan.present used where lvalue required. reg0 = reg1[0..10]; => Can't assign 11-bit value to 32-bit destination. @@ -555,7 +555,7 @@ ip.proto = reg0[0..7]; => Field ip.proto is not modifiable. reg0 <-> reg1; => actions=push:OXM_OF_PKT_REG0[0..31],push:OXM_OF_PKT_REG0[32..63],pop:OXM_OF_PKT_REG0[0..31],pop:OXM_OF_PKT_REG0[32..63], prereqs=1 vlan.pcp <-> reg0[0..2]; => actions=push:OXM_OF_PKT_REG0[32..34],push:NXM_OF_VLAN_TCI[13..15],pop:OXM_OF_PKT_REG0[32..34],pop:NXM_OF_VLAN_TCI[13..15], prereqs=vlan.tci[12] reg0[10] <-> vlan.pcp[1]; => actions=push:NXM_OF_VLAN_TCI[14],push:OXM_OF_PKT_REG0[42],pop:NXM_OF_VLAN_TCI[14],pop:OXM_OF_PKT_REG0[42], prereqs=vlan.tci[12] -outport <-> inport; => actions=push:NXM_NX_REG6[],push:NXM_NX_REG7[],pop:NXM_NX_REG6[],pop:NXM_NX_REG7[], prereqs=1 +outport <-> inport; => actions=push:NXM_NX_REG14[],push:NXM_NX_REG15[],pop:NXM_NX_REG14[],pop:NXM_NX_REG15[], prereqs=1 reg0[0] <-> vlan.present; => Predicate symbol vlan.present used where lvalue required. reg0 <-> reg1[0..10]; => Can't exchange 32-bit field with 11-bit field. @@ -569,7 +569,7 @@ ip.ttl--; => actions=dec_ttl, prereqs=ip ip.ttl => Syntax error at end of input expecting `--'. # load balancing. -ct_lb; => actions=ct(table=27,zone=NXM_NX_REG5[0..15],nat), prereqs=ip +ct_lb; => actions=ct(table=27,zone=NXM_NX_REG13[0..15],nat), prereqs=ip ct_lb(); => Syntax error at `)' expecting IPv4 address. ct_lb(192.168.1.2:80, 192.168.1.3:80); => actions=group:1, prereqs=ip ct_lb(192.168.1.2, 192.168.1.3, ); => actions=group:2, prereqs=ip @@ -578,26 +578,26 @@ ct_lb(192.168.1.2:123456); => Syntax error at `123456' expecting port number. ct_lb(foo); => Syntax error at `foo' expecting IPv4 address. # conntrack -ct_next; => actions=ct(table=27,zone=NXM_NX_REG5[0..15]), prereqs=ip -ct_commit; => actions=ct(commit,zone=NXM_NX_REG5[0..15]), prereqs=ip -ct_commit(); => actions=ct(commit,zone=NXM_NX_REG5[0..15]), prereqs=ip -ct_commit(ct_mark=1); => actions=ct(commit,zone=NXM_NX_REG5[0..15],exec(set_field:0x1->ct_mark)), prereqs=ip -ct_commit(ct_mark=1/1); => actions=ct(commit,zone=NXM_NX_REG5[0..15],exec(set_field:0x1/0x1->ct_mark)), prereqs=ip -ct_commit(ct_label=1); => actions=ct(commit,zone=NXM_NX_REG5[0..15],exec(set_field:0x1->ct_label)), prereqs=ip -ct_commit(ct_label=1/1); => actions=ct(commit,zone=NXM_NX_REG5[0..15],exec(set_field:0x1/0x1->ct_label)), prereqs=ip -ct_commit(ct_mark=1, ct_label=2); => actions=ct(commit,zone=NXM_NX_REG5[0..15],exec(set_field:0x1->ct_mark,set_field:0x2->ct_label)), prereqs=ip +ct_next; => actions=ct(table=27,zone=NXM_NX_REG13[0..15]), prereqs=ip +ct_commit; => actions=ct(commit,zone=NXM_NX_REG13[0..15]), prereqs=ip +ct_commit(); => actions=ct(commit,zone=NXM_NX_REG13[0..15]), prereqs=ip +ct_commit(ct_mark=1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1->ct_mark)), prereqs=ip +ct_commit(ct_mark=1/1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1/0x1->ct_mark)), prereqs=ip +ct_commit(ct_label=1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1->ct_label)), prereqs=ip +ct_commit(ct_label=1/1); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1/0x1->ct_label)), prereqs=ip +ct_commit(ct_mark=1, ct_label=2); => actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(set_field:0x1->ct_mark,set_field:0x2->ct_label)), prereqs=ip # dnat -ct_dnat; => actions=ct(table=27,zone=NXM_NX_REG3[0..15],nat), prereqs=ip -ct_dnat(192.168.1.2); => actions=ct(commit,table=27,zone=NXM_NX_REG3[0..15],nat(dst=192.168.1.2)), prereqs=ip +ct_dnat; => actions=ct(table=27,zone=NXM_NX_REG11[0..15],nat), prereqs=ip +ct_dnat(192.168.1.2); => actions=ct(commit,table=27,zone=NXM_NX_REG11[0..15],nat(dst=192.168.1.2)), prereqs=ip ct_dnat(192.168.1.2, 192.168.1.3); => Syntax error at `,' expecting `)'. ct_dnat(foo); => Syntax error at `foo' invalid ip. ct_dnat(foo, bar); => Syntax error at `foo' invalid ip. ct_dnat(); => Syntax error at `)' invalid ip. # snat -ct_snat; => actions=ct(zone=NXM_NX_REG4[0..15],nat), prereqs=ip -ct_snat(192.168.1.2); => actions=ct(commit,table=27,zone=NXM_NX_REG4[0..15],nat(src=192.168.1.2)), prereqs=ip +ct_snat; => actions=ct(zone=NXM_NX_REG12[0..15],nat), prereqs=ip +ct_snat(192.168.1.2); => actions=ct(commit,table=27,zone=NXM_NX_REG12[0..15],nat(src=192.168.1.2)), prereqs=ip ct_snat(192.168.1.2, 192.168.1.3); => Syntax error at `,' expecting `)'. ct_snat(foo); => Syntax error at `foo' invalid ip. ct_snat(foo, bar); => Syntax error at `foo' invalid ip. @@ -609,7 +609,7 @@ arp { eth.dst = ff:ff:ff:ff:ff:ff; output; }; => actions=controller(userdata=00. # get_arp get_arp(outport, ip4.dst); => actions=push:NXM_NX_REG0[],push:NXM_OF_IP_DST[],pop:NXM_NX_REG0[],set_field:00:00:00:00:00:00->eth_dst,resubmit(,65),pop:NXM_NX_REG0[], prereqs=eth.type == 0x800 -get_arp(inport, reg0); => actions=push:NXM_NX_REG7[],push:NXM_NX_REG0[],push:OXM_OF_PKT_REG0[32..63],push:NXM_NX_REG6[],pop:NXM_NX_REG7[],pop:NXM_NX_REG0[],set_field:00:00:00:00:00:00->eth_dst,resubmit(,65),pop:NXM_NX_REG0[],pop:NXM_NX_REG7[], prereqs=1 +get_arp(inport, reg0); => actions=push:NXM_NX_REG15[],push:NXM_NX_REG0[],push:OXM_OF_PKT_REG0[32..63],push:NXM_NX_REG14[],pop:NXM_NX_REG15[],pop:NXM_NX_REG0[],set_field:00:00:00:00:00:00->eth_dst,resubmit(,65),pop:NXM_NX_REG0[],pop:NXM_NX_REG15[], prereqs=1 get_arp; => Syntax error at `;' expecting `('. get_arp(); => Syntax error at `)' expecting field name. get_arp(inport); => Syntax error at `)' expecting `,'. @@ -648,7 +648,7 @@ reg1[0] = put_dhcp_opts(offerip="xyzzy"); => DHCP option offerip requires numeri reg1[0] = put_dhcp_opts(offerip=1.2.3.4, domain=1.2.3.4); => DHCP option domain requires string value. # na -na { eth.src = 12:34:56:78:9a:bc; nd.tll = 12:34:56:78:9a:bc; outport = inport; inport = ""; /* Allow sending out inport. */ output; }; => actions=controller(userdata=00.00.00.03.00.00.00.00.00.19.00.10.80.00.08.06.12.34.56.78.9a.bc.00.00.00.19.00.10.80.00.42.06.12.34.56.78.9a.bc.00.00.ff.ff.00.18.00.00.23.20.00.06.00.20.00.00.00.00.00.01.0c.04.00.01.0e.04.00.19.00.10.00.01.0c.04.00.00.00.00.00.00.00.00.00.19.00.10.00.00.00.02.00.00.00.00.00.00.00.00.ff.ff.00.10.00.00.23.20.00.0e.ff.f8.40.00.00.00), prereqs=nd +na { eth.src = 12:34:56:78:9a:bc; nd.tll = 12:34:56:78:9a:bc; outport = inport; inport = ""; /* Allow sending out inport. */ output; }; => actions=controller(userdata=00.00.00.03.00.00.00.00.00.19.00.10.80.00.08.06.12.34.56.78.9a.bc.00.00.00.19.00.10.80.00.42.06.12.34.56.78.9a.bc.00.00.ff.ff.00.18.00.00.23.20.00.06.00.20.00.00.00.00.00.01.1c.04.00.01.1e.04.00.19.00.10.00.01.1c.04.00.00.00.00.00.00.00.00.00.19.00.10.00.00.00.02.00.00.00.00.00.00.00.00.ff.ff.00.10.00.00.23.20.00.0e.ff.f8.40.00.00.00), prereqs=nd # Contradictionary prerequisites (allowed but not useful): ip4.src = ip6.src[0..31]; => actions=move:NXM_NX_IPV6_SRC[0..31]->NXM_OF_IP_SRC[], prereqs=eth.type == 0x800 && eth.type == 0x86dd diff --git a/tests/test-ovn.c b/tests/test-ovn.c index 1291d04..a3357a3 100644 --- a/tests/test-ovn.c +++ b/tests/test-ovn.c @@ -143,8 +143,8 @@ create_symtab(struct shash *symtab) /* Reserve a pair of registers for the logical inport and outport. A full * 32-bit register each is bigger than we need, but the expression code * doesn't yet support string fields that occupy less than a full OXM. */ - expr_symtab_add_string(symtab, "inport", MFF_REG6, NULL); - expr_symtab_add_string(symtab, "outport", MFF_REG7, NULL); + expr_symtab_add_string(symtab, "inport", MFF_REG14, NULL); + expr_symtab_add_string(symtab, "outport", MFF_REG15, NULL); expr_symtab_add_field(symtab, "xreg0", MFF_XREG0, NULL, false); expr_symtab_add_field(symtab, "xreg1", MFF_XREG1, NULL, false); -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev