func (t *BaseOperations) dhcpLoop(stop chan struct{}, e *NetworkEndpoint, dc client.Client) { exp := time.After(dc.LastAck().LeaseTime() / 2) for { select { case <-stop: // release the ip log.Infof("releasing IP address for network %s", e.Name) dc.Release() return case <-exp: log.Infof("renewing IP address for network %s", e.Name) err := dc.Renew() if err != nil { log.Errorf("failed to renew ip address for network %s: %s", e.Name, err) continue } ack := dc.LastAck() log.Infof("successfully renewed ip address: IP=%s, SubnetMask=%s, Gateway=%s, DNS=%s, Lease Time=%s", ack.YourIP(), ack.SubnetMask(), ack.Gateway(), ack.DNS(), ack.LeaseTime()) e.DHCP = &DHCPInfo{ Assigned: net.IPNet{IP: ack.YourIP(), Mask: ack.SubnetMask()}, Gateway: net.IPNet{IP: ack.Gateway(), Mask: ack.SubnetMask()}, Nameservers: ack.DNS(), } t.Apply(e) if err = t.config.UpdateNetworkEndpoint(e); err != nil { log.Error(err) } // update any endpoints that share this NIC for _, d := range t.dynEndpoints[e.ID] { if e == d { continue } d.DHCP = e.DHCP t.Apply(d) if err = t.config.UpdateNetworkEndpoint(d); err != nil { log.Error(err) } } t.config.Flush() exp = time.After(ack.LeaseTime() / 2) } } }