MockNetworkLayerController.cpp (3587B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "MockNetworkLayerController.h" 8 9 #include "mozilla/ClearOnShutdown.h" 10 #include "mozilla/net/SocketProcessParent.h" 11 #include "nsIOService.h" 12 #include "nsNetAddr.h" 13 14 namespace mozilla::net { 15 16 static StaticRefPtr<MockNetworkLayerController> gController; 17 18 bool FindNetAddrOverride(const NetAddr& aInput, NetAddr& aOutput) { 19 RefPtr<MockNetworkLayerController> controller = gController; 20 if (!controller) { 21 return false; 22 } 23 24 nsAutoCString addrPort; 25 aInput.ToAddrPortString(addrPort); 26 AutoReadLock lock(controller->mLock); 27 return controller->mNetAddrOverrides.Get(addrPort, &aOutput); 28 } 29 30 bool FindBlockedUDPAddr(const NetAddr& aInput) { 31 RefPtr<MockNetworkLayerController> controller = gController; 32 if (!controller) { 33 return false; 34 } 35 36 nsAutoCString addrPort; 37 aInput.ToAddrPortString(addrPort); 38 AutoReadLock lock(controller->mLock); 39 return controller->mBlockedUDPAddresses.Contains(addrPort); 40 } 41 42 // static 43 already_AddRefed<nsIMockNetworkLayerController> 44 MockNetworkLayerController::GetSingleton() { 45 if (gController) { 46 return do_AddRef(gController); 47 } 48 49 gController = new MockNetworkLayerController(); 50 ClearOnShutdown(&gController); 51 return do_AddRef(gController); 52 } 53 54 NS_IMPL_ISUPPORTS(MockNetworkLayerController, nsIMockNetworkLayerController) 55 56 NS_IMETHODIMP MockNetworkLayerController::CreateScriptableNetAddr( 57 const nsACString& aIP, uint16_t aPort, nsINetAddr** aResult) { 58 NetAddr rawAddr; 59 if (NS_FAILED(rawAddr.InitFromString(aIP))) { 60 return NS_ERROR_FAILURE; 61 } 62 63 rawAddr.inet.port = PR_htons(aPort); 64 65 RefPtr<nsNetAddr> netaddr = new nsNetAddr(&rawAddr); 66 netaddr.forget(aResult); 67 return NS_OK; 68 } 69 70 NS_IMETHODIMP MockNetworkLayerController::AddNetAddrOverride(nsINetAddr* aFrom, 71 nsINetAddr* aTo) { 72 MOZ_ASSERT(NS_IsMainThread()); 73 74 NetAddr fromAddr; 75 aFrom->GetNetAddr(&fromAddr); 76 NetAddr toAddr; 77 aTo->GetNetAddr(&toAddr); 78 nsAutoCString addrPort; 79 fromAddr.ToAddrPortString(addrPort); 80 { 81 AutoWriteLock lock(mLock); 82 mNetAddrOverrides.InsertOrUpdate(addrPort, toAddr); 83 } 84 if (nsIOService::UseSocketProcess()) { 85 RefPtr<SocketProcessParent> parent = SocketProcessParent::GetSingleton(); 86 if (parent) { 87 (void)parent->SendAddNetAddrOverride(fromAddr, toAddr); 88 } 89 } 90 return NS_OK; 91 } 92 93 NS_IMETHODIMP MockNetworkLayerController::ClearNetAddrOverrides() { 94 MOZ_ASSERT(NS_IsMainThread()); 95 { 96 AutoWriteLock lock(mLock); 97 mNetAddrOverrides.Clear(); 98 } 99 if (nsIOService::UseSocketProcess()) { 100 RefPtr<SocketProcessParent> parent = SocketProcessParent::GetSingleton(); 101 if (parent) { 102 (void)parent->SendClearNetAddrOverrides(); 103 } 104 } 105 return NS_OK; 106 } 107 108 NS_IMETHODIMP MockNetworkLayerController::BlockUDPAddrIO(nsINetAddr* aAddr) { 109 MOZ_ASSERT(NS_IsMainThread()); 110 111 NetAddr addr; 112 aAddr->GetNetAddr(&addr); 113 nsAutoCString addrPort; 114 addr.ToAddrPortString(addrPort); 115 { 116 AutoWriteLock lock(mLock); 117 mBlockedUDPAddresses.Insert(addrPort); 118 } 119 120 return NS_OK; 121 } 122 123 NS_IMETHODIMP MockNetworkLayerController::ClearBlockedUDPAddr() { 124 MOZ_ASSERT(NS_IsMainThread()); 125 126 AutoWriteLock lock(mLock); 127 mBlockedUDPAddresses.Clear(); 128 return NS_OK; 129 } 130 131 } // namespace mozilla::net