Marius Zbihlei wrote:
As I see in sip-router and in kamailio, the mhomed
implementation is
very very slow . For each SIP packet a
temporary socket is created, connected to the remote host and than
checked to see what interface was selected
to connect the socket(see method get_out_socket() in forward.c)
As test have shown, this implementation, albeit correct from a funtional
point of view, it's really too slow
(or too expensive) to be used in medium-large production setups.
Just some ideas ....
Routing tables usually do not change that often. thus, hat about manual
configuration? e.g.:
routing=0.0.0.0/0:eth0
routing=192.168.1.0/24:eth1
routing=192.168.2.0/24:eth1
routing=192.168.3.0/24:eth1
routing=1.2.3.0/16:eth2
or similar ....
(Idea stolen from Asterisk's externip & localnet settings)
regards
klaus
I am currently working on a patch that mitigates this problem. The way
the patch works is like this:
1. Get the routing table from the kernel via NETLINK sockets(done at start)
2. Construct a link list of routes, each entry for one interface(either
real of virtual). The structure will hold
the address of the interface and the destination (as reported by route
-n)(this will be a CIDR entry). Also it's
decided if on that interface a default route has been assigned(done at
start)
3. get_out_socket() will be changed to loop thru the list described
above and decide based on the destination member
of the struct describe above on what interface the packet is to be
routed. If no destination is matched than the
default one is selected.(done for each packet)
4.A NETLINK socket will be added to the poll()ing loop so it can monitor
the changes in the kernel's routing table
and update the internal structure if necessary.(done at start)(The table
is updated only if administration changes the
routing table via route or ip route commands)
I have implemented the first 3 steps and preliminary tests look ok. step
for is required only if we want updates on
the routing table in real time.
Limitations:
1. This only works for Linux, AF_INET sockets. AF_INET6 is also
supported but i don't know to what extent
2. For BSD, route sockets should replace the NETLINK sockets
What are your suggestion about this? Should this patch (when completely
finished) be commited?
Thanks for any suggestions!
Marius.
------------------------------------------------------------------------
_______________________________________________
sr-dev mailing list
sr-dev(a)lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev