Skip to content

Commit

Permalink
Add Remote_address() class so that protocol can abstract
Browse files Browse the repository at this point in the history
things like received generation.
  • Loading branch information
sobomax committed Jul 4, 2024
1 parent 425c34b commit 92d5e63
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 27 deletions.
16 changes: 15 additions & 1 deletion sippy/Network_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,17 @@
from sippy.Core.Exceptions import dump_exception
from sippy.Time.MonoTime import MonoTime

class Remote_address():
address: Tuple[str, int]
received: str

def __init__(self, address:Tuple[str, int]):
self.address = address
self.received = address[0]

def __str__(self):
return f'{self.address[0]}:{self.address[1]}'

class Network_server_opts():
laddress: Optional[Tuple[str, int]] = None
data_callback: Optional[callable] = None
Expand All @@ -55,6 +66,9 @@ def getCopy(self) -> 'Network_server_opts':
def getSIPaddr(self) -> Tuple[str, int]:
return self.laddress

def isWildCard(self) -> bool:
return False

class Network_server(ABC):
uopts: Network_server_opts
sendqueue: Queue[Tuple[bytes, Tuple[str, int]]]
Expand All @@ -77,7 +91,7 @@ def send_to(self, data:Union[bytes, str], address:object, delayed:bool = False):
return
self.sendqueue.put((data, address))

def handle_read(self, data:bytes, address:object, rtime:MonoTime, delayed:bool = False):
def handle_read(self, data:bytes, address:Remote_address, rtime:MonoTime, delayed:bool = False):
if len(data) > 0 and self.uopts.data_callback != None:
self.stats[2] += 1
if self.uopts.ploss_in_rate > 0.0 and not delayed:
Expand Down
27 changes: 14 additions & 13 deletions sippy/SipTransactionManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from sippy.Exceptions.SipParseError import SipParseError, SdpParseError
from sippy.Exceptions.RtpProxyError import RtpProxyError
from sippy.Udp_server import Udp_server, Udp_server_opts
from sippy.Network_server import Remote_address
from datetime import datetime
from hashlib import md5
from traceback import print_exc
Expand Down Expand Up @@ -259,10 +260,10 @@ def __init__(self, global_config, req_cb = None):
self.req_consumers = {}
Timeout(self.rCachePurge, 32, -1)

def handleIncoming(self, data_in, address, server, rtime):
def handleIncoming(self, data_in, ra:Remote_address, server, rtime):
if len(data_in) < 32:
return
self.global_config['_sip_logger'].write('RECEIVED message from %s:%d:\n' % address, \
self.global_config['_sip_logger'].write(f'RECEIVED message from {ra}:\n', \
data_in.decode(errors = 'backslashreplace'), ltime = rtime.realt)
data = data_in.decode()
checksum = md5(data_in).digest()
Expand All @@ -280,11 +281,11 @@ def handleIncoming(self, data_in, address, server, rtime):
resp = SipResponse(data)
tid = resp.getTId(True, True)
except Exception as exception:
dump_exception('can\'t parse SIP response from %s:%d' % (address[0], address[1]), extra = data)
dump_exception(f'can\'t parse SIP response from {ra}', extra = data)
self.l1rcache[checksum] = SipTMRetransmitO()
return
if resp.getSCode()[0] < 100 or resp.getSCode()[0] > 999:
print(datetime.now(), 'invalid status code in SIP response from %s:%d:' % address)
print(datetime.now(), f'invalid status code in SIP response from {ra}:')
print(data)
sys.stdout.flush()
self.l1rcache[checksum] = SipTMRetransmitO()
Expand All @@ -300,8 +301,8 @@ def handleIncoming(self, data_in, address, server, rtime):
if not cbody.asterisk:
curl = cbody.getUrl()
if check1918(curl.host):
curl.host, curl.port = address
resp.setSource(address)
curl.host, curl.port = ra.address
resp.setSource(ra.address)
self.incomingResponse(resp, t, checksum)
else:
try:
Expand All @@ -311,33 +312,33 @@ def handleIncoming(self, data_in, address, server, rtime):
if isinstance(exception, SipParseError):
resp = exception.getResponse()
if resp is not None:
self.transmitMsg(server, resp, address, checksum)
dump_exception('can\'t parse SIP request from %s:%d' % (address[0], address[1]), extra = data)
self.transmitMsg(server, resp, ra.address, checksum)
dump_exception(f'can\'t parse SIP request from {ra}', extra = data)
self.l1rcache[checksum] = SipTMRetransmitO()
return
req.rtime = rtime
via0 = req.getHFBody('via')
ahost, aport = via0.getAddr()
rhost, rport = address
rhost, rport = ra.address
if self.nat_traversal and rport != aport and (check1918(ahost) or check7118(ahost)):
req.nated = True
if ahost != rhost:
via0.params['received'] = rhost
via0.params['received'] = ra.received
if 'rport' in via0.params or req.nated:
via0.params['rport'] = str(rport)
if self.nat_traversal and req.countHFs('contact') > 0 and req.countHFs('via') == 1:
try:
cbody = req.getHFBody('contact')
except Exception as exception:
dump_exception('can\'t parse SIP request from %s:%d: %s:' % (address[0], address[1]), extra = data)
dump_exception(f'can\'t parse SIP request from {ra}', extra = data)
self.l1rcache[checksum] = SipTMRetransmitO()
return
if not cbody.asterisk:
curl = cbody.getUrl()
if check1918(curl.host) or curl.port == 0 or curl.host == '255.255.255.255':
curl.host, curl.port = address
curl.host, curl.port = ra.address
req.nated = True
req.setSource(address)
req.setSource(ra.address)
try:
self.incomingRequest(req, checksum, tids, server)
except RtpProxyError as ex:
Expand Down
27 changes: 14 additions & 13 deletions sippy/Udp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class BrokenPipeError(Exception):

from sippy.Core.EventDispatcher import ED2
from sippy.Core.Exceptions import dump_exception
from sippy.Network_server import Network_server_opts, Network_server
from sippy.Network_server import Network_server_opts, Network_server, Remote_address
from sippy.Time.Timeout import Timeout
from sippy.Time.MonoTime import MonoTime
from sippy.SipConf import MyPort
Expand Down Expand Up @@ -121,6 +121,7 @@ def run(self):
continue
if self.userv.uopts.family == socket.AF_INET6:
address = ('[%s]' % address[0], address[1])
address = Remote_address(address)
if not self.userv.uopts.direct_dispatch:
ED2.callFromThread(self.userv.handle_read, data, address, rtime)
else:
Expand Down Expand Up @@ -246,30 +247,30 @@ class self_test(object):
pong_raddr = None
pong_raddr6 = None

def ping_received(self, data, address, udp_server, rtime):
def ping_received(self, data, ra, udp_server, rtime):
if udp_server.uopts.family == socket.AF_INET:
print('ping_received')
if data != self.ping_data or address != self.pong_raddr:
print(data, address, self.ping_data, self.pong_raddr)
if data != self.ping_data or ra.address != self.pong_raddr:
print(data, ra.address, self.ping_data, self.pong_raddr)
exit(1)
udp_server.send_to(self.pong_data, address)
udp_server.send_to(self.pong_data, ra.address)
else:
print('ping_received6')
if data != self.ping_data6 or address != self.pong_raddr6:
print(data, address, self.ping_data6, self.pong_raddr6)
if data != self.ping_data6 or ra.address != self.pong_raddr6:
print(data, ra.address, self.ping_data6, self.pong_raddr6)
exit(1)
udp_server.send_to(self.pong_data6, address)
udp_server.send_to(self.pong_data6, ra.address)

def pong_received(self, data, address, udp_server, rtime):
def pong_received(self, data, ra, udp_server, rtime):
if udp_server.uopts.family == socket.AF_INET:
print('pong_received')
if data != self.pong_data or address != self.ping_raddr:
print(data, address, self.pong_data, self.ping_raddr)
if data != self.pong_data or ra.address != self.ping_raddr:
print(data, ra.address, self.pong_data, self.ping_raddr)
exit(1)
else:
print('pong_received6')
if data != self.pong_data6 or address != self.ping_raddr6:
print(data, address, self.pong_data6, self.ping_raddr6)
if data != self.pong_data6 or ra.address != self.ping_raddr6:
print(data, ra.address, self.pong_data6, self.ping_raddr6)
exit(1)
self.npongs -= 1
if self.npongs == 0:
Expand Down

0 comments on commit 92d5e63

Please sign in to comment.