Changeset 60786 in vbox
- Timestamp:
- May 2, 2016 1:00:02 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106985
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/settings.h
r60410 r60786 18 18 19 19 /* 20 * Copyright (C) 2007-201 5Oracle Corporation20 * Copyright (C) 2007-2016 Oracle Corporation 21 21 * 22 22 * This file is part of VirtualBox Open Source Edition (OSE), as … … 202 202 com::Utf8Str strGuestIP; 203 203 }; 204 typedef std:: list<NATRule> NATRuleList;204 typedef std::map<com::Utf8Str, NATRule> NATRulesMap; 205 205 206 206 … … 210 210 com::Utf8Str strLoopbackHostAddress; 211 211 uint32_t u32Offset; 212 bool operator == (const com::Utf8Str& strAddr) 213 { 214 return (strLoopbackHostAddress == strAddr); 215 } 216 217 bool operator == (uint32_t off) 218 { 219 return (this->u32Offset == off); 212 bool operator==(const com::Utf8Str& strAddr) 213 { 214 return strLoopbackHostAddress == strAddr; 215 } 216 217 bool operator==(uint32_t off) 218 { 219 return u32Offset == off; 220 } 221 222 bool operator==(const NATHostLoopbackOffset &o) const 223 { 224 return strLoopbackHostAddress == o.strLoopbackHostAddress 225 && u32Offset == o.u32Offset; 220 226 } 221 227 }; … … 257 263 void readMedium(MediaType t, uint32_t depth, const xml::ElementNode &elmMedium, Medium &med); 258 264 void readMediaRegistry(const xml::ElementNode &elmMediaRegistry, MediaRegistry &mr); 259 void readNATForwardRule List(const xml::ElementNode &elmParent, NATRuleList &llRules);265 void readNATForwardRulesMap(const xml::ElementNode &elmParent, NATRulesMap &mapRules); 260 266 void readNATLoopbacks(const xml::ElementNode &elmParent, NATLoopbackOffsetList &llLoopBacks); 261 267 … … 273 279 void buildMediaRegistry(xml::ElementNode &elmParent, 274 280 const MediaRegistry &mr); 275 void buildNATForwardRule List(xml::ElementNode &elmParent, const NATRuleList &natRuleList);281 void buildNATForwardRulesMap(xml::ElementNode &elmParent, const NATRulesMap &mapRules); 276 282 void buildNATLoopbacks(xml::ElementNode &elmParent, const NATLoopbackOffsetList &natLoopbackList); 277 283 void clearDocument(); … … 388 394 strIPUpper; 389 395 bool fEnabled; 390 DhcpOptionMap 396 DhcpOptionMap GlobalDhcpOptions; 391 397 VmSlot2OptionsMap VmSlot2OptionsM; 392 398 }; … … 400 406 { 401 407 com::Utf8Str strNetworkName; 408 com::Utf8Str strIPv4NetworkCidr; 409 com::Utf8Str strIPv6Prefix; 402 410 bool fEnabled; 403 com::Utf8Str strNetwork;404 bool f IPv6;405 com::Utf8Str strIPv6Prefix;411 bool fIPv6Enabled; 412 bool fAdvertiseDefaultIPv6Route; 413 bool fNeedDhcpServer; 406 414 uint32_t u32HostLoopback6Offset; 407 415 NATLoopbackOffsetList llHostLoopbackOffsetList; 408 bool fAdvertiseDefaultIPv6Route;409 bool fNeedDhcpServer;410 NAT RuleList llPortForwardRules4;411 NATRuleList llPortForwardRules6;412 NATNetwork():fEnabled(true),416 NATRulesMap mapPortForwardRules4; 417 NATRulesMap mapPortForwardRules6; 418 NATNetwork() : 419 fEnabled(true), 420 fIPv6Enabled(false), 413 421 fAdvertiseDefaultIPv6Route(false), 414 fNeedDhcpServer(true) 422 fNeedDhcpServer(true), 423 u32HostLoopback6Offset(0) 415 424 {} 416 425 bool operator==(const NATNetwork &n) const 417 426 { 418 return strNetworkName == n.strNetworkName 419 && strNetwork == n.strNetwork; 427 return strNetworkName == n.strNetworkName 428 && strIPv4NetworkCidr == n.strIPv4NetworkCidr 429 && strIPv6Prefix == n.strIPv6Prefix 430 && fEnabled == n.fEnabled 431 && fIPv6Enabled == n.fIPv6Enabled 432 && fAdvertiseDefaultIPv6Route == n.fAdvertiseDefaultIPv6Route 433 && fNeedDhcpServer == n.fNeedDhcpServer 434 && u32HostLoopback6Offset == n.u32HostLoopback6Offset 435 && llHostLoopbackOffsetList == n.llHostLoopbackOffsetList 436 && mapPortForwardRules4 == n.mapPortForwardRules4 437 && mapPortForwardRules6 == n.mapPortForwardRules6; 420 438 } 421 439 … … 544 562 }; 545 563 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 && llRules == n.llRules;581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 NATRuleList llRules;600 564 struct NAT 565 { 566 NAT() 567 : u32Mtu(0), 568 u32SockRcv(0), 569 u32SockSnd(0), 570 u32TcpRcv(0), 571 u32TcpSnd(0), 572 fDNSPassDomain(true), /* historically this value is true */ 573 fDNSProxy(false), 574 fDNSUseHostResolver(false), 575 fAliasLog(false), 576 fAliasProxyOnly(false), 577 fAliasUseSamePorts(false) 578 {} 579 580 bool operator==(const NAT &n) const 581 { 582 return strNetwork == n.strNetwork 583 && strBindIP == n.strBindIP 584 && u32Mtu == n.u32Mtu 585 && u32SockRcv == n.u32SockRcv 586 && u32SockSnd == n.u32SockSnd 587 && u32TcpSnd == n.u32TcpSnd 588 && u32TcpRcv == n.u32TcpRcv 589 && strTFTPPrefix == n.strTFTPPrefix 590 && strTFTPBootFile == n.strTFTPBootFile 591 && strTFTPNextServer == n.strTFTPNextServer 592 && fDNSPassDomain == n.fDNSPassDomain 593 && fDNSProxy == n.fDNSProxy 594 && fDNSUseHostResolver == n.fDNSUseHostResolver 595 && fAliasLog == n.fAliasLog 596 && fAliasProxyOnly == n.fAliasProxyOnly 597 && fAliasUseSamePorts == n.fAliasUseSamePorts 598 && mapRules == n.mapRules; 599 } 600 601 com::Utf8Str strNetwork; 602 com::Utf8Str strBindIP; 603 uint32_t u32Mtu; 604 uint32_t u32SockRcv; 605 uint32_t u32SockSnd; 606 uint32_t u32TcpRcv; 607 uint32_t u32TcpSnd; 608 com::Utf8Str strTFTPPrefix; 609 com::Utf8Str strTFTPBootFile; 610 com::Utf8Str strTFTPNextServer; 611 bool fDNSPassDomain; 612 bool fDNSProxy; 613 bool fDNSUseHostResolver; 614 bool fAliasLog; 615 bool fAliasProxyOnly; 616 bool fAliasUseSamePorts; 617 NATRulesMap mapRules; 618 }; 601 619 602 620 /** -
trunk/src/VBox/Main/include/NATNetworkImpl.h
r58827 r60786 5 5 6 6 /* 7 * Copyright (C) 2006-201 3Oracle Corporation7 * Copyright (C) 2006-2016 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 62 62 void FinalRelease(); 63 63 64 HRESULT init(VirtualBox *aVirtualBox, 65 com::Utf8Str aName); 66 67 68 HRESULT init(VirtualBox *aVirtualBox, 69 const settings::NATNetwork &data); 64 HRESULT init(VirtualBox *aVirtualBox, com::Utf8Str aName); 65 HRESULT i_loadSettings(const settings::NATNetwork &data); 70 66 void uninit(); 71 67 HRESULT i_saveSettings(settings::NATNetwork &data); … … 98 94 // wrapped INATNetwork methods 99 95 HRESULT addLocalMapping(const com::Utf8Str &aHostid, 100 96 LONG aOffset); 101 97 HRESULT addPortForwardRule(BOOL aIsIpv6, 102 98 const com::Utf8Str &aRuleName, … … 116 112 int i_recalculateIPv6Prefix(); 117 113 118 typedef std::map<Utf8Str, settings::NATRule> NATRuleMap; 119 typedef NATRuleMap::const_iterator constNATRuleMapIterator; 120 121 void i_getPortForwardRulesFromMap(std::vector<Utf8Str> &aPortForwardRules, NATRuleMap& aRules); 122 123 /** weak VirtualBox parent */ 124 VirtualBox * const mVirtualBox; 125 126 const com::Utf8Str mName; 114 void i_getPortForwardRulesFromMap(std::vector<Utf8Str> &aPortForwardRules, settings::NATRulesMap &aRules); 127 115 128 116 struct Data; 129 struct Data *m; 130 117 Data *m; 131 118 }; 132 119 -
trunk/src/VBox/Main/src-server/NATEngineImpl.cpp
r57751 r60786 5 5 6 6 /* 7 * Copyright (C) 2010-201 5Oracle Corporation7 * Copyright (C) 2010-2016 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 29 29 #include <VBox/com/array.h> 30 30 31 typedef std::map<Utf8Str, settings::NATRule> NATRuleMap;32 33 31 struct NATEngineData 34 32 { 35 NATEngineData() : mMtu(0), 36 mSockRcv(0), 37 mSockSnd(0), 38 mTcpRcv(0), 39 mTcpSnd(0), 40 mDNSPassDomain(TRUE), 41 mDNSProxy(FALSE), 42 mDNSUseHostResolver(FALSE), 43 mAliasMode(0) 33 NATEngineData() 44 34 {} 45 35 46 com::Utf8Str mNetwork; 47 com::Utf8Str mBindIP; 48 uint32_t mMtu; 49 uint32_t mSockRcv; 50 uint32_t mSockSnd; 51 uint32_t mTcpRcv; 52 uint32_t mTcpSnd; 53 /* TFTP service */ 54 Utf8Str mTFTPPrefix; 55 Utf8Str mTFTPBootFile; 56 Utf8Str mTFTPNextServer; 57 /* DNS service */ 58 BOOL mDNSPassDomain; 59 BOOL mDNSProxy; 60 BOOL mDNSUseHostResolver; 61 /* Alias service */ 62 ULONG mAliasMode; 63 /* Port forwarding rules */ 64 NATRuleMap mNATRules; 36 settings::NAT s; 65 37 }; 66 38 … … 96 68 mData = new Data(); 97 69 mData->m.allocate(); 98 mData->m-> mNetwork.setNull();99 mData->m-> mBindIP.setNull();70 mData->m->s.strNetwork.setNull(); 71 mData->m->s.strBindIP.setNull(); 100 72 unconst(mParent) = aParent; 101 73 unconst(mAdapter) = aAdapter; … … 219 191 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 220 192 if (aMtu) 221 *aMtu = mData->m-> mMtu;193 *aMtu = mData->m->s.u32Mtu; 222 194 if (aSockSnd) 223 *aSockSnd = mData->m-> mSockSnd;195 *aSockSnd = mData->m->s.u32SockSnd; 224 196 if (aSockRcv) 225 *aSockRcv = mData->m-> mSockRcv;197 *aSockRcv = mData->m->s.u32SockRcv; 226 198 if (aTcpWndSnd) 227 *aTcpWndSnd = mData->m-> mTcpSnd;199 *aTcpWndSnd = mData->m->s.u32TcpSnd; 228 200 if (aTcpWndRcv) 229 *aTcpWndRcv = mData->m-> mTcpRcv;201 *aTcpWndRcv = mData->m->s.u32TcpRcv; 230 202 231 203 return S_OK; … … 242 214 } 243 215 if (aMtu) 244 mData->m-> mMtu = aMtu;216 mData->m->s.u32Mtu = aMtu; 245 217 if (aSockSnd) 246 mData->m-> mSockSnd = aSockSnd;218 mData->m->s.u32SockSnd = aSockSnd; 247 219 if (aSockRcv) 248 mData->m-> mSockRcv = aSockSnd;220 mData->m->s.u32SockRcv = aSockSnd; 249 221 if (aTcpWndSnd) 250 mData->m-> mTcpSnd = aTcpWndSnd;222 mData->m->s.u32TcpSnd = aTcpWndSnd; 251 223 if (aTcpWndRcv) 252 mData->m-> mTcpRcv = aTcpWndRcv;224 mData->m->s.u32TcpRcv = aTcpWndRcv; 253 225 254 226 return S_OK; … … 260 232 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 261 233 262 aRedirects.resize(mData->m-> mNATRules.size());234 aRedirects.resize(mData->m->s.mapRules.size()); 263 235 size_t i = 0; 264 NATRuleMap::const_iterator it;265 for (it = mData->m-> mNATRules.begin(); it != mData->m->mNATRules.end(); ++it, ++i)236 settings::NATRulesMap::const_iterator it; 237 for (it = mData->m->s.mapRules.begin(); it != mData->m->s.mapRules.end(); ++it, ++i) 266 238 { 267 239 settings::NATRule r = it->second; … … 298 270 name = Utf8StrFmt("%s_%d_%d", proto, aHostPort, aGuestPort); 299 271 300 NATRuleMap::iterator it;301 for (it = mData->m-> mNATRules.begin(); it != mData->m->mNATRules.end(); ++it)272 settings::NATRulesMap::iterator it; 273 for (it = mData->m->s.mapRules.begin(); it != mData->m->s.mapRules.end(); ++it) 302 274 { 303 275 r = it->second; … … 319 291 r.strGuestIP = aGuestIP; 320 292 r.u16GuestPort = aGuestPort; 321 mData->m-> mNATRules.insert(std::make_pair(name, r));293 mData->m->s.mapRules.insert(std::make_pair(name, r)); 322 294 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 323 295 … … 334 306 { 335 307 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 336 NATRuleMap::iterator it = mData->m->mNATRules.find(aName);337 if (it == mData->m-> mNATRules.end())308 settings::NATRulesMap::iterator it = mData->m->s.mapRules.find(aName); 309 if (it == mData->m->s.mapRules.end()) 338 310 return E_INVALIDARG; 339 311 mData->m.backup(); 340 312 /* 341 313 * NB: "it" may now point to the backup! In that case it's ok to 342 * get data from the backup copy of mNATRules via it, but we can't343 * erase(it) from potentially new mNATRules.314 * get data from the backup copy of s.mapRules via it, but we can't 315 * erase(it) from potentially new s.mapRules. 344 316 */ 345 317 settings::NATRule r = it->second; … … 352 324 mAdapter->COMGETTER(Slot)(&ulSlot); 353 325 354 mData->m-> mNATRules.erase(aName); /* NB: erase by key, "it" may not be valid */326 mData->m->s.mapRules.erase(aName); /* NB: erase by key, "it" may not be valid */ 355 327 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 356 328 alock.release(); … … 366 338 367 339 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 368 HRESULT rc = S_OK; 369 mData->m->mNetwork = data.strNetwork; 370 mData->m->mBindIP = data.strBindIP; 371 mData->m->mMtu = data.u32Mtu; 372 mData->m->mSockSnd = data.u32SockSnd; 373 mData->m->mTcpRcv = data.u32TcpRcv; 374 mData->m->mTcpSnd = data.u32TcpSnd; 375 /* TFTP */ 376 mData->m->mTFTPPrefix = data.strTFTPPrefix; 377 mData->m->mTFTPBootFile = data.strTFTPBootFile; 378 mData->m->mTFTPNextServer = data.strTFTPNextServer; 379 /* DNS */ 380 mData->m->mDNSPassDomain = data.fDNSPassDomain; 381 mData->m->mDNSProxy = data.fDNSProxy; 382 mData->m->mDNSUseHostResolver = data.fDNSUseHostResolver; 383 /* Alias */ 384 mData->m->mAliasMode = (data.fAliasUseSamePorts ? NATAliasMode_AliasUseSamePorts : 0); 385 mData->m->mAliasMode |= (data.fAliasLog ? NATAliasMode_AliasLog : 0); 386 mData->m->mAliasMode |= (data.fAliasProxyOnly ? NATAliasMode_AliasProxyOnly : 0); 387 /* port forwarding */ 388 mData->m->mNATRules.clear(); 389 for (settings::NATRuleList::const_iterator it = data.llRules.begin(); 390 it != data.llRules.end(); ++it) 391 { 392 mData->m->mNATRules.insert(std::make_pair(it->strName, *it)); 393 } 394 return rc; 340 mData->m->s = data; 341 return S_OK; 395 342 } 396 343 … … 403 350 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 404 351 HRESULT rc = S_OK; 405 data.strNetwork = mData->m->mNetwork; 406 data.strBindIP = mData->m->mBindIP; 407 data.u32Mtu = mData->m->mMtu; 408 data.u32SockRcv = mData->m->mSockRcv; 409 data.u32SockSnd = mData->m->mSockSnd; 410 data.u32TcpRcv = mData->m->mTcpRcv; 411 data.u32TcpSnd = mData->m->mTcpSnd; 412 /* TFTP */ 413 data.strTFTPPrefix = mData->m->mTFTPPrefix; 414 data.strTFTPBootFile = mData->m->mTFTPBootFile; 415 data.strTFTPNextServer = mData->m->mTFTPNextServer; 416 /* DNS */ 417 data.fDNSPassDomain = !!mData->m->mDNSPassDomain; 418 data.fDNSProxy = !!mData->m->mDNSProxy; 419 data.fDNSUseHostResolver = !!mData->m->mDNSUseHostResolver; 420 /* Alias */ 421 data.fAliasLog = !!(mData->m->mAliasMode & NATAliasMode_AliasLog); 422 data.fAliasProxyOnly = !!(mData->m->mAliasMode & NATAliasMode_AliasProxyOnly); 423 data.fAliasUseSamePorts = !!(mData->m->mAliasMode & NATAliasMode_AliasUseSamePorts); 424 425 for (NATRuleMap::iterator it = mData->m->mNATRules.begin(); 426 it != mData->m->mNATRules.end(); ++it) 427 data.llRules.push_back(it->second); 352 data = mData->m->s; 428 353 return rc; 429 354 } … … 432 357 { 433 358 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 434 if ( Bstr(mData->m->mNetwork)!= aNetwork)435 { 436 mData->m.backup(); 437 mData->m-> mNetwork = aNetwork;359 if (mData->m->s.strNetwork != aNetwork) 360 { 361 mData->m.backup(); 362 mData->m->s.strNetwork = aNetwork; 438 363 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 439 364 } … … 445 370 { 446 371 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 447 if (!mData->m-> mNetwork.isEmpty())448 { 449 aNetwork = mData->m-> mNetwork;450 Log(("Getter (this:%p) Network: %s\n", this, mData->m-> mNetwork.c_str()));372 if (!mData->m->s.strNetwork.isEmpty()) 373 { 374 aNetwork = mData->m->s.strNetwork; 375 Log(("Getter (this:%p) Network: %s\n", this, mData->m->s.strNetwork.c_str())); 451 376 } 452 377 return S_OK; … … 456 381 { 457 382 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 458 if ( Bstr(mData->m->mBindIP)!= aHostIP)459 { 460 mData->m.backup(); 461 mData->m-> mBindIP = aHostIP;383 if (mData->m->s.strBindIP != aHostIP) 384 { 385 mData->m.backup(); 386 mData->m->s.strBindIP = aHostIP; 462 387 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 463 388 } … … 469 394 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 470 395 471 if (!mData->m-> mBindIP.isEmpty())472 aBindIP = mData->m-> mBindIP;396 if (!mData->m->s.strBindIP.isEmpty()) 397 aBindIP = mData->m->s.strBindIP; 473 398 return S_OK; 474 399 } … … 477 402 { 478 403 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 479 if ( Bstr(mData->m->mTFTPPrefix)!= aTFTPPrefix)480 { 481 mData->m.backup(); 482 mData->m-> mTFTPPrefix = aTFTPPrefix;404 if (mData->m->s.strTFTPPrefix != aTFTPPrefix) 405 { 406 mData->m.backup(); 407 mData->m->s.strTFTPPrefix = aTFTPPrefix; 483 408 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 484 409 } … … 491 416 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 492 417 493 if (!mData->m-> mTFTPPrefix.isEmpty())494 { 495 aTFTPPrefix = mData->m-> mTFTPPrefix;496 Log(("Getter (this:%p) TFTPPrefix: %s\n", this, mData->m-> mTFTPPrefix.c_str()));418 if (!mData->m->s.strTFTPPrefix.isEmpty()) 419 { 420 aTFTPPrefix = mData->m->s.strTFTPPrefix; 421 Log(("Getter (this:%p) TFTPPrefix: %s\n", this, mData->m->s.strTFTPPrefix.c_str())); 497 422 } 498 423 return S_OK; … … 502 427 { 503 428 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 504 if ( Bstr(mData->m->mTFTPBootFile)!= aTFTPBootFile)505 { 506 mData->m.backup(); 507 mData->m-> mTFTPBootFile = aTFTPBootFile;429 if (mData->m->s.strTFTPBootFile != aTFTPBootFile) 430 { 431 mData->m.backup(); 432 mData->m->s.strTFTPBootFile = aTFTPBootFile; 508 433 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 509 434 } … … 515 440 { 516 441 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 517 if (!mData->m-> mTFTPBootFile.isEmpty())518 { 519 aTFTPBootFile = mData->m-> mTFTPBootFile;520 Log(("Getter (this:%p) BootFile: %s\n", this, mData->m-> mTFTPBootFile.c_str()));442 if (!mData->m->s.strTFTPBootFile.isEmpty()) 443 { 444 aTFTPBootFile = mData->m->s.strTFTPBootFile; 445 Log(("Getter (this:%p) BootFile: %s\n", this, mData->m->s.strTFTPBootFile.c_str())); 521 446 } 522 447 return S_OK; … … 527 452 { 528 453 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 529 if ( Bstr(mData->m->mTFTPNextServer)!= aTFTPNextServer)530 { 531 mData->m.backup(); 532 mData->m-> mTFTPNextServer = aTFTPNextServer;454 if (mData->m->s.strTFTPNextServer != aTFTPNextServer) 455 { 456 mData->m.backup(); 457 mData->m->s.strTFTPNextServer = aTFTPNextServer; 533 458 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 534 459 } … … 539 464 { 540 465 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 541 if (!mData->m-> mTFTPNextServer.isEmpty())542 { 543 aTFTPNextServer = mData->m-> mTFTPNextServer;544 Log(("Getter (this:%p) NextServer: %s\n", this, mData->m-> mTFTPNextServer.c_str()));466 if (!mData->m->s.strTFTPNextServer.isEmpty()) 467 { 468 aTFTPNextServer = mData->m->s.strTFTPNextServer; 469 Log(("Getter (this:%p) NextServer: %s\n", this, mData->m->s.strTFTPNextServer.c_str())); 545 470 } 546 471 return S_OK; … … 552 477 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 553 478 554 if (mData->m-> mDNSPassDomain != aDNSPassDomain)555 { 556 mData->m.backup(); 557 mData->m-> mDNSPassDomain = aDNSPassDomain;479 if (mData->m->s.fDNSPassDomain != RT_BOOL(aDNSPassDomain)) 480 { 481 mData->m.backup(); 482 mData->m->s.fDNSPassDomain = RT_BOOL(aDNSPassDomain); 558 483 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 559 484 } … … 564 489 { 565 490 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 566 *aDNSPassDomain = mData->m-> mDNSPassDomain;491 *aDNSPassDomain = mData->m->s.fDNSPassDomain; 567 492 return S_OK; 568 493 } … … 573 498 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 574 499 575 if (mData->m-> mDNSProxy != aDNSProxy)576 { 577 mData->m.backup(); 578 mData->m-> mDNSProxy = aDNSProxy;500 if (mData->m->s.fDNSProxy != RT_BOOL(aDNSProxy)) 501 { 502 mData->m.backup(); 503 mData->m->s.fDNSProxy = RT_BOOL(aDNSProxy); 579 504 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 580 505 } … … 585 510 { 586 511 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 587 *aDNSProxy = mData->m-> mDNSProxy;512 *aDNSProxy = mData->m->s.fDNSProxy; 588 513 return S_OK; 589 514 } … … 593 518 { 594 519 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 595 *aDNSUseHostResolver = mData->m-> mDNSUseHostResolver;520 *aDNSUseHostResolver = mData->m->s.fDNSUseHostResolver; 596 521 return S_OK; 597 522 } … … 600 525 HRESULT NATEngine::setDNSUseHostResolver(BOOL aDNSUseHostResolver) 601 526 { 602 if (mData->m-> mDNSUseHostResolver != aDNSUseHostResolver)603 { 604 mData->m.backup(); 605 mData->m-> mDNSUseHostResolver = aDNSUseHostResolver;527 if (mData->m->s.fDNSUseHostResolver != RT_BOOL(aDNSUseHostResolver)) 528 { 529 mData->m.backup(); 530 mData->m->s.fDNSUseHostResolver = RT_BOOL(aDNSUseHostResolver); 606 531 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 607 532 } … … 612 537 { 613 538 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 614 615 if (mData->m->mAliasMode != aAliasMode) 616 { 617 mData->m.backup(); 618 mData->m->mAliasMode = aAliasMode; 539 ULONG uAliasMode = (mData->m->s.fAliasUseSamePorts ? NATAliasMode_AliasUseSamePorts : 0); 540 uAliasMode |= (mData->m->s.fAliasLog ? NATAliasMode_AliasLog : 0); 541 uAliasMode |= (mData->m->s.fAliasProxyOnly ? NATAliasMode_AliasProxyOnly : 0); 542 if (uAliasMode != aAliasMode) 543 { 544 mData->m.backup(); 545 mData->m->s.fAliasUseSamePorts = RT_BOOL(aAliasMode & NATAliasMode_AliasUseSamePorts); 546 mData->m->s.fAliasLog = RT_BOOL(aAliasMode & NATAliasMode_AliasLog); 547 mData->m->s.fAliasProxyOnly = RT_BOOL(aAliasMode & NATAliasMode_AliasProxyOnly); 619 548 mParent->i_setModified(Machine::IsModified_NetworkAdapters); 620 549 } … … 625 554 { 626 555 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 627 *aAliasMode = mData->m->mAliasMode; 628 return S_OK; 629 } 630 556 ULONG uAliasMode = (mData->m->s.fAliasUseSamePorts ? NATAliasMode_AliasUseSamePorts : 0); 557 uAliasMode |= (mData->m->s.fAliasLog ? NATAliasMode_AliasLog : 0); 558 uAliasMode |= (mData->m->s.fAliasProxyOnly ? NATAliasMode_AliasProxyOnly : 0); 559 *aAliasMode = uAliasMode; 560 return S_OK; 561 } 562 -
trunk/src/VBox/Main/src-server/NATNetworkImpl.cpp
r58827 r60786 5 5 6 6 /* 7 * Copyright (C) 2013 Oracle Corporation7 * Copyright (C) 2013-2016 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 49 49 { 50 50 Data() 51 : fEnabled(TRUE) 52 , fIPv6Enabled(FALSE) 53 , fAdvertiseDefaultIPv6Route(FALSE) 54 , fNeedDhcpServer(TRUE) 55 , u32LoopbackIp6(0) 51 : pVirtualBox(NULL) 56 52 , offGateway(0) 57 53 , offDhcp(0) 58 54 { 59 IPv4Gateway.setNull();60 IPv4NetworkCidr.setNull();61 IPv6Prefix.setNull();62 IPv4DhcpServer.setNull();63 IPv4NetworkMask.setNull();64 IPv4DhcpServerLowerIp.setNull();65 IPv4DhcpServerUpperIp.setNull();66 55 } 67 56 virtual ~Data(){} … … 71 60 ComObjPtr<IDHCPServer> dhcpServer; 72 61 #endif 62 /** weak VirtualBox parent */ 63 VirtualBox * const pVirtualBox; 64 65 /** NATNetwork settings */ 66 settings::NATNetwork s; 67 73 68 com::Utf8Str IPv4Gateway; 74 com::Utf8Str IPv4NetworkCidr;75 69 com::Utf8Str IPv4NetworkMask; 76 70 com::Utf8Str IPv4DhcpServer; 77 71 com::Utf8Str IPv4DhcpServerLowerIp; 78 72 com::Utf8Str IPv4DhcpServerUpperIp; 79 BOOL fEnabled; 80 BOOL fIPv6Enabled; 81 com::Utf8Str IPv6Prefix; 82 BOOL fAdvertiseDefaultIPv6Route; 83 BOOL fNeedDhcpServer; 84 NATRuleMap mapName2PortForwardRule4; 85 NATRuleMap mapName2PortForwardRule6; 86 settings::NATLoopbackOffsetList maNATLoopbackOffsetList; 87 uint32_t u32LoopbackIp6; 73 88 74 uint32_t offGateway; 89 75 uint32_t offDhcp; … … 92 78 93 79 NATNetwork::NATNetwork() 94 : m VirtualBox(NULL)80 : m(NULL) 95 81 { 96 82 } … … 122 108 if (autoUninitSpan.uninitDone()) 123 109 return; 110 unconst(m->pVirtualBox) = NULL; 124 111 delete m; 125 112 m = NULL; 126 unconst(mVirtualBox) = NULL;127 113 } 128 114 … … 134 120 AssertReturn(autoInitSpan.isOk(), E_FAIL); 135 121 136 /* share VirtualBox weakly (parent remains NULL so far) */137 unconst(mVirtualBox) = aVirtualBox;138 unconst(mName) = aName;139 122 m = new Data(); 123 /* share VirtualBox weakly */ 124 unconst(m->pVirtualBox) = aVirtualBox; 125 m->s.strNetworkName = aName; 126 m->s.strIPv4NetworkCidr = "10.0.2.0/24"; 140 127 m->offGateway = 1; 141 m->IPv4NetworkCidr = "10.0.2.0/24"; 142 i_recalculateIPv6Prefix(); /* set m->IPv6Prefix based on IPv4 */ 128 i_recalculateIPv6Prefix(); /* set m->strIPv6Prefix based on IPv4 */ 143 129 144 130 settings::NATHostLoopbackOffset off; 145 131 off.strLoopbackHostAddress = "127.0.0.1"; 146 132 off.u32Offset = (uint32_t)2; 147 m-> maNATLoopbackOffsetList.push_back(off);133 m->s.llHostLoopbackOffsetList.push_back(off); 148 134 149 135 i_recalculateIpv4AddressAssignments(); … … 162 148 163 149 164 HRESULT NATNetwork::init(VirtualBox *aVirtualBox, 165 const settings::NATNetwork &data) 166 { 167 /* Enclose the state transition NotReady->InInit->Ready */ 168 AutoInitSpan autoInitSpan(this); 169 AssertReturn(autoInitSpan.isOk(), E_FAIL); 170 171 /* share VirtualBox weakly (parent remains NULL so far) */ 172 unconst(mVirtualBox) = aVirtualBox; 173 174 unconst(mName) = data.strNetworkName; 175 m = new Data(); 176 m->IPv4NetworkCidr = data.strNetwork; 177 m->fEnabled = data.fEnabled; 178 m->fAdvertiseDefaultIPv6Route = data.fAdvertiseDefaultIPv6Route; 179 m->fNeedDhcpServer = data.fNeedDhcpServer; 180 m->fIPv6Enabled = data.fIPv6; 181 182 if ( data.strIPv6Prefix.isEmpty() 150 HRESULT NATNetwork::i_loadSettings(const settings::NATNetwork &data) 151 { 152 AutoCaller autoCaller(this); 153 AssertComRCReturnRC(autoCaller.rc()); 154 155 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 156 m->s = data; 157 if ( m->s.strIPv6Prefix.isEmpty() 183 158 /* also clean up bogus old default */ 184 || data.strIPv6Prefix == "fe80::/64") 185 i_recalculateIPv6Prefix(); /* set m->IPv6Prefix based on IPv4 */ 186 else 187 m->IPv6Prefix = data.strIPv6Prefix; 188 189 m->u32LoopbackIp6 = data.u32HostLoopback6Offset; 190 191 m->maNATLoopbackOffsetList.clear(); 192 m->maNATLoopbackOffsetList.assign(data.llHostLoopbackOffsetList.begin(), 193 data.llHostLoopbackOffsetList.end()); 194 159 || m->s.strIPv6Prefix == "fe80::/64") 160 i_recalculateIPv6Prefix(); /* set m->strIPv6Prefix based on IPv4 */ 195 161 i_recalculateIpv4AddressAssignments(); 196 197 /* IPv4 port-forward rules */198 m->mapName2PortForwardRule4.clear();199 for (settings::NATRuleList::const_iterator it = data.llPortForwardRules4.begin();200 it != data.llPortForwardRules4.end(); ++it)201 {202 m->mapName2PortForwardRule4.insert(std::make_pair(it->strName.c_str(), *it));203 }204 205 /* IPv6 port-forward rules */206 m->mapName2PortForwardRule6.clear();207 for (settings::NATRuleList::const_iterator it = data.llPortForwardRules6.begin();208 it != data.llPortForwardRules6.end(); ++it)209 {210 m->mapName2PortForwardRule6.insert(std::make_pair(it->strName, *it));211 }212 213 HRESULT hrc = unconst(m->pEventSource).createObject();214 if (FAILED(hrc)) throw hrc;215 216 hrc = m->pEventSource->init();217 if (FAILED(hrc)) throw hrc;218 219 autoInitSpan.setSucceeded();220 162 221 163 return S_OK; … … 228 170 229 171 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 230 231 data.strNetworkName = mName; 232 data.strNetwork = m->IPv4NetworkCidr; 233 data.fEnabled = RT_BOOL(m->fEnabled); 234 data.fAdvertiseDefaultIPv6Route = RT_BOOL(m->fAdvertiseDefaultIPv6Route); 235 data.fNeedDhcpServer = RT_BOOL(m->fNeedDhcpServer); 236 data.fIPv6 = RT_BOOL(m->fIPv6Enabled); 237 data.strIPv6Prefix = m->IPv6Prefix; 238 239 /* saving ipv4 port-forward Rules*/ 240 data.llPortForwardRules4.clear(); 241 for (NATRuleMap::iterator it = m->mapName2PortForwardRule4.begin(); 242 it != m->mapName2PortForwardRule4.end(); ++it) 243 data.llPortForwardRules4.push_back(it->second); 244 245 /* saving ipv6 port-forward Rules*/ 246 data.llPortForwardRules6.clear(); 247 for (NATRuleMap::iterator it = m->mapName2PortForwardRule6.begin(); 248 it != m->mapName2PortForwardRule6.end(); ++it) 249 data.llPortForwardRules6.push_back(it->second); 250 251 data.u32HostLoopback6Offset = m->u32LoopbackIp6; 252 253 data.llHostLoopbackOffsetList.clear(); 254 data.llHostLoopbackOffsetList.assign(m->maNATLoopbackOffsetList.begin(), 255 m->maNATLoopbackOffsetList.end()); 256 257 mVirtualBox->i_onNATNetworkSetting(Bstr(mName).raw(), 258 data.fEnabled ? TRUE : FALSE, 259 Bstr(m->IPv4NetworkCidr).raw(), 260 Bstr(m->IPv4Gateway).raw(), 261 data.fAdvertiseDefaultIPv6Route ? TRUE : FALSE, 262 data.fNeedDhcpServer ? TRUE : FALSE); 172 data = m->s; 173 alock.release(); 174 175 m->pVirtualBox->i_onNATNetworkSetting(Bstr(m->s.strNetworkName).raw(), 176 m->s.fEnabled, 177 Bstr(m->s.strIPv4NetworkCidr).raw(), 178 Bstr(m->IPv4Gateway).raw(), 179 m->s.fAdvertiseDefaultIPv6Route, 180 m->s.fNeedDhcpServer); 263 181 264 182 /* Notify listerners listening on this network only */ 265 183 fireNATNetworkSettingEvent(m->pEventSource, 266 Bstr(m Name).raw(),267 data.fEnabled ? TRUE : FALSE,268 Bstr(m-> IPv4NetworkCidr).raw(),184 Bstr(m->s.strNetworkName).raw(), 185 m->s.fEnabled, 186 Bstr(m->s.strIPv4NetworkCidr).raw(), 269 187 Bstr(m->IPv4Gateway).raw(), 270 data.fAdvertiseDefaultIPv6Route ? TRUE : FALSE,271 data.fNeedDhcpServer ? TRUE : FALSE);188 m->s.fAdvertiseDefaultIPv6Route, 189 m->s.fNeedDhcpServer); 272 190 273 191 return S_OK; … … 283 201 HRESULT NATNetwork::getNetworkName(com::Utf8Str &aNetworkName) 284 202 { 285 aNetworkName = m Name;203 aNetworkName = m->s.strNetworkName; 286 204 return S_OK; 287 205 } … … 291 209 { 292 210 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 293 if (aNetworkName == m Name)211 if (aNetworkName == m->s.strNetworkName) 294 212 return S_OK; 295 213 296 unconst(mName)= aNetworkName;297 } 298 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);299 HRESULT rc = m VirtualBox->i_saveSettings();214 m->s.strNetworkName = aNetworkName; 215 } 216 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 217 HRESULT rc = m->pVirtualBox->i_saveSettings(); 300 218 ComAssertComRCRetRC(rc); 301 219 … … 305 223 HRESULT NATNetwork::getEnabled(BOOL *aEnabled) 306 224 { 307 *aEnabled = m-> fEnabled;225 *aEnabled = m->s.fEnabled; 308 226 309 227 i_recalculateIpv4AddressAssignments(); … … 315 233 { 316 234 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 317 if ( aEnabled == m->fEnabled)235 if (RT_BOOL(aEnabled) == m->s.fEnabled) 318 236 return S_OK; 319 m-> fEnabled = aEnabled;320 } 321 322 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);323 HRESULT rc = m VirtualBox->i_saveSettings();237 m->s.fEnabled = RT_BOOL(aEnabled); 238 } 239 240 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 241 HRESULT rc = m->pVirtualBox->i_saveSettings(); 324 242 ComAssertComRCRetRC(rc); 325 243 return S_OK; … … 334 252 HRESULT NATNetwork::getNetwork(com::Utf8Str &aNetwork) 335 253 { 336 aNetwork = m-> IPv4NetworkCidr;254 aNetwork = m->s.strIPv4NetworkCidr; 337 255 return S_OK; 338 256 } … … 345 263 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 346 264 347 if (aIPv4NetworkCidr == m-> IPv4NetworkCidr)265 if (aIPv4NetworkCidr == m->s.strIPv4NetworkCidr) 348 266 return S_OK; 349 267 … … 352 270 * as offset from network id. 353 271 */ 354 if (!m-> mapName2PortForwardRule4.empty())272 if (!m->s.mapPortForwardRules4.empty()) 355 273 return S_OK; 356 274 357 275 358 unconst(m->IPv4NetworkCidr)= aIPv4NetworkCidr;276 m->s.strIPv4NetworkCidr = aIPv4NetworkCidr; 359 277 i_recalculateIpv4AddressAssignments(); 360 278 } 361 279 362 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);363 HRESULT rc = m VirtualBox->i_saveSettings();280 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 281 HRESULT rc = m->pVirtualBox->i_saveSettings(); 364 282 ComAssertComRCRetRC(rc); 365 283 return S_OK; … … 369 287 HRESULT NATNetwork::getIPv6Enabled(BOOL *aIPv6Enabled) 370 288 { 371 *aIPv6Enabled = m-> fIPv6Enabled;289 *aIPv6Enabled = m->s.fIPv6Enabled; 372 290 373 291 return S_OK; … … 380 298 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 381 299 382 if ( aIPv6Enabled == m->fIPv6Enabled)300 if (RT_BOOL(aIPv6Enabled) == m->s.fIPv6Enabled) 383 301 return S_OK; 384 302 385 m-> fIPv6Enabled = aIPv6Enabled;386 } 387 388 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);389 HRESULT rc = m VirtualBox->i_saveSettings();303 m->s.fIPv6Enabled = RT_BOOL(aIPv6Enabled); 304 } 305 306 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 307 HRESULT rc = m->pVirtualBox->i_saveSettings(); 390 308 ComAssertComRCRetRC(rc); 391 309 … … 398 316 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 399 317 400 aIPv6Prefix = m-> IPv6Prefix;318 aIPv6Prefix = m->s.strIPv6Prefix; 401 319 return S_OK; 402 320 } … … 407 325 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 408 326 409 if (aIPv6Prefix == m-> IPv6Prefix)327 if (aIPv6Prefix == m->s.strIPv6Prefix) 410 328 return S_OK; 411 329 … … 413 331 * todo: see similar todo in NATNetwork::COMSETTER(Network)(IN_BSTR) 414 332 */ 415 if (!m-> mapName2PortForwardRule6.empty())333 if (!m->s.mapPortForwardRules6.empty()) 416 334 return S_OK; 417 335 418 unconst(m->IPv6Prefix) = Bstr(aIPv6Prefix);419 } 420 421 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);422 HRESULT rc = m VirtualBox->i_saveSettings();336 m->s.strIPv6Prefix = aIPv6Prefix; 337 } 338 339 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 340 HRESULT rc = m->pVirtualBox->i_saveSettings(); 423 341 ComAssertComRCRetRC(rc); 424 342 … … 429 347 HRESULT NATNetwork::getAdvertiseDefaultIPv6RouteEnabled(BOOL *aAdvertiseDefaultIPv6Route) 430 348 { 431 *aAdvertiseDefaultIPv6Route = m-> fAdvertiseDefaultIPv6Route;349 *aAdvertiseDefaultIPv6Route = m->s.fAdvertiseDefaultIPv6Route; 432 350 433 351 return S_OK; … … 440 358 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 441 359 442 if ( aAdvertiseDefaultIPv6Route == m->fAdvertiseDefaultIPv6Route)360 if (RT_BOOL(aAdvertiseDefaultIPv6Route) == m->s.fAdvertiseDefaultIPv6Route) 443 361 return S_OK; 444 362 445 m-> fAdvertiseDefaultIPv6Route = aAdvertiseDefaultIPv6Route;446 447 } 448 449 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);450 HRESULT rc = m VirtualBox->i_saveSettings();363 m->s.fAdvertiseDefaultIPv6Route = RT_BOOL(aAdvertiseDefaultIPv6Route); 364 365 } 366 367 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 368 HRESULT rc = m->pVirtualBox->i_saveSettings(); 451 369 ComAssertComRCRetRC(rc); 452 370 … … 457 375 HRESULT NATNetwork::getNeedDhcpServer(BOOL *aNeedDhcpServer) 458 376 { 459 *aNeedDhcpServer = m-> fNeedDhcpServer;377 *aNeedDhcpServer = m->s.fNeedDhcpServer; 460 378 461 379 return S_OK; … … 467 385 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 468 386 469 if ( aNeedDhcpServer == m->fNeedDhcpServer)387 if (RT_BOOL(aNeedDhcpServer) == m->s.fNeedDhcpServer) 470 388 return S_OK; 471 389 472 m-> fNeedDhcpServer = aNeedDhcpServer;390 m->s.fNeedDhcpServer = RT_BOOL(aNeedDhcpServer); 473 391 474 392 i_recalculateIpv4AddressAssignments(); … … 476 394 } 477 395 478 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);479 HRESULT rc = m VirtualBox->i_saveSettings();396 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 397 HRESULT rc = m->pVirtualBox->i_saveSettings(); 480 398 ComAssertComRCRetRC(rc); 481 399 … … 487 405 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 488 406 489 aLocalMappings.resize(m-> maNATLoopbackOffsetList.size());407 aLocalMappings.resize(m->s.llHostLoopbackOffsetList.size()); 490 408 size_t i = 0; 491 for (settings::NATLoopbackOffsetList::const_iterator it = m-> maNATLoopbackOffsetList.begin();492 it != m-> maNATLoopbackOffsetList.end(); ++it, ++i)409 for (settings::NATLoopbackOffsetList::const_iterator it = m->s.llHostLoopbackOffsetList.begin(); 410 it != m->s.llHostLoopbackOffsetList.end(); ++it, ++i) 493 411 { 494 412 aLocalMappings[i] = Utf8StrFmt("%s=%d", … … 513 431 514 432 /* check against networkid vs network mask */ 515 rc = RTCidrStrToIPv4(Utf8Str(m-> IPv4NetworkCidr).c_str(), &net, &mask);433 rc = RTCidrStrToIPv4(Utf8Str(m->s.strIPv4NetworkCidr).c_str(), &net, &mask); 516 434 if (RT_FAILURE(rc)) 517 435 return E_INVALIDARG; … … 522 440 settings::NATLoopbackOffsetList::iterator it; 523 441 524 it = std::find(m-> maNATLoopbackOffsetList.begin(),525 m-> maNATLoopbackOffsetList.end(),442 it = std::find(m->s.llHostLoopbackOffsetList.begin(), 443 m->s.llHostLoopbackOffsetList.end(), 526 444 aHostId); 527 if (it != m-> maNATLoopbackOffsetList.end())445 if (it != m->s.llHostLoopbackOffsetList.end()) 528 446 { 529 447 if (aOffset == 0) /* erase */ 530 m-> maNATLoopbackOffsetList.erase(it, it);448 m->s.llHostLoopbackOffsetList.erase(it, it); 531 449 else /* modify */ 532 450 { 533 451 settings::NATLoopbackOffsetList::iterator it1; 534 it1 = std::find(m-> maNATLoopbackOffsetList.begin(),535 m->maNATLoopbackOffsetList.end(),536 (uint32_t)aOffset);537 if (it1 != m-> maNATLoopbackOffsetList.end())452 it1 = std::find(m->s.llHostLoopbackOffsetList.begin(), 453 m->s.llHostLoopbackOffsetList.end(), 454 (uint32_t)aOffset); 455 if (it1 != m->s.llHostLoopbackOffsetList.end()) 538 456 return E_INVALIDARG; /* this offset is already registered. */ 539 457 … … 541 459 } 542 460 543 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);544 return m VirtualBox->i_saveSettings();461 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 462 return m->pVirtualBox->i_saveSettings(); 545 463 } 546 464 547 465 /* injection */ 548 it = std::find(m-> maNATLoopbackOffsetList.begin(),549 m-> maNATLoopbackOffsetList.end(),466 it = std::find(m->s.llHostLoopbackOffsetList.begin(), 467 m->s.llHostLoopbackOffsetList.end(), 550 468 (uint32_t)aOffset); 551 469 552 if (it != m-> maNATLoopbackOffsetList.end())470 if (it != m->s.llHostLoopbackOffsetList.end()) 553 471 return E_INVALIDARG; /* offset is already registered. */ 554 472 … … 556 474 off.strLoopbackHostAddress = aHostId; 557 475 off.u32Offset = (uint32_t)aOffset; 558 m-> maNATLoopbackOffsetList.push_back(off);559 560 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);561 return m VirtualBox->i_saveSettings();476 m->s.llHostLoopbackOffsetList.push_back(off); 477 478 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 479 return m->pVirtualBox->i_saveSettings(); 562 480 } 563 481 … … 567 485 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 568 486 569 *aLoopbackIp6 = m-> u32LoopbackIp6;487 *aLoopbackIp6 = m->s.u32HostLoopback6Offset; 570 488 return S_OK; 571 489 } … … 580 498 return E_INVALIDARG; 581 499 582 if (static_cast<uint32_t>(aLoopbackIp6) == m-> u32LoopbackIp6)500 if (static_cast<uint32_t>(aLoopbackIp6) == m->s.u32HostLoopback6Offset) 583 501 return S_OK; 584 502 585 m-> u32LoopbackIp6= aLoopbackIp6;586 } 587 588 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);589 return m VirtualBox->i_saveSettings();503 m->s.u32HostLoopback6Offset = aLoopbackIp6; 504 } 505 506 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 507 return m->pVirtualBox->i_saveSettings(); 590 508 } 591 509 … … 595 513 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 596 514 i_getPortForwardRulesFromMap(aPortForwardRules4, 597 m-> mapName2PortForwardRule4);515 m->s.mapPortForwardRules4); 598 516 return S_OK; 599 517 } … … 603 521 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 604 522 i_getPortForwardRulesFromMap(aPortForwardRules6, 605 m-> mapName2PortForwardRule6);523 m->s.mapPortForwardRules6); 606 524 return S_OK; 607 525 } … … 620 538 Utf8Str proto; 621 539 settings::NATRule r; 622 NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6 : m->mapName2PortForwardRule4;540 settings::NATRulesMap &mapRules = aIsIpv6 ? m->s.mapPortForwardRules6 : m->s.mapPortForwardRules4; 623 541 switch (aProto) 624 542 { … … 637 555 aGuestIp.c_str(), aGuestPort); 638 556 639 for ( NATRuleMap::iterator it = mapRules.begin(); it != mapRules.end(); ++it)557 for (settings::NATRulesMap::iterator it = mapRules.begin(); it != mapRules.end(); ++it) 640 558 { 641 559 r = it->second; … … 659 577 } 660 578 { 661 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);662 HRESULT rc = m VirtualBox->i_saveSettings();579 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 580 HRESULT rc = m->pVirtualBox->i_saveSettings(); 663 581 ComAssertComRCRetRC(rc); 664 582 } 665 583 666 m VirtualBox->i_onNATNetworkPortForward(Bstr(mName).raw(), TRUE, aIsIpv6,667 Bstr(aPortForwardRuleName).raw(), aProto,668 Bstr(aHostIp).raw(), aHostPort,669 Bstr(aGuestIp).raw(), aGuestPort);584 m->pVirtualBox->i_onNATNetworkPortForward(Bstr(m->s.strNetworkName).raw(), TRUE, aIsIpv6, 585 Bstr(aPortForwardRuleName).raw(), aProto, 586 Bstr(aHostIp).raw(), aHostPort, 587 Bstr(aGuestIp).raw(), aGuestPort); 670 588 671 589 /* Notify listerners listening on this network only */ 672 fireNATNetworkPortForwardEvent(m->pEventSource, Bstr(m Name).raw(), TRUE,590 fireNATNetworkPortForwardEvent(m->pEventSource, Bstr(m->s.strNetworkName).raw(), TRUE, 673 591 aIsIpv6, Bstr(aPortForwardRuleName).raw(), aProto, 674 592 Bstr(aHostIp).raw(), aHostPort, … … 688 606 { 689 607 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 690 NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6 : m->mapName2PortForwardRule4;691 NATRuleMap::iterator it = mapRules.find(aPortForwardRuleName);608 settings::NATRulesMap &mapRules = aIsIpv6 ? m->s.mapPortForwardRules6 : m->s.mapPortForwardRules4; 609 settings::NATRulesMap::iterator it = mapRules.find(aPortForwardRuleName); 692 610 693 611 if (it == mapRules.end()) … … 704 622 705 623 { 706 AutoWriteLock vboxLock(m VirtualBox COMMA_LOCKVAL_SRC_POS);707 HRESULT rc = m VirtualBox->i_saveSettings();624 AutoWriteLock vboxLock(m->pVirtualBox COMMA_LOCKVAL_SRC_POS); 625 HRESULT rc = m->pVirtualBox->i_saveSettings(); 708 626 ComAssertComRCRetRC(rc); 709 627 } 710 628 711 m VirtualBox->i_onNATNetworkPortForward(Bstr(mName).raw(), FALSE, aIsIpv6,712 Bstr(aPortForwardRuleName).raw(), proto,713 Bstr(strHostIP).raw(), u16HostPort,714 Bstr(strGuestIP).raw(), u16GuestPort);629 m->pVirtualBox->i_onNATNetworkPortForward(Bstr(m->s.strNetworkName).raw(), FALSE, aIsIpv6, 630 Bstr(aPortForwardRuleName).raw(), proto, 631 Bstr(strHostIP).raw(), u16HostPort, 632 Bstr(strGuestIP).raw(), u16GuestPort); 715 633 716 634 /* Notify listerners listening on this network only */ 717 fireNATNetworkPortForwardEvent(m->pEventSource, Bstr(m Name).raw(), FALSE,635 fireNATNetworkPortForwardEvent(m->pEventSource, Bstr(m->s.strNetworkName).raw(), FALSE, 718 636 aIsIpv6, Bstr(aPortForwardRuleName).raw(), proto, 719 637 Bstr(strHostIP).raw(), u16HostPort, … … 726 644 { 727 645 #ifdef VBOX_WITH_NAT_SERVICE 728 if (!m-> fEnabled) return S_OK;729 730 m->NATRunner.setOption(NetworkServiceRunner::kNsrKeyNetwork, Utf8Str(m Name).c_str());646 if (!m->s.fEnabled) return S_OK; 647 648 m->NATRunner.setOption(NetworkServiceRunner::kNsrKeyNetwork, Utf8Str(m->s.strNetworkName).c_str()); 731 649 m->NATRunner.setOption(NetworkServiceRunner::kNsrKeyTrunkType, Utf8Str(aTrunkType).c_str()); 732 650 m->NATRunner.setOption(NetworkServiceRunner::kNsrIpAddress, Utf8Str(m->IPv4Gateway).c_str()); … … 735 653 /* No portforwarding rules from command-line, all will be fetched via API */ 736 654 737 if (m-> fNeedDhcpServer)655 if (m->s.fNeedDhcpServer) 738 656 { 739 657 /* … … 751 669 * 6. start dhcp server. 752 670 */ 753 HRESULT hrc = m VirtualBox->FindDHCPServerByNetworkName(Bstr(mName).raw(),754 m->dhcpServer.asOutParam());671 HRESULT hrc = m->pVirtualBox->FindDHCPServerByNetworkName(Bstr(m->s.strNetworkName).raw(), 672 m->dhcpServer.asOutParam()); 755 673 switch (hrc) 756 674 { 757 675 case E_INVALIDARG: 758 676 /* server haven't beeen found let create it then */ 759 hrc = m VirtualBox->CreateDHCPServer(Bstr(mName).raw(),760 m->dhcpServer.asOutParam());677 hrc = m->pVirtualBox->CreateDHCPServer(Bstr(m->s.strNetworkName).raw(), 678 m->dhcpServer.asOutParam()); 761 679 if (FAILED(hrc)) 762 680 return E_FAIL; … … 796 714 m->dhcpServer->AddGlobalOption(DhcpOpt_Router, Bstr(m->IPv4Gateway).raw()); 797 715 798 hrc = m->dhcpServer->Start(Bstr(m Name).raw(), Bstr("").raw(), Bstr(aTrunkType).raw());716 hrc = m->dhcpServer->Start(Bstr(m->s.strNetworkName).raw(), Bstr("").raw(), Bstr(aTrunkType).raw()); 799 717 if (FAILED(hrc)) 800 718 { … … 806 724 if (RT_SUCCESS(m->NATRunner.start(false /* KillProcOnStop */))) 807 725 { 808 m VirtualBox->i_onNATNetworkStartStop(Bstr(mName).raw(), TRUE);726 m->pVirtualBox->i_onNATNetworkStartStop(Bstr(m->s.strNetworkName).raw(), TRUE); 809 727 return S_OK; 810 728 } … … 820 738 { 821 739 #ifdef VBOX_WITH_NAT_SERVICE 822 m VirtualBox->i_onNATNetworkStartStop(Bstr(mName).raw(), FALSE);740 m->pVirtualBox->i_onNATNetworkStartStop(Bstr(m->s.strNetworkName).raw(), FALSE); 823 741 824 742 if (!m->dhcpServer.isNull()) … … 836 754 837 755 838 void NATNetwork::i_getPortForwardRulesFromMap(std::vector<com::Utf8Str> &aPortForwardRules, NATRuleMap&aRules)756 void NATNetwork::i_getPortForwardRulesFromMap(std::vector<com::Utf8Str> &aPortForwardRules, settings::NATRulesMap &aRules) 839 757 { 840 758 aPortForwardRules.resize(aRules.size()); 841 759 size_t i = 0; 842 for ( NATRuleMap::const_iterator it = aRules.begin();760 for (settings::NATRulesMap::const_iterator it = aRules.begin(); 843 761 it != aRules.end(); ++it, ++i) 844 762 { 845 763 settings::NATRule r = it->second; 846 764 aPortForwardRules[i] = Utf8StrFmt("%s:%s:[%s]:%d:[%s]:%d", 847 765 r.strName.c_str(), 848 (r.proto == NATProtocol_TCP ? "tcp" : "udp"),766 (r.proto == NATProtocol_TCP ? "tcp" : "udp"), 849 767 r.strHostIP.c_str(), 850 768 r.u16HostPort, … … 859 777 RTNETADDRIPV4 network, netmask; 860 778 861 int rc = RTCidrStrToIPv4(m-> IPv4NetworkCidr.c_str(),779 int rc = RTCidrStrToIPv4(m->s.strIPv4NetworkCidr.c_str(), 862 780 &network, 863 781 &netmask); … … 868 786 { 869 787 bool skip = false; 870 for (settings::NATLoopbackOffsetList::iterator it = m-> maNATLoopbackOffsetList.begin();871 it != m-> maNATLoopbackOffsetList.end();788 for (settings::NATLoopbackOffsetList::iterator it = m->s.llHostLoopbackOffsetList.begin(); 789 it != m->s.llHostLoopbackOffsetList.end(); 872 790 ++it) 873 791 { … … 912 830 { 913 831 RTNETADDRIPV4 network, netmask; 914 int rc = RTCidrStrToIPv4(m-> IPv4NetworkCidr.c_str(),832 int rc = RTCidrStrToIPv4(m->s.strIPv4NetworkCidr.c_str(), 915 833 &network, 916 834 &netmask); … … 918 836 919 837 i_findFirstAvailableOffset(ADDR_GATEWAY, &m->offGateway); 920 if (m-> fNeedDhcpServer)838 if (m->s.fNeedDhcpServer) 921 839 i_findFirstAvailableOffset(ADDR_DHCP, &m->offDhcp); 922 840 … … 929 847 m->IPv4Gateway = szTmpIp; 930 848 931 if (m-> fNeedDhcpServer)849 if (m->s.fNeedDhcpServer) 932 850 { 933 851 RTNETADDRIPV4 dhcpserver = network; … … 972 890 973 891 RTNETADDRIPV4 net, mask; 974 rc = RTCidrStrToIPv4(Utf8Str(m-> IPv4NetworkCidr).c_str(), &net, &mask);892 rc = RTCidrStrToIPv4(Utf8Str(m->s.strIPv4NetworkCidr).c_str(), &net, &mask); 975 893 if (RT_FAILURE(rc)) 976 894 return rc; … … 1001 919 RTStrPrintf(szBuf, sizeof(szBuf), "%RTnaipv6/64", &prefix); 1002 920 1003 m-> IPv6Prefix = szBuf;921 m->s.strIPv6Prefix = szBuf; 1004 922 return VINF_SUCCESS; 1005 923 } -
trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp
r60763 r60786 522 522 rc = pNATNetwork.createObject(); 523 523 AssertComRCThrowRC(rc); 524 rc = pNATNetwork->init(this, net); 524 rc = pNATNetwork->init(this, ""); 525 AssertComRCThrowRC(rc); 526 rc = pNATNetwork->i_loadSettings(net); 525 527 AssertComRCThrowRC(rc); 526 528 rc = i_registerNATNetwork(pNATNetwork, false /* aSaveRegistry */); -
trunk/src/VBox/Main/xml/Settings.cpp
r60410 r60786 55 55 56 56 /* 57 * Copyright (C) 2007-201 5Oracle Corporation57 * Copyright (C) 2007-2016 Oracle Corporation 58 58 * 59 59 * This file is part of VirtualBox Open Source Edition (OSE), as … … 868 868 * declaration in ovmfreader.h. 869 869 */ 870 void ConfigFileBase::readNATForwardRule List(const xml::ElementNode &elmParent, NATRuleList &llRules)870 void ConfigFileBase::readNATForwardRulesMap(const xml::ElementNode &elmParent, NATRulesMap &mapRules) 871 871 { 872 872 xml::ElementNodesList plstRules; … … 884 884 (*pf)->getAttributeValue("guestport", port); 885 885 rule.u16GuestPort = port; 886 llRules.push_back(rule);886 mapRules.insert(std::make_pair(rule.strName, rule)); 887 887 } 888 888 } … … 1263 1263 * because this method used for serializing per-_mahine's_adapter_ and per-network approaches. 1264 1264 */ 1265 void ConfigFileBase::buildNATForwardRule List(xml::ElementNode &elmParent, const NATRuleList &natRuleList)1266 { 1267 for (NATRule List::const_iterator r = natRuleList.begin();1268 r != natRuleList.end(); ++r)1265 void ConfigFileBase::buildNATForwardRulesMap(xml::ElementNode &elmParent, const NATRulesMap &mapRules) 1266 { 1267 for (NATRulesMap::const_iterator r = mapRules.begin(); 1268 r != mapRules.end(); ++r) 1269 1269 { 1270 1270 xml::ElementNode *pelmPF; 1271 1271 pelmPF = elmParent.createChild("Forwarding"); 1272 if ((*r).strName.length()) 1273 pelmPF->setAttribute("name", (*r).strName); 1274 pelmPF->setAttribute("proto", (*r).proto); 1275 if ((*r).strHostIP.length()) 1276 pelmPF->setAttribute("hostip", (*r).strHostIP); 1277 if ((*r).u16HostPort) 1278 pelmPF->setAttribute("hostport", (*r).u16HostPort); 1279 if ((*r).strGuestIP.length()) 1280 pelmPF->setAttribute("guestip", (*r).strGuestIP); 1281 if ((*r).u16GuestPort) 1282 pelmPF->setAttribute("guestport", (*r).u16GuestPort); 1272 const NATRule &nr = r->second; 1273 if (nr.strName.length()) 1274 pelmPF->setAttribute("name", nr.strName); 1275 pelmPF->setAttribute("proto", nr.proto); 1276 if (nr.strHostIP.length()) 1277 pelmPF->setAttribute("hostip", nr.strHostIP); 1278 if (nr.u16HostPort) 1279 pelmPF->setAttribute("hostport", nr.u16HostPort); 1280 if (nr.strGuestIP.length()) 1281 pelmPF->setAttribute("guestip", nr.strGuestIP); 1282 if (nr.u16GuestPort) 1283 pelmPF->setAttribute("guestport", nr.u16GuestPort); 1283 1284 } 1284 1285 } … … 1476 1477 if ( pelmNet->getAttributeValue("networkName", net.strNetworkName) 1477 1478 && pelmNet->getAttributeValue("enabled", net.fEnabled) 1478 && pelmNet->getAttributeValue("network", net.str Network)1479 && pelmNet->getAttributeValue("ipv6", net.fIPv6 )1479 && pelmNet->getAttributeValue("network", net.strIPv4NetworkCidr) 1480 && pelmNet->getAttributeValue("ipv6", net.fIPv6Enabled) 1480 1481 && pelmNet->getAttributeValue("ipv6prefix", net.strIPv6Prefix) 1481 1482 && pelmNet->getAttributeValue("advertiseDefaultIPv6Route", net.fAdvertiseDefaultIPv6Route) … … 1489 1490 const xml::ElementNode *pelmPortForwardRules4; 1490 1491 if ((pelmPortForwardRules4 = pelmNet->findChildElement("PortForwarding4"))) 1491 readNATForwardRule List(*pelmPortForwardRules4,1492 net. llPortForwardRules4);1492 readNATForwardRulesMap(*pelmPortForwardRules4, 1493 net.mapPortForwardRules4); 1493 1494 1494 1495 const xml::ElementNode *pelmPortForwardRules6; 1495 1496 if ((pelmPortForwardRules6 = pelmNet->findChildElement("PortForwarding6"))) 1496 readNATForwardRule List(*pelmPortForwardRules6,1497 net. llPortForwardRules6);1497 readNATForwardRulesMap(*pelmPortForwardRules6, 1498 net.mapPortForwardRules6); 1498 1499 1499 1500 llNATNetworks.push_back(net); … … 1810 1811 xml::ElementNode *pelmThis = pelmNATNetworks->createChild("NATNetwork"); 1811 1812 pelmThis->setAttribute("networkName", n.strNetworkName); 1812 pelmThis->setAttribute("network", n.str Network);1813 pelmThis->setAttribute("ipv6", n.fIPv6 ? 1 : 0);1813 pelmThis->setAttribute("network", n.strIPv4NetworkCidr); 1814 pelmThis->setAttribute("ipv6", n.fIPv6Enabled ? 1 : 0); 1814 1815 pelmThis->setAttribute("ipv6prefix", n.strIPv6Prefix); 1815 1816 pelmThis->setAttribute("advertiseDefaultIPv6Route", (n.fAdvertiseDefaultIPv6Route)? 1 : 0); 1816 1817 pelmThis->setAttribute("needDhcp", (n.fNeedDhcpServer) ? 1 : 0); 1817 1818 pelmThis->setAttribute("enabled", (n.fEnabled) ? 1 : 0); // too bad we chose 1 vs. 0 here 1818 if (n. llPortForwardRules4.size())1819 if (n.mapPortForwardRules4.size()) 1819 1820 { 1820 1821 xml::ElementNode *pelmPf4 = pelmThis->createChild("PortForwarding4"); 1821 buildNATForwardRule List(*pelmPf4, n.llPortForwardRules4);1822 } 1823 if (n. llPortForwardRules6.size())1822 buildNATForwardRulesMap(*pelmPf4, n.mapPortForwardRules4); 1823 } 1824 if (n.mapPortForwardRules6.size()) 1824 1825 { 1825 1826 xml::ElementNode *pelmPf6 = pelmThis->createChild("PortForwarding6"); 1826 buildNATForwardRule List(*pelmPf6, n.llPortForwardRules6);1827 buildNATForwardRulesMap(*pelmPf6, n.mapPortForwardRules6); 1827 1828 } 1828 1829 … … 2547 2548 } 2548 2549 2549 readNATForwardRule List(elmMode, nic.nat.llRules);2550 readNATForwardRulesMap(elmMode, nic.nat.mapRules); 2550 2551 } 2551 2552 else if ( elmMode.nameEquals("HostInterface") … … 5103 5104 pelmTFTP->setAttribute("next-server", nic.nat.strTFTPNextServer); 5104 5105 } 5105 buildNATForwardRule List(*pelmNAT, nic.nat.llRules);5106 buildNATForwardRulesMap(*pelmNAT, nic.nat.mapRules); 5106 5107 break; 5107 5108 … … 6163 6164 || netit->nat.strTFTPBootFile.length() 6164 6165 || netit->nat.strTFTPNextServer.length() 6165 || netit->nat. llRules.size()6166 || netit->nat.mapRules.size() 6166 6167 ) 6167 6168 )
Note:
See TracChangeset
for help on using the changeset viewer.