Changeset 12661 in vbox for trunk/src/VBox/HostDrivers/VBoxNetFlt
- Timestamp:
- Sep 23, 2008 7:42:25 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 36953
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
r12656 r12661 681 681 } 682 682 else 683 { 683 { 684 684 /* 685 685 * Allocate & initialize per-stream data. Hook it into the (read and write) queue's module specific data. … … 689 689 { 690 690 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate stream data.\n")); 691 691 692 692 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 693 693 return ENOMEM; … … 757 757 LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc)); 758 758 } 759 else 759 else 760 760 LogRel((DEVICE_NAME ":vboxNetFltSolarisBindReq failed rc=%Vrc.\n", rc)); 761 761 … … 906 906 && pPromiscStream->fRawMode) 907 907 { 908 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 908 909 vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg); 910 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 909 911 fSendUpstream = false; 910 912 } … … 921 923 switch (Prim) 922 924 { 923 #if 0924 case DL_UNITDATA_IND:925 {926 /*927 * I do not think control would come here... We convert all outgoing fast mode requests928 * to raw mode; so I don't think we should really receive any fast mode replies.929 */930 LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: DL_UNITDATA_IND\n"));931 932 if (fActive)933 {934 vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg);935 fSendUpstream = false;936 }937 break;938 }939 #endif940 941 925 case DL_BIND_ACK: 942 926 { … … 2405 2389 return VERR_NET_MSG_SIZE; 2406 2390 2407 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;2408 RTSpinlockAcquire(pThis->hSpinlock, &Tmp);2409 2410 2391 PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr; 2411 2392 PVBOXNETFLTPACKETID pCur = NULL; … … 2441 2422 pCur = pPromiscStream->pTail; 2442 2423 vboxNetFltSolarisInitPacketId(pCur, pMsg); 2424 pPromiscStream->cLoopback++; 2443 2425 2444 2426 LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback re-used tail checksum=%u cLoopback=%d.\n", … … 2486 2468 } 2487 2469 2488 RTSpinlockRelease(pThis->hSpinlock, &Tmp);2489 2470 return rc; 2490 2471 } … … 2562 2543 pPromiscStream->pTail = pCur; 2563 2544 pCur->pNext = NULL; 2564 pPromiscStream->cLoopback--;2565 }2545 } 2546 pPromiscStream->cLoopback--; 2566 2547 2567 2548 LogFlow((DEVICE_NAME ":vboxNetFltSolarisIsOurMBlk found packet %p cLoopback=%d\n", pMsg, pPromiscStream->cLoopback)); … … 2590 2571 Assert(pStream->Type == kPromiscStream); 2591 2572 2573 vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream); 2574 if (RT_UNLIKELY(!pPromiscStream)) 2575 { 2576 freemsg(pMsg); 2577 LogRel((DEVICE_NAME ":Promiscuous stream missing!! Failing to receive packet.\n")); 2578 return VERR_INVALID_POINTER; 2579 } 2580 2592 2581 /* 2593 2582 * Don't loopback packets we transmit to the wire. 2594 2583 */ 2595 vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);2596 2584 if (vboxNetFltSolarisIsOurMBlk(pThis, pPromiscStream, pMsg)) 2597 2585 { … … 2975 2963 */ 2976 2964 int rc = VINF_SUCCESS; 2965 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 2977 2966 if (fDst & INTNETTRUNKDIR_WIRE) 2978 2967 { 2979 vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream); 2980 if (RT_LIKELY(pPromiscStream)) 2981 { 2968 mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst); 2969 if (RT_LIKELY(pMsg)) 2970 { 2971 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_WIRE\n")); 2972 2973 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 2974 2975 vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream); 2982 2976 queue_t *pPromiscWriteQueue = WR(pPromiscStream->Stream.pReadQueue); 2983 Assert(pPromiscWriteQueue); 2984 2985 mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst); 2986 if (RT_LIKELY(pMsg)) 2987 { 2988 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_WIRE\n")); 2989 2990 rc = vboxNetFltSolarisQueueLoopback(pThis, pPromiscStream, pMsg); 2991 putnext(pPromiscWriteQueue, pMsg); 2992 } 2993 else 2994 rc = VERR_NO_MEMORY; 2977 2978 rc = vboxNetFltSolarisQueueLoopback(pThis, pPromiscStream, pMsg); 2979 2980 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 2981 2982 putnext(pPromiscWriteQueue, pMsg); 2995 2983 } 2996 2984 else 2997 rc = VERR_ INVALID_POINTER;2985 rc = VERR_NO_MEMORY; 2998 2986 } 2999 2987 … … 3026 3014 * Send message up ARP stream. 3027 3015 */ 3016 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 3017 3028 3018 vboxnetflt_stream_t *pArpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvArpStream); 3029 queue_t *pArpReadQueue = pArpStream->pReadQueue; 3030 Assert(pArpReadQueue); 3031 3032 putnext(pArpReadQueue, pMsg); 3019 if (RT_LIKELY(pArpStream)) 3020 { 3021 queue_t *pArpReadQueue = pArpStream->pReadQueue; 3022 Assert(pArpReadQueue); 3023 3024 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 3025 3026 putnext(pArpReadQueue, pMsg); 3027 } 3028 else 3029 { 3030 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 3031 rc = VERR_INVALID_POINTER; 3032 } 3033 3033 } 3034 3034 else … … 3039 3039 * Send messages up IP stream. 3040 3040 */ 3041 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 3042 3041 3043 vboxnetflt_stream_t *pIpStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvIpStream); 3042 queue_t *pIpReadQueue = pIpStream->pReadQueue; 3043 Assert(pIpReadQueue); 3044 3045 putnext(pIpReadQueue, pMsg); 3044 if (RT_LIKELY(pIpStream)) 3045 { 3046 queue_t *pIpReadQueue = pIpStream->pReadQueue; 3047 Assert(pIpReadQueue); 3048 3049 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 3050 putnext(pIpReadQueue, pMsg); 3051 } 3052 else 3053 { 3054 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 3055 rc = VERR_INVALID_POINTER; 3056 } 3046 3057 } 3047 3058 }
Note:
See TracChangeset
for help on using the changeset viewer.