Hello world, but no audio

Setup an Asterisk 20.4.0 server on OpenBSD 7.4, configured per the “Hello world” scenario in the docs. Testing with an Android phone running the MizuDroid softphone and all seems to be okay except there’s no audio.
Both devices are on the same LAN, and the firewall on the Asterisk host has been disabled.

pjsip.conf:

;================================ TRANSPORTS ==
; Our primary transport definition for UDP communication behind NAT.
[transport-udp-nat]
type = transport
protocol = udp
bind = 0.0.0.0
; NAT settings
;local_net = 10.0.0.0/8
;external_media_address = 203.0.113.1
;external_signaling_address = 203.0.113.1

;================================ ENDPOINT DEFINITIONS ==
; Below are the definitions for all staff devices, listed by department.
;
; Super Awesome Company uses the MAC address of their devices for the auth
; username and the extension number for the name of the endpoint, auth and
; aor objects. If your phones must use the same user ID and auth name then
; you will need to customize the endpoints accordingly.

;================================
[202]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=202
aors=202

[202]
type=auth
auth_type=userpass
password=password
username=202

[202]
type=aor
max_contacts=1

extensions.conf:

[from-internal]
exten => 100,1,NoOp(CallerID is ${CALLERID})
same = n,Wait(1)
same = n,Answer()
same = n,Playback(hello-world)
same = n,Wait(1)
same = n,Hangup()

Console output:

# asterisk -cvvvvvvvv
Asterisk 20.4.0, Copyright (C) 1999 - 2022, Sangoma Technologies Corporation and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Manager registered action DBGet
Manager registered action DBGetTree
Manager registered action DBPut
Manager registered action DBDel
Manager registered action DBDelTree
PBX UUID: 92bb1faf-5118-4181-8700-2cf72fcb9566
Registered 'audio' codec 'codec2' at sample rate '8000' with id '1'
Created cached format with name 'codec2'
Registered 'audio' codec 'g723' at sample rate '8000' with id '2'
Created cached format with name 'g723'
Registered 'audio' codec 'ulaw' at sample rate '8000' with id '3'
Created cached format with name 'ulaw'
. . .
Created cached format with name 'silk12'
Registered 'audio' codec 'silk' at sample rate '16000' with id '45'
Created cached format with name 'silk16'
Registered 'audio' codec 'silk' at sample rate '24000' with id '46'
Created cached format with name 'silk24'
Sorcery registered wizard 'bucket'
Sorcery registered wizard 'bucket_file'
  == Message handler 'dialplan' registered.
  == Registered custom function 'MESSAGE'
  == Registered custom function 'MESSAGE_DATA'
  == Registered application 'MessageSend'
  == Manager registered action MessageSend
  == Registered channel type 'Surrogate' (Surrogate channel used to pull channel from an application)
  == Manager registered action BridgeTechnologyList
  == Manager registered action BridgeTechnologySuspend
  == Manager registered action BridgeTechnologyUnsuspend
  == Registered DNS resolver 'system' with priority '2147483647'
 Asterisk PBX Core Initializing
  == Registering builtin functions:
  == Registered custom function 'EXCEPTION'
  == Registered custom function 'TESTTIME'
  == Manager registered action ShowDialPlan
  == Manager registered action ExtensionStateList
  == Registered application 'Answer'
  == Registered application 'BackGround'
  == Registered application 'Busy'
  == Registered application 'Congestion'
  == Registered application 'ExecIfTime'
  == Registered application 'Goto'
  == Registered application 'GotoIf'
  == Registered application 'GotoIfTime'
  == Registered application 'ImportVar'
  == Registered application 'Hangup'
  == Registered application 'Incomplete'
  == Registered application 'NoOp'
  == Registered application 'Proceeding'
  == Registered application 'Progress'
  == Registered application 'RaiseException'
  == Registered application 'Ringing'
  == Registered application 'SayAlpha'
  == Registered application 'SayAlphaCase'
  == Registered application 'SayDigits'
  == Registered application 'SayMoney'
  == Registered application 'SayNumber'
  == Registered application 'SayOrdinal'
  == Registered application 'SayPhonetic'
  == Registered application 'SetAMAFlags'
  == Registered application 'Wait'
  == Registered application 'WaitDigit'
  == Registered application 'WaitExten'
  == Registered application 'Set'
  == Registered application 'MSet'
  == Registered channel type 'Local' (Local Proxy Channel Driver)
  == Manager registered action LocalOptimizeAway
 Asterisk Dynamic Loader Starting:
[Dec  9 21:27:24] NOTICE[217313]: loader.c:2405 load_modules: 94 modules will be loaded.
asterisk:/usr/local/lib/asterisk/modules/chan_pjsip.so: undefined symbol 'ast_sip_cli_traverse_objects'
asterisk:/usr/local/lib/asterisk/modules/chan_pjsip.so: undefined symbol 'ast_sip_cli_traverse_objects'
. . .
asterisk:/usr/local/lib/asterisk/modules/res_pjsip_send_to_voicemail.so: undefined symbol 'ast_sip_session_get_datastore'
asterisk:/usr/local/lib/asterisk/modules/res_pjsip_send_to_voicemail.so: undefined symbol 'ast_sip_session_remove_datastore'
 Loading extconfig.
