server/: Build a proper interface for handling tunnel classes.
[tripe] / server / tripe.h
index bf75b45..fd0f44e 100644 (file)
@@ -611,6 +611,10 @@ typedef struct tunnel_ops {
 struct tunnel { const tunnel_ops *ops; };
 #endif
 
+typedef struct tun_iter {
+  const struct tunnel_node *next;
+} tun_iter;
+
 /* --- Peer statistics --- *
  *
  * Contains various interesting and not-so-interesting statistics about a
@@ -815,8 +819,6 @@ struct admin {
 
 extern sel_state sel;                  /* Global I/O event state */
 extern octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ], buf_u[PKBUFSZ];
-extern const tunnel_ops *tunnels[];    /* Table of tunnels (0-term) */
-extern const tunnel_ops *tun_default;  /* Default tunnel to use */
 extern udpsocket udpsock[NADDRFAM];    /* The master UDP sockets */
 extern kdata *master;                  /* Default private key */
 extern char *tag_priv;                 /* Default private key tag */
@@ -1735,6 +1737,90 @@ extern void p_unbind(void);
 
 extern void p_init(void);
 
+/* --- @p_addtun@ --- *
+ *
+ * Arguments:  @const tunnel_ops *tops@ = tunnel ops to add
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a tunnel class to the list of known classes.  If there
+ *             is no current default tunnel, then this one is made the
+ *             default.
+ *
+ *             Does nothing if the tunnel class is already known.  So adding
+ *             a bunch of tunnels takes quadratic time, but there will be
+ *             too few to care about.
+ */
+
+extern void p_addtun(const tunnel_ops */*tops*/);
+
+/* --- @p_setdflttun@ --- *
+ *
+ * Arguments:  @const tunnel_ops *tops@ = tunnel ops to set
+ *
+ * Returns:    ---
+ *
+ * Use:                Sets the default tunnel.  It must already be registered.  The
+ *             old default is forgotten.
+ */
+
+extern void p_setdflttun(const tunnel_ops */*tops*/);
+
+/* --- @p_dflttun@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    A pointer to the current default tunnel operations, or null
+ *             if no tunnels are defined.
+ */
+
+extern const tunnel_ops *p_dflttun(void);
+
+/* --- @p_findtun@ --- *
+ *
+ * Arguments:  @const char *name@ = tunnel name
+ *
+ * Returns:    Pointer to the tunnel operations, or null.
+ *
+ * Use:                Finds the operations for a named tunnel class.
+ */
+
+extern const tunnel_ops *p_findtun(const char */*name*/);
+
+/* --- @p_mktuniter@ --- *
+ *
+ * Arguments:  @tuniter *i@ = pointer to iterator to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a tunnel iterator.
+ */
+
+extern void p_mktuniter(tun_iter */*i*/);
+
+/* --- @p_nexttun@ --- *
+ *
+ * Arguments:  @tuniter *i@ = pointer to iterator
+ *
+ * Returns:    Pointer to the next tunnel's operations, or null.
+ */
+
+extern const tunnel_ops *p_nexttun(tun_iter */*i*/);
+
+/* --- @FOREACH_TUN@ --- *
+ *
+ * Arguments:  @tops@ = name to bind to each tunnel
+ *             @stuff@ = thing to do for each item
+ *
+ * Use:                Does something for each known tunnel class.
+ */
+
+#define FOREACH_TUN(tops, stuff) do {                                  \
+  tun_iter i_;                                                         \
+  const tunnel_ops *tops;                                              \
+  for (p_mktuniter(&i_); (tops = p_nexttun(&i_)) != 0; ) stuff;                \
+} while (0)
+
 /* --- @p_create@ --- *
  *
  * Arguments:  @peerspec *spec@ = information about this peer