libosmo-sccp/src/sccp_internal.h

131 lines
3.8 KiB
C
Raw Normal View History

#pragma once
#include <osmocom/core/fsm.h>
#include <osmocom/core/prim.h>
#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/sigtran/osmo_ss7.h>
#define SCCP_STR "Signalling Connection Control Part\n"
make SCCP timers configurable The previous hardcoded SCCP timers may cause SCCP connection releases, if the peer is configured with far lower timers than libosmo-sccp. Testing with a specific SCCPlite MSC, I experienced an iar of just over three minutes, meaning that calls would be cut off by the MSC, since the osmo-bsc failed to send an Inactivity Timer message until seven minutes have passed. With this patch, SCCP timers are configurable by the user. Define constant global default timers, and variable user-configurable timers with each osmo_sccp_instance. Add VTY UI to configure the timers. Users must call osmo_sccp_vty_init() to get the sccp-timer config nodes under the 'cs7' node. Show the new UI in ss7_asp_test.vty. Note that even though this function is not new at all, until recently, all of our SCCP users (osmo-bsc, osmo-msc, osmo-sgsn, osmo-hnbgw) failed to call osmo_sccp_vty_init(), and thus also missed out on the various 'show' commands defined in sccp_vty.c. In other words, to benefit from the timer configurability, the patches to call osmo_sccp_vty_init() must first be merged to the corresponding master branches. If a 'sccp-timer' config command occurs, the cs7 instance must allocate an SCCP instance in order to store the timer config. Do that by calling the recently added osmo_ss7_ensure_sccp() function. Hence remove the limitation that the SCCP instance must not be populated from the "simple" setup function. If we want to configure SCCP timers beforehand, there must be an SCCP instance for that, and there is no hard reason to require a NULL SCCP instance, besides the desire to prevent this function from being invoked twice. Change-Id: I28a7362aa838e648ecc9b26ee53dbcade81a9d65
2018-09-26 15:12:23 +00:00
/* Appendix C.4 of Q.714 */
enum osmo_sccp_timer {
OSMO_SCCP_TIMER_CONN_EST,
OSMO_SCCP_TIMER_IAS,
OSMO_SCCP_TIMER_IAR,
OSMO_SCCP_TIMER_REL,
OSMO_SCCP_TIMER_REPEAT_REL,
OSMO_SCCP_TIMER_INT,
OSMO_SCCP_TIMER_GUARD,
OSMO_SCCP_TIMER_RESET,
OSMO_SCCP_TIMER_REASSEMBLY,
/* This must remain the last item: */
OSMO_SCCP_TIMERS_COUNT
};
struct osmo_sccp_timer_val {
uint32_t s;
uint32_t us;
};
extern const struct osmo_sccp_timer_val osmo_sccp_timer_defaults[];
extern const struct value_string osmo_sccp_timer_names[];
static inline const char *osmo_sccp_timer_name(enum osmo_sccp_timer val)
{ return get_value_string(osmo_sccp_timer_names, val); }
extern const struct value_string osmo_sccp_timer_descriptions[];
static inline const char *osmo_sccp_timer_description(enum osmo_sccp_timer val)
{ return get_value_string(osmo_sccp_timer_descriptions, val); }
/* an instance of the SCCP stack */
struct osmo_sccp_instance {
/* entry in global list of ss7 instances */
struct llist_head list;
/* list of 'struct sccp_connection' in this instance */
struct llist_head connections;
/* list of SCCP users in this instance */
struct llist_head users;
/* routing context to be used in all outbound messages */
uint32_t route_ctx;
/* next connection ID to allocate */
uint32_t next_id;
struct osmo_ss7_instance *ss7;
void *priv;
struct osmo_ss7_user ss7_user;
make SCCP timers configurable The previous hardcoded SCCP timers may cause SCCP connection releases, if the peer is configured with far lower timers than libosmo-sccp. Testing with a specific SCCPlite MSC, I experienced an iar of just over three minutes, meaning that calls would be cut off by the MSC, since the osmo-bsc failed to send an Inactivity Timer message until seven minutes have passed. With this patch, SCCP timers are configurable by the user. Define constant global default timers, and variable user-configurable timers with each osmo_sccp_instance. Add VTY UI to configure the timers. Users must call osmo_sccp_vty_init() to get the sccp-timer config nodes under the 'cs7' node. Show the new UI in ss7_asp_test.vty. Note that even though this function is not new at all, until recently, all of our SCCP users (osmo-bsc, osmo-msc, osmo-sgsn, osmo-hnbgw) failed to call osmo_sccp_vty_init(), and thus also missed out on the various 'show' commands defined in sccp_vty.c. In other words, to benefit from the timer configurability, the patches to call osmo_sccp_vty_init() must first be merged to the corresponding master branches. If a 'sccp-timer' config command occurs, the cs7 instance must allocate an SCCP instance in order to store the timer config. Do that by calling the recently added osmo_ss7_ensure_sccp() function. Hence remove the limitation that the SCCP instance must not be populated from the "simple" setup function. If we want to configure SCCP timers beforehand, there must be an SCCP instance for that, and there is no hard reason to require a NULL SCCP instance, besides the desire to prevent this function from being invoked twice. Change-Id: I28a7362aa838e648ecc9b26ee53dbcade81a9d65
2018-09-26 15:12:23 +00:00
struct osmo_sccp_timer_val timers[OSMO_SCCP_TIMERS_COUNT];
};
struct osmo_sccp_user {
/*! \brief entry in list of sccp users of \ref osmo_sccp_instance */
struct llist_head list;
/*! \brief pointer back to SCCP instance */
struct osmo_sccp_instance *inst;
/*! \brief human-readable name of this user */
char *name;
/*! \brief SSN and/or point code to which we are bound */
uint16_t ssn;
uint32_t pc;
/* set if we are a server */
struct llist_head links;
/* user call-back function in case of incoming primitives */
osmo_prim_cb prim_cb;
void *priv;
/* Application Server FSM Instance */
struct osmo_fsm_inst *as_fi;
};
extern int DSCCP;
struct xua_msg;
struct osmo_sccp_user *
sccp_user_find(struct osmo_sccp_instance *inst, uint16_t ssn, uint32_t pc);
/* Message from SCOC -> SCRC */
int sccp_scrc_rx_scoc_conn_msg(struct osmo_sccp_instance *inst,
struct xua_msg *xua);
/* Message from SCLC -> SCRC */
int sccp_scrc_rx_sclc_msg(struct osmo_sccp_instance *inst, struct xua_msg *xua);
/* Message from MTP (SUA) -> SCRC */
int scrc_rx_mtp_xfer_ind_xua(struct osmo_sccp_instance *inst,
struct xua_msg *xua);
/* Message from SCRC -> SCOC */
void sccp_scoc_rx_from_scrc(struct osmo_sccp_instance *inst,
struct xua_msg *xua);
void sccp_scoc_rx_scrc_rout_fail(struct osmo_sccp_instance *inst,
struct xua_msg *xua, uint32_t cause);
void sccp_scoc_flush_connections(struct osmo_sccp_instance *inst);
/* Message from SCRC -> SCLC */
int sccp_sclc_rx_from_scrc(struct osmo_sccp_instance *inst,
struct xua_msg *xua);
void sccp_sclc_rx_scrc_rout_fail(struct osmo_sccp_instance *inst,
struct xua_msg *xua, uint32_t cause);
int sccp_user_prim_up(struct osmo_sccp_user *scut, struct osmo_scu_prim *prim);
/* SCU -> SCLC */
int sccp_sclc_user_sap_down(struct osmo_sccp_user *scu, struct osmo_prim_hdr *oph);
struct msgb *sccp_msgb_alloc(const char *name);
struct osmo_fsm sccp_scoc_fsm;
void sccp_scoc_show_connections(struct vty *vty, struct osmo_sccp_instance *inst);
make SCCP timers configurable The previous hardcoded SCCP timers may cause SCCP connection releases, if the peer is configured with far lower timers than libosmo-sccp. Testing with a specific SCCPlite MSC, I experienced an iar of just over three minutes, meaning that calls would be cut off by the MSC, since the osmo-bsc failed to send an Inactivity Timer message until seven minutes have passed. With this patch, SCCP timers are configurable by the user. Define constant global default timers, and variable user-configurable timers with each osmo_sccp_instance. Add VTY UI to configure the timers. Users must call osmo_sccp_vty_init() to get the sccp-timer config nodes under the 'cs7' node. Show the new UI in ss7_asp_test.vty. Note that even though this function is not new at all, until recently, all of our SCCP users (osmo-bsc, osmo-msc, osmo-sgsn, osmo-hnbgw) failed to call osmo_sccp_vty_init(), and thus also missed out on the various 'show' commands defined in sccp_vty.c. In other words, to benefit from the timer configurability, the patches to call osmo_sccp_vty_init() must first be merged to the corresponding master branches. If a 'sccp-timer' config command occurs, the cs7 instance must allocate an SCCP instance in order to store the timer config. Do that by calling the recently added osmo_ss7_ensure_sccp() function. Hence remove the limitation that the SCCP instance must not be populated from the "simple" setup function. If we want to configure SCCP timers beforehand, there must be an SCCP instance for that, and there is no hard reason to require a NULL SCCP instance, besides the desire to prevent this function from being invoked twice. Change-Id: I28a7362aa838e648ecc9b26ee53dbcade81a9d65
2018-09-26 15:12:23 +00:00
const struct osmo_sccp_timer_val *osmo_sccp_timer_get(const struct osmo_sccp_instance *inst,
enum osmo_sccp_timer timer,
bool default_if_unset);
void osmo_sccp_vty_write_cs7_node(struct vty *vty, const char *indent, struct osmo_sccp_instance *inst);