Handle kernel's l2miss notification in the overlay driver

Signed-off-by: Santhosh Manohar <santhosh@docker.com>
This commit is contained in:
Santhosh Manohar 2017-02-08 11:56:33 -08:00
parent 1f32a0a772
commit 83837617b4

View file

@ -645,19 +645,25 @@ func (n *network) watchMiss(nlSock *nl.NetlinkSocket) {
continue
}
if neigh.IP.To4() == nil {
if neigh.HardwareAddr != nil {
logrus.Debugf("Miss notification, l2 mac %v", neigh.HardwareAddr)
}
var (
ip net.IP
mac net.HardwareAddr
)
if neigh.IP.To4() != nil {
ip = neigh.IP
} else if neigh.HardwareAddr != nil {
mac = []byte(neigh.HardwareAddr)
ip = net.IP(mac[2:])
} else {
continue
}
// Not any of the network's subnets. Ignore.
if !n.contains(neigh.IP) {
if !n.contains(ip) {
continue
}
logrus.Debugf("miss notification for dest IP, %v", neigh.IP.String())
logrus.Debugf("miss notification: dest IP %v, dest MAC %v", ip, mac)
if neigh.State&(netlink.NUD_STALE|netlink.NUD_INCOMPLETE) == 0 {
continue
@ -667,14 +673,14 @@ func (n *network) watchMiss(nlSock *nl.NetlinkSocket) {
continue
}
mac, IPmask, vtep, err := n.driver.resolvePeer(n.id, neigh.IP)
mac, IPmask, vtep, err := n.driver.resolvePeer(n.id, ip)
if err != nil {
logrus.Errorf("could not resolve peer %q: %v", neigh.IP, err)
logrus.Errorf("could not resolve peer %q: %v", ip, err)
continue
}
if err := n.driver.peerAdd(n.id, "dummy", neigh.IP, IPmask, mac, vtep, true); err != nil {
logrus.Errorf("could not add neighbor entry for missed peer %q: %v", neigh.IP, err)
if err := n.driver.peerAdd(n.id, "dummy", ip, IPmask, mac, vtep, true); err != nil {
logrus.Errorf("could not add neighbor entry for missed peer %q: %v", ip, err)
}
}
}