Hi Han, On 11/27/24 7:14 AM, Han Zhou wrote: > The current implementation prefers dst routes over src routes only if > they have the same prefix length. This is not very useful for real world > use cases, because it doesn't make much sense to compare the prefix > length between different fields of the IP header (dst IP v.s. src IP). > The prefix length should make sense only when comparing for the same > field, either dst or src. > > This patch changes the behavior by always prefering dst routes over src > routes, regardless of the prefix length, and comparing prefix length > only within the same type of routes.
This is a significant change in behavior and will potentially break existing deployments. In my opinion this is also not really a bug fix. The old behavior was properly documented and the implementation worked as documented. I don't think we can just change preference like that. I'm afraid that if we want to support this we need a way to opt-in through configuration. > > E.g., there are two routes: > > 10.0.0.0/8 nexthop A dst-ip > 192.168.11.0/24 nexthop B src-ip > > For a packet 192.168.11.123 -> 10.1.2.3: > > Before: nexthop will be B > > After: nexthop will be A > We already support logical router policies that can achieve the same thing. The user could just add a policy like: ip.dst == 10.0.0.0/8 action: "reroute A" I understand policies might be tricky to get right but, on the other hand, changing existing behavior (as mentioned above) seems very risky to me. I'm not sure about other CMS but ovn-kubernetes uses a mix of src-ip/dst-ip routes. In our ovn-org/ovn CI we only run a subset of the ovn-kubernetes CI jobs so there's a chance we don't cover all their use cases. Would it be possible to do a full CI test run with ovn-kubernetes master branch and an OVN version that includes your patch. I guess that would require a small adjustment to the ovn-kubernetes code to use the Dockerfile.fedora.dev file [0][1] (pointing to your ovn branch) in CI and opening a PR against their repo. Regards, Dumitru [0] https://github.com/ovn-kubernetes/ovn-kubernetes/blob/master/dist/images/Dockerfile.fedora.dev [1] https://github.com/ovn-kubernetes/ovn-kubernetes/blob/9cf5a7707ca278b96fed631a8780fbf3ff7e32bb/.github/workflows/test.yml#L212 > Reported-by: Girish Moodalbail <[email protected]> > Reported-at: > https://mail.openvswitch.org/pipermail/ovs-discuss/2020-May/050049.html > Signed-off-by: Han Zhou <[email protected]> > --- > NEWS | 2 ++ > northd/northd.c | 12 ++++++---- > ovn-nb.xml | 6 ++--- > tests/ovn-northd.at | 53 +++++++++++++++++++++++---------------------- > 4 files changed, 40 insertions(+), 33 deletions(-) > > diff --git a/NEWS b/NEWS > index da3aba739ced..74ee23b6473b 100644 > --- a/NEWS > +++ b/NEWS > @@ -4,6 +4,8 @@ Post v24.09.0 > hash (with specified hash fields) for ECMP routes > while choosing nexthop. > - ovn-ic: Add support for route tag to prevent route learning. > + - Adjusted priorities of src-ip based static routes to be lower than other > + types of routes regardless of prefix length. > > OVN v24.09.0 - 13 Sep 2024 > -------------------------- > diff --git a/northd/northd.c b/northd/northd.c > index 2aa6c0958db4..039c20bda497 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -303,9 +303,9 @@ BUILD_ASSERT_DECL(ACL_OBS_STAGE_MAX < (1 << 2)); > * same ip_prefix values: > * - connected route overrides static one; > * - static route overrides src-ip route. */ > -#define ROUTE_PRIO_OFFSET_MULTIPLIER 5 > -#define ROUTE_PRIO_OFFSET_STATIC 2 > -#define ROUTE_PRIO_OFFSET_CONNECTED 4 > +#define ROUTE_PRIO_OFFSET_MULTIPLIER 3 > +#define ROUTE_PRIO_OFFSET_STATIC 0 > +#define ROUTE_PRIO_OFFSET_CONNECTED 2 > > /* Returns the type of the datapath to which a flow with the given 'stage' > may > * be added. */ > @@ -11443,6 +11443,7 @@ build_route_match(const struct ovn_port *op_inport, > uint32_t rtb_id, > bool has_protocol_match) > { > const char *dir; > + int base = 0; > /* The priority here is calculated to implement longest-prefix-match > * routing. */ > if (is_src_route) { > @@ -11450,6 +11451,9 @@ build_route_match(const struct ovn_port *op_inport, > uint32_t rtb_id, > ofs = 0; > } else { > dir = "dst"; > + /* dst routes have higher priority than all src routes regardless of > + * prefix length. */ > + base = (128 + 1) * ROUTE_PRIO_OFFSET_MULTIPLIER; > } > > if (op_inport) { > @@ -11462,7 +11466,7 @@ build_route_match(const struct ovn_port *op_inport, > uint32_t rtb_id, > if (has_protocol_match) { > ofs += 1; > } > - *priority = (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + ofs; > + *priority = base + (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + ofs; > > ds_put_format(match, "ip%s.%s == %s/%d", is_ipv4 ? "4" : "6", dir, > network_s, plen); > diff --git a/ovn-nb.xml b/ovn-nb.xml > index 5114bbc2eb9b..ad774cd4ba72 100644 > --- a/ovn-nb.xml > +++ b/ovn-nb.xml > @@ -3782,9 +3782,9 @@ or > </p> > > <p> > - When multiple routes match a packet, the longest-prefix match is > chosen. > - For a given prefix length, a <code>dst-ip</code> route is preferred > over > - a <code>src-ip</code> route. > + When multiple routes match a packet, a <code>dst-ip</code> route is > + preferred over a <code>src-ip</code> route. Among the same type of > + routes, the longest-prefix match is chosen. > </p> > > <p> > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at > index e3b7b0cb5f49..73905adccdd0 100644 > --- a/tests/ovn-northd.at > +++ b/tests/ovn-northd.at > @@ -6823,9 +6823,9 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | > ovn_strip_lflows], [0], [dnl > table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;) > table=??(lr_in_ip_routing ), priority=10300, > match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32), > action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg1 = > 192.168.0.1; outport = "lr0-public"; next;) > table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), > action=(drop;) > - table=??(lr_in_ip_routing ), priority=124 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=162 , match=(reg7 == 0 && ip4.dst > == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = 1; next;) > - table=??(lr_in_ip_routing ), priority=324 , match=(inport == > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=461 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=483 , match=(reg7 == 0 && ip4.dst > == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = 1; next;) > + table=??(lr_in_ip_routing ), priority=581 , match=(inport == > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;) > ]) > > AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | ovn_strip_lflows], [0], > [dnl > @@ -6841,9 +6841,9 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | > ovn_strip_lflows], [0], [dnl > table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;) > table=??(lr_in_ip_routing ), priority=10300, > match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32), > action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg1 = > 192.168.0.1; outport = "lr0-public"; next;) > table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), > action=(drop;) > - table=??(lr_in_ip_routing ), priority=124 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=162 , match=(reg7 == 0 && ip4.dst > == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(1, 2);) > - table=??(lr_in_ip_routing ), priority=324 , match=(inport == > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=461 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=483 , match=(reg7 == 0 && ip4.dst > == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(1, 2);) > + table=??(lr_in_ip_routing ), priority=581 , match=(inport == > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;) > ]) > AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed > 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl > table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;) > @@ -6870,9 +6870,9 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | > ovn_strip_lflows], [0], [dnl > table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;) > table=??(lr_in_ip_routing ), priority=10300, > match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32), > action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg1 = > 192.168.0.1; outport = "lr0-public"; next;) > table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), > action=(drop;) > - table=??(lr_in_ip_routing ), priority=124 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=162 , match=(reg7 == 0 && ip4.dst > == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(1, 2);) > - table=??(lr_in_ip_routing ), priority=324 , match=(inport == > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=461 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=483 , match=(reg7 == 0 && ip4.dst > == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(1, 2);) > + table=??(lr_in_ip_routing ), priority=581 , match=(inport == > "lr0-public" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; > xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = > 00:00:20:20:12:13; outport = "lr0-public"; flags.loopback = 1; next;) > ]) > AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed > 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl > table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;) > @@ -6888,14 +6888,14 @@ check ovn-nbctl --wait=sb lr-route-add lr0 1.0.0.0/24 > 192.168.0.10 > ovn-sbctl dump-flows lr0 > lr0flows > > AT_CHECK([grep -e "lr_in_ip_routing.*192.168.0.10" lr0flows | > ovn_strip_lflows], [0], [dnl > - table=??(lr_in_ip_routing ), priority=122 , match=(reg7 == 0 && ip4.dst > == 1.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; > reg1 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=459 , match=(reg7 == 0 && ip4.dst > == 1.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; > reg1 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > ]) > > check ovn-nbctl --wait=sb lr-route-add lr0 2.0.0.0/24 lr0-public > > ovn-sbctl dump-flows lr0 > lr0flows > AT_CHECK([grep -e "lr_in_ip_routing.*2.0.0.0" lr0flows | ovn_strip_lflows], > [0], [dnl > - table=??(lr_in_ip_routing ), priority=122 , match=(reg7 == 0 && ip4.dst > == 2.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=459 , match=(reg7 == 0 && ip4.dst > == 2.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = "lr0-public"; > flags.loopback = 1; next;) > ]) > > check ovn-nbctl lr-route-add lr0 3.3.0.0/16 192.168.0.11 > @@ -6910,7 +6910,7 @@ check ovn-nbctl set logical_router_static_route > $route2_uuid selection_fields="i > check ovn-nbctl --wait=sb sync > ovn-sbctl dump-flows lr0 > lr0flows > AT_CHECK([grep -e "(lr_in_ip_routing ).*3.3.0.0" lr0flows | sed > 's/table=../table=??/' | sort], [0], [dnl > - table=??(lr_in_ip_routing ), priority=82 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(values=(1, 2); hash_fields="ip_dst,ip_proto,ip_src");) > + table=??(lr_in_ip_routing ), priority=435 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(values=(1, 2); hash_fields="ip_dst,ip_proto,ip_src");) > ]) > > check ovn-nbctl set logical_router_static_route $route1_uuid > selection_fields="ip_src,ip_dst,tp_src,tp_dst" > @@ -6919,10 +6919,10 @@ check ovn-nbctl set logical_router_static_route > $route2_uuid selection_fields="i > check ovn-nbctl --wait=sb sync > ovn-sbctl dump-flows lr0 > lr0flows > AT_CHECK([grep -e "(lr_in_ip_routing ).*3.3.0.0" lr0flows | sed > 's/table=../table=??/' | sort], [0], [dnl > - table=??(lr_in_ip_routing ), priority=82 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(values=(1, 2); hash_fields="ip_dst,ip_proto,ip_src");) > - table=??(lr_in_ip_routing ), priority=83 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16 && sctp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = > 1; reg8[[16..31]] = select(values=(1, 2); > hash_fields="ip_dst,ip_proto,ip_src,sctp_dst,sctp_src");) > - table=??(lr_in_ip_routing ), priority=83 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16 && tcp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = > 1; reg8[[16..31]] = select(values=(1, 2); > hash_fields="ip_dst,ip_proto,ip_src,tcp_dst,tcp_src");) > - table=??(lr_in_ip_routing ), priority=83 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16 && udp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = > 1; reg8[[16..31]] = select(values=(1, 2); > hash_fields="ip_dst,ip_proto,ip_src,udp_dst,udp_src");) > + table=??(lr_in_ip_routing ), priority=435 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; > reg8[[16..31]] = select(values=(1, 2); hash_fields="ip_dst,ip_proto,ip_src");) > + table=??(lr_in_ip_routing ), priority=436 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16 && sctp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = > 1; reg8[[16..31]] = select(values=(1, 2); > hash_fields="ip_dst,ip_proto,ip_src,sctp_dst,sctp_src");) > + table=??(lr_in_ip_routing ), priority=436 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16 && tcp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = > 1; reg8[[16..31]] = select(values=(1, 2); > hash_fields="ip_dst,ip_proto,ip_src,tcp_dst,tcp_src");) > + table=??(lr_in_ip_routing ), priority=436 , match=(reg7 == 0 && ip4.dst > == 3.3.0.0/16 && udp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = > 1; reg8[[16..31]] = select(values=(1, 2); > hash_fields="ip_dst,ip_proto,ip_src,udp_dst,udp_src");) > ]) > > AT_CLEANUP > @@ -7346,18 +7346,19 @@ AT_CHECK([grep "lr_in_ip_routing_pre" lr0flows | > ovn_strip_lflows], [0], [dnl > grep -e "(lr_in_ip_routing ).*outport" lr0flows > > AT_CHECK([grep -e "(lr_in_ip_routing ).*outport" lr0flows | > ovn_strip_lflows], [0], [dnl > - table=??(lr_in_ip_routing ), priority=122 , match=(reg7 == 1 && ip4.dst > == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.1.10; > reg1 = 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = "lrp1"; > flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=124 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; flags.loopback = > 1; next;) > - table=??(lr_in_ip_routing ), priority=124 , match=(ip4.dst == > 192.168.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = "lrp1"; flags.loopback = > 1; next;) > - table=??(lr_in_ip_routing ), priority=124 , match=(ip4.dst == > 192.168.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.2.1; eth.src = 00:00:00:00:02:01; outport = "lrp2"; flags.loopback = > 1; next;) > - table=??(lr_in_ip_routing ), priority=162 , match=(reg7 == 2 && ip4.dst > == 1.1.1.1/32), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.20; > reg1 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; > flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=2 , match=(reg7 == 0 && ip4.dst > == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg1 > = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; flags.loopback > = 1; next;) > - table=??(lr_in_ip_routing ), priority=2 , match=(reg7 == 2 && ip4.dst > == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg1 > = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; flags.loopback > = 1; next;) > - table=??(lr_in_ip_routing ), priority=324 , match=(inport == "lrp0" && > ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; > xxreg1 = fe80::200:ff:fe00:1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; > flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=324 , match=(inport == "lrp1" && > ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; > xxreg1 = fe80::200:ff:fe00:101; eth.src = 00:00:00:00:01:01; outport = > "lrp1"; flags.loopback = 1; next;) > - table=??(lr_in_ip_routing ), priority=324 , match=(inport == "lrp2" && > ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; > xxreg1 = fe80::200:ff:fe00:201; eth.src = 00:00:00:00:02:01; outport = > "lrp2"; flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=387 , match=(reg7 == 0 && ip4.dst > == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg1 > = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; flags.loopback > = 1; next;) > + table=??(lr_in_ip_routing ), priority=387 , match=(reg7 == 2 && ip4.dst > == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg1 > = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; flags.loopback > = 1; next;) > + table=??(lr_in_ip_routing ), priority=459 , match=(reg7 == 1 && ip4.dst > == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.1.10; > reg1 = 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = "lrp1"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=461 , match=(ip4.dst == > 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; flags.loopback = > 1; next;) > + table=??(lr_in_ip_routing ), priority=461 , match=(ip4.dst == > 192.168.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = "lrp1"; flags.loopback = > 1; next;) > + table=??(lr_in_ip_routing ), priority=461 , match=(ip4.dst == > 192.168.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg1 = > 192.168.2.1; eth.src = 00:00:00:00:02:01; outport = "lrp2"; flags.loopback = > 1; next;) > + table=??(lr_in_ip_routing ), priority=483 , match=(reg7 == 2 && ip4.dst > == 1.1.1.1/32), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.20; > reg1 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=581 , match=(inport == "lrp0" && > ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; > xxreg1 = fe80::200:ff:fe00:1; eth.src = 00:00:00:00:00:01; outport = "lrp0"; > flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=581 , match=(inport == "lrp1" && > ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; > xxreg1 = fe80::200:ff:fe00:101; eth.src = 00:00:00:00:01:01; outport = > "lrp1"; flags.loopback = 1; next;) > + table=??(lr_in_ip_routing ), priority=581 , match=(inport == "lrp2" && > ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; > xxreg1 = fe80::200:ff:fe00:201; eth.src = 00:00:00:00:02:01; outport = > "lrp2"; flags.loopback = 1; next;) > ]) > > + > AT_CLEANUP > ]) > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