[ Initializing Custom Configuration Options ]
  == extconfig => (Configuration)
 Loading logger.
  == logger => (Logger)
 Loading res_sorcery_astdb.so.
  == Sorcery registered wizard 'astdb'
  == res_sorcery_astdb.so => (Sorcery Astdb Object Wizard)
 Loading res_sorcery_config.so.
  == Sorcery registered wizard 'config'
  == res_sorcery_config.so => (Sorcery Configuration File Object Wizard)
 Loading res_sorcery_memory.so.
  == Sorcery registered wizard 'memory'
  == res_sorcery_memory.so => (Sorcery In-Memory Object Wizard)
 Loading res_sorcery_realtime.so.
  == Sorcery registered wizard 'realtime'
  == res_sorcery_realtime.so => (Sorcery Realtime Object Wizard)
 Loading ccss.
  == Registered application 'CallCompletionRequest'
  == Registered application 'CallCompletionCancel'
  == ccss => (Call Completion Supplementary Services)
 Loading cdr.
[Dec  9 21:27:24] NOTICE[217313]: cdr.c:4568 cdr_toggle_runtime_options: CDR simple logging enabled.
  == cdr => (CDR Engine)
 Loading cel.
  == cel => (CEL Engine)
 Loading dnsmgr.
  == dnsmgr => (DNS Manager)
 Loading dsp.
  == dsp => (DSP)
 Loading enum.
  == enum => (ENUM Support)
 Loading features.
  == Registered custom function 'FEATURE'
  == Registered custom function 'FEATUREMAP'
  == Registered application 'Bridge'
  == Manager registered action Bridge
  == features => (Call Features)
 Loading http.
  == http => (Built-in HTTP Server)
 Loading indications.
    -- Registered indication country 'us'
