VirtualBox

Changeset 58827 in vbox


Ignore:
Timestamp:
Nov 23, 2015 4:31:48 PM (9 years ago)
Author:
vboxsync
Message:

Main/NATNetwork: method to compute IPv6 prefix based on IPv4 network
address, like VBoxNetNAT has been doing privately all this time. Use
it if the settings have empty IPv6 prefix or bogus old link-local
default.

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/NATNetworkImpl.h

    r50174 r58827  
    114114    int i_recalculateIpv4AddressAssignments();
    115115    int i_findFirstAvailableOffset(ADDRESSLOOKUPTYPE, uint32_t *);
     116    int i_recalculateIPv6Prefix();
    116117
    117118    typedef std::map<Utf8Str, settings::NATRule> NATRuleMap;
  • trunk/src/VBox/Main/src-server/NATNetworkImpl.cpp

    r54705 r58827  
    140140    m->offGateway = 1;
    141141    m->IPv4NetworkCidr = "10.0.2.0/24";
    142     m->IPv6Prefix = "fe80::/64";
     142    i_recalculateIPv6Prefix();  /* set m->IPv6Prefix based on IPv4 */
    143143
    144144    settings::NATHostLoopbackOffset off;
     
    179179    m->fNeedDhcpServer = data.fNeedDhcpServer;
    180180    m->fIPv6Enabled = data.fIPv6;
     181
     182    if (   data.strIPv6Prefix.isEmpty()
     183           /* 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;
    181188
    182189    m->u32LoopbackIp6 = data.u32HostLoopback6Offset;
     
    958965    return VINF_SUCCESS;
    959966}
     967
     968
     969int NATNetwork::i_recalculateIPv6Prefix()
     970{
     971    int rc;
     972
     973    RTNETADDRIPV4 net, mask;
     974    rc = RTCidrStrToIPv4(Utf8Str(m->IPv4NetworkCidr).c_str(), &net, &mask);
     975    if (RT_FAILURE(rc))
     976        return rc;
     977
     978    net.u = RT_H2N_U32(net.u);  /* XXX: fix RTCidrStrToIPv4! */
     979
     980    /*
     981     * [fd17:625c:f037:XXXX::/64] - RFC 4193 (ULA) Locally Assigned
     982     * Global ID where XXXX, 16 bit Subnet ID, are two bytes from the
     983     * middle of the IPv4 address, e.g. :dead: for 10.222.173.1
     984     */
     985    RTNETADDRIPV6 prefix;
     986    RT_ZERO(prefix);
     987
     988    prefix.au8[0] = 0xFD;
     989    prefix.au8[1] = 0x17;
     990
     991    prefix.au8[2] = 0x62;
     992    prefix.au8[3] = 0x5C;
     993
     994    prefix.au8[4] = 0xF0;
     995    prefix.au8[5] = 0x37;
     996
     997    prefix.au8[6] = net.au8[1];
     998    prefix.au8[7] = net.au8[2];
     999
     1000    char szBuf[32];
     1001    RTStrPrintf(szBuf, sizeof(szBuf), "%RTnaipv6/64", &prefix);
     1002
     1003    m->IPv6Prefix = szBuf;
     1004    return VINF_SUCCESS;
     1005}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette