VirtualBox

Ignore:
Timestamp:
Sep 19, 2008 3:06:08 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36871
Message:

Solaris/vboxnetflt: bits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r12597 r12604  
    177177static struct cb_ops g_VBoxNetFltSolarisCbOps =
    178178{
    179     nulldev,                    /* cb open */
    180     nulldev,                    /* cb close */
    181     nodev,                      /* b strategy */
    182     nodev,                      /* b dump */
    183     nodev,                      /* b print */
    184     nodev,                      /* cb read */
    185     nodev,                      /* cb write */
    186     nodev,                      /* cb ioctl */
    187     nodev,                      /* c devmap */
    188     nodev,                      /* c mmap */
    189     nodev,                      /* c segmap */
    190     nochpoll,                   /* c poll */
    191     ddi_prop_op,                /* property ops */
     179    nulldev,                        /* cb open */
     180    nulldev,                        /* cb close */
     181    nodev,                          /* b strategy */
     182    nodev,                          /* b dump */
     183    nodev,                          /* b print */
     184    nodev,                          /* cb read */
     185    nodev,                          /* cb write */
     186    nodev,                          /* cb ioctl */
     187    nodev,                          /* c devmap */
     188    nodev,                          /* c mmap */
     189    nodev,                          /* c segmap */
     190    nochpoll,                       /* c poll */
     191    ddi_prop_op,                    /* property ops */
    192192    &g_VBoxNetFltSolarisStreamTab,
    193     D_NEW | D_MP | D_MTPERMOD,  /* compat. flag */
    194     CB_REV                      /* revision */
     193    D_NEW | D_MP | D_MTPERMOD,      /* compat. flag */
     194    CB_REV                          /* revision */
    195195};
    196196
     
    200200static struct dev_ops g_VBoxNetFltSolarisDevOps =
    201201{
    202     DEVO_REV,                   /* driver build revision */
    203     0,                          /* ref count */
     202    DEVO_REV,                       /* driver build revision */
     203    0,                              /* ref count */
    204204    VBoxNetFltSolarisGetInfo,
    205     nulldev,                    /* identify */
    206     nulldev,                    /* probe */
     205    nulldev,                        /* identify */
     206    nulldev,                        /* probe */
    207207    VBoxNetFltSolarisAttach,
    208208    VBoxNetFltSolarisDetach,
    209     nodev,                      /* reset */
     209    nodev,                          /* reset */
    210210    &g_VBoxNetFltSolarisCbOps,
    211211    (struct bus_ops *)0,
    212     nodev                       /* power */
     212    nodev                           /* power */
    213213};
    214214
     
    218218static struct modldrv g_VBoxNetFltSolarisDriver =
    219219{
    220     &mod_driverops,             /* extern from kernel */
     220    &mod_driverops,                 /* extern from kernel */
    221221    DEVICE_DESC_DRV,
    222222    &g_VBoxNetFltSolarisDevOps
     
    238238static struct modlstrmod g_VBoxNetFltSolarisModule =
    239239{
    240     &mod_strmodops,             /* extern from kernel */
     240    &mod_strmodops,                 /* extern from kernel */
    241241    DEVICE_DESC_MOD,
    242242    &g_VBoxNetFltSolarisModOps
     
    248248static struct modlinkage g_VBoxNetFltSolarisModLinkage =
    249249{
    250     MODREV_1,                      /* loadable module system revision */
    251     &g_VBoxNetFltSolarisDriver,    /* streams driver framework */
    252     &g_VBoxNetFltSolarisModule,    /* streams module framework */
    253     NULL                           /* terminate array of linkage structures */
     250    MODREV_1,                       /* loadable module system revision */
     251    &g_VBoxNetFltSolarisDriver,     /* streams driver framework */
     252    &g_VBoxNetFltSolarisModule,     /* streams module framework */
     253    NULL                            /* terminate array of linkage structures */
    254254};
    255255
     
    279279
    280280/**
    281  * vboxnetflt_stream_t: per-stream data
     281 * vboxnetflt_stream_t: per-stream data (multiple streams per interface)
    282282 */
    283283typedef struct vboxnetflt_stream_t
     
    286286    queue_t *pReadQueue;                  /* read side queue */
    287287    struct vboxnetflt_stream_t *pNext;    /* next stream in list */
     288    PVBOXNETFLTINS pThis;                 /* the backend instance */
     289    VBOXNETFLTSTREAMTYPE Type;            /* the type of the stream Ip/Arp */
     290} vboxnetflt_stream_t;
     291
     292/**
     293 * vboxnetflt_promisc_stream_t: per-interface dedicated stream data
     294 */
     295typedef struct vboxnetflt_promisc_stream_t
     296{
     297    vboxnetflt_stream_t Stream;           /* The generic stream */
    288298    bool fPromisc;                        /* cached promiscous value */
    289299    bool fRawMode;                        /* whether raw mode request was successful */
    290300    uint32_t ModeReqId;                   /* track MIOCTLs for swallowing our fake request acknowledgements */
    291     PVBOXNETFLTINS pThis;                 /* the backend instance */
    292     VBOXNETFLTSTREAMTYPE Type;            /* the type of the stream Ip/Arp */
    293 } vboxnetflt_stream_t;
     301    uint32_t aLoopback[64];               /* loopback CRC buffer */
     302} vboxnetflt_promisc_stream_t;
    294303
    295304/**
     
    298307typedef struct vboxnetflt_state_t
    299308{
    300     /** Global device info handle. */
    301     dev_info_t *pDip;
    302309    /** The list of all opened streams. */
    303310    vboxnetflt_stream_t *pOpenedStreams;
     
    315322*   Internal Functions                                                           *
    316323*******************************************************************************/
    317 static int vboxNetFltSolarisSetRawMode(queue_t *pQueue);
    318 static int vboxNetFltSolarisSetFastMode(queue_t *pQueue);
     324static int vboxNetFltSolarisSetRawMode(vboxnetflt_promisc_stream_t *pPromiscStream);
     325/* static int vboxNetFltSolarisSetFastMode(queue_t *pQueue); */
    319326
    320327static int vboxNetFltSolarisPhysAddrReq(queue_t *pQueue);
    321328static void vboxNetFltSolarisCachePhysAddr(PVBOXNETFLTINS pThis, mblk_t *pPhysAddrAckMsg);
    322 static mblk_t *vboxNetFltSolarisBindReq(queue_t *pQueue, int SAP);
     329static int vboxNetFltSolarisBindReq(queue_t *pQueue, int SAP);
    323330
    324331static int vboxNetFltSolarisUnitDataToRaw(PVBOXNETFLTINS pThis, mblk_t *pMsg, mblk_t **ppRawMsg);
     
    341348/** Global state. */
    342349static vboxnetflt_state_t g_VBoxNetFltSolarisState;
     350/** Mutex protecting dynamic binding of the filter. */
     351RTSEMFASTMUTEX g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
     352/** Global device info handle. */
     353static dev_info_t *g_pVBoxNetFltSolarisDip = NULL;
     354
     355
    343356/** GCC C++ hack. */
    344357unsigned __gxx_personality_v0 = 0xdecea5ed;
    345 /** Global Mutex protecting global state. */
    346 RTSEMFASTMUTEX g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
    347358
    348359
     
    471482            if (rc == DDI_SUCCESS)
    472483            {
    473                 g_VBoxNetFltSolarisState.pDip = pDip;
     484                g_pVBoxNetFltSolarisDip = pDip;
    474485                ddi_report_dev(pDip);
    475486                return DDI_SUCCESS;
     
    540551        case DDI_INFO_DEVT2DEVINFO:
    541552        {
    542             *ppResult = g_VBoxNetFltSolarisState.pDip;
     553            *ppResult = g_pVBoxNetFltSolarisDip;
    543554            return DDI_SUCCESS;
    544555        }
     
    621632        DevMinor = getminor(*pDev);
    622633
    623     /*
    624      * Allocate & initialize per-stream data. Hook it into the (read and write) queue's module specific data.
    625      */
    626     pStream = RTMemAlloc(sizeof(*pStream));
    627     if (RT_UNLIKELY(!pStream))
    628     {
    629         LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate stream data.\n"));
    630         return ENOMEM;
     634    if (pState->CurType == kPromiscStream)
     635    {
     636        vboxnetflt_promisc_stream_t *pPromiscStream = RTMemAlloc(sizeof(vboxnetflt_promisc_stream_t));
     637        if (RT_UNLIKELY(!pPromiscStream))
     638        {
     639            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate promiscuous stream data.\n"));
     640            return ENOMEM;
     641        }
     642
     643        pPromiscStream->fPromisc = false;
     644        pPromiscStream->fRawMode = false;
     645        pPromiscStream->ModeReqId = 0;
     646        bzero(pPromiscStream->aLoopback, sizeof(pPromiscStream->aLoopback));
     647        pStream = (vboxnetflt_stream_t *)pPromiscStream;
     648    }
     649    else
     650    {   
     651        /*
     652         * Allocate & initialize per-stream data. Hook it into the (read and write) queue's module specific data.
     653         */
     654        pStream = RTMemAlloc(sizeof(vboxnetflt_stream_t));
     655        if (RT_UNLIKELY(!pStream))
     656        {
     657            LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate stream data.\n"));
     658            return ENOMEM;
     659        }
    631660    }
    632661    pStream->DevMinor = DevMinor;
    633662    pStream->pReadQueue = pQueue;
    634     pStream->fPromisc = false;
    635     pStream->fRawMode = false;
    636663
    637664    /*
     
    641668    pStream->pThis = pState->pCurInstance;
    642669    pStream->Type = pState->CurType;
    643     if (pState->CurType == kIpStream)
    644         pState->pCurInstance->u.s.pvIpStream = pStream;
    645     else if (pState->CurType == kArpStream)
    646         pState->pCurInstance->u.s.pvArpStream = pStream;
    647     else if (pState->CurType == kPromiscStream)
    648         pState->pCurInstance->u.s.pvPromiscStream = pStream;
    649 
    650     pStream->ModeReqId = 0;
     670    switch (pStream->Type)
     671    {
     672        case kIpStream:         pState->pCurInstance->u.s.pvIpStream = pStream;         break;
     673        case kArpStream:        pState->pCurInstance->u.s.pvArpStream = pStream;        break;
     674        case kPromiscStream:    pState->pCurInstance->u.s.pvPromiscStream = pStream;    break;
     675        default:    AssertRelease(pStream->Type);   break;
     676    }
     677
    651678    pQueue->q_ptr = pStream;
    652679    WR(pQueue)->q_ptr = pStream;
     
    662689    if (pStream->Type == kPromiscStream)
    663690    {
     691        vboxnetflt_promisc_stream_t *pPromiscStream = (vboxnetflt_promisc_stream_t *)pStream;
     692
    664693        /*
    665694         * Bind to SAP 0 (DL_ETHER).
     
    669698         * TPR anymore as far as I know.
    670699         */
    671         vboxNetFltSolarisBindReq(pStream->pReadQueue, 0 /* SAP */);
     700        int rc = vboxNetFltSolarisBindReq(pStream->pReadQueue, 0 /* SAP */);
     701        if (RT_UNLIKELY(RT_FAILURE(rc)))
     702        {
     703            LogRel((DEVICE_NAME ":vboxNetFltSolarisBindReq failed rc=%Vrc.\n", rc));
     704            return EPROTO;
     705        }
    672706
    673707        /*
     
    675709         */
    676710        /** @todo take a look at DLPI notifications additionally for these things. */
    677         vboxNetFltSolarisPhysAddrReq(pStream->pReadQueue);
     711        rc = vboxNetFltSolarisPhysAddrReq(pStream->pReadQueue);
     712        if (RT_UNLIKELY(RT_FAILURE(rc)))
     713        {
     714            LogRel((DEVICE_NAME ":vboxNetFltSolarisPhysAddrReq failed rc=%Vrc.\n", rc));
     715            return EPROTO;
     716        }
    678717
    679718        /*
    680719         * Enable raw mode.
    681720         */
    682         vboxNetFltSolarisSetRawMode(pStream->pReadQueue);
    683     }
    684 
    685     pStream->pThis->fDisconnectedFromHost = false;
     721        rc = vboxNetFltSolarisSetRawMode(pPromiscStream);
     722        if (RT_UNLIKELY(RT_FAILURE(rc)))
     723        {
     724            LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc));
     725            return EPROTO;       
     726        }
     727    }
    686728
    687729    NOREF(fOpenMode);
     
    722764    }
    723765
    724     pStream->pThis->fDisconnectedFromHost = true;
    725766    qprocsoff(pQueue);
    726767
     
    736777     * Delete the stream.
    737778     */
    738     if (pStream->Type == kIpStream)
    739         pStream->pThis->u.s.pvIpStream = NULL;
    740     else if (pStream->Type == kArpStream)
    741         pStream->pThis->u.s.pvArpStream = NULL;
    742     else
    743         pStream->pThis->u.s.pvPromiscStream = NULL;
     779    switch (pStream->Type)
     780    {
     781        case kIpStream:         ASMAtomicUoWritePtr(pStream->pThis->u.s.pvIpStream, NULL);      break;
     782        case kArpStream:        ASMAtomicUoWritePtr(pStream->pThis->u.s.pvArpStream, NULL);     break;
     783        case kPromiscStream:    ASMAtomicUoWritePtr(pStream->pThis->u.s.pvPromiscStream, NULL); break;
     784        default: AssertRelease(pStream->Type); break;
     785    }
    744786
    745787    RTMemFree(pStream);
     
    764806static int VBoxNetFltSolarisModReadPut(queue_t *pQueue, mblk_t *pMsg)
    765807{
     808    /*
     809     * Yes, I'm paranoid.
     810     */
     811    if (!pMsg || !pQueue)
     812    {
     813        LogRel((DEVICE_NAME ":VBoxNetFltSolarisModReadPut huh?? Invalid parameters.\n"));
     814        return 0;
     815    }
     816
    766817    LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut pQueue=%p pMsg=%p\n", pQueue, pMsg));
    767818
     
    776827     */
    777828    if (   pStream
    778         && pStream->Type == kPromiscStream
    779         && pMsg)
     829        && pStream->Type == kPromiscStream)
    780830    {
    781831        pThis = vboxNetFltSolarisFindInstance(pStream);
     
    792842            RTSpinlockRelease(pThis->hSpinlock, &Tmp);
    793843
     844            vboxnetflt_promisc_stream_t *pPromiscStream = (vboxnetflt_promisc_stream_t *)pStream;
     845
    794846            switch (DB_TYPE(pMsg))
    795847            {
     
    799851
    800852                    if (   fActive
    801                         && pStream->fRawMode)
     853                        && pPromiscStream->fRawMode)
    802854                    {
    803855                        vboxNetFltSolarisRecv(pThis, pStream, pQueue, pMsg);
     
    865917                            {
    866918                                LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: M_PCPROTO: DL_OK_ACK: fPromisc is ON.\n"));
    867                                 pStream->fPromisc = true;
     919                                pPromiscStream->fPromisc = true;
    868920                            }
    869921                            else if (pOkAck->dl_correct_primitive == DL_PROMISCOFF_REQ)
    870922                            {
    871923                                LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: M_PCPROTO: DL_OK_ACK: fPromisc is OFF.\n"));
    872                                 pStream->fPromisc = false;
     924                                pPromiscStream->fPromisc = false;
    873925                            }
    874926
     
    887939                     */
    888940                    struct iocblk *pIOC = (struct iocblk *)pMsg->b_rptr;
    889                     if (pIOC->ioc_id == pStream->ModeReqId)
     941                    if (pIOC->ioc_id == pPromiscStream->ModeReqId)
    890942                    {
    891                         pStream->fRawMode = true;
     943                        pPromiscStream->fRawMode = true;
    892944                        LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: Mode acknowledgement. RawMode is %s\n",
    893                                 pStream->fRawMode ? "ON" : "OFF"));
     945                                pPromiscStream->fRawMode ? "ON" : "OFF"));
    894946
    895947                        freemsg(pMsg);
     
    11581210
    11591211    /*
    1160      * Implment just the flow controlled service draining of the queue.
     1212     * Implement just the flow controlled service draining of the queue.
    11611213     * Nothing else to do here, we handle all the important stuff in the Put procedure.
    11621214     */
     
    11831235 * @param   pQueue      Pointer to the queue.
    11841236 */
    1185 static int vboxNetFltSolarisSetRawMode(queue_t *pQueue)
    1186 {
    1187     LogFlow((DEVICE_NAME ":vboxNetFltSolarisSetRawMode pQueue=%p\n", pQueue));
     1237static int vboxNetFltSolarisSetRawMode(vboxnetflt_promisc_stream_t *pPromiscStream)
     1238{
     1239    LogFlow((DEVICE_NAME ":vboxNetFltSolarisSetRawMode pPromiscStream=%p\n", pPromiscStream));
    11881240
    11891241    mblk_t *pRawMsg = NULL;
     
    11921244        return VERR_NO_MEMORY;
    11931245
    1194     vboxnetflt_stream_t *pStream = pQueue->q_ptr;
     1246    queue_t *pQueue = pPromiscStream->Stream.pReadQueue;
     1247    if (!pQueue)
     1248        return VERR_INVALID_POINTER;
     1249
    11951250    struct iocblk *pIOC = (struct iocblk *)pRawMsg->b_rptr;
    1196     pStream->ModeReqId = pIOC->ioc_id;
     1251    pPromiscStream->ModeReqId = pIOC->ioc_id;
    11971252    pIOC->ioc_count = 0;
    11981253
     
    13551410 * Prepare DLPI bind request to a SAP.
    13561411 *
    1357  * @returns Pointer to the request message.
    1358  */
    1359 static mblk_t *vboxNetFltSolarisBindReq(queue_t *pQueue, int SAP)
     1412 * @returns VBox status code.
     1413 * @param   pQueue      Pointer to the queue.
     1414 * @param   SAP         The SAP to bind the stream to.
     1415 */
     1416static int vboxNetFltSolarisBindReq(queue_t *pQueue, int SAP)
    13601417{
    13611418    LogFlow((DEVICE_NAME ":vboxNetFltSolarisBindReq SAP=%u\n", SAP));
     
    13631420    mblk_t *pBindMsg = mexchange(NULL, NULL, DL_BIND_REQ_SIZE, M_PROTO, DL_BIND_REQ);
    13641421    if (RT_UNLIKELY(!pBindMsg))
    1365         return NULL;
     1422        return VERR_NO_MEMORY;
    13661423
    13671424    dl_bind_req_t *pBindReq = (dl_bind_req_t *)pBindMsg->b_rptr;
     
    19121969    rc = vboxNetFltSolarisOpenStream(pThis);
    19131970    if (RT_SUCCESS(rc))
     1971    {
    19141972        rc = vboxNetFltSolarisModSetup(pThis, true);
     1973        if (RT_SUCCESS(rc))
     1974            ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, false);
     1975    }
    19151976    else
    19161977        LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface vboxNetFltSolarisOpenStream failed rc=%Vrc\n", rc));
     
    19341995    AssertRC(rc);
    19351996
     1997    ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, true);
    19361998    vboxNetFltSolarisCloseStream(pThis);
    19371999    rc = vboxNetFltSolarisModSetup(pThis, false);
     
    22522314        fSrc = INTNETTRUNKDIR_HOST;
    22532315
     2316#if 0
    22542317    if (fSrc & INTNETTRUNKDIR_HOST)
    22552318    {
     
    22582321            pMsg = pCorrectedMsg;
    22592322    }
     2323#endif
    22602324
    22612325    vboxNetFltSolarisAnalyzeMBlk(pMsg);
     
    23662430         * Check if the IP checksum is valid.
    23672431         */
    2368         PRTNETIPV4 pIpHdr = (PRTNETIPV4)(pEthHdr + 1);
     2432        uint8_t *pbProtocol = (uint8_t *)(pEthHdr + 1);
     2433        PRTNETIPV4 pIpHdr = (PRTNETIPV4)pbProtocol;
     2434        size_t cbPayload = cbIpPacket - (pIpHdr->ip_hl << 2);
     2435
    23692436        bool fChecksumAdjusted = false;
    23702437
     
    23742441        if (pIpHdr->ip_p == RTNETIPV4_PROT_TCP)
    23752442        {
    2376             size_t cbTcpPacket = cbIpPacket - (pIpHdr->ip_hl << 2);
    2377 
    2378             PRTNETTCP pTcpHdr = (PRTNETTCP)((uint32_t *)(pIpHdr + pIpHdr->ip_hl));
    2379             if (!RTNetIPv4IsTCPValid(pIpHdr, pTcpHdr, cbTcpPacket, NULL, cbTcpPacket))
     2443            pbProtocol += (pIpHdr->ip_hl << 2);
     2444            PRTNETTCP pTcpHdr = (PRTNETTCP)pbProtocol;
     2445            uint16_t TcpChecksum = RTNetIPv4TCPChecksum(pIpHdr, pTcpHdr, NULL);
     2446            if (pTcpHdr->th_sum != TcpChecksum)
    23802447            {
    2381                 pTcpHdr->th_sum = RTNetIPv4TCPChecksum(pIpHdr, pTcpHdr, NULL);
     2448                pTcpHdr->th_sum = TcpChecksum;
    23822449                fChecksumAdjusted = true;
    2383                 LogFlow((DEVICE_NAME ":fixed TCP checkum.\n"));
     2450                LogFlow((DEVICE_NAME ":fixed TCP checksum.\n"));
    23842451            }
    23852452
    2386             if (!RTNetIPv4IsHdrValid(pIpHdr, cbIpPacket, cbIpPacket))
     2453            uint16_t IpChecksum = RTNetIPv4HdrChecksum(pIpHdr);
     2454            if (pIpHdr->ip_sum != IpChecksum)
    23872455            {
    2388                 pIpHdr->ip_sum = RTNetIPv4HdrChecksum(pIpHdr);
     2456                pIpHdr->ip_sum = IpChecksum;
    23892457                fChecksumAdjusted = true;
    2390                 LogFlow((DEVICE_NAME ":fixed IP checkum.\n"));
     2458                LogFlow((DEVICE_NAME ":fixed IP checksum.\n"));
    23912459            }
    23922460        }
    23932461        else if (pIpHdr->ip_p == RTNETIPV4_PROT_UDP)
    23942462        {
    2395             size_t cbUdpPacket = cbIpPacket - (pIpHdr->ip_hl << 2);
    2396             PRTNETUDP pUdpHdr = (PRTNETUDP)((uint32_t *)pIpHdr + pIpHdr->ip_hl);
     2463            pbProtocol += (pIpHdr->ip_hl << 2);
     2464            PRTNETUDP pUdpHdr = (PRTNETUDP)pbProtocol;
    23972465            uint16_t UdpChecksum = RTNetIPv4UDPChecksum(pIpHdr, pUdpHdr, pUdpHdr + 1);
    23982466
     
    24012469                pUdpHdr->uh_sum = UdpChecksum;
    24022470                fChecksumAdjusted = true;
    2403                 LogFlow((DEVICE_NAME ":Invalid UDP checksum!!"));
     2471                LogFlow((DEVICE_NAME ":Fixed UDP checksum."));
    24042472            }
    24052473
    2406             if (!RTNetIPv4IsHdrValid(pIpHdr, cbIpPacket, cbIpPacket))
     2474            uint16_t IpChecksum = RTNetIPv4HdrChecksum(pIpHdr);
     2475            if (pIpHdr->ip_sum != IpChecksum)
    24072476            {
    2408                 pIpHdr->ip_sum = RTNetIPv4HdrChecksum(pIpHdr);
     2477                pIpHdr->ip_sum = IpChecksum;
    24092478                fChecksumAdjusted = true;
    2410                 LogFlow((DEVICE_NAME ":fixed IP checkum.\n"));
     2479                LogFlow((DEVICE_NAME ":fixed IP checksum.\n"));
    24112480            }
    24122481        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette