Changeset 38905 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Sep 30, 2011 2:33:47 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 74241
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/socket.c
r38402 r38905 1353 1353 ICMP_ECHO_REPLY *icr; 1354 1354 int hlen = 0; 1355 int data_len = 0;1356 1355 int nbytes = 0; 1357 1356 u_char code = ~0; … … 1371 1370 for (i = 0; i < len; ++i) 1372 1371 { 1372 LogFunc(("icr[%d] Data:%p, DataSize:%d\n", 1373 i, icr[i].Data, icr[i].DataSize)); 1373 1374 switch(icr[i].Status) 1374 1375 { … … 1401 1402 1402 1403 m = m_getjcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR, size); 1404 LogFunc(("m_getjcl returns m: %p\n", m)); 1403 1405 if (m == NULL) 1404 1406 return; 1405 1407 m->m_len = 0; 1406 1408 m->m_data += if_maxlinkhdr; 1409 m->m_pkthdr.header = mtod(m, void *); 1410 1407 1411 ip = mtod(m, struct ip *); 1408 1412 ip->ip_src.s_addr = icr[i].Address; 1409 1413 ip->ip_p = IPPROTO_ICMP; 1410 1414 ip->ip_dst.s_addr = so->so_laddr.s_addr; /*XXX: still the hack*/ 1411 data_len = sizeof(struct ip); 1412 ip->ip_hl = data_len >> 2; /* requiered for icmp_reflect, no IP options */ 1415 ip->ip_hl = sizeof(struct ip) >> 2; /* requiered for icmp_reflect, no IP options */ 1413 1416 ip->ip_ttl = icr[i].Options.Ttl; 1414 1417 … … 1428 1431 } 1429 1432 1430 data_len += ICMP_MINLEN;1431 1433 1432 1434 hlen = (ip->ip_hl << 2); 1433 m->m_pkthdr.header = mtod(m, void *); 1434 m->m_len = data_len; 1435 1436 m_copyback(pData, m, hlen + 8, icr[i].DataSize, icr[i].Data); 1437 1438 data_len += icr[i].DataSize; 1439 1440 ip->ip_len = data_len; 1441 m->m_len = ip->ip_len; 1435 Assert((hlen >= sizeof(struct ip))); 1436 1437 m->m_data += hlen + ICMP_MINLEN; 1438 if (!RT_VALID_PTR(icr[i].Data)) 1439 { 1440 m_freem(pData, m); 1441 break; 1442 } 1443 m_copyback(pData, m, 0, icr[i].DataSize, icr[i].Data); 1444 m->m_data -= hlen + ICMP_MINLEN; 1445 m->m_len += hlen + ICMP_MINLEN; 1446 1447 1448 ip->ip_len = m_length(m, NULL); 1449 Assert((ip->ip_len == hlen + ICMP_MINLEN + icr[i].DataSize)); 1442 1450 1443 1451 icmp_reflect(pData, m); … … 1453 1461 m = icm->im_m; 1454 1462 ip = mtod(m, struct ip *); 1463 Assert(((ip_broken->ip_hl >> 2) >= sizeof(struct ip))); 1455 1464 ip->ip_ttl = icr[i].Options.Ttl; 1456 1465 src = ip->ip_src.s_addr; … … 1461 1470 icp = (struct icmp *)((char *)ip + hlen); 1462 1471 ip_broken->ip_src.s_addr = src; /*it packet sent from host not from guest*/ 1463 data_len = (ip_broken->ip_hl << 2) + 64; 1464 1465 m->m_len = data_len; 1472 1473 m->m_len = (ip_broken->ip_hl << 2) + 64; 1466 1474 m->m_pkthdr.header = mtod(m, void *); 1467 1475 m_copyback(pData, m, ip->ip_hl >> 2, icr[i].DataSize, icr[i].Data);
Note:
See TracChangeset
for help on using the changeset viewer.