Skip to content

Commit dedb7ec

Browse files
committed
Add "default" dst while no DST attr responsed from nl
Signed-off-by: Li Chun <[email protected]>
1 parent 55c8b95 commit dedb7ec

2 files changed

Lines changed: 222 additions & 1 deletion

File tree

route_linux.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,9 @@ func (h *Handle) RouteListFiltered(family int, filter *Route, filterMask uint64)
10681068
continue
10691069
case filterMask&RT_FILTER_DST != 0:
10701070
if filter.MPLSDst == nil || route.MPLSDst == nil || (*filter.MPLSDst) != (*route.MPLSDst) {
1071+
if filter.Dst == nil {
1072+
filter.Dst = genZeroIPNet(family)
1073+
}
10711074
if !ipNetEqual(route.Dst, filter.Dst) {
10721075
continue
10731076
}
@@ -1262,6 +1265,27 @@ func deserializeRoute(m []byte) (Route, error) {
12621265
}
12631266
}
12641267

1268+
// Same logic to generate "default" dst with iproute2 implementation
1269+
if route.Dst == nil {
1270+
var addLen int
1271+
var ip net.IP
1272+
switch msg.Family {
1273+
case FAMILY_V4:
1274+
addLen = net.IPv4len
1275+
ip = net.IPv4zero
1276+
case FAMILY_V6:
1277+
addLen = net.IPv6len
1278+
ip = net.IPv6zero
1279+
}
1280+
1281+
if addLen != 0 {
1282+
route.Dst = &net.IPNet{
1283+
IP: ip,
1284+
Mask: net.CIDRMask(int(msg.Dst_len), 8*addLen),
1285+
}
1286+
}
1287+
}
1288+
12651289
if len(encap.Value) != 0 && len(encapType.Value) != 0 {
12661290
typ := int(native.Uint16(encapType.Value[0:2]))
12671291
var e Encap
@@ -1575,3 +1599,24 @@ func (p RouteProtocol) String() string {
15751599
return strconv.Itoa(int(p))
15761600
}
15771601
}
1602+
1603+
// genZeroIPNet returns 0.0.0.0/0 or ::/0 for IPv4 or IPv6, otherwise nil
1604+
func genZeroIPNet(family int) *net.IPNet {
1605+
var addLen int
1606+
var ip net.IP
1607+
switch family {
1608+
case FAMILY_V4:
1609+
addLen = net.IPv4len
1610+
ip = net.IPv4zero
1611+
case FAMILY_V6:
1612+
addLen = net.IPv6len
1613+
ip = net.IPv6zero
1614+
}
1615+
if addLen != 0 {
1616+
return &net.IPNet{
1617+
IP: ip,
1618+
Mask: net.CIDRMask(0, 8*addLen),
1619+
}
1620+
}
1621+
return nil
1622+
}

route_test.go

Lines changed: 177 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,80 @@ func TestRouteAddDel(t *testing.T) {
7777
t.Fatal("Route not removed properly")
7878
}
7979

80+
// add default route test
81+
// equiv: default dev lo
82+
_, defaultDst, _ := net.ParseCIDR("0.0.0.0/0")
83+
route = Route{Dst: defaultDst, LinkIndex: link.Attrs().Index}
84+
if err := RouteAdd(&route); err != nil {
85+
t.Fatal(err)
86+
}
87+
routes, err = RouteList(link, FAMILY_V4)
88+
if err != nil {
89+
t.Fatal(err)
90+
}
91+
if len(routes) != 1 {
92+
t.Fatal("Dev default route not listed properly")
93+
}
94+
if err := RouteDel(&routes[0]); err != nil {
95+
t.Fatal(err)
96+
}
97+
routes, err = RouteList(link, FAMILY_V4)
98+
if err != nil {
99+
t.Fatal(err)
100+
}
101+
if len(routes) != 0 {
102+
t.Fatal("Dev default route not removed properly")
103+
}
104+
105+
// equiv: blackhole default
106+
route = Route{Dst: defaultDst, Type: unix.RTN_BLACKHOLE, Family: FAMILY_V4}
107+
if err := RouteAdd(&route); err != nil {
108+
t.Fatal(err)
109+
}
110+
routes, err = RouteList(nil, FAMILY_V4)
111+
if err != nil {
112+
t.Fatal(err)
113+
}
114+
t.Logf("%+v", routes)
115+
116+
if len(routes) != 1 {
117+
t.Fatal("Blackhole default route not listed properly")
118+
}
119+
120+
if err := RouteDel(&routes[0]); err != nil {
121+
t.Fatal(err)
122+
}
123+
routes, err = RouteList(nil, FAMILY_V4)
124+
if err != nil {
125+
t.Fatal(err)
126+
}
127+
if len(routes) != 0 {
128+
t.Fatal("Blackhole default route not removed properly")
129+
}
130+
131+
// equiv: prohibit default
132+
route = Route{Dst: defaultDst, Type: unix.RTN_PROHIBIT}
133+
if err := RouteAdd(&route); err != nil {
134+
t.Fatal(err)
135+
}
136+
routes, err = RouteList(nil, FAMILY_V4)
137+
if err != nil {
138+
t.Fatal(err)
139+
}
140+
if len(routes) != 1 {
141+
t.Fatal("Prohibit default route not listed properly")
142+
}
143+
144+
if err := RouteDel(&routes[0]); err != nil {
145+
t.Fatal(err)
146+
}
147+
routes, err = RouteList(nil, FAMILY_V4)
148+
if err != nil {
149+
t.Fatal(err)
150+
}
151+
if len(routes) != 0 {
152+
t.Fatal("Prohibit default route not removed properly")
153+
}
80154
}
81155

82156
func TestRoute6AddDel(t *testing.T) {
@@ -135,7 +209,7 @@ func TestRoute6AddDel(t *testing.T) {
135209
t.Fatal(err)
136210
}
137211

138-
// cleanup route and dummy interface created for the test
212+
// cleanup route
139213
if len(routeToDstIP) == 0 {
140214
t.Fatal("Route not present")
141215
}
@@ -149,6 +223,108 @@ func TestRoute6AddDel(t *testing.T) {
149223
if len(routes) != nroutes {
150224
t.Fatal("Route not removed properly")
151225
}
226+
227+
// add a default link route
228+
_, defaultDst, _ := net.ParseCIDR("::/0")
229+
route = Route{LinkIndex: link.Attrs().Index, Dst: defaultDst}
230+
if err := RouteAdd(&route); err != nil {
231+
t.Fatal(err)
232+
}
233+
routes, err = RouteList(link, FAMILY_V6)
234+
if err != nil {
235+
t.Fatal(err)
236+
}
237+
if len(routes) != nroutes+1 {
238+
t.Fatal("Default route not added properly")
239+
}
240+
241+
// add a default link route
242+
for _, route := range routes {
243+
if route.Dst.String() == defaultDst.String() {
244+
if err := RouteDel(&route); err != nil {
245+
t.Fatal(err)
246+
}
247+
}
248+
}
249+
routes, err = RouteList(link, FAMILY_V6)
250+
if err != nil {
251+
t.Fatal(err)
252+
}
253+
if len(routes) != nroutes {
254+
t.Fatal("Default route not removed properly")
255+
}
256+
257+
// add blackhole default link route
258+
routes, err = RouteList(nil, FAMILY_V6)
259+
if err != nil {
260+
t.Fatal(err)
261+
}
262+
nroutes = len(routes)
263+
264+
route = Route{Type: unix.RTN_BLACKHOLE, Dst: defaultDst}
265+
if err := RouteAdd(&route); err != nil {
266+
t.Fatal(err)
267+
}
268+
routes, err = RouteList(nil, FAMILY_V6)
269+
if err != nil {
270+
t.Fatal(err)
271+
}
272+
if len(routes) != nroutes+1 {
273+
t.Fatal("Blackhole default route not added properly")
274+
}
275+
276+
// add blackhole default link route
277+
for _, route := range routes {
278+
if ipNetEqual(route.Dst, defaultDst) {
279+
if err := RouteDel(&route); err != nil {
280+
t.Fatal(err)
281+
}
282+
}
283+
}
284+
routes, err = RouteList(nil, FAMILY_V6)
285+
if err != nil {
286+
t.Fatal(err)
287+
}
288+
if len(routes) != nroutes {
289+
t.Fatal("Blackhole default route not removed properly")
290+
}
291+
292+
// add prohibit default link route
293+
routes, err = RouteList(nil, FAMILY_V6)
294+
if err != nil {
295+
t.Fatal(err)
296+
}
297+
nroutes = len(routes)
298+
299+
route = Route{Type: unix.RTN_BLACKHOLE, Dst: defaultDst}
300+
if err := RouteAdd(&route); err != nil {
301+
t.Fatal(err)
302+
}
303+
routes, err = RouteList(nil, FAMILY_V6)
304+
if err != nil {
305+
t.Fatal(err)
306+
}
307+
if len(routes) != nroutes+1 {
308+
t.Fatal("Prohibit default route not added properly")
309+
}
310+
311+
// add prohibit default link route
312+
for _, route := range routes {
313+
if ipNetEqual(route.Dst, defaultDst) {
314+
if err := RouteDel(&route); err != nil {
315+
t.Fatal(err)
316+
}
317+
}
318+
}
319+
routes, err = RouteList(nil, FAMILY_V6)
320+
if err != nil {
321+
t.Fatal(err)
322+
}
323+
if len(routes) != nroutes {
324+
t.Fatal("Prohibit default route not removed properly")
325+
}
326+
327+
// cleanup dummy interface created for the test
152328
if err := LinkDel(link); err != nil {
153329
t.Fatal(err)
154330
}

0 commit comments

Comments
 (0)