[Users] TCP socket problem

Klaus Darilion klaus.mailinglists at pernau.at
Tue Aug 16 18:29:35 CEST 2005

My server configuration:
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0B:DB:90:FA:3F
           inet addr:x.x.32.80  Bcast:x.x.32.127

eth0:3    Link encap:Ethernet  HWaddr 00:0B:DB:90:FA:3F
           inet addr:x.x.32.83  Bcast:x.x.32.127

eth0 .80 is the default interface, openser listens on .83
This is done by putting
into openser.cfg

openser binds to .83, verified by # netstat -anp|grep 5060
tcp 0 0 x.x.32.83:5060*  LISTEN     1390/openser
udp 0 0 x.x.32.83:5060*             1390/openser

Then I forwarded a message to a GW using TCP (lcr + t_relay):
(without force_send_socket)

  DEBUG: reply sent out. buf=0x8134330: SIP/2.0 1..., shmem=0x40680a90: 
SIP/2.0 1
  DEBUG: _reply_light: finished
  DEBUG: mk_proxy: doing DNS lookup...
  build_req_from_req: id added: <;i=1>, rcv proto=2
  parse_headers: flags=1000
  parse_headers: flags=1000
  parse_headers: flags=ffffffffffffffff
  clen_builder: content-length: 290 (290)
  check_via_address(x.x.33.3,, 0)
  tcp_send: no open tcp connection found, opening new one
  ERROR: tcp_blocking_connect: SO_ERROR (113) No route to host
  ERROR: tcpconn_connect: tcp_blocking_connect failed
  ERROR: tcp_send: connect failed
  msg_send: ERROR: tcp_send failed
  ERROR: t_forward_nonack: sending request failed

tcp_blocking_connect fails (the error message is a little bit misleading 
and caused by an ICMP error), as the GW accepts SIP only from .83, and 
not from .80: In the following tcpdump you see that openser tries to 
establish the TCP connection from .80 instead of .83:

IP x.x.32.80.41580 > x.x.33.4.5060: S
IP x.x.33.4 > x.x.32.80: icmp 36: host x.x.33.4 unreachable - admin 
prohibited filter

Any hints are appreciated.

Conclusion: openser sends .80 although it is bound to .83.


Bogdan-Andrei Iancu wrote:
> Hi Klaus,
> not sure what you mean by "default interface", but here are some facts 
> after digging thought the code:
> 1) when doing normal fwd (no force) on tcp, it will be used the first 
> TCP socket from the listen list; there is a funny comment from Andrei in 
> get_send_socket() function "on tcp just use the "main address", we don't 
> really now the sending address (we can find it out, but we'll need also 
> to see if we listen on it, and if yes on which port -> too complicated"
> 2) if force_send_socket is used on tcp...depends.... do you get the 
> debug message:
>        "get_send_socket: force_send_socket of different proto(1)!"  ??
>    are you using t_relay() after??
>    what are the listening interfaces (all, udp and tcp)?
> regards,
> bogdan
> Klaus Darilion wrote:
>> Hi!
>> I've configured openser to listen on a ceratin IP address.
>>   listen=83.xxx.32.83:5060
>> Nevertheless, if t_relay tries to sned via TCP, openser opens the TCP 
>> connection from the default interface.
>> I also tried
>>   force_send_socket(tcp:83.xxx.32.83:5060);
>> with the same results.
>> Are there any known problems? IMO openser should always use the IP 
>> address on which it listens.
>> regards
>> klaus
>> _______________________________________________
>> Users mailing list
>> Users at openser.org
>> http://openser.org/cgi-bin/mailman/listinfo/users

More information about the sr-users mailing list