@@ -14,10 +14,16 @@ import (
14
14
"code.local/dhcp-relay/specs"
15
15
)
16
16
17
- func HandleDHCPv4GenericReplyRaw (
17
+ const (
18
+ UnicastReply uint8 = 0
19
+ BroadcastReply uint8 = 1
20
+ )
21
+
22
+ func HandleDHCPv4GenericReply (
18
23
cfg * HandleOptions ,
19
24
dhcpMessageType string ,
20
25
layerDHCPv4 * layers.DHCPv4 ,
26
+ replyType uint8 ,
21
27
) error {
22
28
srcIP := layerDHCPv4 .RelayAgentIP .To4 ()
23
29
if srcIP == nil || srcIP .IsLoopback () || srcIP .Equal (net .IPv4zero ) || srcIP .Equal (net .IPv4bcast ) {
@@ -61,8 +67,6 @@ func HandleDHCPv4GenericReplyRaw(
61
67
Flags : layers .IPv4DontFragment ,
62
68
TTL : cfg .ReplyTTL ,
63
69
Protocol : layers .IPProtocolUDP ,
64
- SrcIP : srcIP .To4 (),
65
- DstIP : layerDHCPv4 .YourClientIP .To4 (),
66
70
}
67
71
68
72
layerUDP := & layers.UDP {
@@ -84,7 +88,17 @@ func HandleDHCPv4GenericReplyRaw(
84
88
layerDHCPv4 .RelayAgentIP = nil
85
89
}
86
90
87
- dhcp .SetUnicast (layerDHCPv4 )
91
+ if replyType == UnicastReply {
92
+ layerIPv4 .SrcIP = srcIP .To4 ()
93
+ layerIPv4 .DstIP = layerDHCPv4 .YourClientIP .To4 ()
94
+
95
+ dhcp .SetUnicast (layerDHCPv4 )
96
+ } else if replyType == BroadcastReply {
97
+ layerIPv4 .SrcIP = net .IPv4zero
98
+ layerIPv4 .DstIP = net .IPv4bcast
99
+
100
+ dhcp .SetBroadcast (layerDHCPv4 )
101
+ }
88
102
89
103
buffer := gopacket .NewSerializeBuffer ()
90
104
@@ -124,10 +138,10 @@ func HandleDHCPv4GenericReplyRaw(
124
138
cl .Infof ("%s 0x%x: DHCP-%s [%d], IfIndex=%d, Src=%s, Dst=%s\n " ,
125
139
logDataOutPrefix , layerDHCPv4 .Xid , dhcpMessageType , layerDHCPv4 .Len (), ifIndex ,
126
140
net .JoinHostPort (
127
- srcIP . To4 () .String (), strconv .Itoa (specs .DHCPv4ServerPort ),
141
+ layerIPv4 . SrcIP .String (), strconv .Itoa (specs .DHCPv4ServerPort ),
128
142
),
129
143
net .JoinHostPort (
130
- layerDHCPv4 . YourClientIP . To4 () .String (), strconv .Itoa (specs .DHCPv4ClientPort ),
144
+ layerIPv4 . DstIP .String (), strconv .Itoa (specs .DHCPv4ClientPort ),
131
145
),
132
146
)
133
147
0 commit comments