chiark / gitweb /
server/tests.at: Add a retry loop in `COMMS_EPING'.
[tripe] / server / tripe.h
index b6c1cd5d4fb6da0b17103e1b8b21439e687fe044..ad20daa72255dce993051e05f121541e1f0e95df 100644 (file)
 
 #define SEC(n) (n##u)
 #define MIN(n) (n##u * 60u)
+#define F_2P32 (65536.0*65536.0)
 #define MEG(n) (n##ul * 1024ul * 1024ul)
 
+/* --- Timing parameters --- */
+
+#define T_EXP MIN(60)                  /* Expiry time for a key */
+#define T_REGEN MIN(40)                        /* Regeneration time for a key */
+
+#define T_VALID SEC(20)                        /* Challenge validity period */
+#define T_RETRYMIN SEC(2)              /* Minimum retry interval */
+#define T_RETRYMAX MIN(5)              /* Maximum retry interval */
+#define T_RETRYGROW (5.0/4.0)          /* Retry interval growth factor */
+
+#define T_WOBBLE (1.0/3.0)             /* Relative timer randomness */
+
 /* --- Other things --- */
 
 #define PKBUFSZ 65536
@@ -238,6 +251,10 @@ typedef struct keyset {
  * Clive Jones.
  */
 
+typedef struct retry {
+  double t;                            /* Current retry time */
+} retry;
+
 #define KX_NCHAL 16u
 
 typedef struct kxchal {
@@ -247,6 +264,7 @@ typedef struct kxchal {
   keyset *ks;                          /* Pointer to temporary keyset */
   unsigned f;                          /* Various useful flags */
   sel_timer t;                         /* Response timer for challenge */
+  retry rs;                            /* Retry state */
   octet hc[MAXHASHSZ];                 /* Hash of his challenge */
   octet ck[MAXHASHSZ];                 /* His magical check value */
   octet hswrq_in[MAXHASHSZ];           /* Inbound switch request message */
@@ -261,6 +279,7 @@ typedef struct keyexch {
   unsigned f;                          /* Various useful flags */
   unsigned s;                          /* Current state in exchange */
   sel_timer t;                         /* Timer for next exchange */
+  retry rs;                            /* Retry state */
   ge *kpub;                            /* Peer's public key */
   time_t texp_kpub;                    /* Expiry time for public key */
   mp *alpha;                           /* My temporary secret */
@@ -341,7 +360,8 @@ typedef struct peerspec {
   addr sa;                             /* Socket address to speak to */
   size_t sasz;                         /* Socket address size */
   unsigned f;                          /* Flags for the peer */
-#define PSF_KXMASK 255u                        /*   Key exchange flags to set */
+#define PSF_KXMASK 255u                        /*   Key-exchange flags to set */
+#define PSF_MOBILE 256u                        /*   Address may change rapidly */
 } peerspec;
 
 typedef struct peer_byname {
@@ -669,15 +689,6 @@ extern keyset *ks_gen(const void */*k*/,
                      size_t /*x*/, size_t /*y*/, size_t /*z*/,
                      peer */*p*/);
 
-/* --- @ks_tregen@ --- *
- *
- * Arguments:  @keyset *ks@ = pointer to a keyset
- *
- * Returns:    The time at which moves ought to be made to replace this key.
- */
-
-extern time_t ks_tregen(keyset */*ks*/);
-
 /* --- @ks_activate@ --- *
  *
  * Arguments:  @keyset *ks@ = pointer to a keyset