-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbasic_example.go
More file actions
142 lines (123 loc) · 3.03 KB
/
Copy pathbasic_example.go
File metadata and controls
142 lines (123 loc) · 3.03 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"fmt"
"net/netip"
"github.com/MuriloChianfa/liblpm/go/liblpm"
)
func main() {
// Create an IPv4 routing table
table, err := liblpm.NewTableIPv4()
if err != nil {
panic(err)
}
defer table.Close()
// Add some routes
routes := []struct {
prefix string
nextHop liblpm.NextHop
name string
}{
{"10.0.0.0/8", 100, "Private Network A"},
{"192.168.0.0/16", 200, "Private Network C"},
{"172.16.0.0/12", 300, "Private Network B"},
{"8.8.8.0/24", 400, "Google DNS"},
}
fmt.Println("Adding routes to table:")
for _, route := range routes {
prefix := netip.MustParsePrefix(route.prefix)
err := table.Insert(prefix, route.nextHop)
if err != nil {
fmt.Printf(" Error adding %s: %v\n", route.prefix, err)
} else {
fmt.Printf(" Added: %s -> next hop %d (%s)\n", route.prefix, route.nextHop, route.name)
}
}
// Perform some lookups
fmt.Println("\nPerforming lookups:")
lookupAddrs := []string{
"10.1.1.1",
"192.168.1.1",
"172.16.5.10",
"8.8.8.8",
"1.1.1.1", // No match
}
for _, addrStr := range lookupAddrs {
addr := netip.MustParseAddr(addrStr)
nextHop, found := table.Lookup(addr)
if found {
// Find the route name
routeName := "Unknown"
for _, route := range routes {
if uint32(route.nextHop) == uint32(nextHop) {
routeName = route.name
break
}
}
fmt.Printf(" %s -> next hop %d (%s)\n", addrStr, nextHop, routeName)
} else {
fmt.Printf(" %s -> No route found\n", addrStr)
}
}
// Demonstrate batch lookup
fmt.Println("\nBatch lookup example:")
batchAddrs := []netip.Addr{
netip.MustParseAddr("10.1.1.1"),
netip.MustParseAddr("192.168.1.1"),
netip.MustParseAddr("172.16.5.10"),
netip.MustParseAddr("1.1.1.1"),
}
results, err := table.LookupBatch(batchAddrs)
if err != nil {
panic(err)
}
for i, addr := range batchAddrs {
if results[i].IsValid() {
fmt.Printf(" %s -> next hop %d\n", addr, results[i])
} else {
fmt.Printf(" %s -> No route\n", addr)
}
}
// IPv6 example
fmt.Println("\n--- IPv6 Example ---")
tableV6, err := liblpm.NewTableIPv6()
if err != nil {
panic(err)
}
defer tableV6.Close()
// Add IPv6 routes
ipv6Routes := []struct {
prefix string
nextHop liblpm.NextHop
}{
{"2001:db8::/32", 1000},
{"2001:db9::/32", 2000},
{"fc00::/7", 3000}, // ULA
}
fmt.Println("Adding IPv6 routes:")
for _, route := range ipv6Routes {
prefix := netip.MustParsePrefix(route.prefix)
err := tableV6.Insert(prefix, route.nextHop)
if err != nil {
fmt.Printf(" Error adding %s: %v\n", route.prefix, err)
} else {
fmt.Printf(" Added: %s -> next hop %d\n", route.prefix, route.nextHop)
}
}
// IPv6 lookups
fmt.Println("\nIPv6 lookups:")
ipv6Addrs := []string{
"2001:db8::1",
"2001:db9::1",
"fc00::1",
"2001:dba::1", // No match
}
for _, addrStr := range ipv6Addrs {
addr := netip.MustParseAddr(addrStr)
nextHop, found := tableV6.Lookup(addr)
if found {
fmt.Printf(" %s -> next hop %d\n", addrStr, nextHop)
} else {
fmt.Printf(" %s -> No route found\n", addrStr)
}
}
}