diff --git a/404.html b/404.html index aa9c025ba..66c6dcb91 100644 --- a/404.html +++ b/404.html @@ -10,7 +10,7 @@ - +
diff --git a/assets/js/35bee977.e12c0329.js b/assets/js/35bee977.4e13b84b.js similarity index 99% rename from assets/js/35bee977.e12c0329.js rename to assets/js/35bee977.4e13b84b.js index 7962ce201..a7426ee60 100644 --- a/assets/js/35bee977.e12c0329.js +++ b/assets/js/35bee977.4e13b84b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1304],{5644:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});var s=i(4848),o=i(8453);const t={sidebar_position:2},r="Concepts",a={id:"concepts",title:"Concepts",description:"The following are some key concepts, including some of the essential routing strategies implemented in Routr.",source:"@site/versioned_docs/version-1.x.x/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/docs/1.x.x/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/concepts.md",tags:[],version:"1.x.x",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"},next:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"}},l={},c=[{value:"Intra-Domain Routing",id:"intra-domain-routing",level:2},{value:"Double Agents",id:"double-agents",level:3},{value:"Single Domain Example",id:"single-domain-example",level:3},{value:"Domain Ingress Routing",id:"domain-ingress-routing",level:2},{value:"Domain Egress Routing",id:"domain-egress-routing",level:2},{value:"Peers Routing",id:"peers-routing",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,s.jsx)(n.p,{children:"The following are some key concepts, including some of the essential routing strategies implemented in Routr."}),"\n",(0,s.jsx)(n.h2,{id:"intra-domain-routing",children:"Intra-Domain Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Intra-Domain Routing(IDR)"})," offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not."]}),"\n",(0,s.jsxs)(n.p,{children:["For a small company with less than 50 users, you may define a domain ",(0,s.jsx)(n.code,{children:"sip.domain.com"}),". Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames."]}),"\n",(0,s.jsxs)(n.p,{children:["A multinational company like ",(0,s.jsx)(n.em,{children:"Walmart"})," have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains ",(0,s.jsx)(n.code,{children:"sip.0001.walmart.com"})," and ",(0,s.jsx)(n.code,{children:"sip.0002.walmart.com"}),", and... you get the idea."]}),"\n",(0,s.jsx)(n.h3,{id:"double-agents",children:"Double Agents"}),"\n",(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/wiki/fonoster/routr/images/double_agent.png",width:"400"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsxs)(n.p,{children:["Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's ",(0,s.jsx)(n.code,{children:"spec.domain[*]"})," list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain."]}),"\n",(0,s.jsx)(n.h3,{id:"single-domain-example",children:"Single Domain Example"}),"\n",(0,s.jsx)(n.p,{children:"The following yaml configuration shows a simple setup, involving one Domain and two Agents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n- kind: Agent\n apiVersion: v1beta1\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: janie\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsx)(n.p,{children:'Voila! That\'s all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["To configure your sip devices use the information found in ",(0,s.jsx)(n.code,{children:"config/agents.yml"}),". Also, you must use the Host/IP of Routr server as\nthe OUTBOUND PROXY of your sip device."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"The following rules apply to Intra-Domain Routing:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Agents can only call other Agents in the same Domain"}),"\n",(0,s.jsx)(n.li,{children:"Agents must belong to a Domain"}),"\n",(0,s.jsxs)(n.li,{children:["Agents Are not allowed to send a Digest username different than the username in the ",(0,s.jsx)(n.code,{children:"From-Header"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"domain-ingress-routing",children:"Domain Ingress Routing"}),"\n",(0,s.jsxs)(n.p,{children:["In Routr, the process of receiving a call from PSTN to a Domain is as ",(0,s.jsx)(n.em,{children:"Domain Ingress Routing(DIR)"})," and it is done using a Gateway resource. The yaml file ",(0,s.jsx)(n.code,{children:"config/gateways.yml"})," contains the Gateways. The following example shows a typical Gateway configuration."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Plain Old Phone Service Provider\n spec:\n regService:\n host: sip.provider.net\n credentials:\n username: 'gwuser'\n secret: gwsecret\n transport: udp\n registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network\n"})}),"\n",(0,s.jsx)(n.p,{children:"You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected."}),"\n",(0,s.jsx)(n.p,{children:"Please examine the following example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: dd50baa4\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUri: 'tel:17066041487'\n aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in\n"})}),"\n",(0,s.jsx)(n.p,{children:'Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"spec.location"})," block of a ",(0,s.jsx)(n.code,{children:"Number"})," resource configuration, determines the path of an inbound call from the PSTN. The ",(0,s.jsx)(n.code,{children:"aorLink"})," refers to an Address of Record(Agent or Peer) that is available in the ",(0,s.jsx)(n.code,{children:"location service"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"domain-egress-routing",children:"Domain Egress Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Domain Egress Routing(DER)"})," is the way that ",(0,s.jsx)(n.strong,{children:"Routr"})," deals with a call request to a ",(0,s.jsx)(n.em,{children:"callee"})," that exists in the Public Switched Telephone Network(PSTN) and not in the ",(0,s.jsx)(n.em,{children:"callers'"})," Domain. The EgressPolicy consists of a ",(0,s.jsx)(n.code,{children:"rule"}),", and a ",(0,s.jsx)(n.code,{children:"numberRef"})," defined in the ",(0,s.jsx)(n.code,{children:"spec.context"})," section of ",(0,s.jsx)(n.code,{children:"Domains"})," resources."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"rule"})," and ",(0,s.jsx)(n.code,{children:"numberRef"})," is defined as follows:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rule"})," is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"numberRef"})," is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["Agents can only perform outbound calls using the ",(0,s.jsx)(n.code,{children:"Egress Policy"})," of their Domains."]}),"\n",(0,s.jsx)(n.h2,{id:"peers-routing",children:"Peers Routing"}),"\n",(0,s.jsx)(n.p,{children:"Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling."}),"\n",(0,s.jsxs)(n.p,{children:["Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the ",(0,s.jsx)(n.em,{children:"Location Service"})," just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent."]}),"\n",(0,s.jsxs)(n.p,{children:["The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the ",(0,s.jsx)(n.code,{children:"spec.location"})," settings in the ",(0,s.jsx)(n.code,{children:"numbers.yml"})," configuration file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"Agents are not allowed to call Peers."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["A future version of the ",(0,s.jsx)(n.code,{children:"Peer resource"})," might feature a ",(0,s.jsx)(n.code,{children:"spec.acceptFrom.*"})," field to allow calls from Domains or specific Agents."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1304],{5644:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});var s=i(4848),o=i(8453);const t={sidebar_position:2},r="Concepts",a={id:"concepts",title:"Concepts",description:"The following are some key concepts, including some of the essential routing strategies implemented in Routr.",source:"@site/versioned_docs/version-1.x.x/concepts.md",sourceDirName:".",slug:"/concepts",permalink:"/docs/1.x.x/concepts",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/versioned_docs/version-1.x.x/concepts.md",tags:[],version:"1.x.x",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Test Plan",permalink:"/docs/1.x.x/introduction/test-plan"},next:{title:"Cheatsheet",permalink:"/docs/1.x.x/administration/cli/cheatsheet"}},l={},c=[{value:"Intra-Domain Routing",id:"intra-domain-routing",level:2},{value:"Double Agents",id:"double-agents",level:3},{value:"Single Domain Example",id:"single-domain-example",level:3},{value:"Domain Ingress Routing",id:"domain-ingress-routing",level:2},{value:"Domain Egress Routing",id:"domain-egress-routing",level:2},{value:"Peers Routing",id:"peers-routing",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"concepts",children:"Concepts"}),"\n",(0,s.jsx)(n.p,{children:"The following are some key concepts, including some of the essential routing strategies implemented in Routr."}),"\n",(0,s.jsx)(n.h2,{id:"intra-domain-routing",children:"Intra-Domain Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Intra-Domain Routing(IDR)"})," offers a mechanism for user segmentation. For a small or medium size company, a single domain may be sufficient, but for a multinational or an IP telephony service provider, it may not."]}),"\n",(0,s.jsxs)(n.p,{children:["For a small company with less than 50 users, you may define a domain ",(0,s.jsx)(n.code,{children:"sip.domain.com"}),". Regardless of how many offices they have, the chances are that they still need to communicate with each other, and therefore we keep them in the same Domain. Needless to say, that in a company this size you are not going to run out usernames."]}),"\n",(0,s.jsxs)(n.p,{children:["A multinational company like ",(0,s.jsx)(n.em,{children:"Walmart"})," have thousands of stores that operate independently. In such a case, you need a multi-domain setting. For example, you may define the domains ",(0,s.jsx)(n.code,{children:"sip.0001.walmart.com"})," and ",(0,s.jsx)(n.code,{children:"sip.0002.walmart.com"}),", and... you get the idea."]}),"\n",(0,s.jsx)(n.h3,{id:"double-agents",children:"Double Agents"}),"\n",(0,s.jsx)("img",{src:"https://raw.githubusercontent.com/wiki/fonoster/routr/images/double_agent.png",width:"400"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsxs)(n.p,{children:["Yes, you can have double Agents, or Agents that exist in a multi-domain setup. For this to work, you need to do is include the Domain in the Agent's ",(0,s.jsx)(n.code,{children:"spec.domain[*]"})," list. In the example before, John can send or receive calls from both domains, while the rest of the Agents are only allowed to call within the Domain."]}),"\n",(0,s.jsx)(n.h3,{id:"single-domain-example",children:"Single Domain Example"}),"\n",(0,s.jsx)(n.p,{children:"The following yaml configuration shows a simple setup, involving one Domain and two Agents:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Domain configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Domain\n metadata:\n name: Local Office\n spec:\n context:\n domainUri: sip.local\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Agents configuration"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Agent\n metadata:\n name: John Doe\n spec:\n credentials:\n username: john\n secret: '1234'\n domains: [sip.local]\n- kind: Agent\n apiVersion: v1beta1\n metadata:\n name: Janie Doe\n spec:\n credentials:\n username: janie\n secret: '1234'\n domains: [sip.local]\n"})}),"\n",(0,s.jsx)(n.p,{children:'Voila! That\'s all the configuration you need for intra-domain communication. For calls outside the Domain, see "Domain Egress Routing" section and to receive calls from the PSTN check section "Domain Ingress Routing."'}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["To configure your sip devices use the information found in ",(0,s.jsx)(n.code,{children:"config/agents.yml"}),". Also, you must use the Host/IP of Routr server as\nthe OUTBOUND PROXY of your sip device."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"The following rules apply to Intra-Domain Routing:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Agents can only call other Agents in the same Domain"}),"\n",(0,s.jsx)(n.li,{children:"Agents must belong to a Domain"}),"\n",(0,s.jsxs)(n.li,{children:["Agents Are not allowed to send a Digest username different than the username in the ",(0,s.jsx)(n.code,{children:"From-Header"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"domain-ingress-routing",children:"Domain Ingress Routing"}),"\n",(0,s.jsxs)(n.p,{children:["In Routr, the process of receiving a call from PSTN to a Domain is as ",(0,s.jsx)(n.em,{children:"Domain Ingress Routing(DIR)"})," and it is done using a Gateway resource. The yaml file ",(0,s.jsx)(n.code,{children:"config/gateways.yml"})," contains the Gateways. The following example shows a typical Gateway configuration."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Gateway\n metadata:\n name: Plain Old Phone Service Provider\n spec:\n regService:\n host: sip.provider.net\n credentials:\n username: 'gwuser'\n secret: gwsecret\n transport: udp\n registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network\n"})}),"\n",(0,s.jsx)(n.p,{children:"You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected."}),"\n",(0,s.jsx)(n.p,{children:"Please examine the following example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"- apiVersion: v1beta1\n kind: Number\n metadata:\n gwRef: dd50baa4\n geoInfo:\n city: Columbus, GA\n country: USA\n countryISOCode: US\n spec:\n location:\n telUrl: 'tel:17066041487'\n aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in\n"})}),"\n",(0,s.jsx)(n.p,{children:'Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.'}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"spec.location"})," block of a ",(0,s.jsx)(n.code,{children:"Number"})," resource configuration, determines the path of an inbound call from the PSTN. The ",(0,s.jsx)(n.code,{children:"aorLink"})," refers to an Address of Record(Agent or Peer) that is available in the ",(0,s.jsx)(n.code,{children:"location service"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"domain-egress-routing",children:"Domain Egress Routing"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.em,{children:"Domain Egress Routing(DER)"})," is the way that ",(0,s.jsx)(n.strong,{children:"Routr"})," deals with a call request to a ",(0,s.jsx)(n.em,{children:"callee"})," that exists in the Public Switched Telephone Network(PSTN) and not in the ",(0,s.jsx)(n.em,{children:"callers'"})," Domain. The EgressPolicy consists of a ",(0,s.jsx)(n.code,{children:"rule"}),", and a ",(0,s.jsx)(n.code,{children:"numberRef"})," defined in the ",(0,s.jsx)(n.code,{children:"spec.context"})," section of ",(0,s.jsx)(n.code,{children:"Domains"})," resources."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"rule"})," and ",(0,s.jsx)(n.code,{children:"numberRef"})," is defined as follows:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"rule"})," is a regex to match callee in the call request. The location service uses this only after a search in the caller's Domain first."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"numberRef"})," is the identifier of the Number that will to route the call. The Number must already exist and have a parent Gateway."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsxs)(n.p,{children:["Agents can only perform outbound calls using the ",(0,s.jsx)(n.code,{children:"Egress Policy"})," of their Domains."]}),"\n",(0,s.jsx)(n.h2,{id:"peers-routing",children:"Peers Routing"}),"\n",(0,s.jsx)(n.p,{children:"Peers are very similar to Agents, but they are not bound to any Domain, and usually, collocated in the same network with Routr. A typical case is peering with Asterisk, where Asterisk acts as a Media Server and Routr provides the signaling."}),"\n",(0,s.jsxs)(n.p,{children:["Peers can perform inbound/outbound signaling within the network without any special consideration since they exist inside the ",(0,s.jsx)(n.em,{children:"Location Service"})," just like Agents. So it is possible to perform signaling from Peer to Peer, Peer to Agent."]}),"\n",(0,s.jsxs)(n.p,{children:["The same is true for Inbound from the PSTN. For example, we can redirect incoming calls from the PSTN using the ",(0,s.jsx)(n.code,{children:"spec.location"})," settings in the ",(0,s.jsx)(n.code,{children:"numbers.yml"})," configuration file."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Routing Rules"})}),"\n",(0,s.jsx)(n.p,{children:"Agents are not allowed to call Peers."}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["A future version of the ",(0,s.jsx)(n.code,{children:"Peer resource"})," might feature a ",(0,s.jsx)(n.code,{children:"spec.acceptFrom.*"})," field to allow calls from Domains or specific Agents."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var s=i(6540);const o={},t=s.createContext(o);function r(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.e9a97635.js b/assets/js/runtime~main.890c7b2a.js similarity index 98% rename from assets/js/runtime~main.e9a97635.js rename to assets/js/runtime~main.890c7b2a.js index e4eedee7f..557c8d43a 100644 --- a/assets/js/runtime~main.e9a97635.js +++ b/assets/js/runtime~main.890c7b2a.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,d,f,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(a,d,f,c)=>{if(!d){var b=1/0;for(i=0;i- apiVersion: v1beta1
kind: Gateway
metadata:
name: Plain Old Phone Service Provider
spec:
regService:
host: sip.provider.net
credentials:
username: 'gwuser'
secret: gwsecret
transport: udp
registries: [sip.nyc.provider.net] # These are additional registrars within the provider's network
You also need to define Numbers. Routr uses the Address Of Record(AOR) to routes incoming calls from a Number to an existing Agent or Peer. The AOR must be available in the location service at the time of the call, or the call gets rejected.
Please examine the following example:
-- apiVersion: v1beta1
kind: Number
metadata:
gwRef: dd50baa4
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUri: 'tel:17066041487'
aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in
- apiVersion: v1beta1
kind: Number
metadata:
gwRef: dd50baa4
geoInfo:
city: Columbus, GA
country: USA
countryISOCode: US
spec:
location:
telUrl: 'tel:17066041487'
aorLink: 'sip:john@sip.local' # This is the sip uri of an agent that is expected to be logged in
Easy right? Any incoming call is routed from this Gateway and Number to "Jhon Doe" @ Ocean New York.
Routing Rules
The spec.location
block of a Number
resource configuration, determines the path of an inbound call from the PSTN. The aorLink
refers to an Address of Record(Agent or Peer) that is available in the location service
.