[Dec  9 21:27:24] NOTICE[217313]: indications.c:1100 load_indications: Default country for indication tones: us
[Dec  9 21:27:24] NOTICE[217313]: indications.c:424 ast_set_indication_country: Setting default indication country to 'us'
  == indications => (Indication Tone Handling)
 Loading acl.
  == acl => (Named ACL system)
 Loading manager.
  == Manager registered action Ping
  == Manager registered action Events
  == Manager registered action Logoff
  == Manager registered action Login
  == Manager registered action Challenge
  == Manager registered action Hangup
  == Manager registered action Status
  == Manager registered action Setvar
  == Manager registered action Getvar
  == Manager registered action GetConfig
  == Manager registered action GetConfigJSON
  == Manager registered action UpdateConfig
  == Manager registered action CreateConfig
  == Manager registered action ListCategories
  == Manager registered action Redirect
  == Manager registered action Atxfer
  == Manager registered action CancelAtxfer
  == Manager registered action Originate
  == Manager registered action Command
  == Manager registered action ExtensionState
  == Manager registered action PresenceState
  == Manager registered action AbsoluteTimeout
  == Manager registered action MailboxStatus
  == Manager registered action MailboxCount
  == Manager registered action ListCommands
  == Manager registered action SendText
  == Manager registered action UserEvent
  == Manager registered action WaitEvent
  == Manager registered action CoreSettings
  == Manager registered action CoreStatus
  == Manager registered action Reload
  == Manager registered action LoggerRotate
  == Manager registered action CoreShowChannels
  == Manager registered action CoreShowChannelMap
  == Manager registered action ModuleLoad
  == Manager registered action ModuleCheck
  == Manager registered action AOCMessage
  == Manager registered action Filter
  == Manager registered action BlindTransfer
  == Registered custom function 'AMI_CLIENT'
  == manager => (Asterisk Manager Interface)
 Loading plc.
  == plc => (PLC)
 Loading udptl.
  == udptl => (UDPTL)
 Loading res_pjproject.so.
  == res_pjproject.so => (PJPROJECT Log and Utility Support)
 Loading res_pjsip.so.
    -- Local IPv4 address determined to be: 198.163.74.172
    -- Local IPv6 address determined to be: ::1
  == Manager registered action PJSIPShowEndpoints
  == Manager registered action PJSIPShowEndpoint
  == Manager registered action PJSIPShowAuths
  == Manager registered action PJSIPShowAors
  == 'UDP+IPv4' is an available SIP transport
  == 'TCP+IPv4' is not an available SIP transport, disabling resolver support for it
  == 'TLS+IPv4' is not an available SIP transport, disabling resolver support for it
  == 'UDP+IPv6' is not an available SIP transport, disabling resolver support for it
  == 'TCP+IPv6' is not an available SIP transport, disabling resolver support for it
  == 'TLS+IPv6' is not an available SIP transport, disabling resolver support for it
  == Manager registered action PJSIPQualify
  == Manager registered action PJSIPShowContacts
  == res_pjsip.so => (Basic SIP resource)
 Loading res_pjsip_authenticator_digest.so.
  == res_pjsip_authenticator_digest.so => (PJSIP authentication resource)
 Loading res_pjsip_endpoint_identifier_ip.so.
  == res_pjsip_endpoint_identifier_ip.so => (PJSIP IP endpoint identifier)
 Loading res_pjsip_endpoint_identifier_user.so.
  == res_pjsip_endpoint_identifier_user.so => (PJSIP username endpoint identifier)
 Loading res_pjsip_registrar.so.
  == Manager registered action PJSIPShowRegistrationsInbound
  == Manager registered action PJSIPShowRegistrationInboundContactStatuses
  == res_pjsip_registrar.so => (PJSIP Registrar Support)
 Loading res_http_websocket.so.
  == WebSocket registered sub-protocol 'echo'
  == res_http_websocket.so => (HTTP WebSocket Support)
 Loading res_musiconhold.so.
  == Registered application 'MusicOnHold'
  == Registered application 'StartMusicOnHold'
  == Registered application 'StopMusicOnHold'
  == res_musiconhold.so => (Music On Hold Resource)
 Loading res_rtp_asterisk.so.
  == Registered RTP engine 'asterisk'
  == res_rtp_asterisk.so => (Asterisk RTP Stack)
 Loading res_pjsip_outbound_authenticator_digest.so.
  == res_pjsip_outbound_authenticator_digest.so => (PJSIP authentication resource)
 Loading res_pjsip_outbound_publish.so.
  == res_pjsip_outbound_publish.so => (PJSIP Outbound Publish Support)
 Loading res_pjsip_pubsub.so.
  == Manager registered action PJSIPShowSubscriptionsInbound
  == Manager registered action PJSIPShowSubscriptionsOutbound
  == Manager registered action PJSIPShowResourceLists
  == res_pjsip_pubsub.so => (PJSIP event resource)
 Loading res_pjsip_xpidf_body_generator.so.
  == res_pjsip_xpidf_body_generator.so => (PJSIP Extension State PIDF Provider)
 Loading res_pjsip_dialog_info_body_generator.so.
  == res_pjsip_dialog_info_body_generator.so => (PJSIP Extension State Dialog Info+XML Provider)
 Loading res_pjsip_mwi_body_generator.so.
  == res_pjsip_mwi_body_generator.so => (PJSIP MWI resource)
 Loading res_pjsip_pidf_body_generator.so.
  == res_pjsip_pidf_body_generator.so => (PJSIP Extension State PIDF Provider)
 Loading res_pjsip_pidf_digium_body_supplement.so.
  == res_pjsip_pidf_digium_body_supplement.so => (PJSIP PIDF Sangoma presence supplement)
 Loading res_pjsip_pidf_eyebeam_body_supplement.so.
  == res_pjsip_pidf_eyebeam_body_supplement.so => (PJSIP PIDF Eyebeam supplement)
 Loading res_pjsip_exten_state.so.
  == res_pjsip_exten_state.so => (PJSIP Extension State Notifications)
 Loading res_pjsip_mwi.so.
  == res_pjsip_mwi.so => (PJSIP MWI resource)
 Loading res_pjsip_publish_asterisk.so.
  == res_pjsip_publish_asterisk.so => (PJSIP Asterisk Event PUBLISH Support)
 Loading res_pjsip_session.so.
  == res_pjsip_session.so => (PJSIP Session resource)
 Loading res_pjsip_t38.so.
  == res_pjsip_t38.so => (PJSIP T.38 UDPTL Support)
 Loading chan_pjsip.so.
  == Registered RTP glue 'PJSIP'
  == Registered channel type 'PJSIP' (PJSIP Channel Driver)
  == Registered custom function 'PJSIP_DIAL_CONTACTS'
  == Registered custom function 'PJSIP_PARSE_URI'
  == Registered custom function 'PJSIP_MEDIA_OFFER'
  == Registered custom function 'PJSIP_DTMF_MODE'
  == Registered custom function 'PJSIP_MOH_PASSTHROUGH'
  == Registered custom function 'PJSIP_SEND_SESSION_REFRESH'
  == chan_pjsip.so => (PJSIP Channel Driver)
 Loading res_pjsip_sdp_rtp.so.
  == res_pjsip_sdp_rtp.so => (PJSIP SDP RTP/AVP stream handler)
 Loading app_stack.so.
  == Registered application 'StackPop'
  == Registered application 'Return'
  == Registered application 'GosubIf'
  == Registered application 'Gosub'
  == Registered custom function 'LOCAL'
  == Registered custom function 'LOCAL_PEEK'
  == Registered custom function 'STACK_PEEK'
  == app_stack.so => (Dialplan subroutines (Gosub, Return, etc))
 Loading format_gsm.so.
  == Registered file format gsm, extension(s) gsm
  == format_gsm.so => (Raw GSM data)
 Loading format_pcm.so.
  == Registered file format pcm, extension(s) pcm|ulaw|ul|mu|ulw
  == Registered file format alaw, extension(s) alaw|al|alw
  == Registered file format au, extension(s) au
  == Registered file format g722, extension(s) g722
  == format_pcm.so => (Raw/Sun uLaw/ALaw 8KHz (PCM,PCMA,AU), G.722 16Khz)
 Loading format_wav_gsm.so.
  == Registered file format wav49, extension(s) WAV|wav49
  == format_wav_gsm.so => (Microsoft WAV format (Proprietary GSM))
 Loading format_wav.so.
  == Registered file format wav, extension(s) wav
  == Registered file format wav16, extension(s) wav16
  == format_wav.so => (Microsoft WAV/WAV16 format (8kHz/16kHz Signed Linear))
 Loading res_pjsip_transport_websocket.so.
  == WebSocket registered sub-protocol 'sip'
  == res_pjsip_transport_websocket.so => (PJSIP WebSocket Transport Support)
 Loading res_pjsip_acl.so.
  == res_pjsip_acl.so => (PJSIP ACL Resource)
 Loading res_pjsip_caller_id.so.
  == res_pjsip_caller_id.so => (PJSIP Caller ID Support)
 Loading res_pjsip_diversion.so.
  == res_pjsip_diversion.so => (PJSIP Add Diversion Header Support)
 Loading res_pjsip_dtmf_info.so.
  == res_pjsip_dtmf_info.so => (PJSIP DTMF INFO Support)
 Loading res_pjsip_logger.so.
  == res_pjsip_logger.so => (PJSIP Packet Logger)
 Loading res_pjsip_messaging.so.
    -- Message technology 'pjsip' registered.
  == res_pjsip_messaging.so => (PJSIP Messaging Support)
 Loading res_pjsip_nat.so.
  == res_pjsip_nat.so => (PJSIP NAT Support)
 Loading res_pjsip_notify.so.
  == Manager registered action PJSIPNotify
  == res_pjsip_notify.so => (CLI/AMI PJSIP NOTIFY Support)
 Loading res_pjsip_one_touch_record_info.so.
  == res_pjsip_one_touch_record_info.so => (PJSIP INFO One Touch Recording Support)
 Loading res_pjsip_outbound_registration.so.
  == Manager registered action PJSIPUnregister
  == Manager registered action PJSIPRegister
  == Manager registered action PJSIPShowRegistrationsOutbound
  == res_pjsip_outbound_registration.so => (PJSIP Outbound Registration Support)
 Loading res_pjsip_path.so.
  == res_pjsip_path.so => (PJSIP Path Header Support)
 Loading res_pjsip_rfc3326.so.
  == res_pjsip_rfc3326.so => (PJSIP RFC3326 Support)
 Loading res_pjsip_header_funcs.so.
  == Registered custom function 'PJSIP_HEADER'
  == Registered custom function 'PJSIP_HEADERS'
  == Registered custom function 'PJSIP_RESPONSE_HEADER'
  == Registered custom function 'PJSIP_RESPONSE_HEADERS'
  == Registered custom function 'PJSIP_HEADER_PARAM'
  == res_pjsip_header_funcs.so => (PJSIP Header Functions)
 Loading res_pjsip_refer.so.
  == res_pjsip_refer.so => (PJSIP Blind and Attended Transfer Support)
 Loading res_pjsip_send_to_voicemail.so.
  == res_pjsip_send_to_voicemail.so => (PJSIP REFER Send to Voicemail Support)
 Loading sounds.
  == sounds => (Sounds Index)
 Loading app_confbridge.so.
