/*H*************************************************************************************/ /*! \File qos.c \Description Reference application for QosClient. \Copyright Copyright (c) Electronic Arts 2008. ALL RIGHTS RESERVED. \Version 1.0 05/25/2008 (cadam) First Version */ /*************************************************************************************H*/ /*** Include files *********************************************************************/ #include #include #include #include "DirtySDK/platform.h" #include "DirtySDK/dirtysock.h" #include "DirtySDK/proto/protoname.h" #include "DirtySDK/misc/qosclient.h" #include "libsample/zlib.h" #include "testerregistry.h" #include "testersubcmd.h" #include "testermodules.h" /*** Defines ***************************************************************************/ /*** Macros ****************************************************************************/ /*** Type Definitions ******************************************************************/ typedef struct QosAppT { QosClientRefT *pQosClient; unsigned char bZCallback; } QosAppT; /*** Function Prototypes ***************************************************************/ static void _QosCreate(void *pCmdRef, int32_t argc, char **argv, unsigned char bHelp); static void _QosDestroy(void *pCmdRef, int32_t argc, char **argv, unsigned char bHelp); static void _QosStart(void *pCmdRef, int32_t argc, char **argv, unsigned char bHelp); static void _QosControl(void *pCmdRef, int32_t argc, char **argv, unsigned char bHelp); static void _QosStatus(void *pCmdRef, int32_t argc, char **argv, unsigned char bHelp); /*** Variables *************************************************************************/ static QosAppT _Qos_App = { NULL, FALSE }; static T2SubCmdT _Qos_Commands[] = { { "create", _QosCreate }, { "destroy", _QosDestroy }, { "start", _QosStart }, { "control", _QosControl }, { "status", _QosStatus }, { "", NULL } }; /*** Private Functions *****************************************************************/ /*F********************************************************************************/ /*! \Function _CmdQosUsage \Description Display usage information. \Input argc - argument count \Input *argv[] - argument list \Output None. \Version 04/25/2008 (cadam) */ /********************************************************************************F*/ /*static void _CmdQosUsage(int argc, char *argv[]) { if (argc == 2) { ZPrintf(" listen for, request, and/or control and get the status of current requests\n"); ZPrintf(" usage: %s [create|destroy|listen|request|service|cancel|control|status|nattype]", argv[0]); } else if (argc == 3) { if (!strcmp(argv[2], "create")) { ZPrintf(" usage: %s create [serviceport]\n", argv[0]); } else if (!strcmp(argv[2], "destroy")) { ZPrintf(" usage: %s destroy\n", argv[0]); } else if (!strcmp(argv[2], "listen")) { ZPrintf(" usage: %s listen [response]\n", argv[0]); } else if (!strcmp(argv[2], "request")) { ZPrintf(" usage: %s request [address] [probes]\n", argv[0]); } else if (!strcmp(argv[2], "service")) { ZPrintf(" usage: %s service [address] [serviceid] [probes]\n", argv[0]); } else if (!strcmp(argv[2], "cancel")) { ZPrintf(" usage: %s cancel [requestid]\n", argv[0]); } else if (!strcmp(argv[2], "control")) { ZPrintf(" usage: %s control [control] [value] [pvalue]\n", argv[0]); } else if (!strcmp(argv[2], "status")) { ZPrintf(" usage: %s status [select] [data]\n", argv[0]); } else if (!strcmp(argv[2], "nattype")) { ZPrintf(" usage: %s nattype\n", argv[0]); } } } */ /*F*************************************************************************************/ /*! \Function _QosCreate \Description Qos subcommand - create qosclient reference \Input *pCmdRef \Input argc - argument count \Input *argv[] - argument list \Input bHelp - true if help request, else false \Output None. \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ static void _QosCreate(void *pCmdRef, int32_t argc, char *argv[], unsigned char bHelp) { QosAppT *pApp = &_Qos_App; if ((bHelp == TRUE) || (argc < 3)) { ZPrintf(" usage: %s create [serviceport]\n", argv[0]); return; } if (pApp->pQosClient != NULL) { ZPrintf(" %s: ref has already been created\n", argv[0]); return; } pApp->pQosClient = QosClientCreate(NULL, "", (int32_t)strtol(argv[2], NULL, 10)); } /*F*************************************************************************************/ /*! \Function _QosDestroy \Description Qos subcommand - destroy qosclient reference \Input *pCmdRef \Input argc - argument count \Input *argv[] - argument list \Input bHelp - true if help request, else false \Output None. \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ static void _QosDestroy(void *pCmdRef, int32_t argc, char *argv[], unsigned char bHelp) { QosAppT *pApp = &_Qos_App; if (bHelp == TRUE) { ZPrintf(" usage: %s destroy\n", argv[0]); return; } QosClientDestroy(pApp->pQosClient); pApp->pQosClient = NULL; } /*F*************************************************************************************/ /*! \Function _QosStart \Description Qos subcommand - issue a QoS service request \Input *pCmdRef \Input argc - argument count \Input *argv[] - argument list \Input bHelp - true if help request, else false \Output None. \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ static void _QosStart(void *pCmdRef, int32_t argc, char *argv[], unsigned char bHelp) { QosAppT *pApp = &_Qos_App; if ((bHelp == TRUE) || (argc < 5)) { ZPrintf(" usage: %s service [address] [probeport] [profile name]\n", argv[0]); return; } QosClientStart(pApp->pQosClient, argv[2], (int32_t)strtol(argv[3], NULL, 10), argv[4]); } /*F*************************************************************************************/ /*! \Function _QosControl \Description Qos subcommand - QoS control function \Input *pCmdRef \Input argc - argument count \Input *argv[] - argument list \Input bHelp - true if help request, else false \Output None. \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ static void _QosControl(void *pCmdRef, int32_t argc, char *argv[], unsigned char bHelp) { int32_t iCtrl; QosAppT *pApp = &_Qos_App; if ((bHelp == TRUE) || (argc < 5)) { ZPrintf(" usage: %s control [control] [value] [pvalue]\n", argv[0]); return; } iCtrl = argv[2][0] << 24; iCtrl |= argv[2][1] << 16; iCtrl |= argv[2][2] << 8; iCtrl |= argv[2][3]; QosClientControl(pApp->pQosClient, iCtrl, (int32_t)strtol(argv[3], NULL, 10), argv[4]); } /*F*************************************************************************************/ /*! \Function _QosStatus \Description Qos subcommand - QoS status function \Input *pCmdRef \Input argc - argument count \Input *argv[] - argument list \Input bHelp - true if help request, else false \Output None. \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ static void _QosStatus(void *pCmdRef, int32_t argc, char *argv[], unsigned char bHelp) { int32_t iSelect; QosAppT *pApp = &_Qos_App; char strBuffer[256]; if ((bHelp == TRUE) || (argc < 4)) { ZPrintf(" usage: %s status [select] [data]\n", argv[0]); return; } iSelect = argv[2][0] << 24; iSelect |= argv[2][1] << 16; iSelect |= argv[2][2] << 8; iSelect |= argv[2][3]; QosClientStatus(pApp->pQosClient, iSelect, (int32_t)strtol(argv[3], NULL, 10), &strBuffer, sizeof(strBuffer)); } /*F*************************************************************************************/ /*! \Function _CmdQosCb \Description Qos idle callback. \Input *argz - unused \Input argc - argument count \Input *argv[] - argument list \Output int32_t - zero \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ static int32_t _CmdQosCb(ZContext *argz, int32_t argc, char *argv[]) { QosAppT *pApp = &_Qos_App; // check for kill if (argc == 0) { ZPrintf("%s: killed\n", argv[0]); QosClientDestroy(pApp->pQosClient); return(0); } // update at fastest rate return(ZCallback(_CmdQosCb, 1000)); } /*** Public Functions ******************************************************************/ /*F*************************************************************************************/ /*! \Function CmdQos \Description QoS command. \Input *argz - unused \Input argc - argument count \Input *argv[] - argument list \Output int32_t - zero \Version 1.0 04/25/2008 (cadam) First Version */ /**************************************************************************************F*/ int32_t CmdQos(ZContext *argz, int32_t argc, char *argv[]) { T2SubCmdT *pCmd; QosAppT *pApp = &_Qos_App; unsigned char bHelp; // handle basic help if ((argc <= 1) || (((pCmd = T2SubCmdParse(_Qos_Commands, argc, argv, &bHelp)) == NULL))) { ZPrintf(" %s: issue a qos request, get the nat information, or get the status of or control a request\n", argv[0]); T2SubCmdUsage(argv[0], _Qos_Commands); return(0); } // if no ref yet, make one if ((pCmd->pFunc != _QosCreate) && (pApp->pQosClient == NULL)) { char *pCreate = "create 11204"; ZPrintf(" %s: ref has not been created - creating\n", argv[0]); _QosCreate(pApp, 1, &pCreate, bHelp); if (pApp->pQosClient == NULL) { ZPrintf(" %s: error creating module\n", argv[0]); return(0); } } // hand off to command pCmd->pFunc(pApp, argc, argv, bHelp); // one-time install of periodic callback if (pApp->bZCallback == FALSE) { pApp->bZCallback = TRUE; return(ZCallback(_CmdQosCb, 1000)); } else { return(0); } }