We are trying to use SER as a NAT traversal solution in front of our
Asterisk PSTN gateways and our Asterisk Feature Server. Currently,
the feature server is doing all of the dialplan processing. Because
of this we can have user configurable dial times, unavailability
numbers, forward on busy/unavailable numbers, auto-attendants, 7-digit
dialing, etc.
Of course, my life would be simple if Asterisk acted more like a SIP
proxy server and the dialplan could be executed somewhat like an SER
routing script. Unfortunately, any call that comes from a UA to
asterisk creates one call, then asterisk creates another call to the
other end of the conversation (other SIP device, PSTN number,
whatever), then issues reinvites to the two ends of the conversation
to tell them to send RTP to each other.
So what I need, is an SER script that will intelligently handle NAT
traversal for UA to UA calls, UA to PSTN calls, and PSTN to UA calls
(all going through the Asterisk Dialplan so we can keep all of the end
user features) including the damn re-invites. Anybody had to do this
before? We are quite willing to pay you for your knowledge if you
want to do some design/consulting/coding work for a solution to our
problem.
Thanks.
All,
just started using SER (great experience so far!). I'm trying to us it for a
contact centre application where I have a specific requirement that calls
can only be terminated in one direction, from a Cisco AS53xx gateway, not a
Cisco phone.
Here's the set-up and desired result:
User logs into the contact centre systems which initiates a call on the PSTN
side of the AS53xx. This then creates a VOIP (SIP) call leg from a dial-peer
on the gateway, via the SER proxy.
The agents all have Cisco 7960 IP phones which register with the SER
registrar. The INVITE is proxied via a simple location lookup in the SER
route[0] config file to the appropriate handset. The agent answers the call
and is "logged" in to the system.
Now's the fun part. I want to prevent the SIP leg being torn-down by the
agent either accidentally or on purpose hanging up the call from the
handset.
Here's the logic (pseudo code) I have though out: Trap the BYE from the
handset using a statement something like:
if (method=="BYE" and uri=~"sip:[0-9]+@*") {
# Agent phone initiated the BYE so do something
route(1);
} else {
#do something else - pass on the message I guess
};
route[1] {
# use exec to call an external function
exec_msg ('script.file');
}
The external script needs to OK the BYE message - I assume use the FIFO
function to construct the OK message.
Now the tricky part: how do I stop the called phone from hanging up, (I
tried a simple 403 Forbidden response) but that didn't work. So I thought
about the REFER method with the URL of the phone sending the BYE message-
can I send a refer to the Gateway (AS5300) that still thinks the dialogue is
open to the phone and "hopefully" get it to send a new INVITE dialogue to
the phone? Or would I have to generate a new INVITE sequence from the SER
proxy exec code?
If its the latter, then I need access to the RTP port number on the AS53xx
from the original INVITE message - and this implies access to the SDP
payload - which I can't see from the SER script (unless anyone can tell me
how?)
Here's a picture of what I hope to achieve!
[AS5300} [SER Proxy}
[Cisco 7960]
----------------------------------------------->INVITE
<----------------------------------------------TRYING
INVITE
------------------------------->
<---------------------------------TRYING
<---------------------------------RINGING
<----------------------------------------------RINGING
<-----------------------------------OK
<------------------------------------------------OK
<==================RTP exchange =================>
<-------------------------------- BYE
OK
---------------------------------->
<----------------------------------------------REFER (with URI of Cisco
7960)
-------------------------------------------------->INVITE
<-------------------------------------------------TRYING
INVITE
----------------------------->
<-------------------------------TRYING
<-------------------------------RINGING
<--------------------------------------------------RINGING
<-------------------------------OK
<-------------------------------------------------- OK
<=================RTP Exchange ===================>
Thanks in advance!!! All ideas Gratefully received!
Neill....:o)
Neill Wilkinson
Senior Consultant
Quortex Consultants Ltd.
e: neill.wilkinson(a)quortex.com
Hi,
I'd like to extract the From URI from a request and use it to add a Call-Info header:
From: <sip:test@test.com>;tag=fd29df3df47
->
Call-Info: <;purpose=icon">http://myserver.com/get.php?id=sip:test@test.com>;purpose=icon
Can it be done with ser? There are a lot of functions but none of them seem to be able to extract headers and use the information in another header.
Best regards,
Chris
---------------------------------
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!
I found some example configuration someware here i the mailing lisy but throw some strange error ..
here is the configuration files
1. Conf file for the main ser server
#
# $Id: ser.cfg,v 1.21 2003/06/04 13:47:36 jiri Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=3 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
# Uncomment these lines to enter debugging mode
/*
debug=7
fork=no
log_stderror=yes
*/
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
listen=80.72.85.178
port=5060
children=4
fifo="/tmp/ser_fifo"
alias=testinfo.intersoftpro.com 127.0.0.1 80.72.85.178
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
# load the voicemail module
#loadmodule "/usr/local/lib/ser/modules/vm.so"
# load the enum module
loadmodule "/usr/local/lib/ser/modules/enum.so"
# load the group module, to verify if a user forwards to voicemail
loadmodule "/usr/local/lib/ser/modules/group.so"
# load the nathelper module
loadmodule "/usr/local/lib/ser/modules/nathelper.so"
# ----------------- setting module-specific parameters ---------------
# -- registrar parameter
# special NAT flag indicates that a registered client is behind NAT
modparam("registrar", "nat_flag", 6)
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "db_url", "mysql://ser:heslo@localhost/ser")
# -- auth params --
# Uncomment if you are using auth module
#
modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url", "mysql://ser:heslo@localhost/ser")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
# -- voicemail params --
#modparam("voicemail", "db_url","mysql://ser:heslo@localhost/ser")
# -- voicemail params --
modparam("group", "db_url","mysql://serro:heslo@localhost/ser")
# -- nathelper params --
modparam("nathelper", "natping_interval", 60)
modparam("nathelper", "ping_nated_only", 1)
modparam("tm", "fr_inv_timer", 30 )
#modparam("tm", "fr_inv_timer", 8 )
# ------------------------- request routing logic -------------------
# main routing logic
route{
log(1, "-------------------------------------------\n");
log(1, "entering main loop\n");
if (nat_uac_test("2")) {
log(1, "src address different than via header->NAT detected\n");
log(1, "force_rport and fix_nated_contact and setflag(5)\n");
#try NAT traversal, works only if the client is symmetrical
force_rport();
fix_nated_contact();
append_hf("P-hint: fixed NAT contact for request\r\n");
# flag 5 indicates that incoming request is from NATed client
setflag(5);
};
if (method=="REGISTER")
log(1, "REGISTER message received\n");
if (method=="INVITE")
log(1, "INVITE message received\n");
if (method=="ACK")
log(1, "ACK message received\n");
if (method=="BYE")
log(1, "BYE message received\n");
if (method=="CANCEL")
log(1, "CANCEL message received\n");
if (method=="SUBSCRIBE")
log(1, "SUBSCRIBE message received\n");
if (method=="NOTIFY")
log(1, "NOTIFY message received\n");
if (method=="OPTIONS")
log(1, "OPTIONS message received\n");
if (method=="INFO")
log(1, "INFO message received\n");
if (method=="MESSAGE")
log(1, "MESSAGE message received\n");
if (method=="REFER")
log(1, "REFER message received\n");
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
break;
};
if (msg:len > max_len) {
#if (len_gt( max_len )) {
sl_send_reply("513", "Message too big");
break;
};
# loose-route processing
if (loose_route()) {
log(1, "loose_route processing\n");
t_relay();
break;
};
# create transaction state; abort if error occured
# if ( !t_newtran()) {
# sl_reply_error();
# break;
# };
# if the request is for other domain use UsrLoc
# (in case, it does not work, use the following command
# with proper names and addresses in it)
if (uri==myself) {
if (method=="REGISTER") {
log(1, "analyzing REGISTER request\n");
# Uncomment this if you want to use digest authentication
if (!www_authorize("80.72.85.178", "subscriber")) {
www_challenge("80.72.85.178", "0");
break;
};
if (isflagset(5)) {
#register from nated client, save nat_flag=6
#in location table
setflag(6);
};
if (!save("location")) {
log(1, "save location error\n");
sl_reply_error();
};
break;
};
lookup("aliases");
# check if number beginns with 00, then convert it into a +
if (uri=~"^sip:359[0-9]*@") {
log(1, "00 International number detected\n");
# strip booth leading "0"
strip(2);
prefix("+");
};
# check if request uri begins with an internation phone number, if yes, try enum to resolve
if (uri=~"^sip:\+[0-9]*@") {
log(1, "+ International number detected\n");
if (!enum_query("voice")) {
log(1, "ENUM query failed, try enum without voice prefix\n");
if (enum_query("")) {
log(1, "ENUM without voice prefix also failed\n");
};
};
if (uri != myself) {
log(1, "ENUM lookup revealed an external address, relaying...");
route(1);
break;
};
};
#mark transaction for voicemail
if (is_user_in("Request-URI", "voicemail\n")) {
log(1, "requested user is in voicemail group");
setflag(4);
};
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location")) {
# handle user which was not found
log(1, "requested user not found\n");
route(4);
break;
};
};
#add failure route which should be performed if response code >=300
if (method=="INVITE" && isflagset(4)) {
log(1, "invite for voicemail user->initiate failureroute[1]\n");
t_on_failure("1");
};
# forward to current uri now; use stateful forwarding; that
# works reliably even if we forward from TCP to UDP
route(1);
}
route[1]{
log(1, "-------------------------------------------\n");
log(1, "entering route[1] - relaying SIP message\n");
if ((isflagset(5)) || (isflagset(6))) {
log(1, "at least one of the participants is NATed->record_route\n");
record_route();
log(1, " -->setting up reply processing ->onreply_route[1]");
t_on_reply("1");
if (method=="INVITE") {
log(1, " INVITE request-->force_rtp_proxy, set NATED-INVITE flag(7)");
force_rtp_proxy();
append_hf("P-hint: request forced to rtp proxy\r\n");
setflag(7);
};
};
log(1, "relaying message ...\n");
if (!t_relay()) {
log(1, "t_relay error occured\n");
sl_reply_error();
};
}
# all incoming replies for t_onrepli-ed transactions enter here
onreply_route[1] {
log(1, "-------------------------------------------\n");
log(1, "onreply_route[1] entered\n");
if (isflagset(6)) {
log(1, "transaction was sent to a NATED client -> fix nated contact\n");
fix_nated_contact();
append_hf("P-hint: fixed NAT contact for response\r\n");
}
if ( (status=~"100") ) {
log(1, "status 100 received\n");
};
if ( (status=~"180") ) {
log(1, "status 180 received\n");
};
if ( (status=~"202") ) {
log(1, "status 202 received\n");
};
if ( (status=~"200" || status=~"183") ) {
log(1, "status 2xx or 183");
if ( isflagset(7) ) {
log(1, "marked(7) as NATED-INVITE -> force_rtp_proxy \n");
force_rtp_proxy();
append_hf("P-hint: response forced to rtp proxy\r\n");
};
};
}
route[4]{
log(1, "-------------------------------------------\n");
log(1, "entering route[4] = requested user not online\n");
# non-Voip -- just send "off-line"
if (!(method == "INVITE" || method == "ACK" || method == "CANCEL" || method == "REFER" || method == "BYE")) {
log(1, "no invite,ack,cancel,refer->return 404\n");
sl_send_reply("404", "Not Found");
break;
};
# not voicemail subscriber and no echo/conference call
if ( isflagset(4)) {
log(1, "flag(4) active\n");
};
if (uri =~ "conference") {
log(1, "conference call\n");
};
if (uri =~ "echo") {
log(1, "echo call\n");
};
if ( !( isflagset(4) || (uri =~ "conference") || (uri =~ "echo") ) ) {
log(1, "no voicemail subscriber->return 404");
sl_send_reply("404", "Not Found and no voicemail turned on");
break;
};
if ( isflagset(5) ) {
log(1, "caller is NATed->record_route\n");
record_route();
log(1, " -->setting up reply processing ->onreply_route[1]");
t_on_reply("1");
if (method=="INVITE") {
log(1, " INVITE request-->force_rtp_proxy");
force_rtp_proxy();
};
};
# forward to voicemail now
#rewritehostport("machtnix.ict.tuwien.ac.at:5060");
log(1, "forward to voicemail\n");
t_relay_to_udp("80.72.85.178", "5090");
#klaus
#forward(machtnix.ict.tuwien.ac.at, 5060)
}
failure_route[1] {
/* XX: note: unsafe if preloaded routes without username used */
log(1, "-------------------------------------------\n");
log(1, "failureroute[1] entered\");
revert_uri();
#rewritehostport("machtnix.ict.tuwien.ac.at:5060");
# append_branch();
t_relay_to_udp("machtnix.ict.tuwien.ac.at", "5060");
}
2. Configuration for the second instance of the ser server (for voice mail (
#
# $Id: ser.cfg,v 1.21 2003/06/04 13:47:36 jiri Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=3 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
#Uncomment these lines to enter debugging mode
/*
debug=7
fork=no
log_stderror=yes
*/
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
listen=80.72.85.178
port=5090
children=4
fifo="/tmp/ser_fifo"
alias=testinfo.intersoftpro.com 127.0.0.1 80.72.85.178
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
# load the voicemail module
loadmodule "/usr/local/lib/ser/modules/vm.so"
# ----------------- setting module-specific parameters ---------------
modparam("voicemail", "db_url","mysql://ser:heslo@localhost/ser")
# ------------------------- request routing logic -------------------
# main routing logic
route{
log(1, "entering main loop\n");
if (method=="REGISTER")
log(1, "REGISTER message received\n");
if (method=="INVITE")
log(1, "INVITE message received\n");
if (method=="ACK")
log(1, "ACK message received\n");
if (method=="BYE")
log(1, "BYE message received\n");
if (method=="CANCEL")
log(1, "CANCEL message received\n");
if (method=="SUBSCRIBE")
log(1, "SUBSCRIBE message received\n");
if (method=="NOTIFY")
log(1, "NOTIFY message received\n");
if (method=="OPTIONS")
log(1, "OPTIONS message received\n");
if (method=="INFO")
log(1, "INFO message received\n");
if (method=="MESSAGE")
log(1, "MESSAGE message received\n");
if (method=="REFER")
log(1, "REFER message received\n");
# lookup("aliases");
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
break;
};
# check changed from 0.8.11 to 0.8.12
# if (len_gt( max_len )) {
if (msg:len > max_len) {
sl_send_reply("513", "Message too big");
break;
};
# if (!uri==myself) {
# sl_send_reply("404", "not reponsible for host in request-uri");
# break;
# };
# Voicemail specific configuration - begin
if(method=="ACK" || method=="INVITE" || method=="BYE" || method=="REFER" || method=="CANCEL"){
log(1, "Entering voicemail processing\n");
log(1, "check if new transaction ... \n");
if(t_newtran()){
log(1, "... yes, new transaction\n");
t_reply("100","voicemail ser - Trying -- just wait a minute !");
t_reply("100","voicemail ser - Trying 2 -- just wait a minute !");
if(method=="INVITE" || method=="REFER"){
log("**************** vm start - begin ******************\n");
if( uri =~ "conference" ){
log(1, "incoming conference call\n");
if(!vm("/tmp/am_fifo","conference")){
log("could not contact conference server\n");
t_reply("500","could not contact conference server");
};
}
else if( uri =~ "echo" ){
log(1, "incoming echo call\n");
if(!vm("/tmp/am_fifo","echo")){
log("could not contact echo\n");
t_reply("500","could not contact echo");
};
}
else {
log(1, "incoming voicemail call\n");
if(!vm("/tmp/am_fifo","voicemail")){
log("could not contact voicemail\n");
t_reply("500","could not contact voicemail");
};
};
log("**************** vm start - end ******************\n");
break;
};
if(method=="BYE" || method=="CANCEL"){
log("**************** vm end/refer - begin ******************\n");
if(!vm("/tmp/am_fifo","bye")){
log("could not contact the media server\n");
t_reply("500","could not contact the media server");
};
log("**************** vm end/refer - end ********************\n");
break;
};
}
else {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
};
};
# Voicemail specific configuration - end
sl_send_reply("501", "method not understood here");
log(1, "method not understood here\n");
}
3. Configuration for sems server
# $Id: sems.conf.sample,v 1.11.2.1 2004/01/27 15:08:28 rco Exp $
#
# sems.conf.sample
#
# Sip Express Media Server (sems)
#
# sample configuration file
#
#
# whitespaces (spaces and tabs) are ignored
# comments start with a "#" and may be used inline
#
# example: option=value1, value2 # i like this option
#
##################################
# global parameters #
##################################
# optional parameter: fork={yes|no}
#
# - specifies if sems should run in daemon mode (background)
# (fork=no is the same as -E)
fork=yes
# optional parameter: stderr={yes|no}
#
# - debug mode: do not fork and log to stderr
# (stderr=yes is the same as -E)
stderr=no
# optional parameter: loglevel={0|1|2|3}
#
# - sets log level (error=0, warning=1, info=2, debug=3)
# (same as -D)
loglevel=1
# optional parameter: fifo_name=<filename>
#
# - path and file name of our fifo file (same as -i)
fifo_name=/tmp/am_fifo
# optional parameter: ser_fifo_name=<filename>
#
# - path and file name of Ser's fifo file (same as -o)
ser_fifo_name=/tmp/ser_fifo
# optional parameter: plugin_path=<path>
#
# - sets the path to the plug-ins
# - may be absolute or relative to CWD
plugin_path=/usr/local/lib/sems/plug-in/
# optional parameter: smtp_server=<hostname>
#
# - sets address of smtp server
smtp_server=localhost
# optional parameter: smtp_port=<port>
#
# - sets port of smtp server
smtp_port=25
##################################
# module specific parameters #
##################################
# sample voicemail configuration (inline)
config.voicemail=inline
# optional parameter: announce_path=<path>
#
# - sets the path where announce files are searched for
# - the file to be played is determined the following way:
# <announce_path>/<domainname>/<username>.wav
# if this file is not available <announce_path>/<default_anounce> is used
announce_path=/usr/local/lib/sems/audio/
# parameter: default_announce=<filename>
#
# - sets the name of the default announce WAV file
default_announce=default_en.wav
# parameter: max_record_time=<seconds>
#
# - maximum record time
max_record_time=30
# parameter: accept_delay=<x>
#
# - delays accepting of the call for x seconds
# - default value is 0
accept_delay=20
# end of configuration section
# for voicemail module
config.voicemail=end
# sample announcement configuration (inline)
config.announcement=inline
# optional parameter: announce_path=<path>
#
# - sets the path where announce files are searched for
announce_path=/usr/local/lib/sems/audio/
# parameter: default_announce=<filename>
#
# - sets the name of the default announce WAV file
default_announce=default_en.wav
# end of configuration section for announcement module
config.announcement=end
# sample isdngw module configuration (external file)
# config.isdngw=/etc/isdngw.conf
# sample ivr module configuration (inline)
config.ivr=inline
#parameter: python_script_path=<full path>
python_script_path=/etc/ivr
#parameter: python_script_file=<filename>
python_script_file=example.py
# end of configuration section for ivr module
config.ivr=end
# sample conference configuration (inline)
config.conference=inline
# parameter: default_announce=<filename>
#
# - sets the full pathed name of the default announce WAV file.
# Will be played to lonely users.
default_announce=/usr/local/lib/sems/audio/first_participant.wav
# end of configuration section for conference module
config.conference=end
# example configuration for number reader
config.number_reader=inline
number_path=/usr/local/lib/sems/audio/
prolog_file=welcome_to_number_reader.wav
epilog_file=thanks_calling_number_reader.wav
# end of number_reader configuration
config.number_reader=end
# add more module configurations here (inline or external):
#
# config.mymodule=<filename>
# or
# config.mymodule=inline
# ...
# config.mymodule=end
Error is in second instance of the ser server
0(19586) **************** vm start - end ******************
0(19586) DEBUG:destroy_avp_list: destroing list (nil)
0(19586) receive_msg: cleaning up
2(19588) ERROR: fifo_server: command t_reply is not available
2(19588) ERROR: fifo_server: command must begin with :: ringing
2(19588) ERROR: fifo_server: command must begin with :: 00004C89728793F0
2(19588) ERROR: fifo_server: command must have at least 3 chars
2(19588) INFO: fifo_server: command empty
2(19588) ERROR: fifo_server: command t_reply is not available
2(19588) ERROR: fifo_server: command must have at least 3 chars
2(19588) ERROR: fifo_server: command must begin with :: 00004C89728793F0
2(19588) ERROR: fifo_server: command must begin with :: Content-Type: application/sdp
2(19588) ERROR: fifo_server: command must begin with :: v=0
2(19588) ERROR: fifo_server: command must begin with :: s=session
2(19588) ERROR: fifo_server: command must begin with :: t=0 0
2(19588) ERROR: fifo_server: command must begin with :: a=rtpmap:0 /
2(19588) INFO: fifo_server: command empty
2(19588) ERROR: fifo_server: command t_reply is not available
2(19588) ERROR: fifo_server: command must begin with :: could not send response.
2(19588) ERROR: fifo_server: command must begin with :: 00004C89728793F0
2(19588) ERROR: fifo_server: command must have at least 3 chars
2(19588) INFO: fifo_server: command empty
1(19587) DEBUG: timer routine:0,tl=0x402ecf9c next=(nil)
1(19587) DEBUG: FR_handler:stop retr. and send CANCEL (0x402ece60)
1(19587) ->>>>>>>>> T_code=100, new_code=408
actualy i think that i miss some modiule to load but i am not sure and dont have any fogest idea what to do ..
10x in advance
Ps:
sry about my bad english
Hey all,
Another wierdness for a sunny tuesday afternoon.... Have been using ser and * quite successfully so far, and am not into the stage of testing voicemail. Currently I am using * with mysql vm storage. I have a failure route which affter the fr_timer expires, does:
failure_route[4] {
# If we've got here, it means that a call timer has expired, and the user is in the
# voicemail group. Therefore we're going to try and hand off the call to the Asterisk
# voicemail system.
revert_uri();
rewritehostport("asterisk.dev.inmarsat.com:5060");
log (1, "VOICEMAIL: VM-Divert --> Handing off to Asterisk\n");
append_branch();
append_urihf("CC-Diversion: ", "\r\n");
t_relay();
break;
}
This works great for normal users who are registered but not answering their phone (or indeed are busy it seems - i havent' worked out how to configure this behaviour -- any suggestions?).
However, i have two problems:
(1) If the call is from Nonnat UA --> SER --> Mediaproxy --> Nat UA
|
\/
Asterisk VM
then the Nonnat UA doesn't get audio from asterisk vm. I think this has somethign to do with mediaproxy trying to proxy the vm request when it shouldnt and not knwoing where to send it - again, any suggestions?
(2) The most annoying issue at the moment is for offline users. It seems logical that if you have an offline user (one that has been found in the subscriber db but just isnt' registered at the moment) you might want their address to divert to vm. However, no amount of fiddling has enabled be to use a failure route for this, and i'm not sure why. In desperation i just created a new route block to handle it - the same as above, but called route[4] instead of failure_route. This at least forwards the request correctly. However, all i get is "The p...." and then the media stream cuts out, and * console shows the channel has been hung up. Below is the ngrep. For some reason two INVITE reuqests are sent from ser(.136) to *(.137) and i'm not sure why. Notice also that a CANCEL is generated, which corresponds to the media stream dying almost as soon as it starts, but again i'm not sure why....
If anyone has anyideas... if you need to look at the ser.cfg then let me know. I'm sure there must be a mor elegant way of handling vm but im not sure what it is at the moment!
Dave
U 161.30.94.151:2378 -> 161.30.94.136:5060
INVITE sip:1000@sip.dev.inmarsat.com SIP/2.0..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..T
o: sip:1000@sip.dev.inmarsat.com..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 1 INVITE..Cont
act: <sip:test3@161.30.94.151>..Content-Type: application/sdp..Content-Length: 308..Accept-Langua
ge: en..Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, REGISTER, SUBSCRIBE..Supported:
sip-cc, sip-cc-01, timer, replaces..User-Agent: Pingtel/2.1.11 (VxWorks)..Date: Tue, 24 Aug 2004
14:52:19 GMT..Via: SIP/2.0/UDP 161.30.94.151....v=0..o=Pingtel 5 5 IN IP4 161.30.94.151..s=phone-
call..c=IN IP4 161.30.94.151..t=0 0..m=audio 8766 RTP/AVP 96 97 0 8 18 98..a=rtpmap:96 eg711u/800
0/1..a=rtpmap:97 eg711a/8000/1..a=rtpmap:0 pcmu/8000/1..a=rtpmap:8 pcma/8000/1..a=rtpmap:18 g729/
8000/1..a=fmtp:18 annexb=no..a=rtpmap:98 telephone-event/8000/1..
#
U 161.30.94.136:5060 -> 161.30.94.151:5060
SIP/2.0 407 Proxy Authentication Required..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To:
sip:1000@sip.dev.inmarsat.com;tag=9d060f1cca80def62c99c3e616c718b0.21f2..Call-Id: call-1093359137
-28@161.30.94.151..Cseq: 1 INVITE..Via: SIP/2.0/UDP 161.30.94.151..Proxy-Authenticate: Digest rea
lm="sip.dev.inmarsat.com", nonce="412b574f5e5a864751e3e96fb32f3f7a4929a17a"..Server: Sip EXpress
router (0.8.14 (i386/linux))..Content-Length: 0..Warning: 392 161.30.94.136:5060 "Noisy feedback
tells: pid=25819 req_src_ip=161.30.94.151 req_src_port=2378 in_uri=sip:1000@sip.dev.inmarsat.com
out_uri=sip:admin@sip.dev.inmarsat.com via_cnt==1"....
#
U 161.30.94.151:2378 -> 161.30.94.136:5060
ACK sip:1000@sip.dev.inmarsat.com SIP/2.0..Contact: sip:test3@161.30.94.151..From: sip:test3@sip.
dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.com;tag=9d060f1cca80def62c99c3e616c71
8b0.21f2..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 1 ACK..Accept-Language: en..User-Agent
: Pingtel/2.1.11 (VxWorks)..Date: Tue, 24 Aug 2004 14:52:19 GMT..Via: SIP/2.0/UDP 161.30.94.151..
Content-Length: 0....
#
U 161.30.94.151:2378 -> 161.30.94.136:5060
INVITE sip:1000@sip.dev.inmarsat.com SIP/2.0..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..T
o: sip:1000@sip.dev.inmarsat.com..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 2 INVITE..Cont
act: <sip:test3@161.30.94.151>..Content-Type: application/sdp..Content-Length: 308..Accept-Langua
ge: en..Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, REGISTER, SUBSCRIBE..Supported:
sip-cc, sip-cc-01, timer, replaces..User-Agent: Pingtel/2.1.11 (VxWorks)..Date: Tue, 24 Aug 2004
14:52:19 GMT..Proxy-Authorization: DIGEST USERNAME="test3", REALM="sip.dev.inmarsat.com", NONCE="
412b574f5e5a864751e3e96fb32f3f7a4929a17a", URI="sip:1000@sip.dev.inmarsat.com", RESPONSE="520ee04
3cedf1c3d2ccbc0fa05101d2c"..Via: SIP/2.0/UDP 161.30.94.151....v=0..o=Pingtel 5 5 IN IP4 161.30.94
.151..s=phone-call..c=IN IP4 161.30.94.151..t=0 0..m=audio 8766 RTP/AVP 96 97 0 8 18 98..a=rtpmap
:96 eg711u/8000/1..a=rtpmap:97 eg711a/8000/1..a=rtpmap:0 pcmu/8000/1..a=rtpmap:8 pcma/8000/1..a=r
tpmap:18 g729/8000/1..a=fmtp:18 annexb=no..a=rtpmap:98 telephone-event/8000/1..
#
U 161.30.94.136:5060 -> 161.30.94.151:5060
SIP/2.0 100 trying -- your call is important to us..From: sip:test3@sip.dev.inmarsat.com;tag=2c24
948..To: sip:1000@sip.dev.inmarsat.com..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 2 INVITE
..Via: SIP/2.0/UDP 161.30.94.151..Server: Sip EXpress router (0.8.14 (i386/linux))..Content-Lengt
h: 0..Warning: 392 161.30.94.136:5060 "Noisy feedback tells: pid=25827 req_src_ip=161.30.94.151
req_src_port=2378 in_uri=sip:1000@sip.dev.inmarsat.com out_uri=sip:1000@asterisk.dev.inmarsat.com
:5060 via_cnt==1"....
#
U 161.30.94.136:5060 -> 161.30.94.137:5060
INVITE sip:1000@asterisk.dev.inmarsat.com:5060 SIP/2.0..Max-Forwards: 10..Record-Route: <sip:1000
@161.30.94.136;ftag=2c24948;lr=on>..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:100
0@sip.dev.inmarsat.com..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 2 INVITE..Contact: <sip:
test3(a)161.30.94.151>..Content-Type: application/sdp..Content-Length: 308..Accept-Language: en..Al
low: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, REGISTER, SUBSCRIBE..Supported: sip-cc, si
p-cc-01, timer, replaces..User-Agent: Pingtel/2.1.11 (VxWorks)..Date: Tue, 24 Aug 2004 14:52:19 G
MT..Proxy-Authorization: DIGEST USERNAME="test3", REALM="sip.dev.inmarsat.com", NONCE="412b574f5e
5a864751e3e96fb32f3f7a4929a17a", URI="sip:1000@sip.dev.inmarsat.com", RESPONSE="520ee043cedf1c3d2
ccbc0fa05101d2c"..Via: SIP/2.0/UDP 161.30.94.136;branch=z9hG4bK4773.683f9521.0..Via: SIP/2.0/UDP
161.30.94.151..CC-Diversion: sip:1000@sip.dev.inmarsat.com....v=0..o=Pingtel 5 5 IN IP4 161.30.94
.151..s=phone-call..c=IN IP4 161.30.94.151..t=0 0..m=audio 8766 RTP/AVP 96 97 0 8 18 98..a=rtpmap
:96 eg711u/8000/1..a=rtpmap:97 eg711a/8000/1..a=rtpmap:0 pcmu/8000/1..a=rtpmap:8 pcma/8000/1..a=r
tpmap:18 g729/8000/1..a=fmtp:18 annexb=no..a=rtpmap:98 telephone-event/8000/1..
#
U 161.30.94.136:5060 -> 161.30.94.137:5060
INVITE sip:1000@asterisk.dev.inmarsat.com:5060 SIP/2.0..Max-Forwards: 10..Record-Route: <sip:1000
@161.30.94.136;ftag=2c24948;lr=on>..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:100
0@sip.dev.inmarsat.com..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 2 INVITE..Contact: <sip:
test3(a)161.30.94.151>..Content-Type: application/sdp..Content-Length: 308..Accept-Language: en..Al
low: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, REGISTER, SUBSCRIBE..Supported: sip-cc, si
p-cc-01, timer, replaces..User-Agent: Pingtel/2.1.11 (VxWorks)..Date: Tue, 24 Aug 2004 14:52:19 G
MT..Proxy-Authorization: DIGEST USERNAME="test3", REALM="sip.dev.inmarsat.com", NONCE="412b574f5e
5a864751e3e96fb32f3f7a4929a17a", URI="sip:1000@sip.dev.inmarsat.com", RESPONSE="520ee043cedf1c3d2
ccbc0fa05101d2c"..Via: SIP/2.0/UDP 161.30.94.136;branch=z9hG4bK4773.683f9521.1..Via: SIP/2.0/UDP
161.30.94.151..CC-Diversion: sip:1000@sip.dev.inmarsat.com....v=0..o=Pingtel 5 5 IN IP4 161.30.94
.151..s=phone-call..c=IN IP4 161.30.94.151..t=0 0..m=audio 8766 RTP/AVP 96 97 0 8 18 98..a=rtpmap
:96 eg711u/8000/1..a=rtpmap:97 eg711a/8000/1..a=rtpmap:0 pcmu/8000/1..a=rtpmap:8 pcma/8000/1..a=r
tpmap:18 g729/8000/1..a=fmtp:18 annexb=no..a=rtpmap:98 telephone-event/8000/1..
#
U 161.30.94.137:5060 -> 161.30.94.136:5060
SIP/2.0 100 Trying..Via: SIP/2.0/UDP 161.30.94.136;branch=z9hG4bK4773.683f9521.0..Via: SIP/2.0/UD
P 161.30.94.151..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.
com;tag=as78a37589..Call-ID: call-1093359137-28@161.30.94.151..CSeq: 2 INVITE..User-Agent: Asteri
sk PBX..Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER..Contact: <sip:1000@161.30.94.137>..Conte
nt-Length: 0....
#
U 161.30.94.137:5060 -> 161.30.94.136:5060
SIP/2.0 100 Trying..Via: SIP/2.0/UDP 161.30.94.136;branch=z9hG4bK4773.683f9521.1..Via: SIP/2.0/UD
P 161.30.94.151..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.
com;tag=as78a37589..Call-ID: call-1093359137-28@161.30.94.151..CSeq: 2 INVITE..User-Agent: Asteri
sk PBX..Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER..Contact: <sip:1000@161.30.94.137>..Conte
nt-Length: 0....
#
U 161.30.94.137:5060 -> 161.30.94.136:5060
SIP/2.0 200 OK..Via: SIP/2.0/UDP 161.30.94.136;branch=z9hG4bK4773.683f9521.0..Via: SIP/2.0/UDP 16
1.30.94.151..Record-Route: <sip:1000@161.30.94.136;ftag=2c24948;lr=on>..From: sip:test3@sip.dev.i
nmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.com;tag=as78a37589..Call-ID: call-10933591
37-28@161.30.94.151..CSeq: 2 INVITE..User-Agent: Asterisk PBX..Allow: INVITE, ACK, CANCEL, OPTION
S, BYE, REFER..Contact: <sip:1000@161.30.94.137>..Content-Type: application/sdp..Content-Length:
288....v=0..o=root 2063 2063 IN IP4 161.30.94.137..s=session..c=IN IP4 161.30.94.137..t=0 0..m=au
dio 10248 RTP/AVP 18 0 97 3 98..a=rtpmap:18 G729/8000..a=rtpmap:0 PCMU/8000..a=rtpmap:97 iLBC/800
0..a=rtpmap:3 GSM/8000..a=rtpmap:98 telephone-event/8000..a=fmtp:98 0-16..a=silenceSupp:off - - -
-..
#
U 161.30.94.136:5060 -> 161.30.94.151:5060
SIP/2.0 200 OK..Via: SIP/2.0/UDP 161.30.94.151..Record-Route: <sip:1000@161.30.94.136;ftag=2c2494
8;lr=on>..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.com;tag
=as78a37589..Call-ID: call-1093359137-28@161.30.94.151..CSeq: 2 INVITE..User-Agent: Asterisk PBX.
.Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER..Contact: <sip:1000@161.30.94.137>..Content-Type
: application/sdp..Content-Length: 288....v=0..o=root 2063 2063 IN IP4 161.30.94.137..s=session..
c=IN IP4 161.30.94.137..t=0 0..m=audio 10248 RTP/AVP 18 0 97 3 98..a=rtpmap:18 G729/8000..a=rtpma
p:0 PCMU/8000..a=rtpmap:97 iLBC/8000..a=rtpmap:3 GSM/8000..a=rtpmap:98 telephone-event/8000..a=fm
tp:98 0-16..a=silenceSupp:off - - - -..
#
U 161.30.94.136:5060 -> 161.30.94.137:5060
CANCEL sip:1000@asterisk.dev.inmarsat.com:5060 SIP/2.0..Via: SIP/2.0/UDP 161.30.94.136;branch=z9h
G4bK4773.683f9521.1..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..Call-Id: call-1093359137-2
8@161.30.94.151..To: sip:1000@sip.dev.inmarsat.com..Cseq: 2 CANCEL..User-Agent: Sip EXpress route
r(0.8.14 (i386/linux))..Content-Length: 0....
#
U 161.30.94.137:5060 -> 161.30.94.136:5060
SIP/2.0 200 OK..Via: SIP/2.0/UDP 161.30.94.136;branch=z9hG4bK4773.683f9521.1..From: sip:test3@sip
.dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.com;tag=as78a37589..Call-ID: call-10
93359137-28@161.30.94.151..CSeq: 2 CANCEL..User-Agent: Asterisk PBX..Allow: INVITE, ACK, CANCEL,
OPTIONS, BYE, REFER..Contact: <sip:1000@161.30.94.137>..Content-Length: 0....
#
U 161.30.94.151:2394 -> 161.30.94.136:5060
ACK sip:1000@161.30.94.136;ftag=2c24948;lr=on SIP/2.0..Route: <sip:1000@161.30.94.137>..Contact:
sip:test3@161.30.94.151..From: sip:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.i
nmarsat.com;tag=as78a37589..Call-Id: call-1093359137-28@161.30.94.151..Cseq: 2 ACK..Accept-Langua
ge: en..User-Agent: Pingtel/2.1.11 (VxWorks)..Date: Tue, 24 Aug 2004 14:52:19 GMT..Via: SIP/2.0/U
DP 161.30.94.151..Content-Length: 0....
#
U 161.30.94.136:5060 -> 161.30.94.137:5060
ACK sip:1000@161.30.94.137 SIP/2.0..Max-Forwards: 10..Contact: sip:test3@161.30.94.151..From: sip
:test3@sip.dev.inmarsat.com;tag=2c24948..To: sip:1000@sip.dev.inmarsat.com;tag=as78a37589..Call-I
d: call-1093359137-28@161.30.94.151..Cseq: 2 ACK..Accept-Language: en..User-Agent: Pingtel/2.1.11
(VxWorks)..Date: Tue, 24 Aug 2004 14:52:19 GMT..Via: SIP/2.0/UDP 161.30.94.136;branch=0..Via: SI
P/2.0/UDP 161.30.94.151..Content-Length: 0....
exit
Hi,
In the IPTel web site, it mentions an AA Application suite in Python,
but I couldn't find a link to it.
Has anyone written a Python interface module to "ser" yet?
Is this what the AA Application suite is?
John
We are trying to use the MySQL database for voicemail logins. I can see that
* connects correctly to the database and is executing queries, so I'm pretty
sure I got the config right. However, it doesn't seem to be picking the
password up properly. Found a couple of old mailing list messages about this
but no solution. Anyone seen this before and can help me figure out what I'm
missing? Here's the info:
Relevent debug statements from *
vm:/etc/mysql# asterisk -vvvvvvvvvgrc
== Parsing '/etc/asterisk/asterisk.conf': Found
Asterisk CVS-05/31/04-22:00:51, Copyright (C) 1999-2004 Digium.
Written by Mark Spencer <markster(a)digium.com>
=========================================================================
Connected to Asterisk CVS-05/31/04-22:00:51 currently running on vm (pid =
30519)
-- Remote UNIX connection
-- Executing Wait("SIP/voicemail-6e98", "1") in new stack
-- Executing VoiceMailMain("SIP/voicemail-6e98", "") in new stack
-- Playing 'vm-login' (language 'en')
-- Playing 'vm-password' (language 'en')
-- Incorrect password '1234' for user '3609152000' (context = <any>)
-- Playing 'vm-incorrect' (language 'en')
vm*CLI>
A snippet from the startup debug messages for *:
vm:~# grep database asterisk.txt
-- Logging into database with user asterisk, password (redacted), and
database asterisk
And from the MySQL log:
040823 13:36:10 3 Connect asterisk@localhost on asterisk
040823 13:36:43 3 Query SELECT
password,fullname,email,pager,options FROM users WHERE context='default' AND
mailbox='3609152000'
And finally, the table in MySQL:
mysql> select * from users;
+---------+------------+----------+----------+-----------------+-------+----
-----+----------------+
| context | mailbox | password | fullname | email | pager |
options | stamp |
+---------+------------+----------+----------+-----------------+-------+----
-----+----------------+
| default | 3609152000 | 1234 | | support(a)tss.net | |
| 20040713164014 |
| default | 3609152050 | 1234 | | support(a)tss.net | |
| 20040713164025 |
+---------+------------+----------+----------+-----------------+-------+----
-----+----------------+
2 rows in set (0.00 sec)
So what did I miss? It looks like the right data is there, it's selecting
it, and successfully getting it back, but not letting us log in.
-Keith, TSS
All,
just started using SER (great experience so far!). I'm trying to us it for a
contact centre application where I have a specific requirement that calls
can only be terminated in one direction, from a Cisco AS53xx gateway, not a
Cisco phone.
Here's the set-up and desired result:
User logs into the contact centre systems which initiates a call on the PSTN
side of the AS53xx. This then creates a VOIP (SIP) call leg from a dial-peer
on the gateway, via the SER proxy.
The agents all have Cisco 7960 IP phones which register with the SER
registrar. The INVITE is proxied via a simple location lookup in the SER
route[0] config file to the appropriate handset. The agent answers the call
and is "logged" in to the system.
Now's the fun part. I want to prevent the SIP leg being torn-down by the
agent either accidentally or on purpose hanging up the call from the
handset.
Here's the logic (pseudo code) I have though out: Trap the BYE from the
handset using a statement something like:
if (method=="BYE" and uri=~"sip:[0-9]+@*") {
# Agent phone initiated the BYE so do something
route(1);
} else {
#do something else - pass on the message I guess
};
route[1] {
# use exec to call an external function
exec_msg ('script.file');
}
The external script needs to OK the BYE message - I assume use the FIFO
function to construct the OK message.
Now the tricky part: how do I stop the called phone from hanging up, (I
tried a simple 403 Forbidden response) but that didn't work. So I thought
about the REFER method with the URL of the phone sending the BYE message-
can I send a refer to the Gateway (AS5300) that still thinks the dialogue is
open to the phone and "hopefully" get it to send a new INVITE dialogue to
the phone? Or would I have to generate a new INVITE sequence from the SER
proxy exec code?
If its the latter, then I need access to the RTP port number on the AS53xx
from the original INVITE message - and this implies access to the SDP
payload - which I can't see from the SER script (unless anyone can tell me
how?)
Thanks in advance!!!
Neill....:o)
Neill Wilkinson
Senior Consultant
Quortex Consultants Ltd.
e: neill.wilkinson(a)quortex.com
Hi,
I re-compiled ser on a red hat linux machine with
radius-accounting support.
I added following lines in ser.cfg file:
modparam("acc", "radius_config",
"/usr/local/etc/radiusclient/radiusclient.conf")
modparam("acc", "service_type", 16)
modparam("acc", "radius_flag", 2)
modparam("acc", "radius_missed_flag", 2)
but when I start SER, I get following:
0(9526) set_mod_param_regex: parameter <radius_config>
not found in module <acc>
0(9526) parse error (39,81-82): Can't set module
parameter
0(9526) set_mod_param_regex: acc matches module acc
0(9526) set_mod_param_regex: parameter <service_type>
not found in module <acc>
0(9526) parse error (40,35-36): Can't set module
parameter
0(9526) set_mod_param_regex: acc matches module acc
0(9526) set_mod_param_regex: parameter <radius_flag>
not found in module <acc>
0(9526) parse error (41,33-34): Can't set module
parameter
0(9526) set_mod_param_regex: acc matches module acc
0(9526) set_mod_param_regex: parameter
<radius_missed_flag> not found in module <acc>
0(9526) parse error (42,40-41): Can't set module
parameter
and SER can't start itself.
Any help greatly appreciated.
Regards,
Jawad Bokhari
__________________________________
Do you Yahoo!?
Yahoo! Mail is new and improved - Check it out!
http://promotions.yahoo.com/new_mail
I just updated and rebuilt my SEMS source from cvs. SEMS starts ok but when
an inbound calls is relayed to SEMS I get a reorder tone and the following
log messages. I didn't see any mention of this in the list archives. Can
someone
explain what is happening?
Thanks,Steve
8396@128.91.50.49:5060>>
Aug 23 14:20:15 voicesrvr ser[28966]: [SER_vm]: URI match. Lookup
location: Time: [Mon Aug 23 14:20:15 2004] Method: <INVITE>
R-uri: <68001@voicesrvr:5090>
Call-id:<EFC9B8FE-175011CC-80D0C946-43B09BE9(a)128.91.56.38> Contact
Header: <<sip:2155738396@128.91.50.50:5060>> From uri
<sip:2155738396@128.91.50.50> To < sip:68001@net.isc.upenn.edu> IP
source address <128.91.50.50>
Aug 23 14:20:15 voicesrvr ser[28970]: ERROR: fifo_server: command
t_reply is not available
Aug 23 14:20:15 voicesrvr ser[28970]: ERROR: fifo_server: command must
begin with :: ringing
Aug 23 14:20:15 voicesrvr ser[28970]: ERROR: fifo_server: command must
begin with :: 0000714060F672D8
Aug 23 14:20:15 voicesrvr ser[28970]: ERROR: fifo_server: command must
have at least 3 chars
Aug 23 14:20:16 voicesrvr ser[14729]: ERROR: t_should_relay: status
rewrite by UAS: stored: 408, received: 487
--
ISC Network Engineering
The University of Pennsylvania
3401 Walnut Street, Suite 221A
Philadelphia, PA 19104
voice: 215-573-8396
215-746-7903
fax: 215-898-9348
sip:blairs@upenn.edu