[Dec  9 21:27:24] NOTICE[217313]: confbridge/conf_config_parser.c:2364 verify_default_profiles: Adding default_bridge profile to app_confbridge
[Dec  9 21:27:24] NOTICE[217313]: confbridge/conf_config_parser.c:2375 verify_default_profiles: Adding default_user profile to app_confbridge
[Dec  9 21:27:24] NOTICE[217313]: confbridge/conf_config_parser.c:2386 verify_default_profiles: Adding default_menu menu to app_confbridge
  == Registered channel type 'CBRec' (Conference Bridge Recording Channel)
  == Registered channel type 'CBAnn' (Conference Bridge Announcing Channel)
  == Registered application 'ConfBridge'
  == Registered application 'ConfKick'
  == Registered custom function 'CONFBRIDGE'
  == Registered custom function 'CONFBRIDGE_INFO'
  == Registered custom function 'CONFBRIDGE_CHANNELS'
  == Manager registered action ConfbridgeList
  == Manager registered action ConfbridgeListRooms
  == Manager registered action ConfbridgeMute
  == Manager registered action ConfbridgeUnmute
  == Manager registered action ConfbridgeKick
  == Manager registered action ConfbridgeUnlock
  == Manager registered action ConfbridgeLock
  == Manager registered action ConfbridgeStartRecord
  == Manager registered action ConfbridgeStopRecord
  == Manager registered action ConfbridgeSetSingleVideoSrc
  == app_confbridge.so => (Conference Bridge Application)
 Loading func_devstate.so.
  == Registered custom function 'DEVICE_STATE'
  == Registered custom function 'HINT'
  == func_devstate.so => (Gets or sets a device state in the dialplan)
 Loading cdr_custom.so.
  == cdr_custom.so => (Customizable Comma Separated Values CDR Backend)
 Loading app_bridgewait.so.
  == Registered application 'BridgeWait'
  == app_bridgewait.so => (Place the channel into a holding bridge application)
 Loading app_dial.so.
  == Registered application 'Dial'
  == Registered application 'RetryDial'
  == app_dial.so => (Dialing Application)
 Loading app_playback.so.
  == Registered application 'Playback'
  == app_playback.so => (Sound File Playback Application)
 Loading app_verbose.so.
  == Registered application 'Log'
  == Registered application 'Verbose'
  == app_verbose.so => (Send verbose output)
 Loading app_voicemail.so.
  == Registered application 'VoiceMail'
  == Registered application 'VoiceMailMain'
  == Registered application 'VMAuthenticate'
  == Registered application 'VoiceMailPlayMsg'
  == Registered application 'VMSayName'
  == Registered custom function 'VM_INFO'
  == Manager registered action VoicemailUsersList
  == Manager registered action VoicemailUserStatus
  == Manager registered action VoicemailRefresh
  == app_voicemail.so => (Comedian Mail (Voicemail System))
 Loading app_directory.so.
  == Registered application 'Directory'
  == app_directory.so => (Extension Directory)
 Loading bridge_builtin_features.so.
  == bridge_builtin_features.so => (Built in bridging features)
 Loading bridge_builtin_interval_features.so.
  == bridge_builtin_interval_features.so => (Built in bridging interval features)
 Loading bridge_holding.so.
  == Registered bridge technology holding_bridge
  == bridge_holding.so => (Holding bridge module)
 Loading bridge_native_rtp.so.
  == Registered bridge technology native_rtp
  == bridge_native_rtp.so => (Native RTP bridging module)
 Loading bridge_simple.so.
  == Registered bridge technology simple_bridge
  == bridge_simple.so => (Simple two channel bridging module)
 Loading bridge_softmix.so.
  == Registered bridge technology softmix
  == bridge_softmix.so => (Multi-party software based channel mixing)
 Loading chan_bridge_media.so.
  == Registered channel type 'Announcer' (Bridge Media Announcing Channel Driver)
  == Registered channel type 'Recorder' (Bridge Media Recording Channel Driver)
  == chan_bridge_media.so => (Bridge Media Channel Driver)
 Loading codec_gsm.so.
  == Registered translator 'gsmtolin' from codec gsm to slin, table cost, 900000, computational cost 1
  == Registered translator 'lintogsm' from codec slin to gsm, table cost, 600000, computational cost 1
  == codec_gsm.so => (GSM Coder/Decoder)
 Loading codec_resample.so.
  == Registered translator 'slin 8000khz -> 12000khz' from codec slin to slin, table cost, 800000, computational cost 999999
  == Registered translator 'slin 8000khz -> 16000khz' from codec slin to slin, table cost, 800000, computational cost 999999
