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 */
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;
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);
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);
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;
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;
}
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));
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 */
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 */
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;
#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;
}
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)
break;
}
}
- tr_free_name(peer_gssname);
return cur;
}
* 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;
}
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);
{
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;
+}