Skip to content

Commit

Permalink
Merge pull request #182 from cyclinder/router_neigh
Browse files Browse the repository at this point in the history
add static neigh table for communicate between node and pod's underla…
  • Loading branch information
cyclinder authored Jul 12, 2023
2 parents d2c0dcb + f472e6f commit 0efe855
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 45 deletions.
4 changes: 2 additions & 2 deletions charts/meta-plugins/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.2.4
version: 0.2.5

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

maintainers:
- name: Spider-Guys
Expand Down
2 changes: 1 addition & 1 deletion charts/meta-plugins/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# meta-plugins

![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)
![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)

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

Expand Down
68 changes: 38 additions & 30 deletions pkg/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
"net"
"net/netip"
"os"
"reflect"
"regexp"
"strconv"
"strings"
Expand Down Expand Up @@ -638,15 +637,15 @@ func compareInterfaceName(current, prev string) bool {

func GetNextHopIPs(logger *zap.Logger, ips []string) ([]net.IP, error) {
viaIPs := make([]net.IP, 0, 2)
for _, ip := range ips {
netIP, _, err := net.ParseCIDR(ip)
for _, nip := range ips {
netIP, _, err := net.ParseCIDR(nip)
if err != nil {
return nil, fmt.Errorf("failed to parse cidr %s: %v", ip, err)
return nil, fmt.Errorf("failed to parse cidr %s: %v", nip, err)
}
logger.Debug("destination IP", zap.Any("dst", netIP))
routes, err := netlink.RouteGet(netIP)
if err != nil {
return nil, fmt.Errorf("failed to ip route get %s: %v", ip, err)
return nil, fmt.Errorf("failed to ip route get %s: %v", nip, err)
}

for _, route := range routes {
Expand All @@ -661,32 +660,37 @@ func GetNextHopIPs(logger *zap.Logger, ips []string) ([]net.IP, error) {
return viaIPs, nil
}

func RuleDel(netNS ns.NetNS, logger *zap.Logger, ruleTable int, ips []string) error {
func RuleDel(logger *zap.Logger, ruleTable int, ips []string) error {
logger.Debug("Del Rule Table", zap.Int("RuleTable", ruleTable), zap.Strings("ChainedInterface IP", ips))
rules, err := netlink.RuleList(netlink.FAMILY_ALL)
if err != nil {
logger.Error("failed to del rule table", zap.Error(err))
return fmt.Errorf("failed to del rule table %d : %v", ruleTable, err)
}

for _, chainedIP := range ips {
_, ipnet, err := net.ParseCIDR(chainedIP)
nip, _, err := net.ParseCIDR(chainedIP)
if err != nil {
logger.Error("failed to del rule table", zap.Error(err))
return fmt.Errorf("failed to del rule table %d : %v", ruleTable, err)
}

for _, rule := range rules {
if rule.Table == ruleTable && reflect.DeepEqual(rule.Dst, ipnet) {
if err = netlink.RuleDel(&rule); err != nil && strings.Contains(err.Error(), ErrFileNotFound) {
logger.Error("failed to del rule table", zap.Error(err))
return fmt.Errorf("failed to del rule table %d: %v ", ruleTable, err)
}
}
dst := net.IPNet{
IP: nip,
Mask: net.IPMask{},
}

if nip.To4() != nil {
dst.Mask = net.CIDRMask(32, 32)
} else {
dst.Mask = net.CIDRMask(128, 128)
}

rule := netlink.NewRule()
rule.Table = ruleTable
rule.Dst = &dst
if err = netlink.RuleDel(rule); err != nil && !os.IsNotExist(err) {
logger.Error("failed to del rule table", zap.Error(err))
return fmt.Errorf("failed to del rule table %d: %v ", ruleTable, err)
}
}

return err
return nil
}

// AddStaticNeighTable fix the problem of communication failure between pods and hosts by adding neigh table on pod and host
Expand Down Expand Up @@ -760,17 +764,20 @@ func AddStaticNeighTable(logger *zap.Logger, netns ns.NetNS, iSriov, enableIpv4,
logger.Error(err.Error())
return err
}
dst := &net.IPNet{
IP: netIP,
Mask: net.IPMask{},
}

if netIP.To4() == nil {
dst := &net.IPNet{
IP: netIP,
}
dst.Mask = net.IPMask{}
dst.Mask = net.CIDRMask(128, 128)
if err = NeighborAdd(logger, hostLink.Attrs().Name, defaultOverlayMac, dst.String()); err != nil {
logger.Error(err.Error())
return err
}
break
} else {
dst.Mask = net.CIDRMask(32, 32)
}

if err = NeighborAdd(logger, hostLink.Attrs().Name, defaultOverlayMac, dst.String()); err != nil {
logger.Error(err.Error())
return err
}
}
logger.Debug("succeed to add neighbor table for ipv6", zap.Strings("host ipv6 ips", hostIPs))
Expand All @@ -797,7 +804,8 @@ func NeighborAdd(logger *zap.Logger, iface, mac string, ipStr string) error {
IP: netIP,
HardwareAddr: parseMac(mac),
}
if err := netlink.NeighAdd(neigh); err != nil && !strings.EqualFold(err.Error(), "file exists") {

if err := netlink.NeighAdd(neigh); err != nil && !os.IsExist(err) {
logger.Error("failed to add neigh table", zap.String("interface", iface), zap.String("neigh", neigh.String()), zap.Error(err))
return fmt.Errorf("failed to add neigh table: %v ", err)
}
Expand Down
18 changes: 9 additions & 9 deletions pkg/utils/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ var _ = Describe("Utils", func() {

// ruleDel
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, routes)
return RuleDel(logger, table, routes)
})
Expect(err).NotTo(HaveOccurred())

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

// ruleDel
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, routes)
return RuleDel(logger, table, routes)
})
Expect(err).NotTo(HaveOccurred())

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

// rule del
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, routes)
return RuleDel(logger, table, routes)
})
Expect(err).NotTo(HaveOccurred())
})
Expand Down Expand Up @@ -308,7 +308,7 @@ var _ = Describe("Utils", func() {

// rule del
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, routes)
return RuleDel(logger, table, routes)
})
Expect(err).NotTo(HaveOccurred())
})
Expand Down Expand Up @@ -339,13 +339,13 @@ var _ = Describe("Utils", func() {

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

// clean
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, routes)
return RuleDel(logger, table, routes)
})
Expect(err).NotTo(HaveOccurred())
})
Expand Down Expand Up @@ -390,7 +390,7 @@ var _ = Describe("Utils", func() {

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

// del rule
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, chainedIPs)
return RuleDel(logger, table, chainedIPs)
})
Expect(err).NotTo(HaveOccurred())
})
Expand Down Expand Up @@ -445,7 +445,7 @@ var _ = Describe("Utils", func() {

// del rule
err = testNetNs.Do(func(netNS ns.NetNS) error {
return RuleDel(testNetNs, logger, table, chainedIPs)
return RuleDel(logger, table, chainedIPs)
})
Expect(err).NotTo(HaveOccurred())
})
Expand Down
6 changes: 3 additions & 3 deletions plugins/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ func cmdDel(args *skel.CmdArgs) error {
logger.Warn("Pod No IPs, Skip call CmdDel", zap.Error(err))
}
logger.Debug("Get ChainedInterface IPs", zap.String("interface", args.IfName), zap.Strings("IPs", chainedInterfaceIps))
if err = utils.RuleDel(netns, logger, *conf.HostRuleTable, chainedInterfaceIps); err != nil {
if err = utils.RuleDel(logger, *conf.HostRuleTable, chainedInterfaceIps); err != nil {
logger.Error(err.Error())
return err
}
Expand Down Expand Up @@ -454,7 +454,7 @@ func addChainedIPRoute(logger *zap.Logger, netNS ns.NetNS, iSriov, enableIpv4, e
rule.Table = hostRuleTable
rule.Family = family
rule.Dst = dst
if err = netlink.RuleAdd(rule); err != nil && err.Error() != constant.ErrFileExists {
if err = netlink.RuleAdd(rule); err != nil && !os.IsExist(err) {
logger.Error("Netlink RuleAdd Failed", zap.String("Rule", rule.String()), zap.Error(err))
return fmt.Errorf("failed to add rule table for underlay interface: %v", err)
}
Expand All @@ -464,7 +464,7 @@ func addChainedIPRoute(logger *zap.Logger, netNS ns.NetNS, iSriov, enableIpv4, e
Dst: dst,
Scope: netlink.SCOPE_LINK,
Table: hostRuleTable,
}); err != nil && err.Error() != constant.ErrFileExists {
}); err != nil && !os.IsExist(err) {
logger.Error(err.Error())
return fmt.Errorf("failed to add route for underlay interface: %v", err)
}
Expand Down

0 comments on commit 0efe855

Please sign in to comment.