refactoring
This commit is contained in:
parent
36b6ad3b33
commit
210141b8d5
8
main.go
8
main.go
@ -1,11 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/crip/config"
|
"github.com/crip/config"
|
||||||
"github.com/crip/ripv2"
|
"github.com/crip/ripv2"
|
||||||
"github.com/crip/rtable"
|
"github.com/crip/rtable"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func callback(r *ripv2.Routes) {
|
func callback(r *ripv2.Routes) {
|
||||||
@ -17,8 +16,9 @@ func main() {
|
|||||||
rip := ripv2.New()
|
rip := ripv2.New()
|
||||||
routes := ripv2.Init()
|
routes := ripv2.Init()
|
||||||
|
|
||||||
log.Println("Running")
|
|
||||||
routes.Timer()
|
routes.Timer()
|
||||||
rip.Run(conf, callback)
|
if err := rip.Run(conf, callback); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
/* NOT REACHED */
|
/* NOT REACHED */
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ func (m *Message) MParse(b *[]byte, n int) error {
|
|||||||
m.RIP[i].RouteTag = binary.BigEndian.Uint16(ripentry[2:4])
|
m.RIP[i].RouteTag = binary.BigEndian.Uint16(ripentry[2:4])
|
||||||
m.RIP[i].Addr = binary.BigEndian.Uint32(ripentry[4:8])
|
m.RIP[i].Addr = binary.BigEndian.Uint32(ripentry[4:8])
|
||||||
m.RIP[i].Subnet = binary.BigEndian.Uint32(ripentry[8:12])
|
m.RIP[i].Subnet = binary.BigEndian.Uint32(ripentry[8:12])
|
||||||
m.RIP[i].Nexthop = binary.BigEndian.Uint32(ripentry[12:16])
|
m.RIP[i].NextHop = binary.BigEndian.Uint32(ripentry[12:16])
|
||||||
m.RIP[i].Metric = binary.BigEndian.Uint32(ripentry[16:20])
|
m.RIP[i].Metric = binary.BigEndian.Uint32(ripentry[16:20])
|
||||||
indexA += 20
|
indexA += 20
|
||||||
indexB += 20
|
indexB += 20
|
||||||
@ -59,7 +59,7 @@ func (m *Message) MParse(b *[]byte, n int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Message) Run(c *config.Config, callback func(*Routes)) {
|
func (m *Message) Run(c *config.Config, callback func(*Routes)) error {
|
||||||
iface := net.Interface{
|
iface := net.Interface{
|
||||||
Name: c.MulticastInterface,
|
Name: c.MulticastInterface,
|
||||||
Flags: net.FlagMulticast,
|
Flags: net.FlagMulticast,
|
||||||
@ -70,9 +70,13 @@ func (m *Message) Run(c *config.Config, callback func(*Routes)) {
|
|||||||
}
|
}
|
||||||
conn, err := net.ListenMulticastUDP("udp4", &iface, &addr)
|
conn, err := net.ListenMulticastUDP("udp4", &iface, &addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
return err
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer func() {
|
||||||
|
if err := conn.Close(); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
sigs := make(chan os.Signal, 1)
|
sigs := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||||
@ -82,15 +86,17 @@ func (m *Message) Run(c *config.Config, callback func(*Routes)) {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
go func() {
|
go func() {
|
||||||
sig := <-sigs
|
log.Println("Running")
|
||||||
fmt.Println(sig)
|
<-sigs
|
||||||
fmt.Println("exit")
|
log.Println("exit")
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
n, UDPAddr, err := conn.ReadFromUDP(buffer)
|
n, UDPAddr, err := conn.ReadFromUDP(buffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
conn.Close()
|
if err = conn.Close(); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
log.Fatal("unable to read from socket")
|
log.Fatal("unable to read from socket")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,8 +109,8 @@ func (m *Message) Run(c *config.Config, callback func(*Routes)) {
|
|||||||
}
|
}
|
||||||
routes.ParseRoutes(*UDPAddr, &m.RIP)
|
routes.ParseRoutes(*UDPAddr, &m.RIP)
|
||||||
for _, v := range routes.Routes {
|
for _, v := range routes.Routes {
|
||||||
fmt.Printf("Route:%s\tSubnet:%s\tNexthop:%s\tMetric:%d\tTime: %v\n", v.Addr.String(), v.Subnet.String(), v.Nexthop.String(), v.Metric, v.TTL.Unix())
|
fmt.Printf("Route:%s\tSubnet:%s\tNexthop:%s\tMetric:%d\tTime: %v\n", v.Addr.String(), v.Subnet.String(), v.NextHop.String(), v.Metric, v.TTL.Unix())
|
||||||
}
|
}
|
||||||
(callback(routes))
|
callback(routes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ type Route struct {
|
|||||||
Addr net.IP
|
Addr net.IP
|
||||||
FIB FIB
|
FIB FIB
|
||||||
Subnet net.IPMask
|
Subnet net.IPMask
|
||||||
Nexthop net.IP
|
NextHop net.IP
|
||||||
Metric uint32
|
Metric uint32
|
||||||
TTL time.Time
|
TTL time.Time
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ func Init() *Routes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Routes) append(route Route) {
|
func (r *Routes) append(route Route) {
|
||||||
key := route.Addr.String() + route.Subnet.String() + route.Nexthop.String() + fmt.Sprintf("%d", route.Metric)
|
key := route.Addr.String() + route.Subnet.String() + route.NextHop.String() + fmt.Sprintf("%d", route.Metric)
|
||||||
h := sha256.New()
|
h := sha256.New()
|
||||||
h.Write([]byte(key))
|
h.Write([]byte(key))
|
||||||
bs := h.Sum(nil)
|
bs := h.Sum(nil)
|
||||||
@ -60,10 +60,10 @@ func (r *Routes) ParseRoutes(addr net.UDPAddr, rip *[]RIP) {
|
|||||||
|
|
||||||
route.Addr = net.IPv4(byte(rip.Addr>>24), byte(rip.Addr>>16), byte(rip.Addr>>8), byte(rip.Addr))
|
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))
|
route.Subnet = net.IPv4Mask(byte(rip.Subnet>>24), byte(rip.Subnet>>16), byte(rip.Subnet>>8), byte(rip.Subnet))
|
||||||
if rip.Nexthop == 0 {
|
if rip.NextHop == 0 {
|
||||||
route.Nexthop = addr.IP
|
route.NextHop = addr.IP
|
||||||
} else {
|
} else {
|
||||||
route.Nexthop = net.IPv4(byte(rip.Nexthop>>24), byte(rip.Nexthop>>16), byte(rip.Nexthop>>8), byte(rip.Nexthop))
|
route.NextHop = net.IPv4(byte(rip.NextHop>>24), byte(rip.NextHop>>16), byte(rip.NextHop>>8), byte(rip.NextHop))
|
||||||
}
|
}
|
||||||
route.Metric = rip.Metric
|
route.Metric = rip.Metric
|
||||||
route.TTL = time.Now()
|
route.TTL = time.Now()
|
||||||
|
@ -33,6 +33,6 @@ type RIP struct {
|
|||||||
RouteTag uint16
|
RouteTag uint16
|
||||||
Addr uint32
|
Addr uint32
|
||||||
Subnet uint32
|
Subnet uint32
|
||||||
Nexthop uint32
|
NextHop uint32
|
||||||
Metric uint32
|
Metric uint32
|
||||||
}
|
}
|
||||||
|
@ -10,14 +10,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Pass(r *ripv2.Routes) {
|
func Pass(r *ripv2.Routes) {
|
||||||
|
var err error
|
||||||
r.Lock()
|
r.Lock()
|
||||||
for k, route := range r.Routes {
|
for k, route := range r.Routes {
|
||||||
switch route.FIB {
|
switch route.FIB {
|
||||||
case ripv2.NEW:
|
case ripv2.NEW:
|
||||||
command(ADD, &route)
|
if err = command(ADD, &route); err != nil {
|
||||||
|
log.Printf("rtable: failed to add route %d: %s", route.FIB, err)
|
||||||
|
}
|
||||||
route.FIB = ripv2.TABLE
|
route.FIB = ripv2.TABLE
|
||||||
case ripv2.DELETE:
|
case ripv2.DELETE:
|
||||||
command(REMOVE, &route)
|
if err = command(REMOVE, &route); err != nil {
|
||||||
|
log.Printf("rtable: failed to remove route %d: %s", route.FIB, err)
|
||||||
|
}
|
||||||
delete(r.Routes, k)
|
delete(r.Routes, k)
|
||||||
default:
|
default:
|
||||||
log.Println("unknown FIB type")
|
log.Println("unknown FIB type")
|
||||||
@ -30,7 +35,7 @@ func command(command COMMAND, r *ripv2.Route) error {
|
|||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
switch command {
|
switch command {
|
||||||
case ADD, REMOVE:
|
case ADD, REMOVE:
|
||||||
cmd = exec.Command("route", string(command), "-net", r.Addr.String(), r.Subnet.String(), r.Nexthop.String(), "-hopcount", fmt.Sprint(r.Metric))
|
cmd = exec.Command("route", string(command), "-net", r.Addr.String(), r.Subnet.String(), r.NextHop.String(), "-hopcount", fmt.Sprint(r.Metric))
|
||||||
default:
|
default:
|
||||||
return errors.New("command not supported")
|
return errors.New("command not supported")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user