From 0a94e57b72e5d1445b8a92538c8091b474fef445 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 8 Nov 2016 23:50:10 +0100 Subject: client: Allow to stop and remove a connection Change-Id: I2118723345caf6a68f03de74a4182506e7bf105c --- include/osmo-pcap/osmo_pcap_client.h | 3 +++ src/osmo_client_core.c | 22 +++++++++++++++++++++- src/osmo_client_network.c | 20 +++++++++++++------- src/osmo_client_vty.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/include/osmo-pcap/osmo_pcap_client.h b/include/osmo-pcap/osmo_pcap_client.h index 5947615..68a648d 100644 --- a/include/osmo-pcap/osmo_pcap_client.h +++ b/include/osmo-pcap/osmo_pcap_client.h @@ -107,9 +107,12 @@ void osmo_client_send_data(struct osmo_pcap_client_conn *client, struct pcap_pkthdr *hdr, const uint8_t *data); void osmo_client_send_link(struct osmo_pcap_client_conn *client); void osmo_client_connect(struct osmo_pcap_client_conn *); +void osmo_client_disconnect(struct osmo_pcap_client_conn *); +void osmo_client_free(struct osmo_pcap_client_conn *); void osmo_client_reconnect(struct osmo_pcap_client_conn *); struct osmo_pcap_client_conn *osmo_client_find_or_create_conn(struct osmo_pcap_client *, const char *name); +struct osmo_pcap_client_conn *osmo_client_find_conn(struct osmo_pcap_client *, const char *name); void osmo_client_conn_init(struct osmo_pcap_client_conn *conn, struct osmo_pcap_client *client); diff --git a/src/osmo_client_core.c b/src/osmo_client_core.c index 50e6573..5208744 100644 --- a/src/osmo_client_core.c +++ b/src/osmo_client_core.c @@ -346,7 +346,15 @@ void osmo_client_conn_init(struct osmo_pcap_client_conn *conn, conn->wqueue.bfd.fd = -1; } -struct osmo_pcap_client_conn *osmo_client_find_or_create_conn( + +void osmo_client_free(struct osmo_pcap_client_conn *conn) +{ + osmo_client_disconnect(conn); + llist_del(&conn->entry); + talloc_free(conn); +} + +struct osmo_pcap_client_conn *osmo_client_find_conn( struct osmo_pcap_client *client, const char *name) { @@ -356,6 +364,18 @@ struct osmo_pcap_client_conn *osmo_client_find_or_create_conn( if (strcmp(conn->name, name) == 0) return conn; + return NULL; +} + +struct osmo_pcap_client_conn *osmo_client_find_or_create_conn( + struct osmo_pcap_client *client, + const char *name) +{ + struct osmo_pcap_client_conn *conn = osmo_client_find_conn(client, name);; + + if (conn) + return conn; + conn = talloc_zero(client, struct osmo_pcap_client_conn); if (!conn) { LOGP(DCLIENT, LOGL_ERROR, "Failed to allocate conn for %s\n", name); diff --git a/src/osmo_client_network.c b/src/osmo_client_network.c index a588f07..f9303e9 100644 --- a/src/osmo_client_network.c +++ b/src/osmo_client_network.c @@ -46,13 +46,7 @@ static void _osmo_client_connect(void *_data) static void lost_connection(struct osmo_pcap_client_conn *conn) { - if (conn->wqueue.bfd.fd >= 0) { - osmo_tls_release(&conn->tls_session); - osmo_fd_unregister(&conn->wqueue.bfd); - close(conn->wqueue.bfd.fd); - conn->wqueue.bfd.fd = -1; - } - + osmo_client_disconnect(conn); conn->timer.cb = _osmo_client_connect; conn->timer.data = conn; @@ -260,3 +254,15 @@ void osmo_client_reconnect(struct osmo_pcap_client_conn *conn) { lost_connection(conn); } + +void osmo_client_disconnect(struct osmo_pcap_client_conn *conn) +{ + if (conn->wqueue.bfd.fd >= 0) { + osmo_tls_release(&conn->tls_session); + osmo_fd_unregister(&conn->wqueue.bfd); + close(conn->wqueue.bfd.fd); + conn->wqueue.bfd.fd = -1; + } + + osmo_timer_del(&conn->timer); +} diff --git a/src/osmo_client_vty.c b/src/osmo_client_vty.c index 88b7140..5cf3aa1 100644 --- a/src/osmo_client_vty.c +++ b/src/osmo_client_vty.c @@ -411,6 +411,23 @@ DEFUN(cfg_pcap_store, return CMD_SUCCESS; } +DEFUN(cfg_no_pcap_store, + cfg_no_pcap_store_cmd, + "no pcap-store-connection .NAME", + NO_STR "Configure additional PCAP store server\n" "Name of server\n") +{ + struct osmo_pcap_client_conn *conn; + conn = osmo_client_find_conn(pcap_client, argv[0]); + if (!conn) { + vty_out(vty, "%%Failed to find connection %s%ss", + argv[0], VTY_NEWLINE); + return CMD_WARNING; + } + + osmo_client_free(conn); + return CMD_SUCCESS; +} + DEFUN(cfg_client_connect, cfg_client_connect_cmd, "connect", @@ -422,6 +439,17 @@ DEFUN(cfg_client_connect, return CMD_SUCCESS; } +DEFUN(cfg_client_disconnect, + cfg_client_disconnect_cmd, + "disconnect", + "Disconnect to the storage\n") +{ + struct osmo_pcap_client_conn *conn = get_conn(vty); + + osmo_client_disconnect(conn); + return CMD_SUCCESS; +} + int vty_client_init(struct osmo_pcap_client *pcap) { install_element(CONFIG_NODE, &cfg_client_cmd); @@ -460,6 +488,7 @@ int vty_client_init(struct osmo_pcap_client *pcap) /* per server confiug*/ install_element(CLIENT_NODE, &cfg_pcap_store_cmd); + install_element(CLIENT_NODE, &cfg_no_pcap_store_cmd); install_element(CLIENT_SERVER_NODE, &cfg_server_ip_cmd); install_element(CLIENT_SERVER_NODE, &cfg_server_port_cmd); install_element(CLIENT_SERVER_NODE, &cfg_enable_tls_cmd); @@ -478,6 +507,7 @@ int vty_client_init(struct osmo_pcap_client *pcap) install_element(CLIENT_SERVER_NODE, &cfg_no_tls_priority_cmd); install_element(CLIENT_SERVER_NODE, &cfg_tls_log_level_cmd); install_element(CLIENT_SERVER_NODE, &cfg_client_connect_cmd); + install_element(CLIENT_SERVER_NODE, &cfg_client_disconnect_cmd); return 0; } -- cgit v1.2.3