-
Notifications
You must be signed in to change notification settings - Fork 2.8k
/
route.go
81 lines (70 loc) · 1.92 KB
/
route.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright 2016-2018 Authors of Cilium
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package route
import (
"fmt"
"net"
"github.com/cilium/cilium/pkg/logging/logfields"
"github.com/sirupsen/logrus"
"github.com/vishvananda/netlink"
)
type Route struct {
Prefix net.IPNet
Nexthop *net.IP
Local net.IP
Device string
MTU int
Proto int
Scope netlink.Scope
Table int
Type int
}
// LogFields returns the route attributes as logrus.Fields map
func (r *Route) LogFields() logrus.Fields {
return logrus.Fields{
"prefix": r.Prefix,
"nexthop": r.Nexthop,
"local": r.Local,
logfields.Interface: r.Device,
}
}
// ByMask is used to sort an array of routes by mask, narrow first.
type ByMask []Route
func (a ByMask) Len() int {
return len(a)
}
func (a ByMask) Less(i, j int) bool {
lenA, _ := a[i].Prefix.Mask.Size()
lenB, _ := a[j].Prefix.Mask.Size()
return lenA > lenB
}
func (a ByMask) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
// ToIPCommand converts the route into a full "ip route ..." command
func (r *Route) ToIPCommand(dev string) []string {
res := []string{"ip"}
if r.Prefix.IP.To4() == nil {
res = append(res, "-6")
}
res = append(res, "route", "add", r.Prefix.String())
if r.Nexthop != nil {
res = append(res, "via", r.Nexthop.String())
}
if r.MTU != 0 {
res = append(res, "mtu", fmt.Sprintf("%d", r.MTU))
}
res = append(res, "dev", dev)
return res
}