VirtualBox

Changeset 17781 in vbox for trunk/src/VBox/NetworkServices


Ignore:
Timestamp:
Mar 12, 2009 11:21:50 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
44314
Message:

bufixes + arp in progress

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp

    r17780 r17781  
    905905
    906906/**
     907 * Deal with ARP queries.
     908 *
     909 * @returns true if ARP.
     910 *
     911 * @param   pSession        The support driver session.
     912 * @param   hIf             The internal network interface handle.
     913 * @param   pBuf            The internal network interface buffer.
     914 * @param   pMacAddr        Our MAC address.
     915 * @param   IPv4Addr        Our IPv4 address.
     916 */
     917bool VBoxNetHandleArpForIP(PSUPDRVSESSION pSession, INTNETIFHANDLE hIf, PINTNETBUF pBuf, PCRTMAC pMacAddr, RTNETADDRIPV4 IPv4Addr)
     918{
     919    /*
     920     * Valid IntNet Ethernet frame?
     921     */
     922    PCINTNETHDR pHdr = (PINTNETHDR)((uintptr_t)pBuf + pBuf->Recv.offRead);
     923    if (pHdr->u16Type != INTNETHDR_TYPE_FRAME)
     924        return false;
     925
     926    size_t      cbFrame = pHdr->cbFrame;
     927    const void *pvFrame = INTNETHdrGetFramePtr(pHdr, pBuf);
     928    PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pvFrame;
     929
     930    /*
     931     * Arp frame?
     932     */
     933    if (pEthHdr->EtherType != RT_H2N_U16_C(RTNET_ETHERTYPE_ARP))
     934        return false;
     935    if (    pEthHdr->DstMac.au16[0] != 0xffff
     936        ||  pEthHdr->DstMac.au16[1] != 0xffff
     937        ||  pEthHdr->DstMac.au16[2] != 0xffff)
     938        return false;
     939    if (cbFrame < sizeof(RTNETARPIPV4) + sizeof(RTNETETHERHDR))
     940        return false;
     941
     942    PCRTNETARPHDR pArpHdr = (PCRTNETARPHDR)(pEthHdr + 1);
     943    if (pArpHdr->ar_htype != RT_H2N_U16_C(RTNET_ARP_ETHER))
     944        return false;
     945    if (pArpHdr->ar_hlen != sizeof(RTMAC))
     946        return false;
     947    if (pArpHdr->ar_ptype != RT_H2N_U16_C(RTNET_ETHERTYPE_IPV4))
     948        return false;
     949    if (pArpHdr->ar_plen != sizeof(RTNETADDRIPV4))
     950        return false;
     951
     952    /* It's ARP, alright. Anything we need to do something about. */
     953    PCRTNETARPIPV4 pArp = (PCRTNETARPIPV4)pArpHdr;
     954    switch (pArp->Hdr.ar_oper)
     955    {
     956        /* 'Who has ' */
     957        case RTNET_ARPOP_REQUEST:
     958        case RTNET_ARPOP_REVREQUEST:
     959        ///@todo case RTNET_ARPOP_INVREQUEST:
     960            break;
     961        default:
     962            return true;
     963    }
     964
     965    /*
     966     * Deal with the queries.
     967     */
     968    RTNETARPIPV4 Reply;
     969    switch (pArp->Hdr.ar_oper)
     970    {
     971        /* 'Who has ar_tpa? Tell ar_spa.'  */
     972        case RTNET_ARPOP_REQUEST:
     973            if (pArp->ar_spa.u != IPv4Addr.u)
     974                return true;
     975            Reply.Hdr.ar_oper = RTNET_ARPOP_REPLY;
     976            break;
     977
     978        case RTNET_ARPOP_REVREQUEST:
     979            if (    pArp->ar_tha.au16[0] != pMacAddr->au16[0]
     980                ||  pArp->ar_tha.au16[1] != pMacAddr->au16[1]
     981                ||  pArp->ar_tha.au16[2] != pMacAddr->au16[2])
     982                return true;
     983            Reply.Hdr.ar_oper = RTNET_ARPOP_REVREPLY;
     984            break;
     985
     986        case RTNET_ARPOP_INVREQUEST:
     987            return true;
     988            //Reply.Hdr.ar_oper = RTNET_ARPOP_INVREPLY;
     989            //break;
     990    }
     991
     992    /*
     993     * Complete the reply and send it.
     994     */
     995    Reply.Hdr.ar_htype = RT_H2N_U16_C(RTNET_ARP_ETHER);
     996    Reply.Hdr.ar_ptype = RT_H2N_U16_C(RTNET_ETHERTYPE_IPV4);
     997    Reply.Hdr.ar_hlen  = sizeof(RTMAC);
     998    Reply.Hdr.ar_plen  = sizeof(RTNETADDRIPV4);
     999    Reply.ar_sha = *pMacAddr;
     1000    Reply.ar_spa = IPv4Addr;
     1001    Reply.ar_tha = pArp->ar_sha;
     1002    Reply.ar_tpa = pArp->ar_spa;
     1003
     1004
     1005
     1006    return true;
     1007}
     1008
     1009
     1010/**
    9071011 * Runs the DHCP server.
    9081012 *
     
    9651069                m_cbCurMsg = 0;
    9661070            }
     1071            else if (VBoxNetHandleArpForIP(m_pSession, m_hIf, m_pIfBuf, &m_MacAddress, m_Ipv4Address))
     1072                /* nothing */;
    9671073
    9681074            /* Advance to the next frame. */
     
    14751581    bool optEnd(void)
    14761582    {
     1583        Assert((uintptr_t)(m_pbEnd - m_pbCur) < 4096);
     1584        *m_pbCur++ = RTNET_DHCP_OPT_END;
    14771585        return !hasOverflowed();
    14781586    }
  • trunk/src/VBox/NetworkServices/UDPLib/VBoxNetUDP.cpp

    r17780 r17781  
    315315    /* the IP header */
    316316    RTNETIPV4 IpHdr;
     317    size_t cbIdHdr = RT_UOFFSETOF(RTNETIPV4, ip_options);
    317318    IpHdr.ip_v          = 4;
    318     IpHdr.ip_hl         = sizeof(RTNETIPV4) / sizeof(uint32_t);
     319    IpHdr.ip_hl         = cbIdHdr / sizeof(uint32_t);
    319320    IpHdr.ip_tos        = 0;
    320     IpHdr.ip_len        = RT_H2BE_U16(cbData + sizeof(RTNETUDP) + sizeof(RTNETIPV4));
     321    IpHdr.ip_len        = RT_H2BE_U16(cbData + sizeof(RTNETUDP) + cbIdHdr);
    321322    IpHdr.ip_id         = (uint16_t)RTRandU32();
    322323    IpHdr.ip_off        = 0;
     
    324325    IpHdr.ip_p          = RTNETIPV4_PROT_UDP;
    325326    IpHdr.ip_sum        = 0;
    326     IpHdr.ip_src.u      = 0;
    327     IpHdr.ip_dst.u      = UINT32_C(0xffffffff); /* broadcast */
     327    IpHdr.ip_src        = SrcIPv4Addr;
     328    IpHdr.ip_dst        = DstIPv4Addr;
    328329    IpHdr.ip_sum        = RTNetIPv4HdrChecksum(&IpHdr);
    329330
    330331    aSegs[1].pv   = &IpHdr;
    331     aSegs[1].cb   = sizeof(IpHdr);
     332    aSegs[1].cb   = cbIdHdr;
    332333    aSegs[1].Phys = NIL_RTHCPHYS;
    333334
Note: See TracChangeset for help on using the changeset viewer.

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