. . .
  == Registered translator 'g722tolin16' from codec g722 to slin, table cost, 900000, computational cost 1
  == Registered translator 'lin16tog722' from codec slin to g722, table cost, 600000, computational cost 1
  == codec_g722.so => (ITU G.722-64kbps G722 Transcoder)
 Loading func_callerid.so.
  == Registered custom function 'CALLERID'
  == Registered custom function 'CONNECTEDLINE'
  == Registered custom function 'REDIRECTING'
  == func_callerid.so => (Party ID related dialplan functions (Caller-ID, Connected-line, Redirecting))
 Loading func_cdr.so.
  == Registered custom function 'CDR'
  == Registered custom function 'CDR_PROP'
  == func_cdr.so => (Call Detail Record (CDR) dialplan functions)
 Loading func_sorcery.so.
  == Registered custom function 'AST_SORCERY'
  == func_sorcery.so => (Get a field from a sorcery object)
 Loading func_strings.so.
  == Registered custom function 'FIELDQTY'
  == Registered custom function 'FIELDNUM'
  == Registered custom function 'FILTER'
  == Registered custom function 'REPLACE'
  == Registered custom function 'STRREPLACE'
  == Registered custom function 'STRBETWEEN'
  == Registered custom function 'LISTFILTER'
  == Registered custom function 'REGEX'
  == Registered custom function 'ARRAY'
  == Registered custom function 'QUOTE'
  == Registered custom function 'CSV_QUOTE'
  == Registered custom function 'LEN'
  == Registered custom function 'STRFTIME'
  == Registered custom function 'STRPTIME'
  == Registered custom function 'EVAL'
  == Registered custom function 'KEYPADHASH'
  == Registered custom function 'HASHKEYS'
  == Registered custom function 'HASH'
  == Registered application 'ClearHash'
  == Registered custom function 'TOUPPER'
  == Registered custom function 'TOLOWER'
  == Registered custom function 'SHIFT'
  == Registered custom function 'POP'
  == Registered custom function 'PUSH'
  == Registered custom function 'UNSHIFT'
  == Registered custom function 'PASSTHRU'
  == Registered custom function 'TRIM'
  == Registered custom function 'LTRIM'
  == Registered custom function 'RTRIM'
  == func_strings.so => (String handling dialplan functions)
 Loading pbx_config.so.
    -- Time to scan old dialplan and merge leftovers back into the new: 0.000003 sec
    -- Time to restore hints and swap in new dialplan: 0.000027 sec
    -- Time to delete the old dialplan: 0.000001 sec
    -- Total time merge_contexts_delete: 0.000031 sec
    -- pbx_config successfully loaded 0 contexts (enable debug for details).
  == Manager registered action DialplanExtensionAdd
  == Manager registered action DialplanExtensionRemove
  == pbx_config.so => (Text Extension Configuration)
 Loading func_pjsip_endpoint.so.
  == Registered custom function 'PJSIP_ENDPOINT'
  == func_pjsip_endpoint.so => (Get information about a PJSIP endpoint)
 Loading res_pjsip_endpoint_identifier_anonymous.so.
  == res_pjsip_endpoint_identifier_anonymous.so => (PJSIP Anonymous endpoint identifier)
 Loading app_queue.so.
  == Registered application 'Queue'
  == Registered application 'AddQueueMember'
  == Registered application 'RemoveQueueMember'
  == Registered application 'PauseQueueMember'
  == Registered application 'UnpauseQueueMember'
  == Registered application 'QueueLog'
  == Registered application 'QueueUpdate'
  == Manager registered action QueueStatus
  == Manager registered action QueueSummary
  == Manager registered action QueueAdd
  == Manager registered action QueueRemove
  == Manager registered action QueuePause
  == Manager registered action QueueLog
  == Manager registered action QueuePenalty
  == Manager registered action QueueMemberRingInUse
  == Manager registered action QueueRule
  == Manager registered action QueueReload
  == Manager registered action QueueReset
  == Manager registered action QueueChangePriorityCaller
  == Manager registered action QueueWithdrawCaller
  == Registered custom function 'QUEUE_VARIABLES'
  == Registered custom function 'QUEUE_EXISTS'
  == Registered custom function 'QUEUE_MEMBER'
  == Registered custom function 'QUEUE_MEMBER_COUNT'
  == Registered custom function 'QUEUE_MEMBER_LIST'
  == Registered custom function 'QUEUE_GET_CHANNEL'
  == Registered custom function 'QUEUE_WAITING_COUNT'
  == Registered custom function 'QUEUE_MEMBER_PENALTY'
  == app_queue.so => (True Call Queueing)
