VirtualBox

Changeset 21523 in vbox for trunk/src


Ignore:
Timestamp:
Jul 13, 2009 8:54:34 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
49976
Message:

crOpenGL: add protocol version check(4108), add max connected clients check

Location:
trunk/src/VBox
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h

    r18336 r21523  
    227227     */
    228228    uint8_t  allow_redir_ptr;
     229
     230    uint32_t vMajor, vMinor; /*Protocol version*/
    229231};
    230232
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_protocol.h

    r15532 r21523  
    1313extern "C" {
    1414#endif
     15
     16/*For now guest is allowed to connect host opengl service if protocol version matches exactly*/
     17/*Note: that after any change to this file, or glapi_parser\apispec.txt version should be changed*/
     18#define CR_PROTOCOL_VERSION_MAJOR 1
     19#define CR_PROTOCOL_VERSION_MINOR 1
    1520
    1621typedef enum {
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h

    r15532 r21523  
    213213extern DECLEXPORT(GLboolean) crVBoxServerInit(void);
    214214extern DECLEXPORT(void) crVBoxServerTearDown(void);
    215 extern DECLEXPORT(void) crVBoxServerAddClient(uint32_t u32ClientID);
     215extern DECLEXPORT(int32_t) crVBoxServerAddClient(uint32_t u32ClientID);
    216216extern DECLEXPORT(void) crVBoxServerRemoveClient(uint32_t u32ClientID);
    217 extern DECLEXPORT(void) crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer);
     217extern DECLEXPORT(int32_t) crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer);
    218218extern DECLEXPORT(int32_t) crVBoxServerClientRead(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t *pcbBuffer);
     219extern DECLEXPORT(int32_t) crVBoxServerClientSetVersion(uint32_t u32ClientID, uint32_t vMajor, uint32_t vMinor);
    219220
    220221extern DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM);
  • trunk/src/VBox/GuestHost/OpenGL/util/net.c

    r15759 r21523  
    278278            crFreeMutex( &conn->messageList.lock );
    279279        #endif
     280        conn->Disconnect(conn);
    280281        crFree( conn );
    281282        return NULL;
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r21227 r21523  
    669669    CRASSERT(FALSE);
    670670#endif
     671}
     672
     673static int crVBoxHGCMSetVersion(CRConnection *conn, unsigned int vMajor, unsigned int vMinor)
     674{
     675    CRVBOXHGCMSETVERSION parms;
     676    int rc;
     677
     678    parms.hdr.result      = VINF_SUCCESS;
     679    parms.hdr.u32ClientID = conn->u32ClientID;
     680    parms.hdr.u32Function = SHCRGL_GUEST_FN_SET_VERSION;
     681    parms.hdr.cParms      = SHCRGL_CPARMS_SET_VERSION;
     682
     683    parms.vMajor.type      = VMMDevHGCMParmType_32bit;
     684    parms.vMajor.u.value32 = CR_PROTOCOL_VERSION_MAJOR;
     685    parms.vMinor.type      = VMMDevHGCMParmType_32bit;
     686    parms.vMinor.u.value32 = CR_PROTOCOL_VERSION_MINOR;
     687
     688    rc = crVBoxHGCMCall(&parms, sizeof(parms));
     689
     690    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
     691    {
     692        crWarning("Host doesn't accept our version %d.%d. Make sure you have appropriate additions installed!",
     693                  parms.vMajor.u.value32, parms.vMinor.u.value32);
     694        return FALSE;
     695    }
     696
     697    conn->vMajor = CR_PROTOCOL_VERSION_MAJOR;
     698    conn->vMinor = CR_PROTOCOL_VERSION_MINOR;
     699
     700    return TRUE;
    671701}
    672702
     
    744774            conn->u32ClientID = info.u32ClientID;
    745775            crDebug("HGCM connect was successful: client id =0x%x\n", conn->u32ClientID);
     776
     777            return crVBoxHGCMSetVersion(conn, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR);
    746778        }
    747779        else
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r18637 r21523  
    131131    g_pFrameBuffer->COMGETTER(WinId)(&g_winId);
    132132    renderspuSetWindowId((uint32_t)g_winId);
    133     crVBoxServerAddClient(u32ClientID);
     133    rc = crVBoxServerAddClient(u32ClientID);
    134134#endif
    135135
     
    222222}
    223223
     224static void svcClientVersionUnsupported(uint32_t minor, uint32_t major)
     225{
     226    LogRel(("SHARED_CROPENGL: unsupported client version %d.%d\n", minor, major));
     227    /*todo add warning window*/
     228}
     229
    224230static DECLCALLBACK(void) svcCall (void *, VBOXHGCMCALLHANDLE callHandle, uint32_t u32ClientID, void *pvClient, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    225231{
     
    264270
    265271                /* Execute the function. */
    266                 crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer);
     272                rc = crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer);
     273                if (!RT_SUCCESS(rc))
     274                {
     275                    Assert(VERR_NOT_SUPPORTED==rc);
     276                    svcClientVersionUnsupported(0, 0);
     277                }
     278
    267279            }
    268280            break;
     
    297309                /* Update parameters.*/
    298310                paParms[0].u.pointer.size = cbBuffer; //@todo guest doesn't see this change somehow?
     311            } else if (VERR_NOT_SUPPORTED==rc)
     312            {
     313                svcClientVersionUnsupported(0, 0);
    299314            }
    300315
     
    332347
    333348                /* Execute the function. */
    334                 crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer);
     349                rc = crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer);
     350                if (!RT_SUCCESS(rc))
     351                {
     352                    Assert(VERR_NOT_SUPPORTED==rc);
     353                    svcClientVersionUnsupported(0, 0);
     354                }
     355
    335356                rc = crVBoxServerClientRead(u32ClientID, pWriteback, &cbWriteback);
    336357
     
    343364                paParms[2].u.uint32 = cbWriteback;
    344365            }
     366            break;
     367        }
     368
     369        case SHCRGL_GUEST_FN_SET_VERSION:
     370        {
     371            Log(("svcCall: SHCRGL_GUEST_FN_SET_VERSION\n"));
     372
     373            /* Verify parameter count and types. */
     374            if (cParms != SHCRGL_CPARMS_SET_VERSION)
     375            {
     376                rc = VERR_INVALID_PARAMETER;
     377            }
     378            else
     379            if (    paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT     /* vMajor */
     380                 || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT     /* vMinor */
     381               )
     382            {
     383                rc = VERR_INVALID_PARAMETER;
     384            }
     385            else
     386            {
     387                /* Fetch parameters. */
     388                uint32_t vMajor    = paParms[0].u.uint32;
     389                uint32_t vMinor    = paParms[1].u.uint32;
     390
     391                /* Execute the function. */
     392                rc = crVBoxServerClientSetVersion(u32ClientID, vMajor, vMinor);
     393
     394                if (!RT_SUCCESS(rc))
     395                {
     396                    /*@todo, add warning window*/
     397                    svcClientVersionUnsupported(vMajor, vMinor);
     398                }
     399            }
     400
    345401            break;
    346402        }
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r21028 r21523  
    319319}
    320320
    321 void crVBoxServerAddClient(uint32_t u32ClientID)
    322 {
    323     CRClient *newClient = (CRClient *) crCalloc(sizeof(CRClient));
    324    
     321int32_t crVBoxServerAddClient(uint32_t u32ClientID)
     322{
     323    CRClient *newClient;
     324
     325    if (cr_server.numClients>=CR_MAX_CLIENTS)
     326    {
     327        return VERR_MAX_THRDS_REACHED;
     328    }
     329
     330    newClient = (CRClient *) crCalloc(sizeof(CRClient));   
    325331    crDebug("crServer: AddClient u32ClientID=%d", u32ClientID);
    326332
     
    336342
    337343    crServerAddToRunQueue(newClient);
     344
     345    return VINF_SUCCESS;
    338346}
    339347
     
    363371}
    364372
    365 void crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer)
     373int32_t crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer)
    366374{
    367375    CRClient *pClient;
     
    380388    pClient = cr_server.clients[i];
    381389    CRASSERT(pClient);
     390
     391    if (!pClient->conn->vMajor) return VERR_NOT_SUPPORTED;
    382392
    383393    CRASSERT(pBuffer);
     
    436446
    437447    CRASSERT(!pClient->conn->allow_redir_ptr || crNetNumMessages(pClient->conn)==0);
     448
     449    return VINF_SUCCESS;
    438450}
    439451
     
    456468    CRASSERT(pClient);
    457469
     470    if (!pClient->conn->vMajor) return VERR_NOT_SUPPORTED;
     471
    458472    if (pClient->conn->cbHostBuffer > *pcbBuffer)
    459473    {
     
    478492   
    479493    return VINF_SUCCESS;
     494}
     495
     496int32_t crVBoxServerClientSetVersion(uint32_t u32ClientID, uint32_t vMajor, uint32_t vMinor)
     497{
     498    CRClient *pClient;
     499    int32_t i;
     500
     501    for (i = 0; i < cr_server.numClients; i++)
     502    {
     503        if (cr_server.clients[i] && cr_server.clients[i]->conn
     504            && cr_server.clients[i]->conn->u32ClientID==u32ClientID)
     505        {
     506            break;
     507        }
     508    }
     509    pClient = cr_server.clients[i];
     510    CRASSERT(pClient);
     511
     512    pClient->conn->vMajor = vMajor;
     513    pClient->conn->vMinor = vMinor;
     514
     515    if (vMajor != CR_PROTOCOL_VERSION_MAJOR
     516        || vMinor != CR_PROTOCOL_VERSION_MINOR)
     517    {
     518        return VERR_NOT_SUPPORTED;
     519    }
     520    else return VINF_SUCCESS;
    480521}
    481522
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