VirtualBox

Changeset 66860 in vbox for trunk


Ignore:
Timestamp:
May 10, 2017 11:51:10 AM (7 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:8847: Host Network Manager: Rework DHCP server parameters proposal code, it should propose wise parameters valid for immediate commit.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/hostnetwork
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkDetailsDialog.cpp

    r66855 r66860  
    6565    /* Save old data: */
    6666    m_oldData = data;
    67 
    68     /* Invent default old values if current old values are invalid: */
    69     const quint32 uAddr = ipv4FromQStringToQuint32(m_oldData.m_interface.m_strAddress);
    70     const quint32 uMask = ipv4FromQStringToQuint32(m_oldData.m_interface.m_strMask);
    71     const quint32 uProp = uAddr & uMask;
    72     const QString strMask = ipv4FromQuint32ToQString(uMask);
    73     const QString strProp = ipv4FromQuint32ToQString(uProp);
    74 //    printf("Proposal is = %s x %s\n",
    75 //           strProp.toUtf8().constData(),
    76 //           strMask.toUtf8().constData());
    77     if (   m_oldData.m_dhcpserver.m_strAddress.isEmpty()
    78         || m_oldData.m_dhcpserver.m_strAddress == "0.0.0.0")
    79         m_oldData.m_dhcpserver.m_strAddress = strProp;
    80     if (   m_oldData.m_dhcpserver.m_strMask.isEmpty()
    81         || m_oldData.m_dhcpserver.m_strMask == "0.0.0.0")
    82         m_oldData.m_dhcpserver.m_strMask = strMask;
    83     if (   m_oldData.m_dhcpserver.m_strLowerAddress.isEmpty()
    84         || m_oldData.m_dhcpserver.m_strLowerAddress == "0.0.0.0")
    85         m_oldData.m_dhcpserver.m_strLowerAddress = strProp;
    86     if (   m_oldData.m_dhcpserver.m_strUpperAddress.isEmpty()
    87         || m_oldData.m_dhcpserver.m_strUpperAddress == "0.0.0.0")
    88         m_oldData.m_dhcpserver.m_strUpperAddress = strProp;
    89 
    9067    /* Copy old data to new one: */
    9168    m_newData = m_oldData;
     
    759736    m_pEditorDHCPLowerAddress->setText(m_newData.m_dhcpserver.m_strLowerAddress);
    760737    m_pEditorDHCPUpperAddress->setText(m_newData.m_dhcpserver.m_strUpperAddress);
     738
     739    /* Invent default values if server was enabled
     740     * but at least one current value is invalid: */
     741    if (   fIsDHCPServerEnabled
     742        && (   m_pEditorDHCPAddress->text().isEmpty()
     743            || m_pEditorDHCPAddress->text() == "0.0.0.0"
     744            || m_pEditorDHCPMask->text().isEmpty()
     745            || m_pEditorDHCPMask->text() == "0.0.0.0"
     746            || m_pEditorDHCPLowerAddress->text().isEmpty()
     747            || m_pEditorDHCPLowerAddress->text() == "0.0.0.0"
     748            || m_pEditorDHCPUpperAddress->text().isEmpty()
     749            || m_pEditorDHCPUpperAddress->text() == "0.0.0.0"))
     750    {
     751        const QStringList &proposal = makeDhcpServerProposal(m_oldData.m_interface.m_strAddress,
     752                                                             m_oldData.m_interface.m_strMask);
     753        m_pEditorDHCPAddress->setText(proposal.at(0));
     754        m_pEditorDHCPMask->setText(proposal.at(1));
     755        m_pEditorDHCPLowerAddress->setText(proposal.at(2));
     756        m_pEditorDHCPUpperAddress->setText(proposal.at(3));
     757    }
    761758}
    762759
  • trunk/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkUtils.cpp

    r66855 r66860  
    1919# include <precomp.h>
    2020#else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
    21 
    22 /* Qt includes: */
    23 # include <QStringList>
    2421
    2522/* GUI includes: */
     
    5552}
    5653
     54quint32 UIHostNetworkUtils::incrementNetworkAddress(quint32 uAddress)
     55{
     56    return advanceNetworkAddress(uAddress, true /* forward */);
     57}
     58
     59quint32 UIHostNetworkUtils::decrementNetworkAddress(quint32 uAddress)
     60{
     61    return advanceNetworkAddress(uAddress, false /* forward */);
     62}
     63
     64quint32 UIHostNetworkUtils::advanceNetworkAddress(quint32 uAddress, bool fForward)
     65{
     66    /* Success by default: */
     67    bool fSuccess = true;
     68    do
     69    {
     70        /* Just advance address: */
     71        if (fForward)
     72            ++uAddress;
     73        else
     74            --uAddress;
     75        /* And treat it as success initially: */
     76        fSuccess = true;
     77        /* Iterate the resulting bytes: */
     78        uint uByteIndex = 0;
     79        quint32 uIterator = uAddress;
     80        while (fSuccess && uIterator)
     81        {
     82            /* Get current byte: */
     83            const quint32 uCurrentByte = uIterator & 0xFF;
     84            /* Advance iterator early: */
     85            uIterator = uIterator >> 8;
     86            // We know that .0. and .255. are legal these days
     87            // but still prefer to exclude them from
     88            // being proposed to an end user.
     89            /* If current byte equal to 255
     90             * or first byte equal to 0,
     91             * let's try again: */
     92            if (   uCurrentByte == 0xFF
     93                || (uCurrentByte == 0x00 && uByteIndex == 0))
     94                fSuccess = false;
     95            /* Advance byte index: */
     96            ++uByteIndex;
     97        }
     98    }
     99    while (!fSuccess);
     100    return uAddress;
     101}
     102
     103QStringList UIHostNetworkUtils::makeDhcpServerProposal(const QString &strInterfaceAddress, const QString &strInterfaceMask)
     104{
     105    /* Convert interface address/mask into digital form and calculate inverted interface mask: */
     106    const quint32 uAddress = ipv4FromQStringToQuint32(strInterfaceAddress);
     107    const quint32 uMaskDirect = ipv4FromQStringToQuint32(strInterfaceMask);
     108    const quint32 uMaskInvert = ~uMaskDirect;
     109    //printf("Direct   mask: %s (%u)\n", ipv4FromQuint32ToQString(uMaskDirect).toUtf8().constData(), uMaskDirect);
     110    //printf("Inverted mask: %s (%u)\n", ipv4FromQuint32ToQString(uMaskInvert).toUtf8().constData(), uMaskInvert);
     111
     112    /* Split the interface address into left and right parts: */
     113    const quint32 uPartL  = uAddress & uMaskDirect;
     114    const quint32 uPartR = uAddress & uMaskInvert;
     115    //printf("Left  part: %s (%u)\n", ipv4FromQuint32ToQString(uPartL).toUtf8().constData(), uPartL);
     116    //printf("Right part: %s (%u)\n", ipv4FromQuint32ToQString(uPartR).toUtf8().constData(), uPartR);
     117
     118    /* Prepare DHCP server proposal:" */
     119    quint32 uServerProposedAddress = 0;
     120    quint32 uServerProposedAddressL = 0;
     121    quint32 uServerProposedAddressU = 0;
     122    if (uPartR < uMaskInvert / 2)
     123    {
     124        /* Make DHCP server proposal from right scope: */
     125        //printf("Make DHCP server proposal from right scope:\n");
     126        uServerProposedAddress  = uPartL + incrementNetworkAddress(uPartR);
     127        uServerProposedAddressL = uPartL + incrementNetworkAddress(incrementNetworkAddress(uPartR));
     128        uServerProposedAddressU = uPartL + (uMaskInvert & 0xFEFEFEFE) /* decrementNetworkAddress(uMaskInvert) */;
     129    }
     130    else
     131    {
     132        /* Make DHCP server proposal from left scope: */
     133        //printf("Make DHCP server proposal from left scope:\n");
     134        uServerProposedAddress  = uPartL + 1 /* incrementNetworkAddress(0) */;
     135        uServerProposedAddressL = uPartL + 2 /* incrementNetworkAddress(incrementNetworkAddress(0)) */;
     136        uServerProposedAddressU = uPartL + decrementNetworkAddress(uPartR);
     137    }
     138    //printf("DHCP server address: %s (%u)\n", ipv4FromQuint32ToQString(uServerProposedAddress).toUtf8().constData(), uServerProposedAddress);
     139    //printf("DHCP server lower address: %s (%u)\n", ipv4FromQuint32ToQString(uServerProposedAddressL).toUtf8().constData(), uServerProposedAddressL);
     140    //printf("DHCP server upper address: %s (%u)\n", ipv4FromQuint32ToQString(uServerProposedAddressU).toUtf8().constData(), uServerProposedAddressU);
     141
     142    /* Pack and return result: */
     143    return QStringList() << ipv4FromQuint32ToQString(uServerProposedAddress)
     144                         << ipv4FromQuint32ToQString(uMaskDirect)
     145                         << ipv4FromQuint32ToQString(uServerProposedAddressL)
     146                         << ipv4FromQuint32ToQString(uServerProposedAddressU);
     147}
     148
  • trunk/src/VBox/Frontends/VirtualBox/src/hostnetwork/UIHostNetworkUtils.h

    r66855 r66860  
    2020
    2121/* Qt includes: */
    22 #include <QString>
     22#include <QStringList>
    2323
    2424
     
    3030    /** Converts IPv4 address from quint32 to QString. */
    3131    QString ipv4FromQuint32ToQString(quint32 uAddress);
     32
     33    /** Increments network @a uAddress by 1 avoiding 0/255 values. */
     34    quint32 incrementNetworkAddress(quint32 uAddress);
     35    /** Decrements network @a uAddress by 1 avoiding 0/255 values. */
     36    quint32 decrementNetworkAddress(quint32 uAddress);
     37    /** Advances network @a uAddress by 1 avoiding 0/255 values.
     38      * @param  fForward  Brings whether advance should
     39      *                   go forward or backward otherwise. */
     40    quint32 advanceNetworkAddress(quint32 uAddress, bool fForward);
     41
     42    /** Calculates DHCP server proposal on the basis of the passed @a strInterfaceAddress and @a strInterfaceMask. */
     43    QStringList makeDhcpServerProposal(const QString &strInterfaceAddress, const QString &strInterfaceMask);
    3244}
    3345
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