Skip to content
This repository has been archived by the owner on Feb 26, 2023. It is now read-only.

Commit

Permalink
Merge pull request #10 from pojntfx/support-vlan
Browse files Browse the repository at this point in the history
Add VLAN support
  • Loading branch information
pojntfx committed Jun 13, 2021
2 parents 436fbf9 + fb35672 commit 374d694
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -14,7 +14,7 @@ frontend:
build: backend frontend

release-backend:
CGO_ENABLED=1 go build -ldflags="-extldflags=-static" -tags netgo -o out/release/bofied-backend/bofied-backend.linux-$$(uname -m) cmd/bofied-backend/main.go
CGO_ENABLED=0 go build -ldflags="-extldflags=-static" -tags netgo -o out/release/bofied-backend/bofied-backend.linux-$$(uname -m) cmd/bofied-backend/main.go

release-frontend: frontend
rm -rf out/release/bofied-frontend
Expand Down
1 change: 1 addition & 0 deletions pkg/servers/dhcp.go
Expand Up @@ -20,6 +20,7 @@ func NewDHCPServer(listenAddress string, advertisedIP string, eventHandler *even
return &DHCPServer{
UDPServer: UDPServer{
listenAddress: listenAddress,
advertisedIP: advertisedIP,
handlePacket: func(conn *net.UDPConn, _ *net.UDPAddr, braddr *net.UDPAddr, rawIncomingUDPPacket []byte) (int, error) {
return handleDHCPPacket(conn, braddr, rawIncomingUDPPacket, net.ParseIP(advertisedIP).To4(), eventHandler.Emit)
},
Expand Down
1 change: 1 addition & 0 deletions pkg/servers/proxy_dhcp.go
Expand Up @@ -16,6 +16,7 @@ func NewProxyDHCPServer(listenAddress string, advertisedIP string, configFileLoc
return &ProxyDHCPServer{
UDPServer: UDPServer{
listenAddress: listenAddress,
advertisedIP: advertisedIP,
handlePacket: func(conn *net.UDPConn, raddr *net.UDPAddr, braddr *net.UDPAddr, rawIncomingUDPPacket []byte) (int, error) {
return handleProxyDHCPPacket(conn, raddr, braddr, rawIncomingUDPPacket, net.ParseIP(advertisedIP).To4(), configFileLocation, eventHandler.Emit, pureConfig)
},
Expand Down
52 changes: 50 additions & 2 deletions pkg/servers/udp_server.go
@@ -1,8 +1,11 @@
package servers

import (
"errors"
"log"
"net"

"github.com/pojntfx/bofied/pkg/utils"
)

const (
Expand All @@ -11,6 +14,7 @@ const (

type UDPServer struct {
listenAddress string
advertisedIP string
handlePacket func(conn *net.UDPConn, raddr *net.UDPAddr, braddr *net.UDPAddr, rawIncomingUDPPacket []byte) (int, error)
}

Expand All @@ -20,9 +24,53 @@ func (s *UDPServer) ListenAndServe() error {
if err != nil {
return err
}
braddr, err := net.ResolveUDPAddr("udp", "255.255.255.255:68")

aaddr, err := net.ResolveIPAddr("ip", s.advertisedIP)
if err != nil {
return err
}

// Get all interfaces
ifaces, err := net.Interfaces()
if err != nil {
return err
}

// Find the broadcast address of the interface with the advertised IP
broadcastIP := ""
ifaceLoop:
for _, iface := range ifaces {
addrs, err := iface.Addrs()
if err != nil {
return err
}

for _, addr := range addrs {
ipnet, ok := addr.(*net.IPNet)
if !ok {
continue
}

if ipnet.IP.Equal(aaddr.IP) {
broadcastIP, err = utils.GetBroadcastAddress(ipnet)
if err != nil {
return err
}

break ifaceLoop
}
}
}

// Return if no interface with the advertised IP could be found
if broadcastIP == "" {
return errors.New("could not resolve broadcast IP")
}

// Construct the broadcast address
braddr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(broadcastIP, "68"))
if err != nil {
log.Fatal(err)
return err
}

// Listen
Expand Down
26 changes: 26 additions & 0 deletions pkg/utils/ip.go
@@ -0,0 +1,26 @@
package utils

import (
"net"
)

// Based on https://gist.github.com/kotakanbe/d3059af990252ba89a82
func GetBroadcastAddress(ipnet *net.IPNet) (string, error) {
ips := []string{}
for ip := ipnet.IP.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {
ips = append(ips, ip.String())
}

// The last address is the broadcast address
return ips[len(ips)-1], nil
}

// See http://play.golang.org/p/m8TNTtygK0
func inc(ip net.IP) {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
}

0 comments on commit 374d694

Please sign in to comment.