Only compute routes for connected peers. Other progress.
authorJennifer Richards <jennifer@painless-security.com>
Wed, 27 Jul 2016 14:41:10 +0000 (10:41 -0400)
committerJennifer Richards <jennifer@painless-security.com>
Wed, 27 Jul 2016 14:41:10 +0000 (10:41 -0400)
include/trp_internal.h
include/trp_ptable.h
tr/tr_main.c
tr/tr_trp.c
trp/trp_conn.c
trp/trp_ptable.c
trp/trps.c

index 96a0010..489aee5 100644 (file)
@@ -188,5 +188,5 @@ TRP_RC trps_add_route(TRPS_INSTANCE *trps, TRP_RENTRY *route);
 TRP_RC trps_add_peer(TRPS_INSTANCE *trps, TRP_PEER *peer);
 TRP_PEER *trps_get_peer(TRPS_INSTANCE *trps, TR_NAME *gssname);
 TRP_RC trps_scheduled_update(TRPS_INSTANCE *trps);
-
+int trps_peer_connected(TRPS_INSTANCE *trps, TRP_PEER *peer);
 #endif /* TRP_INTERNAL_H */
index ec14824..804217c 100644 (file)
@@ -11,6 +11,7 @@ typedef struct trp_peer TRP_PEER;
 struct trp_peer {
   TRP_PEER *next; /* for making a linked list */
   char *server;
+  TR_NAME *gssname;
   unsigned int port;
   unsigned int linkcost;
   struct timespec last_conn_attempt;
@@ -39,7 +40,9 @@ TRP_PEER *trp_peer_new(TALLOC_CTX *memctx);
 void trp_peer_free(TRP_PEER *peer);
 char *trp_peer_get_server(TRP_PEER *peer);
 void trp_peer_set_server(TRP_PEER *peer, char *server);
+void trp_peer_set_gssname(TRP_PEER *peer, TR_NAME *gssname);
 TR_NAME *trp_peer_get_gssname(TRP_PEER *peer);
+TR_NAME *trp_peer_dup_gssname(TRP_PEER *peer);
 unsigned int trp_peer_get_port(TRP_PEER *peer);
 void trp_peer_set_port(TRP_PEER *peer, unsigned int port);
 unsigned int trp_peer_get_linkcost(TRP_PEER *peer);
index 2df7ff5..c2ccb40 100644 (file)
@@ -288,6 +288,7 @@ int main(int argc, char *argv[])
       return 1;
     }
     trp_peer_set_server(hc_peer, "epsilon.vmnet");
