<h4 dir="auto">Pre-Submission Checklist</h4>



<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> Commit message has the format required by CONTRIBUTING guide</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> Commits are split per component (core, individual modules, libs, utils, ...)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> Each component has a single commit (if not, squash them into one commit)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> No commits to README files for modules (changes must be done to docbook files<br>
in <code class="notranslate">doc/</code> subfolder, the README file is autogenerated)</li>
</ul>
<h4 dir="auto">Type Of Change</h4>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Small bug fix (non-breaking change which fixes an issue)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> New feature (non-breaking change which adds new functionality)</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Breaking change (fix or feature that would change existing functionality)</li>
</ul>
<h4 dir="auto">Checklist:</h4>

<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> PR should be backported to stable branches</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> Tested changes locally</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> Related to issue #XXXX (replace XXXX with an open issue number)</li>
</ul>
<h4 dir="auto">Description</h4>

<p dir="auto">Ported all carrierroute module functions to KEMI API.</p>
<p dir="auto">Here is an example,</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="...
    # User location service
    def ksr_route_location(self, msg):
        if KSR.pv.get("$rm") == "INVITE" and KSR.carrierroute.cr_user_carrier("$fU", "$fd", "$avp(carrier)") > 0:
            if KSR.pv.get("$rm") == "INVITE" and KSR.carrierroute.cr_route("$avp(carrier)","$avp(domain)","$rU","$rU","call_id") > 0:
                KSR.info('Routing call via user carrier route\n')
                self.ksr_route_relay(msg)

        rc = KSR.registrar.lookup("location")
        if rc < 0:
            KSR.tm.t_newtran()
            if rc == -1 or rc == -3:
                KSR.sl.send_reply(404, "Not Found")
                return -255
            elif rc == -2:
                KSR.sl.send_reply(405, "Method Not Allowed")
                return -255

        # when routing via usrloc, log the missed calls also
        if KSR.is_INVITE() :
            KSR.setflag(FLT_ACCMISSED)

        self.ksr_route_relay(msg)
        return -255
..."><pre>...
    <span class="pl-c"># User location service</span>
    <span class="pl-k">def</span> <span class="pl-en">ksr_route_location</span>(<span class="pl-s1">self</span>, <span class="pl-s1">msg</span>):
        <span class="pl-k">if</span> <span class="pl-v">KSR</span>.<span class="pl-s1">pv</span>.<span class="pl-en">get</span>(<span class="pl-s">"$rm"</span>) <span class="pl-c1">==</span> <span class="pl-s">"INVITE"</span> <span class="pl-c1">and</span> <span class="pl-v">KSR</span>.<span class="pl-s1">carrierroute</span>.<span class="pl-en">cr_user_carrier</span>(<span class="pl-s">"$fU"</span>, <span class="pl-s">"$fd"</span>, <span class="pl-s">"$avp(carrier)"</span>) <span class="pl-c1">></span> <span class="pl-c1">0</span>:
            <span class="pl-k">if</span> <span class="pl-v">KSR</span>.<span class="pl-s1">pv</span>.<span class="pl-en">get</span>(<span class="pl-s">"$rm"</span>) <span class="pl-c1">==</span> <span class="pl-s">"INVITE"</span> <span class="pl-c1">and</span> <span class="pl-v">KSR</span>.<span class="pl-s1">carrierroute</span>.<span class="pl-en">cr_route</span>(<span class="pl-s">"$avp(carrier)"</span>,<span class="pl-s">"$avp(domain)"</span>,<span class="pl-s">"$rU"</span>,<span class="pl-s">"$rU"</span>,<span class="pl-s">"call_id"</span>) <span class="pl-c1">></span> <span class="pl-c1">0</span>:
                <span class="pl-v">KSR</span>.<span class="pl-en">info</span>(<span class="pl-s">'Routing call via user carrier route<span class="pl-cce">\n</span>'</span>)
                <span class="pl-s1">self</span>.<span class="pl-en">ksr_route_relay</span>(<span class="pl-s1">msg</span>)

        <span class="pl-s1">rc</span> <span class="pl-c1">=</span> <span class="pl-v">KSR</span>.<span class="pl-s1">registrar</span>.<span class="pl-en">lookup</span>(<span class="pl-s">"location"</span>)
        <span class="pl-k">if</span> <span class="pl-s1">rc</span> <span class="pl-c1"><</span> <span class="pl-c1">0</span>:
            <span class="pl-v">KSR</span>.<span class="pl-s1">tm</span>.<span class="pl-en">t_newtran</span>()
            <span class="pl-k">if</span> <span class="pl-s1">rc</span> <span class="pl-c1">==</span> <span class="pl-c1">-</span><span class="pl-c1">1</span> <span class="pl-c1">or</span> <span class="pl-s1">rc</span> <span class="pl-c1">==</span> <span class="pl-c1">-</span><span class="pl-c1">3</span>:
                <span class="pl-v">KSR</span>.<span class="pl-s1">sl</span>.<span class="pl-en">send_reply</span>(<span class="pl-c1">404</span>, <span class="pl-s">"Not Found"</span>)
                <span class="pl-k">return</span> <span class="pl-c1">-</span><span class="pl-c1">255</span>
            <span class="pl-k">elif</span> <span class="pl-s1">rc</span> <span class="pl-c1">==</span> <span class="pl-c1">-</span><span class="pl-c1">2</span>:
                <span class="pl-v">KSR</span>.<span class="pl-s1">sl</span>.<span class="pl-en">send_reply</span>(<span class="pl-c1">405</span>, <span class="pl-s">"Method Not Allowed"</span>)
                <span class="pl-k">return</span> <span class="pl-c1">-</span><span class="pl-c1">255</span>

        <span class="pl-c"># when routing via usrloc, log the missed calls also</span>
        <span class="pl-k">if</span> <span class="pl-v">KSR</span>.<span class="pl-en">is_INVITE</span>() :
            <span class="pl-v">KSR</span>.<span class="pl-en">setflag</span>(<span class="pl-v">FLT_ACCMISSED</span>)

        <span class="pl-s1">self</span>.<span class="pl-en">ksr_route_relay</span>(<span class="pl-s1">msg</span>)
        <span class="pl-k">return</span> <span class="pl-c1">-</span><span class="pl-c1">255</span>
