This repository has been archived by the owner on Feb 26, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
proxy_dhcp.go
81 lines (69 loc) · 2.26 KB
/
proxy_dhcp.go
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
package servers
import (
"net"
"github.com/pojntfx/bofied/pkg/config"
"github.com/pojntfx/bofied/pkg/eventing"
"github.com/pojntfx/bofied/pkg/transcoding"
)
type ProxyDHCPServer struct {
UDPServer
}
func NewProxyDHCPServer(listenAddress string, advertisedIP string, configFileLocation string, eventHandler *eventing.EventHandler, pureConfig bool) *ProxyDHCPServer {
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)
},
},
}
}
func handleProxyDHCPPacket(conn *net.UDPConn, raddr *net.UDPAddr, _ *net.UDPAddr, rawIncomingUDPPacket []byte, advertisedIP net.IP, configFileLocation string, emit func(f string, v ...interface{}), pureConfig bool) (int, error) {
// Decode packet
incomingDHCPPacket, err := transcoding.DecodeDHCPPacket(rawIncomingUDPPacket)
if err != nil {
return 0, err
}
// Ignore non-PXE packets
if !incomingDHCPPacket.IsPXE {
return 0, nil
}
emit(
`handling proxyDHCP for client with IP %v, MAC %v, architecture %v and architecture ID %v`,
raddr.IP.String(),
incomingDHCPPacket.ClientHWAddr.String(),
config.GetNameForArchId(incomingDHCPPacket.Arch),
incomingDHCPPacket.Arch,
)
// Get the boot file name
bootFileName, err := config.GetFileName(
configFileLocation,
raddr.IP.String(),
incomingDHCPPacket.ClientHWAddr.String(),
config.GetNameForArchId(incomingDHCPPacket.Arch),
incomingDHCPPacket.Arch,
pureConfig,
func(s string) {
if s != "" {
emit("from config: %v", s)
}
},
)
if err != nil {
emit("could not process config: %v", err)
return 0, err
}
// Encode packet
outgoingDHCPPacket := transcoding.EncodeProxyDHCPPacket(
incomingDHCPPacket.ClientHWAddr,
incomingDHCPPacket.Xid,
advertisedIP,
incomingDHCPPacket.ClientIdentifierOpt,
raddr.IP.To4(),
bootFileName,
)
emit(`sending %v bytes of proxyDHCP packets to client "%v"`, len(outgoingDHCPPacket), raddr)
// Send the packet to the client
return conn.WriteToUDP(outgoingDHCPPacket, raddr)
}