| /* GPRS Subscriber Update Protocol client */ |
| |
| /* (C) 2014 by Sysmocom s.f.m.c. GmbH |
| * All Rights Reserved |
| * |
| * Author: Jacob Erlbeck |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| #pragma once |
| |
| #include <osmocom/core/timer.h> |
| #include <osmocom/gsm/oap_client.h> |
| #include <osmocom/gsm/ipa.h> |
| #include <osmocom/gsm/gsup.h> |
| |
| /* a loss of GSUP between MSC and HLR is considered quite serious, let's try to recover as quickly as |
| * possible. Even one new connection attempt per second should be quite acceptable until the link is |
| * re-established */ |
| #define OSMO_GSUP_CLIENT_RECONNECT_INTERVAL 1 |
| #define OSMO_GSUP_CLIENT_PING_INTERVAL 20 |
| |
| struct msgb; |
| struct ipa_client_conn; |
| struct osmo_gsup_client; |
| |
| /* Expects message in msg->l2h */ |
| typedef int (*osmo_gsup_client_read_cb_t)(struct osmo_gsup_client *gsupc, struct msgb *msg); |
| |
| typedef bool (*osmo_gsup_client_up_down_cb_t)(struct osmo_gsup_client *gsupc, bool up); |
| |
| struct osmo_gsup_client { |
| const char *unit_name; /* same as ipa_dev->unit_name, for backwards compat */ |
| |
| struct ipa_client_conn *link; |
| osmo_gsup_client_read_cb_t read_cb; |
| void *data; |
| |
| struct osmo_oap_client_state oap_state; |
| |
| struct osmo_timer_list ping_timer; |
| struct osmo_timer_list connect_timer; |
| int is_connected; |
| int got_ipa_pong; |
| |
| struct ipaccess_unit *ipa_dev; /* identification information sent to IPA server */ |
| |
| osmo_gsup_client_up_down_cb_t up_down_cb; |
| }; |
| |
| struct osmo_gsup_client_config { |
| /*! IP access unit which contains client identification information; must be allocated in talloc_ctx as well to |
| * ensure it lives throughout the lifetime of the connection. */ |
| struct ipaccess_unit *ipa_dev; |
| /*! GSUP server IP address to connect to. */ |
| const char *ip_addr; |
| /*! GSUP server TCP port to connect to. */ |
| unsigned int tcp_port; |
| /*! OPA client configuration, or NULL. */ |
| struct osmo_oap_client_config *oapc_config; |
| /*! callback for reading from the GSUP connection. */ |
| osmo_gsup_client_read_cb_t read_cb; |
| /*! Invoked when the GSUP link is ready for communication, and when the link drops. */ |
| osmo_gsup_client_up_down_cb_t up_down_cb; |
| /*! User data stored in the returned gsupc->data, as context for the callbacks. */ |
| void *data; |
| /*! Marker for future extension, always pass this as false. */ |
| bool more; |
| }; |
| struct osmo_gsup_client *osmo_gsup_client_create3(void *talloc_ctx, struct osmo_gsup_client_config *config); |
| |
| struct osmo_gsup_client *osmo_gsup_client_create2(void *talloc_ctx, |
| struct ipaccess_unit *ipa_dev, |
| const char *ip_addr, |
| unsigned int tcp_port, |
| osmo_gsup_client_read_cb_t read_cb, |
| struct osmo_oap_client_config *oapc_config); |
| struct osmo_gsup_client *osmo_gsup_client_create(void *talloc_ctx, |
| const char *unit_name, |
| const char *ip_addr, |
| unsigned int tcp_port, |
| osmo_gsup_client_read_cb_t read_cb, |
| struct osmo_oap_client_config *oapc_config); |
| |
| void osmo_gsup_client_destroy(struct osmo_gsup_client *gsupc); |
| int osmo_gsup_client_send(struct osmo_gsup_client *gsupc, struct msgb *msg); |
| int osmo_gsup_client_enc_send(struct osmo_gsup_client *gsupc, |
| const struct osmo_gsup_message *gsup_msg); |
| struct msgb *osmo_gsup_client_msgb_alloc(void); |
| |