+    trp_peer_set_gssname(hc_peer, tr_new_name("trustrouter@apc.painless-security.com"));
     switch (tr->trps->port) {
     case 10000:
       trp_peer_set_port(hc_peer, 10001);
index bf06d1c..502c50d 100644 (file)
@@ -62,7 +62,6 @@ static TRP_RC tr_trps_msg_handler(TRPS_INSTANCE *trps,
 static int tr_trps_gss_handler(gss_name_t client_name, gss_buffer_t gss_name,
                                void *cookie_in)
 {
-  TR_RP_CLIENT *rp;
   struct tr_trps_event_cookie *cookie=(struct tr_trps_event_cookie *)cookie_in;
   TRPS_INSTANCE *trps = cookie->trps;
   TR_CFG_MGR *cfg_mgr = cookie->cfg_mgr;
@@ -75,15 +74,13 @@ static int tr_trps_gss_handler(gss_name_t client_name, gss_buffer_t gss_name,
     return -1;
   }
   
-  /* look up the RP client matching the GSS name */
-  if ((NULL == (rp = tr_rp_client_lookup(cfg_mgr->active->rp_clients, &name)))) {
-    tr_debug("tr_trps_gss_handler: Unknown GSS name %.*s", name.len, name.buf);
+  /* look up the TRPS peer matching the GSS name */
+  if (NULL==trps_get_peer(trps, &name)) {
+    tr_warning("tr_trps_gss_handler: Connection attempt from unknown peer (GSS name: %.*s).", name.len, name.buf);
     return -1;
   }
 
-  /*trps->rp_gss = rp;*/
   tr_debug("Client's GSS Name: %.*s", name.len, name.buf);
-
   return 0;
 }
 
@@ -464,6 +461,7 @@ static void *tr_trpc_thread(void *arg)
               trpc_get_server(trpc),
               trpc_get_port(trpc));
   } else {
+    tr_debug("tr_trpc_thread: connected to peer %s", trpc->conn->peer->buf);
     while (1) {
       cb_data.msg_ready=0;
       pthread_cond_wait(&(cb_data.cond), &(cb_data.mutex));
@@ -574,10 +572,9 @@ static void tr_trpc_status_change(TRP_CONNECTION *conn, void *cookie)
   TR_NAME *gssname=trp_peer_get_gssname(peer);
 
   if (trp_connection_get_status(conn)==TRP_CONNECTION_UP)
-    tr_debug("tr_trpc_status_change: connection now up.");
+    tr_debug("tr_trpc_status_change: connection to %.*s now up.", gssname->len, gssname->buf);
   else
-    tr_debug("tr_trpc_status_change: connection now down.");
-  tr_free_name(gssname);
+    tr_debug("tr_trpc_status_change: connection to %.*s now down.", gssname->len, gssname->buf);
 }
 
 /* starts a trpc thread to connect to server:port */
@@ -618,7 +615,7 @@ TRPC_INSTANCE *tr_trpc_initiate(TRPS_INSTANCE *trps, TRP_PEER *peer)
   trpc_set_conn(trpc, conn);
   trpc_set_server(trpc, talloc_strdup(trpc, trp_peer_get_server(peer)));
   trpc_set_port(trpc, trp_peer_get_port(peer));
-  trpc_set_gssname(trpc, trp_peer_get_gssname(peer));
+  trpc_set_gssname(trpc, trp_peer_dup_gssname(peer));
   tr_debug("tr_trpc_initiate: allocated connection");
   
   /* start thread */
index c002cca..5d38de4 100644 (file)
@@ -270,7 +270,6 @@ int trp_connection_auth(TRP_CONNECTION *conn, TRP_AUTH_FUNC auth_callback, void
   gss_buffer_desc nameBuffer = {0, NULL};
   gss_ctx_id_t *gssctx=trp_connection_get_gssctx(conn);
 
-  /* TODO: shouldn't really peek into TR_NAME... */
   nameBuffer.length = trp_connection_get_gssname(conn)->len;
   nameBuffer.value = trp_connection_get_gssname(conn)->buf;
 
index 4a276d5..afee7ef 100644 (file)
@@ -6,15 +6,24 @@
 #include <trp_ptable.h>
 #include <tr_debug.h>
 
+static int trp_peer_destructor(void *object)
+{
+  TRP_PEER *peer=talloc_get_type_abort(object, TRP_PEER);
+  if (peer->gssname!=NULL)
+    tr_free_name(peer->gssname);
+  return 0;
+}
 TRP_PEER *trp_peer_new(TALLOC_CTX *memctx)
 {
   TRP_PEER *peer=talloc(memctx, TRP_PEER);
   if (peer!=NULL) {
     peer->next=NULL;
     peer->server=NULL;
+    peer->gssname=NULL;
     peer->port=0;
     peer->linkcost=TRP_METRIC_INFINITY;
     peer->last_conn_attempt=(struct timespec){0,0};
+    talloc_set_destructor((void *)peer, trp_peer_destructor);
   }
   return peer;
 }
@@ -43,19 +52,21 @@ void trp_peer_set_server(TRP_PEER *peer, char *server)
   peer->server=talloc_strdup(peer, server); /* will be null on error */
 }
 
-/* get the peer name based on the server name; caller is responsible for freeing the TR_NAME */
+void trp_peer_set_gssname(TRP_PEER *peer, TR_NAME *gssname)
+{
+  peer->gssname=gssname;
+}
+
+/* get the peer gssname, caller must not free the result */
 TR_NAME *trp_peer_get_gssname(TRP_PEER *peer)
 {
-  TR_NAME *gssname=NULL;
-  char *s=NULL;
+  return peer->gssname;
+}
 
-  if (0<asprintf(&s, "trustrouter@%s", peer->server)) {
-    if (tr_new_name(s)!=NULL) {
-      gssname=tr_new_name(s);
-    }
-    free(s);
-  }
-  return gssname;
+/* get a copy of the peer gssname, caller must free via tr_free_name() */
+TR_NAME *trp_peer_dup_gssname(TRP_PEER *peer)
+{
+  return tr_dup_name(peer->gssname);
 }
 
 unsigned int trp_peer_get_port(TRP_PEER *peer)
index 02bb371..34528c4 100644 (file)
@@ -140,7 +140,6 @@ TRPC_INSTANCE *trps_find_trpc(TRPS_INSTANCE *trps, TRP_PEER *peer)
       break;
     }
   }
