#### Pre-Submission Checklist
<!-- Go over all points below, and after creating the PR, tick all the checkboxes
that apply -->
<!-- All points should be verified, otherwise, read the CONTRIBUTING guidelines
from above-->
<!-- If you're unsure about any of these, don't hesitate to ask on
sr-dev mailing list -->
- [X] Commit message has the format required by CONTRIBUTING guide
- [X] Commits are split per component (core, individual modules, libs, utils, ...)
- [X] Each component has a single commit (if not, squash them into one commit)
- [X] No commits to README files for modules (changes must be done to docbook files
in `doc/` subfolder, the README file is autogenerated)
#### Type Of Change
- [X] Small bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds new functionality)
- [ ] Breaking change (fix or feature that would change existing functionality)
#### Checklist:
<!-- Go over all points below, and after creating the PR, tick the checkboxes that
apply -->
- [ ] PR should be backported to stable branches
- [X] Tested changes locally
- [ ] Related to issue #XXXX (replace XXXX with an open issue number)
#### Description
<!-- Describe your changes in detail -->
It has been noticed, that after a list of contributions into lcr:
* 14e6fc80b3d2389567c73c4a2196bf8e6d92d8d2
* d8583d6ce1748c1ac8494616fced507b01dd4375
* 470fd5b8bedca56efcc5e6aa0225089fe3857ac9
* aa8d3ed4fe20efbd22db3b0b01a655789afa8818
the gateways matching when a search is being done based on
the IP address and the src_port (through the array of GWs **with the same IP**)
works, but not fully correct.
It is only related to the usage with the third parameter 'src_port',
when calling from_gw() and from_any_gw(), and, only when the search
is done through the gateways array, which have **the same IP address**
,but different ports (let's say one has 30 GWs with the same IP in the lcr_gw).
If gateways have different IPs, the issue is not catchable.
The problem is in the algorithm used for matching based on
two objects (ip_addr and src_port) - the binary search.
It's not fully suitable for a search based on two (or more) objects.
The binary works completely fine, when only one object is used for searching,
but works not fully correct when the search is based on a comparison
of two (or more) objects. A division happening based on the value of
the first object, gives a chance that the second object will never
be found in the current half being looked up.
This commit concerns switching to a full cycling through the array of
gateways of the same lcr_id, and gives a proper work of the do_from_gw().
The slight drawback of the new method is that we have to do a cycling
through the whole array of GWs **of the same lcr_id**, but on the other hand
it is much more efficient than trying to build up a matching using binary search
based on two objects (ip_addr and src_port) being used for comparison.
If we had to build this using bsearch() as well, then we would have to:
- first prepare a sorted array of the gateways with the same IP (sorted in terms of
ports)
,which already means with have to go through the whole GWs array to catch all needed GWs
;
- do a bsearch() based on src_port only (using previously prepared sorted array) ;
Which looks similar **to the full cycling** in terms of CPU resource consumption.
You can view, comment on, or merge this pull request online at:
https://github.com/kamailio/kamailio/pull/2876
-- Commit Summary --
* <a
href="https://github.com/kamailio/kamailio/pull/2876/commits/7f02e8962…">lcr:
improve the search for GW when both IP address and src_port are used</a>
-- File Changes --
M src/modules/lcr/lcr_mod.c (39)
-- Patch Links --
https://github.com/kamailio/kamailio/pull/2876.patch
https://github.com/kamailio/kamailio/pull/2876.diff
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/pull/2876