chiark / gitweb /
Merge branch 'mdw/backoff'
authorMark Wooding <mdw@distorted.org.uk>
Tue, 18 Sep 2012 02:30:28 +0000 (03:30 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 18 Sep 2012 02:30:28 +0000 (03:30 +0100)
* mdw/backoff:
  server/tests.at: Test key exchange and retransmit with a flaky network.
  server/tests.at: Add a retry loop in `COMMS_EPING'.
  proxy: Add a `drop' filter to randomly discard packets.
  server/keyexch.c: Randomized exponential retransmit backoff.
  server/keyexch.c: Use high-resolution `struct timeval' timers.
  server/{keyexch.c,keyset.c}: Eliminate `ks_tregen'.
  server/{keyexch.c,keyset.c}: Move timing parameters to tripe.h.

Conflicts:
server/tests.at

1  2 
server/tests.at

diff --cc server/tests.at
index ab64c538ff3a47634075ea05e15af1cc39f76409,19790a91946dbed9b5b15d9a1c5ebaabac3d1302..e0eaa05b08b0c30fcf081ac5bf59f6aa438e213f
@@@ -38,8 -38,7 +38,9 @@@ m4_define([TRIPE]
       $abs_top_builddir/server/tripe -F -d. -aadmin -p0 -b127.0.0.1 -talice])
  m4_define([TRIPECTL], [$abs_top_builddir/client/tripectl -d. -aadmin])
  m4_define([USLIP], [$abs_top_builddir/uslip/tripe-uslip])
 +m4_define([PKSTREAM],
 +  [$abs_top_builddir/pkstream/pkstream -b127.0.0.1 -p127.0.0.1])
+ m4_define([MITM], [$abs_top_builddir/proxy/tripe-mitm])
  
  ## Sequences.  (These are used for testing the replay protection machinery.)
  m4_define([R32], [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   dnl
@@@ -174,17 -173,24 +175,31 @@@ m4_define([WITH_TRIPE], [WITH_TRIPEX([.
  m4_define([WITH_2TRIPES],
          [WITH_TRIPEX([$1], [$3 $4], [WITH_TRIPEX([$2], [$3 $5], [$6])])])
  
- ## COMMS_EPING(adir, aname, bdir, bname)
 +## WITH_3TRIPES(adir, bdir, cdir, allargs, aargs, bargs, cargs, body)
 +m4_define([WITH_3TRIPES],
 +        [WITH_TRIPEX([$1], [$4 $5],
 +        [WITH_TRIPEX([$2], [$4 $6],
 +        [WITH_TRIPEX([$3], [$4 $7],
 +        [$8])])])])
 +
+ ## RETRY(n, body)
+ m4_define([RETRY], [
+   n=0 rc=1
+   while test $n -lt $1; do
+     if $2
+     then rc=0; break
+     fi
+     n=$(( $n + 1 ))
+   done
+   exit $rc
+ ])
+ ## COMMS_EPING(adir, aname, bdir, bname, [n])
  m4_define([COMMS_EPING], [
-   AT_CHECK([TRIPECTL -d$1 EPING $4],, [ignore])
-   AT_CHECK([TRIPECTL -d$3 EPING $2],, [ignore])
+   AT_CHECK([RETRY([m4_default([$5], [1])],
+     [TRIPECTL -d$1 EPING $4])],, [ignore])
+   AT_CHECK([RETRY([m4_default([$5], [1])],
+     [TRIPECTL -d$3 EPING $2])],, [ignore])
  ])
  
  ## COMMS_SLIP(adir, aname, bdir, bname)
@@@ -358,71 -362,44 +373,109 @@@ WITH_2TRIPES([alice], [bob], [-nslip], 
  
  AT_CLEANUP
  
 -for i in alice bob; do (mkdir $i; cd $i; SETUPDIR([dh])); done
 +###--------------------------------------------------------------------------
 +### 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
 +
+ ###--------------------------------------------------------------------------
+ ### Adverse communication.
+ AT_SETUP([server retry])
+ AT_KEYWORDS([backoff])
+ export TRIPE_SLIPIF=USLIP
++for i in alice bob; do (mkdir $i; cd $i; SETUPDIR([beta])); done
+ WITH_2TRIPES([alice], [bob], [-nslip], [-talice], [-tbob], [
+   ## Set up the evil proxy.
+   alicemitm=24516 bobmitm=14016
+   MITM -kalice/keyring.pub >mitm.out 2>mitm.err \
+     peer:alice:$alicemitm:127.0.0.1:$(cat alice/port) \
+     peer:bob:$bobmitm:127.0.0.1:$(cat bob/port) \
+     filt:drop:5 filt:send& mitmpid=$!
+   strace -omitm.trace -p$mitmpid& mitmtrace=$!
+   trap 'kill $mitmpid $mitmtrace; exit 127' EXIT INT QUIT TERM HUP
+   ## Try to establish keys anyway.
+   AWAIT_KXDONE([alice], [alice], [bob], [bob], [
+     AT_CHECK([TRIPECTL -dalice ADD -cork bob   INET 127.0.0.1 $alicemitm])
+     AT_CHECK([TRIPECTL -dbob   ADD       alice INET 127.0.0.1 $bobmitm])
+   ])
+   ## Check pinging.
+   COMMS_EPING([alice], [alice], [bob], [bob], [10])
+   COMMS_EPING([bob], [bob], [alice], [alice], [10])
+   ## Tear down the MITM proxy.
+   kill $mitmpid
+   wait $mitmpid
+   wait $mitmtrace
+ ])
+ AT_CLEANUP
  ###--------------------------------------------------------------------------
  ### Services.