Asterisk Ready.
*CLI> database deltree registrar/contact
Database entries do not exist.
*CLI>     -- Added contact 'sip:202@198.163.74.175:10508;pn-provider=fcm;pn-param=com.mizuvoip.mizudroid.app;pn-prid=dxLGahqQTJmpkBVz-gSdch:APA91bGMdpQ1BtDo3zOZ8-CO2nCtKgj8YIGNEvvkLbiJv2pXNsOKWlrLNDXwWfjd943avrfid2488X1e7jARxrUob9z4I21C_1j8f1luoLBZJR9R1bAvxuRr6Fn5iEIZEg85Yd_yQTx3' to AOR '202' with expiration of 720 seconds
  == Endpoint 202 is now Reachable
    -- Executing [100@from-internal:1] NoOp("PJSIP/202-00000000", "CallerID is ") in new stack
    -- Executing [100@from-internal:2] Wait("PJSIP/202-00000000", "1") in new stack
    -- Executing [100@from-internal:3] Answer("PJSIP/202-00000000", "") in new stack
       > 0xd4dcacf3000 -- Strict RTP learning after remote address set to: 198.163.74.175:10510
    -- Executing [100@from-internal:4] Playback("PJSIP/202-00000000", "hello-world") in new stack
    -- <PJSIP/202-00000000> Playing 'hello-world.gsm' (language 'en')
    -- Executing [100@from-internal:5] Wait("PJSIP/202-00000000", "1") in new stack
    -- Executing [100@from-internal:6] Hangup("PJSIP/202-00000000", "") in new stack
  == Spawn extension (from-internal, 100, 6) exited non-zero on 'PJSIP/202-00000000'
    -- Removed contact 'sip:202@198.163.74.175:10508;pn-provider=fcm;pn-param=com.mizuvoip.mizudroid.app;pn-prid=dxLGahqQTJmpkBVz-gSdch:APA91bGMdpQ1BtDo3zOZ8-CO2nCtKgj8YIGNEvvkLbiJv2pXNsOKWlrLNDXwWfjd943avrfid2488X1e7jARxrUob9z4I21C_1j8f1luoLBZJR9R1bAvxuRr6Fn5iEIZEg85Yd_yQTx3' from AOR '202' due to request
  == Contact 202/sip:202@198.163.74.175:10508;pn-provider=fcm;pn-param=com.mizuvoip.mizudroid.app;pn-prid=dxLGahqQTJmpkBVz-gSdch:APA91bGMdpQ1BtDo3zOZ8-CO2nCtKgj8YIGNEvvkLbiJv2pXNsOKWlrLNDXwWfjd943avrfid2488X1e7jARxrUob9z4I21C_1j8f1luoLBZJR9R1bAvxuRr6Fn5iEIZEg85Yd_yQTx3 has been deleted
  == Endpoint 202 is now Unreachable

*CLI> core stop now
Beginning asterisk shutdown....
Asterisk cleanly ending (0).
Executing last minute cleanups
  == Destroying musiconhold processes
  == Manager unregistered action DBGet
  == Manager unregistered action DBGetTree
  == Manager unregistered action DBPut
  == Manager unregistered action DBDel
  == Manager unregistered action DBDelTree

Does anyone have any clues about how to diagnose or fix this?

Thank you,

Use “pjsip set logger on” to see what the SDP is saying and “rtp set debug on” to see where media is being received from and sent to.

1 Like

Here’s the trace from tcpdump on the Asterisk host:

# tcpdump -l -n host 198.163.74.175
tcpdump: listening on em0, link-type EN10MB
07:16:17.824959 arp who-has 198.163.74.172 tell 198.163.74.175
07:16:17.824977 arp reply 198.163.74.172 is-at 00:0c:29:88:2a:f9
07:16:17.965200 198.163.74.175.16712 > 198.163.74.172.5060: udp 1250 (DF) [tos 0x4]
07:16:17.966171 198.163.74.172.5060 > 198.163.74.175.16712: udp 526
07:16:17.970216 198.163.74.175.16712 > 198.163.74.172.5060: udp 378 (DF) [tos 0x4]
07:16:17.981169 198.163.74.175.16712 > 198.163.74.172.5060:  truncated-udp - 248 bytes missing!udp 1472 (frag 26033:1480@0+) [tos 0x4]
07:16:17.981172 198.163.74.175 > 198.163.74.172: (frag 26033:248@1480) [tos 0x4]
07:16:17.983097 198.163.74.172.5060 > 198.163.74.175.16712: udp 338
07:16:19.001034 198.163.74.172.5060 > 198.163.74.175.16712: udp 832
07:16:19.311826 198.163.74.175.16712 > 198.163.74.172.5060: udp 384 (DF) [tos 0x4]
07:16:19.397899 198.163.74.175.16714 > 198.163.74.172.25050: udp 332 (DF) [tos 0x10]
07:16:19.397948 198.163.74.172 > 198.163.74.175: icmp: 198.163.74.172 udp port 25050 unreachable
07:16:19.435025 198.163.74.175.16714 > 198.163.74.172.25050: udp 332 (DF) [tos 0x10]
07:16:19.435082 198.163.74.172 > 198.163.74.175: icmp: 198.163.74.172 udp port 25050 unreachable
07:16:21.834753 198.163.74.175.16714 > 198.163.74.172.25050: udp 332 (DF) [tos 0x10]
07:16:21.834797 198.163.74.172 > 198.163.74.175: icmp: 198.163.74.172 udp port 25050 unreachable
. . .
07:16:21.874952 198.163.74.175.16714 > 198.163.74.172.25050: udp 332 (DF) [tos 0x10]
07:16:21.874985 198.163.74.172 > 198.163.74.175: icmp: 198.163.74.172 udp port 25050 unreachable
07:16:21.914785 198.163.74.175.16714 > 198.163.74.172.25050: udp 332 (DF) [tos 0x10]
07:16:21.914805 198.163.74.172 > 198.163.74.175: icmp: 198.163.74.172 udp port 25050 unreachable
07:16:21.950977 198.163.74.172.5060 > 198.163.74.175.16712: udp 427
07:16:22.465552 198.163.74.175.16712 > 198.163.74.172.5060: udp 536 (DF) [tos 0x4]

