Open BRIDGE-AI opened 3 months ago
INVITE sip:<CALLEE>@<SERVERIP> SIP/2.0
Via: SIP/2.0/UDP <CALLERIP>:5060;branch=<BRANCH>
#Via: SIP/2.0/UDP 3.39.185.227:5060;branch=z9hG4bK2ede3c4c
From: <sip:<CALLER>@<SERVERIP>>;tag=<TAG>
To: <sip:<CALLEE>@<SERVERIP>>
#Record-Route: <sip:<CALLERIP>;lr>
Call-ID: <CALLID>
CSeq: 1 INVITE
Contact: <sip:<CALLER>@<SERVERIP>>
Max-Forwards: 70
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, NOTIFY, REGISTER, MESSAGE, SUBSCRIBE, REFER
Content-Type: application/sdp
Content-Length: xxx
User-Agent: pyVoIP 2.0.0a5
v=0
o=pyVoIP 1 3 IN IP4 0.0.0.0
s=pyVoIP 2.0.0a5
c=IN IP4 <CALLERIP>
t=0 0
m=audio 19133 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20
a=maxptime:150
a=sendrecv
INVITE sip:<CALLEE>@<SERVERIP>:5060;user=phone SIP/2.0
Via: SIP/2.0/UDP <CALLERIP>:5060;branch=<BRANCH>
#Via: SIP/2.0/UDP 3.39.185.227:5060;branch=z9hG4bK2ede3c4c
From: <sip:<CALLER>@<CALLERIP>>;tag=<TAG>
To: <sip:<CALLEE>@<SERVERIP>>
#Record-Route: <sip:<CALLERIP>;lr>
Call-ID: <CALLID>
CSeq: 1 INVITE
Contact: <sip:<CALLER>@<CALLERIP>:5060;user=phone>
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: xxx
User-Agent: pyVoIP 2.0.0a5
v=0 o=root 1812611488 1812611488 IN IP4 211.233.26.249 s=GP ARS 1.0 c=IN IP4 211.233.26.249 t=0 0 m=audio 20868 RTP/AVP 0 8 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=maxptime:150 a=sendrecv
## 그런데,
처음넷과 같은 형태로 맞추면
연결 실패시 Trying회신이 먼저 온 후 Forbidden 회신이 오는데
각 회신에서 ip199에서 보낸 INVITE에 대한 FROM/TO host가 달라
pyVoIP에서 `_handle_incoming_message()` 수행시 local_tag, remote_tag순서가 달라짐
이에 따라 sqlite에 msg 레코드가 다르게 들어가고, 메세지를 가져와 핸들링이 안됨
⇢ 일단 현행대로 call회신을 받는 ip로 추측되는 `c=` 레코드만 remote_host로 하고 나머지는 server(처음넷 GW) 주소로 유지함
위의 수정에 따라 발신 연결이 제대로 동작하지 않는 등 side-effect가 만은 듯 하여 롤백 sock.py에서 determine_tags() 동작시 To 헤더의 host를 기반으로 local_tag/remote_tag를 판단하는 부분을 From헤더를 대신 사용하도록 수정 이 수정은 처음넷 한정으로 동작할 가능성이 큼
발신 상태만
class CallState(Enum):
...
DENIED = "DENIED"
class VoIPCall:
...
def receiver(self):
"""Receive and handle incoming messages"""
while self.state is not CallState.ENDED and self.phone.NSD:
data = self.conn.recv(8192, ignore="ACK")
...
if type(message) is SIPResponse:
if message.status is ResponseCode.OK:
...
elif message.status == ResponseCode.FORBIDDEN:
self.denied(message)
debug(f"Received Forbidden Message: {message}")
pass
else:
...
def denied(self, request: SIPMessage) -> None:
#ack = self.phone.sip.gen_ack(request)
#self.conn.send(ack)
self.state = CallState.DENIED
return
brief.