Great new blog on the updated Skype Academy page:
the portal now allows users to create their personalized training plans,
track their training progress and rate trainings: https://techcommunity.microsoft.com/t5/Skype-for-Business-Blog/Welcome-to-the-new-Skype-Academy-page/ba-p/73818
(the ringing has begun): dissertations and personal experiences of a Microsoft Solutions Architect on Unified Communications and related: Skype for Business, Skype Consumer, Lync, Office 365, Teams, Exchange, Azure and other. Whilst I tend to stick to facts, opinions, if any, are my own :-)
Thursday, 8 June 2017
Friday, 26 August 2016
Skype for Business Busy Options: under the hood (sort of) part 1
Intro
- The caller wants evidence that their called party is engaged in another conversation;
- The callee wants evidence that someone tried to call them whilst in another conversation, and possibly be able to apply some form of second treatment to it.
The reason why it took so long before the feature was implemented is unknown, but one thing worth saying: it must have been not a trivial at all feature to implement, due to the complexities for the relevant algorithm to determine whether the user is actually busy or not before applying one of the two available "treatments":
- bouncing back the busy tone (option 1: Busy on Busy);
- send the call straight to voicemail (option 2: Voicemail on Busy).
- The multi-endpoint nature of the product: multiple sessions of multiple types may be active on different endpoints at any time;
- Multiple states of presence: does the presence state impact the availability of a user? If so, how?
- The many communications modalities (IM, audio, P2P, conference, PSTN)
- The many advanced telephony features like Shared Line, Response Groups, Team Calling, Delegation: how to handle?
Pre-requirements
The analysis you're about to view is based on a log trace with the Centralized Logging Service using the specific Busy Options Scenario. I recall, the Busy Options are included in the July 2016 CU; the implementation involves several tasks as described in this TechNet article and consist of:
- Download and install the CU
- Enable Busy Options on the relevant Voice Policies (e.g. to enable globally: Set-CsVoicePolicy -EnableBusyOptions $true)
- Install the Busy Options application: CU installation will not automatically take care of this step
- Enable Busy Option for the users. As said, there are two options here:
Set-CsBusyOptions -Identity sip:han.solo@giombini.lab -ActionType BusyOnBusy
Will enable the user with the Busy on Busy option.
Set-CsBusyOptions -Identity sip:luke.skywalker@giombini.lab -ActionType VoicemailOnBusy
Will enable the user with the Voicemail on Busy option. - Create the specific BusyOptions scenario in the Centralized Logging Service. Like step 3, CU installation will not automatically take care of this step.
The analysis
This is the commented log of the audio session. I have stripped out a few lines and highlighted the key sections for better readability:
BoB begins processing a new SIP invite containing audio:
TL_INFO(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.263.00026C87 (BusyOptions,BusyOnBusy.OnSipAudioInvite:busyonbusy.cs(359)) (000000000054029F)"Received a sip audio invite for call id [d6ae161097d3473f832ad2e618555843]
To Header: [<sip:fe01.giombini.lab@giombini.lab;gruu;opaque=srvr:Microsoft.Rtc.Applications.TestBot:JAYVi887GVW5E593qO_7VAAA>]
From Header: [<sip:administrator@giombini.lab>]
RequestUri: [sip:fe01.giombini.lab@giombini.lab;gruu;opaque=srvr:Microsoft.Rtc.Applications.TestBot:JAYVi887GVW5E593qO_7VAAA]
BoB checks if Busy Options are enabled and the output is TRUE:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.276.00026C8C (BusyOptions,PolicyReaderWrapper.ReadPolicy:policyreaderwrapper.cs(48)) (00000000014C5876)[Exit] Returning new BobVoicePolicy with policyName: [TenantId={00000000-0000-0000-0000-000000000000};0=1318020581;], vPolicy.EnableBusyOptions: [True]
BoB checks if there is at least one voice policy enabled for Busy Options and the output is TRUE:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.277.00026C8D (BusyOptions,UserAttributeReader.ReadVoicePolicy:userattributereader.cs(155)) (000000000066037E)[Exit] Returninv voicePolicy with voicePolicy.PolicyName: [TenantId={00000000-0000-0000-0000-000000000000};0=1318020581;], voicePolicy.BobEnabled: [True]
BoB performs further checks on the voice policy assigned to the user and checks if Busy Options are enabled for the callee. In my case, the user had the global voice policy which had Busy Options enabled:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.290.00026C9A (BusyOptions,PolicyReaderWrapper.ReadPolicy:policyreaderwrapper.cs(48)) (00000000014C5876)[Exit] Returning new BobVoicePolicy with policyName: [Global], vPolicy.EnableBusyOptions: [True]
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.290.00026C9B (BusyOptions,UserAttributeReader.ReadVoicePolicy:userattributereader.cs(155)) (000000000066037E)[Exit] Returninv voicePolicy with voicePolicy.PolicyName: [Global], voicePolicy.BobEnabled: [True]
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.290.00026C9C (BusyOptions,UserAttributeReader.GetUserAttributes:userattributereader.cs(111)) (000000000066037E)User voice policy enabled: [True]
BoB checks on the user details, at this point you should have noticed the Busy Option is DISABLED for the callee (and the caller), however, BoB carries on with further checks:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.290.00026C9F (BusyOptions,UserAttributeReader.GetUserAttributes:userattributereader.cs(126)) (000000000066037E)[Exit] Returning userDetails with userDetails.BusyOption: [Disabled], userDetails.ClientFlags [NULL]
BoB checks if it's a Team Call. The results is FALSE for all checks, confirming this is not a Team Call:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CA5 (BusyOptions,CallInfo.GetIsTeamCall:callinfo.cs(145)) (0000000000AA9FBC)[Enter] Querying history info header and callee clientflags to determine whether it is a team call.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CA8 (BusyOptions,CallInfo.GetIsTeamCall:callinfo.cs(153)) (0000000000AA9FBC)"[Exit]
historyInfoContainsTeamCallRetargetReason: [False]
clientFlagsContainsTeamRing: [False]
Return value: [False]
BoB checks if it's a Response Group call. The result is FALSE for all checks, confirming this is not RGS-related:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CA9 (BusyOptions,CallInfo.GetIsRgsCall:callinfo.cs(286)) (0000000000AA9FBC)[Enter] Querying History-Info and MS-Application-Aor headers to determine if this is an RGS related call.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CAA (BusyOptions,CallInfo.GetIsRgsCallFromHistoryInfo:callinfo.cs(309)) (0000000000AA9FBC)[Enter] Querying History-Info header to determine if this is an RGS related call.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CAE (BusyOptions,CallInfo.GetIsRgsCall:callinfo.cs(292)) (0000000000AA9FBC)"[Exit]
isRgsCallFromHistoryInfo: [False]
getIsRgsCallFromMsApplicationAor: [False]
Return value: [False]
Bob checks if it's a parked call, or a delegate call. The result is FALSE for all checks:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CAF (BusyOptions,CallInfo.GetIsCpsCall:callinfo.cs(380)) (0000000000AA9FBC)[Enter] Querying the Contact header for the [isCps] parameter to determine if this is a CPS call.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB0 (BusyOptions,CallInfo.GetIsCpsCall:callinfo.cs(397)) (0000000000AA9FBC)[Exit] Contact header does not contain the [isCps] parameter, returning false.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB1 (BusyOptions,CallInfo.GetIsReferredByHeaderPresent:callinfo.cs(263)) (0000000000AA9FBC)[Enter] Checking if the Referred-By header is present.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB2 (BusyOptions,CallInfo.GetIsReferredByHeaderPresent:callinfo.cs(270)) (0000000000AA9FBC)[Exit] Referred-By header is not present, returning false.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB3 (BusyOptions,CallInfo.GetIsDelegateCall:callinfo.cs(412)) (0000000000AA9FBC)[Enter] Check clientflags to determine whether this is a Delegate related call.
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB4 (BusyOptions,CallInfo.GetIsDelegateCall:callinfo.cs(428)) (0000000000AA9FBC)"
clientFlagsContainsForwardAudioAppInvites: [False]
clientFlagsContainsDelegateRing: [False]
result: [False]
BoB checks if it's a conference call:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB6 (BusyOptions,CallInfo.GetIsConferenceInvite:callinfo.cs(201)) (0000000000AA9FBC)[Enter] Querying TO header to determine if this is a conference invite.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB8 (BusyOptions,CallInfo.GetIsConferenceInvite:callinfo.cs(216)) (0000000000AA9FBC)[Exit] Request is not a conference invite, returning false.
BoB checks if call forwarding or simultaneous ring is enabled:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CB9 (BusyOptions,CallInfo.GetIsCallForwardingEnabled:callinfo.cs(482)) (0000000000AA9FBC)[Enter] Check clientflags to determine whether call forwarding is enabled.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CBA (BusyOptions,CallInfo.GetIsCallForwardingEnabled:callinfo.cs(487)) (0000000000AA9FBC)[Exit] Returning clientFlagsContainsForwardImmediate: [False]
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CBB (BusyOptions,CallInfo.GetIsSimultaneousRingEnabled:callinfo.cs(500)) (0000000000AA9FBC)[Enter] Check clientflags to determine whether simultaneous ring is enabled.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CBC (BusyOptions,CallInfo.GetIsSimultaneousRingEnabled:callinfo.cs(505)) (0000000000AA9FBC)[Exit] Returning clientFlagsContainsSimultaneousRing: [False]
BoB checks if this is a re-invite. If you'd like to know more about re-invites, what are these and when/why they are issued then check this blog:
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CBD (BusyOptions,CallInfo.GetIsReInvite:callinfo.cs(226)) (0000000000AA9FBC)[Enter] Querying TO header to determine if this is a re-invite.
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.292.00026CBE (BusyOptions,CallInfo.GetIsReInvite:callinfo.cs(248)) (0000000000AA9FBC)[Exit] TO header does not contain parameter [tag], returning false.
BoB checks if the call should be prioritized, based on the specific type, as we've seen, this is just a normal inbound call to a "vanilla" user who is not in any of the scenarios above:
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.296.00026CC8 (BusyOptions,CallInfo.ShouldPrioritizeCall:callinfo.cs(104)) (0000000000AA9FBC)Querying history info header and callee routing preamble to determine whether should prioritize call.
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.297.00026CC9 (BusyOptions,CallInfo.ShouldPrioritizeCall:callinfo.cs(121)) (0000000000AA9FBC)"
IsTeamCall: [False]
IsRgsCall: [False]
IsCpsCall: [False]
IsReferredByHeaderPresent: [False]
IsDelegateCall: [False]
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.299.00026CCA (BusyOptions,CallInfo.ShouldPrioritizeCall:callinfo.cs(130)) (0000000000AA9FBC)"
IsConferenceInvite: [False]
IsCallForwardingEnabled: [False]
IsSimultaneousRingEnabled: [False]
OverridePrioritizeCallValue:[False]
TL_INFO(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.299.00026CCB (BusyOptions,CallInfo.ShouldPrioritizeCall:callinfo.cs(138)) (0000000000AA9FBC)Return value: [False]
Next few lines in the log seem to be a summary of the findings so far:
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.299.00026CCC (BusyOptions,BobManager.ProcessInviteMessage:bobmanager.cs(158)) (0000000001EC2612)"
fromSipAddress: [sip:administrator@giombini.lab]
toSipAddress: [sip:fe01.giombini.lab@giombini.lab]
fromUserBusyOption: [Disabled]
toUserBusyOption: [Disabled]
TL_VERBOSE(TF_COMPONENT) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.299.00026CCD (BusyOptions,BobManager.ProcessInviteMessage:bobmanager.cs(166)) (0000000001EC2612)"
replacesCallId: [NULL]
isConferenceInvite: [False]
isPrioritizedCall: [False]
isReInvite: [False]
Finally, like we already saw, both caller and calle's do not have busy options enabled, therefore the call is passed through without further processing:
TL_INFO(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.299.00026CCE (BusyOptions,BobManager.ProcessInviteMessage:bobmanager.cs(180)) (0000000001EC2612)[Exit] Busy Options not enabled for both caller [sip:administrator@giombini.lab] and callee [sip:fe01.giombini.lab@giombini.lab]. Passing through the call.
(BusyOptions,DefaultProcessor.Run:defaultprocessor.cs(32)) (0000000001F12850)Passing request through.
(BusyOptions,BusyOnBusy.ProcessInviteMessage:busyonbusy.cs(487)) (000000000054029F)[Exit]
TL_VERBOSE(TF_STACKTRACE) [fe01\fe01]176C.4B20::08/24/2016-20:00:17.301.00026CD8 (BusyOptions,BusyOnBusy.OnSipAudioInvite:busyonbusy.cs(473)) (000000000054029F)[Exit]
Takeaways
The main takeaway from this brief analysis is understanding what type of interoperability you should expect from the Busy Options in various voice applications. Busy Options will apply to calls make to you as an individual user. It will not apply in case of:
Response Groups (RGS)
- Busy Options set on Response Group numbers will be ignored by the system; multiple concurrent calls will be allowed.
- The current Attendant routing experience in Response Groups will remain unchanged for the Agents with Busy Options settings.
- The calls coming from Response Groups to the users who are Response Groups Agents will not be throttled by Busy Options settings and the current RGS experience will be maintained.
- The non-RGS related calls to the Agents will be honored by their Busy Options settings.
Team Call
- Incoming calls to users who are set up for a Team Call will be prioritized to ignore Busy on Busy and Voicemail on Busy settings.
- The current Team Call experience will remain unchanged with Busy Options set for the users.
- The non-Team Call related calls to such users will be honored by their Busy Options settings.
Boss/Admin Delegation
- Incoming calls to users who are set up for a Boss/Admin Delegation either as Boss or an Admin will be prioritized to ignore Busy on Busy and Voicemail on Busy settings.
- The current Boss/Admin Delegation experience will remain unchanged with Busy Options set for the Admins or Boss.
- The non-Boss/Admin Delegation related calls to Admins will be honored by their Busy Options settings.
Shared Line Appearance (SLA)
- Busy Options settings on user accounts set up for Shared Line Appearance will be ignored.
- Shared Line Appearance’s native Busy on Busy and Voicemail on Busy options will be honored instead.
Call Parking Service (CPS)
- Parked calls that were not retrieved and are ringing back due to timing out will be allowed to ring though to the user who parked the call by the Busy Options.
Call Conferencing
- Users in conference calls are considered Busy and new incoming calls will be rejected with a busy signal or forwarded to voice mail according to their Busy Options settings.
- Users in conferences are not prevented from initiating new calls or conferences by Busy Options.
- Users in conferences are still able to receive new conference invitations, but new peer-to-peer calls will be rejected according to their Busy Options settings.
Busy Options work irrespective of the client or device the user logs on to (unlike SLA which only works on VVX phones). Additionally, if you are logged on to multiple devices and are engaged in a call on one, this will be taken into account and the second call will be rejected.
If you get a call while busy and it is rejected, you will get a missed call notification. Callers will see a notification that you are busy on another call.
In the second part of the article, I will analyze what happens when users are enabled for Busy Options.
Thanks for reading.
If you get a call while busy and it is rejected, you will get a missed call notification. Callers will see a notification that you are busy on another call.
In the second part of the article, I will analyze what happens when users are enabled for Busy Options.
Thanks for reading.
Wednesday, 24 August 2016
Skype for Business 2016 client only supports new v19 ICE
Skype for Business client was released on September 2015, and featured a number of new functionalities, as well as some discarded ones, as described here. The one I'd like to talk about is quite under-the-hood, but potentially important.
What you will not find in the article above (but you would have probably hoped for), is that the new client got support for the legacy (v6) ICE removed.
ICE (Interactive Connectivity Establishment) is, in simple terms, a set of protocols (STUN and TURN) used to facilitate media connectivity establishment for endpoints under various restricted network scenarios (e.g. when not directly routable, behind a NAT or firewall). If you'd like to know more, please refer to this excellent resource.
ICE (Interactive Connectivity Establishment) is, in simple terms, a set of protocols (STUN and TURN) used to facilitate media connectivity establishment for endpoints under various restricted network scenarios (e.g. when not directly routable, behind a NAT or firewall). If you'd like to know more, please refer to this excellent resource.
ICE has gone though several iterations. Until OCS 2007 "R1", only ICE v6 was used. OCS 2007 R2 introduced the new and more efficient ICE v19 version, but v6 was maintained for backward compatibility until the SfB 2015 client.
The implications of such change lie with intercommunicating with legacy systems because OCS 2007 "R1" and Exchange 2007 UM only understand ICE v6; so, expect issues if you need to interoperate with these systems. Examples:
- Skype for Business 2016 client calls to Exchange 2007 UM
- Skype for Business 2016 client calls Communicator 2007 "R1" client.
In case you are wondering, I haven't discovered anything new so I am just broadcasting. Credit goes to this blog and to Mastering Skype for Business 2015 book by Keith Hanna. Both are great reads to know more about the issue. Only, despite the potential implications, this doesn't seem to have been in the headlines (or perhaps I just missed it)?
A trace analysis from a Skype for Business 2015 server with the latest July 2016 cumulative update reveals both v6 and v19 ICE are presented in the call negotiations (some servers are also ICE clients).
Tuesday, 23 August 2016
Skype for Business Busy on Busy: new performance counters
Busy on busy (or second treatment) is a neat and long-awaited feature that was eventually added in the Skype for Business July 2016 Cumulative Update.
For more info about BoB, what is it, how it works please check this blog by Randy Chapman.
Not surprisingly, a number of performance counters have been added to help monitoring and troubleshooting. Counter definitions can be found here:
C:\Program Files\Skype for Business Server 2015\Performance Counter Cumulative Update\en-US
Here they are:
PERF_BUSYOPTIONS_BUSYOPTIONS_009_NAME=LS:BUSYOPTIONS - Busy Options
PERF_BUSYOPTIONS_BUSYOPTIONS_009_HELP=This object includes counters that apply the Busy Options component
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_HANDLED_009_NAME=BUSYOPTIONS - Total number of calls handled by the Busy Options application
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_HANDLED_009_HELP=Total number of calls handled by the Busy Options application.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_REQUEST_FAILURES_009_NAME=BUSYOPTIONS - Total number of requests handled by the Busy Options application that failed
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_REQUEST_FAILURES_009_HELP=Total number of requests (INVITE or BYE) handled by the Busy Options application that failed.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CURRENT_CALLS_009_NAME=BUSYOPTIONS - Total number of on-going calls across all Busy Options-enabled users
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CURRENT_CALLS_009_HELP=Total number of calls in progress for Busy Options-enabled users.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_DECLINED_WITH_BUSY_SIGNAL_009_NAME=BUSYOPTIONS - Total number calls declined with busy signal
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_DECLINED_WITH_BUSY_SIGNAL_009_HELP=Total number calls declined with busy signal.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_VOICEMAIL_009_NAME=BUSYOPTIONS - Total number of calls sent to Voicemail
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_VOICEMAIL_009_HELP=Total number of calls sent to Voicemail.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_BUSY_USER_009_NAME=BUSYOPTIONS - Total number of calls sent to users while user is in a call
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_BUSY_USER_009_HELP=Total number of calls sent to busy users.
For more info about BoB, what is it, how it works please check this blog by Randy Chapman.
Not surprisingly, a number of performance counters have been added to help monitoring and troubleshooting. Counter definitions can be found here:
C:\Program Files\Skype for Business Server 2015\Performance Counter Cumulative Update\en-US
Here they are:
PERF_BUSYOPTIONS_BUSYOPTIONS_009_NAME=LS:BUSYOPTIONS - Busy Options
PERF_BUSYOPTIONS_BUSYOPTIONS_009_HELP=This object includes counters that apply the Busy Options component
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_HANDLED_009_NAME=BUSYOPTIONS - Total number of calls handled by the Busy Options application
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_HANDLED_009_HELP=Total number of calls handled by the Busy Options application.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_REQUEST_FAILURES_009_NAME=BUSYOPTIONS - Total number of requests handled by the Busy Options application that failed
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_REQUEST_FAILURES_009_HELP=Total number of requests (INVITE or BYE) handled by the Busy Options application that failed.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CURRENT_CALLS_009_NAME=BUSYOPTIONS - Total number of on-going calls across all Busy Options-enabled users
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CURRENT_CALLS_009_HELP=Total number of calls in progress for Busy Options-enabled users.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_DECLINED_WITH_BUSY_SIGNAL_009_NAME=BUSYOPTIONS - Total number calls declined with busy signal
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_DECLINED_WITH_BUSY_SIGNAL_009_HELP=Total number calls declined with busy signal.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_VOICEMAIL_009_NAME=BUSYOPTIONS - Total number of calls sent to Voicemail
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_VOICEMAIL_009_HELP=Total number of calls sent to Voicemail.
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_BUSY_USER_009_NAME=BUSYOPTIONS - Total number of calls sent to users while user is in a call
PERF_BUSYOPTIONS_BUSYOPTIONS_TOTAL_CALLS_SENT_TO_BUSY_USER_009_HELP=Total number of calls sent to busy users.
Wednesday, 17 June 2015
10000!! On our way to 20000 Leagues under the sea
Used to do Low Level Designs for Lync deployments using some "crap" spreadsheets and "manual" validations, Alessio challenged me to help him improve his spreadsheet using some VBA and other Excel tricks.
A while after that we decided to make it available online (http://bit.ly/1BjRaCQ) and prepare ourselves for the web criticism and hard reviews.
Well, it was a massive surprise that the number of downloads is still going up, it receives good reviews and amazingly it has inspired another online project. Even Microsoft @SkypeBusiness tweets the tool.
After 10000 downloads everything we change requires more care and planning because the responsibility is bigger every day.
Why do I waste my time doing it? I believe on Adam Grant's book "Give and Take: Why Helping Others Drives Our Success". Givers gain more than takers.
No. Really no. I was not expecting that number of downloads.
Thank you for all the people that help us to improve it and use it.
Thank you @AlessioGiombini for the challenge and hope that we can bring new features soon.
Best of luck on your #Skype4B deployments.
A while after that we decided to make it available online (http://bit.ly/1BjRaCQ) and prepare ourselves for the web criticism and hard reviews.
Well, it was a massive surprise that the number of downloads is still going up, it receives good reviews and amazingly it has inspired another online project. Even Microsoft @SkypeBusiness tweets the tool.
After 10000 downloads everything we change requires more care and planning because the responsibility is bigger every day.
Why do I waste my time doing it? I believe on Adam Grant's book "Give and Take: Why Helping Others Drives Our Success". Givers gain more than takers.
No. Really no. I was not expecting that number of downloads.
Thank you for all the people that help us to improve it and use it.
Thank you @AlessioGiombini for the challenge and hope that we can bring new features soon.
Best of luck on your #Skype4B deployments.
Thursday, 7 May 2015
Simple script to check Response Groups holiday sets
This is a very simple PowerShell script to export your Lync/Skype for Business holiday sets in Response Groups.
The script will parse your pool name (assuming there is only one), and will export each holiday set as a separate .csv file in the root of your C: drive.
$pool = "Service:"+(Get-CsPool | Where-Object {$_.Services -match "Registrar:"}).identity
$HolidaySet = Get-CsRGSHolidaySet
$Name = $HolidaySet.Name
cls
foreach ($n in $HolidaySet)
{
Write-Host "Processing holiday set called $($n.name)" -foregroundcolor White
Get-CsRgsHolidaySet -Identity $pool -Name $n.name | Select-Object Identity -ExpandProperty holidaylist | Export-csv c:\$($n.name).csv
}
The script will parse your pool name (assuming there is only one), and will export each holiday set as a separate .csv file in the root of your C: drive.
$pool = "Service:"+(Get-CsPool | Where-Object {$_.Services -match "Registrar:"}).identity
$HolidaySet = Get-CsRGSHolidaySet
$Name = $HolidaySet.Name
cls
foreach ($n in $HolidaySet)
{
Write-Host "Processing holiday set called $($n.name)" -foregroundcolor White
Get-CsRgsHolidaySet -Identity $pool -Name $n.name | Select-Object Identity -ExpandProperty holidaylist | Export-csv c:\$($n.name).csv
}
Thursday, 30 April 2015
Skype for Business and Lync 2013 DDC - Detailed Design Calculator 5.0
Just in time for Skype For Business server release, friend and co-author Alberto Nunes and I are very happy to announce Skype for Business DDC - Detailed Design Calculator 5.0. It adds a lot of long-awaited features (keep reading for details). Please grab it from here. Please take a moment to rate us. Thank you! :-)
DDC is a simple offline, Excel-based, low-level design calculator for Microsoft Skype for Business and Lync 2013 on-premises deployments. Fill in host names, IP addresses etc., and DDC will calculate DNS records, certificate names, firewall rules, deployment scripts and several other design elements to help speed-up your deployment.
DDC is a continuously evolving project and you should expect frequent updates with new features added over time. It is and will always be free.
Any bug report, requests for improvements or new features, suggestions, criticism etc. are greatly appreciated.
Features
New
in version 5.0.0:
- Support for multiple SIP domains (up to 8), each with several configurable options (strict domain matching, SIP/XMPP federation, etc.)
- DNS tables reorganised for
multiple domain support (records are sorted by domain).
- Added the ability to include/exclude external servers (Edge pool, Reverse Proxy) from the deployment
- Added the ability to choose AD or main SIP domain name for Pools and Web Services names (earlier DDC versions used primary SIP domain name by default and did not allow to change)
- Option to deploy 1 or 2 network cards on dedicated Mediation servers (separated internal and PSTN IP addresses). We have not included such option for collocated Mediation (not recommended)
- Option to use separate public IP addresses for external web-based applications (FE and Director pool web services, Office Web Apps)
- Support for Office Web Apps farms (up to 6 nodes)
- Additional scripts (setup accounts for synthetic transactions)
- Required empty input cells
displayed in red
- Supports Standard and Enterprise pools (up to 12 nodes), with pure device-based load balancing (HLB) or a combination of DNS load balancing and device-based load balancing for web services (DNS LB);
- Supports Edge, Director and Mediation pools (up to 12 nodes per role) with HLB or DNS LB;
- Supports up to 4 PSTN gateways (can be media gateways, direct SIP trunks, etc.) with or without media bypass and configurable SIP over TCP or TLS, media ports, media bypass
- Ability to specify custom media ports for clients and servers. DDC automatically applies consecutive non-overlapping ranges, and creates the appropriate commands on the Scripts sheet to apply these on to your deployment;
- Calculates internal and external certificates CN and SAN; for the external certificate, it provides the option of separate or single certificate for Edge and Reverse proxy;
- Calculates DNS entries for internal and external zones. Further to that, DDC generates a script (in the Scripts sheet) which will automatically add the required records for both pinpoint or split-brain DNS.
- Internal firewalls (internal-facing DMZ);
- External firewalls (external-facing DMZ);
- PSTN: The PSTN firewall sheet calculates custom rules for firewalls behind PSTN gateways, if any;
- Endpoints: the internal client Firewall sheet calculates custom rules for personal firewalls installed on clients, and rules required in scenarios with endpoints segregated by VLANs or other restrictions in place.
- DHCP: We have included a modified version of DhcpConfigScript.bat (http://technet.microsoft.com/en-us/library/gg412988(v=ocs.14).aspx), with the correct hexadecimal values automatically calculated and included, based on your design inputs; this removes the requirement to use dhcputil to generate the script and makes it ready to run on x86 and x64 Windows DHCP servers;
- DNS: Scripts to create necessary records based on dnscmd (with both pinpoint and split-brain, based on your selection);
- Office Web Apps: scripts to automate certificate request (through certutil), installation and web farm creation;
- Forward Proxy exceptions;
- QoS: PowerShell commands to configure custom port ranges;
- Setup
accounts for synthetic transactions.
How to use
The tool was tested on Microsoft Excel 2013 and 2010 for Windows desktop (Excel online is not supported and we have not tested it on Office for Mac). Macros and active content must be enabled. Fill all relevant fields in Global Data, Resource Data and Other Data sheets. All input cells with dynamic data have a dark blue background and are already populated with sample data. Please change all values to reflect your actual design. Empty or invalid entries will be marked red.Important: remember to press the Generate Data button (available in all sheets) when data input is complete (or when you change a value). This is required to refresh and resize calculations and views. Please do not manually resize, hide or unhide rows. This is done programmatically when you press the Generate Data button so that only the relevant content is displayed.
Known issues
- When you press the Generate
Data button, you may notice some screen flickering through the DDC
sheets. This is due to the recalculations of data and views. On slower
machines, it can take some time for refresh to complete;
- An issue in December 2014 Excel update MS14-082 may break DDC functionality in some circumstances. You may notice pull-down menus not updating, Generate Data button not working, etc. This is due to a problem described in the following article (check section known issues with this security update). Hotfixes have been released in the March 2015 Updates for Office 2007, 2010 & 2013. Refer to the articles below for more details and any pre-requisites: Microsoft Support and Microsoft Microsoft Excel Support Team Blog.
Disclaimer
DDC is a third party tool developed by independent Microsoft UC Solutions Architects. Authors are not affiliated with Microsoft. Skype for Business,™, Skype™, Lync™, Office Communications Server™, Exchange™ and Excel™ are registered trademarks of the Microsoft Corporation™. Although we took every care in calculations and scripts, use at own risk! Please read the extended disclaimer on the file.
Assumptions and limitations
Note the following assumptions or known limitations (some of which will be addressed in future versions):- Very limited content validation and error catching: You will not be warned if you type 256.256.256.256 as IP address :-) Ensure you type the correct data;
- DDC currently has no sizing/capacity calculator features. It assumes you already have made your determinations on number and types of servers to implement;
- Only IPv4 is supported;
- Single Pool per each role is supported;
- Single Reverse Proxy;
- Edge, Director and Mediation, even when 1 node is selected, are always configured in a Pool to allow for easier scalability and certificate management;
- When HLB (device-based load balancing) is selected for Front-End and Director Pools, we assume that internal web services host names will not be overridden. This is optional when HLB is used; override becomes mandatory with DNS LB;
- We assume internal server resources will use an internal Certification authority. This includes Front-end, Mediation, Director and internal Edge and reverse proxy interfaces. Firewall rules are included to grant DMZ servers (Edge and reverse proxy) access to the CRL;
- If the same domain name is used
for Active Directory and SIP, in a multiple SIP domain deployment, we
assume this will be the primary (default).
Credits
For beta testing, bug report, suggestions, feedback and other valuable input: Corey McClain (@cdhtweetstech), Lasse Nordvik Wedø (@lawedo), Antonio Spirandelli (@spady7), Dino Caputo (@dinocaputo), Fabrizio Volpe (@fabriziovlp), MaxSanna (@MaxSanna) Igor Kravchenko, Korbyn, Lutenus, Mauro Rita (@jmrita), Thomas Juhl Olesen, Wilfried van Oosterhout, Pat Richard (@patrichard), Daniel Banfield, James Brewster.
Version history
Version 5.0.0 - 1st May, 2015New features:
1) Support for multiple SIP domains (up to 8), each with several configurable options (strict domain matching, SIP/XMPP federation, etc.)
2) DNS tables reorganised for multiple domain support (records are sorted by domain).
3) Added the ability to include/exclude Edge pool in the deployment
4) Added the ability to choose AD or main SIP domain name for Pools and Web Services names (earlier DDC versions used primary SIP domain name by default and did not allow to change)
5) Option to deploy 1 or 2 network cards on dedicated Mediation servers (separated internal and PSTN IP addresses). We have not included such option for collocated Mediation (not recommended)
6) Option to use separate public IP addresses for external web-based applications (FE and Director pool web services, Office Web Apps)
7) Support for Office Web Apps farms (up to 6 nodes)
8) Additional scripts (synthetic transactions)
9) Cells with empty or invalid entries are marked red
Bug fix:
1) Some naming inconsistencies
2) Visual improvements (smaller fonts for better readability on higher res) - refresh issues
3) Numerous optimisations on scripts and code (for many suggestions on scripts: thanks @PatRichard)
4) Some issues on firewall sheets (missing rules for Directors)
Version 4.3.1 - 13th April, 2015
New features: none
Bug fix: Lyncdiscover record was displayed in internal DNS in some instances. (thanks Fgarib)
Version 4.3 - 9th November, 2014
New features: none
Bug fix:
1) Missing rule in Firewall (external) for tcp/443 on A/V Edge server
2) Missing rule in Firewall (external) for tcp/80 on Reverse Proxy
Version 4.2 – 7th September, 2014
New features: visual improvements - added extended disclaimer
Bug fix:
1) incorrect implementation of RFC3361 (http://www.rfc-editor.org/rfc/rfc3361.txt) caused the DHCPUTIL script to generate an incorrect string for option 120 (row 11 in Scripts sheet). Thanks to Daniel Banfield for reporting the issue
2) bug in DHCP script generating the correct entry for Lync internal web services depending on load balancing method
3) various scripts optmisations and some typos (thanks @patrichard)
Version 4.1.1 – 4th September, 2014
New features: adds an entry for lyncdiscover in DNS internal sheet (required in specific scenarios where Windows Phone 8.x devices are unable to sign in from a corporate WiFi (thanks to @patrichard for the input). More info at http://jackstromberg.com/2013/06/lync-2013-dns-settings/
Bug fix: on Firewall (internal) sheet, the edge pool FQDN was displayed in a rule (should have been the FE pool FQDN)
Version 4.1 – 29th August, 2014
New features: visual improvements
Bug fix: Internal Office Web Apps certificate missed physical server name in the SAN (without it, the farm always shows as unhealthy). Thanks to @patrichard for notifying
Version 4.0.4 – 2nd August, 2014
New features: none
Bug fix: naming conventions - typos - some inaccurate error catching
Version 4.0.3 – 19th April, 2014
New features: none
Bug fix: additional refresh issues. Thanks to Wilfried van Oosterhout for notifying.
Version 4.0.2 – 13th April, 2014
New features: none
Bug fix: some issues in the hide/show procedures causing some entries to be incorrectly displayed (Director Web services, PSTN gateways and other). Thanks to Wilfried van Oosterhout for notifying.
Version 4.0.1 – 22nd March, 2014
New features: none
Bug fix: Inconsistencies in Office Web Apps / Office Online naming conventions + improvements on scripts descriptions
Version 4.0.0 – 21st March, 2014
New features: see the Features section for a full overview of existing and new features
Bug fix: Several visual issues, optimisations
Version 3.0.2 - 13th February, 2014
New features: none
Bug fix: minor code bug causing resource data refresh issues when changing Mediation pool type
Version 3.0.1 - 11th February, 2014
New features: none
Bug fix: formula issue in PSTN firewall sheet caused some IP addresses to display incorrectly (thanks Lutenus for notifying)
Version 3.0 - 10th February, 2014
New features: Support for PSTN Gateways, Mediation and Director Pools
Bug fix: several bug fixes, code and visual improvements
Version 2.0.4 - 23rd December, 2013
New features: none
Bug fix:
1) fix an issue where formula was displayed in some cells instead of result
2) On a standard edition pool, first SAN entry was not correct (should have been a reiteration of CN)
Wednesday, 15 April 2015
Lync calls fail with long post-dial delay? Check the Edge!
I hope someone can benefit from the many hours I spent on this issue :)
INFRASTRUCTURE
Lync 2013 Redundant deployment. 3-node Enterprise pool. 2-node Edge servers. Public addresses on external interfaces. All OS are Windows Server 2012 R2. All Lync servers at latest CU as of February 2015. All infrastructure virtualised on VMware ESX 5.5.
ISSUE DESCRIPTION
Lync and PSTN calls suddenly could not be connected by external or internal endpoints. Clients received a call, call is answered, client hangs on "connecting..." state for some seconds, and then call is dropped.
Along with issue above, calls suddenly took a long time to be initiated (long post-dial delay). Whilst up to 2-3 "beeps" should be considered as normal, we experienced up to 8.
The sneaky nature of the issue was no apparent recurrence pattern. On average, we experienced the issue 4 times in around 3 weeks. Worth nothing saying, it was a hugely disruptive problem affecting about 10,000 users.
OTHER INFORMATION AND THINGS CHECKED
No related events logged on windows logs (checked on Front-End Servers, Edge, and Mediation)
ANALYSIS
Such failures can be usually narrowed-down to a few types of issues:
INFRASTRUCTURE
Lync 2013 Redundant deployment. 3-node Enterprise pool. 2-node Edge servers. Public addresses on external interfaces. All OS are Windows Server 2012 R2. All Lync servers at latest CU as of February 2015. All infrastructure virtualised on VMware ESX 5.5.
ISSUE DESCRIPTION
Lync and PSTN calls suddenly could not be connected by external or internal endpoints. Clients received a call, call is answered, client hangs on "connecting..." state for some seconds, and then call is dropped.
Along with issue above, calls suddenly took a long time to be initiated (long post-dial delay). Whilst up to 2-3 "beeps" should be considered as normal, we experienced up to 8.
The sneaky nature of the issue was no apparent recurrence pattern. On average, we experienced the issue 4 times in around 3 weeks. Worth nothing saying, it was a hugely disruptive problem affecting about 10,000 users.
OTHER INFORMATION AND THINGS CHECKED
No related events logged on windows logs (checked on Front-End Servers, Edge, and Mediation)
- Attempts to stop some Edge services (MediaRelaySvc.exe and MRASSvc.exe) resulted in services being stuck in “stopping” state indefinitely. And it was not possible to kill them
- IM and presence still functional
- The only workaround to re-established functionality was rebooting both edge servers
- Firewall, DNS and routing was thoroughly checked and the correct configuration was confirmed to be in place
ANALYSIS
Such failures can be usually narrowed-down to a few types of issues:
- Firewall
- Routing
- MRAS
ROOT CAUSE
After considerable digging, we found out the issue was triggered by two drivers: vShield Endpoint Thin Agent driver (vsepflt.sys) and vShield Endpoint TDI Manager driver (vnetflt.sys), both interacting at the network layer. Conclusive proof was provided by Microsoft PSS, by analysing a memory dump taken during a failure and Edge MRAS in hanging state (service stopping….).
WHAT DO THE DRIVERS DO
VMware vShield Endpoint is required to manage anti-virus and anti-malware policies for virtualized environments. vShield Endpoint strengthens virtualization security with enhanced endpoint protection by offloading AV processing to a secure virtual appliance supplied by VMware partners. All servers in the deployment featured a file-level AV scanning, and the drivers were required as an agentless communication component between the virtual machines and VMware hosts.
RESOLUTION
such drivers were already known to cause stability issues, including BSOD (check this and this other post. Besides, they are not certified by Microsoft (at least, until the tested build).
Although we thought we were running a version fixing the issues described in the articles above, it seemed we hit a different type of bug which VMware fixed at a later date through an ad-hoc patch.
Our only other quick fix was to uninstall the drivers from the Lync servers completely. Simply disabling AV scanning or disabling the drivers did not help.
TAKEAWAY
Low-level processes from third party applications can affect stability and reliability of Lync traffic. In our case it was even worse: Edge services were in hung state, causing Media Relay authentication to fail for all calls. Whilst a file-level antivirus scanner should be installed on any Lync server as a common security measure (with the correct exclusions), you should pay close attention to low-level additional components or third parties like:
- Network-level inspection
- IDS
- Personal firewall add-ons
- Network accelerators
- Broadly speaking: any other network-level software may interfere with Lync traffic
Confirming their full compatibility will definitely save you some headaches.
OTHER
I have experienced very similar issues on another deployment, this time, with McAfee antivirus. On that occasion, the trigger was the FireTDI driver (a host intrusion detection component).
Subscribe to:
Comments (Atom)

