Changeset 22940 in vbox
- Timestamp:
- Sep 11, 2009 6:18:51 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 52205
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/socket.c
r21665 r22940 565 565 size_t len; 566 566 u_long n; 567 #ifdef VBOX_WITH_SLIRP_BSD_MBUF 568 uint8_t *buffer; 569 #endif 567 570 568 571 QSOCKET_LOCK(udb); … … 570 573 QSOCKET_UNLOCK(udb); 571 574 575 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 572 576 if (!(m = m_get(pData))) 573 577 { … … 594 598 } 595 599 } 596 597 600 m->m_len = recvfrom(so->s, m->m_data, len, 0, 598 601 (struct sockaddr *)&addr, &addrlen); 599 602 Log2((" did recvfrom %d, errno = %d-%s\n", 600 603 m->m_len, errno, strerror(errno))); 601 if(m->m_len < 0) 604 #else 605 if (!(m = m_gethdr(pData, M_NOWAIT, MT_HEADER))) 606 { 607 SOCKET_UNLOCK(so); 608 return; 609 } 610 /*How many data has been received ?*/ 611 /* 612 * 1. calculate how much we can read 613 * 2. read as much as possible 614 * 3. attach buffer to allocated header mbuf 615 */ 616 ioctlsocket(so->s, FIONREAD, &n); 617 Assert(n > 0); 618 buffer = RTMemAlloc(n); 619 Assert(buffer); 620 len = recvfrom(so->s, buffer, n, 0, 621 (struct sockaddr *)&addr, &addrlen); 622 /* @todo (r=vvl) check which flags and type should be passed */ 623 if (len > 0) 624 m_append(pData, m, len, buffer); 625 RTMemFree(buffer); 626 #endif 627 if(len < 0) 602 628 { 603 629 u_char code = ICMP_UNREACH_PORT; … … 663 689 struct sockaddr_in host_addr; 664 690 #endif 691 #ifdef VBOX_WITH_SLIRP_BSD_MBUF 692 uint8_t *buf; 693 int mlen; 694 #endif 665 695 666 696 DEBUG_CALL("sosendto"); … … 714 744 715 745 /* Don't care what port we get */ 746 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 716 747 ret = sendto(so->s, m->m_data, m->m_len, 0, &addr, sizeof (struct sockaddr_in)); 748 #else 749 mlen = m_length(m, NULL); 750 buf = RTMemAlloc(mlen); 751 if (buf == NULL) 752 { 753 return -1; 754 } 755 m_copydata(m, 0, mlen, buf); 756 ret = sendto(so->s, buf, mlen, 0, 757 (struct sockaddr *)&addr, sizeof (struct sockaddr)); 758 #endif 717 759 if (ret < 0) 718 760 { … … 1093 1135 break; 1094 1136 case IP_SUCCESS: /* echo replied */ 1137 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 1095 1138 m = m_get(pData); 1139 #else 1140 m = m_gethdr(pData, M_NOWAIT, MT_HEADER); 1141 #endif 1096 1142 m->m_data += if_maxlinkhdr; 1097 1143 ip = mtod(m, struct ip *); … … 1111 1157 data_len += ICMP_MINLEN; 1112 1158 1159 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 1113 1160 nbytes = (data_len + icr[i].DataSize > m->m_size? m->m_size - data_len: icr[i].DataSize); 1114 1161 memcpy(icp->icmp_data, icr[i].Data, nbytes); 1162 #else 1163 AssertMsgFailed(("ICMP")); 1164 #endif 1115 1165 1116 1166 data_len += icr[i].DataSize; … … 1141 1191 data_len = (ip_broken->ip_hl << 2) + 64; 1142 1192 1193 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 1143 1194 nbytes =(hlen + ICMP_MINLEN + data_len > m->m_size? m->m_size - (hlen + ICMP_MINLEN): data_len); 1144 1195 memcpy(icp->icmp_data, ip_broken, nbytes); 1196 #else 1197 AssertMsgFailed(("ICMP")); 1198 #endif 1145 1199 icmp_reflect(pData, m); 1146 1200 break;
Note:
See TracChangeset
for help on using the changeset viewer.