+/*
+ * Copyright (c) 2016, JANET(UK)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of JANET(UK) nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
#include <stdio.h>
#include <talloc.h>
#include <assert.h>
+#include <tr_gss_names.h>
+#include <trp_route.h>
#include <trp_internal.h>
+#include <trp_peer.h>
#include <trp_ptable.h>
+/* Can't do the updates test because trps_select_updates_for_peer() is now static */
+#define VERIFY_UPDATES 0
+
struct peer_entry {
char *server;
- unsigned int port;
+ char *gss_name;
+ int port;
unsigned int linkcost;
};
static struct peer_entry peer_data[]={
- {"peer0", 10000, 0x0001},
- {"peer1", 15000, 0x0002},
- {"peer2", 20000, 0x0004},
- {"peer3", 25000, 0x0008},
- {"peer4", 30000, 0x0010}
+ {"peer0", "trustrouter@peer0", 10000, 0x0001},
+ {"peer1", "trustrouter@peer1", 15000, 0x0002},
+ {"peer2", "trustrouter@peer2", 20000, 0x0004},
+ {"peer3", "trustrouter@peer3", 25000, 0x0008},
+ {"peer4", "trustrouter@peer4", 30000, 0x0010}
};
static size_t n_peers=sizeof(peer_data)/sizeof(peer_data[0]);
assert(new_peer!=NULL);
trp_peer_set_server(new_peer, peer_data[i].server);
assert(trp_peer_get_server(new_peer)!=NULL);
+ trp_peer_add_gss_name(new_peer, tr_new_name(peer_data[i].gss_name));
+ assert(trp_peer_get_gss_names(new_peer)!=NULL);
trp_peer_set_port(new_peer, peer_data[i].port);
trp_peer_set_linkcost(new_peer, peer_data[i].linkcost);
assert(trps_add_peer(trps, new_peer)==TRP_SUCCESS);
gssname=tr_new_name(s);
free(s);
assert(gssname!=NULL);
- assert(!tr_name_cmp(trp_peer_get_gssname(peer), gssname));
+ assert(tr_gss_names_matches(trp_peer_get_gss_names(peer), gssname));
tr_free_name(gssname);
peer=peer->next;
}
};
static size_t n_routes=sizeof(route_table)/sizeof(route_table[0]);
+#if VERIFY_UPDATES
/* These are the correct updates to select from the above route table for each peer.
* The rule is: send selected route unless it is through that peer, otherwise send
* the best (lowest metric) alternative route.
{NULL}
}
};
+#endif /* VERIFY_UPDATES */
static void populate_rtable(TRPS_INSTANCE *trps)
{
int i;
- TRP_RENTRY *new;
+ TRP_ROUTE *new;
for (i=0; i<n_routes; i++) {
- new=trp_rentry_new(NULL);
+ new=trp_route_new(NULL);
assert(new!=NULL);
- trp_rentry_set_apc(new, tr_new_name(route_table[i].apc));
- trp_rentry_set_realm(new, tr_new_name(route_table[i].realm));
- trp_rentry_set_peer(new, tr_new_name(route_table[i].peer));
- trp_rentry_set_metric(new, route_table[i].metric);
- trp_rentry_set_trust_router(new, tr_new_name(route_table[i].trust_router));
- trp_rentry_set_next_hop(new, tr_new_name(route_table[i].next_hop));
- trp_rentry_set_selected(new, route_table[i].selected);
- trp_rentry_set_interval(new, route_table[i].interval);
+ trp_route_set_comm(new, tr_new_name(route_table[i].apc));
+ trp_route_set_realm(new, tr_new_name(route_table[i].realm));
+ trp_route_set_peer(new, tr_new_name(route_table[i].peer));
+ trp_route_set_metric(new, route_table[i].metric);
+ trp_route_set_trust_router(new, tr_new_name(route_table[i].trust_router));
+ trp_route_set_next_hop(new, tr_new_name(route_table[i].next_hop));
+ trp_route_set_selected(new, route_table[i].selected);
+ trp_route_set_interval(new, route_table[i].interval);
/* do not set expiry */
trp_rtable_add(trps->rtable, new);
new=NULL;
}
}
-static void verify_update(TRP_RENTRY **updates, size_t n_updates, struct route_data *expected)
+#if VERIFY_UPDATES
+static void verify_update(TRP_ROUTE **updates, size_t n_updates, struct route_data *expected)
{
int ii,jj;
int found;
for(jj=0; jj<n_updates; jj++) {
found=0;
for (ii=0; expected[ii].apc!=NULL; ii++) {
- if ((0==strcmp(expected[ii].apc, updates[jj]->apc->buf))
+ if ((0==strcmp(expected[ii].apc, updates[jj]->comm->buf))
&&(0==strcmp(expected[ii].realm, updates[jj]->realm->buf))
&&(0==strcmp(expected[ii].peer, updates[jj]->peer->buf))
&&(expected[ii].metric==updates[jj]->metric)
}
}
if (!found) {
- printf("missing:\n%s\n", trp_rentry_to_str(NULL,updates[jj], " | "));
+ printf("missing:\n%s\n", trp_route_to_str(NULL,updates[jj], " | "));
assert(0);
}
}
static void verify_update_selection(TRPS_INSTANCE *trps)
{
int ii;
- TRP_RENTRY **updates=NULL;
+ TRP_ROUTE **updates=NULL;
size_t n_updates;
TR_NAME *gssname=NULL;
char *s;
assert(0<asprintf(&s, "trustrouter@%s", peer_data[ii].server));
assert(NULL!=(gssname=tr_new_name(s)));
free(s);
+
updates=trps_select_updates_for_peer(NULL, trps, gssname, &n_updates);
tr_free_name(gssname);
verify_update(updates, n_updates, update_table[ii]);
talloc_free(updates);
}
}
+#endif /* VERIFY_UPDATES */
int main(void)
{
s=trp_rtable_to_str(main_ctx, trps->rtable, " | ", NULL);
printf("Route Table:\n%s---\n", s);
+#if VERIFY_UPDATES
printf("\nVerifying route update selection...\n");
verify_update_selection(trps);
+#endif /* VERIFY_UPDATES */
printf("\nDone\n\n");
talloc_report_full(main_ctx, stderr);