---
title: llarp::service::OutboundContext
summary: context needed to initiate an outbound hidden service session 

---

# llarp::service::OutboundContext



context needed to initiate an outbound hidden service session 


`#include <outbound_context.hpp>`

Inherits from [llarp::path::Builder](Classes/structllarp_1_1path_1_1Builder.md), [llarp::service::SendContext](Classes/structllarp_1_1service_1_1SendContext.md), std::enable_shared_from_this< OutboundContext >, [llarp::path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md)

## Public Functions

|                | Name           |
| -------------- | -------------- |
| | **[OutboundContext](Classes/structllarp_1_1service_1_1OutboundContext.md#function-outboundcontext)**(const [IntroSet](Classes/structllarp_1_1service_1_1IntroSet.md) & introSet, [Endpoint](Classes/structllarp_1_1service_1_1Endpoint.md) * parent) |
| | **[~OutboundContext](Classes/structllarp_1_1service_1_1OutboundContext.md#function-~outboundcontext)**() override |
| virtual void | **[Tick](Classes/structllarp_1_1service_1_1OutboundContext.md#function-tick)**(llarp_time_t now) override<br>tick owned paths  |
| util::StatusObject | **[ExtractStatus](Classes/structllarp_1_1service_1_1OutboundContext.md#function-extractstatus)**() const |
| virtual void | **[BlacklistSNode](Classes/structllarp_1_1service_1_1OutboundContext.md#function-blacklistsnode)**(const RouterID) override |
| virtual bool | **[ShouldBundleRC](Classes/structllarp_1_1service_1_1OutboundContext.md#function-shouldbundlerc)**() const override<br>should we bundle RCs in builds?  |
| virtual path::PathSet_ptr | **[GetSelf](Classes/structllarp_1_1service_1_1OutboundContext.md#function-getself)**() override<br>get a shared_ptr of ourself  |
| virtual std::weak_ptr< [path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md) > | **[GetWeak](Classes/structllarp_1_1service_1_1OutboundContext.md#function-getweak)**() override<br>get a weak_ptr of ourself  |
| [Address](Classes/structllarp_1_1service_1_1Address.md) | **[Addr](Classes/structllarp_1_1service_1_1OutboundContext.md#function-addr)**() const |
| virtual bool | **[Stop](Classes/structllarp_1_1service_1_1OutboundContext.md#function-stop)**() override<br>stop this pathset and mark it as to be removed  |
| bool | **[HandleDataDrop](Classes/structllarp_1_1service_1_1OutboundContext.md#function-handledatadrop)**(path::Path_ptr p, const [PathID_t](Classes/structllarp_1_1PathID__t.md) & dst, uint64_t s) |
| virtual void | **[HandlePathDied](Classes/structllarp_1_1service_1_1OutboundContext.md#function-handlepathdied)**(path::Path_ptr path) override<br>a path died now what?  |
| virtual bool | **[ShiftIntroduction](Classes/structllarp_1_1service_1_1OutboundContext.md#function-shiftintroduction)**(bool rebuild =true) override<br>update the current selected intro to be a new best introduction return true if we have changed intros  |
| virtual void | **[ShiftIntroRouter](Classes/structllarp_1_1service_1_1OutboundContext.md#function-shiftintrorouter)**(const [RouterID](Classes/structllarp_1_1RouterID.md) remote) override<br>shift the intro off the current router it is using  |
| virtual void | **[MarkCurrentIntroBad](Classes/structllarp_1_1service_1_1OutboundContext.md#function-markcurrentintrobad)**(llarp_time_t now) override<br>mark the current remote intro as bad  |
| void | **[MarkIntroBad](Classes/structllarp_1_1service_1_1OutboundContext.md#function-markintrobad)**(const [Introduction](Classes/structllarp_1_1service_1_1Introduction.md) & marked, llarp_time_t now) |
| bool | **[ReadyToSend](Classes/structllarp_1_1service_1_1OutboundContext.md#function-readytosend)**() const<br>return true if we are ready to send  |
| void | **[AddReadyHook](Classes/structllarp_1_1service_1_1OutboundContext.md#function-addreadyhook)**(std::function< void([OutboundContext](Classes/structllarp_1_1service_1_1OutboundContext.md) *)> readyHook, llarp_time_t timeout) |
| virtual void | **[SendPacketToRemote](Classes/structllarp_1_1service_1_1OutboundContext.md#function-sendpackettoremote)**(const [llarp_buffer_t](Classes/structllarp__buffer__t.md) & , ProtocolType t) override<br>for exits  |
| virtual bool | **[ShouldBuildMore](Classes/structllarp_1_1service_1_1OutboundContext.md#function-shouldbuildmore)**(llarp_time_t now) const override<br>return true if we should build another path  |
| bool | **[Pump](Classes/structllarp_1_1service_1_1OutboundContext.md#function-pump)**(llarp_time_t now)<br>pump internal state return true to mark as dead  |
| bool | **[IsDone](Classes/structllarp_1_1service_1_1OutboundContext.md#function-isdone)**(llarp_time_t now) const<br>return true if it's safe to remove ourselves  |
| bool | **[CheckPathIsDead](Classes/structllarp_1_1service_1_1OutboundContext.md#function-checkpathisdead)**(path::Path_ptr p, llarp_time_t dlt) |
| virtual void | **[AsyncGenIntro](Classes/structllarp_1_1service_1_1OutboundContext.md#function-asyncgenintro)**(const [llarp_buffer_t](Classes/structllarp__buffer__t.md) & payload, ProtocolType t) override |
| virtual void | **[UpdateIntroSet](Classes/structllarp_1_1service_1_1OutboundContext.md#function-updateintroset)**() override<br>issues a lookup to find the current intro set of the remote service  |
| virtual void | **[HandlePathBuilt](Classes/structllarp_1_1service_1_1OutboundContext.md#function-handlepathbuilt)**(path::Path_ptr path) override |
| virtual void | **[HandlePathBuildTimeout](Classes/structllarp_1_1service_1_1OutboundContext.md#function-handlepathbuildtimeout)**(path::Path_ptr path) override |
| virtual void | **[HandlePathBuildFailedAt](Classes/structllarp_1_1service_1_1OutboundContext.md#function-handlepathbuildfailedat)**(path::Path_ptr path, [RouterID](Classes/structllarp_1_1RouterID.md) hop) override |
| virtual std::optional< std::vector< [RouterContact](Classes/structllarp_1_1RouterContact.md) > > | **[GetHopsForBuild](Classes/structllarp_1_1service_1_1OutboundContext.md#function-gethopsforbuild)**() override |
| bool | **[HandleHiddenServiceFrame](Classes/structllarp_1_1service_1_1OutboundContext.md#function-handlehiddenserviceframe)**(path::Path_ptr p, const [ProtocolFrame](Classes/structllarp_1_1service_1_1ProtocolFrame.md) & frame) |
| virtual std::string | **[Name](Classes/structllarp_1_1service_1_1OutboundContext.md#function-name)**() const override<br>get the "name" of this pathset  |
| void | **[KeepAlive](Classes/structllarp_1_1service_1_1OutboundContext.md#function-keepalive)**() |
| bool | **[ShouldKeepAlive](Classes/structllarp_1_1service_1_1OutboundContext.md#function-shouldkeepalive)**(llarp_time_t now) const |
| const [IntroSet](Classes/structllarp_1_1service_1_1IntroSet.md) & | **[GetCurrentIntroSet](Classes/structllarp_1_1service_1_1OutboundContext.md#function-getcurrentintroset)**() const |
| llarp_time_t | **[RTT](Classes/structllarp_1_1service_1_1OutboundContext.md#function-rtt)**() const |
| bool | **[OnIntroSetUpdate](Classes/structllarp_1_1service_1_1OutboundContext.md#function-onintrosetupdate)**(const [Address](Classes/structllarp_1_1service_1_1Address.md) & addr, std::optional< [IntroSet](Classes/structllarp_1_1service_1_1IntroSet.md) > i, const [RouterID](Classes/structllarp_1_1RouterID.md) & endpoint, llarp_time_t , uint64_t relayOrder) |

## Public Attributes

|                | Name           |
| -------------- | -------------- |
| bool | **[updatingIntroSet](Classes/structllarp_1_1service_1_1OutboundContext.md#variable-updatingintroset)** <br>set to true if we are updating the remote introset right now  |

## Additional inherited members

**Public Functions inherited from [llarp::path::Builder](Classes/structllarp_1_1path_1_1Builder.md)**

|                | Name           |
| -------------- | -------------- |
| | **[Builder](Classes/structllarp_1_1path_1_1Builder.md#function-builder)**([AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) * p_router, size_t numDesiredPaths, size_t numHops)<br>construct  |
| virtual | **[~Builder](Classes/structllarp_1_1path_1_1Builder.md#function-~builder)**() =default |
| virtual void | **[ResetInternalState](Classes/structllarp_1_1path_1_1Builder.md#function-resetinternalstate)**() override<br>reset all cooldown timers  |
| bool | **[BuildCooldownHit](Classes/structllarp_1_1path_1_1Builder.md#function-buildcooldownhit)**(llarp_time_t now) const<br>return true if we hit our soft limit for building paths too fast  |
| virtual PathRole | **[GetRoles](Classes/structllarp_1_1path_1_1Builder.md#function-getroles)**() const<br>get roles for this path builder  |
| [BuildStats](Classes/structllarp_1_1path_1_1BuildStats.md) | **[CurrentBuildStats](Classes/structllarp_1_1path_1_1Builder.md#function-currentbuildstats)**() const |
| virtual bool | **[IsStopped](Classes/structllarp_1_1path_1_1Builder.md#function-isstopped)**() const override<br>return true if we are stopped  |
| virtual bool | **[ShouldRemove](Classes/structllarp_1_1path_1_1Builder.md#function-shouldremove)**() const override<br>return true if we can and should remove this pathset and underlying resources from its parent context  |
| virtual llarp_time_t | **[Now](Classes/structllarp_1_1path_1_1Builder.md#function-now)**() const override<br>get time from event loop  |
| virtual void | **[BuildOne](Classes/structllarp_1_1path_1_1Builder.md#function-buildone)**(PathRole roles =ePathRoleAny) override |
| virtual bool | **[BuildOneAlignedTo](Classes/structllarp_1_1path_1_1Builder.md#function-buildonealignedto)**(const [RouterID](Classes/structllarp_1_1RouterID.md) endpoint) override |
| std::optional< std::vector< [RouterContact](Classes/structllarp_1_1RouterContact.md) > > | **[GetHopsAlignedToForBuild](Classes/structllarp_1_1path_1_1Builder.md#function-gethopsalignedtoforbuild)**([RouterID](Classes/structllarp_1_1RouterID.md) endpoint, const std::set< [RouterID](Classes/structllarp_1_1RouterID.md) > & exclude ={}) |
| virtual void | **[Build](Classes/structllarp_1_1path_1_1Builder.md#function-build)**(std::vector< [RouterContact](Classes/structllarp_1_1RouterContact.md) > hops, PathRole roles =ePathRoleAny) override<br>manual build on these hops  |
| std::optional< [RouterContact](Classes/structllarp_1_1RouterContact.md) > | **[SelectFirstHop](Classes/structllarp_1_1path_1_1Builder.md#function-selectfirsthop)**(const std::set< [RouterID](Classes/structllarp_1_1RouterID.md) > & exclude ={}) const<br>pick a first hop  |
| void | **[ManualRebuild](Classes/structllarp_1_1path_1_1Builder.md#function-manualrebuild)**(size_t N, PathRole roles =ePathRoleAny) |
| virtual const [SecretKey](Classes/structllarp_1_1SecretKey.md) & | **[GetTunnelEncryptionSecretKey](Classes/structllarp_1_1path_1_1Builder.md#function-gettunnelencryptionsecretkey)**() const |

**Protected Functions inherited from [llarp::path::Builder](Classes/structllarp_1_1path_1_1Builder.md)**

|                | Name           |
| -------------- | -------------- |
| virtual bool | **[UrgentBuild](Classes/structllarp_1_1path_1_1Builder.md#function-urgentbuild)**(llarp_time_t now) const |
| bool | **[BuildCooldownHit](Classes/structllarp_1_1path_1_1Builder.md#function-buildcooldownhit)**([RouterID](Classes/structllarp_1_1RouterID.md) edge) const<br>return true if we hit our soft limit for building paths too fast on a first hop  |

**Public Attributes inherited from [llarp::path::Builder](Classes/structllarp_1_1path_1_1Builder.md)**

|                | Name           |
| -------------- | -------------- |
| [AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) *const | **[m_router](Classes/structllarp_1_1path_1_1Builder.md#variable-m-router)**  |
| [SecretKey](Classes/structllarp_1_1SecretKey.md) | **[enckey](Classes/structllarp_1_1path_1_1Builder.md#variable-enckey)**  |
| size_t | **[numHops](Classes/structllarp_1_1path_1_1Builder.md#variable-numhops)**  |
| llarp_time_t | **[lastBuild](Classes/structllarp_1_1path_1_1Builder.md#variable-lastbuild)**  |
| llarp_time_t | **[buildIntervalLimit](Classes/structllarp_1_1path_1_1Builder.md#variable-buildintervallimit)**  |

**Protected Attributes inherited from [llarp::path::Builder](Classes/structllarp_1_1path_1_1Builder.md)**

|                | Name           |
| -------------- | -------------- |
| std::atomic< bool > | **[_run](Classes/structllarp_1_1path_1_1Builder.md#variable--run)** <br>flag for [PathSet::Stop()]() |

**Public Types inherited from [llarp::service::SendContext](Classes/structllarp_1_1service_1_1SendContext.md)**

|                | Name           |
| -------------- | -------------- |
| using std::shared_ptr< [routing::PathTransferMessage](Classes/structllarp_1_1routing_1_1PathTransferMessage.md) > | **[Msg_ptr](Classes/structllarp_1_1service_1_1SendContext.md#using-msg-ptr)**  |
| using std::pair< Msg_ptr, path::Path_ptr > | **[SendEvent_t](Classes/structllarp_1_1service_1_1SendContext.md#using-sendevent-t)**  |

**Public Functions inherited from [llarp::service::SendContext](Classes/structllarp_1_1service_1_1SendContext.md)**

|                | Name           |
| -------------- | -------------- |
| | **[SendContext](Classes/structllarp_1_1service_1_1SendContext.md#function-sendcontext)**([ServiceInfo](Classes/structllarp_1_1service_1_1ServiceInfo.md) ident, const [Introduction](Classes/structllarp_1_1service_1_1Introduction.md) & intro, [path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md) * send, [Endpoint](Classes/structllarp_1_1service_1_1Endpoint.md) * ep) |
| void | **[AsyncEncryptAndSendTo](Classes/structllarp_1_1service_1_1SendContext.md#function-asyncencryptandsendto)**(const [llarp_buffer_t](Classes/structllarp__buffer__t.md) & payload, ProtocolType t) |
| bool | **[Send](Classes/structllarp_1_1service_1_1SendContext.md#function-send)**(std::shared_ptr< [ProtocolFrame](Classes/structllarp_1_1service_1_1ProtocolFrame.md) > f, path::Path_ptr path)<br>queue send a fully encrypted hidden service frame via a path  |
| void | **[FlushUpstream](Classes/structllarp_1_1service_1_1SendContext.md#function-flushupstream)**()<br>flush upstream traffic when in router thread  |
| void | **[AsyncSendAuth](Classes/structllarp_1_1service_1_1SendContext.md#function-asyncsendauth)**(std::function< void([AuthResult](Classes/structllarp_1_1service_1_1AuthResult.md))> replyHandler) |

**Public Attributes inherited from [llarp::service::SendContext](Classes/structllarp_1_1service_1_1SendContext.md)**

|                | Name           |
| -------------- | -------------- |
| [SharedSecret](Classes/structllarp_1_1AlignedBuffer.md) | **[sharedKey](Classes/structllarp_1_1service_1_1SendContext.md#variable-sharedkey)**  |
| [ServiceInfo](Classes/structllarp_1_1service_1_1ServiceInfo.md) | **[remoteIdent](Classes/structllarp_1_1service_1_1SendContext.md#variable-remoteident)**  |
| [Introduction](Classes/structllarp_1_1service_1_1Introduction.md) | **[remoteIntro](Classes/structllarp_1_1service_1_1SendContext.md#variable-remoteintro)**  |
| [ConvoTag](Classes/structllarp_1_1service_1_1ConvoTag.md) | **[currentConvoTag](Classes/structllarp_1_1service_1_1SendContext.md#variable-currentconvotag)**  |
| [path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md) *const | **[m_PathSet](Classes/structllarp_1_1service_1_1SendContext.md#variable-m-pathset)**  |
| [IDataHandler](Classes/structllarp_1_1service_1_1IDataHandler.md) *const | **[m_DataHandler](Classes/structllarp_1_1service_1_1SendContext.md#variable-m-datahandler)**  |
| [Endpoint](Classes/structllarp_1_1service_1_1Endpoint.md) *const | **[m_Endpoint](Classes/structllarp_1_1service_1_1SendContext.md#variable-m-endpoint)**  |
| uint64_t | **[sequenceNo](Classes/structllarp_1_1service_1_1SendContext.md#variable-sequenceno)**  |
| llarp_time_t | **[lastGoodSend](Classes/structllarp_1_1service_1_1SendContext.md#variable-lastgoodsend)**  |
| const llarp_time_t | **[createdAt](Classes/structllarp_1_1service_1_1SendContext.md#variable-createdat)**  |
| llarp_time_t | **[sendTimeout](Classes/structllarp_1_1service_1_1SendContext.md#variable-sendtimeout)**  |
| llarp_time_t | **[connectTimeout](Classes/structllarp_1_1service_1_1SendContext.md#variable-connecttimeout)**  |
| llarp_time_t | **[shiftTimeout](Classes/structllarp_1_1service_1_1SendContext.md#variable-shifttimeout)**  |
| llarp_time_t | **[estimatedRTT](Classes/structllarp_1_1service_1_1SendContext.md#variable-estimatedrtt)**  |
| bool | **[markedBad](Classes/structllarp_1_1service_1_1SendContext.md#variable-markedbad)**  |
| [thread::Queue](Classes/classllarp_1_1thread_1_1Queue.md)< SendEvent_t > | **[m_SendQueue](Classes/structllarp_1_1service_1_1SendContext.md#variable-m-sendqueue)**  |
| std::function< void([AuthResult](Classes/structllarp_1_1service_1_1AuthResult.md))> | **[authResultListener](Classes/structllarp_1_1service_1_1SendContext.md#variable-authresultlistener)**  |

**Protected Types inherited from [llarp::path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md)**

|                | Name           |
| -------------- | -------------- |
| using [util::NullMutex](Classes/structllarp_1_1util_1_1NullMutex.md) | **[Mtx_t](Classes/structllarp_1_1path_1_1PathSet.md#using-mtx-t)**  |
| using [util::NullLock](Classes/structllarp_1_1util_1_1NullLock.md) | **[Lock_t](Classes/structllarp_1_1path_1_1PathSet.md#using-lock-t)**  |
| using std::unordered_map< std::pair< [RouterID](Classes/structllarp_1_1RouterID.md), [PathID_t](Classes/structllarp_1_1PathID__t.md) >, Path_ptr > | **[PathMap_t](Classes/structllarp_1_1path_1_1PathSet.md#using-pathmap-t)**  |

**Public Functions inherited from [llarp::path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md)**

|                | Name           |
| -------------- | -------------- |
| | **[PathSet](Classes/structllarp_1_1path_1_1PathSet.md#function-pathset)**(size_t numDesiredPaths)<br>construct @params numDesiredPaths the number of paths to maintain  |
| virtual void | **[BuildOne](Classes/structllarp_1_1path_1_1PathSet.md#function-buildone)**(PathRole roles =ePathRoleAny) =0 |
| virtual void | **[Build](Classes/structllarp_1_1path_1_1PathSet.md#function-build)**(std::vector< [RouterContact](Classes/structllarp_1_1RouterContact.md) > hops, PathRole roles =ePathRoleAny) =0<br>manual build on these hops  |
| size_t | **[NumPathsExistingAt](Classes/structllarp_1_1path_1_1PathSet.md#function-numpathsexistingat)**(llarp_time_t futureTime) const<br>count the number of paths that will exist at this timestamp in future  |
| virtual void | **[PathBuildStarted](Classes/structllarp_1_1path_1_1PathSet.md#function-pathbuildstarted)**(Path_ptr path) |
| bool | **[GetNewestIntro](Classes/structllarp_1_1path_1_1PathSet.md#function-getnewestintro)**([service::Introduction](Classes/structllarp_1_1service_1_1Introduction.md) & intro) const |
| void | **[AddPath](Classes/structllarp_1_1path_1_1PathSet.md#function-addpath)**(Path_ptr path) |
| Path_ptr | **[GetByUpstream](Classes/structllarp_1_1path_1_1PathSet.md#function-getbyupstream)**([RouterID](Classes/structllarp_1_1RouterID.md) remote, [PathID_t](Classes/structllarp_1_1PathID__t.md) rxid) const |
| void | **[ExpirePaths](Classes/structllarp_1_1path_1_1PathSet.md#function-expirepaths)**(llarp_time_t now, [AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) * router) |
| size_t | **[NumInStatus](Classes/structllarp_1_1path_1_1PathSet.md#function-numinstatus)**(PathStatus st) const<br>get the number of paths in this status  |
| size_t | **[AvailablePaths](Classes/structllarp_1_1path_1_1PathSet.md#function-availablepaths)**(PathRole role) const<br>get the number of paths that match the role that are available  |
| virtual llarp_time_t | **[Now](Classes/structllarp_1_1path_1_1PathSet.md#function-now)**() const =0<br>get time from event loop  |
| virtual bool | **[IsStopped](Classes/structllarp_1_1path_1_1PathSet.md#function-isstopped)**() const =0<br>return true if we are stopped  |
| virtual bool | **[ShouldRemove](Classes/structllarp_1_1path_1_1PathSet.md#function-shouldremove)**() const =0<br>return true if we can and should remove this pathset and underlying resources from its parent context  |
| virtual bool | **[ShouldBuildMoreForRoles](Classes/structllarp_1_1path_1_1PathSet.md#function-shouldbuildmoreforroles)**(llarp_time_t now, PathRole roles) const<br>return true if we need another path with the given path roles  |
| virtual size_t | **[MinRequiredForRoles](Classes/structllarp_1_1path_1_1PathSet.md#function-minrequiredforroles)**(PathRole roles) const<br>return the minimum number of paths we want for given roles  |
| virtual bool | **[ShouldPublishDescriptors](Classes/structllarp_1_1path_1_1PathSet.md#function-shouldpublishdescriptors)**(] llarp_time_t now) const<br>return true if we should publish a new hidden service descriptor  |
| virtual bool | **[HandleGotIntroMessage](Classes/structllarp_1_1path_1_1PathSet.md#function-handlegotintromessage)**(std::shared_ptr< const [dht::GotIntroMessage](Classes/structllarp_1_1dht_1_1GotIntroMessage.md) > )<br>override me in subtype  |
| virtual bool | **[HandleGotRouterMessage](Classes/structllarp_1_1path_1_1PathSet.md#function-handlegotroutermessage)**(std::shared_ptr< const [dht::GotRouterMessage](Classes/structllarp_1_1dht_1_1GotRouterMessage.md) > )<br>override me in subtype  |
| virtual bool | **[HandleGotNameMessage](Classes/structllarp_1_1path_1_1PathSet.md#function-handlegotnamemessage)**(std::shared_ptr< const [dht::GotNameMessage](Classes/structllarp_1_1dht_1_1GotNameMessage.md) > )<br>override me in subtype  |
| virtual [routing::IMessageHandler](Classes/structllarp_1_1routing_1_1IMessageHandler.md) * | **[GetDHTHandler](Classes/structllarp_1_1path_1_1PathSet.md#function-getdhthandler)**() |
| Path_ptr | **[GetEstablishedPathClosestTo](Classes/structllarp_1_1path_1_1PathSet.md#function-getestablishedpathclosestto)**([RouterID](Classes/structllarp_1_1RouterID.md) router, std::unordered_set< [RouterID](Classes/structllarp_1_1RouterID.md) > excluding ={}, PathRole roles =ePathRoleAny) const |
| Path_ptr | **[PickEstablishedPath](Classes/structllarp_1_1path_1_1PathSet.md#function-pickestablishedpath)**(PathRole roles =ePathRoleAny) const |
| Path_ptr | **[PickRandomEstablishedPath](Classes/structllarp_1_1path_1_1PathSet.md#function-pickrandomestablishedpath)**(PathRole roles =ePathRoleAny) const |
| Path_ptr | **[GetPathByRouter](Classes/structllarp_1_1path_1_1PathSet.md#function-getpathbyrouter)**([RouterID](Classes/structllarp_1_1RouterID.md) router, PathRole roles =ePathRoleAny) const |
| Path_ptr | **[GetNewestPathByRouter](Classes/structllarp_1_1path_1_1PathSet.md#function-getnewestpathbyrouter)**([RouterID](Classes/structllarp_1_1RouterID.md) router, PathRole roles =ePathRoleAny) const |
| Path_ptr | **[GetRandomPathByRouter](Classes/structllarp_1_1path_1_1PathSet.md#function-getrandompathbyrouter)**([RouterID](Classes/structllarp_1_1RouterID.md) router, PathRole roles =ePathRoleAny) const |
| Path_ptr | **[GetPathByID](Classes/structllarp_1_1path_1_1PathSet.md#function-getpathbyid)**([PathID_t](Classes/structllarp_1_1PathID__t.md) id) const |
| Path_ptr | **[GetByEndpointWithID](Classes/structllarp_1_1path_1_1PathSet.md#function-getbyendpointwithid)**([RouterID](Classes/structllarp_1_1RouterID.md) router, [PathID_t](Classes/structllarp_1_1PathID__t.md) id) const |
| std::optional< std::set< [service::Introduction](Classes/structllarp_1_1service_1_1Introduction.md) > > | **[GetCurrentIntroductionsWithFilter](Classes/structllarp_1_1path_1_1PathSet.md#function-getcurrentintroductionswithfilter)**(std::function< bool(const [service::Introduction](Classes/structllarp_1_1service_1_1Introduction.md) &)> filter) const |
| virtual bool | **[PublishIntroSet](Classes/structllarp_1_1path_1_1PathSet.md#function-publishintroset)**(const [service::EncryptedIntroSet](Classes/structllarp_1_1service_1_1EncryptedIntroSet.md) & , [AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) * ) |
| virtual void | **[ResetInternalState](Classes/structllarp_1_1path_1_1PathSet.md#function-resetinternalstate)**() =0<br>reset all cooldown timers  |
| virtual bool | **[BuildOneAlignedTo](Classes/structllarp_1_1path_1_1PathSet.md#function-buildonealignedto)**(const [RouterID](Classes/structllarp_1_1RouterID.md) endpoint) =0 |
| void | **[ForEachPath](Classes/structllarp_1_1path_1_1PathSet.md#function-foreachpath)**(std::function< void(const Path_ptr &)> visit) const |
| void | **[UpstreamFlush](Classes/structllarp_1_1path_1_1PathSet.md#function-upstreamflush)**([AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) * r) |
| void | **[DownstreamFlush](Classes/structllarp_1_1path_1_1PathSet.md#function-downstreamflush)**([AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) * r) |

**Protected Functions inherited from [llarp::path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md)**

|                | Name           |
| -------------- | -------------- |
| void | **[TickPaths](Classes/structllarp_1_1path_1_1PathSet.md#function-tickpaths)**([AbstractRouter](Classes/structllarp_1_1AbstractRouter.md) * r) |

**Public Attributes inherited from [llarp::path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md)**

|                | Name           |
| -------------- | -------------- |
| constexpr size_t | **[max_paths](Classes/structllarp_1_1path_1_1PathSet.md#variable-max-paths)** <br>maximum number of paths a path set can maintain  |
| size_t | **[numDesiredPaths](Classes/structllarp_1_1path_1_1PathSet.md#variable-numdesiredpaths)**  |

**Protected Attributes inherited from [llarp::path::PathSet](Classes/structllarp_1_1path_1_1PathSet.md)**

|                | Name           |
| -------------- | -------------- |
| [BuildStats](Classes/structllarp_1_1path_1_1BuildStats.md) | **[m_BuildStats](Classes/structllarp_1_1path_1_1PathSet.md#variable-m-buildstats)**  |
| [Mtx_t](Classes/structllarp_1_1util_1_1NullMutex.md) | **[m_PathsMutex](Classes/structllarp_1_1path_1_1PathSet.md#variable-m-pathsmutex)**  |
| PathMap_t | **[m_Paths](Classes/structllarp_1_1path_1_1PathSet.md#variable-m-paths)**  |


## Public Functions Documentation

### function OutboundContext

```cpp
OutboundContext(
    const IntroSet & introSet,
    Endpoint * parent
)
```


### function ~OutboundContext

```cpp
~OutboundContext() override
```


### function Tick

```cpp
virtual void Tick(
    llarp_time_t now
) override
```

tick owned paths 

**Reimplements**: [llarp::path::Builder::Tick](Classes/structllarp_1_1path_1_1Builder.md#function-tick)


### function ExtractStatus

```cpp
util::StatusObject ExtractStatus() const
```


### function BlacklistSNode

```cpp
inline virtual void BlacklistSNode(
    const RouterID
) override
```


**Reimplements**: [llarp::path::PathSet::BlacklistSNode](Classes/structllarp_1_1path_1_1PathSet.md#function-blacklistsnode)


### function ShouldBundleRC

```cpp
virtual bool ShouldBundleRC() const override
```

should we bundle RCs in builds? 

**Reimplements**: [llarp::path::Builder::ShouldBundleRC](Classes/structllarp_1_1path_1_1Builder.md#function-shouldbundlerc)


### function GetSelf

```cpp
inline virtual path::PathSet_ptr GetSelf() override
```

get a shared_ptr of ourself 

**Reimplements**: [llarp::path::PathSet::GetSelf](Classes/structllarp_1_1path_1_1PathSet.md#function-getself)


### function GetWeak

```cpp
inline virtual std::weak_ptr< path::PathSet > GetWeak() override
```

get a weak_ptr of ourself 

**Reimplements**: [llarp::path::PathSet::GetWeak](Classes/structllarp_1_1path_1_1PathSet.md#function-getweak)


### function Addr

```cpp
Address Addr() const
```


### function Stop

```cpp
virtual bool Stop() override
```

stop this pathset and mark it as to be removed 

**Reimplements**: [llarp::path::Builder::Stop](Classes/structllarp_1_1path_1_1Builder.md#function-stop)


### function HandleDataDrop

```cpp
bool HandleDataDrop(
    path::Path_ptr p,
    const PathID_t & dst,
    uint64_t s
)
```


### function HandlePathDied

```cpp
virtual void HandlePathDied(
    path::Path_ptr path
) override
```

a path died now what? 

**Reimplements**: [llarp::path::PathSet::HandlePathDied](Classes/structllarp_1_1path_1_1PathSet.md#function-handlepathdied)


### function ShiftIntroduction

```cpp
virtual bool ShiftIntroduction(
    bool rebuild =true
) override
```

update the current selected intro to be a new best introduction return true if we have changed intros 

**Reimplements**: [llarp::service::SendContext::ShiftIntroduction](Classes/structllarp_1_1service_1_1SendContext.md#function-shiftintroduction)


### function ShiftIntroRouter

```cpp
virtual void ShiftIntroRouter(
    const RouterID remote
) override
```

shift the intro off the current router it is using 

**Reimplements**: [llarp::service::SendContext::ShiftIntroRouter](Classes/structllarp_1_1service_1_1SendContext.md#function-shiftintrorouter)


### function MarkCurrentIntroBad

```cpp
virtual void MarkCurrentIntroBad(
    llarp_time_t now
) override
```

mark the current remote intro as bad 

**Reimplements**: [llarp::service::SendContext::MarkCurrentIntroBad](Classes/structllarp_1_1service_1_1SendContext.md#function-markcurrentintrobad)


### function MarkIntroBad

```cpp
void MarkIntroBad(
    const Introduction & marked,
    llarp_time_t now
)
```


### function ReadyToSend

```cpp
bool ReadyToSend() const
```

return true if we are ready to send 

### function AddReadyHook

```cpp
void AddReadyHook(
    std::function< void(OutboundContext *)> readyHook,
    llarp_time_t timeout
)
```


### function SendPacketToRemote

```cpp
virtual void SendPacketToRemote(
    const llarp_buffer_t & ,
    ProtocolType t
) override
```

for exits 

**Reimplements**: [llarp::path::PathSet::SendPacketToRemote](Classes/structllarp_1_1path_1_1PathSet.md#function-sendpackettoremote)


### function ShouldBuildMore

```cpp
virtual bool ShouldBuildMore(
    llarp_time_t now
) const override
```

return true if we should build another path 

**Reimplements**: [llarp::path::Builder::ShouldBuildMore](Classes/structllarp_1_1path_1_1Builder.md#function-shouldbuildmore)


### function Pump

```cpp
bool Pump(
    llarp_time_t now
)
```

pump internal state return true to mark as dead 

### function IsDone

```cpp
bool IsDone(
    llarp_time_t now
) const
```

return true if it's safe to remove ourselves 

### function CheckPathIsDead

```cpp
bool CheckPathIsDead(
    path::Path_ptr p,
    llarp_time_t dlt
)
```


### function AsyncGenIntro

```cpp
virtual void AsyncGenIntro(
    const llarp_buffer_t & payload,
    ProtocolType t
) override
```


**Reimplements**: [llarp::service::SendContext::AsyncGenIntro](Classes/structllarp_1_1service_1_1SendContext.md#function-asyncgenintro)


### function UpdateIntroSet

```cpp
virtual void UpdateIntroSet() override
```

issues a lookup to find the current intro set of the remote service 

**Reimplements**: [llarp::service::SendContext::UpdateIntroSet](Classes/structllarp_1_1service_1_1SendContext.md#function-updateintroset)


### function HandlePathBuilt

```cpp
virtual void HandlePathBuilt(
    path::Path_ptr path
) override
```


**Reimplements**: [llarp::path::Builder::HandlePathBuilt](Classes/structllarp_1_1path_1_1Builder.md#function-handlepathbuilt)


### function HandlePathBuildTimeout

```cpp
virtual void HandlePathBuildTimeout(
    path::Path_ptr path
) override
```


**Reimplements**: [llarp::path::Builder::HandlePathBuildTimeout](Classes/structllarp_1_1path_1_1Builder.md#function-handlepathbuildtimeout)


### function HandlePathBuildFailedAt

```cpp
virtual void HandlePathBuildFailedAt(
    path::Path_ptr path,
    RouterID hop
) override
```


**Reimplements**: [llarp::path::Builder::HandlePathBuildFailedAt](Classes/structllarp_1_1path_1_1Builder.md#function-handlepathbuildfailedat)


### function GetHopsForBuild

```cpp
virtual std::optional< std::vector< RouterContact > > GetHopsForBuild() override
```


**Reimplements**: [llarp::path::Builder::GetHopsForBuild](Classes/structllarp_1_1path_1_1Builder.md#function-gethopsforbuild)


### function HandleHiddenServiceFrame

```cpp
bool HandleHiddenServiceFrame(
    path::Path_ptr p,
    const ProtocolFrame & frame
)
```


### function Name

```cpp
virtual std::string Name() const override
```

get the "name" of this pathset 

**Reimplements**: [llarp::path::PathSet::Name](Classes/structllarp_1_1path_1_1PathSet.md#function-name)


### function KeepAlive

```cpp
void KeepAlive()
```


### function ShouldKeepAlive

```cpp
bool ShouldKeepAlive(
    llarp_time_t now
) const
```


### function GetCurrentIntroSet

```cpp
inline const IntroSet & GetCurrentIntroSet() const
```


### function RTT

```cpp
llarp_time_t RTT() const
```


### function OnIntroSetUpdate

```cpp
bool OnIntroSetUpdate(
    const Address & addr,
    std::optional< IntroSet > i,
    const RouterID & endpoint,
    llarp_time_t ,
    uint64_t relayOrder
)
```


## Public Attributes Documentation

### variable updatingIntroSet

```cpp
bool updatingIntroSet;
```

set to true if we are updating the remote introset right now 

-------------------------------

Updated on 2022-09-19 at 17:18:34 +0000