+###--------------------------------------------------------------------------
+### Mobile peer tracking.
+
+AT_SETUP([peer tracking])
+AT_KEYWORDS([mobile])
+export TRIPE_SLIPIF=USLIP
+
+for p in alice bob carol; do (mkdir $p; cd $p; SETUPDIR([alpha])); done
+
+## WITH_PKSTREAM(adir, aport, bdir, bport, body)
+m4_define([WITH_PKSTREAM], [
+ echo >&2 "pkstream: $1 <--> :$2 <-pkstream-> :$4 <--> $3"
+ PKSTREAM -l$4 127.0.0.1:$4 127.0.0.1:$(cat $3/port)& pkstream_$3_$1=$!
+ sleep 1
+ PKSTREAM -c127.0.0.1:$4 127.0.0.1:$2 127.0.0.1:$(cat $1/port)&
+ pkstream_$1_$3=$!
+ set +x
+ $5
+ kill $pkstream_$3_$1 $pkstream_$1_$3
+])
+
+WITH_3TRIPES([alice], [bob], [carol], [-nslip],
+ [-talice], [-tbob], [-tcarol], [
+
+ ## We need an indirection layer between the two peers so that we can
+ ## simulate the effects of NAT remapping. The nearest thing we have to
+ ## this is pkstream, so we may as well use that.
+ ##
+ ## alice <--> :5311 <-pkstream-> :5312 <--> bob
+ ## alice <--> :5321 <-pkstream-> :5322 <--> carol
+
+ WITH_PKSTREAM([alice], [5311], [bob], [5312], [
+ ESTABLISH([alice], [alice], [], [bob], [bob], [-mobile], [5312], [5311])
+ ])
+
+ WITH_PKSTREAM([alice], [5319], [bob], [5312], [
+ COMMS_EPING([bob], [bob], [alice], [alice])
+ COMMS_SLIP([bob], [bob], [alice], [alice])
+ ])
+
+ WITH_PKSTREAM([alice], [5321], [carol], [5322], [
+ ESTABLISH([alice], [alice], [], [carol], [carol], [-mobile],
+ [5322], [5321])
+ ])
+
+ WITH_PKSTREAM([alice], [5311], [bob], [5312], [
+ WITH_PKSTREAM([alice], [5321], [carol], [5322], [
+ COMMS_EPING([bob], [bob], [alice], [alice])
+ COMMS_EPING([carol], [carol], [alice], [alice])
+ COMMS_SLIP([bob], [bob], [alice], [alice])
+ COMMS_SLIP([carol], [carol], [alice], [alice])
+ ])])
+
+ WITH_PKSTREAM([alice], [5321], [bob], [5312], [
+ WITH_PKSTREAM([alice], [5311], [carol], [5322], [
+ COMMS_EPING([bob], [bob], [alice], [alice])
+ COMMS_EPING([carol], [carol], [alice], [alice])
+ COMMS_SLIP([bob], [bob], [alice], [alice])
+ COMMS_SLIP([carol], [carol], [alice], [alice])
+ ])])
+ wait
+])
+
+AT_CLEANUP
+