Changeset 12656 in vbox for trunk/src/VBox/HostDrivers/VBoxNetFlt
- Timestamp:
- Sep 22, 2008 5:08:10 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 36946
- Location:
- trunk/src/VBox/HostDrivers/VBoxNetFlt
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
r12597 r12656 154 154 * @{ */ 155 155 /** Pointer to the bound IP stream. */ 156 void *pvIpStream;156 void volatile *pvIpStream; 157 157 /** Pointer to the bound ARP stream. */ 158 void *pvArpStream;158 void volatile *pvArpStream; 159 159 /** Pointer to the unbound promiscuous stream. */ 160 void *pvPromiscStream;160 void volatile *pvPromiscStream; 161 161 /** Layered device handle to the interface. */ 162 162 ldi_handle_t hIface; -
trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
r12633 r12656 194 194 ddi_prop_op, /* property ops */ 195 195 &g_VBoxNetFltSolarisStreamTab, 196 D_NEW | D_MP | D_MT PERQ,/* compat. flag */196 D_NEW | D_MP | D_MTQPAIR, /* compat. flag */ 197 197 CB_REV /* revision */ 198 198 }; … … 2381 2381 * @param pPromiscStream Pointer to the promiscuous stream. 2382 2382 * @param pMsg Pointer to the message. 2383 * @remarks Warning!! Assumes caller has taken care of any locking necessary. 2383 2384 */ 2384 2385 static int vboxNetFltSolarisQueueLoopback(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg) … … 2427 2428 pPromiscStream->pHead = pCur; 2428 2429 pPromiscStream->pTail = pCur; 2430 pCur->pNext = NULL; 2429 2431 pPromiscStream->cLoopback++; 2430 2432 … … 2445 2447 } 2446 2448 2447 Assert (pPromiscStream->pTail);2449 AssertRelease(pPromiscStream->pTail); 2448 2450 2449 2451 pCur = RTMemAllocZ(sizeof(VBOXNETFLTPACKETID)); … … 2454 2456 } 2455 2457 2458 vboxNetFltSolarisInitPacketId(pCur, pMsg); 2456 2459 pPromiscStream->pTail->pNext = pCur; 2457 vboxNetFltSolarisInitPacketId(pCur, pMsg); 2460 pPromiscStream->pTail = pCur; 2461 pCur->pNext = NULL; 2458 2462 pPromiscStream->cLoopback++; 2459 2463 … … 2482 2486 } 2483 2487 2484 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 2488 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 2485 2489 return rc; 2486 2490 } … … 2558 2562 pPromiscStream->pTail = pCur; 2559 2563 pCur->pNext = NULL; 2564 pPromiscStream->cLoopback--; 2560 2565 } 2561 2566 … … 2969 2974 * Create a message block and send it down the wire (downstream). 2970 2975 */ 2976 int rc = VINF_SUCCESS; 2971 2977 if (fDst & INTNETTRUNKDIR_WIRE) 2972 2978 { 2973 2979 vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream); 2974 if (!pPromiscStream) 2975 return VERR_INVALID_POINTER; 2976 2977 queue_t *pPromiscWriteQueue = WR(pPromiscStream->Stream.pReadQueue); 2978 Assert(pPromiscWriteQueue); 2979 2980 if (RT_LIKELY(pPromiscStream)) 2981 { 2982 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; 2995 } 2996 else 2997 rc = VERR_INVALID_POINTER; 2998 } 2999 3000 3001 /* 3002 * Create a message block and send it up the host stack (upstream). 3003 */ 3004 if (fDst & INTNETTRUNKDIR_HOST) 3005 { 2980 3006 mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst); 2981 if (RT_UNLIKELY(!pMsg)) 2982 { 2983 LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit vboxNetFltSolarisMBlkFromSG failed.\n")); 2984 return VERR_NO_MEMORY; 2985 } 2986 2987 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_WIRE\n")); 2988 2989 vboxNetFltSolarisQueueLoopback(pThis, pPromiscStream, pMsg); 2990 putnext(pPromiscWriteQueue, pMsg); 2991 } 2992 2993 /* 2994 * Create a message block and send it up the host stack (upstream). 2995 */ 2996 if (fDst & INTNETTRUNKDIR_HOST) 2997 { 2998 mblk_t *pMsg = vboxNetFltSolarisMBlkFromSG(pThis, pSG, fDst); 2999 if (RT_UNLIKELY(!pMsg)) 3000 { 3001 LogRel((DEVICE_NAME ":vboxNetFltPortOsXmit vboxNetFltSolarisMBlkFromSG failed.\n")); 3002 return VERR_NO_MEMORY; 3003 } 3004 3005 PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr; 3006 bool fArp = (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_ARP)); 3007 3008 /* 3009 * Construct a DL_UNITDATA_IND style message. 3010 */ 3011 mblk_t *pDlpiMsg; 3012 int rc = vboxNetFltSolarisRawToUnitData(pMsg, &pDlpiMsg); 3013 if (RT_FAILURE(rc)) 3014 { 3015 LogRel((DEVICE_NAME ":vboxNetFltSolarisRawToUnitData failed! rc=%d\n", rc)); 3016 freemsg(pMsg); 3017 return VERR_NO_MEMORY; 3018 } 3019 pMsg = pDlpiMsg; 3020 3021 if (fArp) 3022 { 3023 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST ARP\n")); 3007 if (RT_LIKELY(pMsg)) 3008 { 3009 PCRTNETETHERHDR pEthHdr = (PCRTNETETHERHDR)pMsg->b_rptr; 3010 bool fArp = (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_ARP)); 3024 3011 3025 3012 /* 3026 * Send message up ARP stream.3013 * Construct a DL_UNITDATA_IND style message. 3027 3014 */ 3028 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); 3015 mblk_t *pDlpiMsg; 3016 int rc = vboxNetFltSolarisRawToUnitData(pMsg, &pDlpiMsg); 3017 if (RT_SUCCESS(rc)) 3018 { 3019 pMsg = pDlpiMsg; 3020 3021 if (fArp) 3022 { 3023 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST ARP\n")); 3024 3025 /* 3026 * Send message up ARP stream. 3027 */ 3028 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); 3033 } 3034 else 3035 { 3036 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST\n")); 3037 3038 /* 3039 * Send messages up IP stream. 3040 */ 3041 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); 3046 } 3047 } 3048 else 3049 { 3050 LogRel((DEVICE_NAME ":vboxNetFltSolarisRawToUnitData failed! rc=%d\n", rc)); 3051 freemsg(pMsg); 3052 rc = VERR_NO_MEMORY; 3053 } 3033 3054 } 3034 3055 else 3035 { 3036 LogFlow((DEVICE_NAME ":vboxNetFltPortOsXmit INTNETTRUNKDIR_HOST\n")); 3037 3038 /* 3039 * Send messages up IP stream. 3040 */ 3041 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); 3046 } 3047 } 3048 3049 return VINF_SUCCESS; 3050 } 3051 3056 rc = VERR_NO_MEMORY; 3057 } 3058 3059 return rc; 3060 } 3061
Note:
See TracChangeset
for help on using the changeset viewer.