Changeset 15355 in vbox for trunk/src/VBox/Devices/Network/slirp
- Timestamp:
- Dec 12, 2008 8:55:52 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 40789
- Location:
- trunk/src/VBox/Devices/Network/slirp
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/ip_icmp.c
r15312 r15355 81 81 pData->icmp_socket.s = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); 82 82 # else /* !RT_OS_DARWIN */ 83 pData->icmp_socket.s = socket( PF_INET, SOCK_DGRAM, IPPROTO_ICMP);83 pData->icmp_socket.s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP); 84 84 # endif /* RT_OS_DARWIN */ 85 85 if (pData->icmp_socket.s == -1) … … 157 157 158 158 159 LogRel(("%s: processing (proto:%d)\n", __FUNCTION__, ip->ip_p)); 159 160 switch (ip->ip_p) 160 161 { … … 175 176 break; 176 177 } 178 LogRel(("Have found nothing\n")); 177 179 } 178 180 break; … … 184 186 case IPPROTO_UDP: 185 187 head_socket = &udb; 186 udp = (struct udphdr *)((char *)ip + (ip->ip_hl >>2));188 udp = (struct udphdr *)((char *)ip + (ip->ip_hl << 2)); 187 189 faddr.s_addr = ip->ip_dst.s_addr; 188 190 fport = udp->uh_dport; … … 194 196 if (head_socket == NULL) 195 197 { 196 tcp = (struct tcphdr *)((char *)ip + (ip->ip_hl >>2));198 tcp = (struct tcphdr *)((char *)ip + (ip->ip_hl << 2)); 197 199 head_socket = &tcb; /* head_socket could be initialized with udb*/ 198 200 faddr.s_addr = ip->ip_dst.s_addr; … … 201 203 lport = tcp->th_sport; 202 204 } 203 for (so = head_socket ; so != head_socket; so = so->so_next)205 for (so = head_socket->so_next; so != head_socket; so = so->so_next) 204 206 { 205 207 /* Should be reaplaced by hash here */ 208 LogRel(("trying:%R[natsock] against %R[IP4]:%d lport=%d hlport=%d\n", so, &faddr, fport, lport, so->so_hlport)); 206 209 if ( so->so_faddr.s_addr == faddr.s_addr 207 210 && so->so_fport == fport 211 #if 0 208 212 && so->so_hladdr.s_addr == laddr.s_addr 213 #endif 209 214 && so->so_hlport == lport) 210 215 { … … 212 217 icm->im_m = so->so_m; 213 218 found = 1; 214 break; 219 LogRel(("hit:%R[natsock]\n", so)); 220 /*XXX: this storage not very long, 221 * better add flag if it should removed from lis 222 */ 223 LIST_INSERT_HEAD(&pData->icmp_msg_head, icm, im_list); 224 break; 215 225 } 216 226 } … … 381 391 /* Send the packet */ 382 392 # ifndef RT_OS_WINDOWS 393 LogRel(("NAT/ICMP: try to set TTL(%d)\n", ip->ip_ttl)); 383 394 status = setsockopt(pData->icmp_socket.s, IPPROTO_IP, IP_TTL, (void *)&ip->ip_ttl, sizeof(ip->ip_ttl)); 384 395 if (status < 0) -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r15287 r15355 560 560 } 561 561 #endif /* VBOX_WITH_BSD_REASS */ 562 ICMP_ENGAGE_EVENT(&pData->icmp_socket, readfds); 562 563 563 564 STAM_REL_COUNTER_RESET(&pData->StatTCP); … … 666 667 } 667 668 668 ICMP_ENGAGE_EVENT(&pData->icmp_socket, readfds);669 669 } 670 670 … … 737 737 if (link_up) 738 738 { 739 #if defined(VBOX_WITH_SLIRP_ICMP) 740 # if defined(RT_OS_WINDOWS) 741 if (fIcmp) 742 sorecvfrom(pData, &pData->icmp_socket); 743 # else 744 if (pData->icmp_socket.s != -1 && FD_ISSET(pData->icmp_socket.s, readfds)) 745 sorecvfrom(pData, &pData->icmp_socket); 746 # endif 747 #endif 739 748 /* 740 749 * Check TCP sockets … … 930 939 } 931 940 941 #if 0 932 942 #if defined(VBOX_WITH_SLIRP_ICMP) 933 943 # if defined(RT_OS_WINDOWS) … … 938 948 sorecvfrom(pData, &pData->icmp_socket); 939 949 # endif 950 #endif 940 951 #endif 941 952 } -
trunk/src/VBox/Devices/Network/slirp/socket.c
r15293 r15355 591 591 (struct sockaddr *)&addr, sizeof (struct sockaddr)); 592 592 if (ret < 0) 593 { 594 LogRel(("UDP: sendto fails (%s)\n", strerror(errno))); 593 595 return -1; 596 } 594 597 595 598 /* … … 795 798 icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2)); 796 799 800 LogRel(("ICMP:received msg(t:%d, c:%d)\n", icp->icmp_type, icp->icmp_code)); 797 801 if (icp->icmp_type != ICMP_ECHOREPLY && icp->icmp_type != ICMP_TIMXCEED) 798 802 { 799 LogRel(("received ICMP(t:%d, c:%d)\n", icp->icmp_type, icp->icmp_code));800 803 return; 801 804 } -
trunk/src/VBox/Devices/Network/slirp/udp.c
r15293 r15355 72 72 struct ip save_ip; 73 73 struct socket *so; 74 #ifdef VBOX_WITH_SLIRP_ICMP 75 int ret; 76 #endif 74 77 75 78 DEBUG_CALL("udp_input"); … … 139 142 if (uh->uh_sum) 140 143 { 141 144 142 145 #endif 143 146 if(cksum(m, len + sizeof(struct ip))) … … 241 244 udp_emu(pData, so, m); 242 245 246 #ifdef VBOX_WITH_SLIRP_ICMP 247 ip->ip_ttl = save_ip.ip_ttl; 248 ret = setsockopt(so->s, IPPROTO_IP, IP_TTL, (void *)&ip->ip_ttl, sizeof(ip->ip_ttl)); 249 if (ret < 0) { 250 LogRel(("NAT: Error (%s) occurred while setting TTL(%d) attribute of IP packet to socket %R[natsock]\n", strerror(errno), ip->ip_ttl, so)); 251 } 252 #endif 243 253 if(sosendto(pData, so,m) == -1) 244 254 { … … 353 363 { 354 364 struct sockaddr_in addr; 365 #ifdef VBOX_WITH_SLIRP_ICMP 366 struct sockaddr sa_addr; 367 socklen_t socklen = sizeof(struct sockaddr); 368 int status; 369 #endif 355 370 356 371 if ((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) … … 384 399 insque(pData, so,&udb); 385 400 #ifdef VBOX_WITH_SLIRP_ICMP 386 so->so_hlport = addr.sin_port; 387 so->so_hladdr.s_addr = addr.sin_addr.s_addr; 401 status = getsockname(so->s, &sa_addr, &socklen); 402 Assert(status == 0 && sa_addr.sa_family == AF_INET); 403 so->so_hlport = ((struct sockaddr_in *)&sa_addr)->sin_port; 404 so->so_hladdr.s_addr = ((struct sockaddr_in *)&sa_addr)->sin_addr.s_addr; 388 405 #endif 389 406 }
Note:
See TracChangeset
for help on using the changeset viewer.