mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-11-02 13:03:33 +00:00
osmux: Enforce Osmux only global and per BSC configuration
Extend the osmux only setting from the MGCP MGW to the NAT. This is applied when an endpoint is allocated and/or when the allocation is confirmed by the remote system. Not tested. The impact should only be when the new option is being used. Fixes: OW#1492
This commit is contained in:
@@ -499,6 +499,15 @@ struct nat_sccp_connection *bsc_mgcp_find_con(struct bsc_nat *nat, int endpoint)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nat_osmux_only(struct mgcp_config *mgcp_cfg, struct bsc_config *bsc_cfg)
|
||||||
|
{
|
||||||
|
if (mgcp_cfg->osmux == OSMUX_USAGE_ONLY)
|
||||||
|
return 1;
|
||||||
|
if (bsc_cfg->osmux == OSMUX_USAGE_ONLY)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int bsc_mgcp_policy_cb(struct mgcp_trunk_config *tcfg, int endpoint, int state, const char *transaction_id)
|
static int bsc_mgcp_policy_cb(struct mgcp_trunk_config *tcfg, int endpoint, int state, const char *transaction_id)
|
||||||
{
|
{
|
||||||
struct bsc_nat *nat;
|
struct bsc_nat *nat;
|
||||||
@@ -544,9 +553,16 @@ static int bsc_mgcp_policy_cb(struct mgcp_trunk_config *tcfg, int endpoint, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate a Osmux circuit ID */
|
/* Allocate a Osmux circuit ID */
|
||||||
if (state == MGCP_ENDP_CRCX &&
|
if (state == MGCP_ENDP_CRCX) {
|
||||||
nat->mgcp_cfg->osmux && sccp->bsc->cfg->osmux)
|
if (nat->mgcp_cfg->osmux && sccp->bsc->cfg->osmux) {
|
||||||
osmux_cid = osmux_get_cid();
|
osmux_cid = osmux_get_cid();
|
||||||
|
if (osmux_cid < 0 && nat_osmux_only(nat->mgcp_cfg, sccp->bsc->cfg)) {
|
||||||
|
LOGP(DMGCP, LOGL_ERROR,
|
||||||
|
"Rejecting usage of endpoint\n");
|
||||||
|
return MGCP_POLICY_REJECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* we need to generate a new and patched message */
|
/* we need to generate a new and patched message */
|
||||||
bsc_msg = bsc_mgcp_rewrite((char *) nat->mgcp_msg, nat->mgcp_length,
|
bsc_msg = bsc_mgcp_rewrite((char *) nat->mgcp_msg, nat->mgcp_length,
|
||||||
@@ -734,6 +750,16 @@ void bsc_mgcp_forward(struct bsc_connection *bsc, struct msgb *msg)
|
|||||||
if (endp->osmux.state == OSMUX_STATE_ACTIVATING)
|
if (endp->osmux.state == OSMUX_STATE_ACTIVATING)
|
||||||
bsc_mgcp_osmux_confirm(endp, (const char *) msg->l2h);
|
bsc_mgcp_osmux_confirm(endp, (const char *) msg->l2h);
|
||||||
|
|
||||||
|
/* If we require osmux and it is disabled.. fail */
|
||||||
|
if (nat_osmux_only(bsc->nat->mgcp_cfg, bsc->cfg) &&
|
||||||
|
endp->osmux.state == OSMUX_STATE_DISABLED) {
|
||||||
|
LOGP(DMGCP, LOGL_ERROR,
|
||||||
|
"Failed to activate osmux endpoint 0x%x\n",
|
||||||
|
ENDPOINT_NUMBER(endp));
|
||||||
|
free_chan_downstream(endp, bsc_endp, bsc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* free some stuff */
|
/* free some stuff */
|
||||||
talloc_free(bsc_endp->transaction_id);
|
talloc_free(bsc_endp->transaction_id);
|
||||||
bsc_endp->transaction_id = NULL;
|
bsc_endp->transaction_id = NULL;
|
||||||
|
|||||||
@@ -162,8 +162,14 @@ static void config_write_bsc_single(struct vty *vty, struct bsc_config *bsc)
|
|||||||
if (bsc->paging_group != -1)
|
if (bsc->paging_group != -1)
|
||||||
vty_out(vty, " paging group %d%s", bsc->paging_group, VTY_NEWLINE);
|
vty_out(vty, " paging group %d%s", bsc->paging_group, VTY_NEWLINE);
|
||||||
vty_out(vty, " paging forbidden %d%s", bsc->forbid_paging, VTY_NEWLINE);
|
vty_out(vty, " paging forbidden %d%s", bsc->forbid_paging, VTY_NEWLINE);
|
||||||
if (bsc->osmux)
|
switch (bsc->osmux) {
|
||||||
|
case OSMUX_USAGE_ON:
|
||||||
vty_out(vty, " osmux on%s", VTY_NEWLINE);
|
vty_out(vty, " osmux on%s", VTY_NEWLINE);
|
||||||
|
break;
|
||||||
|
case OSMUX_USAGE_ONLY:
|
||||||
|
vty_out(vty, " osmux only%s", VTY_NEWLINE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int config_write_bsc(struct vty *vty)
|
static int config_write_bsc(struct vty *vty)
|
||||||
@@ -1124,18 +1130,20 @@ DEFUN(show_ussd_connection,
|
|||||||
#define OSMUX_STR "RTP multiplexing\n"
|
#define OSMUX_STR "RTP multiplexing\n"
|
||||||
DEFUN(cfg_bsc_osmux,
|
DEFUN(cfg_bsc_osmux,
|
||||||
cfg_bsc_osmux_cmd,
|
cfg_bsc_osmux_cmd,
|
||||||
"osmux (on|off)",
|
"osmux (on|off|only)",
|
||||||
OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
|
OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only OSMUX\n")
|
||||||
{
|
{
|
||||||
struct bsc_config *conf = vty->index;
|
struct bsc_config *conf = vty->index;
|
||||||
int old = conf->osmux;
|
int old = conf->osmux;
|
||||||
|
|
||||||
if (strcmp(argv[0], "on") == 0)
|
if (strcmp(argv[0], "on") == 0)
|
||||||
conf->osmux = 1;
|
conf->osmux = OSMUX_USAGE_ON;
|
||||||
else if (strcmp(argv[0], "off") == 0)
|
else if (strcmp(argv[0], "off") == 0)
|
||||||
conf->osmux = 0;
|
conf->osmux = OSMUX_USAGE_OFF;
|
||||||
|
else if (strcmp(argv[0], "only") == 0)
|
||||||
|
conf->osmux = OSMUX_USAGE_ONLY;
|
||||||
|
|
||||||
if (old == 0 && conf->osmux == 1 && !conf->nat->mgcp_cfg->osmux_init) {
|
if (old == 0 && conf->osmux > 0 && !conf->nat->mgcp_cfg->osmux_init) {
|
||||||
LOGP(DMGCP, LOGL_NOTICE, "Setting up OSMUX socket\n");
|
LOGP(DMGCP, LOGL_NOTICE, "Setting up OSMUX socket\n");
|
||||||
if (osmux_init(OSMUX_ROLE_BSC_NAT, conf->nat->mgcp_cfg) < 0) {
|
if (osmux_init(OSMUX_ROLE_BSC_NAT, conf->nat->mgcp_cfg) < 0) {
|
||||||
LOGP(DMGCP, LOGL_ERROR, "Cannot init OSMUX\n");
|
LOGP(DMGCP, LOGL_ERROR, "Cannot init OSMUX\n");
|
||||||
@@ -1143,7 +1151,7 @@ DEFUN(cfg_bsc_osmux,
|
|||||||
VTY_NEWLINE);
|
VTY_NEWLINE);
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
} else if (old == 1 && conf->osmux == 0) {
|
} else if (old > 0 && conf->osmux == 0) {
|
||||||
LOGP(DMGCP, LOGL_NOTICE, "Disabling OSMUX socket\n");
|
LOGP(DMGCP, LOGL_NOTICE, "Disabling OSMUX socket\n");
|
||||||
/* Don't stop the socket, we may already have ongoing voice
|
/* Don't stop the socket, we may already have ongoing voice
|
||||||
* flows already using Osmux. This just switch indicates that
|
* flows already using Osmux. This just switch indicates that
|
||||||
|
|||||||
Reference in New Issue
Block a user