Legacy support for pre-release LTE 11 devices while performing VoLTE call (#757)

* AAR Media-Sub-Component modification for more UEs support

* Introduce parameter for legacy support for pre-release LTE 11 devices to do calling

IE (IPV4-local-addr field ) is not supported on
the LTE pre release-11 UEs. In order for the call
to work the local address in packet filter must
be replaced by any.

Parameter: no_ipv4v6_local_addr_in_packet_filter
This commit is contained in:
Supreeth Herle 2021-01-11 14:03:52 +01:00 committed by GitHub
parent 8d0ce5b03c
commit 1c13d7f5ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 5 deletions

View File

@ -46,6 +46,10 @@ pcrf:
# o Disable Stateless Address Autoconfiguration for IPv6
# no_slaac: true
#
# o Legacy support for pre-release LTE 11 devices to do calling
# - Replace IPv4/v6 local addr field in AAR Media-Subcomponent AVP by any
# no_ipv4v6_local_addr_in_packet_filter: true
#
parameter:
#

View File

@ -327,6 +327,10 @@ int ogs_app_context_parse_config(void)
} else if (!strcmp(parameter_key, "use_openair")) {
self.parameter.use_openair =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(
parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) {
self.parameter.no_ipv4v6_local_addr_in_packet_filter =
ogs_yaml_iter_bool(&parameter_iter);
} else
ogs_warn("unknown key `%s`", parameter_key);
}

View File

@ -74,6 +74,7 @@ typedef struct ogs_app_context_s {
int no_slaac;
int use_openair;
int no_ipv4v6_local_addr_in_packet_filter;
} parameter;
ogs_sockopt_t sockopt;

View File

@ -92,6 +92,8 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
{
int rv;
int ret;
int len;
char *from_str, *to_str, *rx_flow;
struct msg *ans, *qry;
struct avp *avpch1, *avpch2, *avpch3;
@ -280,12 +282,58 @@ static int pcrf_rx_aar_cb( struct msg **msg, struct avp *avp,
ogs_flow_t *flow = &sub->flow
[sub->num_of_flow];
flow->description = ogs_malloc(
/* IE (IPV4-local-addr field ) is not supported on
* the LTE pre release-11 UEs. In order for the call
* to work the local address in packet filter must
* be replaced by any.
*/
if (ogs_app()->
parameter.no_ipv4v6_local_addr_in_packet_filter
== true) {
rx_flow = NULL;
rx_flow = (char*)hdr->avp_value->os.data;
len = hdr->avp_value->os.len;
from_str = NULL;
to_str = NULL;
from_str = strstr(rx_flow, "from");
ogs_assert(from_str);
to_str = strstr(rx_flow, "to");
ogs_assert(to_str);
if (!strncmp(rx_flow,
"permit out", strlen("permit out"))) {
flow->description = ogs_malloc(len
- strlen(to_str) + strlen("to any")+1);
strncat(flow->description,
rx_flow,
len - strlen(to_str));
strcat(flow->description, "to any");
} else if (!strncmp(rx_flow,
"permit in", strlen("permit in"))) {
flow->description = ogs_malloc(
len - strlen(from_str) + strlen(to_str)
+ strlen("from any ")+1);
strncat(flow->description,
rx_flow,
len - strlen(from_str));
strcat(flow->description, "from any ");
strncat(flow->description,
to_str,
strlen(to_str));
}
} else {
flow->description = ogs_malloc(
hdr->avp_value->os.len+1);
ogs_cpystrn(
flow->description,
(char*)hdr->avp_value->os.data,
hdr->avp_value->os.len+1);
ogs_cpystrn(
flow->description,
(char*)hdr->avp_value->os.data,
hdr->avp_value->os.len+1);
}
sub->num_of_flow++;
break;