Changeset 49133 in vbox for trunk/src/VBox
- Timestamp:
- Oct 16, 2013 12:22:14 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 89986
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-server/NATNetworkImpl.cpp
r49131 r49133 290 290 CheckComArgOutPointerValid(aName); 291 291 AutoCaller autoCaller(this); 292 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 293 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 294 295 if (aName == mName) 296 return S_OK; 297 298 unconst(mName) = aName; 299 300 alock.release(); 292 293 if (FAILED(autoCaller.rc())) 294 return autoCaller.rc(); 295 296 { 297 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 298 299 if (aName == mName) 300 return S_OK; 301 302 unconst(mName) = aName; 303 } 304 301 305 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); 302 306 HRESULT rc = mVirtualBox->saveSettings(); … … 323 327 { 324 328 AutoCaller autoCaller(this); 325 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 326 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 327 328 if (aEnabled == m->fEnabled) 329 return S_OK; 330 331 m->fEnabled = aEnabled; 332 333 // save the global settings; for that we should hold only the VirtualBox lock 334 alock.release(); 329 if (FAILED(autoCaller.rc())) 330 return autoCaller.rc(); 331 332 { 333 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 334 335 if (aEnabled == m->fEnabled) 336 return S_OK; 337 338 m->fEnabled = aEnabled; 339 } 340 335 341 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); 336 342 HRESULT rc = mVirtualBox->saveSettings(); … … 367 373 368 374 AutoCaller autoCaller(this); 369 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 370 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 371 372 if (aIPv4NetworkCidr == m->IPv4NetworkCidr) 373 return S_OK; 375 if (FAILED(autoCaller.rc())) 376 return autoCaller.rc(); 377 378 { 379 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 380 381 if (aIPv4NetworkCidr == m->IPv4NetworkCidr) 382 return S_OK; 374 383 375 /* silently ignore network cidr update for now.376 * todo: keep internally guest address of port forward rule377 * as offset from network id.378 */379 if (m->mapName2PortForwardRule4.empty())380 {384 /* silently ignore network cidr update for now. 385 * todo: keep internally guest address of port forward rule 386 * as offset from network id. 387 */ 388 if (!m->mapName2PortForwardRule4.empty()) 389 return S_OK; 381 390 382 391 unconst(m->IPv4NetworkCidr) = Bstr(aIPv4NetworkCidr); 383 392 recalculateIpv4AddressAssignments(); 384 alock.release(); 385 386 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); 387 HRESULT rc = mVirtualBox->saveSettings(); 388 ComAssertComRCRetRC(rc); 389 } 390 return S_OK; 391 } 392 393 STDMETHODIMP NATNetwork::COMGETTER(IPv6Enabled)(BOOL *aIPv6Enabled) 394 { 395 CheckComArgOutPointerValid(aIPv6Enabled); 396 397 AutoCaller autoCaller(this); 398 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 399 400 *aIPv6Enabled = m->fIPv6Enabled; 401 402 return S_OK; 403 } 404 405 STDMETHODIMP NATNetwork::COMSETTER(IPv6Enabled)(BOOL aIPv6Enabled) 406 { 407 AutoCaller autoCaller(this); 408 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 409 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 410 411 if (aIPv6Enabled == m->fIPv6Enabled) 412 return S_OK; 413 414 m->fIPv6Enabled = aIPv6Enabled; 415 416 // save the global settings; for that we should hold only the VirtualBox lock 417 alock.release(); 393 } 418 394 419 395 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); … … 424 400 } 425 401 426 STDMETHODIMP NATNetwork::COMGETTER(IPv6Prefix) (BSTR *aIPv6Prefix) 427 { 428 CheckComArgOutPointerValid(aIPv6Prefix); 429 430 AutoCaller autoCaller(this); 431 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 432 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 433 434 m->IPv6Prefix.cloneTo(aIPv6Prefix); 435 436 return S_OK; 437 } 438 439 STDMETHODIMP NATNetwork::COMSETTER(IPv6Prefix) (IN_BSTR aIPv6Prefix) 440 { 441 CheckComArgOutPointerValid(aIPv6Prefix); 442 443 AutoCaller autoCaller(this); 444 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 445 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 446 447 if (aIPv6Prefix == m->IPv6Prefix) 448 return S_OK; 449 450 /* silently ignore network IPv6 prefix update. 451 * todo: see similar todo in NATNetwork::COMSETTER(Network)(IN_BSTR) 452 */ 453 if (m->mapName2PortForwardRule6.empty()) 454 { 455 456 unconst(m->IPv6Prefix) = Bstr(aIPv6Prefix); 457 /* @todo: do we need recalculation ? */ 458 alock.release(); 459 460 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); 461 HRESULT rc = mVirtualBox->saveSettings(); 462 ComAssertComRCRetRC(rc); 463 } 464 465 return S_OK; 466 } 467 468 STDMETHODIMP NATNetwork::COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL *aAdvertiseDefaultIPv6Route) 469 { 470 CheckComArgOutPointerValid(aAdvertiseDefaultIPv6Route); 471 472 AutoCaller autoCaller(this); 473 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 474 475 *aAdvertiseDefaultIPv6Route = m->fAdvertiseDefaultIPv6Route; 476 477 return S_OK; 478 } 479 480 STDMETHODIMP NATNetwork::COMSETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL aAdvertiseDefaultIPv6Route) 481 { 482 AutoCaller autoCaller(this); 483 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 484 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 485 486 if (aAdvertiseDefaultIPv6Route == m->fAdvertiseDefaultIPv6Route) 487 return S_OK; 488 489 m->fAdvertiseDefaultIPv6Route = aAdvertiseDefaultIPv6Route; 490 491 // save the global settings; for that we should hold only the VirtualBox lock 492 alock.release(); 402 STDMETHODIMP NATNetwork::COMGETTER(IPv6Enabled)(BOOL *aIPv6Enabled) 403 { 404 CheckComArgOutPointerValid(aIPv6Enabled); 405 406 AutoCaller autoCaller(this); 407 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 408 409 *aIPv6Enabled = m->fIPv6Enabled; 410 411 return S_OK; 412 } 413 414 STDMETHODIMP NATNetwork::COMSETTER(IPv6Enabled)(BOOL aIPv6Enabled) 415 { 416 AutoCaller autoCaller(this); 417 if (FAILED(autoCaller.rc())) 418 return autoCaller.rc(); 419 420 { 421 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 422 423 if (aIPv6Enabled == m->fIPv6Enabled) 424 return S_OK; 425 426 m->fIPv6Enabled = aIPv6Enabled; 427 } 428 493 429 494 430 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); … … 499 435 } 500 436 437 STDMETHODIMP NATNetwork::COMGETTER(IPv6Prefix) (BSTR *aIPv6Prefix) 438 { 439 CheckComArgOutPointerValid(aIPv6Prefix); 440 441 AutoCaller autoCaller(this); 442 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 443 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 444 445 m->IPv6Prefix.cloneTo(aIPv6Prefix); 446 447 return S_OK; 448 } 449 450 STDMETHODIMP NATNetwork::COMSETTER(IPv6Prefix) (IN_BSTR aIPv6Prefix) 451 { 452 CheckComArgOutPointerValid(aIPv6Prefix); 453 454 AutoCaller autoCaller(this); 455 if (FAILED(autoCaller.rc())) 456 return autoCaller.rc(); 457 458 { 459 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 460 461 if (aIPv6Prefix == m->IPv6Prefix) 462 return S_OK; 463 464 /* silently ignore network IPv6 prefix update. 465 * todo: see similar todo in NATNetwork::COMSETTER(Network)(IN_BSTR) 466 */ 467 if (!m->mapName2PortForwardRule6.empty()) 468 return S_OK; 469 470 unconst(m->IPv6Prefix) = Bstr(aIPv6Prefix); 471 } 472 473 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); 474 HRESULT rc = mVirtualBox->saveSettings(); 475 ComAssertComRCRetRC(rc); 476 477 return S_OK; 478 } 479 480 STDMETHODIMP NATNetwork::COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL *aAdvertiseDefaultIPv6Route) 481 { 482 CheckComArgOutPointerValid(aAdvertiseDefaultIPv6Route); 483 484 AutoCaller autoCaller(this); 485 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 486 487 *aAdvertiseDefaultIPv6Route = m->fAdvertiseDefaultIPv6Route; 488 489 return S_OK; 490 } 491 492 STDMETHODIMP NATNetwork::COMSETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL aAdvertiseDefaultIPv6Route) 493 { 494 AutoCaller autoCaller(this); 495 if (FAILED(autoCaller.rc())) 496 return autoCaller.rc(); 497 498 { 499 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 500 501 if (aAdvertiseDefaultIPv6Route == m->fAdvertiseDefaultIPv6Route) 502 return S_OK; 503 504 m->fAdvertiseDefaultIPv6Route = aAdvertiseDefaultIPv6Route; 505 506 } 507 508 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); 509 HRESULT rc = mVirtualBox->saveSettings(); 510 ComAssertComRCRetRC(rc); 511 512 return S_OK; 513 } 514 501 515 STDMETHODIMP NATNetwork::COMGETTER(NeedDhcpServer)(BOOL *aNeedDhcpServer) 502 516 { … … 514 528 { 515 529 AutoCaller autoCaller(this); 516 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 517 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 518 519 if (aNeedDhcpServer == m->fNeedDhcpServer) 520 return S_OK; 521 522 m->fNeedDhcpServer = aNeedDhcpServer; 523 524 recalculateIpv4AddressAssignments(); 525 526 // save the global settings; for that we should hold only the VirtualBox lock 527 alock.release(); 530 if (FAILED(autoCaller.rc())) 531 return autoCaller.rc(); 532 533 { 534 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 535 536 if (aNeedDhcpServer == m->fNeedDhcpServer) 537 return S_OK; 538 539 m->fNeedDhcpServer = aNeedDhcpServer; 540 541 recalculateIpv4AddressAssignments(); 542 543 } 528 544 529 545 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); … … 645 661 { 646 662 AutoCaller autoCaller(this); 647 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 648 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 649 650 if (aLoopbackIp6 < 0) 651 return E_INVALIDARG; 652 653 if (static_cast<uint32_t>(aLoopbackIp6) == m->u32LoopbackIp6) 654 return S_OK; 655 656 m->u32LoopbackIp6 = aLoopbackIp6; 663 if (FAILED(autoCaller.rc())) 664 return autoCaller.rc(); 665 666 { 667 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 668 669 if (aLoopbackIp6 < 0) 670 return E_INVALIDARG; 671 672 if (static_cast<uint32_t>(aLoopbackIp6) == m->u32LoopbackIp6) 673 return S_OK; 674 675 m->u32LoopbackIp6 = aLoopbackIp6; 676 } 657 677 658 678 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS); … … 670 690 GetPortForwardRulesFromMap(ComSafeArrayInArg(aPortForwardRules4), 671 691 m->mapName2PortForwardRule4); 672 alock.release();673 692 return S_OK; 674 693 } … … 696 715 { 697 716 AutoCaller autoCaller(this); 698 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 699 700 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 701 Utf8Str name = aPortForwardRuleName; 702 Utf8Str proto; 703 settings::NATRule r; 704 NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6 : m->mapName2PortForwardRule4; 717 if (FAILED(autoCaller.rc())) 718 return autoCaller.rc(); 719 720 { 721 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 722 Utf8Str name = aPortForwardRuleName; 723 Utf8Str proto; 724 settings::NATRule r; 725 NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6 : m->mapName2PortForwardRule4; 705 726 switch (aProto) 706 { 707 case NATProtocol_TCP: 708 proto = "tcp"; 709 break; 710 case NATProtocol_UDP: 711 proto = "udp"; 712 break; 713 default: 714 return E_INVALIDARG; 715 } 716 if (name.isEmpty()) 717 name = Utf8StrFmt("%s_[%s]%%%d_[%s]%%%d", proto.c_str(), 718 Utf8Str(aHostIp).c_str(), aHostPort, 719 Utf8Str(aGuestIp).c_str(), aGuestPort); 720 721 NATRuleMap::iterator it; 722 723 for (it = mapRules.begin(); it != mapRules.end(); ++it) 724 { 725 r = it->second; 726 if (it->first == name) 727 return setError(E_INVALIDARG, 728 tr("A NAT rule of this name already exists")); 729 if ( r.strHostIP == Utf8Str(aHostIp) 730 && r.u16HostPort == aHostPort 731 && r.proto == aProto) 732 return setError(E_INVALIDARG, 733 tr("A NAT rule for this host port and this host IP already exists")); 734 } 735 736 r.strName = name.c_str(); 737 r.proto = aProto; 738 r.strHostIP = aHostIp; 739 r.u16HostPort = aHostPort; 740 r.strGuestIP = aGuestIp; 741 r.u16GuestPort = aGuestPort; 742 mapRules.insert(std::make_pair(name, r)); 743 744 alock.release(); 727 { 728 case NATProtocol_TCP: 729 proto = "tcp"; 730 break; 731 case NATProtocol_UDP: 732 proto = "udp"; 733 break; 734 default: 735 return E_INVALIDARG; 736 } 737 if (name.isEmpty()) 738 name = Utf8StrFmt("%s_[%s]%%%d_[%s]%%%d", proto.c_str(), 739 Utf8Str(aHostIp).c_str(), aHostPort, 740 Utf8Str(aGuestIp).c_str(), aGuestPort); 741 742 NATRuleMap::iterator it; 743 744 for (it = mapRules.begin(); it != mapRules.end(); ++it) 745 { 746 r = it->second; 747 if (it->first == name) 748 return setError(E_INVALIDARG, 749 tr("A NAT rule of this name already exists")); 750 if ( r.strHostIP == Utf8Str(aHostIp) 751 && r.u16HostPort == aHostPort 752 && r.proto == aProto) 753 return setError(E_INVALIDARG, 754 tr("A NAT rule for this host port and this host IP already exists")); 755 } 756 757 r.strName = name.c_str(); 758 r.proto = aProto; 759 r.strHostIP = aHostIp; 760 r.u16HostPort = aHostPort; 761 r.strGuestIP = aGuestIp; 762 r.u16GuestPort = aGuestPort; 763 mapRules.insert(std::make_pair(name, r)); 764 } 745 765 746 766 { … … 766 786 { 767 787 AutoCaller autoCaller(this); 768 if (FAILED(autoCaller.rc())) return autoCaller.rc(); 769 770 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 771 NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6 : m->mapName2PortForwardRule4; 772 NATRuleMap::iterator it = mapRules.find(aPortForwardRuleName); 773 774 if (it == mapRules.end()) 775 return E_INVALIDARG; 776 777 Utf8Str strHostIP = it->second.strHostIP; 778 Utf8Str strGuestIP = it->second.strGuestIP; 779 uint16_t u16HostPort = it->second.u16HostPort; 780 uint16_t u16GuestPort = it->second.u16GuestPort; 781 NATProtocol_T proto = it->second.proto; 782 783 mapRules.erase(it); 784 785 alock.release(); 786 788 if (FAILED(autoCaller.rc())) 789 return autoCaller.rc(); 790 791 Utf8Str strHostIP; 792 Utf8Str strGuestIP; 793 uint16_t u16HostPort; 794 uint16_t u16GuestPort; 795 NATProtocol_T proto; 796 797 798 { 799 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 800 NATRuleMap& mapRules = aIsIpv6 ? m->mapName2PortForwardRule6 801 : m->mapName2PortForwardRule4; 802 803 NATRuleMap::iterator it = mapRules.find(aPortForwardRuleName); 804 805 if (it == mapRules.end()) 806 return E_INVALIDARG; 807 808 strHostIP = it->second.strHostIP; 809 strGuestIP = it->second.strGuestIP; 810 u16HostPort = it->second.u16HostPort; 811 u16GuestPort = it->second.u16GuestPort; 812 proto = it->second.proto; 813 814 mapRules.erase(it); 815 } 816 787 817 { 788 818 AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS);
Note:
See TracChangeset
for help on using the changeset viewer.