Fix for IPoIB over lagg(4).
Need to update both link layer address and broadcast address when active link changes for IP over infiniband. This is because the broadcast address contains the so-called P-key, which is interface dependent. Reviewed by: kib @ Differential Revision: https://reviews.freebsd.org/D27658 MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking
This commit is contained in:
parent
89e3d5671b
commit
19ecb5e8da
@ -511,11 +511,6 @@ lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
int if_type;
|
||||
int error;
|
||||
static const uint8_t eaddr[LAGG_ADDR_LEN];
|
||||
static const uint8_t ib_bcast_addr[INFINIBAND_ADDR_LEN] = {
|
||||
0x00, 0xff, 0xff, 0xff,
|
||||
0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
|
||||
if (params != NULL) {
|
||||
error = copyin(params, &iflp, sizeof(iflp));
|
||||
@ -603,7 +598,7 @@ lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params)
|
||||
ether_ifattach(ifp, eaddr);
|
||||
break;
|
||||
case IFT_INFINIBAND:
|
||||
infiniband_ifattach(ifp, eaddr, ib_bcast_addr);
|
||||
infiniband_ifattach(ifp, eaddr, sc->sc_bcast_addr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1239,8 +1234,11 @@ lagg_watchdog_infiniband(void *arg)
|
||||
lp_ifp = lp->lp_ifp;
|
||||
|
||||
if (ifp != NULL && lp_ifp != NULL &&
|
||||
memcmp(IF_LLADDR(ifp), IF_LLADDR(lp_ifp), ifp->if_addrlen) != 0) {
|
||||
(memcmp(IF_LLADDR(ifp), IF_LLADDR(lp_ifp), ifp->if_addrlen) != 0 ||
|
||||
memcmp(sc->sc_bcast_addr, lp_ifp->if_broadcastaddr, ifp->if_addrlen) != 0)) {
|
||||
memcpy(IF_LLADDR(ifp), IF_LLADDR(lp_ifp), ifp->if_addrlen);
|
||||
memcpy(sc->sc_bcast_addr, lp_ifp->if_broadcastaddr, ifp->if_addrlen);
|
||||
|
||||
CURVNET_SET(ifp->if_vnet);
|
||||
EVENTHANDLER_INVOKE(iflladdr_event, ifp);
|
||||
CURVNET_RESTORE();
|
||||
|
@ -258,13 +258,14 @@ struct lagg_softc {
|
||||
int flowid_shift; /* shift the flowid */
|
||||
struct lagg_counters detached_counters; /* detached ports sum */
|
||||
struct callout sc_watchdog; /* watchdog timer */
|
||||
#define LAGG_ADDR_LEN \
|
||||
MAX(INFINIBAND_ADDR_LEN, ETHER_ADDR_LEN)
|
||||
uint8_t sc_bcast_addr[LAGG_ADDR_LEN];
|
||||
};
|
||||
|
||||
struct lagg_port {
|
||||
struct ifnet *lp_ifp; /* physical interface */
|
||||
struct lagg_softc *lp_softc; /* parent lagg */
|
||||
#define LAGG_ADDR_LEN \
|
||||
MAX(INFINIBAND_ADDR_LEN, ETHER_ADDR_LEN)
|
||||
uint8_t lp_lladdr[LAGG_ADDR_LEN];
|
||||
|
||||
u_char lp_iftype; /* interface type */
|
||||
|
Loading…
Reference in New Issue
Block a user