Skip to content

0xHazard/govrrp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lightweight VRRPv3 library

CircleCI

This library implements VRRPv3 in accordance with rfc5798

Installation

Simply run go get -u github.com/ep4eg/govrrp

Example

connection

	...
	// IP addresses we want to advertise
	advertAddresses := []net.IP{
		net.IPv4(192, 165, 55, 55),
		net.IPv4(192, 165, 44, 33),
	}

	// Get default network interface and its IP address. You can define these manually.
	iface, err := govrrp.GetInterface()
	if err != nil {
		// Error handling
	}

	localIPaddr, err := govrrp.GetPrimaryIPv4addr(iface)
	if err != nil {
		// Error handling
	}

	multicastGroup := &net.IPAddr{IP: govrrp.McastGroup}

	// Create socket and listen multicast
	c, err := net.ListenPacket("ip4:"+strconv.Itoa(govrrp.ProtoNumber), multicastGroup.String())
	if err != nil {
		// Error handling
	}

	// Join multicast group. x/net/ipv4 used for simplicity, the same can be implemented with raw sockets.
	p := ipv4.NewPacketConn(c)
	if err != nil {
		// Error handling
	}

	if err := p.JoinGroup(iface, multicastGroup); err != nil {
		// Error handling
	}

	defer func() {
		p.LeaveGroup(iface, multicastGroup)
		p.Close()
	}()
	...

Sender

	...
	// Craft VRRP packet
	packet, err := govrrp.NewVRRPpacket(localIPaddr, govrrp.McastGroup, 3, 255, advertAddresses)
	if err != nil {
		// Error handling
	}

	for i := 0; i < 10; i++ {
		// Write the packet to socket
		if _, err := p.WriteTo(packet, nil, multicastGroup); err != nil {
			panic(err)
		}
		time.Sleep(1 * time.Second)
	}
	...
    

Reciever

	...
	for {
		// Read from socket
		buf := make([]byte, 1500)
		rLen, _, _, err := p.ReadFrom(buf)
		if err != nil {
			panic(err)
		}
		msg := govrrp.Message{}
		msg.Unmarshal(buf[:rLen])
		fmt.Printf("Advertised IP addresses: %v\n", msg.IPv4addresses)
	}
	...