The traces from Asterisk:

<--- Received SIP request (1250 bytes) from UDP:198.163.74.175:16712 --->
INVITE sip:100@198.163.74.172 SIP/2.0
Via: SIP/2.0/UDP 198.163.74.175:16712;rport;branch=z9hG4bK-57p1074430565193690252r
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>
Call-ID: 54e4297103286359903850k18408rmwp
CSeq: 25443 INVITE
Max-Forwards: 70
Contact: <sip:202@198.163.74.175:16712>
User-Agent: MizuDroid/4.0.23038
Supported: replaces
Allow: ACK,PRACK,BYE,CANCEL,INVITE,UPDATE,MESSAGE,INFO,OPTIONS,SUBSCRIBE,NOTIFY,REFER
Allow-Events: presence,refer,telephone-event,keep-alive,dialog
Accept: application/sdp,application/dtmf-relay,text/plain
Content-Type: application/sdp
Content-Length: 597

v=0
o=202 8681 891 IN IP4 198.163.74.175
s=mizudroid
c=IN IP4 198.163.74.175
t=0 0
m=audio 16714 RTP/AVP 111 18 105 97 0 3 101
a=rtpmap:111 opus/48000/2
a=fmtp:111 maxplaybackrate=16000; sprop-maxcapturerate=16000; maxaveragebitrate=20000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=ptime:40
a=rtpmap:110 opus/48000/2
a=fmtp:110 maxplaybackrate=8000; sprop-maxcapturerate=8000; maxaveragebitrate=12000
a=rtpmap:105 speex/16000
a=fmtp:105 mode=8;mode=any
a=rtpmap:0 PCMU/8000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=30
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv

<--- Transmitting SIP response (526 bytes) to UDP:198.163.74.175:16712 --->
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 198.163.74.175:16712;rport=16712;received=198.163.74.175;branch=z9hG4bK-57p1074430565193690252r
Call-ID: 54e4297103286359903850k18408rmwp
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>;tag=z9hG4bK-57p1074430565193690252r
CSeq: 25443 INVITE
WWW-Authenticate: Digest realm="asterisk",nonce="1702221377/3d89a3f557ab92cef8756dbba631c674",opaque="0d0e9ccb512164e3",algorithm=MD5,qop="auth"
Server: Asterisk PBX 20.4.0
Content-Length:  0


<--- Received SIP request (378 bytes) from UDP:198.163.74.175:16712 --->
ACK sip:100@198.163.74.172 SIP/2.0
Via: SIP/2.0/UDP 198.163.74.175:16712;rport;branch=z9hG4bK-57p1074430565193690252r
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>;tag=z9hG4bK-57p1074430565193690252r
Call-ID: 54e4297103286359903850k18408rmwp
CSeq: 25443 ACK
Max-Forwards: 70
User-Agent: MizuDroid/4.0.23038
Content-Length: 0


<--- Received SIP request (1720 bytes) from UDP:198.163.74.175:16712 --->
INVITE sip:100@198.163.74.172 SIP/2.0
Via: SIP/2.0/UDP 198.163.74.175:16712;rport;branch=z9hG4bK-57p1831845704813058011r
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>
Call-ID: 54e4297103286359903850k18408rmwp
CSeq: 25444 INVITE
Max-Forwards: 70
Authorization: Digest username="202",realm="asterisk",nonce="1702221377/3d89a3f557ab92cef8756dbba631c674",uri="sip:100@198.163.74.172",response="9d8ba7768e1e4c4c2f5b8634d68091d6",opaque="0d0e9ccb512164e3",cnonce="4454615352395913943",nc=00000001,qop=auth,algorithm=MD5
Contact: <sip:202@198.163.74.175:16712>
User-Agent: MizuDroid/4.0.23038
X-CDDT: 925581,1560495,16714,198.163.74.175,192.0.0.4,fe80::c05d:931a:ca62:cf9,fe80::2400:deff:fe1c,fe80::788a:daff:fef7:c62,fdcd:85e3:248d:439c:788a:daff:fef7:c62e,fdcd:85e3:248d:439c:3a20:4b41:2343:f09f,fe80::8e61:41c5:a3d6:7d9,fe80::bd76:7c9:c5d8,2607:fb90:ecac:d0f6:bd76:7c9:c5d8:4328,fe80::8ce4:a37e:f8f8,fe80::7939:b27e:dbae,2607:fc20:154f:8377:7939:b27e:dbae:3214
Accept: application/sdp,application/dtmf-relay,text/plain
Content-Type: application/sdp
Content-Length: 597

v=0
o=202 8681 892 IN IP4 198.163.74.175
s=mizudroid
c=IN IP4 198.163.74.175
t=0 0
m=audio 16714 RTP/AVP 111 18 105 97 0 3 101
a=rtpmap:111 opus/48000/2
a=fmtp:111 maxplaybackrate=16000; sprop-maxcapturerate=16000; maxaveragebitrate=20000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=ptime:40
a=rtpmap:110 opus/48000/2
a=fmtp:110 maxplaybackrate=8000; sprop-maxcapturerate=8000; maxaveragebitrate=12000
a=rtpmap:105 speex/16000
a=fmtp:105 mode=8;mode=any
a=rtpmap:0 PCMU/8000
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=30
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv

