tr_free_name(comm->id);
if (comm->owner_realm!=NULL)
tr_free_name(comm->owner_realm);
- if (comm->owner_email!=NULL)
- tr_free_name(comm->owner_email);
+ if (comm->owner_contact!=NULL)
+ tr_free_name(comm->owner_contact);
return 0;
}
TR_NAME *tr_comm_dup_owner_realm(TR_COMM *comm)
{
- return tr_dup_name(tr->owner_realm);
+ return tr_dup_name(comm->owner_realm);
}
void tr_comm_set_owner_contact(TR_COMM *comm, TR_NAME *contact)
TR_NAME *tr_comm_dup_owner_contact(TR_COMM *comm)
{
- return tr_dup_name(tr->owner_contact);
+ return tr_dup_name(comm->owner_contact);
}
/* does not take responsibility for freeing IDP realm */
}
return NULL;
}
+
+const char *tr_comm_type_to_str(TR_COMM_TYPE type)
+{
+ const char *s=NULL;
+ switch(type) {
+ case TR_COMM_UNKNOWN:
+ s="unknown";
+ break;
+ case TR_COMM_APC:
+ s="APC";
+ break;
+ case TR_COMM_COI:
+ s="COI";
+ break;
+ default:
+ s="invalid";
+ }
+ return s;
+}
goto cleanup;
}
- tr_comm_set_id(tr_new_name(json_string_value(jid)));
+ tr_comm_set_id(comm, tr_new_name(json_string_value(jid)));
if (NULL == tr_comm_get_id(comm)) {
tr_debug("tr_cfg_parse_one_comm: No memory for community id.");
*rc = TR_CFG_NOMEM;
/* Information records for TRP update msg
* requires that jrec already be allocated */
-static TRP_RC tr_msg_encode_inforec_route(json_t *jrec, TRP_INFOREC *rec )
+static TRP_RC tr_msg_encode_inforec_route(json_t *jrec, TRP_INFOREC *rec)
{
json_t *jstr=NULL;
json_t *jint=NULL;
if (rec==NULL)
return TRP_BADTYPE;
- if ((trp_inforec_get_comm(rec)==NULL)
- || (trp_inforec_get_realm(rec)==NULL)
- || (trp_inforec_get_trust_router(rec)==NULL)) {
+ if (trp_inforec_get_trust_router(rec)==NULL)
return TRP_ERROR;
- }
-
- s=tr_name_strdup(trp_inforec_get_comm(rec));
- if (s==NULL)
- return TRP_NOMEM;
- jstr=json_string(s);
- free(s);s=NULL;
- if(jstr==NULL)
- return TRP_ERROR;
- json_object_set_new(jrec, "community", jstr);
-
- s=tr_name_strdup(trp_inforec_get_realm(rec));
- if (s==NULL)
- return TRP_NOMEM;
- jstr=json_string(s);
- free(s);s=NULL;
- if(jstr==NULL)
- return TRP_ERROR;
- json_object_set_new(jrec, "realm", jstr);
s=tr_name_strdup(trp_inforec_get_trust_router(rec));
if (s==NULL)
tr_debug("tr_msg_decode_trp_inforec: '%s' record found.", trp_inforec_type_to_string(rec->type));
- rc=tr_msg_get_json_string(jrecord, "community", &s, tmp_ctx);
- if (rc != TRP_SUCCESS)
- goto cleanup;
- if (TRP_SUCCESS!=trp_inforec_set_comm(rec, tr_new_name(s)))
- goto cleanup;
- talloc_free(s); s=NULL;
-
- rc=tr_msg_get_json_string(jrecord, "realm", &s, tmp_ctx);
- if (rc != TRP_SUCCESS)
- goto cleanup;
- if (TRP_SUCCESS!=trp_inforec_set_realm(rec, tr_new_name(s)))
- goto cleanup;
- talloc_free(s); s=NULL;
-
rc=tr_msg_get_json_string(jrecord, "trust_router", &s, tmp_ctx);
if (rc != TRP_SUCCESS)
goto cleanup;
json_t *jupdate=NULL;
json_t *jrecords=NULL;
json_t *jrec=NULL;
+ json_t *jstr=NULL;
TRP_INFOREC *rec;
+ char *s=NULL;
if (update==NULL)
return NULL;
if (jupdate==NULL)
return NULL;
+ s=tr_name_strdup(trp_upd_get_comm(update));
+ if (s==NULL) {
+ json_decref(jupdate);
+ return NULL;
+ }
+ jstr=json_string(s);
+ free(s);s=NULL;
+ if(jstr==NULL) {
+ json_decref(jupdate);
+ return NULL;
+ }
+ json_object_set_new(jupdate, "community", jstr);
+
+ s=tr_name_strdup(trp_upd_get_realm(update));
+ if (s==NULL) {
+ json_decref(jupdate);
+ return NULL;
+ }
+ jstr=json_string(s);
+ free(s);s=NULL;
+ if(jstr==NULL) {
+ json_decref(jupdate);
+ return NULL;
+ }
+ json_object_set_new(jrec, "realm", jstr);
+
jrecords=json_array();
if (jrecords==NULL) {
json_decref(jupdate);
TRP_UPD *update=NULL;
TRP_INFOREC *new_rec=NULL;
TRP_INFOREC *list_tail=NULL;
+ char *s=NULL;
+ TR_NAME *name;
TRP_RC rc=TRP_ERROR;
update=trp_upd_new(tmp_ctx);
goto cleanup;
}
+ rc=tr_msg_get_json_string(jupdate, "community", &s, tmp_ctx);
+ if (rc != TRP_SUCCESS)
+ goto cleanup;
+ name=tr_new_name(s);
+ if (name==NULL)
+ goto cleanup;
+ talloc_free(s); s=NULL;
+ trp_upd_set_comm(update, name);
+
+ rc=tr_msg_get_json_string(jupdate, "realm", &s, tmp_ctx);
+ if (rc != TRP_SUCCESS)
+ goto cleanup;
+ name=tr_new_name(s);
+ if (name==NULL)
+ goto cleanup;
+ talloc_free(s); s=NULL;
+ trp_upd_set_realm(update, name);
+
jrecords=json_object_get(jupdate, "records");
if ((jrecords==NULL) || (!json_is_array(jrecords))) {
rc=TRP_NOPARSE;
TR_COMM *tr_comm_lookup(TR_COMM *comms, TR_NAME *comm_name);
TR_RP_REALM *tr_find_comm_rp (TR_COMM *comm, TR_NAME *rp_realm);
TR_IDP_REALM *tr_find_comm_idp (TR_COMM *comm, TR_NAME *idp_realm);
+const char *tr_comm_type_to_str(TR_COMM_TYPE type);
#endif
#include <tr_msg.h>
#include <trp_ptable.h>
#include <trp_rtable.h>
+#include <tr_apc.h>
+#include <tr_comm.h>
#include <trust_router/trp.h>
/* info records */
/* TRP update record types */
typedef struct trp_inforec_route {
- TR_NAME *comm;
- TR_NAME *realm;
TR_NAME *trust_router;
TR_NAME *next_hop;
unsigned int next_hop_port;
unsigned int interval;
} TRP_INFOREC_ROUTE;
-/* TODO: define struct trp_msg_info_community */
+typedef struct trp_inforec_comm {
+ TR_COMM_TYPE type;
+ int is_service_realm;
+ int is_idp_realm;
+ TR_APC *apcs;
+ TR_NAME *owner_realm;
+ TR_NAME *owner_contact;
+} TRP_INFOREC_COMM;
typedef union trp_inforec_data {
TRP_INFOREC_ROUTE *route;
- /* TRP_INFOREC_COMM *comm; */
+ TRP_INFOREC_COMM *comm;
} TRP_INFOREC_DATA;
struct trp_inforec {
TRP_INFOREC *next;
TRP_INFOREC_TYPE type;
- TRP_INFOREC_DATA data; /* contains pointer to one of the record types */
+ TRP_INFOREC_DATA *data; /* contains pointer to one of the record types */
};
struct trp_update {
+ TR_NAME *realm;
+ TR_NAME *comm;
TRP_INFOREC *records;
TR_NAME *peer; /* who did this update come from? */
};
TR_EXPORT TRP_INFOREC *trp_upd_get_inforec(TRP_UPD *upd);
void trp_upd_set_inforec(TRP_UPD *upd, TRP_INFOREC *rec);
void trp_upd_add_inforec(TRP_UPD *upd, TRP_INFOREC *rec);
+TR_EXPORT TR_NAME *trp_upd_get_realm(TRP_UPD *upd);
+TR_NAME *trp_upd_dup_realm(TRP_UPD *upd);
+void trp_upd_set_realm(TRP_UPD *upd, TR_NAME *realm);
+TR_EXPORT TR_NAME *trp_upd_get_comm(TRP_UPD *upd);
+TR_NAME *trp_upd_dup_comm(TRP_UPD *upd);
+void trp_upd_set_comm(TRP_UPD *upd, TR_NAME *comm);
TR_EXPORT TR_NAME *trp_upd_get_peer(TRP_UPD *upd);
TR_NAME *trp_upd_dup_peer(TRP_UPD *upd);
void trp_upd_set_peer(TRP_UPD *upd, TR_NAME *peer);
/* static prototypes */
-static void *trp_inforec_route_new(TALLOC_CTX *mem_ctx);
-static void trp_inforec_route_print(TRP_INFOREC_DATA);
+static TRP_INFOREC_DATA *trp_inforec_route_new(TALLOC_CTX *mem_ctx);
+static void trp_inforec_route_print(TRP_INFOREC_DATA *);
+static TRP_INFOREC_DATA *trp_inforec_comm_new(TALLOC_CTX *mem_ctx);
+static void trp_inforec_comm_print(TRP_INFOREC_DATA *);
struct trp_inforec_type_entry {
const char *name;
TRP_INFOREC_TYPE type;
- void *(*allocate)(TALLOC_CTX *);
- void (*print)(TRP_INFOREC_DATA);
+ TRP_INFOREC_DATA *(*allocate)(TALLOC_CTX *);
+ void (*print)(TRP_INFOREC_DATA *);
};
static struct trp_inforec_type_entry trp_inforec_type_table[] = {
{ "route", TRP_INFOREC_TYPE_ROUTE, trp_inforec_route_new, trp_inforec_route_print },
- { "comm", TRP_INFOREC_TYPE_COMMUNITY, NULL, NULL },
+ { "comm", TRP_INFOREC_TYPE_COMMUNITY, trp_inforec_comm_new, trp_inforec_comm_print },
{ NULL, TRP_INFOREC_TYPE_UNKNOWN, NULL, NULL } /* must be the last entry */
};
TRP_INFOREC_ROUTE *body=talloc_get_type_abort(object, TRP_INFOREC_ROUTE);
/* clean up TR_NAME data, which are not managed by talloc */
- if (body->comm != NULL) {
- tr_free_name(body->comm);
- body->comm=NULL;
- tr_debug("trp_inforec_route_destructor: freed community");
- }
- if (body->realm != NULL) {
- tr_free_name(body->realm);
- body->realm=NULL;
- tr_debug("trp_inforec_route_destructor: freed realm");
- }
- if (body->trust_router != NULL) {
+ if (body->trust_router != NULL)
tr_free_name(body->trust_router);
- body->trust_router=NULL;
- tr_debug("trp_inforec_route_destructor: freed trust_router");
- }
- if (body->next_hop != NULL) {
+ if (body->next_hop != NULL)
tr_free_name(body->next_hop);
- body->next_hop=NULL;
- tr_debug("trp_inforec_route_destructor: freed next_hop");
- }
-
return 0;
}
-static void *trp_inforec_route_new(TALLOC_CTX *mem_ctx)
+static TRP_INFOREC_DATA *trp_inforec_route_new(TALLOC_CTX *mem_ctx)
{
- TRP_INFOREC_ROUTE *new_rec=talloc(mem_ctx, TRP_INFOREC_ROUTE);
+ TRP_INFOREC_DATA *new_data=talloc(mem_ctx, TRP_INFOREC_DATA);
+ TRP_INFOREC_ROUTE *new_rec=NULL;
+
+ if (new_data==NULL)
+ return NULL;
- if (new_rec != NULL) {
- new_rec->comm=NULL;
- new_rec->realm=NULL;
+ new_rec=talloc(new_data, TRP_INFOREC_ROUTE);
+ if (new_rec == NULL) {
+ talloc_free(new_data);
+ new_data=NULL;
+ } else {
new_rec->trust_router=NULL;
new_rec->next_hop=NULL;
new_rec->next_hop_port=0;
new_rec->metric=TRP_METRIC_INFINITY;
new_rec->interval=0;
talloc_set_destructor((void *)new_rec, trp_inforec_route_destructor);
+ new_data->route=new_rec;
}
- return new_rec;
+
+ return new_data;
+}
+
+
+static int trp_inforec_comm_destructor(void *obj)
+{
+ TRP_INFOREC_COMM *rec=talloc_get_type_abort(obj, TRP_INFOREC_COMM);
+ if (rec->owner_realm!=NULL)
+ tr_free_name(rec->owner_realm);
+ if (rec->owner_contact!=NULL)
+ tr_free_name(rec->owner_contact);
+ return 0;
+}
+
+static TRP_INFOREC_DATA *trp_inforec_comm_new(TALLOC_CTX *mem_ctx)
+{
+ TRP_INFOREC_DATA *new_data=talloc(mem_ctx, TRP_INFOREC_DATA);
+ TRP_INFOREC_COMM *new_rec=NULL;
+
+ if (new_data==NULL)
+ return NULL;
+
+ new_rec=talloc(new_data, TRP_INFOREC_COMM);
+ if (new_rec==NULL) {
+ talloc_free(new_data);
+ new_data=NULL;
+ } else {
+ new_rec->type=TR_COMM_UNKNOWN;
+ new_rec->is_service_realm=0;
+ new_rec->is_idp_realm=0;
+ new_rec->apcs=NULL;
+ new_rec->owner_realm=NULL;
+ new_rec->owner_contact=NULL;
+ talloc_set_destructor((void *)new_rec, trp_inforec_comm_destructor);
+ new_data->comm=new_rec;
+ }
+
+ return new_data;
}
TRP_INFOREC *trp_inforec_get_next(TRP_INFOREC *rec)
rec->type=type;
}
-TR_NAME *trp_inforec_get_comm(TRP_INFOREC *rec)
-{
- switch (rec->type) {
- case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL)
- return rec->data.route->comm;
- break;
- default:
- break;
- }
- return NULL;
-}
-
-TR_NAME *trp_inforec_dup_comm(TRP_INFOREC *rec)
-{
- return tr_dup_name(trp_inforec_get_comm(rec));
-}
-
-TRP_RC trp_inforec_set_comm(TRP_INFOREC *rec, TR_NAME *comm)
-{
- switch (rec->type) {
- case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL) {
- rec->data.route->comm=comm;
- return TRP_SUCCESS;
- }
- break;
- default:
- break;
- }
- return TRP_ERROR;
-}
-
-TR_NAME *trp_inforec_get_realm(TRP_INFOREC *rec)
-{
- switch (rec->type) {
- case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL)
- return rec->data.route->realm;
- break;
- default:
- break;
- }
- return NULL;
-}
-
-TR_NAME *trp_inforec_dup_realm(TRP_INFOREC *rec)
-{
- return tr_dup_name(trp_inforec_get_realm(rec));
-}
-
-TRP_RC trp_inforec_set_realm(TRP_INFOREC *rec, TR_NAME *realm)
-{
- switch (rec->type) {
- case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL) {
- rec->data.route->realm=realm;
- return TRP_SUCCESS;
- }
- break;
- default:
- break;
- }
- return TRP_ERROR;
-}
-
TR_NAME *trp_inforec_get_trust_router(TRP_INFOREC *rec)
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL)
- return rec->data.route->trust_router;
+ if (rec->data->route!=NULL)
+ return rec->data->route->trust_router;
break;
default:
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL) {
- rec->data.route->trust_router=trust_router;
+ if (rec->data->route!=NULL) {
+ rec->data->route->trust_router=trust_router;
return TRP_SUCCESS;
}
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL)
- return rec->data.route->next_hop;
+ if (rec->data->route!=NULL)
+ return rec->data->route->next_hop;
break;
default:
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL) {
- rec->data.route->next_hop=next_hop;
+ if (rec->data->route!=NULL) {
+ rec->data->route->next_hop=next_hop;
return TRP_SUCCESS;
}
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL)
- return rec->data.route->metric;
+ if (rec->data->route!=NULL)
+ return rec->data->route->metric;
break;
default:
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL) {
- rec->data.route->metric=metric;
+ if (rec->data->route!=NULL) {
+ rec->data->route->metric=metric;
return TRP_SUCCESS;
}
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL)
- return rec->data.route->interval;
+ if (rec->data->route!=NULL)
+ return rec->data->route->interval;
break;
default:
break;
{
switch (rec->type) {
case TRP_INFOREC_TYPE_ROUTE:
- if (rec->data.route!=NULL) {
- rec->data.route->interval=interval;
+ if (rec->data->route!=NULL) {
+ rec->data->route->interval=interval;
return TRP_SUCCESS;
default:
break;
return TRP_ERROR;
}
-/* for internal use only; must set rec->type before calling this */
-static TRP_RC trp_inforec_set_data(TRP_INFOREC *rec, void *data)
+static void trp_inforec_set_data(TRP_INFOREC *rec, TRP_INFOREC_DATA *data)
{
- if (data==NULL)
- return TRP_ERROR;
-
- switch (rec->type) {
- case TRP_INFOREC_TYPE_ROUTE:
- rec->data.route=talloc_get_type(data, TRP_INFOREC_ROUTE);
- break;
- default:
- return TRP_BADTYPE;
- }
- return TRP_SUCCESS;
+ if (rec->data!=NULL)
+ talloc_free(rec->data);
+ rec->data=data;
+ talloc_steal(rec, data); /* make sure it's in our context */
}
/* generic record type */
TRP_INFOREC *trp_inforec_new(TALLOC_CTX *mem_ctx, TRP_INFOREC_TYPE type)
{
TRP_INFOREC *new_rec=talloc(mem_ctx, TRP_INFOREC);
+ TRP_INFOREC_DATA *data=NULL;
struct trp_inforec_type_entry *dtype=get_trp_inforec_type_entry(type);
if ((new_rec != NULL) && (dtype->type != TRP_INFOREC_TYPE_UNKNOWN)) {
trp_inforec_set_type(new_rec, type);
trp_inforec_set_next(new_rec, NULL);
if (dtype->allocate!=NULL) {
- if (TRP_SUCCESS!=trp_inforec_set_data(new_rec, dtype->allocate(new_rec))) {
+ data=dtype->allocate(new_rec);
+ if (data!=NULL)
+ trp_inforec_set_data(new_rec, data);
+ else {
talloc_free(new_rec);
- new_rec=NULL;
+ return NULL;
}
}
}
talloc_steal(upd, rec);
}
+TR_NAME *trp_upd_get_realm(TRP_UPD *upd)
+{
+ return upd->realm;
+}
+
+TR_NAME *trp_upd_dup_realm(TRP_UPD *upd)
+{
+ return tr_dup_name(upd->realm);
+}
+
+void trp_upd_set_realm(TRP_UPD *upd, TR_NAME *realm)
+{
+ if (upd->realm!=NULL)
+ tr_free_name(upd->realm);
+ upd->realm=realm;
+}
+
+TR_NAME *trp_upd_get_comm(TRP_UPD *upd)
+{
+ return upd->comm;
+}
+
+TR_NAME *trp_upd_dup_comm(TRP_UPD *upd)
+{
+ return tr_dup_name(upd->comm);
+}
+
+void trp_upd_set_comm(TRP_UPD *upd, TR_NAME *comm)
+{
+ if (upd->comm!=NULL)
+ tr_free_name(upd->comm);
+ upd->comm=comm;
+}
+
TR_NAME *trp_upd_get_peer(TRP_UPD *upd)
{
return upd->peer;
}
/* pretty print */
-static void trp_inforec_route_print(TRP_INFOREC_DATA data)
-{
- if (data.route!=NULL) {
- printf(" community=%.*s\n realm=%.*s\n trust_router=%.*s\n metric=%d\n interval=%d]\n",
- data.route->comm->len, data.route->comm->buf,
- data.route->realm->len, data.route->realm->buf,
- data.route->trust_router->len, data.route->trust_router->buf,
- data.route->metric, data.route->interval);
+static void trp_inforec_route_print(TRP_INFOREC_DATA *data)
+{
+ if (data->route!=NULL) {
+ printf(" trust_router=%.*s\n metric=%d\n interval=%d]\n",
+ data->route->trust_router->len, data->route->trust_router->buf,
+ data->route->metric, data->route->interval);
}
}
+static void trp_inforec_comm_print(TRP_INFOREC_DATA *data)
+{
+ if (data->comm!=NULL) {
+ printf(" type=%s\n service=%s\n IdP=%s\n owner=%.*s\n contact=%.*s]\n",
+ tr_comm_type_to_str(data->comm->type),
+ (data->comm->is_service_realm)?"yes":"no",
+ (data->comm->is_idp_realm)?"yes":"no",
+ data->comm->owner_realm->len, data->comm->owner_realm->buf,
+ data->comm->owner_contact->len, data->comm->owner_contact->buf);
+ /* TODO: print apcs */
+ }
+}
tr_debug("trps_handle_connection: connection closed.");
}
+/* TODO: check realm/comm, now part of the update instead of inforec */
static TRP_RC trps_validate_update(TRPS_INSTANCE *trps, TRP_UPD *upd)
{
if (upd==NULL) {
return TRP_BADARG;
}
+ if (trp_upd_get_realm(upd)==NULL) {
+ tr_notice("trps_validate_update: received TRP update without realm.");
+ return TRP_ERROR;
+ }
+
+ if (trp_upd_get_comm(upd)==NULL) {
+ tr_notice("trps_validate_update: received TRP update without community.");
+ return TRP_ERROR;
+ }
+
if (trp_upd_get_inforec(upd)==NULL) {
tr_notice("trps_validate_update: received TRP update with no info records.");
return TRP_ERROR;
tr_notice("trps_validate_update: received TRP update without origin peer information.");
return TRP_ERROR;
}
+
return TRP_SUCCESS;
}
{
switch(trp_inforec_get_type(rec)) {
case TRP_INFOREC_TYPE_ROUTE:
- if ((trp_inforec_get_comm(rec)==NULL)
- || (trp_inforec_get_realm(rec)==NULL)
- || (trp_inforec_get_trust_router(rec)==NULL)
+ if ((trp_inforec_get_trust_router(rec)==NULL)
|| (trp_inforec_get_next_hop(rec)==NULL)) {
tr_debug("trps_validate_inforec: missing record info.");
return TRP_ERROR;
return trp_route_get_metric(entry) + trps_cost(trps, peer);
}
-static int trps_check_feasibility(TRPS_INSTANCE *trps, TRP_INFOREC *rec)
+static int trps_check_feasibility(TRPS_INSTANCE *trps, TR_NAME *realm, TR_NAME *comm, TRP_INFOREC *rec)
{
unsigned int rec_metric=trp_inforec_get_metric(rec);
unsigned int new_metric=0;
return 1;
/* updates from our current next hop are always feasible*/
- next_hop=trps_get_next_hop(trps,
- trp_inforec_get_comm(rec),
- trp_inforec_get_realm(rec));;
+ next_hop=trps_get_next_hop(trps, comm, realm);
if ((next_hop!=NULL)
&& (0==tr_name_cmp(next_hop,trp_inforec_get_next_hop(rec)))) {
return 1;
/* compare the existing metric we advertise to what we would advertise
* if we accept this update */
- current_metric=trps_advertised_metric(trps,
- trp_inforec_get_comm(rec),
- trp_inforec_get_realm(rec),
- trp_inforec_get_next_hop(rec));
+ current_metric=trps_advertised_metric(trps, comm, realm, trp_inforec_get_next_hop(rec));
new_metric=rec_metric + trps_cost(trps, trp_inforec_get_next_hop(rec));
if (new_metric <= current_metric)
return 1;
TRP_ROUTE *entry=NULL;
entry=trp_rtable_get_entry(trps->rtable,
- trp_inforec_get_comm(rec),
- trp_inforec_get_realm(rec),
+ trp_upd_get_comm(upd),
+ trp_upd_get_realm(upd),
trp_inforec_get_next_hop(rec));
if (entry==NULL) {
entry=trp_route_new(NULL);
return TRP_NOMEM;
}
- trp_route_set_comm(entry, trp_inforec_dup_comm(rec));
- trp_route_set_realm(entry, trp_inforec_dup_realm(rec));
+ trp_route_set_comm(entry, trp_upd_dup_comm(upd));
+ trp_route_set_realm(entry, trp_upd_dup_realm(upd));
trp_route_set_peer(entry, trp_upd_dup_peer(upd));
trp_route_set_trust_router(entry, trp_inforec_dup_trust_router(rec));
trp_route_set_next_hop(entry, trp_inforec_dup_next_hop(rec));
for (rec=trp_upd_get_inforec(upd); rec!=NULL; rec=trp_inforec_get_next(rec)) {
/* determine feasibility */
- feas=trps_check_feasibility(trps, rec);
+ feas=trps_check_feasibility(trps, trp_upd_get_realm(upd), trp_upd_get_comm(upd), rec);
tr_debug("trps_handle_update: record feasibility=%d", feas);
/* do we have an existing route? */
route=trps_get_route(trps,
- trp_inforec_get_comm(rec),
- trp_inforec_get_realm(rec),
+ trp_upd_get_comm(upd),
+ trp_upd_get_realm(upd),
trp_upd_get_peer(upd));
if (route!=NULL) {
/* there was a route table entry already */
/* Note that we leave the next hop empty since the recipient fills that in.
* This is where we add the link cost (currently always 1) to the next peer. */
- if ((trp_inforec_set_comm(rec, trp_route_dup_comm(route)) != TRP_SUCCESS)
- ||(trp_inforec_set_realm(rec, trp_route_dup_realm(route)) != TRP_SUCCESS)
- ||(trp_inforec_set_trust_router(rec, trp_route_dup_trust_router(route)) != TRP_SUCCESS)
+ if ((trp_inforec_set_trust_router(rec, trp_route_dup_trust_router(route)) != TRP_SUCCESS)
||(trp_inforec_set_metric(rec,
trps_metric_add(trp_route_get_metric(route),
linkcost)) != TRP_SUCCESS)
tr_debug("trps_update_one_peer: sending %u update records.", (unsigned int)n_updates);
upd=trp_upd_new(tmp_ctx);
+ /* TODO: set realm/comm in update; used to be in the inforec */
for (ii=0; ii<n_updates; ii++) {
rec=trps_route_to_inforec(tmp_ctx, trps, update_list[ii]);
if (rec==NULL) {