Introduction
Microsoft Teams is a unified communication and collaboration tool that provides users with voice calling, online chat, video conferencing, meetings, file storage and integration with Office 365 applications.
It is possible to provide a Microsoft Teams customer (tenant) connectivity to the PSTN by configuring a Perimeta Session Controller to interoperate with Microsoft Teams. The Session Controller connects directly to Microsoft Teams servers to provide access to the PSTN. This integration is accomplished through a trunk using the Microsoft Teams Direct Routing service.
Overview
Microsoft Phone System Direct Routing allows the connection of a supported Session Border Controller (SBC) provided by Movius to Microsoft Phone System. With this capability Movius can bring Public Switched Telephone Network (PSTN) connectivity with Microsoft Teams client in addition to the MultiLine client connectivity, as shown in the following diagram:
In this integrated scenario:
- Microsoft Teams users can initiate external calls in the Teams application that are terminated by the Movius platform via a configured telephone service provider.
- Make a call from any number to Movius MultiLine number and it will ring simultaneously to Microsoft Teams. Users can choose in which application the incoming calls will be answered (Movius MultiLine or Microsoft Teams).
Requirements
Licensing
Pre Requisites:
- Encryption onetime fee per deployment:
- Signalling Encryption.
- Media Encryption.
- Software Transcoding onetime fee per deployment:
- SILK, G711, G722 and G729 codecs.
- Which powers Perimeta's comfort noise interworking feature. Comfort noise interworking is required to ensure that comfort noise is present on all calls to Microsoft Teams (as required by Microsoft).
Teams Direct Routing Licensing:
- MS Teams Base License onetime fee per deployment:
- (Media Generation and eSBC licenses was deprecated by Metaswitch for simplicity).
- Capacity License per session (per 1K):
- Covers Non Media Bypass and Media Bypass functionality.
Prerequisites
Follow the information that is necessary to collect to configure the Perimeta SBC:
IP Configuration:
Placeholder | Example | Deployment type | Description |
<session-controller-hostname> | vavsbc | All | The base FQDN of your SSC or ISC that needs to be defined. When you request a certificate later in Security certificate configuration for Microsoft Teams Direct Routing integration, you will use this FQDN as the certificate's CN (Common Name). |
<microsoft-service-address-name> | GeneralAccess-01 | All | The name (as configured on your SSC / ISC) of the service address your SSC / ISC uses for signaling when connecting to Microsoft Teams Direct Routing. |
<microsoft-signaling-local-port> | 5058 | All | The port on your SSC / ISC to use for signaling to and from Microsoft Teams Direct Routing. |
<microsoft-media-ip-address> | 169.57.15.98 | All | The IP address your MSC / ISC uses for media sent to and from Microsoft Teams Direct Routing. |
<microsoft-media-first-port> | 16384 | All | The first port on your MSC(s) / ISC for media sent to and from Microsoft Teams Direct Routing. This must be an even-numbered port. Default: 16384. |
<microsoft-media-last-port> | 65535 | All | The last port on your MSC(s) / ISC for media sent to and from Microsoft Teams Direct Routing. This must be an odd-numbered port. Default: 65535. |
<microsoft-media-realm> | GeneralAccessMedia1 | All | A name to identify the (group of) IP address(es) your MSC(s) / ISC(s) uses for media sent to and from Microsoft Teams Direct Routing (<microsoft-media-ip-address>). This may be an existing media realm. If you will use IP address(es) dedicated to Microsoft connectivity, Metaswitch recommends Microsoft Media. |
<pstn-or-switch-local-address-ip-version> | ipv4 | All | The IP version of the service address the Session Controller uses to connect to the PSTN or your softswitch. This must be ipv4 or ipv6. |
<pstn-or-switch-local-address> | 169.57.15.98 | All | The local service address the Session Controller uses to connect to the PSTN or your softswitch, in IPv4 or IPv6 format. |
<pstn-or-switch-service-address-name> | GeneralAccess-01 | All | The name of the service address your SSC / ISC uses for signaling when connecting to the PSTN or your softswitch. |
<pstn-or-switch-ip-version> | ipv4 | All | The IP version of the range of remote IP addresses that can contact your Session Controller from the PSTN or your softswitch. If you want to use different IP addresses and ports for the PSTN and for your softswitch, define two values (<switch-*> and <pstn-*>). |
<pstn-or-switch-media-ip-address> | 169.57.15.98 | All | The IP address your MSC(s) / ISC uses for media sent to and from the PSTN or your softswitch. |
<pstn-or-switch-media-first-port> | 16384 | All | The first port on your MSC(s) / ISC for media sent to and from the PSTN or your softswitch. This must be an even-numbered port. Default: 16384. |
<pstn-or-switch-media-last-port> | 65535 | All | The last port on your MSC(s) / ISC for media sent to and from the PSTN or your softswitch. This must be an odd-numbered port. Default: 65535. |
<pstn-or-switch-media-realm> | GeneralAccesMedia1 | All | A name to identify the (group of) IP address(es) your MSC(s) / ISC use(s) for media sent to and from the PSTN (<pstn-or-switch-media-ip-address>). This may be an existing media realm. If you will use IP address(es) dedicated to this connection, Metaswitch recommends PSTN. |
Session Controller Configuration:
Placeholder | Example | Deployment type | Description |
<microsoft-service-network-id> | 2 | All | ID (an integer) of the service network you will use to communicate with Microsoft Teams Direct Routing. |
<pstn-or-switch-service-network-id> | 2 | All | The number of the service network your MSC / ISC uses when connecting to the PSTN or your softswitch. |
<microsoft-certificate-name> | vavsbc | All | A name for the security certificate your Session Controller uses to establish TLS connections to Microsoft Teams Direct Routing. You will configure this certificate as part of Security certificate configuration for Microsoft Teams Direct Routing integration. |
<ip-fqdn-mapping-rule-index> | 4 | All | The index of the IP-FQDN mapping rule that your Session Controller will use to map the local address used to connect to your networks to <session-controller-hostname>. This must be an integer between 1 and 4294967295 and must not match any other IP-FQDN mapping rule currently configured on the Session Controller. |
<default-lua-config-set-index> | 1 | All | The index of the Lua config set that acts as the default on your Session Controller. |
Configurations
There is a wide range of configuration to be set to allow the Session Controllers to integrate with Microsoft Teams. It is necessary to carry out the procedures in each of the following sections:
Security certificate configuration
It is necessary to configure the SSCs and/or ISCs with suitable local and public security certificates to encrypt and authenticate its connection to the Microsoft Teams server using TLS.
The SSCs and/or ISCs must have the following TLS certificates for interoperation with Microsoft Teams:
- A signed local security certificate that the Session Controller will use to authenticate itself to Microsoft Teams.
- The certificate of the certificate authority that signed the Session Controller's local certificate (and any other certificates in the chain of trust to the root CA
- The certificate of the certificate authority that signed Microsoft Teams' certificate.
Media configuration
You must configure the ISC and / or MSC(s) with suitable media realms and enable specific media features to interoperate with Microsoft Teams.
Integrating with Microsoft Teams requires specific media configuration on the ISCs and/or MSCs.
The ISCs and/or MSCs might already have some of this configuration. In all cases, it is necessary to work through this section to confirm all the required configuration and update the configuration if necessary.
- Media addresses and associated media realms for media for calls to Microsoft Teams and the PSTN.
- If the firewall is configured to allow media traffic over only some of the ports that Perimeta can use for media (16384-65335), configuration limiting your ISCs and MSCs to only those ports.
- At least one virtual MSC (a requirement for all media handling).
- The ability to perform transcoding and RTP/SRTP interworking.
- The ability to allocate more than 5% of media bandwidth for a call to RTCP (as required by Microsoft Teams).
- Advanced media capacity (for commercial-off-the-shelf (COTS) hardware with dual CPUs with 8 or more cores without DSPs and medium- and high-capacity virtual machines with DPDK mode enabled).
- The ability to play ringback tones to transferred parties during call transfer.
Example of the configuration:
config
sbc
media
media-address ipv4 <ms-teams-media-ip-address> service-network <ms-teams-service-network-id>
# You can omit port-range if the default (16384-65335) is suitable
port-range <ms-teams-media-first-port> <ms-teams-media-last-port>
realm <ms-teams-media-realm>
media-address <pstn-or-switch-ip-version> <pstn-or-switch-media-ip-address> service-network <pstn-or-switch-service-network-id>
# You can omit port-range if the default (16384-65335) is suitable
port-range <pstn-or-switch-media-first-port> <pstn-or-switch-media-last-port>
realm <pstn-or-switch-media-realm>
vmsc global
activate
srtp-interworking
transcoding
increased-rtcp-bandwidth
media-playback
Note: Ringback tones for call transfer: If you want your Session Controllers to play ringback tones when calls are transferred, this feature must be enabled and ensure the media file to be played has been installed on the system.
Lua configuration
It is necessary to add a new Lua profile to the SSC or ISC to ensure that the Session Controller removes any specified RTCP ports from SDP messages, which is required to successfully interoperate with the Microsoft Teams server.
The new Lua profiles need to be added to the global default Lua configuration set on your Session Controller:
Profile name: | Remove_RTCP_a_Line |
Type of SIP message body | any |
Profile: | local rtcp_mux_line = msg.sdp:select_by_prefix("a=rtcp-mux") |
Profile name: | Remove_ICE_From_SDP |
Type of SIP message body: | any |
Profile: | for media in MeSelection.iter(msg:get_sdp():get_media_blocks()) do for media_line in media:select_by_prefix("a=candidate"):iter() do MeLogger.info("Deleting line:".. media_line:get_text()) media_line:delete() end end local ice_lines = msg.sdp:select_by_prefix("a=ice") local removed_ice = false for ice_line in ice_lines:iter() do ice_line:delete() removed_ice = true end if removed_ice then MeLogger.info("All ICE lines have been removed") end ---END--- |
Interoperability profile and SIP MMF profile configuration
It is necessary to configure interoperability profiles and SIP Message Manipulation Framework (MMF) profiles to ensure the SSC or ISC can connect to and interoperate with the Microsoft Teams server and the PSTN.
The following configuration objects must be added to integrate the Session Controller with Microsoft Teams:
- An interoperability profile that will allow the Session Controller to successfully interoperate with the Microsoft Teams server.
- A number of SIP Message Manipulation Framework (MMF) error, parameter and header profiles to ensure the Session Controller manipulates SIP messages to interoperate with the Microsoft Teams server and the PSTN or your softswitch or IMS TAS.
The profiles need to be applied to the Microsoft Teams adjacencies that will be crated for Microsoft Teams integration. Applying these profiles allows the adjacencies to interoperate correctly with the Microsoft Teams servers and the PSTN.
config
sbc
signaling
sip message-manipulation
error-profile Reject_SRTP_With_488
cause ac-srtp-disallowed status-code 488
header-profile Contact_Add_FQDN
header Contact
action modify-value sip-uri host ${adj.lcl_id}
header-profile E164_From_Match_RURI
description "Make From be E.164 if and only if Request-URI is E.164"
header _
description "Check if Request-URI is E.164 format"
action store-vars
condition advanced "(REGEX (msg.request_uri.value, '(.*sip:\\+.*)', ruri_is_e_164))"
header From entry 1
description "Check if From is E.164 format"
action store-vars
condition advanced "(REGEX (msg.first-header(\"From\").value, '(.*sip:\\+.*)', from_is_e_164))"
header From entry 2
description "Split up From header to allow inserting of country code if needs be"
action store-vars
condition advanced "(REGEX (msg.first-header(\"From\").value, '(.*<sip:)(\\<country-code>)\?(.*)' ,from_before_cc, _, from_after_cc))"
header From entry 3
description "Insert country code if Request-URI is E.164,and From header is not"
action replace-value value ${from_before_cc}<country-code>${from_after_cc}
condition advanced "((DEFINED (ruri_is_e_164)) AND (NOT (DEFINED (from_is_e_164))))"
header From entry 4
description "Remove country code if Request-URI is not E.164, and From is"
action replace-value value ${from_before_cc}${from_after_cc}
condition advanced "((NOT (DEFINED (ruri_is_e_164))) AND (DEFINED (from_is_e_164)))"
header-profile SubResponses
header Store1
action store-vars
condition advanced "(STORE (subdomain, msg.first-header(\"To\").uri.sip_uri.host))"
header Contact
action modify-value sip-uri host ${subdomain}
condition advanced "((DEFINED (subdomain)) AND (NOT (msg.is_request)))"
header-profile Strip_Privacy_If_Not_Anonymous
description "Remove Privacy header from Teams calls unless From is anonymous"
header Privacy
action strip
condition advanced "(NOT (REGEX (msg.first-header(\"From\").value, '.*anonymous.*')))"
header-profile Set_Contact_SubDomain
description "Convert steering prefix into Teams subdomain if set"
header To
description "Strip steering prefix from the To header if found"
action modify-value sip-uri user ${original_called_party}
condition advanced "(DEFINED (steering_prefix))"
header Store
description "Detect a Teams steering prefix added to the called party user ID by routing and store the steering prefix and the original ID"
action store-vars
condition advanced "(REGEX (msg.called_party_id.user_id, 'AA(.*)AA(.*)', steering_prefix, original_called_party))"
header Contact
description "Use steering prefix to set Teams sub-domain in the Contact header"
# Change to sbc${steering_prefix} if subdomains are sbc123 etc.
action modify-value sip-uri host ten${steering_prefix}.${original_contact_host}
condition advanced "(DEFINED (steering_prefix))"
header Store entry 2
description "Store the hostname from the Contact header"
action store-vars
condition advanced "(STORE (original_contact_host, msg.first-header(\"Contact\").uri.sip_uri.host))"
header Request-URI
description "Strip steering prefix from the Request-URI if found"
action modify-value sip-uri user ${original_called_party}
condition advanced "(DEFINED (steering_prefix))"
# GR: add one ip-fqdn-mapping-rule for each SSC/ISC
# GR: use <ssc1-pstn-switch-signaling-ip> and <ssc1-hostname> etc.
ip-fqdn-mapping-rule <ip-fqdn-mapping-rule-index> <pstn-or-switch-local-address-ip-version> <pstn-or-switch-local-address> <session-controller-hostname> both-ways
sip interop-profile Teams
header-settings contact add tls-param
header-settings from rewrite host local port exclude
header-settings to rewrite
hunting-trigger 503
hunt-on-no-1xx timeout 5000 hunt-mode standard
ping-enable
ping-mechanism pause-during-traffic
options-ping-response define-success 200-299
ping-response
respond-when-no-username always
respond-when-username always
message-manipulation
edit-profiles inbound Remove_RTCP_a_Line
edit-profiles outbound Contact_Add_FQDN,Remove_RTCP_a_Line,E164_From_Match_RURI,SubResponses
ms-teams version-header enabled
activate
Address group configuration
It is necessary to configure IP addresses for Microsoft Teams as address groups on the SSC or ISC. You will then configure your Microsoft Teams adjacencies to allow traffic from these address groups.
The SSC or ISC must be configured to treat the IP addresses to which Microsoft Teams FQDNs resolve as known sources. The Session Controller recognizes known sources as sources of legitimate traffic but can dynamically blacklist these sources if the amount or type of traffic becomes suspicious. Address groups allow to group together non-sequential IP addresses. The groups of IP addresses can be applied to adjacencies as trusted remote address groups, which represent the sources of traffic that the adjacencies should accept. Marking the remote address group as trusted configures the group's IP addresses as known sources on that adjacency.
It is necessary to configure three address groups. The addresses in each group will be the IP addresses to which the Microsoft Teams FQDNs resolve.
- The 1st address group will contain the IP address to which ip.pstnhub.microsoft.com
resolves.
- The 2nd address group will contain the IP address to which ip2.pstnhub.microsoft.com
resolves.
- The 3rd address group will contain the remaining Microsoft Teams IP addresses.
Determining the IP addresses for each address group: The three Microsoft Teams FQDNs (sip.pstnhub.microsoft.com, sip2.pstnhub.microsoft.com and sip3.pstnhub.microsoft.com) will resolve to one of the following IP addresses, depending on your geographic location:
- 52.114.148.0
- 52.114.132.46
- 52.114.75.24
- 52.114.76.76
- 52.114.7.24
- 52.114.14.70
- 52.114.16.74
- 52.114.20.29
- 52.114.36.156
- 52.114.32.169
Note: See:
https://docs.microsoft.com/en-us/microsoftteams/direct-routing-plan#sip-signaling-fqdns
for the most recent IP addresses.
To determine how to split the IP addresses into the address groups based on how the FQDNs resolve in your geographic region.
- Perform a DNS lookup to determine the IP address to which sip.pstnhub.microsoft.com resolves. Metaswitch recommends dig or nslookup. This will be <ms-teams-ip-1> in the example configuration.
- Perform a DNS lookup to determine the IP address to which sip2.pstnhub.microsoft.com resolves. This will be <ms-teams-ip-2>.
- Use the remaining IP addresses as the values of the remaining <ms-teams-ip-X> placeholders.
Adjacency configuration
It is necessary to configure adjacencies on the SSC or ISC to represent the SIP peers that the Session Controller will be communicating with.
This section contains example adjacency configuration for the following connections:
- The server that your Session Controller will try first (sip.pstnhub.microsoft.com).
- A second server that your Session Controller will connect to if the primary server is not available (sip2.pstnhub.microsoft.com).
- A third server that your Session Controller will connect to if the primary and secondary servers are not available (sip3.pstnhub.microsoft.com).
- The PSTN (Telephone provider).
Example Microsoft Teams adjacency configuration:
config
sbc
signaling
adjacency sip TeamsPrimary
add-route-header sip.pstnhub.microsoft.com
call-media-policy
media-bypass-policy forbid
comfort-noise-codec interwork
secure-media require
transcoding
trigger retry-on-4xx
rtcp-multiplexing enabled
rtcp-transmission-policy always
media-playback enabled
listen-transports tcp
adjacency-type preset-peering
local-id host <session-controller-hostname> # GR: use <deploymentfqdn>
message-manipulation
error-profile outbound Reject_SRTP_With_488
lua-config-set <default-lua-config-set-index>
privacy trusted
realm <ms-teams-media-realm>
contact-username passthrough
tls fqdn sip.pstnhub.microsoft.com
certificate-name <ms-teams-certificate-name>
service-address <ms-teams-service-address-name>
signaling-local-port <ms-teams-signaling-local-port>
remote-address-group msteams-primary trusted
signaling-peer sip.pstnhub.microsoft.com
signaling-peer-port 5061
default-interop-profile Teams
activate
adjacency sip TeamsSecondary
add-route-header sip2.pstnhub.microsoft.com
call-media-policy
media-bypass-policy forbid
comfort-noise-codec interwork
secure-media require
transcoding
trigger retry-on-4xx
rtcp-multiplexing enabled
rtcp-transmission-policy always
media-playback enabled
listen-transports tcp
adjacency-type preset-peering
local-id host <session-controller-hostname> # GR: <deployment-fqdn>
message-manipulation
error-profile outbound Reject_SRTP_With_488
lua-config-set <default-lua-config-set-index>
privacy trusted
realm <ms-teams-media-realm>
contact-username passthrough
tls fqdn sip.pstnhub.microsoft.com
certificate-name <ms-teams-certificate-name>
service-address <ms-teams-service-address-name>
signaling-local-port <ms-teams-signaling-local-port>
remote-address-group msteams-secondary trusted
signaling-peer sip2.pstnhub.microsoft.com
signaling-peer-port 5061
default-interop-profile Teams
activate
adjacency sip TeamsTertiary
add-route-header sip3.pstnhub.microsoft.com
call-media-policy
media-bypass-policy forbid
comfort-noise-codec interwork
secure-media require
transcoding
trigger retry-on-4xx
rtcp-multiplexing enabled
rtcp-transmission-policy always
media-playback enabled
listen-transports tcp
adjacency-type preset-peering
local-id host <session-controller-hostname> # GR: use <deploymentfqdn>
message-manipulation
error-profile outbound Reject_SRTP_With_488
lua-config-set <default-lua-config-set-index>
privacy trusted
realm <ms-teams-media-realm>
contact-username passthrough
tls fqdn sip.pstnhub.microsoft.com
certificate-name <ms-teams-certificate-name>
service-address <ms-teams-service-address-name>
signaling-local-port <ms-teams-signaling-local-port>
remote-address-group msteams-tertiary trusted
signaling-peer sip3.pstnhub.microsoft.com
signaling-peer-port 5061
default-interop-profile Teams
activate
Example PSTN adjacency configuration
config
sbc
signaling
adjacency sip PSTN
call-media-policy
media-bypass-policy forbid
comfort-noise-codec passthrough
transcoding
trigger retry-on-4xx
rtcp-multiplexing enabled
media-playback enabled
interop
header-settings from rewrite host local port exclude
header-settings to rewrite
message-manipulation
edit-profiles inbound Remove_RTCP_a_Line
edit-profiles outbound Remove_RTCP_a_Line,Remove_ICE_From_SDP, Strip_Privacy_If_Not_Anonymous, E164_From_Match_RURI
force-signaling-peer initial-requests
adjacency-type preset-peering
message-manipulation
error-profile outbound Reject_SRTP_With_488
lua-config-set <default-lua-config-set-index>
privacy trusted
realm <pstn-or-switch-media-realm>
service-address <pstn-or-switch-service-address-name>
remote-address-range <pstn-or-switch-ip-version> <pstn-first-remote-address> prefix-len <pstn-prefix-length> trusted
signaling-peer <pstn-first-remote-address>
signaling
activate
Routing configuration
It is necessary to update the call policy set on the SSC or ISC to ensure that the Session Controller can route calls successfully between the configured adjacencies.
It is necessary to configure routing tables that allow the Session Controller to do the following:
- For a call from Microsoft Teams: route the call to the Movius platform adjacency.
- For a call from the Movius platform: route the call to a Microsoft Teams adjacency.
Metaswitch recommendation is to use the following types of table. These tables might be the only table on the Session Controller, or they might be integrated into a more complex call policy set:
- A source adjacency routing table to detect whether a call is from Microsoft Teams or the Movius platform and select an adjacency or further routing tables.
- A least-cost routing table to select the Microsoft Teams adjacency to use.
- To use Microsoft Teams call transfer features, it is necessary to add an initial destination domain routing table which routes the base FQDN for your SSC or ISC back to MS teams.
Source adjacency table
Configure a source adjacency table that all calls to or from Microsoft Teams will reach. If you do not already have an existing call policy set, this will be the first table for new call requests:
- The first entry matches requests arriving on the Movius platform adjacency and sets the next table to the least cost routing table for selecting Microsoft Teams adjacencies.
- Three further entries route requests arriving on the TeamsPrimary, TeamsSecondary and TeamsTertiary adjacencies over the Movius platform adjacency and allow the Session Controller to complete routing for these calls.
rtg-src-adjacency-table msteams
entry 1
match-adjacency PSTN
action next-table steering
entry 2
match-adjacency TeamsPrimary
dst-adjacency PSTN
action complete
entry 3
match-adjacency TeamsSecondary
dst-adjacency PSTN
action complete
entry 4
match-adjacency TeamsTertiary
dst-adjacency PSTN
action complete
Least cost routing table
Configure a least cost routing table that routes calls that have passed through the destination ID table out over a Microsoft Teams adjacency. This routing table has three entries:
- The first entry routes over the TeamsPrimary adjacency.
- If the connection to the primary Microsoft Teams FQDN has failed (making the TeamsPrimary adjacency unavailable), the second routes requests over the TeamsSecondary adjacency.
- If the connections to the primary and secondary Microsoft Teams FQDNs have failed, the third entry routes requests over the TeamsTertiary adjacency.
rtg-least-cost-table teams-redundancy
entry 1
cost 1
dst-adjacency TeamsPrimary
action complete
entry 2
cost 2
dst-adjacency TeamsSecondary
action complete
entry 3
cost 3
dst-adjacency TeamsTertiary
action complete
References
Microsoft Teams and Perimeta Integration Guide
https://manuals.metaswitch.com/Perimeta/V4.8/MicrosoftTeamsIntegrationGuide/Source/notices.html
Movius vavMeta Configuration
Interoperability requirements
Summary of required signaling features for interoperation with Microsoft Teams:
Area of configuration | Connections to Microsoft Teams | Connections to the PSTN |
Permitted types of connection | Send outbound traffic to a specified Microsoft Teams FQDN Accept inbound traffic from specific IP addresses (configured as a remote address group) Use TLS and do not accept incoming UDP connections | No specific configuration required |
Peer detection with SIP OPTIONS requests | Respond to all SIP OPTIONS requests (with or without usernames) (ping-response ... on interoperability profile) Use requests to detect the availability of peers, pausing during traffic (ping-enable ... on interoperability profile) Treat any responses to OPTIONS requests other than 200-299 as failures (options-ping-response ... on interoperability profile) | Recommended but not required and not included in this manual. For instructions, see Configuring peer availability detection for a static signaling peer in Perimeta Configuration and Interoperability Guide - CLI Users. |
Routing of calls | Hunt on receiving a 503 response and when the Session Controller does not receive a 1XX response after 5 seconds (hunting-trigger ... and hunt-on-no-1xx ... on interoperability profile) | Connect to the PSTN peer and force all outbound out-of-dialog and dialog-creating requests on this adjacency to it. |
Rewriting outbound Contact headers | Add the IP address of this adjacency to the Contact header (edit-profiles outbound Contact_Add_FQDN on interoperability profile) Add a transport=tls parameter (header-settings contact ... on interoperability profile) Pass through usernames in Contact headers (contact-username ...) | No specific configuration required |
Rewriting outbound From headers | Use the Session Controller's FQDN as the hostname and exclude the local port (header-settings from ... on interoperability profile and local-id host ...) | Use the Session Controller's signaling IP address on this adjacency as the hostname and exclude the local port (header-settings from ...) |
Rewriting outbound To headers | Rewrite to contain the outbound Request-URI (header-settings to ... on interoperability profile) | Rewrite to contain the outbound Request-URI (header-settings to ...) |
Rewriting inbound messages with message manipulation rules | Remove a=rtcp lines from SDP (edit-profiles inbound on interoperability profile) Convert 183 (SDP) responses sent by Microsoft Teams to 180 | Remove a=rtcp lines from SDP (edit-profiles inbound ..-) |
Rewriting other parts of outbound messages with message manipulation rules | Remove a=rtcp lines from SDP Convert the From header to the E.164 format if the Request-URI is in E.164 Set the Contact header to include the per-tenant subdomain of the Session Controller. (edit-profiles outbound ... on interoperability profile) | Remove a=rtcp lines from SDP Remove a=candidate lines (for interactive connectivity checks) from SDP Remove Privacy headers if the From header does not contain anonymous Convert the From header to the E.164 format if the Request-URI is in E.164 (edit-profiles outbound ...) |
SIP privacy | Do not remove user identifiers (privacy trusted) | Do not remove user identifiers (privacy trusted) |
Adding an X-MS-SBC header to messages. This header specifies the SBC vendor, model and version on all outbound SIP messages in calls and SIP OPTIONS requests. | Required by Microsoft Teams. (ms-teams ... on interoperability profile) | No specific configuration required. This header is not present on messages sent or received on this adjacency. |
Microsoft Teams call transfer* | Can be enabled with transfer-policy > ms-teams-transfer on adjacency. Also requires media-playback enabled. | For versions earlier than V4.8.20, secure-media-forbid required |
Summary of required media features for interoperation with Microsoft Teams
Area of configuration | Connections to Microsoft Teams | Connections to the PSTN |
Comfort noise | Interwork to provide comfort noise (comfort-noise-codec interwork) as required by Microsoft Teams. | Pass through any existing comfort noise (comfort-noise-codec passthrough) |
Codecs and transcoding | Codecs supported by Microsoft Teams (all supported by Perimeta automatically). SILK G.711 (PCMU and PCMA) G.722 G.729 Transcoding is required to support comfort noise interworking. | Transcode on receiving a 4XX response from an endpoint (transcoding ...) You may need to restrict codecs on this side of the call, depending on your network and endpoints. Refer to the Hardware and software transcoding section of Media transcoding in Perimeta Configuration and Interoperability Guide - CLI Users to determine which codecs are not supported by your system and ensure that they are restricted using a suitable codec list. For more information on codec lists, see Codec lists in Perimeta Configuration and Interoperability Guide - CLI Users. |
RTCP | Use RTCP multiplexing (rtcp-multiplexing enabled) Ensure dialog always has RTCP (rtcp-transmission-policy always) Microsoft Teams requires RTCP on all calls and RTCP multiplexing | Use RTCP multiplexing (rtcp-multiplexing enabled) |
SRTP | Require SRTP (secure-media require) Use 488 as the error code if the call is rejected because SRTP is not allowed (error-profile outbound Reject_SRTP...) | Use 488 as the error code if the call is rejected because SRTP is not allowed (error-profile outbound Reject_SRTP...) |
Media bypass | Forbid (media-bypass forbid). Required to allow Perimeta to provide comfort noise interworking. | Forbid (media-bypass forbid). Required to permit transcoding. |
DTMF | Microsoft Teams does not support inband DTMF tones. It requires RFC 2833 DTMF. | No specific configuration required, unless endpoints use inband tones to signal DTMF. If endpoints do use inband DTMF, you must configure the Session Controller to perform inband tones interworking. |
Call hold interworking | Deployments with a MetaSphere CFS: Use c=IN IP4 0.0.0.0 to signal call hold towards Microsoft Teams (hold-setting...) When the CFS has placed a call on hold, instruct Microsoft Teams to send media to a Perimeta media address used for Microsoft Teams. Perimeta will drop the media while the call is on hold (edit-profiles outbound Drop_Media...) | No specific configuration required |
Playing a media file for Microsoft Teams call transfer | Enable media playback on adjacency (media-playback enabled on adjacency) Install media file to play on ISCs and MSCs, with ID ringback. Enable media playback and RTP/SRTP interworking on ISCs and MSCs (media-playback and srtp-interworking) | No specific configuration required |