66 "net"
77 "os"
88 "os/exec"
9+ "strings"
10+ "time"
911
1012 "github.com/containernetworking/plugins/pkg/ns"
1113 "github.com/containernetworking/plugins/pkg/utils/sysctl"
@@ -221,13 +223,14 @@ func (n NetworkUtils) setupBridgeNetwork(link netlink.Link, brName, tunnelType s
221223 if err != nil {
222224 return fmt .Errorf ("failed to set link %s up: %v" , la .Name , err )
223225 }
224- if tunnelType == qcclient .TunnelTypeVlan {
226+ if tunnelType == constants .TunnelTypeVlan {
225227 // get an ip addr and add to br
226228 // 1.get an ip addr from dhcp server
227229 bootConf , err := getIPAddrFromDHCPServer (brName )
228230 if err != nil {
229231 return fmt .Errorf ("failed to get ip address for link %s: %v" , brName , err )
230232 }
233+ klog .Infof ("get ip addr %+v success from dhcp server for link %s" , bootConf .Addresses , brName )
231234
232235 // 2. replace addr to br
233236 err = replaceLinkIPAddr (br , bootConf .Addresses )
@@ -282,9 +285,21 @@ func (n NetworkUtils) setupRouteTable(nic *rpc.HostNic) error {
282285 },
283286 }
284287
285- for _ , r := range routes {
286- if err := netlink .RouteAdd (& r ); err != nil && ! os .IsExist (err ) {
287- return fmt .Errorf ("failed to add route %v: %v" , r , err )
288+ // if tunnel type is vlan, clear route to repair hostnic
289+ if nic .VxNet .TunnelType == constants .TunnelTypeVlan {
290+ for _ , r := range routes {
291+ // netlink.RouteDel return error if route not exists: no such process
292+ if err := netlink .RouteDel (& r ); err != nil && ! strings .Contains (err .Error (), constants .RouteNotExistsError ) {
293+ return fmt .Errorf ("failed to del route %v: %v" , r , err )
294+ }
295+ }
296+
297+ } else {
298+ for _ , r := range routes {
299+ // netlink.RouteAdd return error if route already exists: file exists ; shouldn't use os.IsExist here
300+ if err := netlink .RouteAdd (& r ); err != nil && ! strings .Contains (err .Error (), constants .RouteExistsError ) {
301+ return fmt .Errorf ("failed to add route %v: %v" , r , err )
302+ }
288303 }
289304 }
290305
@@ -410,7 +425,11 @@ func ExecuteCommand(command string) (string, error) {
410425}
411426
412427func getIPAddrFromDHCPServer (ifname string ) (* netboot.BootConf , error ) {
413- client := client4 .NewClient ()
428+ // client := client4.NewClient()
429+ client := & client4.Client {
430+ ReadTimeout : client4 .DefaultReadTimeout * 5 ,
431+ WriteTimeout : client4 .DefaultWriteTimeout * 5 ,
432+ }
414433 conv , err := client .Exchange (ifname )
415434 if err != nil {
416435 return nil , fmt .Errorf ("dhcp client exchange error: %v" , err )
@@ -424,11 +443,19 @@ func getIPAddrFromDHCPServer(ifname string) (*netboot.BootConf, error) {
424443}
425444
426445func replaceLinkIPAddr (link netlink.Link , addres []netboot.AddrConf ) error {
446+ var shortestLeaseTime time.Duration
427447 ifName := link .Attrs ().Name
428448 if len (addres ) < 1 {
429449 return fmt .Errorf ("there is no avaliable addr for link %s" , ifName )
430450 }
431451 for _ , addrConf := range addres {
452+ if shortestLeaseTime .Seconds () == 0 {
453+ shortestLeaseTime = addrConf .ValidLifetime
454+ }
455+ if addrConf .ValidLifetime .Seconds () < shortestLeaseTime .Seconds () {
456+ shortestLeaseTime = addrConf .ValidLifetime
457+ }
458+
432459 addr := & netlink.Addr {
433460 IPNet : & addrConf .IPNet ,
434461 ValidLft : int (addrConf .ValidLifetime .Seconds ()),
@@ -439,6 +466,13 @@ func replaceLinkIPAddr(link netlink.Link, addres []netboot.AddrConf) error {
439466 return fmt .Errorf ("replace addr %+v to link %s error: %v" , addr , ifName , err )
440467 }
441468 }
469+
470+ if shortestLeaseTime .Seconds ()/ 2 != constants .LastIPAddrRenewPeriod .Seconds () && shortestLeaseTime != 0 {
471+ klog .Infof ("update LastIPAddrRenewPeriod from %v to %v" , constants .LastIPAddrRenewPeriod , shortestLeaseTime / 2 )
472+ constants .LastIPAddrRenewPeriod = shortestLeaseTime / 2
473+ constants .IpAddrReNewTicker .Reset (shortestLeaseTime / 2 )
474+ }
475+
442476 return nil
443477}
444478
@@ -450,9 +484,10 @@ func UpdateLinkIPAddrAndLease(nic *rpc.HostNic) error {
450484
451485 // 1. get an ip form dhcp server
452486 bootConf , err := getIPAddrFromDHCPServer (brName )
453- if err != nil {
487+ if err != nil || bootConf . Addresses == nil {
454488 return fmt .Errorf ("failed to get ip address for link %s: %v" , brName , err )
455489 }
490+ klog .Infof ("get ip addr %+v success from dhcp server for link %s" , bootConf .Addresses , brName )
456491
457492 // 2. replace addr to br
458493 err = replaceLinkIPAddr (br , bootConf .Addresses )
0 commit comments