Hello, comments inline.
On 23-05-2005 18:57, Cesc Santasusana wrote:
> Hi,
>
> I found what i think is a bug in the return value of loose_route() ...
> bear with me because it is a rather long email.
>
> First, the scenario:
>
> phone1 ----- SER1 ----- SER2 ----- phone2
>
> p1 to s1 and p2 to s2 use UDP
> s1 to s2 uses tcp or tls
>
> The bug comes into place when there is a change of protocol in ser,
> from UDP into TCP or TLS.
> We do not use a preloaded route set from the phones.
> What ser does is it adds 2 route headers, using the r2 parameter.
> Route: <route1>, <route2>
>
> CASE A: --------------------------------------------
> In this scenario, say p1 places a call to p2, going through s1 and s2,
> creating the route set with the record-route.
> Now, let's say p2 generates the BYE message.
> When the BYE gets to s1, the last hop, in the config we do:
> if( loose_route () ) {
> t_relay();
> }
> But, and here is the inconsistency, loose_route (remember we are using
> TCP/TLS, so there are 2 routes in one header field) returns FALSE.
>
> CASE B: --------------------------------------------
> If this experiment is repeated using ALL UDP, the route headers when they
> get to s1 contain only one route, and the call to loose_route() returns .... TRUE!
>
>
> Unless the config file does not allow blind sip message relaying, both cases end
> up working ... the BYE gets to the final destination. But if the config file does not
> accept relaying ... the request-uri in the BYE is not taken as a local domain ... and
> thus the message is rejected ... (To Alex Mack: could this be the solution to your problem?
> the BYEs not reaching the phone? add some log output and check it ... )
>
> ================================================================
> So, this is not consistent. Now, what is the solution?
> I think that both case A and B should return the same, but what, true or false?
Yes, they should return the same value in this case and it should be
true (see below). It looks like you discovered a bug.
> As I see it, the solution causing less trouble is that both return true. So, the last proxy
> considers this BYE as being loose_routed.
> For this ... change the code in:
> rr::loose_route.c:: static inline int after_loose(struct sip_msg* _m, int preloaded)
> .....
> if (enable_double_rr && is_2rr(&puri.params)) {
> ....
> if (res > 0) { /* No next route found */
> DBG("after_loose: No next URI found\n");
> return (preloaded ? NOT_RR_DRIVEN : RR_DRIVEN);
> or simply
> return (preloaded RR_DRIVEN);
>
>
> And now ... the other option is that both return false ... but this would make big changes.
> Correct me if i am wrong, but wouldn't this be the compliant solution?
> Considering that the r-uri is not part of the route set, when the last proxy processes
> all route headers and there are no more left, there is no loose routing done. The
> destination is taken from the r-uri, not the route set ... thus loose_route should return
> false.
> Or I am getting it all wrong? rfc and goal of loose_route() ?
The meaning of the return value of loose_route is as follows (or
should be):
1 - Record routing was used to route the message
0 - Record routing was not (usually requests establishing a dialog or
transactional requests).
So the function should return true in the mentioned case, because
record routing was used although the message does not contain any
Route header fields anymore.
In other words the purpose of loose_route return value is to distinguish
mid-dialog requests (such as ACK or BYE) from dialog-establishing
requests (such as INVITE). The reason why we have to do this is that we
typically do not apply all the logic in the script to mid-dialog
requests (because you should not change the request-uri of the request
anymore once the dialog has been established -- changes caused by
loose_route do not count).
You may also wonder why don't we use the contents of the Request-URI
for this -- there should be the Contact value of phone1 in the
Request-URI in mid-dialog requests and the value should not match
uri==myself so all we need to do is to enclose all the processing
logic within if (uri == myself) condition.
This would work in a perfect world without the need to be backwards
compatible with strict routers. In our world we have to be backwards
compatible with strict routers and we have to deal with broken
implementations too (that strip ;lr parameters). Due to backwards
compatibility with strict routers it can happen that the Request-URI
will contain the URI of the proxy that is currently processing the
request and subsequent if (uri==myself) would be true.
Jan.
Hi,
I found what i think is a bug in the return value of loose_route() ...
bear with me because it is a rather long email.
First, the scenario:
phone1 ----- SER1 ----- SER2 ----- phone2
p1 to s1 and p2 to s2 use UDP
s1 to s2 uses tcp or tls
The bug comes into place when there is a change of protocol in ser,
from UDP into TCP or TLS.
We do not use a preloaded route set from the phones.
What ser does is it adds 2 route headers, using the r2 parameter.
Route: <route1>, <route2>
CASE A: --------------------------------------------
In this scenario, say p1 places a call to p2, going through s1 and s2,
creating the route set with the record-route.
Now, let's say p2 generates the BYE message.
When the BYE gets to s1, the last hop, in the config we do:
if( loose_route () ) {
t_relay();
}
But, and here is the inconsistency, loose_route (remember we are using
TCP/TLS, so there are 2 routes in one header field) returns FALSE.
CASE B: --------------------------------------------
If this experiment is repeated using ALL UDP, the route headers when they
get to s1 contain only one route, and the call to loose_route() returns .... TRUE!
Unless the config file does not allow blind sip message relaying, both cases end
up working ... the BYE gets to the final destination. But if the config file does not
accept relaying ... the request-uri in the BYE is not taken as a local domain ... and
thus the message is rejected ... (To Alex Mack: could this be the solution to your problem?
the BYEs not reaching the phone? add some log output and check it ... )
================================================================
So, this is not consistent. Now, what is the solution?
I think that both case A and B should return the same, but what, true or false?
As I see it, the solution causing less trouble is that both return true. So, the last proxy
considers this BYE as being loose_routed.
For this ... change the code in:
rr::loose_route.c:: static inline int after_loose(struct sip_msg* _m, int preloaded)
.....
if (enable_double_rr && is_2rr(&puri.params)) {
....
if (res > 0) { /* No next route found */
DBG("after_loose: No next URI found\n");
return (preloaded ? NOT_RR_DRIVEN : RR_DRIVEN);
or simply
return (preloaded RR_DRIVEN);
And now ... the other option is that both return false ... but this would make big changes.
Correct me if i am wrong, but wouldn't this be the compliant solution?
Considering that the r-uri is not part of the route set, when the last proxy processes
all route headers and there are no more left, there is no loose routing done. The
destination is taken from the r-uri, not the route set ... thus loose_route should return
false.
Or I am getting it all wrong? rfc and goal of loose_route() ?
Regards,
Cesc
Unclassified
Hi everybody,
I'm experiencing some problems with the audio of my server. My SER is configured with mysql auth and was working very well the whole friday, there were 6 people talking to each other within our private network, but today, I can't make a decent call, because the noise is very loud at every soft or hard phone I try internally. What May be that ?? Is there documented some codec audio problem about that ? Could it be a problem in my network ?
Another question, I have ser worknig at a private network, with his Default Route to one of my internet gateway, My tests machine are connected via a hub just for tests, and this hub to my private network, which leaves to the internet. When I test it internallty there no problem occurs, but when I swich off the eth cable that leads to the internet (I mean the one that is my default route) SER stop authenticating my users, and I can't make a internal call. Is this a bug ??
Best Regards
--
Felipe Martins
Mundivox Communications
Tecnologia e Projetos
fmartins(a)mundivox.com
Tel.: +55 +21 +3820 8839
Cel.: +55 +21 +9823 8602
Fax.: +55 +21 +3820 8844
www.mundivox.com
Does this module work on ser-0.9.0?
Or, was you guys able to make it work on ser-0.9.0
If you were able to make it worked, would you please share the tricks,
Thanks,
Mohammad
Original Message:
-----------------
From: Michael Ulitskiy mdu113(a)acedsl.com
Date: Mon, 23 May 2005 12:01:40 -0400
To: daniel(a)voice-system.ro, serusers(a)iptel.org
Subject: Re: [Serusers] UAC module (backport to 0.9.0)
On Sunday 22 May 2005 04:51 am, Daniel-Constantin Mierla wrote:
> Hello,
>
> the issue with CSeq is known and it is stated in the documentation (see
> the note there):
>
> http://www.voice-system.ro/docs/uac/ar01s04.html#uac_auth
Thanks. Actually I read that docs, but somehow overlooked that note.
Thanks for pointing it out.
> Daniel
Michael
>
> On 05/16/05 22:05, Michael Ulitskiy wrote:
>
> >Hello,
> >
> >I succeeded to make UAC module calculate credentials and
> >resend message with the following simple patch on t_reply.c
> >of tm module:
> >
> >--- t_reply.c.bak 2005-05-13 14:57:25.000000000 -0400
> >+++ t_reply.c 2005-05-13 15:16:45.000000000 -0400
> >@@ -761,6 +761,10 @@
> > a callback; save branch count to be able to determine
> > later if new branches were initiated */
> > branch_cnt=Trans->nr_of_outgoings;
> >+ /* also append the current reply to the transaction to
> >+ * make it available in failure routes - a kind of
"fake"
> >+ * save of the final reply per branch */
> >+ Trans->uac[branch].reply = reply;
> >
> > /* run ON_FAILURE handlers ( route and callbacks) */
> > if ( has_tran_tmcbs( Trans,
TMCB_ON_FAILURE_RO|TMCB_ON_FAILURE)
> >@@ -769,6 +773,11 @@
> >
picked_branch==branch?reply:Trans->uac[picked_branch].reply,
> > picked_code);
> > }
> >+
> >+ /* now reset it; after the failure logic, the reply may
> >+ * not be stored any more and we don't want to keep into
> >+ * transaction some broken reference */
> >+ Trans->uac[branch].reply = 0;
> >
> > /* look if the callback perhaps replied transaction; it
also
> > covers the case in which a transaction is replied
localy
> >
> >It's actually taken from cvs-head.
> >Now ser.cfg written below works as expected with just one
> >important issue. Authentication doesn't work anyway because
> >ser doesn't increase CSeq number when resending message
> >(INVITE) with credentials. I'm trying to authenticate
> >to asterisk and in case of asterisk it immediately replies
> >"503 Service Unavailable" if it receives INVITE with the same CSeq.
> >I thought it could be asterisk-specific problem, but RFC3261 in
> >section "8.1.3.5 Processing 4xx Responses" says:
> >"new request constitutes a new transaction and SHOULD have the same
> >value of the Call-ID, To, and From of the previous request, but the CSeq
> >should contain a new sequence number that is one higher than the
previous."
> >So I guess this is not an asterisk-specific.
> >It is my understanding that in order for this to work ser must increment
> >CSeq when authenticating to UAS, but decrement CSeq in all subsequent
> >in-dialog messages that will be sent to call originator including BYEs.
> >This, in turn, requires for ser to be call-statefull which is not the
case.
> >Conclusion: uac authentication in ser is not possible.
> >Please correct me if I'm wrong (I honestly want to be wrong on this
matter:))
> >Thank you,
> >
> >Michael
> >
> >On Sunday 15 May 2005 12:36 am, you wrote:
> >
> >
> >>Michael Ulitskiy wrote:
> >>
> >>
> >>
> >>>Hello,
> >>>
> >>>Has anyone succeeded in getting UAC authentication to work?
> >>>I'm doing the following:
> >>>
> >>>route {
> >>> resetflag(1);
> >>> t_on_failure("1");
> >>> route(1);
> >>>}
> >>>
> >>>route[1]
> >>>{
> >>> if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)")
{
> >>> sl_send_reply("479", "We don't forward to private IP
addresses");
> >>> break;
> >>> };
> >>> if (!t_relay()) {
> >>> sl_reply_error();
> >>> };
> >>>}
> >>>
> >>>failure_route[1] {
> >>> # authentication reply received?
> >>> if ( t_check_status("401|407") ) {
> >>> if (!isflagset(1) && uac_auth()) {
> >>> setflag(1);
> >>> t_on_failure("1");
> >>> append_branch();
> >>> route(1);
> >>> } else {
> >>> t_reply("500","Error occurred");
> >>> }
> >>> break;
> >>> }
> >>>
> >>>}
> >>>
> >>>When uac_auth() is called I get the following in the:
> >>>0(28973) DEBUG:uac:uac_auth: picked reply is (nil), code 407
> >>>0(28973) BUG:uac:uac_auth: empty reply on picked branch
> >>>
> >>>Any suggestions or ideas?
> >>>Thank you,
> >>>
> >>>Michael
> >>>
> >>>
> >>>
> >>>
> >>>
> >>I am also getting same thing with different msg ..
> >>BUG:uac:uac_auth: empty reply on picked branch
> >>
> >>Anybody know how to overcome this?
> >>
> >>Mohammad
> >>
> >>
> >>
> >>
> >
> >_______________________________________________
> >Serusers mailing list
> >Serusers(a)iptel.org
> >http://mail.iptel.org/mailman/listinfo/serusers
> >
> >
> >
>
_______________________________________________
Serusers mailing list
Serusers(a)iptel.org
http://mail.iptel.org/mailman/listinfo/serusers
--------------------------------------------------------------------
mail2web - Check your email from the web at
http://mail2web.com/ .
Yes, I guess it's another option. Not that I like it much though :)
BTW I haven't seen providers that support it.
2all: Have you seen any?
Thanks,
Michael
On Monday 23 May 2005 04:50 am, you wrote:
> just an idea:
>
> does any PSTN provider supports TLS? If some does you have your auth
> problem solved with the TLS support from SER.
>
> Samuel
>
>
> Unclassified.
> >>> "Greger V. Teigre" <greger(a)teigre.com> 05/22/05 08:57AM >>>
> See inline.
>
> Michael Ulitskiy wrote:
> > On Saturday 21 May 2005 02:31 am, you wrote:
> >> I would say SER is what you need, except that you struggle with the
> >> authentication. You have the following scenarios:
> >> 1. PSTN termination with IP-based access control (easiest)
> >> 2. PSTN termination with authentication of all INVITEs (yes, that's
> >> the UAC module. You should contact the maintainer, Ramona-Elena
> >> Modroiu about the status. I thought it was reported to work, but
> >> haven't tried myself)
> >> 3. PSTN termination with registration and authentication of
> REGISTER
> >> (but not INVITEs). Use sipsak to generate a REGISTER for your box.
> >>
> >> #2 requires that all INVITEs are sent twice and is not a very good
> >> option. I would seek out PSTN providers who will give you #1.
> >> g-)
> >
> > UAC module doesn't work and I think won't work unless ser is made
> > call-statefull, 'cause it needs to adjust cseq within dialog. I
> > posted my findings to this list
> > several days ago (UAC module (backport to 0.9.0). Nobody replied so
> I
> > guess
> > nobody knows the way to make it work.
>
> I saw your post on serusers, yes, but not on serdev. Because you cannot
> make
> a module work, doesn't mean it doesn't work for all, so as I said, if
> you
> have found a bug, post it to serdev (preferably) or directly to the
> maintainer. That's the way open source software work...
>
> > As for ip auth I guess it's just not good enough. UDP invites don't
> > require any handshake it's not hard at all to spoof ip address. I
> > believe sending 2 invites worth the security it actually adds.
>
> Yes, but you can also do TCP.
>
> > Also I don't understand what you mean by #3. Taking ip address from
> > authenticated REGISTER and then doing IP auth on that?
>
> No, using sipsak to actually do a REGISTER on behalf of your ser. No IP
>
> auth, basically it makes your ser a registered client of the GW. Of
> course,
> if INVITEs still must be authenticated, you are back to the UAC module
>
> problem.
>
> g-)
>
>
> > Thanks,
> >
> > Michael
> >
> >> Michael Ulitskiy wrote:
> >>> Hello,
> >>>
> >>> I'd like ask for advice on what is in your opinion the best
> solution
> >>> in the following scenario.
> >>> I have a bunch of sip servers (asterisk boxes as my users need pbx
> >>> functionality) that can make sip call to each other and my PSTN
> >>> gateway. Now I want to purchase PSTN terminitaion in several
> >>> different markets (and probably more in the future). All those
> >>> terminations will require authentication.
> >>> I want all my boxes when they see non-local call to send it to a
> >>> central routing server that would determine where this call should
> >>> be sent and authenticate to the appropriate provider so that I
> don't
> >>> have to configure all credentials on all asterisk boxes. Also I
> want
> >>> it not to deal with the media at all. All media streams should go
> >>> directly from asterisk box to the PSTN termination provider.
> >>> So basically it should be central SIP router that is able to
> >>> authenticate calls if neccessary.
> >>> I thought I could do it with SER and its UAC module, but it
> appears
> >>> UAC module doesn't work and probably won't work (see my previous
> >>> post in this list about UAC backport to 0.9.0).
> >>> Also I don't want to use asterisk in this place as asterisk always
> >>> wants to stay in media path and I'd really like to avoid of
> getting
> >>> into hassle with re-invites.
> >>> So the question is what are my options and what you would advice
> >>> as a solution. Are there any software out there that can do it
> >>> (preferably open-source, of course) or what else you could suggest
> >>> to do to get desired results.
> >>> Thanks a lot,
> >>
> >>
> >
> > --
> > See you later,
> > Michael
> >
> >
> > -------------------------------------------------------
>
> _______________________________________________
> Serusers mailing list
> serusers(a)lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers
>
to clarify the question, how do you tell what messages
SER is sending out {without using ngrep}? I would like
to get a printout everytime it sends 'trying',
'ringing', / 200 OK. What would the config look like?
Is this possible?
alex
--- a c <lra101(a)yahoo.com> wrote:
>
> this worked with t_check_status(). One thing I could
> not figure out is how to get a log printout when I
> receive a 200 OK. How do I know if I received a 200
> OK?
> I can't put this logic in the main route block.
>
> thank you
> ac
> --- a c <lra101(a)yahoo.com> wrote:
> >
> > I need to route to a failure route when there is a
> > certain kind of failure. For example, If I don't
> > receive a 'Trying' back on the initial attempt{no
> > response to Invite}, then I would route using the
> > failure route. For all other failures {i.e. 404,
> no
> > answer, 486, etc..}, I don't try any other routes.
> > How
> > can this be configured?
> >
> > thank you
> > ac
> >
> >
> >
> > Discover Yahoo!
> > Have fun online with music videos, cool games, IM
> > and more. Check it out!
> > http://discover.yahoo.com/online.html
> >
>
>
>
> __________________________________
> Do you Yahoo!?
> Make Yahoo! your home page
> http://www.yahoo.com/r/hs
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
Hello,
I succeeded to make UAC module calculate credentials and
resend message with the following simple patch on t_reply.c
of tm module:
--- t_reply.c.bak 2005-05-13 14:57:25.000000000 -0400
+++ t_reply.c 2005-05-13 15:16:45.000000000 -0400
@@ -761,6 +761,10 @@
a callback; save branch count to be able to determine
later if new branches were initiated */
branch_cnt=Trans->nr_of_outgoings;
+ /* also append the current reply to the transaction to
+ * make it available in failure routes - a kind of "fake"
+ * save of the final reply per branch */
+ Trans->uac[branch].reply = reply;
/* run ON_FAILURE handlers ( route and callbacks) */
if ( has_tran_tmcbs( Trans, TMCB_ON_FAILURE_RO|TMCB_ON_FAILURE)
@@ -769,6 +773,11 @@
picked_branch==branch?reply:Trans->uac[picked_branch].reply,
picked_code);
}
+
+ /* now reset it; after the failure logic, the reply may
+ * not be stored any more and we don't want to keep into
+ * transaction some broken reference */
+ Trans->uac[branch].reply = 0;
/* look if the callback perhaps replied transaction; it also
covers the case in which a transaction is replied localy
It's actually taken from cvs-head.
Now ser.cfg written below works as expected with just one
important issue. Authentication doesn't work anyway because
ser doesn't increase CSeq number when resending message
(INVITE) with credentials. I'm trying to authenticate
to asterisk and in case of asterisk it immediately replies
"503 Service Unavailable" if it receives INVITE with the same CSeq.
I thought it could be asterisk-specific problem, but RFC3261 in
section "8.1.3.5 Processing 4xx Responses" says:
"new request constitutes a new transaction and SHOULD have the same
value of the Call-ID, To, and From of the previous request, but the CSeq
should contain a new sequence number that is one higher than the previous."
So I guess this is not an asterisk-specific.
It is my understanding that in order for this to work ser must increment
CSeq when authenticating to UAS, but decrement CSeq in all subsequent
in-dialog messages that will be sent to call originator including BYEs.
This, in turn, requires for ser to be call-statefull which is not the case.
Conclusion: uac authentication in ser is not possible.
Please correct me if I'm wrong (I honestly want to be wrong on this matter:))
Thank you,
Michael
On Sunday 15 May 2005 12:36 am, you wrote:
> Michael Ulitskiy wrote:
>
> >Hello,
> >
> >Has anyone succeeded in getting UAC authentication to work?
> >I'm doing the following:
> >
> >route {
> > resetflag(1);
> > t_on_failure("1");
> > route(1);
> >}
> >
> >route[1]
> >{
> > if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)") {
> > sl_send_reply("479", "We don't forward to private IP addresses");
> > break;
> > };
> > if (!t_relay()) {
> > sl_reply_error();
> > };
> >}
> >
> >failure_route[1] {
> > # authentication reply received?
> > if ( t_check_status("401|407") ) {
> > if (!isflagset(1) && uac_auth()) {
> > setflag(1);
> > t_on_failure("1");
> > append_branch();
> > route(1);
> > } else {
> > t_reply("500","Error occurred");
> > }
> > break;
> > }
> >
> >}
> >
> >When uac_auth() is called I get the following in the:
> > 0(28973) DEBUG:uac:uac_auth: picked reply is (nil), code 407
> > 0(28973) BUG:uac:uac_auth: empty reply on picked branch
> >
> >Any suggestions or ideas?
> >Thank you,
> >
> >Michael
> >
> >
> >
> I am also getting same thing with different msg ..
> BUG:uac:uac_auth: empty reply on picked branch
>
> Anybody know how to overcome this?
>
> Mohammad
>
>
Actually those were incredibly useful. Thank you.
Now, when I compile my module I am getting the following error message:
16:18:13 root#proxy2:/usr/local/src/ser-0.9.0/modules/radius_cache>gcc
-c -o radius_cache.o radius_cache.c
In file included from radius_cache.c:46:
radius_cache.h:58: `NAME' undeclared here (not in a function)
radius_cache.h:58: syntax error before string constant
radius_cache.h:62: warning: initialization from incompatible pointer type
I'm not sure what to do about that. It seems to be something internal
and specific to MODULE_VERSION in the SER header.
My module:
http://www.rafb.net/paste/results/N0uQyJ91.html
My module's header file:
http://www.rafb.net/paste/results/vo3vG345.html
Thanks for the help.
-Daniel
On 5/23/05, Samuel Osorio Calvo <samuel.osorio(a)nl.thalesgroup.com> wrote:
> There's a simple module, called print that is meant to be mainly an
> example. So I recommend you to take a look at its interface and to start
> from there your module.
> I attacht also several files that a little bit old but still they are
> really useful.
>
> Luck!
>
> Samuel.
>
>
> Unclassified.
> >>> Daniel Corbe <daniel.junkmail(a)gmail.com> 05/22/05 10:41PM >>>
> Here's another question:
>
> I got my module to compile by taking _init out and reworking the
> initalization of the module into something else.
>
> Now when SER loads I get:
>
> May 22 21:34:00 proxy2 ser: ERROR: no version info in module
> </usr/local/lib/ser/modules/radius_cache.so>: Undefined symbol
> "module_version"
>
> What is module_version? How do I define it?
>
> Thanks.
>
> -Daniel
>
>
> On 5/22/05, Daniel Corbe <daniel.junkmail(a)gmail.com> wrote:
> > Hello,
> >
> > I have a SER module which I've written in C and I'm trying to
> compile.
> > When I compile it I get this error:
> >
> > 20:53:24
> root#proxy2:/usr/local/src/ser-0.9.0/modules/radius_cache>gcc
> > -shared -o radius_cache.so radius_cache.o
> > radius_cache.o: In function `_init':
> > radius_cache.o(.text+0x0): multiple definition of `_init'
> > /usr/lib/crti.o(.init+0x0): first defined here
> >
> > Is there something else in SER that exports _init already?
> >
> > Thanks.
> >
> > -Daniel
> >
>
> _______________________________________________
> Serusers mailing list
> serusers(a)lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers
>
>
>
Hello,
I have a SER module which I've written in C and I'm trying to compile.
When I compile it I get this error:
20:53:24 root#proxy2:/usr/local/src/ser-0.9.0/modules/radius_cache>gcc
-shared -o radius_cache.so radius_cache.o
radius_cache.o: In function `_init':
radius_cache.o(.text+0x0): multiple definition of `_init'
/usr/lib/crti.o(.init+0x0): first defined here
Is there something else in SER that exports _init already?
Thanks.
-Daniel