<--- Transmitting SIP response (338 bytes) to UDP:198.163.74.175:16712 --->
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 198.163.74.175:16712;rport=16712;received=198.163.74.175;branch=z9hG4bK-57p1831845704813058011r
Call-ID: 54e4297103286359903850k18408rmwp
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>
CSeq: 25444 INVITE
Server: Asterisk PBX 20.4.0
Content-Length:  0


    -- Executing [100@from-internal:1] NoOp("PJSIP/202-00000004", "CallerID is ") in new stack
    -- Executing [100@from-internal:2] Wait("PJSIP/202-00000004", "1") in new stack
    -- Executing [100@from-internal:3] Answer("PJSIP/202-00000004", "") in new stack
       > 0x73bc328a000 -- Strict RTP learning after remote address set to: 198.163.74.175:16714
<--- Transmitting SIP response (832 bytes) to UDP:198.163.74.175:16712 --->
SIP/2.0 200 OK
Via: SIP/2.0/UDP 198.163.74.175:16712;rport=16712;received=198.163.74.175;branch=z9hG4bK-57p1831845704813058011r
Call-ID: 54e4297103286359903850k18408rmwp
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>;tag=b9c9a62a-6c9a-4f60-85d6-0fc9c7037d2d
CSeq: 25444 INVITE
Server: Asterisk PBX 20.4.0
Contact: <sip:198.163.74.172:5060>
Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, MESSAGE, REFER
Supported: 100rel, timer, replaces, norefersub
Content-Type: application/sdp
Content-Length:   228

v=0
o=- 8681 894 IN IP4 198.163.74.172
s=Asterisk
c=IN IP4 198.163.74.172
t=0 0
m=audio 25050 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:150
a=sendrecv

<--- Received SIP request (384 bytes) from UDP:198.163.74.175:16712 --->
ACK sip:198.163.74.172:5060 SIP/2.0
Via: SIP/2.0/UDP 198.163.74.175:16712;rport;branch=z9hG4bK-57p1398122132860425484r
From: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
To: <sip:100@198.163.74.172>;tag=b9c9a62a-6c9a-4f60-85d6-0fc9c7037d2d
Call-ID: 54e4297103286359903850k18408rmwp
CSeq: 25444 ACK
Max-Forwards: 70
User-Agent: MizuDroid/4.0.23038
Content-Length: 0


    -- Executing [100@from-internal:4] Playback("PJSIP/202-00000004", "hello-world") in new stack
Sent RTP packet to      198.163.74.175:16714 (type 00, seq 024759, ts 000160, len -000013)
    -- <PJSIP/202-00000004> Playing 'hello-world.gsm' (language 'en')
Sent RTP packet to      198.163.74.175:16714 (type 00, seq 024760, ts 000320, len -000013)
Sent RTP packet to      198.163.74.175:16714 (type 00, seq 024761, ts 000480, len -000013)
. . .
Sent RTP packet to      198.163.74.175:16714 (type 00, seq 024828, ts 011200, len -000013)
Sent RTP packet to      198.163.74.175:16714 (type 00, seq 024829, ts 011360, len -000013)
    -- Executing [100@from-internal:5] Wait("PJSIP/202-00000004", "1") in new stack
    -- Executing [100@from-internal:6] Hangup("PJSIP/202-00000004", "") in new stack
  == Spawn extension (from-internal, 100, 6) exited non-zero on 'PJSIP/202-00000004'
<--- Transmitting SIP request (427 bytes) to UDP:198.163.74.175:16712 --->
BYE sip:202@198.163.74.175:16712 SIP/2.0
Via: SIP/2.0/UDP 198.163.74.172:5060;rport;branch=z9hG4bKPj01a029d8-ca2e-4d18-8e44-7feba1027455
From: <sip:100@198.163.74.172>;tag=b9c9a62a-6c9a-4f60-85d6-0fc9c7037d2d
To: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
Call-ID: 54e4297103286359903850k18408rmwp
CSeq: 24154 BYE
Reason: Q.850;cause=16
Max-Forwards: 70
User-Agent: Asterisk PBX 20.4.0
Content-Length:  0


<--- Received SIP response (536 bytes) from UDP:198.163.74.175:16712 --->
SIP/2.0 200 OK
Via: SIP/2.0/UDP 198.163.74.172:5060;received=198.163.74.172;rport=5060;branch=z9hG4bKPj01a029d8-ca2e-4d18-8e44-7feba1027455
From: <sip:100@198.163.74.172>;tag=b9c9a62a-6c9a-4f60-85d6-0fc9c7037d2d
To: <sip:202@198.163.74.172>;tag=56g8848360899916749052m
Call-ID: 54e4297103286359903850k18408rmwp
CSeq: 24154 BYE
Contact: <sip:202@198.163.74.175:16712>
User-Agent: MizuDroid/4.0.23038
Supported: replaces
Allow: ACK,PRACK,BYE,CANCEL,INVITE,UPDATE,MESSAGE,INFO,OPTIONS,SUBSCRIBE,NOTIFY,REFER
Content-Length: 0

This did not shed a lot of light on the problem, but I was very concerned that there was some invisible firewall on my network somewhere. I have an old Asterisk instance that I was running on an RPi, so I registered the same MizuDroid softphone on the same Android phone on my WiFi network, and it worked fine. I was relieved to eliminate the mysterious and unseen, but now the difference is between an RPi plugged into my switch, and the subject here, a VM running on ESXI, with ESXI plugged into the same switch. There’s a lot of information about modifying transport to suit NAT, but that’s not involved here. Are there network issues with running Asterisk on ESXI/VMware?

Thanks,

the SIP dialog look fine
next is to try look at RTP

198.163.74.172 > 198.163.74.175: icmp: 198.163.74.172 udp port 25050 unreachable

this is not good

172 is saying send media to port 25050, but when Asterisk actually does that, 172 says:

You need to fix 172.

172 hasn’t sent any media to Asterisk, so Asterisk can’t use symmetric RTP to work out the actual port number.

Asterisk (175) is expecting to receive media on port 16714.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.