Skip to content

Commit 060e4a7

Browse files
committed
fact: add ip utils library & add unit testing
Consolidate IP utility functions into a new file and add proper unit testing. Additionally consolidate logic and references to default route subnets.
1 parent cc734e5 commit 060e4a7

File tree

5 files changed

+397
-48
lines changed

5 files changed

+397
-48
lines changed

pkg/controllers/proxy/linux_networking.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ import (
2323
)
2424

2525
const (
26-
ipv4NetMaskBits = 32
27-
ipv4DefaultRoute = "0.0.0.0/0"
28-
ipv6NetMaskBits = 128
29-
ipv6DefaultRoute = "::/0"
26+
ipv4NetMaskBits = 32
27+
ipv6NetMaskBits = 128
3028

3129
// TODO: it's bad to rely on eth0 here. While this is inside the container's namespace and is determined by the
3230
// container runtime and so far we've been able to count on this being reliably set to eth0, it is possible that
@@ -498,10 +496,10 @@ func (ln *linuxNetworking) setupPolicyRoutingForDSR(setupIPv4, setupIPv6 bool) e
498496

499497
if setupIPv4 {
500498
nFamily := netlink.FAMILY_V4
501-
_, defaultRouteCIDR, err := net.ParseCIDR(ipv4DefaultRoute)
502-
if err != nil {
499+
defaultRouteCIDR := utils.GetDefaultIPv4Route()
500+
if defaultRouteCIDR == nil {
503501
return fmt.Errorf("failed to parse default (%s) route (this is statically defined, so if you see this "+
504-
"error please report because something has gone very wrong) due to: %v", ipv4DefaultRoute, err)
502+
"error please report because something has gone very wrong)", defaultRouteCIDR)
505503
}
506504
nRoute := &netlink.Route{
507505
Family: nFamily,
@@ -520,10 +518,10 @@ func (ln *linuxNetworking) setupPolicyRoutingForDSR(setupIPv4, setupIPv6 bool) e
520518

521519
if setupIPv6 {
522520
nFamily := netlink.FAMILY_V6
523-
_, defaultRouteCIDR, err := net.ParseCIDR(ipv6DefaultRoute)
524-
if err != nil {
521+
defaultRouteCIDR := utils.GetDefaultIPv6Route()
522+
if defaultRouteCIDR == nil {
525523
return fmt.Errorf("failed to parse default (%s) route (this is statically defined, so if you see this "+
526-
"error please report because something has gone very wrong) due to: %v", ipv6DefaultRoute, err)
524+
"error please report because something has gone very wrong)", defaultRouteCIDR)
527525
}
528526
nRoute := &netlink.Route{
529527
Family: nFamily,
@@ -556,14 +554,14 @@ func (ln *linuxNetworking) setupRoutesForExternalIPForDSR(serviceInfoMap service
556554

557555
setupIPRulesAndRoutes := func(isIPv6 bool) error {
558556
nFamily := netlink.FAMILY_V4
559-
_, defaultPrefixCIDR, err := net.ParseCIDR(ipv4DefaultRoute)
557+
defaultPrefixCIDR := utils.GetDefaultIPv4Route()
560558
if isIPv6 {
561559
nFamily = netlink.FAMILY_V6
562-
_, defaultPrefixCIDR, err = net.ParseCIDR(ipv6DefaultRoute)
560+
defaultPrefixCIDR = utils.GetDefaultIPv6Route()
563561
}
564-
if err != nil {
565-
return fmt.Errorf("failed to parse default route (this is statically defined, so if you see this "+
566-
"error please report because something has gone very wrong) due to: %v", err)
562+
if defaultPrefixCIDR == nil {
563+
return fmt.Errorf("failed to parse default route (this is statically defined, so if you see this " +
564+
"error please report because something has gone very wrong)")
567565
}
568566

569567
nRule := netlink.NewRule()

pkg/controllers/routing/bgp_policies.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,8 @@ func (nrc *NetworkRoutingController) addServiceVIPsDefinedSet() error {
278278
// create a defined set to represent just the host default route
279279
func (nrc *NetworkRoutingController) addDefaultRouteDefinedSet() error {
280280
for setName, defaultRoute := range map[string]string{
281-
defaultRouteSet: "0.0.0.0/0",
282-
defaultRouteSetV6: "::/0",
281+
defaultRouteSet: utils.IPv4DefaultRoute,
282+
defaultRouteSetV6: utils.IPv6DefaultRoute,
283283
} {
284284
currentDefinedSet, err := nrc.getDefinedSetFromGoBGP(setName, gobgpapi.DefinedType_PREFIX)
285285
if err != nil {

pkg/utils/ip.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package utils
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"net"
7+
)
8+
9+
const (
10+
IPv4DefaultRoute = "0.0.0.0/0"
11+
IPv6DefaultRoute = "::/0"
12+
)
13+
14+
// ContainsIPv4Address checks a given string array to see if it contains a valid IPv4 address within it
15+
func ContainsIPv4Address(addrs []string) bool {
16+
for _, addr := range addrs {
17+
ip := net.ParseIP(addr)
18+
if ip == nil {
19+
continue
20+
}
21+
if ip.To4() != nil {
22+
return true
23+
}
24+
}
25+
return false
26+
}
27+
28+
// ContainsIPv6Address checks a given string array to see if it contains a valid IPv6 address within it
29+
func ContainsIPv6Address(addrs []string) bool {
30+
for _, addr := range addrs {
31+
ip := net.ParseIP(addr)
32+
if ip == nil {
33+
continue
34+
}
35+
if ip.To4() != nil {
36+
continue
37+
}
38+
if ip.To16() != nil {
39+
return true
40+
}
41+
}
42+
return false
43+
}
44+
45+
// GetDefaultIPv4Route returns the default IPv4 route
46+
func GetDefaultIPv4Route() *net.IPNet {
47+
_, defaultPrefixCIDR, err := net.ParseCIDR(IPv4DefaultRoute)
48+
if err != nil {
49+
return nil
50+
}
51+
return defaultPrefixCIDR
52+
}
53+
54+
// GetDefaultIPv6Route returns the default IPv6 route
55+
func GetDefaultIPv6Route() *net.IPNet {
56+
_, defaultPrefixCIDR, err := net.ParseCIDR(IPv6DefaultRoute)
57+
if err != nil {
58+
return nil
59+
}
60+
return defaultPrefixCIDR
61+
}
62+
63+
// IPNetEqual checks if two IPNet objects are equal by comparing the IP and Mask
64+
func IPNetEqual(a, b *net.IPNet) bool {
65+
if a == nil || b == nil {
66+
return a == b
67+
}
68+
return a.IP.Equal(b.IP) && bytes.Equal(a.Mask, b.Mask)
69+
}
70+
71+
// IsDefaultRoute checks if a given CIDR is a default route by comparing it to the default routes for IPv4 and IPv6
72+
func IsDefaultRoute(cidr *net.IPNet) (bool, error) {
73+
var defaultPrefixCIDR *net.IPNet
74+
var err error
75+
76+
if cidr.IP.To4() != nil {
77+
_, defaultPrefixCIDR, err = net.ParseCIDR(IPv4DefaultRoute)
78+
if err != nil {
79+
return false, fmt.Errorf("failed to parse default route: %s", err.Error())
80+
}
81+
} else {
82+
_, defaultPrefixCIDR, err = net.ParseCIDR(IPv6DefaultRoute)
83+
if err != nil {
84+
return false, fmt.Errorf("failed to parse default route: %s", err.Error())
85+
}
86+
}
87+
return IPNetEqual(defaultPrefixCIDR, cidr), nil
88+
}

0 commit comments

Comments
 (0)