mirror of
https://github.com/markqvist/Reticulum.git
synced 2024-11-05 13:50:14 +00:00
Fixed missing path invalidation on failed link establishments made from a shared instance client
This commit is contained in:
parent
bb74878e94
commit
7960226883
@ -118,6 +118,8 @@ class Transport:
|
|||||||
jobs_locked = False
|
jobs_locked = False
|
||||||
jobs_running = False
|
jobs_running = False
|
||||||
job_interval = 0.250
|
job_interval = 0.250
|
||||||
|
links_last_checked = 0.0
|
||||||
|
links_check_interval = 1.0
|
||||||
receipts_last_checked = 0.0
|
receipts_last_checked = 0.0
|
||||||
receipts_check_interval = 1.0
|
receipts_check_interval = 1.0
|
||||||
announces_last_checked = 0.0
|
announces_last_checked = 0.0
|
||||||
@ -167,8 +169,7 @@ class Transport:
|
|||||||
Transport.control_hashes.append(Transport.tunnel_synthesize_destination.hash)
|
Transport.control_hashes.append(Transport.tunnel_synthesize_destination.hash)
|
||||||
|
|
||||||
Transport.jobs_running = False
|
Transport.jobs_running = False
|
||||||
thread = threading.Thread(target=Transport.jobloop)
|
thread = threading.Thread(target=Transport.jobloop, daemon=True)
|
||||||
thread.daemon = True
|
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
if RNS.Reticulum.transport_enabled():
|
if RNS.Reticulum.transport_enabled():
|
||||||
@ -268,8 +269,6 @@ class Transport:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log("Could not load tunnel table from storage, the contained exception was: "+str(e), RNS.LOG_ERROR)
|
RNS.log("Could not load tunnel table from storage, the contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RNS.log("Transport instance "+str(Transport.identity)+" started", RNS.LOG_VERBOSE)
|
RNS.log("Transport instance "+str(Transport.identity)+" started", RNS.LOG_VERBOSE)
|
||||||
|
|
||||||
# Synthesize tunnels for any interfaces wanting it
|
# Synthesize tunnels for any interfaces wanting it
|
||||||
@ -292,6 +291,39 @@ class Transport:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if not Transport.jobs_locked:
|
if not Transport.jobs_locked:
|
||||||
|
|
||||||
|
# Process active and pending link lists
|
||||||
|
if time.time() > Transport.links_last_checked+Transport.links_check_interval:
|
||||||
|
|
||||||
|
for link in Transport.pending_links:
|
||||||
|
if link.status == RNS.Link.CLOSED:
|
||||||
|
# If we are not a Transport Instance, finding a pending link
|
||||||
|
# that was never activated will trigger an expiry of the path
|
||||||
|
# to the destination, and an attempt to rediscover the path.
|
||||||
|
if not RNS.Reticulum.transport_enabled():
|
||||||
|
Transport.expire_path(link.destination.hash)
|
||||||
|
|
||||||
|
# If we are connected to a shared instance, it will take
|
||||||
|
# care of sending out a new path request. If not, we will
|
||||||
|
# send one directly.
|
||||||
|
if not Transport.owner.is_connected_to_shared_instance:
|
||||||
|
last_path_request = 0
|
||||||
|
if link.destination.hash in Transport.path_requests:
|
||||||
|
last_path_request = Transport.path_requests[link.destination.hash]
|
||||||
|
|
||||||
|
if time.time() - last_path_request > Transport.PATH_REQUEST_MI:
|
||||||
|
RNS.log("Trying to rediscover path for "+RNS.prettyhexrep(link.destination.hash)+" since an attempted link was never established", RNS.LOG_DEBUG)
|
||||||
|
if not link.destination.hash in path_requests:
|
||||||
|
path_requests.append(link.destination.hash)
|
||||||
|
|
||||||
|
Transport.pending_links.remove(link)
|
||||||
|
|
||||||
|
for link in Transport.active_links:
|
||||||
|
if link.status == RNS.Link.CLOSED:
|
||||||
|
Transport.active_links.remove(link)
|
||||||
|
|
||||||
|
Transport.links_last_checked = time.time()
|
||||||
|
|
||||||
# Process receipts list for timed-out packets
|
# Process receipts list for timed-out packets
|
||||||
if time.time() > Transport.receipts_last_checked+Transport.receipts_check_interval:
|
if time.time() > Transport.receipts_last_checked+Transport.receipts_check_interval:
|
||||||
while len(Transport.receipts) > Transport.MAX_RECEIPTS:
|
while len(Transport.receipts) > Transport.MAX_RECEIPTS:
|
||||||
@ -383,6 +415,7 @@ class Transport:
|
|||||||
stale_links = []
|
stale_links = []
|
||||||
for link_id in Transport.link_table:
|
for link_id in Transport.link_table:
|
||||||
link_entry = Transport.link_table[link_id]
|
link_entry = Transport.link_table[link_id]
|
||||||
|
|
||||||
if link_entry[7] == True:
|
if link_entry[7] == True:
|
||||||
if time.time() > link_entry[0] + Transport.LINK_TIMEOUT:
|
if time.time() > link_entry[0] + Transport.LINK_TIMEOUT:
|
||||||
stale_links.append(link_id)
|
stale_links.append(link_id)
|
||||||
@ -394,13 +427,15 @@ class Transport:
|
|||||||
if link_entry[6] in Transport.path_requests:
|
if link_entry[6] in Transport.path_requests:
|
||||||
last_path_request = Transport.path_requests[link_entry[6]]
|
last_path_request = Transport.path_requests[link_entry[6]]
|
||||||
|
|
||||||
# If this link request was originated from this instance
|
# If this link request was originated from a local client
|
||||||
# or a local client, attempt to rediscover a path to the
|
# attempt to rediscover a path to the destination, if this
|
||||||
# destination, if it has not already happened recently.
|
# has not already happened recently.
|
||||||
lr_taken_hops = link_entry[5]
|
lr_taken_hops = link_entry[5]
|
||||||
if lr_taken_hops == 0 and time.time() - last_path_request > Transport.PATH_REQUEST_MI:
|
if lr_taken_hops == 0 and time.time() - last_path_request > Transport.PATH_REQUEST_MI:
|
||||||
RNS.log("Trying to rediscover path for "+RNS.prettyhexrep(link_entry[6])+" since an attempted link was never established", RNS.LOG_DEBUG)
|
RNS.log("Trying to rediscover path for "+RNS.prettyhexrep(link_entry[6])+" since an attempted local client link was never established", RNS.LOG_DEBUG)
|
||||||
path_requests.append(link_entry[6])
|
if not link_entry[6] in path_requests:
|
||||||
|
path_requests.append(link_entry[6])
|
||||||
|
|
||||||
if not RNS.Reticulum.transport_enabled():
|
if not RNS.Reticulum.transport_enabled():
|
||||||
# Drop current path if we are not a transport instance, to
|
# Drop current path if we are not a transport instance, to
|
||||||
# allow using higher-hop count paths or reused announces
|
# allow using higher-hop count paths or reused announces
|
||||||
@ -528,6 +563,10 @@ class Transport:
|
|||||||
|
|
||||||
Transport.tables_last_culled = time.time()
|
Transport.tables_last_culled = time.time()
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Transport jobs were locked, do nothing
|
||||||
|
pass
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
RNS.log("An exception occurred while running Transport jobs.", RNS.LOG_ERROR)
|
RNS.log("An exception occurred while running Transport jobs.", RNS.LOG_ERROR)
|
||||||
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
@ -1644,7 +1683,7 @@ class Transport:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def register_link(link):
|
def register_link(link):
|
||||||
RNS.log("Registering link "+str(link), RNS.LOG_DEBUG)
|
RNS.log("Registering link "+str(link), RNS.LOG_EXTREME)
|
||||||
if link.initiator:
|
if link.initiator:
|
||||||
Transport.pending_links.append(link)
|
Transport.pending_links.append(link)
|
||||||
else:
|
else:
|
||||||
@ -1652,7 +1691,7 @@ class Transport:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def activate_link(link):
|
def activate_link(link):
|
||||||
RNS.log("Activating link "+str(link), RNS.LOG_DEBUG)
|
RNS.log("Activating link "+str(link), RNS.LOG_EXTREME)
|
||||||
if link in Transport.pending_links:
|
if link in Transport.pending_links:
|
||||||
Transport.pending_links.remove(link)
|
Transport.pending_links.remove(link)
|
||||||
Transport.active_links.append(link)
|
Transport.active_links.append(link)
|
||||||
|
Loading…
Reference in New Issue
Block a user