Module: sip-router
Branch: sr_3.0
Commit: 8fb1a2121ebe5c17681e7921cd96d3fe9a5dab80
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=8fb1a21…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Nov 5 14:43:38 2009 +0100
core: extra flag when forcing a socket
- when forcing a socket set an extra send flag
(SND_F_FORCE_SOCKET), so that later we can tell if the socket in
the dst structure was forced or not (useful for forcing a
specific source ip on tcp or for keeping the forced socket
during dns failover in tm).
- added set_force_socket(msg, sock) and reset_force_socket(msg)
macros that should be used instead of directly setting
msg->force_send_socket (they take care of any extra work, like
setting/resetting flags).
---
action.c | 2 +-
ip_addr.h | 1 +
parser/msg_parser.h | 19 +++++++++++++++++++
3 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/action.c b/action.c
index b8256a7..ddbf445 100644
--- a/action.c
+++ b/action.c
@@ -1201,7 +1201,7 @@ match_cleanup:
ret=E_BUG;
goto error;
}
- msg->force_send_socket=(struct socket_info*)a->val[0].u.data;
+ set_force_socket(msg, (struct socket_info*)a->val[0].u.data);
ret=1; /* continue processing */
break;
diff --git a/ip_addr.h b/ip_addr.h
index 355fc77..2983e46 100644
--- a/ip_addr.h
+++ b/ip_addr.h
@@ -140,6 +140,7 @@ struct receive_info{
/* send flags */
#define SND_F_FORCE_CON_REUSE 1 /* reuse an existing connection or fail */
#define SND_F_CON_CLOSE 2 /* close the connection after sending */
+#define SND_F_FORCE_SOCKET 4 /* send socket in dst is forced */
typedef unsigned char snd_flags_t;
diff --git a/parser/msg_parser.h b/parser/msg_parser.h
index ce4c81d..adedddb 100644
--- a/parser/msg_parser.h
+++ b/parser/msg_parser.h
@@ -467,4 +467,23 @@ int set_path_vector(struct sip_msg* msg, str* path);
void reset_path_vector(struct sip_msg* msg);
+
+/** force a specific send socket for forwarding a request.
+ * @param msg - sip msg.
+ * @param fsocket - forced socket, pointer to struct socket_info, can be 0 (in
+ * which case it's equivalent to reset_force_socket()).
+ */
+#define set_force_socket(msg, fsocket) \
+ do { \
+ (msg)->force_send_socket=(fsocket); \
+ if ((msg)->force_send_socket) \
+ (msg)->fwd_send_flags |= SND_F_FORCE_SOCKET; \
+ else \
+ (msg)->fwd_send_flags &= ~SND_F_FORCE_SOCKET; \
+ } while (0)
+
+/** reset a previously forced send socket. */
+#define reset_force_socket(msg) set_force_socket(msg, 0)
+
+
#endif
Module: sip-router
Branch: sr_3.0
Commit: 35755149a5baa028e5b0e441cebebd0d25d6063b
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3575514…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Nov 5 14:48:41 2009 +0100
tm: preserve forced sockets and send flags during dns failover
- fix for branches introduced as a result of dns failover not
preserving the forced send socket.
- dns failover branches now preserve also the original branch send
flags.
---
modules/tm/t_fwd.c | 72 +++++++++++++++++++++++++++++++++++----------------
1 files changed, 49 insertions(+), 23 deletions(-)
diff --git a/modules/tm/t_fwd.c b/modules/tm/t_fwd.c
index e4df337..1e9644d 100644
--- a/modules/tm/t_fwd.c
+++ b/modules/tm/t_fwd.c
@@ -159,7 +159,7 @@ unsigned int get_on_branch(void)
the sending information: t->uac[branch].request.dst, branch buffer, uri
path vector a.s.o.) and runs the on_branch route.
* t->uac[branch].request.dst will be filled if next_hop !=0 with the result
- * of the DNS resolution (next_hop and fproto).
+ * of the DNS resolution (next_hop, fproto and fsocket).
* If next_hop is 0 all the dst members except the send_flags are read-only
* (send_flags it's updated) and are supposed to be pre-filled.
*
@@ -174,6 +174,8 @@ unsigned int get_on_branch(void)
* for DNS resolution and the branch request.dst structure will
* be filled. If 0 the branch must already have
* a pre-filled valid request.dst.
+ * @param fsocket - forced send socket for forwarding.
+ * @param send_flags - special flags for sending (see SND_F_* / snd_flags_t).
* @param fproto - forced proto for forwarding. Used only if next_hop!=0.
* @param flags - 0 or UAC_DNS_FAILOVER_F for now.
*
@@ -181,8 +183,10 @@ unsigned int get_on_branch(void)
*/
static int prepare_new_uac( struct cell *t, struct sip_msg *i_req,
int branch, str *uri, str* path,
- str* next_hop, int fproto,
- int flags)
+ str* next_hop,
+ struct socket_info* fsocket,
+ snd_flags_t snd_flags,
+ int fproto, int flags)
{
char *shbuf;
struct lump* add_rm_backup, *body_lumps_backup;
@@ -198,6 +202,7 @@ static int prepare_new_uac( struct cell *t, struct sip_msg *i_req,
int backup_route_type;
snd_flags_t fwd_snd_flags_bak;
snd_flags_t rpl_snd_flags_bak;
+ struct socket_info *force_send_socket_bak;
struct dest_info *dst;
shbuf=0;
@@ -321,17 +326,22 @@ static int prepare_new_uac( struct cell *t, struct sip_msg *i_req,
(
*/
if (exec_pre_script_cb(i_req, BRANCH_CB_TYPE)>0) {
- /* backup ireq msg send flags */
+ /* backup ireq msg send flags and force_send_socket*/
fwd_snd_flags_bak=i_req->fwd_send_flags;;
rpl_snd_flags_bak=i_req->rpl_send_flags;
- i_req->fwd_send_flags=dst->send_flags /* intial value */;
+ force_send_socket_bak=i_req->force_send_socket;
+ /* set the new values */
+ i_req->fwd_send_flags=snd_flags /* intial value */;
+ set_force_socket(i_req, fsocket);
if (run_top_route(branch_rt.rlist[branch_route], i_req, 0) < 0)
{
LOG(L_ERR, "Error in run_top_route\n");
}
- /* update dst send_flags */
- dst->send_flags=i_req->fwd_send_flags;
- /* restore ireq_msg flags */
+ /* update dst send_flags and send socket*/
+ snd_flags=i_req->fwd_send_flags;
+ fsocket=i_req->force_send_socket;
+ /* restore ireq_msg force_send_socket & flags */
+ set_force_socket(i_req, force_send_socket_bak);
i_req->fwd_send_flags=fwd_snd_flags_bak;
i_req->rpl_send_flags=rpl_snd_flags_bak;
exec_post_script_cb(i_req, BRANCH_CB_TYPE);
@@ -376,11 +386,12 @@ static int prepare_new_uac( struct cell *t, struct sip_msg *i_req,
if (likely(next_hop!=0 || (flags & UAC_DNS_FAILOVER_F))){
/* next_hop present => use it for dns resolution */
#ifdef USE_DNS_FAILOVER
- if (uri2dst(&t->uac[branch].dns_h, dst, i_req,
+ if (uri2dst2(&t->uac[branch].dns_h, dst, fsocket, snd_flags,
next_hop?next_hop:uri, fproto) == 0)
#else
/* dst filled from the uri & request (send_socket) */
- if (uri2dst(dst, i_req, next_hop?next_hop:uri, fproto)==0)
+ if (uri2dst2(dst, fsocket, snd_flags,
+ next_hop?next_hop:uri, fproto)==0)
#endif
{
ret=E_BAD_ADDRESS;
@@ -452,6 +463,7 @@ error03:
i_req->parsed_uri=parsed_uri_bak;
i_req->parsed_uri_ok=parsed_uri_ok_bak;
i_req->path_vec=path_bak;
+
/* Delete the duplicated lump lists, this will also delete
* all lumps created here, such as lumps created in per-branch
* routing sections, Via, and Content-Length headers created in
@@ -603,6 +615,8 @@ int add_blind_uac( /*struct cell *t*/ )
* uri format, e.g.: "<sip:1.2.3.4;lr>, <sip:5.6.7.8;lr>").
* @param proxy - proxy structure. If non-null it takes precedence over
* next_hop/uri and it will be used for forwarding.
+ * @param fsocket - forced forward send socket (can be 0).
+ * @param snd_flags - special send flags (see SND_F_* / snd_flags_t)
* @param proto - forced protocol for forwarding (overrides the protocol
* in next_hop/uri or proxy if != PROTO_NONE).
* @param flags - special flags passed to prepare_new_uac().
@@ -611,6 +625,7 @@ int add_blind_uac( /*struct cell *t*/ )
*/
static int add_uac( struct cell *t, struct sip_msg *request, str *uri,
str* next_hop, str* path, struct proxy_l *proxy,
+ struct socket_info* fsocket, snd_flags_t snd_flags,
int proto, int flags)
{
@@ -653,7 +668,8 @@ static int add_uac( struct cell *t, struct sip_msg *request, str *uri,
/* now message printing starts ... */
if (unlikely( (ret=prepare_new_uac(t, request, branch, uri, path,
- next_hop, proto, flags)) < 0)){
+ next_hop, fsocket, snd_flags,
+ proto, flags)) < 0)){
ser_error=ret;
goto error01;
}
@@ -689,7 +705,10 @@ error:
the failed branch to construct the new message in case of DNS failover.
*/
static int add_uac_from_buf( struct cell *t, struct sip_msg *request,
- str *uri, str* path, int proto,
+ str *uri, str* path,
+ struct socket_info* fsocket,
+ snd_flags_t send_flags,
+ int proto,
char *buf, short buf_len)
{
@@ -713,8 +732,8 @@ static int add_uac_from_buf( struct cell *t, struct sip_msg *request,
goto error;
}
- if (uri2dst(&t->uac[branch].dns_h, &t->uac[branch].request.dst,
- request, uri, proto) == 0)
+ if (uri2dst2(&t->uac[branch].dns_h, &t->uac[branch].request.dst,
+ fsocket, send_flags, uri, proto) == 0)
{
ret=ser_error=E_BAD_ADDRESS;
goto error;
@@ -820,21 +839,29 @@ int add_uac_dns_fallback(struct cell *t, struct sip_msg* msg,
dns_srv_handle_cpy(&t->uac[t->nr_of_outgoings].dns_h,
&old_uac->dns_h);
- if (cfg_get(tm, tm_cfg, reparse_on_dns_failover))
+ if (cfg_get(tm, tm_cfg, reparse_on_dns_failover)){
/* Reuse the old buffer and only replace the via header.
* The drawback is that the send_socket is not corrected
* in the rest of the message, only in the VIA HF (Miklos) */
ret=add_uac_from_buf(t, msg, &old_uac->uri,
&old_uac->path,
+ (old_uac->request.dst.send_flags &
+ SND_F_FORCE_SOCKET)?
+ old_uac->request.dst.send_sock:0,
+ old_uac->request.dst.send_flags,
old_uac->request.dst.proto,
old_uac->request.buffer,
old_uac->request.buffer_len);
- else
+ }else
/* add_uac will use dns_h => next_hop will be ignored.
* Unfortunately we can't reuse the old buffer, the branch id
* must be changed and the send_socket might be different =>
* re-create the whole uac */
ret=add_uac(t, msg, &old_uac->uri, 0, &old_uac->path, 0,
+ (old_uac->request.dst.send_flags &
+ SND_F_FORCE_SOCKET)?
+ old_uac->request.dst.send_sock:0,
+ old_uac->request.dst.send_flags,
old_uac->request.dst.proto, UAC_DNS_FAILOVER_F);
if (ret<0){
@@ -906,7 +933,7 @@ int e2e_cancel_branch( struct sip_msg *cancel_msg, struct cell *t_cancel,
if (unlikely((ret=prepare_new_uac( t_cancel, cancel_msg, branch,
&t_invite->uac[branch].uri,
&t_invite->uac[branch].path,
- 0, PROTO_NONE, 0)) <0)){
+ 0, 0, 0, PROTO_NONE, 0)) <0)){
ser_error=ret;
goto error;
}
@@ -1242,7 +1269,7 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
int try_new;
int lock_replies;
str dst_uri, path;
- struct socket_info* si, *backup_si;
+ struct socket_info* si;
flag_t backup_bflags = 0;
flag_t bflags = 0;
@@ -1267,7 +1294,6 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
}
}
- backup_si = p_msg->force_send_socket;
getbflagsval(0, &backup_bflags);
/* if no more specific error code is known, use this */
@@ -1303,7 +1329,8 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
#endif
try_new=1;
branch_ret=add_uac( t, p_msg, GET_RURI(p_msg), GET_NEXT_HOP(p_msg),
- &p_msg->path_vec, proxy, proto, 0);
+ &p_msg->path_vec, proxy, p_msg->force_send_socket,
+ p_msg->fwd_send_flags, proto, 0);
if (branch_ret>=0)
added_branches |= 1<<branch_ret;
else
@@ -1314,12 +1341,12 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
while((current_uri.s=next_branch( ¤t_uri.len, &q, &dst_uri, &path,
&bflags, &si))) {
try_new++;
- p_msg->force_send_socket = si;
setbflagsval(0, bflags);
branch_ret=add_uac( t, p_msg, ¤t_uri,
(dst_uri.len) ? (&dst_uri) : ¤t_uri,
- &path, proxy, proto, 0);
+ &path, proxy, si, p_msg->fwd_send_flags,
+ proto, 0);
/* pick some of the errors in case things go wrong;
note that picking lowest error is just as good as
any other algorithm which picks any other negative
@@ -1332,7 +1359,6 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
/* consume processed branches */
clear_branches();
- p_msg->force_send_socket = backup_si;
setbflagsval(0, backup_bflags);
/* don't forget to clear all branches processed so far */
Bugs item #2892560, was opened at 2009-11-05 13:18
Message generated for change (Tracker Item Submitted) made by axlh
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=743020&aid=2892560&group_…
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: core
Group: ver 1.4.x
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Alex Hermann (axlh)
Assigned to: Nobody/Anonymous (nobody)
Summary: Inconsistent $rP contents
Initial Comment:
The $rP (request-uri's transport) is broken. When $ru is set with a ";transport=XXX" parameter, the contents of $rP show the entire parameter instead of its parsed value.
The following config snippet:
$ru = 'sip:123@invalid';
TRACE("Transport=[$rP]");
$ru = 'sip:123@invalid;transport=udp';
TRACE("Transport=[$rP]");
$ru = 'sip:123@invalid;transport=tcp';
TRACE("Transport=[$rP]");
creates the following log:
Nov 5 13:14:26 Transport=[UDP]
Nov 5 13:14:26 Transport=[transport=udp]
Nov 5 13:14:26 Transport=[transport=tcp]
Expected would be:
Nov 5 13:14:26 Transport=[UDP]
Nov 5 13:14:26 Transport=[UDP]
Nov 5 13:14:26 Transport=[TCP]
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=743020&aid=2892560&group_…
Hello,
I updated the vim syntax file for Kamailio 3.0 and SR3.0/devel. I
attached as well a script to auto-detect the type of .cfg file based on
matching compatibility string (i.e., #!XYZ), loadmodule or main route line.
To install, copy the files in your home dir - see the hints inside each
file to know which one to place where:
.vim/syntax/ser.vim
.vim/ftdetect/ser.vim
If you don't install the file type detect script, then you can use
":setf ser" once you opened the config file.
Enjoy,
Daniel
--
Daniel-Constantin Mierla
* http://www.asipto.com/
" Copy this file to $HOME/.vim/ftdetect/ser.vim
func! s:cfgType()
let max = line("$") > 200 ? 200 : line("$")
for n in range(1, max)
if getline(n) =~ '^\s*#!\(KAMAILIO\|OPENSER\|SER\|ALL\|MAXCOMPAT\)'
set filetype=ser
return
elseif getline(n) =~ '^\s*modparam\s*(\s*"[^"]\+"'
set filetype=ser
return
elseif getline(n) =~ '^\s*route\s*{\s*'
set filetype=ser
return
endif
endfor
setf cfg
endfunc
au BufNewFile,BufRead *.cfg call s:cfgType()
" -*- vim -*-
" FILE: ser.vim
" LAST MODIFICATION: 2009-05-28 18:30
" (C) Copyright 2008 Stanisław Pitucha <viraptor(a)gmail.com>
" (C) Copyright 2009 Daniel-Constantin Mierla <miconda(a)gmail.com>
" Version: 1.01
" USAGE:
"
" Save this file to $VIMFILES/syntax/ser.vim. Either add a detection
" script to filetypes.vim, or set filetype manually to "ser" when
" editing SIP Router configuration file with 'setf ser'.
"
" List of keyword and core functions taken from latest dev version of
" SIP Router. Module functions not included.
"
" Tested only on vim 7.1
"
" Example: "setf ser"
"
" REQUIREMENTS:
" vim (>= 7)
if exists("b:current_syntax")
finish
endif
syn match serConfigParamLine '^[^=]\+=.*$' contains=serCoreParameter,serString,serConfigConstant,serSpecial,serNumber,serCppComment,serHashComment
syn region serConfigModparam start='^\s*modparam\s*(' end=')' contains=serString,serNumber
syn match serConfigModule '^\s*loadmodule\s*"[^"]\+"' contains=serString
syn keyword serTodo TODO FIXME XXX contained
syn match serOperator '!\|&&\|||\|=[~=]\?\|>\|<\|+\|-\|/\|\*\||\|&\|^\|\~\|defined\|eq\|ieq\|ne\|ine\|mod' display contained
syn region serCppComment start='/\*' end='\*/' contains=serTodo
syn match serHashDefine '#!define\s\|#!ifdef\s\|#!ifndef\s\|#!endif\|#!else\|#!KAMAILIO\|#!OPENSER\|#!SER\|#!MAXCOMPAT\|#!ALL'
" syn match serHashDefine '^\s*#!.+$'
syn match serHashComment '#[^!].*$\|#$' contains=serTodo
syn match serStringEscape '\\.' contained
syn match serNumber '[0-9]\+' contained
syn region serString matchgroup=Normal start='"' skip='\\"' end='"' contained contains=serVariable,serStringEscape
syn match serVariable "$[a-zA-Z_][a-zA-Z0-9_]*\(([^)]\+)\)\?" contained
syn match serIdentifier '[a-zA-Z_][a-zA-Z0-9_]*' contained
syn keyword serStatement route if else switch case default break exit return drop while include_file contained
syn keyword serSpecial yes no on off true false enabled disabled contained
syn keyword serCoreKeyword af dst_ip dst_port from_uri method msg:len proto status snd_af snd_ip snd_port snd_proto src_ip src_port to_af to_ip to_port to_proto to_uri uri uri:host uri:port contained
syn keyword serCoreValue udp UDP tcp TCP tls TLS sctp SCTP inet INET inet6 INET6 sslv23 SSLv23 SSLV23 sslv2 SSLv2 SSLV2 sslv3 SSLv3 SSLV3 tlsv1 TLSv1 TLSV1 max_len myself contained
syn keyword serCoreFunction forward forward_tcp forward_udp forward_tls forward_sctp send send_tcp log error exec force_rport add_rport force_tcp_alias add_tcp_alias udp_mtu udp_mtu_try_proto setflag resetflag isflagset flags bool setavpflag resetavpflag isavpflagset avpflags rewritehost sethost seth rewritehostport sethostport sethp rewritehostporttrans sethostporttrans sethpt rewriteuser setuser setu rewriteuserpass setuserpass setup rewriteport setport setp rewriteuri seturi revert_uri prefix strip strip_tail userphone append_branch set_advertised_address set_advertised_port force_send_socket contained
syn keyword serCoreParameter debug fork log_stderror log_facility listen alias auto_aliases dns rev_dns dns_try_ipv6 dns_try_naptr dns_srv_lb dns_srv_loadbalancing dns_udp_pref dns_udp_preference dns_tcp_pref dns_tcp_preference dns_tls_pref dns_tls_preference dns_sctp_pref dns_sctp_preference dns_retr_time dns_retr_no dns_servers_no dns_use_search_list dns_search_full_match dns_cache_init use_dns_cache use_dns_failover dns_cache_flags dns_cache_negative_ttl dns_cache_min_ttl dns_cache_max_ttl dns_cache_mem dns_cache_gc_interval dns_cache_del_nonexp dns_cache_delete_nonexpired dst_blacklist_init use_dst_blacklist dst_blacklist_mem dst_blacklist_expire dst_blacklist_ttl dst_blacklist_gc_interval port statistics maxbuffer children check_via phone2tel syn_branch memlog mem_log memdbg mem_dbg sip_warning server_signature reply_to_via user uid group gid chroot workdir wdir mhomed disable_tcp tcp_children tcp_accept_aliases tcp_send_timeout tcp_connect_timeout tcp_connection_lifetime tcp_poll_method tcp_max_connections tcp_no_connect tcp_source_ipv4 tcp_source_ipv6 tcp_fd_cache tcp_buf_write tcp_async tcp_conn_wq_max tcp_wq_max tcp_rd_buf_size tcp_wq_blk_size tcp_defer_accept tcp_delayed_ack tcp_syncnt tcp_linger2 tcp_keepalive tcp_keepidle tcp_keepintvl tcp_keepcnt tcp_crlf_ping disable_tls tls_disable enable_tls tls_enable tlslog tls_log tls_port_no tls_method tls_verify tls_require_certificate tls_certificate tls_private_key tls_ca_list tls_handshake_timeout tls_send_timeout disable_sctp enable_sctp sctp_children sctp_socket_rcvbuf sctp_socket_receive_buffer sctp_socket_sndbuf sctp_socket_send_buffer sctp_autoclose sctp_send_ttl sctp_send_retries advertised_address advertised_port disable_core_dump open_files_limit shm_force_alloc mlock_pages real_time rt_prio rt_policy rt_timer1_prio rt_fast_timer_prio rt_ftimer_prio rt_timer1_policy rt_ftimer_policy rt_timer2_prio rt_stimer_prio rt_timer2_policy rt_stimer_policy mcast_loopback mcast_ttl tos pmtu_discovery exit_timeout ser_kill_timeout max_while_loops stun_refresh_interval stun_allow_stun stun_allow_fp server_id description descr desc loadpath mpath contained
syn region serBlock start='{' end='}' contained contains=serBlock,@serCodeElements
syn match serRouteBlock '\(failure_\|onreply_\|branch_\|event_\|onsend_\)\?route\(\s*\[[^\]]\+\]\)\?' contained contains=serNumber,serString,serIdentifier
syn region serRrouteBlockFold matchgroup=serRouteBlock start="\(failure_\|onreply_\|branch_\|event_\|onsend_\)\?route\(\s*\[[^\]]\+\]\)\?\s*\n\?{" matchgroup=NONE end="}" contains=serBlock,@serCodeElements
syn cluster serCodeElements contains=serHashDefine,serCppComment,serHashComment,serNumber,serString,serVariable,serOperator,serStatement,serKeyword,serCoreKeyword,serCoreValue,serCoreFunction,serIdentifier
hi def link serCppComment Comment
hi def link serHashComment Comment
hi def link serHashDefine Special
hi def link serTodo Todo
hi def link serConfigModparam Function
hi def link serConfigModule Keyword
hi def link serKeyword Keyword
hi def link serCoreKeyword Special
hi def link serCoreValue Special
hi def link serCoreFunction Function
hi def link serRouteBlock Type
hi def link serRrouteBlockFold Type
hi def link serIdentifier Identifier
hi def link serSpecial Special
hi def link serCoreParameter Keyword
hi def link serOperator Operator
hi def link serStatement Conditional
hi def link serNumber Number
hi def link serVariable Identifier
hi def link serString String
hi def link serStringEscape Special
let b:current_syntax = "ser"
Hello,
several folks working with Kamailio, SIP Router, SER, OpenIMSCore, SEMS
and Asterisk are in Berlin next week, so we think of having a dinner (or
beer) meeting Thursday, 19:00, Nov 12, 2009. If happens that you are
around and want to join, please send me an email to make sure you get a
seat. As usual for this kind of event, free participation with everyone
paying for himself/herself.
Just to have an idea about how it could be, see some photos from
previous similar events:
http://www.asipto.com/gallery/v/social_meeting_barcelona2008/http://www.asipto.com/gallery/v/FOSDEM2009/
From private discussions so far, we should be already about 10 people,
confirmed including myself, Olle E. Johansson (Asterisk) and
Elena-Ramona Modroiu. There is a lot to celebrate, from integration work
within SIP Router Project to upcoming Kamailio 3.0 (now RC1).
Cheers,
Daniel
--
Daniel-Constantin Mierla
* http://www.asipto.com/