ProbeManager::~ProbeManager() { //If the manager goes out of scope, stop the session. if (mIsActive && mRegistrationHandle) { StopSession(); } }
// Release the packet adapter void LinkPaFree(SESSION *s) { LINK *k; // Validate arguments if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL) { return; } // Stop the server session StopSession(k->ServerSession); ReleaseSession(k->ServerSession); // Release the transmission packet queue LockQueue(k->SendPacketQueue); { BLOCK *block; while (block = GetNext(k->SendPacketQueue)) { FreeBlock(block); } } UnlockQueue(k->SendPacketQueue); ReleaseQueue(k->SendPacketQueue); }
// パケットアダプタの解放 void LinkPaFree(SESSION *s) { LINK *k; // 引数チェック if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL) { return; } // サーバーセッションの停止 StopSession(k->ServerSession); ReleaseSession(k->ServerSession); // 送信パケットキューの解放 LockQueue(k->SendPacketQueue); { BLOCK *block; while (block = GetNext(k->SendPacketQueue)) { FreeBlock(block); } } UnlockQueue(k->SendPacketQueue); ReleaseQueue(k->SendPacketQueue); }
// Release the packet adapter void LinkPaFree(SESSION *s) { LINK *k; // Validate arguments if (s == NULL || (k = (LINK *)s->PacketAdapter->Param) == NULL) { return; } CedarAddQueueBudget(k->Cedar, -((int)k->LastServerConnectionReceivedBlocksNum)); k->LastServerConnectionReceivedBlocksNum = 0; // Stop the server session StopSession(k->ServerSession); ReleaseSession(k->ServerSession); // Release the transmission packet queue LockQueue(k->SendPacketQueue); { BLOCK *block; while (block = GetNext(k->SendPacketQueue)) { FreeBlock(block); } } UnlockQueue(k->SendPacketQueue); ReleaseQueue(k->SendPacketQueue); k->CurrentSendPacketQueueSize = 0; }
// Free the local-bridge object void BrFreeBridge(BRIDGE *b) { // Validate arguments if (b == NULL) { return; } if (b->ParentLocalBridge != NULL) { b->ParentLocalBridge = NULL; } // Stop session thread StopSession(b->Session); ReleaseSession(b->Session); Free(b); }
// Stop the link void StopLink(LINK *k) { // Validate arguments if (k == NULL) { return; } LockLink(k); { if (k->Started == false) { UnlockLink(k); return; } k->Started = false; k->Halting = true; Dec(k->Cedar->CurrentActiveLinks); } UnlockLink(k); if (k->ClientSession != NULL) { // Disconnect the client session StopSession(k->ClientSession); LockLink(k); { ReleaseSession(k->ClientSession); k->ClientSession = NULL; } UnlockLink(k); } LockLink(k); { k->Halting = false; } UnlockLink(k); }
// Release the SecureNAT void SnFreeSecureNAT(SNAT *s) { // Validate arguments if (s == NULL) { return; } // Stop the session StopSession(s->Session); ReleaseSession(s->Session); // Virtual machine release Virtual_Free(s->Nat->Virtual); // NAT release NiFreeNat(s->Nat); DeleteLock(s->lock); Free(s); }
// リンクの停止 void StopLink(LINK *k) { // 引数チェック if (k == NULL) { return; } LockLink(k); { if (k->Started == false) { UnlockLink(k); return; } k->Started = false; k->Halting = true; } UnlockLink(k); if (k->ClientSession != NULL) { // クライアントセッション切断 StopSession(k->ClientSession); LockLink(k); { ReleaseSession(k->ClientSession); k->ClientSession = NULL; } UnlockLink(k); } LockLink(k); { k->Halting = false; } UnlockLink(k); }
// Layer-3 switch thread void L3SwThread(THREAD *t, void *param) { L3SW *s; bool shutdown_now = false; // Validate arguments if (t == NULL || param == NULL) { return; } s = (L3SW *)param; s->Active = true; NoticeThreadInit(t); // Operation start SLog(s->Cedar, "L3_SWITCH_START", s->Name); while (s->Halt == false) { if (s->Online == false) { // Because the L3 switch is off-line now, // attempt to make it on-line periodically LockList(s->Cedar->HubList); { Lock(s->lock); { UINT i; UINT n = 0; bool all_exists = true; if (LIST_NUM(s->IfList) == 0) { // Don't operate if there is no interface all_exists = false; } for (i = 0;i < LIST_NUM(s->IfList);i++) { L3IF *f = LIST_DATA(s->IfList, i); HUB *h = GetHub(s->Cedar, f->HubName); if (h != NULL) { if (h->Offline || h->Type == HUB_TYPE_FARM_DYNAMIC) { all_exists = false; } else { n++; } ReleaseHub(h); } else { all_exists = false; } } if (all_exists && n >= 1) { // Start the operation because all Virtual HUBs for // interfaces are enabled SLog(s->Cedar, "L3_SWITCH_ONLINE", s->Name); L3InitAllInterfaces(s); s->Online = true; } } Unlock(s->lock); } UnlockList(s->Cedar->HubList); } else { // Examine periodically whether all sessions terminated UINT i; bool any_halted = false; LIST *o = NULL; SHUTDOWN: Lock(s->lock); { for (i = 0;i < LIST_NUM(s->IfList);i++) { L3IF *f = LIST_DATA(s->IfList, i); if (f->Session->Halt || f->Hub->Offline != false) { any_halted = true; break; } } if (shutdown_now) { any_halted = true; } if (any_halted) { SLog(s->Cedar, "L3_SWITCH_OFFLINE", s->Name); o = NewListFast(NULL); // If there is any terminated session, terminate all sessions for (i = 0;i < LIST_NUM(s->IfList);i++) { L3IF *f = LIST_DATA(s->IfList, i); Insert(o, f->Session); } // Restore to the offline s->Online = false; } } Unlock(s->lock); if (o != NULL) { UINT i; for (i = 0;i < LIST_NUM(o);i++) { SESSION *s = LIST_DATA(o, i); StopSession(s); } L3FreeAllInterfaces(s); ReleaseList(o); o = NULL; } } SleepThread(50); } if (s->Online != false) { shutdown_now = true; goto SHUTDOWN; } // Stop the operation SLog(s->Cedar, "L3_SWITCH_STOP", s->Name); }