mirror of
https://github.com/openvswitch/ovs
synced 2025-08-30 22:05:19 +00:00
In case of native tunnel with bfd enabled, if the MAC address of the remote end's interface changes (e.g. because it got rebooted, and the MAC address is allocated dynamically), the BFD session will never be re-established. This happens because the local tunnel neigh entry doesn't get updated, and the local end keeps sending BFD packets with the old destination MAC address. This was not an issue untilb23ddcc57d
("tnl-neigh-cache: tighten arp and nd snooping.") because ARP requests were snooped as well avoiding the problem. Fix this by snooping the incoming packets in the slow path, and updating the neigh cache accordingly. Fixes:b23ddcc57d
("tnl-neigh-cache: tighten arp and nd snooping.") Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2002430 Signed-off-by: Paolo Valerio <pvalerio@redhat.com> Acked-by: Gaetan Rivet <grive@u256.net> Acked-by: Flavio Leitner <fbl@sysclose.org> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
45 lines
1.4 KiB
C
45 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2014 Nicira, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef TNL_NEIGH_CACHE_H
|
|
#define TNL_NEIGH_CACHE_H 1
|
|
|
|
#include <errno.h>
|
|
|
|
#include <inttypes.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <net/if.h>
|
|
#include <sys/socket.h>
|
|
|
|
#include "flow.h"
|
|
#include "netdev.h"
|
|
#include "packets.h"
|
|
#include "util.h"
|
|
|
|
int tnl_neigh_snoop(const struct flow *flow, struct flow_wildcards *wc,
|
|
const char dev_name[IFNAMSIZ], bool allow_update);
|
|
void tnl_neigh_set(const char name[IFNAMSIZ], const struct in6_addr *dst,
|
|
const struct eth_addr mac);
|
|
int tnl_neigh_lookup(const char dev_name[IFNAMSIZ], const struct in6_addr *dst,
|
|
struct eth_addr *mac);
|
|
void tnl_neigh_cache_init(void);
|
|
void tnl_neigh_cache_run(void);
|
|
void tnl_neigh_flush(const char dev_name[IFNAMSIZ]);
|
|
|
|
#endif
|