From 5d88f5956e15c32cb0fb6c7bfdf8dec4ce34ee41 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Tue, 27 Sep 2016 15:35:18 -0400 Subject: [PATCH] Move community/realm out of inforec and into update message. --- common/tr_comm.c | 27 ++++- common/tr_config.c | 2 +- common/tr_msg.c | 87 ++++++++------ include/tr_comm.h | 1 + include/trp_internal.h | 19 +++- include/trust_router/trp.h | 6 + trp/trp_upd.c | 274 +++++++++++++++++++++++---------------------- trp/trps.c | 46 ++++---- 8 files changed, 259 insertions(+), 203 deletions(-) diff --git a/common/tr_comm.c b/common/tr_comm.c index f71d130..b8b8730 100644 --- a/common/tr_comm.c +++ b/common/tr_comm.c @@ -46,8 +46,8 @@ static int tr_comm_destructor(void *obj) 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; } @@ -114,7 +114,7 @@ TR_NAME *tr_comm_get_owner_realm(TR_COMM *comm) 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) @@ -131,7 +131,7 @@ TR_NAME *tr_comm_get_owner_contact(TR_COMM *comm) 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 */ @@ -235,3 +235,22 @@ TR_COMM *tr_comm_lookup(TR_COMM *comms, TR_NAME *comm_name) } 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; +} diff --git a/common/tr_config.c b/common/tr_config.c index f5eedd8..4307183 100644 --- a/common/tr_config.c +++ b/common/tr_config.c @@ -1720,7 +1720,7 @@ static TR_COMM *tr_cfg_parse_one_comm (TALLOC_CTX *mem_ctx, TR_CFG *trc, json_t 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; diff --git a/common/tr_msg.c b/common/tr_msg.c index 9591cd4..879ac55 100644 --- a/common/tr_msg.c +++ b/common/tr_msg.c @@ -534,7 +534,7 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp) /* 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; @@ -543,29 +543,8 @@ static TRP_RC tr_msg_encode_inforec_route(json_t *jrec, TRP_INFOREC *rec ) 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) @@ -652,20 +631,6 @@ static TRP_INFOREC *tr_msg_decode_trp_inforec(TALLOC_CTX *mem_ctx, json_t *jreco 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; @@ -701,7 +666,9 @@ static json_t *tr_msg_encode_trp_upd(TRP_UPD *update) 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; @@ -710,6 +677,32 @@ static json_t *tr_msg_encode_trp_upd(TRP_UPD *update) 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); @@ -744,6 +737,8 @@ static TRP_UPD *tr_msg_decode_trp_upd(TALLOC_CTX *mem_ctx, json_t *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); @@ -752,6 +747,24 @@ static TRP_UPD *tr_msg_decode_trp_upd(TALLOC_CTX *mem_ctx, json_t *jupdate) 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; diff --git a/include/tr_comm.h b/include/tr_comm.h index 8730292..85c7b03 100644 --- a/include/tr_comm.h +++ b/include/tr_comm.h @@ -77,5 +77,6 @@ void tr_comm_add_rp_realm(TR_COMM *comm, TR_RP_REALM *realm); 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 diff --git a/include/trp_internal.h b/include/trp_internal.h index 09decc1..c7e4b22 100644 --- a/include/trp_internal.h +++ b/include/trp_internal.h @@ -43,13 +43,13 @@ #include #include #include +#include +#include #include /* 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; @@ -57,20 +57,29 @@ typedef struct trp_inforec_route { 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? */ }; diff --git a/include/trust_router/trp.h b/include/trust_router/trp.h index e683649..f54c959 100644 --- a/include/trust_router/trp.h +++ b/include/trust_router/trp.h @@ -79,6 +79,12 @@ void trp_upd_free(TRP_UPD *update); 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); diff --git a/trp/trp_upd.c b/trp/trp_upd.c index 927c993..cbffd8c 100644 --- a/trp/trp_upd.c +++ b/trp/trp_upd.c @@ -41,19 +41,21 @@ /* 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 */ }; @@ -95,45 +97,73 @@ static int trp_inforec_route_destructor(void *object) 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) @@ -171,78 +201,12 @@ void trp_inforec_set_type(TRP_INFOREC *rec, TRP_INFOREC_TYPE type) 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; @@ -259,8 +223,8 @@ TRP_RC trp_inforec_set_trust_router(TRP_INFOREC *rec, TR_NAME *trust_router) { 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; @@ -275,8 +239,8 @@ TR_NAME *trp_inforec_get_next_hop(TRP_INFOREC *rec) { 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; @@ -293,8 +257,8 @@ TRP_RC trp_inforec_set_next_hop(TRP_INFOREC *rec, TR_NAME *next_hop) { 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; @@ -308,8 +272,8 @@ unsigned int trp_inforec_get_metric(TRP_INFOREC *rec) { 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; @@ -321,8 +285,8 @@ TRP_RC trp_inforec_set_metric(TRP_INFOREC *rec, unsigned int metric) { 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; @@ -336,8 +300,8 @@ unsigned int trp_inforec_get_interval(TRP_INFOREC *rec) { 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; @@ -349,8 +313,8 @@ TRP_RC trp_inforec_set_interval(TRP_INFOREC *rec, unsigned int interval) { 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; @@ -360,35 +324,31 @@ TRP_RC trp_inforec_set_interval(TRP_INFOREC *rec, unsigned int interval) 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; } } } @@ -451,6 +411,40 @@ void trp_upd_add_inforec(TRP_UPD *upd, TRP_INFOREC *rec) 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; @@ -480,14 +474,24 @@ void trp_upd_set_next_hop(TRP_UPD *upd, const char *hostname, unsigned int port) } /* 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 */ + } +} diff --git a/trp/trps.c b/trp/trps.c index 47479c7..54a43a7 100644 --- a/trp/trps.c +++ b/trp/trps.c @@ -458,6 +458,7 @@ void trps_handle_connection(TRPS_INSTANCE *trps, TRP_CONNECTION *conn) 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) { @@ -465,6 +466,16 @@ static TRP_RC trps_validate_update(TRPS_INSTANCE *trps, TRP_UPD *upd) 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; @@ -474,6 +485,7 @@ static TRP_RC trps_validate_update(TRPS_INSTANCE *trps, TRP_UPD *upd) tr_notice("trps_validate_update: received TRP update without origin peer information."); return TRP_ERROR; } + return TRP_SUCCESS; } @@ -483,9 +495,7 @@ static TRP_RC trps_validate_inforec(TRPS_INSTANCE *trps, TRP_INFOREC *rec) { 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; @@ -526,7 +536,7 @@ static unsigned int trps_advertised_metric(TRPS_INSTANCE *trps, TR_NAME *comm, T 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; @@ -542,9 +552,7 @@ static int trps_check_feasibility(TRPS_INSTANCE *trps, TRP_INFOREC *rec) 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; @@ -553,10 +561,7 @@ static int trps_check_feasibility(TRPS_INSTANCE *trps, TRP_INFOREC *rec) /* 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; @@ -582,8 +587,8 @@ static TRP_RC trps_accept_update(TRPS_INSTANCE *trps, TRP_UPD *upd, TRP_INFOREC 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); @@ -592,8 +597,8 @@ static TRP_RC trps_accept_update(TRPS_INSTANCE *trps, TRP_UPD *upd, TRP_INFOREC 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)); @@ -657,13 +662,13 @@ static TRP_RC trps_handle_update(TRPS_INSTANCE *trps, TRP_UPD *upd) 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 */ @@ -945,9 +950,7 @@ static TRP_INFOREC *trps_route_to_inforec(TALLOC_CTX *mem_ctx, TRPS_INSTANCE *tr /* 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) @@ -1029,6 +1032,7 @@ static TRP_RC trps_update_one_peer(TRPS_INSTANCE *trps, 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