diff --git a/src/netlink.c b/src/netlink.c index 42d8e153aede897c68effc7908e1751ec0a6754a..df7bd7790498709dcc818498e8b7f6ec1df441e2 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -154,21 +154,43 @@ int hostmngr_update_neigh_brport(struct hostmngr_private *priv, char *brname) for (i = 0; i < num; i++) { struct neigh_entry *t; + char *ifname = NULL; dbg("FDB[%d] : " MACFMT " port = %hu\n", i, MAC2STR(fdbs[i].macaddr), fdbs[i].port); t = neigh_lookup(&priv->neigh_q, fdbs[i].macaddr); + ifname = hostmngr_brport_to_ifname(priv, fdbs[i].port); if (t) { t->brport = fdbs[i].port; - char *ifname; - ifname = hostmngr_brport_to_ifname(priv, fdbs[i].port); if (ifname) { memset(t->ifname, 0, 16); strncpy(t->ifname, ifname, 16); } } + else { + /* create a new neigh just learnt from br-fdb */ + struct neigh_entry *new = NULL; + enum if_mediatype mtype; + if (ifname) { + if_getmediatype(ifname, &mtype); + if (mtype == IF_MEDIA_ETH) { + new = neigh_enqueue(&priv->neigh_q, + fdbs[i].macaddr, + NEIGH_STATE_REACHABLE, + ifname, + NEIGH_TYPE_ETH, + NULL, + NEIGH_AGEOUT_DEFAULT, + NULL); + if (new) { + new->brport = fdbs[i].port; + dbg("%s: Added new neighbor: " MACFMT " on port %hu\n", __func__, MAC2STR(fdbs[i].macaddr), fdbs[i].port); + } + } + } + } } return 0;