Changeset 1039 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Feb 23, 2007 4:00:08 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 18914
- Location:
- trunk/src/VBox/Devices/Network
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r1033 r1039 288 288 LogFlow(("drvNATDestruct:\n")); 289 289 290 #if ARCH_BITS == 64291 LogRel(("NAT: g_cpvHashUsed=%RU32 g_cpvHashCollisions=%RU32 g_cpvHashInserts=%RU64 g_cpvHashDone=%RU64\n",292 g_cpvHashUsed, g_cpvHashCollisions, g_cpvHashInserts, g_cpvHashDone));293 #endif294 290 int rc = RTCritSectEnter(&pData->CritSect); 295 291 AssertReleaseRC(rc); … … 410 406 pData->INetworkConnector.pfnNotifyLinkChanged = drvNATNotifyLinkChanged; 411 407 pData->INetworkConnector.pfnNotifyCanReceive = drvNATNotifyCanReceive; 412 408 413 409 pData->pNATState = NULL; 414 410 -
trunk/src/VBox/Devices/Network/slirp/ip_input.c
r1033 r1039 63 63 #endif /* !VBOX */ 64 64 { 65 ipq.next = ipq.prev = ptr_to_u32( &ipq);65 ipq.next = ipq.prev = ptr_to_u32(pData, &ipq); 66 66 #ifdef VBOX 67 67 ip_currid = tt.tv_sec & 0xffff; … … 186 186 * of this datagram. 187 187 */ 188 for (fp = u32_to_ptr( ipq.next, struct ipq_t *); fp != &ipq;189 fp = u32_to_ptr( fp->next, struct ipq_t *))188 for (fp = u32_to_ptr(pData, ipq.next, struct ipq_t *); fp != &ipq; 189 fp = u32_to_ptr(pData, fp->next, struct ipq_t *)) 190 190 if (ip->ip_id == fp->ipq_id && 191 191 ip->ip_src.s_addr == fp->ipq_src.s_addr && … … 336 336 fp->ipq_p = ip->ip_p; 337 337 fp->ipq_id = ip->ip_id; 338 fp->ipq_next = fp->ipq_prev = ptr_to_u32( (struct ipasfrag *)fp);338 fp->ipq_next = fp->ipq_prev = ptr_to_u32(pData, (struct ipasfrag *)fp); 339 339 fp->ipq_src = ((struct ip *)ip)->ip_src; 340 340 fp->ipq_dst = ((struct ip *)ip)->ip_dst; … … 346 346 * Find a segment which begins after this one does. 347 347 */ 348 for (q = u32_to_ptr( fp->ipq_next, struct ipasfrag *); q != (struct ipasfrag *)fp;349 q = u32_to_ptr( q->ipf_next, struct ipasfrag *))348 for (q = u32_to_ptr(pData, fp->ipq_next, struct ipasfrag *); q != (struct ipasfrag *)fp; 349 q = u32_to_ptr(pData, q->ipf_next, struct ipasfrag *)) 350 350 if (q->ip_off > ip->ip_off) 351 351 break; … … 356 356 * segment. If it provides all of our data, drop us. 357 357 */ 358 if (u32_to_ptr( q->ipf_prev, struct ipq_t *) != fp) {359 i = (u32_to_ptr( q->ipf_prev, struct ipasfrag *))->ip_off +360 (u32_to_ptr( q->ipf_prev, struct ipasfrag *))->ip_len - ip->ip_off;358 if (u32_to_ptr(pData, q->ipf_prev, struct ipq_t *) != fp) { 359 i = (u32_to_ptr(pData, q->ipf_prev, struct ipasfrag *))->ip_off + 360 (u32_to_ptr(pData, q->ipf_prev, struct ipasfrag *))->ip_len - ip->ip_off; 361 361 if (i > 0) { 362 362 if (i >= ip->ip_len) … … 388 388 break; 389 389 } 390 q = u32_to_ptr( q->ipf_next, struct ipasfrag *);391 m_freem(pData, dtom(pData, u32_to_ptr( q->ipf_prev, struct ipasfrag *)));392 ip_deq( u32_to_ptr(q->ipf_prev, struct ipasfrag *));390 q = u32_to_ptr(pData, q->ipf_next, struct ipasfrag *); 391 m_freem(pData, dtom(pData, u32_to_ptr(pData, q->ipf_prev, struct ipasfrag *))); 392 ip_deq(pData, u32_to_ptr(pData, q->ipf_prev, struct ipasfrag *)); 393 393 } 394 394 … … 398 398 * check for complete reassembly. 399 399 */ 400 ip_enq( ip, u32_to_ptr(q->ipf_prev, struct ipasfrag *));400 ip_enq(pData, ip, u32_to_ptr(pData, q->ipf_prev, struct ipasfrag *)); 401 401 next = 0; 402 for (q = u32_to_ptr( fp->ipq_next, struct ipasfrag *); q != (struct ipasfrag *)fp;403 q = u32_to_ptr( q->ipf_next, struct ipasfrag *)) {402 for (q = u32_to_ptr(pData, fp->ipq_next, struct ipasfrag *); q != (struct ipasfrag *)fp; 403 q = u32_to_ptr(pData, q->ipf_next, struct ipasfrag *)) { 404 404 if (q->ip_off != next) 405 405 return (0); 406 406 next += q->ip_len; 407 407 } 408 if (u32_to_ptr( q->ipf_prev, struct ipasfrag *)->ipf_mff & 1)408 if (u32_to_ptr(pData, q->ipf_prev, struct ipasfrag *)->ipf_mff & 1) 409 409 return (0); 410 410 … … 412 412 * Reassembly is complete; concatenate fragments. 413 413 */ 414 q = u32_to_ptr( fp->ipq_next, struct ipasfrag *);414 q = u32_to_ptr(pData, fp->ipq_next, struct ipasfrag *); 415 415 #ifdef VBOX 416 416 m = dtom(pData, q); … … 419 419 #endif /* !VBOX */ 420 420 421 q = u32_to_ptr( q->ipf_next, struct ipasfrag *);421 q = u32_to_ptr(pData, q->ipf_next, struct ipasfrag *); 422 422 while (q != (struct ipasfrag *)fp) { 423 423 struct mbuf *t; … … 427 427 t = dtom(q); 428 428 #endif /* !VBOX */ 429 q = u32_to_ptr( q->ipf_next, struct ipasfrag *);429 q = u32_to_ptr(pData, q->ipf_next, struct ipasfrag *); 430 430 #ifdef VBOX 431 431 m_cat(pData, m, t); … … 441 441 * Make header visible. 442 442 */ 443 ip = u32_to_ptr( fp->ipq_next, struct ipasfrag *);443 ip = u32_to_ptr(pData, fp->ipq_next, struct ipasfrag *); 444 444 445 445 /* … … 500 500 register struct ipasfrag *q, *p; 501 501 502 for (q = u32_to_ptr( fp->ipq_next, struct ipasfrag *); q != (struct ipasfrag *)fp;502 for (q = u32_to_ptr(pData, fp->ipq_next, struct ipasfrag *); q != (struct ipasfrag *)fp; 503 503 q = p) { 504 p = u32_to_ptr( q->ipf_next, struct ipasfrag *);505 ip_deq( q);504 p = u32_to_ptr(pData, q->ipf_next, struct ipasfrag *); 505 ip_deq(pData, q); 506 506 #ifdef VBOX 507 507 m_freem(pData, dtom(pData, q)); … … 523 523 */ 524 524 void 525 ip_enq(p, prev) 526 register struct ipasfrag *p, *prev; 525 ip_enq(PNATState pData, register struct ipasfrag *p, register struct ipasfrag *prev) 527 526 { 528 527 DEBUG_CALL("ip_enq"); 529 528 DEBUG_ARG("prev = %lx", (long)prev); 530 p->ipf_prev = ptr_to_u32(p rev);529 p->ipf_prev = ptr_to_u32(pData, prev); 531 530 p->ipf_next = prev->ipf_next; 532 u32_to_ptr(p rev->ipf_next, struct ipasfrag *)->ipf_prev = ptr_to_u32(p);533 prev->ipf_next = ptr_to_u32(p );531 u32_to_ptr(pData, prev->ipf_next, struct ipasfrag *)->ipf_prev = ptr_to_u32(pData, p); 532 prev->ipf_next = ptr_to_u32(pData, p); 534 533 } 535 534 … … 538 537 */ 539 538 void 540 ip_deq(p) 541 register struct ipasfrag *p; 539 ip_deq(PNATState pData, register struct ipasfrag *p) 542 540 { 543 struct ipasfrag *prev = u32_to_ptr(p ->ipf_prev, struct ipasfrag *);544 struct ipasfrag *next = u32_to_ptr(p ->ipf_next, struct ipasfrag *);545 u32ptr_done(p rev->ipf_next, p);541 struct ipasfrag *prev = u32_to_ptr(pData, p->ipf_prev, struct ipasfrag *); 542 struct ipasfrag *next = u32_to_ptr(pData, p->ipf_next, struct ipasfrag *); 543 u32ptr_done(pData, prev->ipf_next, p); 546 544 prev->ipf_next = p->ipf_next; 547 545 next->ipf_prev = p->ipf_prev; … … 564 562 DEBUG_CALL("ip_slowtimo"); 565 563 566 fp = u32_to_ptr( ipq.next, struct ipq_t *);564 fp = u32_to_ptr(pData, ipq.next, struct ipq_t *); 567 565 if (fp == 0) 568 566 return; … … 570 568 while (fp != &ipq) { 571 569 --fp->ipq_ttl; 572 fp = u32_to_ptr( fp->next, struct ipq_t *);573 if (u32_to_ptr( fp->prev, struct ipq_t *)->ipq_ttl == 0) {570 fp = u32_to_ptr(pData, fp->next, struct ipq_t *); 571 if (u32_to_ptr(pData, fp->prev, struct ipq_t *)->ipq_ttl == 0) { 574 572 ipstat.ips_fragtimeout++; 575 ip_freef(pData, u32_to_ptr( fp->prev, struct ipq_t *));573 ip_freef(pData, u32_to_ptr(pData, fp->prev, struct ipq_t *)); 576 574 } 577 575 } -
trunk/src/VBox/Devices/Network/slirp/libslirp.h
r1033 r1039 36 36 void slirp_link_up(PNATState); 37 37 void slirp_link_down(PNATState); 38 # if ARCH_BITS == 6439 error fix the last remaining global variables.....40 extern uint32_t g_cpvHashUsed;41 extern uint32_t g_cpvHashCollisions;42 extern uint64_t g_cpvHashInserts;43 extern uint64_t g_cpvHashDone;44 # endif45 38 #endif /* VBOX */ 46 39 -
trunk/src/VBox/Devices/Network/slirp/mbuf.c
r1033 r1039 133 133 */ 134 134 if (m->m_flags & M_DOFREE) { 135 u32ptr_done(p tr_to_u32(m), m);135 u32ptr_done(pData, ptr_to_u32(pData, m), m); 136 136 free(m); 137 137 mbuf_alloced--; -
trunk/src/VBox/Devices/Network/slirp/misc.c
r1036 r1039 116 116 #endif 117 117 void 118 insque_32(a, b) 119 void *a; 120 void *b; 118 insque_32(PNATState pData, void *a, void *b) 121 119 { 122 120 register struct quehead_32 *element = (struct quehead_32 *) a; 123 121 register struct quehead_32 *head = (struct quehead_32 *) b; 124 struct quehead_32 *link = u32_to_ptr( head->qh_link, struct quehead_32 *);122 struct quehead_32 *link = u32_to_ptr(pData, head->qh_link, struct quehead_32 *); 125 123 126 124 element->qh_link = head->qh_link; 127 element->qh_rlink = ptr_to_u32( head);125 element->qh_rlink = ptr_to_u32(pData, head); 128 126 Assert(link->qh_rlink == element->qh_rlink); 129 link->qh_rlink = head->qh_link = ptr_to_u32( element);127 link->qh_rlink = head->qh_link = ptr_to_u32(pData, element); 130 128 } 131 129 … … 134 132 #endif 135 133 void 136 remque_32(a) 137 void *a; 134 remque_32(PNATState *pData, void *a) 138 135 { 139 136 register struct quehead_32 *element = (struct quehead_32 *) a; 140 struct quehead_32 *link = u32_to_ptr( element->qh_link, struct quehead_32 *);141 struct quehead_32 *rlink = u32_to_ptr( element->qh_rlink, struct quehead_32 *);142 143 u32ptr_done( link->qh_rlink, element);137 struct quehead_32 *link = u32_to_ptr(pData, element->qh_link, struct quehead_32 *); 138 struct quehead_32 *rlink = u32_to_ptr(pData, element->qh_rlink, struct quehead_32 *); 139 140 u32ptr_done(pData, link->qh_rlink, element); 144 141 link->qh_rlink = element->qh_rlink; 145 142 rlink->qh_link = element->qh_link; -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r1036 r1039 217 217 memset(pData, '\0', sizeof(NATState)); 218 218 pData->pvUser = pvUser; 219 #if ARCH_BITS == 64 220 pData->cpvHashUsed = 1; 221 #endif 219 222 #endif /* VBOX */ 220 223 … … 314 317 void slirp_term(PNATState pData) 315 318 { 319 #if ARCH_BITS == 64 320 LogRel(("NAT: cpvHashUsed=%RU32 cpvHashCollisions=%RU32 cpvHashInserts=%RU64 cpvHashDone=%RU64\n", 321 pData->cpvHashUsed, pData->cpvHashCollisions, pData->cpvHashInserts, pData->cpvHashDone)); 322 #endif 323 316 324 slirp_link_down(pData); 317 325 #ifdef WIN32 … … 406 414 */ 407 415 do_slowtimo = ((tcb.so_next != &tcb) || 408 ((struct ipasfrag *)&ipq != u32_to_ptr( ipq.next, struct ipasfrag *)));416 ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *))); 409 417 410 418 for (so = tcb.so_next; so != &tcb; so = so_next) { -
trunk/src/VBox/Devices/Network/slirp/slirp.h
r1033 r1039 374 374 struct ip * ip_reass _P((PNATState, register struct ipasfrag *, register struct ipq_t *)); 375 375 void ip_freef _P((PNATState, struct ipq_t *)); 376 void ip_enq _P((PNATState, register struct ipasfrag *, register struct ipasfrag *)); 377 void ip_deq _P((PNATState, register struct ipasfrag *)); 378 void ip_slowtimo _P((PNATState)); 376 379 #else /* !VBOX */ 377 380 void ip_init _P((void)); … … 379 382 struct ip * ip_reass _P((register struct ipasfrag *, register struct ipq *)); 380 383 void ip_freef _P((struct ipq *)); 381 #endif /* !VBOX */382 384 void ip_enq _P((register struct ipasfrag *, register struct ipasfrag *)); 383 385 void ip_deq _P((register struct ipasfrag *)); 384 #ifdef VBOX385 void ip_slowtimo _P((PNATState));386 #else /* !VBOX */387 386 void ip_slowtimo _P((void)); 388 387 #endif /* !VBOX */ … … 428 427 #ifdef VBOX 429 428 void tcp_respond _P((PNATState, struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int)); 429 struct tcpcb * tcp_newtcpcb _P((PNATState, struct socket *)); 430 struct tcpcb * tcp_close _P((PNATState, register struct tcpcb *)); 430 431 #else /* !VBOX */ 431 432 void tcp_respond _P((struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int)); 432 #endif /* !VBOX */433 433 struct tcpcb * tcp_newtcpcb _P((struct socket *)); 434 #ifdef VBOX435 struct tcpcb * tcp_close _P((PNATState, register struct tcpcb *));436 #else /* !VBOX */437 434 struct tcpcb * tcp_close _P((register struct tcpcb *)); 438 435 #endif /* !VBOX */ -
trunk/src/VBox/Devices/Network/slirp/slirp_state.h
r1034 r1039 95 95 struct socket *tcp_last_so; 96 96 tcp_seq tcp_iss; 97 #if ARCH_BITS == 64 98 /* Stuff from tcp_subr.c */ 99 void *apvHash[1024]; 100 uint32_t cpvHashUsed; 101 uint32_t cpvHashCollisions; 102 uint64_t cpvHashInserts; 103 uint64_t cpvHashDone; 104 #endif 97 105 /* Stuff from tcp_timer.c */ 98 106 struct tcpstat_t tcpstat; -
trunk/src/VBox/Devices/Network/slirp/socket.c
r1033 r1039 642 642 643 643 /* Don't tcp_attach... we don't need so_snd nor so_rcv */ 644 if ((so->so_tcpcb = tcp_newtcpcb( so)) == NULL) {644 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL) { 645 645 free(so); 646 646 return NULL; -
trunk/src/VBox/Devices/Network/slirp/tcp_input.c
r1033 r1039 75 75 #define TCP_REASS(pData, tp, ti, m, so, flags) {\ 76 76 if ((ti)->ti_seq == (tp)->rcv_nxt && \ 77 u32_to_ptr(( tp)->seg_next, struct tcpcb *) == (tp) && \77 u32_to_ptr((pData), (tp)->seg_next, struct tcpcb *) == (tp) && \ 78 78 (tp)->t_state == TCPS_ESTABLISHED) {\ 79 79 if (ti->ti_flags & TH_PUSH) \ … … 98 98 #define TCP_REASS(pData, tp, ti, m, so, flags) { \ 99 99 if ((ti)->ti_seq == (tp)->rcv_nxt && \ 100 u32_to_ptr(( tp)->seg_next, struct tcpcb *) == (tp) && \100 u32_to_ptr((pData), (tp)->seg_next, struct tcpcb *) == (tp) && \ 101 101 (tp)->t_state == TCPS_ESTABLISHED) { \ 102 102 tp->t_flags |= TF_DELACK; \ … … 187 187 * Find a segment which begins after this one does. 188 188 */ 189 for (q = u32_to_ptr( tp->seg_next, struct tcpiphdr *); q != (struct tcpiphdr *)tp;190 q = u32_to_ptr( q->ti_next, struct tcpiphdr *))189 for (q = u32_to_ptr(pData, tp->seg_next, struct tcpiphdr *); q != (struct tcpiphdr *)tp; 190 q = u32_to_ptr(pData, q->ti_next, struct tcpiphdr *)) 191 191 if (SEQ_GT(q->ti_seq, ti->ti_seq)) 192 192 break; … … 197 197 * segment. If it provides all of our data, drop us. 198 198 */ 199 if (u32_to_ptr( q->ti_prev, struct tcpiphdr *) != (struct tcpiphdr *)tp) {199 if (u32_to_ptr(pData, q->ti_prev, struct tcpiphdr *) != (struct tcpiphdr *)tp) { 200 200 register int i; 201 q = u32_to_ptr( q->ti_prev, struct tcpiphdr *);201 q = u32_to_ptr(pData, q->ti_prev, struct tcpiphdr *); 202 202 /* conversion to int (in i) handles seq wraparound */ 203 203 i = q->ti_seq + q->ti_len - ti->ti_seq; … … 223 223 ti->ti_seq += i; 224 224 } 225 q = u32_to_ptr( q->ti_next, struct tcpiphdr *);225 q = u32_to_ptr(pData, q->ti_next, struct tcpiphdr *); 226 226 } 227 227 tcpstat.tcps_rcvoopack++; … … 243 243 break; 244 244 } 245 q = u32_to_ptr( q->ti_next, struct tcpiphdr *);246 m = REASS_MBUF_GET(u32_to_ptr( q->ti_prev, struct tcpiphdr *));247 remque_32(u32_to_ptr( q->ti_prev, struct tcpiphdr *));245 q = u32_to_ptr(pData, q->ti_next, struct tcpiphdr *); 246 m = REASS_MBUF_GET(u32_to_ptr(pData, q->ti_prev, struct tcpiphdr *)); 247 remque_32(u32_to_ptr(pData, q->ti_prev, struct tcpiphdr *)); 248 248 #ifdef VBOX 249 249 m_freem(pData, m); … … 256 256 * Stick new segment in its place. 257 257 */ 258 insque_32(ti, u32_to_ptr( q->ti_prev, struct tcpiphdr *));258 insque_32(ti, u32_to_ptr(pData, q->ti_prev, struct tcpiphdr *)); 259 259 260 260 present: … … 265 265 if (!TCPS_HAVEESTABLISHED(tp->t_state)) 266 266 return (0); 267 ti = u32_to_ptr( tp->seg_next, struct tcpiphdr *);267 ti = u32_to_ptr(pData, tp->seg_next, struct tcpiphdr *); 268 268 if (ti == (struct tcpiphdr *)tp || ti->ti_seq != tp->rcv_nxt) 269 269 return (0); … … 275 275 remque_32(ti); 276 276 m = REASS_MBUF_GET(ti); /* XXX */ 277 ti = u32_to_ptr( ti->ti_next, struct tcpiphdr *);277 ti = u32_to_ptr(pData, ti->ti_next, struct tcpiphdr *); 278 278 /* if (so->so_state & SS_FCANTRCVMORE) */ 279 279 if (so->so_state & SS_FCANTSENDMORE) … … 647 647 } 648 648 } else if (ti->ti_ack == tp->snd_una && 649 u32_to_ptr( tp->seg_next, struct tcpcb *) == tp &&649 u32_to_ptr(pData, tp->seg_next, struct tcpcb *) == tp && 650 650 ti->ti_len <= sbspace(&so->so_rcv)) { 651 651 /* -
trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
r1033 r1039 221 221 */ 222 222 struct tcpcb * 223 tcp_newtcpcb(so) 224 struct socket *so; 223 tcp_newtcpcb(PNATState pData, struct socket *so) 225 224 { 226 225 register struct tcpcb *tp; … … 231 230 232 231 memset((char *) tp, 0, sizeof(struct tcpcb)); 233 tp->seg_next = tp->seg_prev = ptr_to_u32( (struct tcpiphdr *)tp);232 tp->seg_next = tp->seg_prev = ptr_to_u32(pData, (struct tcpiphdr *)tp); 234 233 tp->t_maxseg = tcp_mssdflt; 235 234 … … 323 322 324 323 /* free the reassembly queue, if any */ 325 t = u32_to_ptr( tp->seg_next, struct tcpiphdr *);324 t = u32_to_ptr(pData, tp->seg_next, struct tcpiphdr *); 326 325 while (t != (struct tcpiphdr *)tp) { 327 t = u32_to_ptr( t->ti_next, struct tcpiphdr *);328 m = REASS_MBUF_GET(u32_to_ptr( t->ti_prev, struct tcpiphdr *));329 remque_32(u32_to_ptr( t->ti_prev, struct tcpiphdr *));326 t = u32_to_ptr(pData, t->ti_next, struct tcpiphdr *); 327 m = REASS_MBUF_GET(u32_to_ptr(pData, t->ti_prev, struct tcpiphdr *)); 328 remque_32(u32_to_ptr(pData, t->ti_prev, struct tcpiphdr *)); 330 329 #ifdef VBOX 331 330 m_freem(pData, m); … … 339 338 */ 340 339 /* free(tp, M_PCB); */ 341 u32ptr_done(p tr_to_u32(tp), tp);340 u32ptr_done(pData, ptr_to_u32(pData, tp), tp); 342 341 free(tp); 343 342 so->so_tcpcb = 0; … … 638 637 #endif /* !VBOX */ 639 638 { 640 if ((so->so_tcpcb = tcp_newtcpcb( so)) == NULL)639 if ((so->so_tcpcb = tcp_newtcpcb(pData, so)) == NULL) 641 640 return -1; 642 641 … … 1496 1495 1497 1496 #if defined(VBOX) && SIZEOF_CHAR_P != 4 1498 /** Hash table used for translating pointers to unique uint32_t entries.1499 * The 0 entry is reserved for NULL pointers. */1500 void *g_apvHash[16384];1501 /** The number of currently used pointer hash entries. */1502 uint32_t g_cpvHashUsed = 1;1503 /** The number of insert collisions. */1504 uint32_t g_cpvHashCollisions = 0;1505 /** The number of hash inserts. */1506 uint64_t g_cpvHashInserts = 0;1507 /** The number of done calls. */1508 uint64_t g_cpvHashDone = 0;1509 1510 1497 /** 1511 1498 * Slow pointer hashing that deals with automatic inserting and collisions. 1512 1499 */ 1513 uint32_t VBoxU32PtrHashSlow( void *pv)1500 uint32_t VBoxU32PtrHashSlow(PNATState pData, void *pv) 1514 1501 { 1515 1502 uint32_t i; … … 1518 1505 else 1519 1506 { 1520 const uint32_t i1 = ((uintptr_t)pv >> 3) % RT_ELEMENTS( g_apvHash);1521 if ( g_apvHash[i1] == pv)1507 const uint32_t i1 = ((uintptr_t)pv >> 3) % RT_ELEMENTS(pData->apvHash); 1508 if (pData->apvHash[i1] == pv) 1522 1509 i = i1; 1523 1510 else … … 1529 1516 */ 1530 1517 const uint32_t i2 = ((uintptr_t)pv >> 2) % 7867; 1531 uint32_t i1stFree = g_apvHash[i1] ? 0 : i1;1518 uint32_t i1stFree = pData->apvHash[i1] ? 0 : i1; 1532 1519 int cTries = 10; 1533 1520 int cTries2 = 100; … … 1542 1529 { 1543 1530 i = i1stFree; 1544 g_apvHash[i] = pv;1545 g_cpvHashUsed++;1531 pData->apvHash[i] = pv; 1532 pData->cpvHashUsed++; 1546 1533 if (i != i1) 1547 g_cpvHashCollisions++;1548 g_cpvHashInserts++;1534 pData->cpvHashCollisions++; 1535 pData->cpvHashInserts++; 1549 1536 break; 1550 1537 } 1551 1538 if (!cTries2) 1552 1539 { 1553 AssertReleaseMsgFailed(("NAT pointer hash error. pv=%p g_cpvHashUsed=%d g_cpvHashCollisions=%u\n",1554 pv, g_cpvHashUsed, g_cpvHashCollisions));1540 AssertReleaseMsgFailed(("NAT pointer hash error. pv=%p cpvHashUsed=%d cpvHashCollisions=%u\n", 1541 pv, pData->cpvHashUsed, pData->cpvHashCollisions)); 1555 1542 i = 0; 1556 1543 break; … … 1561 1548 1562 1549 /* advance to the next hash entry and test it. */ 1563 i = (i + i2) % RT_ELEMENTS( g_apvHash);1550 i = (i + i2) % RT_ELEMENTS(pData->apvHash); 1564 1551 while (RT_UNLIKELY(!i)) 1565 i = (i + i2) % RT_ELEMENTS( g_apvHash);1566 if ( g_apvHash[i] == pv)1552 i = (i + i2) % RT_ELEMENTS(pData->apvHash); 1553 if (pData->apvHash[i] == pv) 1567 1554 break; 1568 if (RT_UNLIKELY(!i1stFree && ! g_apvHash[i]))1555 if (RT_UNLIKELY(!i1stFree && !pData->apvHash[i])) 1569 1556 i1stFree = i; 1570 1557 } … … 1578 1565 * Removes the pointer from the hash table. 1579 1566 */ 1580 void VBoxU32PtrDone( void *pv, uint32_t iHint)1567 void VBoxU32PtrDone(PNATSTate pData, void *pv, uint32_t iHint) 1581 1568 { 1582 1569 /* We don't count NULL pointers. */ 1583 1570 if (pv == NULL) 1584 1571 return; 1585 g_cpvHashDone++;1572 pData->cpvHashDone++; 1586 1573 1587 1574 /* try the hint */ 1588 1575 if ( iHint 1589 && iHint < RT_ELEMENTS( g_apvHash)1590 && g_apvHash[iHint] == pv)1576 && iHint < RT_ELEMENTS(pData->apvHash) 1577 && pData->apvHash[iHint] == pv) 1591 1578 { 1592 g_apvHash[iHint] = NULL;1593 g_cpvHashUsed--;1579 pData->apvHash[iHint] = NULL; 1580 pData->cpvHashUsed--; 1594 1581 return; 1595 1582 } 1596 1583 1597 iHint = ((uintptr_t)pv >> 3) % RT_ELEMENTS( g_apvHash);1598 if (RT_UNLIKELY( g_apvHash[iHint] != pv))1584 iHint = ((uintptr_t)pv >> 3) % RT_ELEMENTS(pData->apvHash); 1585 if (RT_UNLIKELY(pData->apvHash[iHint] != pv)) 1599 1586 { 1600 1587 /* … … 1606 1593 { 1607 1594 /* advance to the next hash entry and test it. */ 1608 iHint = (iHint + i2) % RT_ELEMENTS( g_apvHash);1595 iHint = (iHint + i2) % RT_ELEMENTS(pData->apvHash); 1609 1596 while (RT_UNLIKELY(!iHint)) 1610 iHint = (iHint + i2) % RT_ELEMENTS( g_apvHash);1611 if ( g_apvHash[iHint] == pv)1597 iHint = (iHint + i2) % RT_ELEMENTS(pData->apvHash); 1598 if (pData->apvHash[iHint] == pv) 1612 1599 break; 1613 1600 … … 1615 1602 if (--cTries > 0) 1616 1603 { 1617 AssertReleaseMsgFailed(("NAT pointer hash error. pv=%p g_cpvHashUsed=%u g_cpvHashCollisions=%u\n",1618 pv, g_cpvHashUsed, g_cpvHashCollisions));1604 AssertReleaseMsgFailed(("NAT pointer hash error. pv=%p cpvHashUsed=%u cpvHashCollisions=%u\n", 1605 pv, pData->cpvHashUsed, pData->cpvHashCollisions)); 1619 1606 return; 1620 1607 } … … 1623 1610 1624 1611 /* found it */ 1625 g_apvHash[iHint] = NULL;1626 g_cpvHashUsed--;1612 pData->apvHash[iHint] = NULL; 1613 pData->cpvHashUsed--; 1627 1614 } 1628 1615 -
trunk/src/VBox/Devices/Network/slirp/tcp_var.h
r1033 r1039 44 44 typedef struct tcpiphdr *tcpiphdrp_32; 45 45 /* VBox change that's to much bother to #ifdef. */ 46 # define u32ptr_done( u32, ptr) do {} while (0)47 # define ptr_to_u32(p tr) (ptr)48 # define u32_to_ptr( u32, type) ((type)(u32))46 # define u32ptr_done(pData, u32, ptr) do {} while (0) 47 # define ptr_to_u32(pData, ptr) (ptr) 48 # define u32_to_ptr(pData, u32, type) ((type)(u32)) 49 49 #else 50 50 typedef u_int32_t tcpiphdrp_32; … … 54 54 55 55 /* VBox change that's to much bother to #ifdef. */ 56 # define u32ptr_done(u32, ptr) VBoxU32PtrDone((ptr), (u32)) 57 # define ptr_to_u32(ptr) VBoxU32PtrHash((ptr)) 58 # define u32_to_ptr(u32, type) ((type)VBoxU32PtrLookup(u32)) 59 60 extern void *g_apvHash[16384]; 61 62 extern void VBoxU32PtrDone(void *pv, uint32_t iHint); 63 extern uint32_t VBoxU32PtrHashSlow(void *pv); 56 # define u32ptr_done(u32, ptr) VBoxU32PtrDone((pData), (ptr), (u32)) 57 # define ptr_to_u32(ptr) VBoxU32PtrHash((pData), (ptr)) 58 # define u32_to_ptr(u32, type) ((type)VBoxU32PtrLookup((pData), (u32))) 59 60 extern void VBoxU32PtrDone(PNATSTate pData, void *pv, uint32_t iHint); 61 extern uint32_t VBoxU32PtrHashSlow(PNATState pData, void *pv); 64 62 65 63 /** Hash the pointer, inserting it if need be. */ 66 DECLINLINE(uint32_t) VBoxU32PtrHash( void *pv)64 DECLINLINE(uint32_t) VBoxU32PtrHash(PNATState pData, void *pv) 67 65 { 68 uint32_t i = ((uintptr_t)pv >> 3) % RT_ELEMENTS( g_apvHash);69 if (RT_LIKELY( g_apvHash[i] == pv && pv))66 uint32_t i = ((uintptr_t)pv >> 3) % RT_ELEMENTS(pData->apvHash); 67 if (RT_LIKELY(pData->apvHash[i] == pv && pv)) 70 68 return i; 71 return VBoxU32PtrHashSlow(p v);69 return VBoxU32PtrHashSlow(pData, pv); 72 70 } 73 71 /** Lookup the hash value. */ 74 DECLINLINE(void *) VBoxU32PtrLookup( uint32_t i)72 DECLINLINE(void *) VBoxU32PtrLookup(PNATState pData, uint32_t i) 75 73 { 76 74 void *pv; 77 Assert(i < RT_ELEMENTS( g_apvHash));78 pv = g_apvHash[i];75 Assert(i < RT_ELEMENTS(pData->apvHash)); 76 pv = pData->apvHash[i]; 79 77 Assert(pv || !i); 80 78 return pv; … … 229 227 /* VBox change which is too much bother to #ifdef */ 230 228 # define REASS_MBUF_SET(ti, p) (*(mbufp_32 *)&((ti)->ti_t)) = ptr_to_u32(p) 231 # define REASS_MBUF_GET(ti) u32_to_ptr( (*(mbufp_32 *)&((ti)->ti_t)), struct mbuf *)229 # define REASS_MBUF_GET(ti) u32_to_ptr(pData, (*(mbufp_32 *)&((ti)->ti_t)), struct mbuf *) 232 230 #endif 233 231 /*#define REASS_MBUF(ti) (*(mbufp_32 *)&((ti)->ti_t)) - replaced by REASS_MBUF_GET/SET */
Note:
See TracChangeset
for help on using the changeset viewer.