@@ -17,7 +17,6 @@ import (
1717 "net"
1818 "net/netip"
1919 "os"
20- "reflect"
2120 "regexp"
2221 "strconv"
2322 "strings"
@@ -638,15 +637,15 @@ func compareInterfaceName(current, prev string) bool {
638637
639638func GetNextHopIPs (logger * zap.Logger , ips []string ) ([]net.IP , error ) {
640639 viaIPs := make ([]net.IP , 0 , 2 )
641- for _ , ip := range ips {
642- netIP , _ , err := net .ParseCIDR (ip )
640+ for _ , nip := range ips {
641+ netIP , _ , err := net .ParseCIDR (nip )
643642 if err != nil {
644- return nil , fmt .Errorf ("failed to parse cidr %s: %v" , ip , err )
643+ return nil , fmt .Errorf ("failed to parse cidr %s: %v" , nip , err )
645644 }
646645 logger .Debug ("destination IP" , zap .Any ("dst" , netIP ))
647646 routes , err := netlink .RouteGet (netIP )
648647 if err != nil {
649- return nil , fmt .Errorf ("failed to ip route get %s: %v" , ip , err )
648+ return nil , fmt .Errorf ("failed to ip route get %s: %v" , nip , err )
650649 }
651650
652651 for _ , route := range routes {
@@ -661,32 +660,37 @@ func GetNextHopIPs(logger *zap.Logger, ips []string) ([]net.IP, error) {
661660 return viaIPs , nil
662661}
663662
664- func RuleDel (netNS ns. NetNS , logger * zap.Logger , ruleTable int , ips []string ) error {
663+ func RuleDel (logger * zap.Logger , ruleTable int , ips []string ) error {
665664 logger .Debug ("Del Rule Table" , zap .Int ("RuleTable" , ruleTable ), zap .Strings ("ChainedInterface IP" , ips ))
666- rules , err := netlink .RuleList (netlink .FAMILY_ALL )
667- if err != nil {
668- logger .Error ("failed to del rule table" , zap .Error (err ))
669- return fmt .Errorf ("failed to del rule table %d : %v" , ruleTable , err )
670- }
671665
672666 for _ , chainedIP := range ips {
673- _ , ipnet , err := net .ParseCIDR (chainedIP )
667+ nip , _ , err := net .ParseCIDR (chainedIP )
674668 if err != nil {
675669 logger .Error ("failed to del rule table" , zap .Error (err ))
676670 return fmt .Errorf ("failed to del rule table %d : %v" , ruleTable , err )
677671 }
678672
679- for _ , rule := range rules {
680- if rule .Table == ruleTable && reflect .DeepEqual (rule .Dst , ipnet ) {
681- if err = netlink .RuleDel (& rule ); err != nil && strings .Contains (err .Error (), ErrFileNotFound ) {
682- logger .Error ("failed to del rule table" , zap .Error (err ))
683- return fmt .Errorf ("failed to del rule table %d: %v " , ruleTable , err )
684- }
685- }
673+ dst := net.IPNet {
674+ IP : nip ,
675+ Mask : net.IPMask {},
676+ }
677+
678+ if nip .To4 () != nil {
679+ dst .Mask = net .CIDRMask (32 , 32 )
680+ } else {
681+ dst .Mask = net .CIDRMask (128 , 128 )
682+ }
683+
684+ rule := netlink .NewRule ()
685+ rule .Table = ruleTable
686+ rule .Dst = & dst
687+ if err = netlink .RuleDel (rule ); err != nil && ! os .IsNotExist (err ) {
688+ logger .Error ("failed to del rule table" , zap .Error (err ))
689+ return fmt .Errorf ("failed to del rule table %d: %v " , ruleTable , err )
686690 }
687691 }
688692
689- return err
693+ return nil
690694}
691695
692696// AddStaticNeighTable fix the problem of communication failure between pods and hosts by adding neigh table on pod and host
@@ -760,17 +764,20 @@ func AddStaticNeighTable(logger *zap.Logger, netns ns.NetNS, iSriov, enableIpv4,
760764 logger .Error (err .Error ())
761765 return err
762766 }
767+ dst := & net.IPNet {
768+ IP : netIP ,
769+ Mask : net.IPMask {},
770+ }
771+
763772 if netIP .To4 () == nil {
764- dst := & net.IPNet {
765- IP : netIP ,
766- }
767- dst .Mask = net.IPMask {}
768773 dst .Mask = net .CIDRMask (128 , 128 )
769- if err = NeighborAdd (logger , hostLink .Attrs ().Name , defaultOverlayMac , dst .String ()); err != nil {
770- logger .Error (err .Error ())
771- return err
772- }
773- break
774+ } else {
775+ dst .Mask = net .CIDRMask (32 , 32 )
776+ }
777+
778+ if err = NeighborAdd (logger , hostLink .Attrs ().Name , defaultOverlayMac , dst .String ()); err != nil {
779+ logger .Error (err .Error ())
780+ return err
774781 }
775782 }
776783 logger .Debug ("succeed to add neighbor table for ipv6" , zap .Strings ("host ipv6 ips" , hostIPs ))
@@ -797,7 +804,8 @@ func NeighborAdd(logger *zap.Logger, iface, mac string, ipStr string) error {
797804 IP : netIP ,
798805 HardwareAddr : parseMac (mac ),
799806 }
800- if err := netlink .NeighAdd (neigh ); err != nil && ! strings .EqualFold (err .Error (), "file exists" ) {
807+
808+ if err := netlink .NeighAdd (neigh ); err != nil && ! os .IsExist (err ) {
801809 logger .Error ("failed to add neigh table" , zap .String ("interface" , iface ), zap .String ("neigh" , neigh .String ()), zap .Error (err ))
802810 return fmt .Errorf ("failed to add neigh table: %v " , err )
803811 }
0 commit comments