Changeset 17781 in vbox for trunk/src/VBox/NetworkServices
- Timestamp:
- Mar 12, 2009 11:21:50 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 44314
- Location:
- trunk/src/VBox/NetworkServices
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
r17780 r17781 905 905 906 906 /** 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 */ 917 bool 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 /** 907 1011 * Runs the DHCP server. 908 1012 * … … 965 1069 m_cbCurMsg = 0; 966 1070 } 1071 else if (VBoxNetHandleArpForIP(m_pSession, m_hIf, m_pIfBuf, &m_MacAddress, m_Ipv4Address)) 1072 /* nothing */; 967 1073 968 1074 /* Advance to the next frame. */ … … 1475 1581 bool optEnd(void) 1476 1582 { 1583 Assert((uintptr_t)(m_pbEnd - m_pbCur) < 4096); 1584 *m_pbCur++ = RTNET_DHCP_OPT_END; 1477 1585 return !hasOverflowed(); 1478 1586 } -
trunk/src/VBox/NetworkServices/UDPLib/VBoxNetUDP.cpp
r17780 r17781 315 315 /* the IP header */ 316 316 RTNETIPV4 IpHdr; 317 size_t cbIdHdr = RT_UOFFSETOF(RTNETIPV4, ip_options); 317 318 IpHdr.ip_v = 4; 318 IpHdr.ip_hl = sizeof(RTNETIPV4)/ sizeof(uint32_t);319 IpHdr.ip_hl = cbIdHdr / sizeof(uint32_t); 319 320 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); 321 322 IpHdr.ip_id = (uint16_t)RTRandU32(); 322 323 IpHdr.ip_off = 0; … … 324 325 IpHdr.ip_p = RTNETIPV4_PROT_UDP; 325 326 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; 328 329 IpHdr.ip_sum = RTNetIPv4HdrChecksum(&IpHdr); 329 330 330 331 aSegs[1].pv = &IpHdr; 331 aSegs[1].cb = sizeof(IpHdr);332 aSegs[1].cb = cbIdHdr; 332 333 aSegs[1].Phys = NIL_RTHCPHYS; 333 334
Note:
See TracChangeset
for help on using the changeset viewer.