-  tr_free_name(peer_gssname);
   return cur;
 }
 
@@ -776,11 +775,14 @@ static TRP_RENTRY *trps_select_realm_update(TRPS_INSTANCE *trps, TR_NAME *comm,
      * in which case we do not want to advertise it. */
     return NULL;
   }
+  tr_debug("trps_select_realm_update: %s vs %s", peer_gssname->buf,
+           trp_rentry_get_peer(route)->buf);
   if (0==tr_name_cmp(peer_gssname, trp_rentry_get_peer(route))) {
+    tr_debug("trps_select_realm_update: matched, finding alternate route");
     /* the selected entry goes through the peer we're reporting to, choose an alternate */
     route=trps_find_best_route(trps, comm, realm, peer_gssname);
     if ((route==NULL) || (!trp_metric_is_finite(trp_rentry_get_metric(route))))
-      route=NULL; /* don't advertise a nonexistent or retracted route */
+      return NULL; /* don't advertise a nonexistent or retracted route */
   }
   return route;
 }
@@ -879,11 +881,15 @@ TRP_RC trps_scheduled_update(TRPS_INSTANCE *trps)
        peer=trp_ptable_iter_next(iter))
   {
     peer_gssname=trp_peer_get_gssname(peer);
+    if (!trps_peer_connected(trps, peer)) {
+      tr_debug("trps_scheduled_update: no TRP connection to %.*s, skipping.",
+               peer_gssname->len, peer_gssname->buf);
+      continue;
+    }
     tr_debug("trps_scheduled_update: preparing scheduled route update for %.*s",
              peer_gssname->len, peer_gssname->buf);
     /* do not fill in peer, recipient does that */
     update_list=trps_select_updates_for_peer(tmp_ctx, trps, peer_gssname, &n_updates);
-    tr_free_name(peer_gssname); peer_gssname=NULL;
     if ((n_updates>0) && (update_list!=NULL)) {
       tr_debug("trps_scheduled_update: sending %u update records.", (unsigned int)n_updates);
       upd=trp_upd_new(tmp_ctx);
@@ -943,3 +949,15 @@ TRP_PEER *trps_get_peer(TRPS_INSTANCE *trps, TR_NAME *gssname)
 {
   return trp_ptable_find(trps->ptable, gssname);
 }
+
+int trps_peer_connected(TRPS_INSTANCE *trps, TRP_PEER *peer)
+{
+  TRPC_INSTANCE *trpc=trps_find_trpc(trps, peer);
+  if (trpc==NULL)
+    return 0;
+
+  if (trpc_get_status(trpc)==TRP_CONNECTION_UP)
+    return 1;
+  else
+    return 0;
+}