Changeset 27448 in vbox
- Timestamp:
- Mar 17, 2010 2:44:13 PM (15 years ago)
- Location:
- trunk/src/VBox/Devices/Network/slirp
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/ip_icmp.c
r26676 r27448 585 585 m->m_pkthdr.header = mtod(m, void *); 586 586 #else 587 new_m_size = sizeof(struct ip) + ICMP_MINLEN + msrc->m_len + ICMP_MAXDATALEN;587 new_m_size = if_maxlinkhdr + sizeof(struct ip) + ICMP_MINLEN + msrc->m_len + ICMP_MAXDATALEN; 588 588 if (new_m_size > m->m_size) 589 589 { -
trunk/src/VBox/Devices/Network/slirp/libslirp.h
r26597 r27448 119 119 void slirp_ext_m_free(PNATState pData, struct mbuf *); 120 120 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 121 void slirp_ext_m_append(PNATState pData, struct mbuf *, uint8_t *, size_t);122 121 void slirp_push_recv_thread(void *pvUser); 123 122 #endif -
trunk/src/VBox/Devices/Network/slirp/mbuf.c
r26574 r27448 402 402 } 403 403 404 void slirp_ext_m_append(PNATState pData, struct mbuf *m, uint8_t *pu8Buf, size_t cbBuf)405 {406 char *c;407 if (cbBuf > M_FREEROOM(m))408 {409 m_inc(m, cbBuf);410 if (RT_UNLIKELY(cbBuf > M_FREEROOM(m)))411 cbBuf = M_FREEROOM(m);412 }413 c = mtod(m, char *);414 memcpy(c, pu8Buf, cbBuf);415 m->m_len = cbBuf;416 }417 418 404 #endif /* VBOX_WITH_SLIRP_BSD_MBUF */ -
trunk/src/VBox/Devices/Network/slirp/socket.c
r27447 r27448 1060 1060 { 1061 1061 Log(("send_icmp_to_guest: ICMP header is too small to understand which type/subtype of the datagram\n")); 1062 return; 1062 return; 1063 1063 } 1064 1064 icp = (struct icmp *)((char *)ip + hlen); … … 1073 1073 1074 1074 /* 1075 * ICMP_ECHOREPLY, ICMP_TIMXCEED, ICMP_UNREACH minimal header size is 1075 * ICMP_ECHOREPLY, ICMP_TIMXCEED, ICMP_UNREACH minimal header size is 1076 1076 * ICMP_ECHOREPLY assuming data 0 1077 1077 * icmp_{type(8), code(8), cksum(16),identifier(16),seqnum(16)} … … 1081 1081 Log(("send_icmp_to_guest: NAT accept ICMP_{ECHOREPLY, TIMXCEED, UNREACH} the minimum size is 64 (see rfc792)\n")); 1082 1082 return; 1083 } 1083 } 1084 1084 1085 1085 type = icp->icmp_type; … … 1088 1088 { 1089 1089 /* 1090 * ICMP_TIMXCEED, ICMP_UNREACH minimal header size is 1090 * ICMP_TIMXCEED, ICMP_UNREACH minimal header size is 1091 1091 * icmp_{type(8), code(8), cksum(16),unused(32)} + IP header + 64 bit of original datagram 1092 1092 */ … … 1095 1095 Log(("send_icmp_to_guest: NAT accept ICMP_{TIMXCEED, UNREACH} the minimum size of ipheader + 64 bit of data (see rfc792)\n")); 1096 1096 return; 1097 } 1097 } 1098 1098 ip = &icp->icmp_ip; 1099 1099 } … … 1148 1148 /* saves original ip header and options */ 1149 1149 /* m_room space in the saved m buffer */ 1150 m_room = m->m_len + M_TRAILINGSPACE(m) - original_hlen; 1151 if (m_room >= len - hlen) 1152 memcpy(m->m_data + original_hlen, buff + hlen, len - hlen); 1153 else 1154 { 1155 int size = m->m_size; 1156 /* we need involve ether header lenght into new buffer buffer calculation */ 1157 m_inc(m, if_maxlinkhdr + len - hlen + original_hlen); 1158 if (size == m->m_size) 1150 m_room = M_ROOM(m); 1151 if (m_room < len - hlen + original_hlen) 1152 else 1153 { 1154 /* we need involve ether header length into new buffer buffer calculation */ 1155 m_inc(m, if_maxlinkhdr + len - hlen + original_hlen); 1156 if (m->m_size < if_maxlinkhdr + len - hlen + original_hlen) 1159 1157 { 1160 1158 Log(("send_icmp_to_guest: extending buffer was failed (packet is dropped)\n")); 1161 1159 return; 1162 1160 } 1163 memcpy(m->m_data + original_hlen, buff + hlen, len - hlen);1164 }1161 } 1162 memcpy(m->m_data + original_hlen, buff + hlen, len - hlen); 1165 1163 #ifndef VBOX_WITH_SLIRP_BSD_MBUF 1166 1164 m->m_len = len - hlen + original_hlen; … … 1390 1388 || errno == ENOTCONN)) 1391 1389 { 1392 Log(("sorecvfrom_icmp_unix: 2 - step can't read IP body (would block expected:%d)\n", 1390 Log(("sorecvfrom_icmp_unix: 2 - step can't read IP body (would block expected:%d)\n", 1393 1391 RT_N2H_U16(ip.ip_len))); 1394 1392 RTMemFree(buff); 1395 1393 return; 1396 1394 } 1397 if ( len < 0 1395 if ( len < 0 1398 1396 || len < (RT_N2H_U16(ip.ip_len)) 1399 1397 || len == 0)
Note:
See TracChangeset
for help on using the changeset viewer.

