From 9da61f0871476e2cb7f678b347d7b4e5db834b20 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 19 Apr 2018 12:14:18 -0400 Subject: [PATCH] Split trp_ptable into trp_ptable, trp_peer, and _encoders modules No functional changes --- CMakeLists.txt | 2 +- Makefile.am | 5 +- common/tr_msg.c | 3 +- include/trp_internal.h | 2 + include/trp_peer.h | 94 ++++++++++++++++ include/trp_ptable.h | 52 +-------- tr/tr_trp.c | 1 + trp/test/ptbl_test.c | 2 +- trp/trp_peer.c | 277 ++++++++++++++++++++++++++++++++++++++++++++++ trp/trp_peer_encoders.c | 47 ++++++++ trp/trp_ptable.c | 264 +------------------------------------------ trp/trp_ptable_encoders.c | 57 ++++++++++ trp/trps.c | 1 + 13 files changed, 490 insertions(+), 317 deletions(-) create mode 100644 include/trp_peer.h create mode 100644 trp/trp_peer.c create mode 100644 trp/trp_peer_encoders.c create mode 100644 trp/trp_ptable_encoders.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 06ec038..442aa97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,7 +96,7 @@ set(SOURCE_FILES trp/trp_upd.c trp/trpc.c trp/trps.c include/tr_name_internal.h mon/mon_req.c mon/mon_req_encode.c mon/mon_req_decode.c - mon/mon_resp.c mon/mon_common.c mon/mon_resp_encode.c mon/mon_resp_decode.c tr/tr_mon.c mon/mons.c include/tr_socket.h common/tr_gss.c include/tr_gss.h common/tr_config_internal.c mon/mons_handlers.c include/mons_handlers.h tr/tr_tid_mons.c tr/tr_tid_mons.c trp/trp_route.c include/trp_route.h trp/trp_rtable_encoders.c trp/trp_route_encoders.c) + mon/mon_resp.c mon/mon_common.c mon/mon_resp_encode.c mon/mon_resp_decode.c tr/tr_mon.c mon/mons.c include/tr_socket.h common/tr_gss.c include/tr_gss.h common/tr_config_internal.c mon/mons_handlers.c include/mons_handlers.h tr/tr_tid_mons.c tr/tr_tid_mons.c trp/trp_route.c include/trp_route.h trp/trp_rtable_encoders.c trp/trp_route_encoders.c trp/trp_peer.c include/trp_peer.h trp/trp_peer_encoders.c trp/trp_ptable_encoders.c) # Does not actually build! add_executable(trust_router ${SOURCE_FILES}) diff --git a/Makefile.am b/Makefile.am index a558bbc..0c7ccba 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,7 +32,10 @@ tid/tidc.c trp_srcs = trp/trp_conn.c \ trp/trps.c \ trp/trpc.c \ +trp/trp_peer.c \ +trp/trp_peer_encoders.c \ trp/trp_ptable.c \ +trp/trp_ptable_encoders.c \ trp/trp_route.c \ trp/trp_route_encoders.c \ trp/trp_rtable.c \ @@ -257,7 +260,7 @@ noinst_HEADERS = include/gsscon.h include/tr_config.h \ include/tr_filter.h include/tr_gss_names.h \ include/tid_internal.h include/trp_internal.h include/trp_route.h \ include/tr_cfgwatch.h include/tr_event.h \ - include/tr_mq.h include/trp_ptable.h \ + include/tr_mq.h include/trp_peer.h include/trp_ptable.h \ include/trp_rtable.h include/tr_util.h \ include/tr_name_internal.h include/tr_gss.h diff --git a/common/tr_msg.c b/common/tr_msg.c index 129ea97..ab80345 100644 --- a/common/tr_msg.c +++ b/common/tr_msg.c @@ -41,11 +41,10 @@ #include #include - #include #include -#include #include +#include #include #include #include diff --git a/include/trp_internal.h b/include/trp_internal.h index d6828d5..a35a043 100644 --- a/include/trp_internal.h +++ b/include/trp_internal.h @@ -43,7 +43,9 @@ #include #include #include +#include #include +#include #include #include #include diff --git a/include/trp_peer.h b/include/trp_peer.h new file mode 100644 index 0000000..e0b7416 --- /dev/null +++ b/include/trp_peer.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016-2018, 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. + * + */ + +#ifndef TRUST_ROUTER_TRP_PEER_H +#define TRUST_ROUTER_TRP_PEER_H + +#include +#include + +typedef enum trp_peer_conn_status { + PEER_DISCONNECTED=0, + PEER_CONNECTED +} TRP_PEER_CONN_STATUS; + +typedef struct trp_peer TRP_PEER; +struct trp_peer { + TRP_PEER *next; /* for making a linked list */ + TR_NAME *label; /* often null, set on first call to trp_peer_get_label or dup_label */ + char *server; + TR_GSS_NAMES *gss_names; + TR_NAME *servicename; + unsigned int port; + unsigned int linkcost; + struct timespec last_conn_attempt; + TRP_PEER_CONN_STATUS outgoing_status; + TRP_PEER_CONN_STATUS incoming_status; + void (*conn_status_cb)(TRP_PEER *, void *); /* callback for connected status change */ + void *conn_status_cookie; + TR_FILTER_SET *filters; +}; + + +TRP_PEER *trp_peer_new(TALLOC_CTX *memctx); +void trp_peer_free(TRP_PEER *peer); +TRP_PEER *trp_peer_tail(TRP_PEER *peer); +TR_NAME *trp_peer_get_label(TRP_PEER *peer); +TR_NAME *trp_peer_dup_label(TRP_PEER *peer); +char *trp_peer_get_server(TRP_PEER *peer); +void trp_peer_set_server(TRP_PEER *peer, const char *server); +void trp_peer_add_gss_name(TRP_PEER *peer, TR_NAME *gssname); +void trp_peer_set_gss_names(TRP_PEER *peer, TR_GSS_NAMES *gss_names); +TR_GSS_NAMES *trp_peer_get_gss_names(TRP_PEER *peer); +TR_NAME *trp_peer_get_servicename(TRP_PEER *peer); +TR_NAME *trp_peer_dup_servicename(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); +struct timespec *trp_peer_get_last_conn_attempt(TRP_PEER *peer); +void trp_peer_set_last_conn_attempt(TRP_PEER *peer, struct timespec *time); +TRP_PEER_CONN_STATUS trp_peer_get_outgoing_status(TRP_PEER *peer); +void trp_peer_set_outgoing_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status); +TRP_PEER_CONN_STATUS trp_peer_get_incoming_status(TRP_PEER *peer); +void trp_peer_set_incoming_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status); +int trp_peer_is_connected(TRP_PEER *peer); +void trp_peer_set_linkcost(TRP_PEER *peer, unsigned int linkcost); +void trp_peer_set_conn_status_cb(TRP_PEER *peer, void (*cb)(TRP_PEER *, void *), void *cookie); +void trp_peer_set_filters(TRP_PEER *peer, TR_FILTER_SET *filts); +TR_FILTER *trp_peer_get_filter(TRP_PEER *peer, TR_FILTER_TYPE ftype); + +/* trp_peer_encoders.c */ +char *trp_peer_to_str(TALLOC_CTX *memctx, TRP_PEER *peer, const char *sep); + +#endif //TRUST_ROUTER_TRP_PEER_H diff --git a/include/trp_ptable.h b/include/trp_ptable.h index 0bf7c30..43c320b 100644 --- a/include/trp_ptable.h +++ b/include/trp_ptable.h @@ -42,28 +42,7 @@ #include #include #include - -typedef enum trp_peer_conn_status { - PEER_DISCONNECTED=0, - PEER_CONNECTED -} TRP_PEER_CONN_STATUS; - -typedef struct trp_peer TRP_PEER; -struct trp_peer { - TRP_PEER *next; /* for making a linked list */ - TR_NAME *label; /* often null, set on first call to trp_peer_get_label or dup_label */ - char *server; - TR_GSS_NAMES *gss_names; - TR_NAME *servicename; - unsigned int port; - unsigned int linkcost; - struct timespec last_conn_attempt; - TRP_PEER_CONN_STATUS outgoing_status; - TRP_PEER_CONN_STATUS incoming_status; - void (*conn_status_cb)(TRP_PEER *, void *); /* callback for connected status change */ - void *conn_status_cookie; - TR_FILTER_SET *filters; -}; +#include typedef struct trp_ptable { TRP_PEER *head; /* head of a peer table list */ @@ -78,38 +57,13 @@ TRP_RC trp_ptable_add(TRP_PTABLE *ptbl, TRP_PEER *newpeer); TRP_RC trp_ptable_remove(TRP_PTABLE *ptbl, TRP_PEER *peer); TRP_PEER *trp_ptable_find_gss_name(TRP_PTABLE *ptbl, TR_NAME *gssname); TRP_PEER *trp_ptable_find_servicename(TRP_PTABLE *ptbl, TR_NAME *servicename); -char *trp_ptable_to_str(TALLOC_CTX *memctx, TRP_PTABLE *ptbl, const char *sep, const char *lineterm); TRP_PTABLE_ITER *trp_ptable_iter_new(TALLOC_CTX *mem_ctx); TRP_PEER *trp_ptable_iter_first(TRP_PTABLE_ITER *iter, TRP_PTABLE *ptbl); TRP_PEER *trp_ptable_iter_next(TRP_PTABLE_ITER *iter); void trp_ptable_iter_free(TRP_PTABLE_ITER *iter); -TRP_PEER *trp_peer_new(TALLOC_CTX *memctx); -void trp_peer_free(TRP_PEER *peer); -TR_NAME *trp_peer_get_label(TRP_PEER *peer); -TR_NAME *trp_peer_dup_label(TRP_PEER *peer); -char *trp_peer_get_server(TRP_PEER *peer); -void trp_peer_set_server(TRP_PEER *peer, const char *server); -void trp_peer_add_gss_name(TRP_PEER *peer, TR_NAME *gssname); -void trp_peer_set_gss_names(TRP_PEER *peer, TR_GSS_NAMES *gss_names); -TR_GSS_NAMES *trp_peer_get_gss_names(TRP_PEER *peer); -TR_NAME *trp_peer_get_servicename(TRP_PEER *peer); -TR_NAME *trp_peer_dup_servicename(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); -struct timespec *trp_peer_get_last_conn_attempt(TRP_PEER *peer); -void trp_peer_set_last_conn_attempt(TRP_PEER *peer, struct timespec *time); -TRP_PEER_CONN_STATUS trp_peer_get_outgoing_status(TRP_PEER *peer); -void trp_peer_set_outgoing_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status); -TRP_PEER_CONN_STATUS trp_peer_get_incoming_status(TRP_PEER *peer); -void trp_peer_set_incoming_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status); -int trp_peer_is_connected(TRP_PEER *peer); -void trp_peer_set_linkcost(TRP_PEER *peer, unsigned int linkcost); -void trp_peer_set_conn_status_cb(TRP_PEER *peer, void (*cb)(TRP_PEER *, void *), void *cookie); -void trp_peer_set_filters(TRP_PEER *peer, TR_FILTER_SET *filts); -TR_FILTER *trp_peer_get_filter(TRP_PEER *peer, TR_FILTER_TYPE ftype); -char *trp_peer_to_str(TALLOC_CTX *memctx, TRP_PEER *peer, const char *sep); +/* trp_ptable_encoders.c */ +char *trp_ptable_to_str(TALLOC_CTX *memctx, TRP_PTABLE *ptbl, const char *sep, const char *lineterm); #endif /* _TRP_PTABLE_H_ */ diff --git a/tr/tr_trp.c b/tr/tr_trp.c index bd98c81..9dc1f8d 100644 --- a/tr/tr_trp.c +++ b/tr/tr_trp.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include diff --git a/trp/test/ptbl_test.c b/trp/test/ptbl_test.c index 95b0756..5853895 100644 --- a/trp/test/ptbl_test.c +++ b/trp/test/ptbl_test.c @@ -39,9 +39,9 @@ #include #include #include +#include #include - /* Can't do the updates test because trps_select_updates_for_peer() is now static */ #define VERIFY_UPDATES 0 diff --git a/trp/trp_peer.c b/trp/trp_peer.c new file mode 100644 index 0000000..c98cf47 --- /dev/null +++ b/trp/trp_peer.c @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2016-2018, 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 +#include + +#include +#include +#include +#include +#include +#include + +static int trp_peer_destructor(void *object) +{ + TRP_PEER *peer=talloc_get_type_abort(object, TRP_PEER); + if (peer->label!=NULL) + tr_free_name(peer->label); + if (peer->servicename!=NULL) + tr_free_name(peer->servicename); + return 0; +} +TRP_PEER *trp_peer_new(TALLOC_CTX *memctx) +{ + TRP_PEER *peer=talloc(memctx, TRP_PEER); + if (peer!=NULL) { + peer->next=NULL; + peer->label=NULL; + peer->server=NULL; + peer->servicename=NULL; + peer->gss_names=NULL; + peer->port=0; + peer->linkcost=TRP_LINKCOST_DEFAULT; + peer->last_conn_attempt=(struct timespec){0,0}; + peer->outgoing_status=PEER_DISCONNECTED; + peer->incoming_status=PEER_DISCONNECTED; + peer->conn_status_cb=NULL; + peer->conn_status_cookie=NULL; + peer->filters=NULL; + talloc_set_destructor((void *)peer, trp_peer_destructor); + } + return peer; +} + +void trp_peer_free(TRP_PEER *peer) +{ + talloc_free(peer); +} + +TRP_PEER *trp_peer_tail(TRP_PEER *peer) +{ + while (peer->next!=NULL) { + peer=peer->next; + } + return peer; +} + + +/* Get a name that identifies this peer for display to the user, etc. + * Do not modify or free the label. */ +TR_NAME *trp_peer_get_label(TRP_PEER *peer) +{ + char *s=NULL; + + if (peer->label==NULL) { + s=talloc_asprintf(NULL, "%s:%u", peer->server, peer->port); + if (s!=NULL) { + peer->label=tr_new_name(s); + talloc_free(s); + } + } + return peer->label; +} + +/* Get a name that identifies this peer for display to the user, etc. + * Makes a copy, caller is responsible for freeing. */ +TR_NAME *trp_peer_dup_label(TRP_PEER *peer) +{ + return tr_dup_name(trp_peer_get_label(peer));; +} + +char *trp_peer_get_server(TRP_PEER *peer) +{ + return peer->server; +} + +static void trp_peer_set_servicename(TRP_PEER *peer, const char *server) +{ + char *name=NULL; + if (peer->servicename !=NULL) + tr_free_name(peer->servicename); + + if (server!=NULL) + name=talloc_asprintf(NULL, "trustrouter/%s", server); + + if (name!=NULL) { + peer->servicename=tr_new_name(name); + talloc_free(name); + } else { + peer->servicename=NULL; + } +} + +/* copies input; on error, peer->servicename will be null */ +void trp_peer_set_server(TRP_PEER *peer, const char *server) +{ + peer->server=talloc_strdup(peer, server); /* will be null on error */ + trp_peer_set_servicename(peer, server); +} + +void trp_peer_add_gss_name(TRP_PEER *peer, TR_NAME *gss_name) +{ + if (peer->gss_names==NULL) + trp_peer_set_gss_names(peer, tr_gss_names_new(peer)); + tr_gss_names_add(peer->gss_names, gss_name); +} + +void trp_peer_set_gss_names(TRP_PEER *peer, TR_GSS_NAMES *gss_names) +{ + if (peer->gss_names!=NULL) + tr_gss_names_free(peer->gss_names); + + peer->gss_names=gss_names; + talloc_steal(peer, gss_names); +} + +/* get the peer gss_names, caller must not free the result */ +TR_GSS_NAMES *trp_peer_get_gss_names(TRP_PEER *peer) +{ + return peer->gss_names; +} + +/* get the service name (i.e., gssname we see when we connect to this peer) */ +TR_NAME *trp_peer_get_servicename(TRP_PEER *peer) +{ + return peer->servicename; +} + +/* get a copy of the servicename, caller must free via tr_free_name */ +TR_NAME *trp_peer_dup_servicename(TRP_PEER *peer) +{ + return tr_dup_name(peer->servicename); +} + +unsigned int trp_peer_get_port(TRP_PEER *peer) +{ + return peer->port; +} + +void trp_peer_set_port(TRP_PEER *peer, unsigned int port) +{ + peer->port=port; +} + +unsigned int trp_peer_get_linkcost(TRP_PEER *peer) +{ + if (peer!=NULL) + return peer->linkcost; + else + return 1; +} + +void trp_peer_set_linkcost(TRP_PEER *peer, unsigned int linkcost) +{ + if ((linkcost>TRP_METRIC_INFINITY) && (linkcost!=TRP_METRIC_INVALID)) { + /* This indicates a programming error, but probably means an already infinite metric + * was (incorrectly) incremented. Issue a warning and proceed with an infinite metric. */ + tr_warning("trp_peer_set_linkcost: link cost > infinity encountered, setting to infinity"); + linkcost=TRP_METRIC_INFINITY; + } + peer->linkcost=linkcost; +} + +void trp_peer_set_conn_status_cb(TRP_PEER *peer, void (*cb)(TRP_PEER *, void *), void *cookie) +{ + peer->conn_status_cb=cb; + peer->conn_status_cookie=cookie; +} + +/** + * Set the filter associated with this peer. Any existing filter will be freed. Takes responsibility for + * freeing the new filter. + * + * @param peer Peer to modify + * @param filts New filter to attach to the peer + */ +void trp_peer_set_filters(TRP_PEER *peer, TR_FILTER_SET *filts) +{ + if (peer->filters!=NULL) + tr_filter_set_free(peer->filters); + + peer->filters=filts; + talloc_steal(peer, filts); +} + +TR_FILTER *trp_peer_get_filter(TRP_PEER *peer, TR_FILTER_TYPE ftype) +{ + return tr_filter_set_get(peer->filters, ftype); +} + +struct timespec *trp_peer_get_last_conn_attempt(TRP_PEER *peer) +{ + return &(peer->last_conn_attempt); +} + +void trp_peer_set_last_conn_attempt(TRP_PEER *peer, struct timespec *time) +{ + peer->last_conn_attempt=*time; +} + +void trp_peer_set_outgoing_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status) +{ + TR_NAME *peer_label=trp_peer_get_label(peer); + int was_connected=trp_peer_is_connected(peer); + peer->outgoing_status=status; + tr_debug("trp_peer_set_outgoing_status: %s: status=%d peer connected was %d now %d.", + peer_label->buf, status, was_connected, trp_peer_is_connected(peer)); + if ((trp_peer_is_connected(peer) != was_connected) && (peer->conn_status_cb!=NULL)) + peer->conn_status_cb(peer, peer->conn_status_cookie); +} + +TRP_PEER_CONN_STATUS trp_peer_get_outgoing_status(TRP_PEER *peer) +{ + return peer->outgoing_status; +} + +void trp_peer_set_incoming_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status) +{ + TR_NAME *peer_label=trp_peer_get_label(peer); + int was_connected=trp_peer_is_connected(peer); + peer->incoming_status=status; + tr_debug("trp_peer_set_incoming_status: %s: status=%d peer connected was %d now %d.", + peer_label->buf, status, was_connected, trp_peer_is_connected(peer)); + if ((trp_peer_is_connected(peer) != was_connected) && (peer->conn_status_cb!=NULL)) + peer->conn_status_cb(peer, peer->conn_status_cookie); +} + +TRP_PEER_CONN_STATUS trp_peer_get_incoming_status(TRP_PEER *peer) +{ + return peer->incoming_status; +} + +int trp_peer_is_connected(TRP_PEER *peer) +{ + return (peer->outgoing_status==PEER_CONNECTED) && (peer->incoming_status==PEER_CONNECTED); +} diff --git a/trp/trp_peer_encoders.c b/trp/trp_peer_encoders.c new file mode 100644 index 0000000..5798110 --- /dev/null +++ b/trp/trp_peer_encoders.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016-2018, 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 +#include + +char *trp_peer_to_str(TALLOC_CTX *memctx, TRP_PEER *peer, const char *sep) +{ + if (sep==NULL) + sep=", "; + return talloc_asprintf(memctx, + "%s:%u%s0x%04X", + peer->server, peer->port, sep, + peer->linkcost); +} + diff --git a/trp/trp_ptable.c b/trp/trp_ptable.c index 7552cff..fa0ca84 100644 --- a/trp/trp_ptable.c +++ b/trp/trp_ptable.c @@ -40,203 +40,8 @@ #include #include #include +#include -static int trp_peer_destructor(void *object) -{ - TRP_PEER *peer=talloc_get_type_abort(object, TRP_PEER); - if (peer->label!=NULL) - tr_free_name(peer->label); - if (peer->servicename!=NULL) - tr_free_name(peer->servicename); - return 0; -} -TRP_PEER *trp_peer_new(TALLOC_CTX *memctx) -{ - TRP_PEER *peer=talloc(memctx, TRP_PEER); - if (peer!=NULL) { - peer->next=NULL; - peer->label=NULL; - peer->server=NULL; - peer->servicename=NULL; - peer->gss_names=NULL; - peer->port=0; - peer->linkcost=TRP_LINKCOST_DEFAULT; - peer->last_conn_attempt=(struct timespec){0,0}; - peer->outgoing_status=PEER_DISCONNECTED; - peer->incoming_status=PEER_DISCONNECTED; - peer->conn_status_cb=NULL; - peer->conn_status_cookie=NULL; - peer->filters=NULL; - talloc_set_destructor((void *)peer, trp_peer_destructor); - } - return peer; -} - -void trp_peer_free(TRP_PEER *peer) -{ - talloc_free(peer); -} - -static TRP_PEER *trp_peer_tail(TRP_PEER *peer) -{ - while (peer->next!=NULL) { - peer=peer->next; - } - return peer; -} - - -/* Get a name that identifies this peer for display to the user, etc. - * Do not modify or free the label. */ -TR_NAME *trp_peer_get_label(TRP_PEER *peer) -{ - char *s=NULL; - - if (peer->label==NULL) { - s=talloc_asprintf(NULL, "%s:%u", peer->server, peer->port); - if (s!=NULL) { - peer->label=tr_new_name(s); - talloc_free(s); - } - } - return peer->label; -} - -/* Get a name that identifies this peer for display to the user, etc. - * Makes a copy, caller is responsible for freeing. */ -TR_NAME *trp_peer_dup_label(TRP_PEER *peer) -{ - return tr_dup_name(trp_peer_get_label(peer));; -} - -char *trp_peer_get_server(TRP_PEER *peer) -{ - return peer->server; -} - -static void trp_peer_set_servicename(TRP_PEER *peer, const char *server) -{ - char *name=NULL; - if (peer->servicename !=NULL) - tr_free_name(peer->servicename); - - if (server!=NULL) - name=talloc_asprintf(NULL, "trustrouter/%s", server); - - if (name!=NULL) { - peer->servicename=tr_new_name(name); - talloc_free(name); - } else { - peer->servicename=NULL; - } -} - -/* copies input; on error, peer->servicename will be null */ -void trp_peer_set_server(TRP_PEER *peer, const char *server) -{ - peer->server=talloc_strdup(peer, server); /* will be null on error */ - trp_peer_set_servicename(peer, server); -} - -void trp_peer_add_gss_name(TRP_PEER *peer, TR_NAME *gss_name) -{ - if (peer->gss_names==NULL) - trp_peer_set_gss_names(peer, tr_gss_names_new(peer)); - tr_gss_names_add(peer->gss_names, gss_name); -} - -void trp_peer_set_gss_names(TRP_PEER *peer, TR_GSS_NAMES *gss_names) -{ - if (peer->gss_names!=NULL) - tr_gss_names_free(peer->gss_names); - - peer->gss_names=gss_names; - talloc_steal(peer, gss_names); -} - -/* get the peer gss_names, caller must not free the result */ -TR_GSS_NAMES *trp_peer_get_gss_names(TRP_PEER *peer) -{ - return peer->gss_names; -} - -/* get the service name (i.e., gssname we see when we connect to this peer) */ -TR_NAME *trp_peer_get_servicename(TRP_PEER *peer) -{ - return peer->servicename; -} - -/* get a copy of the servicename, caller must free via tr_free_name */ -TR_NAME *trp_peer_dup_servicename(TRP_PEER *peer) -{ - return tr_dup_name(peer->servicename); -} - -unsigned int trp_peer_get_port(TRP_PEER *peer) -{ - return peer->port; -} - -void trp_peer_set_port(TRP_PEER *peer, unsigned int port) -{ - peer->port=port; -} - -unsigned int trp_peer_get_linkcost(TRP_PEER *peer) -{ - if (peer!=NULL) - return peer->linkcost; - else - return 1; -} - -void trp_peer_set_linkcost(TRP_PEER *peer, unsigned int linkcost) -{ - if ((linkcost>TRP_METRIC_INFINITY) && (linkcost!=TRP_METRIC_INVALID)) { - /* This indicates a programming error, but probably means an already infinite metric - * was (incorrectly) incremented. Issue a warning and proceed with an infinite metric. */ - tr_warning("trp_peer_set_linkcost: link cost > infinity encountered, setting to infinity"); - linkcost=TRP_METRIC_INFINITY; - } - peer->linkcost=linkcost; -} - -void trp_peer_set_conn_status_cb(TRP_PEER *peer, void (*cb)(TRP_PEER *, void *), void *cookie) -{ - peer->conn_status_cb=cb; - peer->conn_status_cookie=cookie; -} - -/** - * Set the filter associated with this peer. Any existing filter will be freed. Takes responsibility for - * freeing the new filter. - * - * @param peer Peer to modify - * @param filts New filter to attach to the peer - */ -void trp_peer_set_filters(TRP_PEER *peer, TR_FILTER_SET *filts) -{ - if (peer->filters!=NULL) - tr_filter_set_free(peer->filters); - - peer->filters=filts; - talloc_steal(peer, filts); -} - -TR_FILTER *trp_peer_get_filter(TRP_PEER *peer, TR_FILTER_TYPE ftype) -{ - return tr_filter_set_get(peer->filters, ftype); -} - -struct timespec *trp_peer_get_last_conn_attempt(TRP_PEER *peer) -{ - return &(peer->last_conn_attempt); -} - -void trp_peer_set_last_conn_attempt(TRP_PEER *peer, struct timespec *time) -{ - peer->last_conn_attempt=*time; -} TRP_PTABLE *trp_ptable_new(TALLOC_CTX *memctx) { @@ -247,43 +52,6 @@ TRP_PTABLE *trp_ptable_new(TALLOC_CTX *memctx) return ptbl; } -void trp_peer_set_outgoing_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status) -{ - TR_NAME *peer_label=trp_peer_get_label(peer); - int was_connected=trp_peer_is_connected(peer); - peer->outgoing_status=status; - tr_debug("trp_peer_set_outgoing_status: %s: status=%d peer connected was %d now %d.", - peer_label->buf, status, was_connected, trp_peer_is_connected(peer)); - if ((trp_peer_is_connected(peer) != was_connected) && (peer->conn_status_cb!=NULL)) - peer->conn_status_cb(peer, peer->conn_status_cookie); -} - -TRP_PEER_CONN_STATUS trp_peer_get_outgoing_status(TRP_PEER *peer) -{ - return peer->outgoing_status; -} - -void trp_peer_set_incoming_status(TRP_PEER *peer, TRP_PEER_CONN_STATUS status) -{ - TR_NAME *peer_label=trp_peer_get_label(peer); - int was_connected=trp_peer_is_connected(peer); - peer->incoming_status=status; - tr_debug("trp_peer_set_incoming_status: %s: status=%d peer connected was %d now %d.", - peer_label->buf, status, was_connected, trp_peer_is_connected(peer)); - if ((trp_peer_is_connected(peer) != was_connected) && (peer->conn_status_cb!=NULL)) - peer->conn_status_cb(peer, peer->conn_status_cookie); -} - -TRP_PEER_CONN_STATUS trp_peer_get_incoming_status(TRP_PEER *peer) -{ - return peer->incoming_status; -} - -int trp_peer_is_connected(TRP_PEER *peer) -{ - return (peer->outgoing_status==PEER_CONNECTED) && (peer->incoming_status==PEER_CONNECTED); -} - void trp_ptable_free(TRP_PTABLE *ptbl) { talloc_free(ptbl); @@ -341,36 +109,6 @@ TRP_PEER *trp_ptable_find_servicename(TRP_PTABLE *ptbl, TR_NAME *servicename) return cur; } -char *trp_peer_to_str(TALLOC_CTX *memctx, TRP_PEER *peer, const char *sep) -{ - if (sep==NULL) - sep=", "; - return talloc_asprintf(memctx, - "%s:%u%s0x%04X", - peer->server, peer->port, sep, - peer->linkcost); -} - -/* this is horribly inefficient but should be ok for small peer tables */ -char *trp_ptable_to_str(TALLOC_CTX *memctx, TRP_PTABLE *ptbl, const char *sep, const char *lineterm) -{ - TALLOC_CTX *tmpctx=talloc_new(NULL); - TRP_PEER *peer=NULL; - char *result=talloc_strdup(tmpctx, ""); - - if (lineterm==NULL) - lineterm="\n"; - - /* this leaves intermediate result strings in the tmpctx context, we'll free these when - * we're done */ - for (peer=ptbl->head; peer!=NULL; peer=peer->next) - result=talloc_asprintf(tmpctx, "%s%s%s", result, lineterm, trp_peer_to_str(tmpctx, peer, sep)); - - talloc_steal(memctx, result); /* hand result over to caller */ - talloc_free(tmpctx); /* free detritus */ - return result; -} - TRP_PTABLE_ITER *trp_ptable_iter_new(TALLOC_CTX *mem_ctx) { TRP_PTABLE_ITER *iter=talloc(mem_ctx, TRP_PTABLE_ITER); diff --git a/trp/trp_ptable_encoders.c b/trp/trp_ptable_encoders.c new file mode 100644 index 0000000..f584c2b --- /dev/null +++ b/trp/trp_ptable_encoders.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016-2018, 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 +#include +#include + +/* this is horribly inefficient but should be ok for small peer tables */ +char *trp_ptable_to_str(TALLOC_CTX *memctx, TRP_PTABLE *ptbl, const char *sep, const char *lineterm) +{ + TALLOC_CTX *tmpctx=talloc_new(NULL); + TRP_PEER *peer=NULL; + char *result=talloc_strdup(tmpctx, ""); + + if (lineterm==NULL) + lineterm="\n"; + + /* this leaves intermediate result strings in the tmpctx context, we'll free these when + * we're done */ + for (peer=ptbl->head; peer!=NULL; peer=peer->next) + result=talloc_asprintf(tmpctx, "%s%s%s", result, lineterm, trp_peer_to_str(tmpctx, peer, sep)); + + talloc_steal(memctx, result); /* hand result over to caller */ + talloc_free(tmpctx); /* free detritus */ + return result; +} diff --git a/trp/trps.c b/trp/trps.c index e2339b5..573f0a3 100644 --- a/trp/trps.c +++ b/trp/trps.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include -- 2.1.4