VirtualBox

Ticket #5503: vbox_ipv6_shared_mac_addr.patch

File vbox_ipv6_shared_mac_addr.patch, 18.6 KB (added by simon_vetter, 12 years ago)

Updated patch, tested OK against v4.2.10

  • include/iprt/net.h

    diff -aur VirtualBox-4.2.10-orig/include/iprt/net.h VirtualBox-4.2.10/include/iprt/net.h
    old new  
    323323
    324324/** The minimum IPv6 header length (in bytes).
    325325 * Up to and including RTNETIPV6::ip6_dst. */
    326 #define RTNETIPV6_MIN_LEN   (40)
     326#define RTNETIPV6_MIN_LEN                           (40)
     327#define RTNETIPV6_ICMPV6_ND_WITH_LLA_OPT_MIN_LEN    (32)
    327328
    328329RTDECL(uint32_t) RTNetIPv6PseudoChecksum(PCRTNETIPV6 pIpHdr);
    329330RTDECL(uint32_t) RTNetIPv6PseudoChecksumEx(PCRTNETIPV6 pIpHdr, uint8_t bProtocol, uint16_t cbPkt);
    330331RTDECL(uint32_t) RTNetIPv6PseudoChecksumBits(PCRTNETADDRIPV6 pSrcAddr, PCRTNETADDRIPV6 pDstAddr,
    331332                                             uint8_t bProtocol, uint16_t cbPkt);
    332333
    333 
    334334/**
    335335 * UDP header.
    336336 */
     
    737737
    738738/** @todo add ICMPv6 when needed. */
    739739
     740#define RTNETIPV6_PROT_ICMPV6       (58)
     741#define RTNETIPV6_ICMPV6_CODE_0     (0)
     742#define RTNETIPV6_ICMP_NS_TYPE      (135)
     743#define RTNETIPV6_ICMP_NA_TYPE      (136)
     744#define RTNETIPV6_ICMP_ND_SLLA_OPT  (1)
     745#define RTNETIPV6_ICMP_ND_TLLA_OPT  (2)
     746#define RTNETIPV6_ICMP_ND_LLA_LEN   (1)
     747
     748/** ICMPv6 ND Source Link Layer Address option */
     749#pragma pack(1)
     750typedef struct RTNETNDP_SLLA_OPT
     751{
     752    uint8_t type;
     753    uint8_t len;
     754    RTMAC slla;
     755} RTNETNDP_SLLA_OPT;
     756#pragma pack()
     757
     758AssertCompileSize(RTNETNDP_SLLA_OPT, 1+1+6);
     759
     760typedef RTNETNDP_SLLA_OPT *PRTNETNDP_SLLA_OPT;
     761typedef RTNETNDP_SLLA_OPT const *PCRTNETNDP_SLLA_OPT;
     762
     763/** ICMPv6 ND Neighbor Sollicitation */
     764#pragma pack(1)
     765typedef struct RTNETNDP
     766{
     767    /** ICMPv6 type. **/
     768    uint8_t icmp6_type;
     769    /** ICMPv6 code. **/
     770    uint8_t icmp6_code;
     771    /** ICMPv6 checksum **/
     772    uint16_t icmp6_cksum;
     773    /** reserved **/
     774    uint32_t reserved;
     775    /** target address **/
     776    RTNETADDRIPV6 target_address;
     777} RTNETNDP;
     778#pragma pack()
     779AssertCompileSize(RTNETNDP, 1+1+2+4+16);
     780/** Pointer to a NDP ND packet. */
     781typedef RTNETNDP *PRTNETNDP;
     782/** Pointer to a const NDP NS packet. */
     783typedef RTNETNDP const *PCRTNETNDP;
     784
    740785
    741786/**
    742787 * Ethernet ARP header.
     
    805850typedef RTNETARPIPV4 const *PCRTNETARPIPV4;
    806851
    807852
    808 /** @todo RTNETNDP (IPv6)*/
    809 
    810 
    811853/** @} */
    812854
    813855RT_C_DECLS_END
  • include/iprt/types.h

    diff -aur VirtualBox-4.2.10-orig/include/iprt/types.h VirtualBox-4.2.10/include/iprt/types.h
    old new  
    395395/**
    396396 * 128-bit unsigned integer union.
    397397 */
     398#pragma pack(1)
    398399typedef union RTUINT128U
    399400{
    400401    /** Natural view.
     
    470471    /** 8-bit view. */
    471472    uint8_t     au8[16];
    472473} RTUINT128U;
     474#pragma pack()
    473475/** Pointer to a 64-bit unsigned integer union. */
    474476typedef RTUINT128U *PRTUINT128U;
    475477/** Pointer to a const 64-bit unsigned integer union. */
  • src/VBox/Devices/Network/SrvIntNetR0.cpp

    diff -aur VirtualBox-4.2.10-orig/src/VBox/Devices/Network/SrvIntNetR0.cpp VirtualBox-4.2.10/src/VBox/Devices/Network/SrvIntNetR0.cpp
    old new  
    836836    return NULL;
    837837}
    838838
     839/**
     840 * Checks if the IPv6 address is a good interface address.
     841 * @returns true/false.
     842 * @param   addr        The address, network endian.
     843 */
     844DECLINLINE(bool) intnetR0IPv6AddrIsGood(RTNETADDRIPV6 addr)
     845{
     846            //check for ::
     847    return  !(addr.u == 0 ||
     848            //check for multicast
     849            (addr.Words.w0 & RT_H2BE_U16(0xff00) == RT_H2BE_U16(0xff00)) ||
     850            //check for ::1
     851            (addr.Words.w0 == 0 && addr.Words.w1 == 0 && addr.Words.w2 == 0 &&
     852                addr.Words.w3 == 0 && addr.Words.w4 ==0 && addr.Words.w5 == 0 &&
     853                addr.Words.w6 == 0 && addr.Words.w7 == RT_H2BE_U16(0x0001)) );
     854}
     855
    839856
    840857/**
    841858 * Checks if the IPv4 address is a broadcast address.
     
    848865    return Addr.u == UINT32_MAX;
    849866}
    850867
    851 
    852868/**
    853869 * Checks if the IPv4 address is a good interface address.
    854870 * @returns true/false.
     
    10701086    switch (enmAddrType)
    10711087    {
    10721088        case kIntNetAddrType_IPv4:
    1073             Log(("intnetR0IfAddrCacheDeleteIt: hIf=%#x MAC=%.6Rhxs IPv4 added #%d %d.%d.%d.%d %s\n",
     1089            LogRel(("intnetR0IfAddrCacheDeleteIt: hIf=%#x MAC=%.6Rhxs IPv4 deleted #%d %d.%d.%d.%d %s\n",
    10741090                 pIf->hIf, &pIf->MacAddr, iEntry, pAddr->au8[0], pAddr->au8[1], pAddr->au8[2], pAddr->au8[3], pszMsg));
    10751091            break;
     1092        case kIntNetAddrType_IPv6:
     1093            LogRel(("intnetR0IfAddrCacheDeleteIt: hIf=%#x MAC=%.6Rhxs IPv6 deleted #%d %00x:%00x:%00x:%00x:%00x:%00x:%00x %00x %s\n",
     1094                pIf->hIf, &pIf->MacAddr, iEntry,
     1095                pAddr->IPv6.Words.w0,
     1096                pAddr->IPv6.Words.w1,
     1097                pAddr->IPv6.Words.w2,
     1098                pAddr->IPv6.Words.w3,
     1099                pAddr->IPv6.Words.w4,
     1100                pAddr->IPv6.Words.w5,
     1101                pAddr->IPv6.Words.w6,
     1102                pAddr->IPv6.Words.w7,
     1103                pszMsg
     1104            ));
     1105            break;
    10761106        default:
    1077             Log(("intnetR0IfAddrCacheDeleteIt: hIf=%RX32 MAC=%.6Rhxs type=%d #%d %.*Rhxs %s\n",
     1107            LogRel(("intnetR0IfAddrCacheDeleteIt: hIf=%RX32 MAC=%.6Rhxs type=%d #%d %.*Rhxs %s\n",
    10781108                 pIf->hIf, &pIf->MacAddr, enmAddrType, iEntry, pCache->cbAddress, pAddr, pszMsg));
    10791109            break;
    10801110    }
     
    12291259    /* When the table is full, drop the older entry (FIFO). Do proper ageing? */
    12301260    if (pCache->cEntries >= pCache->cEntriesAlloc)
    12311261    {
    1232         Log(("intnetR0IfAddrCacheAddIt: type=%d replacing %.*Rhxs\n",
     1262        LogRel(("intnetR0IfAddrCacheAddIt: type=%d replacing %.*Rhxs\n",
    12331263             (int)(uintptr_t)(pCache - &pIf->aAddrCache[0]), pCache->cbAddress, pCache->pbEntries));
    12341264        memmove(pCache->pbEntries, pCache->pbEntries + pCache->cbEntry, pCache->cbEntry * (pCache->cEntries - 1));
    12351265        pCache->cEntries--;
     
    12471277    switch (enmAddrType)
    12481278    {
    12491279        case kIntNetAddrType_IPv4:
    1250             Log(("intnetR0IfAddrCacheAddIt: hIf=%#x MAC=%.6Rhxs IPv4 added #%d %d.%d.%d.%d %s\n",
     1280            LogRel(("intnetR0IfAddrCacheAddIt: hIf=%#x MAC=%.6Rhxs IPv4 added #%d %d.%d.%d.%d %s\n",
    12511281                 pIf->hIf, &pIf->MacAddr, pCache->cEntries, pAddr->au8[0], pAddr->au8[1], pAddr->au8[2], pAddr->au8[3], pszMsg));
    12521282            break;
     1283        case kIntNetAddrType_IPv6:
     1284            LogRel(("intnetR0IfAddrCacheAddIt: hIf=%#x MAC=%.6Rhxs IPv6 added #%d %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x %s\n",
     1285                    pIf->hIf, &pIf->MacAddr, pCache->cEntries,
     1286                    RT_BE2H_U16(pAddr->IPv6.Words.w0),
     1287                    RT_BE2H_U16(pAddr->IPv6.Words.w1),
     1288                    RT_BE2H_U16(pAddr->IPv6.Words.w2),
     1289                    RT_BE2H_U16(pAddr->IPv6.Words.w3),
     1290                    RT_BE2H_U16(pAddr->IPv6.Words.w4),
     1291                    RT_BE2H_U16(pAddr->IPv6.Words.w5),
     1292                    RT_BE2H_U16(pAddr->IPv6.Words.w6),
     1293                    RT_BE2H_U16(pAddr->IPv6.Words.w7),
     1294                    pszMsg
     1295                ));
     1296            break;
    12531297        default:
    1254             Log(("intnetR0IfAddrCacheAddIt: hIf=%#x MAC=%.6Rhxs type=%d added #%d %.*Rhxs %s\n",
     1298            LogRel(("intnetR0IfAddrCacheAddIt: hIf=%#x MAC=%.6Rhxs type=%d added #%d %.*Rhxs %s\n",
    12551299                 pIf->hIf, &pIf->MacAddr, enmAddrType, pCache->cEntries, pCache->cbAddress, pAddr, pszMsg));
    12561300            break;
    12571301    }
     
    22512295
    22522296#ifdef INTNET_WITH_DHCP_SNOOPING
    22532297/**
    2254  * Snoop up addresses from ARP and DHCP traffic from frames coming
     2298 * Snoop up addresses from ND, ARP and DHCP traffic from frames coming
    22552299 * over the trunk connection.
    22562300 *
    22572301 * The caller is responsible for do some basic filtering before calling
     
    23332377            break;
    23342378        }
    23352379
    2336         case RTNET_ETHERTYPE_IPV6:
    2337         {
    2338             /** @todo IPv6: Check for ICMPv6. It looks like type 133 (Router solicitation) might
    2339              * need to be edited. Check out how NDP works...  */
    2340             break;
    2341         }
    2342 
    23432380        case RTNET_ETHERTYPE_ARP:
    23442381            intnetR0TrunkIfSnoopArp(pNetwork, pSG);
    23452382            break;
     
    23472384}
    23482385#endif /* INTNET_WITH_DHCP_SNOOPING */
    23492386
     2387/**
     2388 * Deals with an IPv6 packet.
     2389 *
     2390 * This will fish out the source IP address and add it to the cache.
     2391 * Then it will look for DHCPRELEASE requests (?) and anything else
     2392 * that we might find useful later.
     2393 *
     2394 * @param   pIf             The interface that's sending the frame.
     2395 * @param   pIpHdr          Pointer to the IPv4 header in the frame.
     2396 * @param   cbPacket        The size of the packet, or more correctly the
     2397 *                          size of the frame without the ethernet header.
     2398 * @param   fGso            Set if this is a GSO frame, clear if regular.
     2399 */
     2400static void intnetR0IfSnoopIPv6SourceAddr(PINTNETIF pIf, PCRTNETIPV6 pIpHdr, uint32_t cbPacket, bool fGso)
     2401{
     2402    /*
     2403     * Check the header size first to prevent access invalid data.
     2404     */
     2405    if (cbPacket < RTNETIPV6_MIN_LEN)
     2406        return;
     2407
     2408    /*
     2409     * If the source address is good (not multicast) and
     2410     * not already in the address cache of the sender, add it.
     2411     */
     2412    RTNETADDRU Addr;
     2413    Addr.IPv6 = pIpHdr->ip6_src;
     2414
     2415    if (    intnetR0IPv6AddrIsGood(Addr.IPv6) && (pIpHdr->ip6_hlim == 0xff)
     2416        &&  intnetR0IfAddrCacheLookupLikely(&pIf->aAddrCache[kIntNetAddrType_IPv6], &Addr, sizeof(Addr.IPv6)) < 0)
     2417    {
     2418        intnetR0IfAddrCacheAddIt(pIf, &pIf->aAddrCache[kIntNetAddrType_IPv6], &Addr, "if/ipv6");
     2419    }
     2420}
     2421
    23502422
    23512423/**
    23522424 * Deals with an IPv4 packet.
     
    24972569        case RTNET_ETHERTYPE_IPV4:
    24982570            intnetR0IfSnoopIPv4SourceAddr(pIf, (PCRTNETIPV4)((PCRTNETETHERHDR)pbFrame + 1), cbFrame, fGso);
    24992571            break;
    2500 #if 0 /** @todo IntNet: implement IPv6 for wireless MAC sharing. */
     2572
    25012573        case RTNET_ETHERTYPE_IPV6:
    2502             /** @todo IPv6: Check for ICMPv6. It looks like type 133 (Router solicitation) might
    2503              * need to be edited. Check out how NDP works...  */
    2504             intnetR0IfSnoopIPv6SourceAddr(pIf, (PCINTNETIPV6)((PCRTNETETHERHDR)pbFrame + 1), cbFrame, fGso, pfSgFlags);
     2574            intnetR0IfSnoopIPv6SourceAddr(pIf, (PCRTNETIPV6)((PCRTNETETHERHDR)pbFrame + 1), cbFrame, fGso);
    25052575            break;
    2506 #endif
     2576
    25072577#if 0 /** @todo IntNet: implement IPX for wireless MAC sharing? */
    25082578        case RTNET_ETHERTYPE_IPX_1:
    25092579        case RTNET_ETHERTYPE_IPX_2:
     
    26852755    return !!(pThis->fHostGsoCapabilites & pThis->fWireGsoCapabilites & fMask);
    26862756}
    26872757
     2758/**
     2759 * Calculates the checksum of a full ipv6 frame.
     2760 *
     2761 * @returns 16-bit hecksum value.
     2762 * @param   pIpHdr          The IPv6 header (network endian (big)).
     2763 * @param   bProtocol       The protocol number.  This can be the same as the
     2764 *                          ip6_nxt field, but doesn't need to be.
     2765 * @param   cbPkt           The packet size (host endian of course).  This can
     2766 *                          be the same as the ip6_plen field, but as with @a
     2767 *                          bProtocol it won't be when extension headers are
     2768 *                          present.  For UDP this will be uh_ulen converted to
     2769 *                          host endian.
     2770 */
     2771static uint16_t computeIPv6FullChecksum(PCRTNETIPV6 pIpHdr)
     2772{
     2773    uint16_t const *data;
     2774    int len         = RT_BE2H_U16(pIpHdr->ip6_plen);
     2775    uint32_t sum    = RTNetIPv6PseudoChecksum(pIpHdr);
     2776
     2777    //add the payload
     2778    data = (uint16_t *) (pIpHdr + 1);
     2779    while(len > 1)
     2780    {
     2781        sum += *(data);
     2782        data++;
     2783        len -= 2;
     2784    }
     2785
     2786    if(len > 0)
     2787        sum += *((uint8_t *) data);
     2788
     2789    while(sum >> 16)
     2790        sum = (sum & 0xffff) + (sum >> 16);
     2791
     2792    return (uint16_t) ~sum;
     2793}
    26882794
    26892795/**
    26902796 * Sends a frame down the trunk.
     
    27652906                pArp->ar_tha = pThis->MacAddr;
    27662907            }
    27672908        }
    2768         //else if (pSG->fFlags & INTNETSG_FLAGS_ICMPV6_NDP)
    2769         //{ /// @todo move the editing into a different function
    2770         //}
     2909        else if (pEthHdr->EtherType == RT_H2BE_U16(RTNET_ETHERTYPE_IPV6))
     2910        {
     2911            /*
     2912             * IPV6 ICMP Neighbor Discovery : replace
     2913             * 1) the advertised source mac address in outgoing neighbor sollicitations
     2914             *    with the HW MAC address of the trunk interface,
     2915             * 2) the advertised target mac address in outgoing neighbor advertisements
     2916             *    with the HW mac address of the trunk interface.
     2917             *
     2918             * Note that this only applies to traffic going out on the trunk. Incoming
     2919             * NS/NA will never advertise any VM mac address, so we do not need to touch
     2920             * them. Other VMs on this bridge as well as the host will see and use the VM's
     2921             * actual mac addresses.
     2922             *
     2923             */
     2924
     2925            PRTNETIPV6 pIPv6            = (PRTNETIPV6)(pEthHdr + 1);
     2926            PRTNETNDP pNd               = (PRTNETNDP)(pIPv6 + 1);
     2927            PRTNETNDP_SLLA_OPT pLLAOpt  = (PRTNETNDP_SLLA_OPT)(pNd + 1);
     2928
     2929            //make sure we have enough bytes to work with
     2930            if(pSG->cbTotal >= (RTNETIPV6_MIN_LEN + RTNETIPV6_ICMPV6_ND_WITH_LLA_OPT_MIN_LEN) &&
     2931                //ensure the packet came from our LAN (not gone through any router)
     2932                pIPv6->ip6_hlim == 0xff &&
     2933                //protocol has to be icmpv6
     2934                pIPv6->ip6_nxt == RTNETIPV6_PROT_ICMPV6 &&
     2935                //we either have a sollicitation with source link layer addr. opt, or
     2936                ((pNd->icmp6_type == RTNETIPV6_ICMP_NS_TYPE &&
     2937                            pNd->icmp6_code == RTNETIPV6_ICMPV6_CODE_0 &&
     2938                            pLLAOpt->type == RTNETIPV6_ICMP_ND_SLLA_OPT) ||
     2939                //an advertisement with target link layer addr. option
     2940                ((pNd->icmp6_type == RTNETIPV6_ICMP_NA_TYPE &&
     2941                            pNd->icmp6_code == RTNETIPV6_ICMPV6_CODE_0 &&
     2942                            pLLAOpt->type == RTNETIPV6_ICMP_ND_TLLA_OPT)) ) &&
     2943                pLLAOpt->len == RTNETIPV6_ICMP_ND_LLA_LEN)
     2944            {
     2945                //swap the advertised VM MAC address with the trunk's
     2946                pLLAOpt->slla   = pThis->MacAddr;
     2947
     2948                //recompute the checksum since we changed the packet
     2949                pNd->icmp6_cksum = 0;
     2950                pNd->icmp6_cksum = computeIPv6FullChecksum(pIPv6);
     2951            }
     2952           
     2953        }
    27712954    }
    27722955
    27732956    /*
     
    27912974
    27922975
    27932976/**
     2977 * Snoops a multicast ICMPv6 ND DAD from the wire via the trunk connection.
     2978 *
     2979 * @param   pNetwork        The network the frame is being sent to.
     2980 * @param   pSG             Pointer to the gather list for the frame.
     2981 * @param   pEthHdr         Pointer to the ethernet header.
     2982 */
     2983static void intnetR0NetworkSnoopNAFromWire(PINTNETNETWORK pNetwork, PINTNETSG pSG, PRTNETETHERHDR pEthHdr)
     2984{
     2985    /*
     2986     * Check the minimum size and get a linear copy of the thing to work on,
     2987     * using the temporary buffer if necessary.
     2988     */
     2989    if (RT_UNLIKELY(pSG->cbTotal < sizeof(RTNETETHERHDR) + sizeof(RTNETIPV6) +
     2990                                            sizeof(RTNETNDP)))
     2991        return;
     2992    PRTNETIPV6 pIPv6 = (PRTNETIPV6)((uint8_t *)pSG->aSegs[0].pv + sizeof(RTNETETHERHDR));
     2993    if (    pSG->cSegsUsed != 1
     2994        &&  pSG->aSegs[0].cb < sizeof(RTNETETHERHDR) + sizeof(RTNETIPV6) +
     2995                                                        sizeof(RTNETNDP))
     2996    {
     2997        Log6(("fw: Copying IPv6 pkt %u\n", sizeof(RTNETIPV6)));
     2998        if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR), sizeof(RTNETIPV6)
     2999                                               + sizeof(RTNETNDP), pNetwork->pbTmp))
     3000            return;
     3001        pSG->fFlags |= INTNETSG_FLAGS_PKT_CP_IN_TMP;
     3002        pIPv6 = (PRTNETIPV6)pNetwork->pbTmp;
     3003    }
     3004
     3005    PCRTNETNDP pNd  = (PCRTNETNDP) (pIPv6 + 1);
     3006
     3007    //a multicast NS with :: as source address means a DAD packet.
     3008    //if it comes from the wire and we have the DAD'd address in our cache,
     3009    //flush the entry as the address is being acquired by someone else on
     3010    //the network.
     3011    if(     pIPv6->ip6_hlim == 0xff &&
     3012            pIPv6->ip6_nxt == RTNETIPV6_PROT_ICMPV6 &&
     3013            pNd->icmp6_type == RTNETIPV6_ICMP_NS_TYPE &&
     3014            pNd->icmp6_code == RTNETIPV6_ICMPV6_CODE_0 &&
     3015            pIPv6->ip6_src.u == 0)
     3016    {
     3017       
     3018        intnetR0NetworkAddrCacheDelete(pNetwork, (PCRTNETADDRU) &pNd->target_address,
     3019                                        kIntNetAddrType_IPv6, sizeof(RTNETADDRIPV6), "tif/ip6");
     3020    }
     3021}
     3022/**
    27943023 * Edits an ARP packet arriving from the wire via the trunk connection.
    27953024 *
    27963025 * @param   pNetwork        The network the frame is being sent to.
     
    30973326        return INTNETSWDECISION_BAD_CONTEXT;
    30983327
    30993328    /*
     3329     * Check for ICMPv6 Neighbor Advertisements coming from the trunk.
     3330     * If we see an advertisement for an IP in our cache, we can safely remove
     3331     * it as the IP has probably moved.
     3332     */
     3333    if (    (fSrc & INTNETTRUNKDIR_WIRE)
     3334        &&  RT_BE2H_U16(pEthHdr->EtherType) == RTNET_ETHERTYPE_IPV6
     3335        &&  pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID)
     3336        intnetR0NetworkSnoopNAFromWire(pNetwork, pSG, pEthHdr);
     3337
     3338
     3339    /*
    31003340     * Check for ARP packets from the wire since we'll have to make
    31013341     * modification to them if we're sharing the MAC address with the host.
    31023342     */
     
    31743414            Log6(("intnetshareduni: IPv4 %d.%d.%d.%d\n", Addr.au8[0], Addr.au8[1], Addr.au8[2], Addr.au8[3]));
    31753415            break;
    31763416
    3177 #if 0 /** @todo IntNet: implement IPv6 for wireless MAC sharing. */
    3178         case RTNET_ETHERTYPE_IPV6
     3417        case RTNET_ETHERTYPE_IPV6:
    31793418            if (RT_UNLIKELY(!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV6, ip6_dst), sizeof(Addr.IPv6), &Addr)))
    31803419            {
    31813420                Log(("intnetshareduni: failed to read ip6_dst! cbTotal=%#x\n", pSG->cbTotal));
     
    31843423            enmAddrType = kIntNetAddrType_IPv6;
    31853424            cbAddr = sizeof(Addr.IPv6);
    31863425            break;
    3187 #endif
    31883426#if 0 /** @todo IntNet: implement IPX for wireless MAC sharing? */
    31893427        case RTNET_ETHERTYPE_IPX_1:
    31903428        case RTNET_ETHERTYPE_IPX_2:
     
    33793617                    &&  !intnetR0IsMacAddrMulticast(&EthHdr.SrcMac)
    33803618                    ))
    33813619    {
    3382         Log2(("IF MAC: %.6Rhxs -> %.6Rhxs\n", &pIfSender->MacAddr, &EthHdr.SrcMac));
     3620        LogRel(("IF MAC: %.6Rhxs -> %.6Rhxs\n", &pIfSender->MacAddr, &EthHdr.SrcMac));
    33833621        RTSpinlockAcquire(pNetwork->hAddrSpinlock);
    33843622
    33853623        PINTNETMACTABENTRY pIfEntry = intnetR0NetworkFindMacAddrEntry(pNetwork, pIfSender);

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