Skip to content

Commit 8d2fb0b

Browse files
ipchamaipchama
andauthored
Added an option for passing a seed for mac generation. (#21)
* Added an option for passing a seed for mac generation. * Better option message * Changes for linter. Some annoying. Some reasonable. * Missed a spot Co-authored-by: ipchama <[email protected]>
1 parent ccf88da commit 8d2fb0b

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

cmd/dhcpv4.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func prepareCmd(cmd *cobra.Command) *cobra.Command {
2828
cmd.Flags().Int("rps", 0, "Max number of packets per second. 0 == unlimited.")
2929
cmd.Flags().Int("maxlife", 0, "How long to run. 0 == forever")
3030
cmd.Flags().Int("mac-count", 1, "Total number of MAC addresses to use. If the 'mac' option is used, mac-count - number of mac will be used to pad with additional pre-generated MAC addresses.")
31+
cmd.Flags().Int64("mac-seed", 0, "Optional seed to use for generating MAC addresses. This is mainly for when you want the same 'random' MACs every time.")
3132
cmd.Flags().StringArray("mac", []string{}, "Optionally specified MAC address to be used for requesting leases. Can be used multiple times.")
3233

3334
cmd.Flags().Int("stats-rate", 5, "How frequently to update stat calculations. (seconds).")
@@ -125,10 +126,12 @@ func arp(n string, l netlink.Link, i net.IP) (net.HardwareAddr, error) {
125126
}
126127
buf := gopacket.NewSerializeBuffer()
127128

128-
gopacket.SerializeLayers(buf, goPacketSerializeOpts,
129+
if err := gopacket.SerializeLayers(buf, goPacketSerializeOpts,
129130
ethernetLayer,
130131
arpLayer,
131-
)
132+
); err != nil {
133+
panic(err)
134+
}
132135

133136
s.AddPayload(buf.Bytes())
134137

@@ -157,7 +160,7 @@ func arp(n string, l netlink.Link, i net.IP) (net.HardwareAddr, error) {
157160
wg.Wait()
158161

159162
if !ok {
160-
return nil, errors.New("Failed to get ARP response for default gateway probe during init.")
163+
return nil, errors.New("failed to get ARP response for default gateway probe during init")
161164
}
162165

163166
return gwMac, nil
@@ -187,6 +190,7 @@ func init() {
187190
options.RequestsPerSecond = getVal(cmd.Flags().GetInt("rps")).(int)
188191
options.MaxLifetime = getVal(cmd.Flags().GetInt("maxlife")).(int)
189192
options.MacCount = getVal(cmd.Flags().GetInt("mac-count")).(int)
193+
options.MacSeed = getVal(cmd.Flags().GetInt64("mac-seed")).(int64)
190194
options.SpecifiedMacs = getVal(cmd.Flags().GetStringArray("mac")).([]string)
191195

192196
if options.MacCount <= 0 && len(options.SpecifiedMacs) == 0 {

config/dhcpv4.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type DhcpV4Options struct {
2929

3030
MacCount int
3131
SpecifiedMacs []string
32+
MacSeed int64
3233

3334
StatsRate int
3435
}

generator/dhcpv4.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (g *GeneratorV4) DeInit() error {
6363

6464
func (g *GeneratorV4) Stop() error {
6565
g.finishChannel <- struct{}{}
66-
_, _ = <-g.doneChannel
66+
<-g.doneChannel
6767
return nil
6868
}
6969

@@ -177,30 +177,31 @@ func (g *GeneratorV4) Run() {
177177
sent := 0
178178

179179
start := time.Now()
180-
time.Sleep(1)
180+
time.Sleep(1 * time.Nanosecond)
181181

182182
mRps := g.options.RequestsPerSecond
183183

184184
var t time.Time
185185
var elapsed float64
186186
var rps int
187187

188+
var err error
188189
g.addLog("Finished generating MACs and preparing packet headers.")
189190

190191
for g.options.MaxLifetime == 0 || int(elapsed) <= g.options.MaxLifetime {
191192

192193
select {
193-
case _, _ = <-g.finishChannel:
194+
case <-g.finishChannel:
194195
close(g.doneChannel)
195196
return
196197
default:
197198
}
198199

199200
select {
200-
case mRps, _ = <-g.rpsChannel:
201+
case mRps = <-g.rpsChannel:
201202
sent = 0
202203
start = time.Now()
203-
time.Sleep(1)
204+
time.Sleep(1 * time.Nanosecond) // Being explict...
204205
default:
205206
}
206207

@@ -218,15 +219,20 @@ func (g *GeneratorV4) Run() {
218219

219220
//ethernetLayer.SrcMAC = macs[i]
220221

222+
// I refuse to even assign to _ ...
223+
// skipcq
221224
udpLayer.SetNetworkLayerForChecksum(ipLayer)
222225

223226
buf := gopacket.NewSerializeBuffer()
224-
gopacket.SerializeLayers(buf, opts,
227+
if err = gopacket.SerializeLayers(buf, opts,
225228
ethernetLayer,
226229
ipLayer,
227230
udpLayer,
228231
outDhcpLayer,
229-
)
232+
); err != nil {
233+
g.addError(err)
234+
continue
235+
}
230236

231237
if g.sendPayload(buf.Bytes()) {
232238
g.addStat(stats.DiscoverSentStat)
@@ -242,7 +248,14 @@ func (g *GeneratorV4) Run() {
242248
}
243249

244250
func (g *GeneratorV4) generateMacList() []net.HardwareAddr {
245-
nS := rand.NewSource(time.Now().Unix())
251+
252+
seed := g.options.MacSeed
253+
254+
if seed == 0 {
255+
seed = time.Now().Unix()
256+
}
257+
258+
nS := rand.NewSource(seed)
246259
nRand := rand.New(nS)
247260

248261
macs := make([]net.HardwareAddr, 0)

0 commit comments

Comments
 (0)