#include <stdlib.h>
#include <unistd.h>
#include "rpcclt_openapi.h"
#include "proc_util.h"
void printDiffServClassConfAppMenu()
{
printf("Usage: diffserv_class_conf_example <test#> <arg1> <arg2> ... \n");
printf("Test 1: Create the DiffServ class : diffserv_class_conf_example 1 <class-name> <class-type> <class-L3Protocol> \n");
printf("Test 2: Delete the DiffServ class : diffserv_class_conf_example 2 <class-index> \n");
printf("Test 3: Get the DiffServ class index from class name : diffserv_class_conf_example 3 <class-name>\n");
printf("Test 4: Get the DiffServ class name from class index : diffserv_class_conf_example 4 <class-index> \n");
printf("Test 5: Get the DiffServ class info : diffserv_class_conf_example 5 \n");
printf("Test 6: Create the DiffServ Class Rule : diffserv_class_conf_example 6 <class-index> <rule-type> <ruleVal1> <ruleVal2> \n");
printf("Test 7: Remove the referenced class from the specified class : diffserv_class_conf_example 7 <class-index> <class-name> \n");
printf("Test 8: Get the DiffServ class rule info : diffserv_class_conf_example 8 <class-name>\n");
printf("Test 9: Run API sanity checks: diffserv_class_conf_example 9 \n");
return;
}
{
uint32_t classIndex = 0;
char buf[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
char classNameStr[OPEN_DIFFSERV_CLASS_NAME_MAX + 1] = {0};
open_buffdesc className = {.
pstart = classNameStr, .size =
sizeof(classNameStr)};
if (!clientHandle)
{
return;
}
printf("\n");
printf("Class details: \n");
printf("---------------------------------\n");
{
memset(buf, 0, sizeof(buf));
className.
size =
sizeof(classNameStr);
memset(classNameStr, 0, sizeof(classNameStr));
printf("\n");
{
continue;
}
else
{
printf("Class Index: %d\n", classIndex);
printf("Class Name: %s\n", classNameStr);
}
{
continue;
}
memset(buf, 0, sizeof(buf));
switch (classType)
{
sprintf(buf, "%s", "All");
break;
sprintf(buf,"%s", "Any");
break;
default:
break;
}
printf("Class type: %s\n", buf);
{
continue;
}
memset(buf, 0, sizeof(buf));
switch (classL3Protocol)
{
sprintf(buf, "%s", "IPV4");
break;
sprintf(buf, "%s", "IPV6");
break;
default:
break;
}
printf("Class L3 Protocol: %s\n", buf);
}
}
char *ruleStr)
{
if (!ruleStr)
{
}
switch (openRuleType)
{
strcpy(ruleStr, "Class of Service");
break;
strcpy(ruleStr, "Secondary Class of Service");
break;
strcpy(ruleStr, "Destination IP Address");
break;
strcpy(ruleStr, "Source IP Address");
break;
strcpy(ruleStr, "Source Layer 4 Port");
break;
strcpy(ruleStr, "Destination Layer 4 Port");
break;
strcpy(ruleStr, "Source MAC Address");
break;
strcpy(ruleStr, "Destination MAC Address");
break;
strcpy(ruleStr, "VLAN ID");
break;
strcpy(ruleStr, "Secondary VLAN");
break;
strcpy(ruleStr, "Ethertype");
break;
strcpy(ruleStr, "Any");
break;
strcpy(ruleStr, "IP DSCP");
break;
strcpy(ruleStr, "IP PRECEDENCE");
break;
strcpy(ruleStr, "IP TOS");
break;
strcpy(ruleStr, "PROTOCOL");
break;
strcpy(ruleStr, "Reference Class");
break;
strcpy(ruleStr, "Destination IPV6 Address");
break;
strcpy(ruleStr, "Source IPV6 Address");
break;
strcpy(ruleStr, "Flow Label V6");
break;
default:
break;
}
return result;
}
{
uint32_t classIndex = 0, ruleCount = 0, ruleIndex = 0;
uint32_t localClassIndex = 0;
char buf[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
char val1[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
char val2[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
char tempBuf[OPEN_RULE_VAL_MAX_STRING_LENGTH * 2] = {0};
char ruleStr[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
char str[OPEN_DIFFSERV_CLASS_NAME_MAX+1] = {0};
if (!clientHandle)
{
return;
}
{
return;
}
printf("\n");
strncpy(str, className->pstart, className->size);
printf("Class Name : %s\n", str);
{
return;
}
memset(buf, 0, sizeof(buf));
switch (classType)
{
sprintf(buf, "%s", "All");
break;
sprintf(buf,"%s", "Any");
break;
default:
break;
}
printf("Class type : %s\n", buf);
printf("Match Rule Count : %d\n", ruleCount);
printf("\n");
printf("RuleIndex Match Criteria Values\n");
printf("--------- ------------------------------ -------------------------------------------");
localClassIndex = classIndex;
ruleIndex = 0;
(classIndex == localClassIndex))
{
memset(val1, 0, sizeof(val1));
valBuf1.pstart = val1;
valBuf1.size = sizeof(val1);
memset(val2, 0, sizeof(val2));
valBuf2.pstart = val2;
valBuf2.size = sizeof(val2);
{
continue;
}
{
continue;
}
memset(ruleStr, 0, sizeof(ruleStr));
classRuleTypeToStrConvert(ruleType, ruleStr);
sprintf(tempBuf, "(%s) (%s)", val1, val2);
printf("\n%-9d %-30s %-43s", ruleIndex, ruleStr, tempBuf);
}
return;
}
{
{
printf("Bad return code trying to create diffServ class. (result = %d)\n", result);
}
else
{
printf("DiffServ Class is created successfully. (result = %d)\n", result);
}
return;
}
uint32_t classIndex)
{
{
printf("Bad return code trying to delete diffServ class. (result = %d)\n", result);
}
else
{
printf("DiffServ Class is deleted successfully. (result = %d)\n", result);
}
return;
}
uint32_t *classIndex)
{
{
printf("Bad return code trying to get diffServ class index. (result = %d)\n", result);
}
else
{
printf("DiffServ Class index : %d\n", *classIndex);
}
return;
}
{
char str[OPEN_DIFFSERV_CLASS_NAME_MAX+1] = {0};
{
printf("Bad return code trying to get diffServ class index. (result = %d)\n", result);
}
else
{
strncpy(str, className->pstart, className->size);
printf("DiffServ Class name : %s\n", str);
}
return;
}
uint32_t classIndex,
{
ruleVal1, ruleVal2);
{
printf("Bad return code trying to create the class rule. (result = %d)\n", result);
}
else
{
printf("DiffServ Class rule created successfully : (result = %d)\n", result);
}
return;
}
{
{
printf("Bad return code trying to delete diffServ ref class. (result = %d)\n", result);
}
else
{
printf("DiffServ reference Class is deleted successfully. (result = %d)\n", result);
}
return;
}
{
char str[OPEN_DIFFSERV_CLASS_NAME_MAX+1];
uint32_t classIndex, ruleCount;
uint32_t classIndexNext;
uint32_t classRuleIndex = 1;
uint32_t nextClassIndex;
uint32_t nextClassRuleIndex;
char str1 [OPEN_RULE_VAL_MAX_STRING_LENGTH];
char str2 [OPEN_RULE_VAL_MAX_STRING_LENGTH];
className.pstart = str;
className.size = OPEN_DIFFSERV_CLASS_NAME_MAX;
printf("openapiDiffServClassCreate() sanity successful. \n");
classIndex = 1;
printf("openapiDiffServClassDelete() sanity successful. \n");
className.pstart = str;
className.size = OPEN_DIFFSERV_CLASS_NAME_MAX;
printf("openapiDiffServClassNameToIndex() sanity successful. \n");
classIndex = 1;
printf("openapiDiffServClassGetNext() sanity successful. \n");
className.pstart = str;
className.size = OPEN_DIFFSERV_CLASS_NAME_MAX;
classIndex = 1;
printf("openapiDiffServClassNameGet() sanity successful. \n");
printf("openapiDiffServClassTypeGet() sanity successful. \n");
printf("openapiDiffServClassL3ProtoGet() sanity successful. \n");
ruleVal1.pstart = str1;
ruleVal1.size = OPEN_RULE_VAL_MAX_STRING_LENGTH -1 ;
ruleVal2.pstart = str2;
ruleVal2.size = OPEN_RULE_VAL_MAX_STRING_LENGTH -1;
printf("openapiDiffServClassRuleCreate() sanity successful. \n");
refClassName.pstart = str;
refClassName.size = OPEN_DIFFSERV_CLASS_NAME_MAX;
printf("openapiDiffServClassRuleMatchRefClassRemove() sanity successful. \n");
printf("openapiDiffServClassRuleGetNext() sanity successful. \n");
printf("openapiDiffServClassRuleCountGet() sanity successful. \n");
printf("openapiDiffServClassRuleMatchEntryTypeGet() sanity successful. \n");
printf("openapiDiffServClassRuleMatchEntryValueGet() sanity successful. \n");
}
int main(int argc, char **argv)
{
uint32_t testNum, arg1, arg2, classIndex;
char switch_os_revision_string[100];
char str[OPEN_DIFFSERV_CLASS_NAME_MAX+1] = {0};
char str1[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
char str2[OPEN_RULE_VAL_MAX_STRING_LENGTH] = {0};
if (argc < 2)
{
printDiffServClassConfAppMenu();
exit(1);
}
testNum = atoi(argv[1]);
l7proc_crashlog_register();
{
printf("\nFailed to initialize RPC to OpEN. Exiting (result = %d)\n", result);
exit(2);
}
{
sleep(1);
}
L7PROC_LOGF(L7PROC_LOG_SEVERITY_INFO, 0, "Starting DiffServ Class Conf API example application");
printf("\n");
switch_os_revision.pstart = switch_os_revision_string;
switch_os_revision.size = sizeof(switch_os_revision_string);
printf("Network OS version = %s\n", switch_os_revision_string);
else
printf("Network OS version retrieve error\n");
printf("\n");
switch (testNum)
{
case 1:
if (argc != 5)
{
printDiffServClassConfAppMenu();
exit(1);
}
memset(str, 0, sizeof(str));
strncpy(str, argv[2], (sizeof(str) - 1));
classNameBuf.pstart = str;
classNameBuf.size = strlen(classNameBuf.pstart);
arg1 = atoi(argv[3]);
arg2 = atoi(argv[4]);
diffServClassCreate(&clientHandle, &classNameBuf, arg1, arg2);
break;
case 2:
if (argc != 3)
{
printDiffServClassConfAppMenu();
exit(1);
}
arg1 = atoi(argv[2]);
diffServClassDelete(&clientHandle, arg1);
break;
case 3:
if (argc != 3)
{
printDiffServClassConfAppMenu();
exit(1);
}
memset(str, 0, sizeof(str));
strncpy(str, argv[2], (sizeof(str) - 1));
classNameBuf.pstart = str;
classNameBuf.size = strlen(classNameBuf.pstart);
diffServClassNameToIndex(&clientHandle, &classNameBuf, &classIndex);
break;
case 4:
if (argc != 3)
{
printDiffServClassConfAppMenu();
exit(1);
}
arg1 = atoi(argv[2]);
memset(str, 0, sizeof(str));
classNameBuf.pstart = str;
classNameBuf.size = sizeof(str);
diffServClassNameGet(&clientHandle, arg1, &classNameBuf);
break;
case 5:
if (argc != 2)
{
printDiffServClassConfAppMenu();
exit(1);
}
diffServClassInfoGet(&clientHandle);
break;
case 6:
if (argc == 4)
{
arg1 = atoi(argv[2]);
{
printDiffServClassConfAppMenu();
exit(1);
}
}
if ((argc != 5) && (argc != 6))
{
printDiffServClassConfAppMenu();
exit(1);
}
arg1 = atoi(argv[2]);
arg2 = atoi(argv[3]);
memset(str1, 0, sizeof(str1));
strncpy(str1, argv[4], sizeof(str1)-1);
ruleValBuf1.pstart = str1;
ruleValBuf1.size = strlen(str1);
if (argc == 5)
{
diffServClassRuleCreate(&clientHandle, arg1, arg2, &ruleValBuf1, NULL);
}
else if (argc == 6)
{
memset(str2, 0, sizeof(str2));
strncpy(str2, argv[5], sizeof(str2)-1);
ruleValBuf2.pstart = str2;
ruleValBuf2.size = strlen(str2);
diffServClassRuleCreate(&clientHandle, arg1, arg2, &ruleValBuf1, &ruleValBuf2);
}
break;
case 7:
if (argc != 4)
{
printDiffServClassConfAppMenu();
exit(1);
}
arg1 = atoi(argv[2]);
memset(str, 0, sizeof(str));
strncpy(str, argv[3], (sizeof(str) - 1));
classNameBuf.pstart = str;
classNameBuf.size = strlen(classNameBuf.pstart);
diffServClassRuleMatchRefClassRemove(&clientHandle, arg1, &classNameBuf);
break;
case 8:
if (argc != 3)
{
printDiffServClassConfAppMenu();
exit(1);
}
memset(str, 0, sizeof(str));
strncpy(str, argv[2], (sizeof(str) - 1));
classNameBuf.pstart = str;
classNameBuf.size = strlen(classNameBuf.pstart);
diffServClassRuleInfoGet(&clientHandle, &classNameBuf);
break;
case 9:
if (argc != 2)
{
printDiffServClassConfAppMenu();
exit(1);
}
diffServClassOpENAPISanity(&clientHandle);
break;
default:
printDiffServClassConfAppMenu();
break;
}
L7PROC_LOGF(L7PROC_LOG_SEVERITY_INFO, 0, "Stopping DiffServ Class Configuration API example application");
return 0;
}