VirtualBox

Changeset 49709 in vbox for trunk/src


Ignore:
Timestamp:
Nov 28, 2013 8:51:10 PM (11 years ago)
Author:
vboxsync
Message:

Do the song and dance to use WSARecvMsg on Windows.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/NAT/pxping.c

    r49690 r49709  
    7373
    7474    SOCKET sock6;
     75#ifdef RT_OS_WINDOWS
     76    LPFN_WSARECVMSG pfWSARecvMsg6;
     77#endif
    7578    int hopl;
    7679
     
    168171
    169172
     173#ifdef RT_OS_WINDOWS
     174static int pxping_init_windows(struct pxping *pxping);
     175#endif
    170176static void pxping_recv4(void *arg, struct pbuf *p);
    171177static void pxping_recv6(void *arg, struct pbuf *p);
     
    257263
    258264    g_pxping.sock6 = sock6;
     265#ifdef RT_OS_WINDOWS
     266    /* we need recvmsg */
     267    if (g_pxping.sock6 != INVALID_SOCKET) {
     268        status = pxping_init_windows(&g_pxping);
     269        if (status == SOCKET_ERROR) {
     270            g_pxping.sock6 = INVALID_SOCKET;
     271            /* close(sock6); */
     272        }
     273    }
     274#endif
    259275    if (g_pxping.sock6 != INVALID_SOCKET) {
    260276        g_pxping.hopl = -1;
     
    293309    return ERR_OK;
    294310}
     311
     312
     313#ifdef RT_OS_WINDOWS
     314static int
     315pxping_init_windows(struct pxping *pxping)
     316{
     317    GUID WSARecvMsgGUID = WSAID_WSARECVMSG;
     318    DWORD nread;
     319    int status;
     320
     321    pxping->pfWSARecvMsg6 = NULL;
     322    status = WSAIoctl(pxping->sock6,
     323                      SIO_GET_EXTENSION_FUNCTION_POINTER,
     324                      &WSARecvMsgGUID, sizeof(WSARecvMsgGUID),
     325                      &pxping->pfWSARecvMsg6, sizeof(pxping->pfWSARecvMsg6),
     326                      &nread,
     327                      NULL, NULL);
     328    return status;
     329}
     330#endif  /* RT_OS_WINDOWS */
    295331
    296332
     
    12171253pxping_pmgr_icmp6(struct pxping *pxping)
    12181254{
     1255#ifndef RT_OS_WINDOWS
    12191256    struct msghdr mh;
    1220     struct iovec iov[1];
     1257    ssize_t nread;
     1258#else
     1259    WSAMSG mh;
     1260    DWORD nread;
     1261#endif
     1262    IOVEC iov[1];
    12211263    static u8_t cmsgbuf[128];
    12221264    struct cmsghdr *cmh;
    12231265    struct sockaddr_in6 sin6;
    12241266    socklen_t salen = sizeof(sin6);
    1225     ssize_t nread;
    12261267    struct icmp6_echo_hdr *icmph;
    12271268    struct in6_pktinfo *pktinfo;
    12281269    int hopl, tclass;
     1270    int status;
    12291271
    12301272    char addrbuf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
     
    12351277     * headers are available via recvmsg(2)/cmsg(3).
    12361278     */
     1279    IOVEC_SET_BASE(iov[0], pollmgr_udpbuf);
     1280    IOVEC_SET_LEN(iov[0], sizeof(pollmgr_udpbuf));
     1281
    12371282    memset(&mh, 0, sizeof(mh));
     1283#ifndef RT_OS_WINDOWS
    12381284    mh.msg_name = &sin6;
    12391285    mh.msg_namelen = sizeof(sin6);
    1240     iov[0].iov_base = pollmgr_udpbuf;
    1241     iov[0].iov_len = sizeof(pollmgr_udpbuf);
    12421286    mh.msg_iov = iov;
    12431287    mh.msg_iovlen = 1;
     
    12511295        return;
    12521296    }
    1253     addrstr = inet_ntop(AF_INET6, (void *)&sin6.sin6_addr, addrbuf, sizeof(addrbuf));
     1297#else  /* RT_OS_WINDOWS */
     1298    mh.name = (LPSOCKADDR)&sin6;
     1299    mh.namelen = sizeof(sin6);
     1300    mh.lpBuffers = iov;
     1301    mh.dwBufferCount = 1;
     1302    mh.Control.buf = cmsgbuf;
     1303    mh.Control.len = sizeof(cmsgbuf);
     1304    mh.dwFlags = 0;
     1305
     1306    status = (*pxping->pfWSARecvMsg6)(pxping->sock6, &mh, &nread, NULL, NULL);
     1307    if (status == SOCKET_ERROR) {
     1308        DPRINTF2(("%s: error %d\n", __func__, WSAGetLastError()));
     1309        return;
     1310    }
     1311#endif
    12541312
    12551313    icmph = (struct icmp6_echo_hdr *)pollmgr_udpbuf;
     1314
     1315    addrstr = inet_ntop(AF_INET6, (void *)&sin6.sin6_addr,
     1316                        addrbuf, sizeof(addrbuf));
    12561317    DPRINTF2(("%s: %s ICMPv6: ", __func__, addrstr));
    12571318
Note: See TracChangeset for help on using the changeset viewer.

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