Route slice

This commit is contained in:
Jim Colderwood 2024-04-10 16:33:33 +01:00
parent a00cc7da63
commit 83bbd52cee
4 changed files with 68 additions and 22 deletions

13
main.go
View File

@ -6,10 +6,12 @@ import (
"net"
"github.com/crip/ripv2"
"github.com/crip/ripv2/routes"
)
func main() {
rip := ripv2.New()
routes := routes.New()
addr := net.UDPAddr{
Port: 520,
IP: net.ParseIP("224.0.0.9"),
@ -36,14 +38,7 @@ func main() {
if err := rip.MParse(&buff, n); err != nil {
log.Fatalln(err)
}
/* Just testing the parsing output */
for i := 0; i < 24; i++ {
if rip.RIP[i].Metric == 0 {
break
}
fmt.Printf("%d\t%s\t%s\t%s\t%d\n", rip.RIP[i].AFI, rip.RIP[i].Addr.String(), rip.RIP[i].Subnet.String(), rip.RIP[i].Nexthop.String(), rip.RIP[i].Metric)
}
fmt.Println("")
routes.ParseRoutes(*UDPAddr, &rip.RIP)
fmt.Println(routes)
}
}

View File

@ -21,16 +21,15 @@ func (m *Message) MParse(b *[]byte, n int) error {
return errors.New("rip table exceeds limit")
}
data := (*b)
m.Command = Command(data[0])
m.Version = Version(data[1])
m.Command = Command((*b)[0])
m.Version = Version((*b)[1])
if m.Version > RIPv2 {
return errors.New("unknown version")
}
var indexA, indexB = 4, 25
ripentry := data[indexA:indexB]
ripentry := (*b)[indexA:indexB]
switch m.Command {
case REQUEST:
return nil
@ -38,13 +37,13 @@ func (m *Message) MParse(b *[]byte, n int) error {
for i := 0; i < (n-4)/20; i++ {
m.RIP[i].AFI = binary.BigEndian.Uint16(ripentry[0:2])
m.RIP[i].RouteTag = binary.BigEndian.Uint16(ripentry[2:4])
m.RIP[i].Addr = net.IPv4(ripentry[4], ripentry[5], ripentry[6], ripentry[7])
m.RIP[i].Subnet = net.IPv4Mask(ripentry[8], ripentry[9], ripentry[10], ripentry[11])
m.RIP[i].Nexthop = net.IPv4(ripentry[12], ripentry[13], ripentry[14], ripentry[15])
m.RIP[i].Addr = binary.BigEndian.Uint32(ripentry[4:8]) //net.IPv4(ripentry[4], ripentry[5], ripentry[6], ripentry[7])
m.RIP[i].Subnet = binary.BigEndian.Uint32(ripentry[8:12]) //net.IPv4Mask(ripentry[8], ripentry[9], ripentry[10], ripentry[11])
m.RIP[i].Nexthop = binary.BigEndian.Uint32(ripentry[12:16]) //net.IPv4(ripentry[12], ripentry[13], ripentry[14], ripentry[15])
m.RIP[i].Metric = binary.BigEndian.Uint32(ripentry[16:20])
indexA += 20
indexB += 20
ripentry = data[indexA:indexB]
ripentry = (*b)[indexA:indexB]
}
default:
return errors.New("unknown command type")

54
ripv2/routes/routes.go Normal file
View File

@ -0,0 +1,54 @@
package routes
import (
"net"
"time"
"github.com/crip/ripv2"
)
type Routes []Route
type Route struct {
Addr net.IP
Subnet net.IPMask
Nexthop net.IP
Metric uint32
TTL time.Time
}
func New() Routes {
var routes Routes
return routes
}
func (r *Routes) append(route Route) {
*r = append(*r, route)
}
func (r *Routes) ParseRoutes(addr net.UDPAddr, rip *[25]ripv2.RIP) {
var route Route
for _, rip := range *rip {
/* if not af_inet */
if rip.AFI != 2 {
continue
}
if rip.Addr == 0 || rip.Subnet == 0 {
continue
}
route = Route{}
route.Addr = net.IPv4(byte(rip.Addr>>24), byte(rip.Addr>>16), byte(rip.Addr>>8), byte(rip.Addr))
route.Subnet = net.IPv4Mask(byte(rip.Subnet>>24), byte(rip.Subnet>>16), byte(rip.Subnet>>8), byte(rip.Subnet))
if rip.Nexthop == 0 {
route.Nexthop = addr.IP
} else {
route.Nexthop = net.IPv4(byte(rip.Nexthop>>24), byte(rip.Nexthop>>16), byte(rip.Nexthop>>8), byte(rip.Nexthop))
}
route.Metric = rip.Metric
route.TTL = time.Now()
r.append(route)
}
}

View File

@ -1,7 +1,5 @@
package ripv2
import "net"
type Command uint8
type Version uint8
@ -26,8 +24,8 @@ type Message struct {
type RIP struct {
AFI uint16
RouteTag uint16
Addr net.IP
Subnet net.IPMask
Nexthop net.IP
Addr uint32
Subnet uint32
Nexthop uint32
Metric uint32
}