# You shouldn't need to edit anything beyond this point.
#############################################################
-FEW_TARGETS= on-dest.sh \
+SCRIPT_TARGETS= on-dest.sh monitor.sh
+
+FEW_TARGETS= $(SCRIPT_TARGETS) \
send-1.pcap send-1.log send-1.why
TARGETS= $(FEW_TARGETS) \
INFORM= @echo ' GENERATED THESE FILES:'; \
echo ' $^'
+SOURCE_IP= $(shell expr $(SOURCE) : '\([0-9.]*\)/')
+DEST_IP= $(shell expr $(DEST) : '\([0-9.]*\)/')
+
all: $(TARGETS)
$(INFORM)
few: $(FEW_TARGETS)
$(INFORM)
+scripts: $(SCRIPT_TARGETS)
+ $(INFORM)
+
anal analyse: $(AN_TARGETS)
$(INFORM)
send-%.pcap send-%.why: ./make-probes.tcl Makefile
./make-probes.tcl --write $@ --mtu $(MTU) --upto $(PERPART) \
--source $(SOURCE) \
- --dest $(DEST) \
+ --dest $(DEST) \
--xseed "$* $(UNIQUE)" >send-$*.why
%.log: %.pcap lnumber-tcpdump.pl Makefile
recv-%.diff: send-%.log recv-%.log
diff -uI'^[0-9]' $^ >$@ || test $$? == 1
-on-dest.sh: Makefile
- @rm -f $@
- echo >$@ "#!/bin/sh"
- @echo >>$@ "# run this script on $(DEST) as root, saying:"
- @echo >>$@ "# ./on-dest.sh PART"
- @echo >>$@ "# where PART ranges from 1 to $(PARTS)"
- @echo >>$@ "if ! [ \$$# = 1 ]; then echo >&2 'PART?'; exit 1; fi"
- @echo >>$@ "exec tcpdump -s$$(($(MTU)+500)) -w recv-\$$1.pcap \\"
- @echo >>$@ " src host $(SOURCE) and dst host $(DEST)"
- chmod +x $@
+%.sh: %.template Makefile
+ sed <$< >$@.tmp -e ' \
+ s/@@M/'$$(($(MTU)+500))'/; \
+ s/@@S/$(SOURCE_IP)/; \
+ s/@@D/$(DEST_IP)/'
+ chmod +x $@.tmp
+ @mv -f $@.tmp $@
clean:
rm -f *.tmp *~ t u v
If you want to do a quick test first, you can say
`make few' first, instead.
* Copy send-1.pcap and send-all.pcap to the sending machine.
- * Copy on-dest.sh to the to the receiving machine.
+ * Copy on-dest.sh and monitor.sh to the to the receiving machine.
2. Run the first, small test
* On the receiving machine, say, as root,
- ./on-dest.sh 1
- and leave it running.
+ ./on-dest.sh 1 [-i <interface>]
+ and leave it running. Also, in a nice big window, say
+ ./monitor.sh [-i <interface>]
+ and leave that running too. The default interface is
+ the one that tcpdump picks by default.
* On the sending machine, say, as root,
- tcpreplay -m 1 <send-1.pcap
- The -m 1 option makes tcpreplay send the packets at one a
- second (they are generated as if they were captured at one
- a second); this avoids flooding the network, which causes
- congestion, packet loss and maybe other randomness.
- This will take (by default) 100 seconds.
- * When it has finished, kill on-dest.sh. Copy the
- file recv-1.pcap back to your analysis machine, and
- there say `make analyse' (or `make anal' if you prefer).
+ tcpreplay -m 1 <send-1.pcap [-i <interface>]
+ You should see the results in your monitoring window.
+ This will take (by default) 100 seconds. The -m 1 option
+ makes tcpreplay send the packets at one a second (they are
+ generated as if they were captured at one a second); this
+ avoids flooding the network, which causes congestion,
+ packet loss and maybe other randomness.
+ * When it has finished, kill on-dest.sh and monitor.sh.
+ Copy the file recv-1.pcap back to your analysis machine, and
+ there say `make anal'.
* This will generate `recv-1.log' and `recv-1.diff'.
Read the diff and see if it's by and large working.
See below for information about interpreting the various files.
send-X.why The generator's explanations (ha ha) of
what the test data is
on-dest.sh Script for running tcpdump on the destination
+ to capture the packets as they come in
+ monitor.sh Script for running tcpdump on either end
+ for monitoring how it's going
You really want to be paying attention to the ones where
- X is `1' and `all'. The others, 2 onwards, are all in
- `all' and it'll be easier to take them all at once.
+ X is `1' and `all'. `all' contains all the numbered parts,
+ and it'll be easier to do them all at once.
Those supposedly captured at the destination
recv-X.pcap `pcap' format raw received packets
packet numbers. You can use the numbers marked with `-' to find the
corresponding packet in the other files. Ignore the numbers marked
with `+', they aren't useful. In this case, it's packet 5 that's
-missing. So, we can look in send-1.why or send-rest.why, as
+missing. So, we can look in send-1.why or send-all.why, as
appropriate, and see this:
1 5 tos=0xe7 id=30130 df (!any) proto=icmp[1] \
}
proc get/ip-timestamp {s v} {
- set rv [expr {[clock seconds] | 0x80000000}]
+ set rv 0xbc000000
+ incr rv [choice-int 100 10000]
getlog "$v=[format %x $rv]"
return $rv
}
proc emit {seed} {
global getlog_log errorInfo mtu fake_time_t
- global minframelen linktypename
+ global minframelen linktypename errors_continue
get-for ip
get-config source 127.0.0.1 v4addr
} emsg]} {
puts stderr "\nERROR\n$seed\n\n$emsg\n\n$errorInfo\n\n"
puts stdout "[format %6s $seed] error"
+ if {!$errors_continue} {
+ error "internal error generating packet - consult author"
+ }
} else {
set ts_sec [incr fake_time_t]
set ts_usec 0
}
set debug_level 0
+set errors_continue 0
set mtu 100
set upto {}
set xseed {}
--write { pcap_open [nextarg] }
--mtu { set mtu [nextarg_num] }
--xseed { set xseed [nextarg] }
+ --errors-continue { set errors_continue 1 }
--linktype { set linktypename [nextarg] }
--source { manyset [nextarg_il] config/ip-source config/link-source }
--dest { manyset [nextarg_il] config/ip-dest config/link-dest }
s32 linktype
}
-set fake_time_t [clock seconds]
+set fake_time_t 1000000000
+
+start_gen TEST
+random-bytes 100
if {[llength $argv]} {
foreach count $argv { emit "$xseed$count" }