Skip to content

Commit

Permalink
ofproto-dpif-xlate: Update tunnel neighbor when receive gratuitous ARP.
Browse files Browse the repository at this point in the history
OVS now just allow the ARP Reply which the destination address is matched
against the known xbridge addresses to update tunnel neighbor. So when OVS
receive the gratuitous ARP from underlay gateway which the source address
and destination address are all gateway IP, tunnel neighbor will not be updated.

Fixes: ba07cf2 ("Handle gratuitous ARP requests and replies in tnl_arp_snoop()")
Fixes: 83c2757 ("xlate: Move tnl_neigh_snoop() to terminate_native_tunnel()")
Acked-by: Paolo Valerio <[email protected]>
Signed-off-by: Han Ding <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
Han Ding authored and igsilya committed Nov 2, 2022
1 parent 2158254 commit a1de888
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
14 changes: 11 additions & 3 deletions ofproto/ofproto-dpif-xlate.c
Original file line number Diff line number Diff line change
Expand Up @@ -4178,6 +4178,16 @@ xport_has_ip(const struct xport *xport)
return n_in6 ? true : false;
}

static bool check_neighbor_reply(struct xlate_ctx *ctx, struct flow *flow)
{
if (flow->dl_type == htons(ETH_TYPE_ARP) ||
flow->nw_proto == IPPROTO_ICMPV6) {
return is_neighbor_reply_correct(ctx, flow);
}

return false;
}

static bool
terminate_native_tunnel(struct xlate_ctx *ctx, const struct xport *xport,
struct flow *flow, struct flow_wildcards *wc,
Expand All @@ -4198,9 +4208,7 @@ terminate_native_tunnel(struct xlate_ctx *ctx, const struct xport *xport,
/* If no tunnel port was found and it's about an ARP or ICMPv6 packet,
* do tunnel neighbor snooping. */
if (*tnl_port == ODPP_NONE &&
(flow->dl_type == htons(ETH_TYPE_ARP) ||
flow->nw_proto == IPPROTO_ICMPV6) &&
is_neighbor_reply_correct(ctx, flow)) {
(check_neighbor_reply(ctx, flow) || is_garp(flow, wc))) {
tnl_neigh_snoop(flow, wc, ctx->xbridge->name,
ctx->xin->allow_side_effects);
} else if (*tnl_port != ODPP_NONE &&
Expand Down
20 changes: 20 additions & 0 deletions tests/tunnel-push-pop.at
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,26 @@ AT_CHECK([ovs-appctl tnl/neigh/show | grep br | sort], [0], [dnl
1.1.2.92 f8:bc:12:44:34:b6 br0
])

dnl Receiving Gratuitous ARP request with correct VLAN id should alter tunnel neighbor cache
AT_CHECK([ovs-appctl netdev-dummy/receive p0 'recirc_id(0),in_port(1),eth(src=f8:bc:12:44:34:c8,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=10,pcp=7),encap(eth_type(0x0806),arp(sip=1.1.2.92,tip=1.1.2.92,op=1,sha=f8:bc:12:44:34:c8,tha=00:00:00:00:00:00))'])

ovs-appctl time/warp 1000
ovs-appctl time/warp 1000

AT_CHECK([ovs-appctl tnl/neigh/show | grep br | sort], [0], [dnl
1.1.2.92 f8:bc:12:44:34:c8 br0
])

dnl Receiving Gratuitous ARP reply with correct VLAN id should alter tunnel neighbor cache
AT_CHECK([ovs-appctl netdev-dummy/receive p0 'recirc_id(0),in_port(1),eth(src=f8:bc:12:44:34:b2,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=10,pcp=7),encap(eth_type(0x0806),arp(sip=1.1.2.92,tip=1.1.2.92,op=2,sha=f8:bc:12:44:34:b2,tha=f8:bc:12:44:34:b2))'])

ovs-appctl time/warp 1000
ovs-appctl time/warp 1000

AT_CHECK([ovs-appctl tnl/neigh/show | grep br | sort], [0], [dnl
1.1.2.92 f8:bc:12:44:34:b2 br0
])

dnl Receive ARP reply without VLAN header
AT_CHECK([ovs-vsctl set port br0 tag=0])
AT_CHECK([ovs-appctl tnl/neigh/flush], [0], [OK
Expand Down

0 comments on commit a1de888

Please sign in to comment.