VirtualBox

Changeset 90912 in vbox


Ignore:
Timestamp:
Aug 26, 2021 1:38:34 PM (3 years ago)
Author:
vboxsync
Message:

Audio/Validation Kit: More connection mode handling. bugref:10008

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/AudioTestService.h

    r90830 r90912  
    178178int AudioTestSvcShutdown(PATSSERVER pThis);
    179179
     180/**
     181 * Enumeration for the server connection mode.
     182 * Only applies to certain transport implementation like TCP/IP.
     183 */
     184typedef enum ATSCONNMODE
     185{
     186    /** Both: Uses parallel client and server connection methods (via threads). */
     187    ATSCONNMODE_BOTH = 0,
     188    /** Client only: Connects to a server. */
     189    ATSCONNMODE_CLIENT,
     190    /** Server only: Listens for new incoming client connections. */
     191    ATSCONNMODE_SERVER,
     192    /** 32bit hack. */
     193    ATSCONNMODE_32BIT_HACK = 0x7fffffff
     194} ATSCONNMODE;
     195
    180196/** TCP/IP options for the ATS server.
    181197 *  @todo Make this more abstract later. */
    182198enum ATSTCPOPT
    183199{
    184     ATSTCPOPT_MODE = 5000,
     200    ATSTCPOPT_CONN_MODE = 5000,
    185201    ATSTCPOPT_BIND_ADDRESS,
    186202    ATSTCPOPT_BIND_PORT,
  • trunk/src/VBox/Devices/Audio/AudioTestServiceTcp.cpp

    r90887 r90912  
    6868
    6969/**
    70  * Enumeration for the TCP/IP connection mode.
    71  */
    72 typedef enum ATSTCPMODE
    73 {
    74     /** Both: Uses parallel client and server connection methods (via threads). */
    75     ATSTCPMODE_BOTH = 0,
    76     /** Client only: Connects to a server. */
    77     ATSTCPMODE_CLIENT,
    78     /** Server only: Listens for new incoming client connections. */
    79     ATSTCPMODE_SERVER
    80 } ATSTCPMODE;
    81 
    82 /**
    8370 * Structure for keeping Audio Test Service (ATS) transport instance-specific data.
    8471 */
     
    8875    RTCRITSECT                         CritSect;
    8976    /** Connection mode to use. */
    90     ATSTCPMODE                         enmMode;
     77    ATSCONNMODE                        enmConnMode;
    9178    /** The addresses to bind to.  Empty string means any. */
    9279    char                               szBindAddr[256];
     
    314301    int rc;
    315302
    316     LogFunc(("enmMode=%#x\n", pThis->enmMode));
    317 
    318     if (pThis->enmMode == ATSTCPMODE_SERVER)
     303    LogFunc(("enmConnMode=%#x\n", pThis->enmConnMode));
     304
     305    if (pThis->enmConnMode == ATSCONNMODE_SERVER)
    319306    {
    320307        pClient->fFromServer = true;
     
    322309        LogFunc(("RTTcpServerListen2 -> %Rrc\n", rc));
    323310    }
    324     else if (pThis->enmMode == ATSTCPMODE_CLIENT)
     311    else if (pThis->enmConnMode == ATSCONNMODE_CLIENT)
    325312    {
    326313        pClient->fFromServer = false;
     
    339326    else
    340327    {
    341         Assert(pThis->enmMode == ATSTCPMODE_BOTH);
     328        Assert(pThis->enmConnMode == ATSCONNMODE_BOTH);
    342329
    343330        /*
     
    731718    int rc = VINF_SUCCESS;
    732719
    733     if (pThis->enmMode != ATSTCPMODE_CLIENT)
     720    if (pThis->enmConnMode != ATSCONNMODE_CLIENT)
    734721    {
    735722        rc = RTTcpServerCreateEx(pThis->szBindAddr[0] ? pThis->szBindAddr : NULL, pThis->uBindPort, &pThis->pTcpServer);
     
    771758    switch (ch)
    772759    {
    773         case ATSTCPOPT_MODE:
    774             if (!strcmp(pVal->psz, "both"))
    775                 pThis->enmMode = ATSTCPMODE_BOTH;
    776             else if (!strcmp(pVal->psz, "client"))
    777                 pThis->enmMode = ATSTCPMODE_CLIENT;
    778             else if (!strcmp(pVal->psz, "server"))
    779                 pThis->enmMode = ATSTCPMODE_SERVER;
    780             else
    781                 return RTMsgErrorRc(VERR_INVALID_PARAMETER, "Invalid TCP mode: '%s'\n", pVal->psz);
     760        case ATSTCPOPT_CONN_MODE:
     761            pThis->enmConnMode = (ATSCONNMODE)pVal->u32;
    782762            return VINF_SUCCESS;
    783763
     
    818798{
    819799    RTStrmPrintf(pStream,
    820                  "  --tcp-mode <both|client|server>\n"
    821                  "       Selects the mode of operation.\n"
    822                  "       Default: both\n"
    823                  "  --tcp-bind-address <address>\n"
     800                 "  --tcp-conn-mode <0=both|1=client|2=server>\n"
     801                 "       Selects the connection mode.\n"
     802                 "       Default: 0 (both)\n"
     803                 "  --tcp-bind-addr[ess] <address>\n"
    824804                 "       The address(es) to listen to TCP connection on.  Empty string\n"
    825805                 "       means any address, this is the default.\n"
     
    827807                 "       The port to listen to TCP connections on.\n"
    828808                 "       Default: %u\n"
    829                  "  --tcp-connect-address <address>\n"
     809                 "  --tcp-connect-addr[ess] <address>\n"
    830810                 "       The address of the server to try connect to in client mode.\n"
    831811                 "       Default: " ATS_TCP_DEF_CONNECT_GUEST_STR "\n"
     
    839819static const RTGETOPTDEF  g_TcpOpts[] =
    840820{
    841     { "--tcp-mode",             ATSTCPOPT_MODE,             RTGETOPT_REQ_STRING },
     821    { "--tcp-conn-mode",        ATSTCPOPT_CONN_MODE,        RTGETOPT_REQ_STRING },
     822    { "--tcp-bind-addr",        ATSTCPOPT_BIND_ADDRESS,     RTGETOPT_REQ_STRING },
    842823    { "--tcp-bind-address",     ATSTCPOPT_BIND_ADDRESS,     RTGETOPT_REQ_STRING },
    843824    { "--tcp-bind-port",        ATSTCPOPT_BIND_PORT,        RTGETOPT_REQ_UINT16 },
     825    { "--tcp-connect-addr",     ATSTCPOPT_CONNECT_ADDRESS,  RTGETOPT_REQ_STRING },
    844826    { "--tcp-connect-address",  ATSTCPOPT_CONNECT_ADDRESS,  RTGETOPT_REQ_STRING },
    845827    { "--tcp-connect-port",     ATSTCPOPT_CONNECT_PORT,     RTGETOPT_REQ_UINT16 }
  • trunk/src/VBox/Devices/Audio/DrvHostAudioValidationKit.cpp

    r90765 r90912  
    11141114        RT_ZERO(Val);
    11151115
    1116         Val.psz = "server"; /** @ŧodo No client connection mode needed here (yet). Make this configurable via CFGM. */
    1117         rc2 = AudioTestSvcHandleOption(&pThis->Srv, ATSTCPOPT_MODE, &Val);
     1116        Val.u32 = ATSCONNMODE_SERVER; /** @todo No client connection mode needed here (yet). Make this configurable via CFGM. */
     1117        rc2 = AudioTestSvcHandleOption(&pThis->Srv, ATSTCPOPT_CONN_MODE, &Val);
    11181118        AssertRC(rc2);
    11191119
  • trunk/src/VBox/Devices/Audio/testcase/tstAudioTestService.cpp

    r90555 r90912  
    8484
    8585        Val.psz = "server";
    86         rc = AudioTestSvcHandleOption(&Srv, ATSTCPOPT_MODE, &Val);
     86        rc = AudioTestSvcHandleOption(&Srv, ATSTCPOPT_CONN_MODE, &Val);
    8787        RTTEST_CHECK_RC_OK(hTest, rc);
    8888
     
    118118
    119119                Val.psz = "client";
    120                 rc = AudioTestSvcClientHandleOption(&Client, ATSTCPOPT_MODE, &Val);
     120                rc = AudioTestSvcClientHandleOption(&Client, ATSTCPOPT_CONN_MODE, &Val);
    121121                RTTEST_CHECK_RC_OK(hTest, rc);
    122122
  • trunk/src/VBox/ValidationKit/utils/audio/vkatCommon.cpp

    r90898 r90912  
    693693    RT_ZERO(Val);
    694694
    695     int rc;
    696 
    697     if (!pTcpOpts->szBindAddr[0])
    698     {
    699         Val.psz = "client";
    700     }
    701     else if (!pTcpOpts->szConnectAddr[0])
    702     {
    703         Val.psz = "server";
    704     }
    705     else
    706         Val.psz = "both";
    707 
    708     rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_MODE, &Val);
     695    Val.u32 = pTcpOpts->enmConnMode;
     696    int rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_CONN_MODE, &Val);
    709697    AssertRCReturn(rc, rc);
    710698
    711     RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Connecting %s (connection mode '%s') ...\n", pszWhat, Val.psz);
    712 
    713     if (   !RTStrCmp(Val.psz, "client")
    714         || !RTStrCmp(Val.psz, "both"))
    715            RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Connecting to %s:%RU32\n", pTcpOpts->szConnectAddr, pTcpOpts->uConnectPort);
    716 
    717     if (   !RTStrCmp(Val.psz, "server")
    718         || !RTStrCmp(Val.psz, "both"))
    719         RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Listening at %s:%RU32\n", pTcpOpts->szBindAddr, pTcpOpts->uBindPort);
    720 
    721     if (pTcpOpts->szBindAddr[0])
    722     {
    723         Val.psz = pTcpOpts->szBindAddr;
    724         rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_BIND_ADDRESS, &Val);
    725         AssertRCReturn(rc, rc);
    726     }
    727 
    728     if (pTcpOpts->uBindPort)
    729     {
     699    if (   pTcpOpts->enmConnMode == ATSCONNMODE_BOTH
     700        || pTcpOpts->enmConnMode == ATSCONNMODE_SERVER)
     701    {
     702        Assert(pTcpOpts->uBindPort); /* Always set by the caller. */
    730703        Val.u16 = pTcpOpts->uBindPort;
    731704        rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_BIND_PORT, &Val);
    732705        AssertRCReturn(rc, rc);
    733     }
    734 
    735     if (pTcpOpts->szConnectAddr[0])
    736     {
    737         Val.psz = pTcpOpts->szConnectAddr;
    738         rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_CONNECT_ADDRESS, &Val);
    739         AssertRCReturn(rc, rc);
    740     }
    741 
    742     if (pTcpOpts->uConnectPort)
    743     {
     706
     707        if (pTcpOpts->szBindAddr[0])
     708        {
     709            Val.psz = pTcpOpts->szBindAddr;
     710            rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_BIND_ADDRESS, &Val);
     711            AssertRCReturn(rc, rc);
     712        }
     713        else
     714        {
     715            RTTestFailed(g_hTest, "No bind address specified!\n");
     716            return VERR_INVALID_PARAMETER;
     717        }
     718
     719        RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Connecting %s by listening as server at %s:%RU32 ...\n",
     720                     pszWhat, pTcpOpts->szBindAddr, pTcpOpts->uBindPort);
     721    }
     722
     723
     724    if (   pTcpOpts->enmConnMode == ATSCONNMODE_BOTH
     725        || pTcpOpts->enmConnMode == ATSCONNMODE_CLIENT)
     726    {
     727        Assert(pTcpOpts->uConnectPort); /* Always set by the caller. */
    744728        Val.u16 = pTcpOpts->uConnectPort;
    745729        rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_CONNECT_PORT, &Val);
    746730        AssertRCReturn(rc, rc);
     731
     732        if (pTcpOpts->szConnectAddr[0])
     733        {
     734            Val.psz = pTcpOpts->szConnectAddr;
     735            rc = AudioTestSvcClientHandleOption(pClient, ATSTCPOPT_CONNECT_ADDRESS, &Val);
     736            AssertRCReturn(rc, rc);
     737        }
     738        else
     739        {
     740            RTTestFailed(g_hTest, "No connect address specified!\n");
     741            return VERR_INVALID_PARAMETER;
     742        }
     743
     744        RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Connecting %s by connecting as client to %s:%RU32 ...\n",
     745                     pszWhat, pTcpOpts->szConnectAddr, pTcpOpts->uConnectPort);
    747746    }
    748747
     
    773772    RT_ZERO(Val);
    774773
    775     if (pTcpOpts->szBindAddr[0])
    776     {
    777         Val.psz = pTcpOpts->szBindAddr;
    778         AudioTestSvcHandleOption(pSrv, ATSTCPOPT_BIND_ADDRESS, &Val);
    779     }
    780 
    781     if (pTcpOpts->uBindPort)
    782     {
     774    Val.u32 = pTcpOpts->enmConnMode;
     775    AudioTestSvcHandleOption(pSrv, ATSTCPOPT_CONN_MODE, &Val);
     776
     777    if (   pTcpOpts->enmConnMode == ATSCONNMODE_BOTH
     778        || pTcpOpts->enmConnMode == ATSCONNMODE_SERVER)
     779    {
     780        Assert(pTcpOpts->uBindPort); /* Always set by the caller. */
    783781        Val.u16 = pTcpOpts->uBindPort;
    784782        AudioTestSvcHandleOption(pSrv, ATSTCPOPT_BIND_PORT, &Val);
    785     }
    786 
    787     if (pTcpOpts->szConnectAddr[0])
    788     {
    789         Val.psz = pTcpOpts->szConnectAddr;
    790         AudioTestSvcHandleOption(pSrv, ATSTCPOPT_CONNECT_ADDRESS, &Val);
    791     }
    792 
    793     if (pTcpOpts->uConnectPort)
    794     {
     783
     784        if (pTcpOpts->szBindAddr[0])
     785        {
     786            Val.psz = pTcpOpts->szBindAddr;
     787            AudioTestSvcHandleOption(pSrv, ATSTCPOPT_BIND_ADDRESS, &Val);
     788        }
     789        else
     790        {
     791            RTTestFailed(g_hTest, "No bind address specified!\n");
     792            return VERR_INVALID_PARAMETER;
     793        }
     794
     795        RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Starting server for %s at %s:%RU32 ...\n",
     796                     pszDesc, pTcpOpts->szBindAddr, pTcpOpts->uBindPort);
     797    }
     798
     799
     800    if (   pTcpOpts->enmConnMode == ATSCONNMODE_BOTH
     801        || pTcpOpts->enmConnMode == ATSCONNMODE_CLIENT)
     802    {
     803        Assert(pTcpOpts->uConnectPort); /* Always set by the caller. */
    795804        Val.u16 = pTcpOpts->uConnectPort;
    796805        AudioTestSvcHandleOption(pSrv, ATSTCPOPT_CONNECT_PORT, &Val);
    797     }
    798 
    799     RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Starting server for %s at %s:%RU32 ...\n",
    800                  pszDesc, pTcpOpts->szBindAddr[0] ? pTcpOpts->szBindAddr : "0.0.0.0", pTcpOpts->uBindPort);
    801     if (pTcpOpts->szConnectAddr[0])
    802         RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Trying %s to connect as client to %s:%RU32 ...\n",
    803                      pszDesc, pTcpOpts->szConnectAddr[0] ? pTcpOpts->szConnectAddr : "0.0.0.0", pTcpOpts->uConnectPort);
     806
     807        if (pTcpOpts->szConnectAddr[0])
     808        {
     809            Val.psz = pTcpOpts->szConnectAddr;
     810            AudioTestSvcHandleOption(pSrv, ATSTCPOPT_CONNECT_ADDRESS, &Val);
     811        }
     812        else
     813        {
     814            RTTestFailed(g_hTest, "No connect address specified!\n");
     815            return VERR_INVALID_PARAMETER;
     816        }
     817
     818        RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Starting server for %s by connecting as client to %s:%RU32 ...\n",
     819                     pszDesc, pTcpOpts->szConnectAddr, pTcpOpts->uConnectPort);
     820    }
    804821
    805822    int rc = AudioTestSvcInit(pSrv, pCallbacks);
     
    897914        && !pTstEnv->TcpOpts.szBindAddr[0])
    898915            RTStrCopy(pTstEnv->TcpOpts.szBindAddr, sizeof(pTstEnv->TcpOpts.szBindAddr), "0.0.0.0");
     916
     917    /*
     918     * Determine connection mode based on set variables.
     919     */
     920    if (   pTstEnv->TcpOpts.szBindAddr[0]
     921        && pTstEnv->TcpOpts.szConnectAddr[0])
     922    {
     923        pTstEnv->TcpOpts.enmConnMode = ATSCONNMODE_BOTH;
     924    }
     925    else if (pTstEnv->TcpOpts.szBindAddr[0])
     926        pTstEnv->TcpOpts.enmConnMode = ATSCONNMODE_SERVER;
     927    else /* "Reversed mode", i.e. used for NATed VMs. */
     928        pTstEnv->TcpOpts.enmConnMode = ATSCONNMODE_CLIENT;
    899929
    900930    /* Set a back reference to the test environment for the callback context. */
     
    923953            pTstEnv->TcpOpts.uConnectPort = ATS_TCP_DEF_CONNECT_PORT_GUEST;
    924954
    925         /**
    926          * Note: Don't set pTstEnv->TcpOpts.szTcpConnectAddr by default here, as this specifies what connection mode
    927          *       (client / server / both) we use on the guest.
    928          */
    929 
    930955        /*
    931956         * Start the ATS (Audio Test Service) on the guest side.
     
    935960         * Note that we have to bind to "0.0.0.0" by default so that the host can connect to it.
    936961         */
    937         rc = audioTestEnvConfigureAndStartTcpServer(&pTstEnv->Srv, &Callbacks, "Guest ATS", &pTstEnv->TcpOpts);
     962        rc = audioTestEnvConfigureAndStartTcpServer(&pTstEnv->Srv, &Callbacks, "guest", &pTstEnv->TcpOpts);
    938963    }
    939964    else /* Host mode */
     
    955980        if (RT_SUCCESS(rc))
    956981            rc = audioTestEnvConnectViaTcp(pTstEnv, &pTstEnv->u.Host.AtsClGuest,
    957                                            "Host -> Guest ATS", &pTstEnv->TcpOpts);
     982                                           "host -> guest", &pTstEnv->TcpOpts);
    958983        if (RT_SUCCESS(rc))
    959984        {
    960985            AUDIOTESTENVTCPOPTS ValKitTcpOpts;
    961986            RT_ZERO(ValKitTcpOpts);
     987
     988            /* We only connect as client to the Validation Kit audio driver ATS. */
     989            ValKitTcpOpts.enmConnMode = ATSCONNMODE_CLIENT;
    962990
    963991            /* For now we ASSUME that the Validation Kit audio driver ATS runs on the same host as VKAT (this binary) runs on. */
     
    968996            if (RT_SUCCESS(rc))
    969997                rc = audioTestEnvConnectViaTcp(pTstEnv, &pTstEnv->u.Host.AtsClValKit,
    970                                                "Host -> Validation Kit Host Audio Driver ATS", &ValKitTcpOpts);
     998                                               "host -> valkit", &ValKitTcpOpts);
    971999        }
    9721000    }
  • trunk/src/VBox/ValidationKit/utils/audio/vkatInternal.h

    r90894 r90912  
    182182typedef struct AUDIOTESTENVTCPOPTS
    183183{
     184    /** Connection mode(s) to use. */
     185    ATSCONNMODE     enmConnMode;
    184186    /** Bind address (server mode). When empty, "0.0.0.0" (any host) will be used. */
    185187    char            szBindAddr[128];
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