Skip to content

Commit 0efe855

Browse files
authored
Merge pull request #182 from cyclinder/router_neigh
add static neigh table for communicate between node and pod's underla…
2 parents d2c0dcb + f472e6f commit 0efe855

5 files changed

Lines changed: 53 additions & 45 deletions

File tree

charts/meta-plugins/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ type: application
1010
# This is the chart version. This version number should be incremented each time you make changes
1111
# to the chart and its templates, including the app version.
1212
# Versions are expected to follow Semantic Versioning (https://semver.org/)
13-
version: 0.2.4
13+
version: 0.2.5
1414

1515
# This is the version number of the application being deployed. This version number should be
1616
# incremented each time you make changes to the application. Versions are not expected to
1717
# follow Semantic Versioning. They should reflect the version the application is using.
1818
# It is recommended to use it with quotes.
19-
appVersion: "0.2.4"
19+
appVersion: "0.2.5"
2020

2121
maintainers:
2222
- name: Spider-Guys

charts/meta-plugins/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# meta-plugins
22

3-
![Version: 0.2.3](https://img.shields.io/badge/Version-0.2.3-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.2.4](https://img.shields.io/badge/AppVersion-0.2.4-informational?style=flat-square)
3+
![Version: 0.2.5](https://img.shields.io/badge/Version-0.2.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.2.5](https://img.shields.io/badge/AppVersion-0.2.5-informational?style=flat-square)
44

55
meta-plugins works with macvlan cni to solve some communication problems when macvlan is used as CNI.
66

pkg/utils/utils.go

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

639638
func 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
}

pkg/utils/utils_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ var _ = Describe("Utils", func() {
171171

172172
// ruleDel
173173
err = testNetNs.Do(func(netNS ns.NetNS) error {
174-
return RuleDel(testNetNs, logger, table, routes)
174+
return RuleDel(logger, table, routes)
175175
})
176176
Expect(err).NotTo(HaveOccurred())
177177

@@ -206,7 +206,7 @@ var _ = Describe("Utils", func() {
206206

207207
// ruleDel
208208
err = testNetNs.Do(func(netNS ns.NetNS) error {
209-
return RuleDel(testNetNs, logger, table, routes)
209+
return RuleDel(logger, table, routes)
210210
})
211211
Expect(err).NotTo(HaveOccurred())
212212

@@ -244,7 +244,7 @@ var _ = Describe("Utils", func() {
244244

245245
// rule del
246246
err = testNetNs.Do(func(netNS ns.NetNS) error {
247-
return RuleDel(testNetNs, logger, table, routes)
247+
return RuleDel(logger, table, routes)
248248
})
249249
Expect(err).NotTo(HaveOccurred())
250250
})
@@ -308,7 +308,7 @@ var _ = Describe("Utils", func() {
308308

309309
// rule del
310310
err = testNetNs.Do(func(netNS ns.NetNS) error {
311-
return RuleDel(testNetNs, logger, table, routes)
311+
return RuleDel(logger, table, routes)
312312
})
313313
Expect(err).NotTo(HaveOccurred())
314314
})
@@ -339,13 +339,13 @@ var _ = Describe("Utils", func() {
339339

340340
// del non-exist rule
341341
err = testNetNs.Do(func(netNS ns.NetNS) error {
342-
return RuleDel(testNetNs, logger, table, fake)
342+
return RuleDel(logger, table, fake)
343343
})
344344
Expect(err).NotTo(HaveOccurred())
345345

346346
// clean
347347
err = testNetNs.Do(func(netNS ns.NetNS) error {
348-
return RuleDel(testNetNs, logger, table, routes)
348+
return RuleDel(logger, table, routes)
349349
})
350350
Expect(err).NotTo(HaveOccurred())
351351
})
@@ -390,7 +390,7 @@ var _ = Describe("Utils", func() {
390390

391391
// del rule
392392
err = testNetNs.Do(func(netNS ns.NetNS) error {
393-
return RuleDel(testNetNs, logger, table, chainedIPs)
393+
return RuleDel(logger, table, chainedIPs)
394394
})
395395
Expect(err).NotTo(HaveOccurred())
396396
})
@@ -417,7 +417,7 @@ var _ = Describe("Utils", func() {
417417

418418
// del rule
419419
err = testNetNs.Do(func(netNS ns.NetNS) error {
420-
return RuleDel(testNetNs, logger, table, chainedIPs)
420+
return RuleDel(logger, table, chainedIPs)
421421
})
422422
Expect(err).NotTo(HaveOccurred())
423423
})
@@ -445,7 +445,7 @@ var _ = Describe("Utils", func() {
445445

446446
// del rule
447447
err = testNetNs.Do(func(netNS ns.NetNS) error {
448-
return RuleDel(testNetNs, logger, table, chainedIPs)
448+
return RuleDel(logger, table, chainedIPs)
449449
})
450450
Expect(err).NotTo(HaveOccurred())
451451
})

plugins/router/router.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ func cmdDel(args *skel.CmdArgs) error {
270270
logger.Warn("Pod No IPs, Skip call CmdDel", zap.Error(err))
271271
}
272272
logger.Debug("Get ChainedInterface IPs", zap.String("interface", args.IfName), zap.Strings("IPs", chainedInterfaceIps))
273-
if err = utils.RuleDel(netns, logger, *conf.HostRuleTable, chainedInterfaceIps); err != nil {
273+
if err = utils.RuleDel(logger, *conf.HostRuleTable, chainedInterfaceIps); err != nil {
274274
logger.Error(err.Error())
275275
return err
276276
}
@@ -454,7 +454,7 @@ func addChainedIPRoute(logger *zap.Logger, netNS ns.NetNS, iSriov, enableIpv4, e
454454
rule.Table = hostRuleTable
455455
rule.Family = family
456456
rule.Dst = dst
457-
if err = netlink.RuleAdd(rule); err != nil && err.Error() != constant.ErrFileExists {
457+
if err = netlink.RuleAdd(rule); err != nil && !os.IsExist(err) {
458458
logger.Error("Netlink RuleAdd Failed", zap.String("Rule", rule.String()), zap.Error(err))
459459
return fmt.Errorf("failed to add rule table for underlay interface: %v", err)
460460
}
@@ -464,7 +464,7 @@ func addChainedIPRoute(logger *zap.Logger, netNS ns.NetNS, iSriov, enableIpv4, e
464464
Dst: dst,
465465
Scope: netlink.SCOPE_LINK,
466466
Table: hostRuleTable,
467-
}); err != nil && err.Error() != constant.ErrFileExists {
467+
}); err != nil && !os.IsExist(err) {
468468
logger.Error(err.Error())
469469
return fmt.Errorf("failed to add route for underlay interface: %v", err)
470470
}

0 commit comments

Comments
 (0)