...</pre></div>

<hr>

<h4>You can view, comment on, or merge this pull request online at:</h4>
<p>  <a href='https://github.com/kamailio/kamailio/pull/3247'>https://github.com/kamailio/kamailio/pull/3247</a></p>

<h4>Commit Summary</h4>
<ul>
  <li><a href="https://github.com/kamailio/kamailio/pull/3247/commits/e72511b423897f2a415405ae11d7245fc129e6aa" class="commit-link">e72511b</a>  KEMI API implementation for carrierroute module</li>
</ul>

<h4 style="display: inline-block">File Changes </h4> <p style="display: inline-block">(<a href="https://github.com/kamailio/kamailio/pull/3247/files">6 files</a>)</p>
<ul>
  <li>
    <strong>M</strong>
    <a href="https://github.com/kamailio/kamailio/pull/3247/files#diff-a2d9abee19523952d7ada634200cd4832c5f051e4cdd485bec9ee72fcf9cd52d">src/modules/carrierroute/carrierroute.c</a>
    (50)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/kamailio/kamailio/pull/3247/files#diff-465a0466b8c9f0a0f50923eb2f9a08741ab78ea15f0baa937ef8b8c002bac32f">src/modules/carrierroute/carrierroute.h</a>
    (1)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/kamailio/kamailio/pull/3247/files#diff-940907f0b41530ce0ed19387a12f7ed81ca45d71c41f53a85554bafeeee4f057">src/modules/carrierroute/cr_func.c</a>
    (260)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/kamailio/kamailio/pull/3247/files#diff-1d17e26eb6f1daace6c3c62b01cc8d653a19c1fcd8269c7f27aa14af4839676f">src/modules/carrierroute/cr_func.h</a>
    (63)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/kamailio/kamailio/pull/3247/files#diff-4de867c9f327ba2d560121b4583e2a5f6f75ea4ff3480f8b32cc6fa12e6ebe62">src/modules/carrierroute/cr_kemi.c</a>
    (199)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/kamailio/kamailio/pull/3247/files#diff-17baf5c3b6cda02264c761ba2aa6165538edf3b2cccdc989aee53f1c1cec1712">src/modules/carrierroute/cr_kemi.h</a>
    (119)
  </li>
</ul>

<h4>Patch Links:</h4>
<ul>
  <li><a href='https://github.com/kamailio/kamailio/pull/3247.patch'>https://github.com/kamailio/kamailio/pull/3247.patch</a></li>
  <li><a href='https://github.com/kamailio/kamailio/pull/3247.diff'>https://github.com/kamailio/kamailio/pull/3247.diff</a></li>
</ul>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />Reply to this email directly, <a href="https://github.com/kamailio/kamailio/pull/3247">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/ABO7UZKEEY2QATLNCYCOX3LV7GPRVANCNFSM6AAAAAAQQ7SOMU">unsubscribe</a>.<br />You are receiving this because you are subscribed to this thread.<img src="https://github.com/notifications/beacon/ABO7UZO7DGM3JSKF3TVA22TV7GPRVA5CNFSM6AAAAAAQQ7SOMWWGG33NNVSW45C7OR4XAZNFJFZXG5LFVJRW63LNMVXHIX3JMTHFENRLW4.gif" height="1" width="1" alt="" /><span style="color: transparent; font-size: 0; display: none; visibility: hidden; overflow: hidden; opacity: 0; width: 0; height: 0; max-width: 0; max-height: 0; mso-hide: all">Message ID: <span><kamailio/kamailio/pull/3247</span><span>@</span><span>github</span><span>.</span><span>com></span></span></p>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/kamailio/kamailio/pull/3247",
"url": "https://github.com/kamailio/kamailio/pull/3247",
"name": "View Pull Request"
},
"description": "View this Pull Request on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>