#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "rpcclt_openapi.h"
#include "proc_util.h"
#define VID_LIST_BUFSIZE_MAX (4096 * 5)
static char *exampleName = "pvlan_example";
static void printAppMenu(void)
{
printf("Usage: %s <test#> <interface> <arg1> <arg2> ... \n\n", exampleName);
printf("Test 1: Get PVLAN Interface Mode: %s 1 <interface> \n", exampleName);
printf("Test 2: Get PVLAN Interface Host Association: %s 2 <interface> \n", exampleName);
printf("Test 3: Get PVLAN Interface Promiscuous Association: %s 3 <interface> \n", exampleName);
printf("Test 4: Get PVLAN Interface Operational VLANs: %s 4 <interface> \n", exampleName);
printf("Test 5: List all PVLAN Interface Promiscuous Trunk Associations: %s 5 <interface> \n", exampleName);
printf("Test 6: List all PVLAN Interface Isolated Trunk Associations: %s 6 <interface> \n", exampleName);
printf("Test 7: Get PVLAN Interface Trunk Native VLAN: %s 7 <interface> \n", exampleName);
printf("Test 8: Get PVLAN Interface Trunk Normal VLANs: %s 8 <interface> \n", exampleName);
printf("Test 9: Test PVLAN OpEN APIs sanity: %s 9 <interface> \n", exampleName);
printf("\nNote: For best results, please configure private VLANs in the switch prior to running this example.\n");
return;
}
static OPEN_BOOL_t verifyArgCount(
int argc,
int expected)
{
if (argc != expected)
{
printAppMenu();
}
return result;
}
{
static char buf[128];
char *pstr;
buf[0] = '\0';
switch (openMode)
{
case OPEN_DOT1Q_SWPORT_MODE_NONE:
pstr = "None";
break;
pstr = "General";
break;
pstr = "Access";
break;
pstr = "Trunk";
break;
pstr = "Private Host";
break;
pstr = "Private Promiscuous";
break;
pstr = "Private Promiscuous Trunk";
break;
pstr = "Private Isolated Trunk";
break;
default:
pstr = "Unknown";
break;
}
snprintf(buf, sizeof(buf), "%s", pstr);
return buf;
}
{
static char buf[VID_LIST_BUFSIZE_MAX];
uint32_t i, n;
buf[0] = '\0';
{
snprintf(buf, sizeof(buf), "None");
}
else
{
n = snprintf(buf,
sizeof(buf),
"%d", vidList->
ids[0]);
{
n += snprintf(buf + n,
sizeof(buf) - n,
",%d", vidList->
ids[i]);
}
}
return buf;
}
{
{
{
printf("Not a PVLAN interface. (result = %d)\n", result);
}
else
{
printf("Bad return code trying to get PVLAN Interface Mode. (result = %d)\n", result);
}
}
else
{
printf("PVLAN Interface Mode for interface %u: %u (%s)\n", ifNum, mode, printableSwitchportMode(mode));
}
}
{
uint32_t pri, sec;
{
printf("Bad return code trying to get PVLAN Interface Host Association. (result = %d)\n", result);
}
else
{
printf("PVLAN Interface Host Association for interface %u: primary=%u secondary=%u\n", ifNum, pri, sec);
}
}
{
uint32_t pri;
{
printf("Bad return code trying to get PVLAN Interface Promiscuous Association. (result = %d)\n", result);
}
else
{
printf("PVLAN Interface Promiscuous Association for interface %u: primary=%u secondaries=%s\n", ifNum, pri, printableVidList(&vidList));
}
}
{
{
printf("Bad return code trying to get PVLAN Interface Operational VLANs. (result = %d)\n", result);
}
else
{
printf("PVLAN Interface Operational VLANs for interface %u: %s\n", ifNum, printableVidList(&vidList));
}
}
{
uint32_t pri;
memset(&vidList, 0, sizeof(vidList));
pri = 0;
{
{
printf("PVLAN Interface Promiscuous Trunk Association for interface %u:\n", ifNum);
}
printf("\tprimary=%u secondaries=%s\n", pri, printableVidList(&vidList));
}
{
printf("Bad return code trying to get PVLAN Interface Promiscuous Trunk Association. (result = %d)\n", result);
}
{
printf("PVLAN Interface Promiscuous Trunk Association for interface %u: None\n", ifNum);
}
}
{
uint32_t pri, sec;
pri = 0;
{
{
printf("PVLAN Interface Isolated Trunk Association for interface %u:\n", ifNum);
}
printf("\tprimary=%u secondary=%u\n", pri, sec);
}
{
printf("Bad return code trying to get PVLAN Interface Isolated Trunk Association. (result = %d)\n", result);
}
{
printf("PVLAN Interface Isolated Trunk Associations for interface %u: None\n", ifNum);
}
}
{
uint32_t vid;
{
printf("Bad return code trying to get PVLAN Interface Trunk Native VLAN. (result = %d)\n", result);
}
else
{
printf("PVLAN Interface Trunk Native VLAN for interface %u: %u\n", ifNum, vid);
}
}
{
{
printf("Bad return code trying to get PVLAN Interface Trunk Normal VLANs allowed. (result = %d)\n", result);
}
else
{
printf("PVLAN Interface Trunk Normal VLANs allowed for interface %u: %s\n", ifNum, printableVidList(&vidList));
}
}
{
#define BAD_IFNUM 9999
#define BAD_VLANID 4097
uint32_t pri, sec, nextPri;
uint32_t vid;
printf("Testing Private VLAN OpEN APIs sanity:\n\n");
printf("Testing openapiPvlanIntfModeGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("NULL Mode Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfModeGet() sanity successful\n\n");
printf("Testing openapiPvlanIntfHostAssocGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("NULL Primary VLAN Ptr:(result = %d)\n", result);
printf("NULL Secondary VLAN Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfHostAssocGet() sanity successful\n\n");
printf("Testing openapiPvlanIntfPromiscAssocGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("NULL Primary VLAN Ptr:(result = %d)\n", result);
printf("NULL Secondary VLAN List Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfPromiscAssocGet() sanity successful\n\n");
printf("Testing openapiPvlanIntfOperAssocGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("NULL Operational VLAN List Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfOperAssocGet() sanity successful\n\n");
pri = 100;
printf("Testing openapiPvlanIntfPromiscTrunkAssocNextGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("Invalid Primary VLAN Input Value:(result = %d)\n", result);
printf("NULL Primary VLAN Output Ptr:(result = %d)\n", result);
printf("NULL Secondary VLAN List Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfPromiscTrunkAssocNextGet() sanity successful\n\n");
pri = 100;
printf("Testing openapiPvlanIntfIsolatedTrunkAssocNextGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("Invalid Primary VLAN Input Value:(result = %d)\n", result);
printf("NULL Primary VLAN Output Ptr:(result = %d)\n", result);
printf("NULL Secondary VLAN Output Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfIsolatedTrunkAssocNextGet() sanity successful\n\n");
printf("Testing openapiPvlanIntfTrunkNativeVlanGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("NULL VLAN ID Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfTrunkNativeVlanGet() sanity successful\n\n");
printf("Testing openapiPvlanIntfTrunkAllowedVlanListGet():\n");
printf("NULL Client Handle:(result = %d)\n", result);
printf("Invalid Interface Number:(result = %d)\n", result);
printf("NULL VLAN List Ptr:(result = %d)\n", result);
printf("openapiPvlanIntfTrunkAllowedVlanListGet() sanity successful\n\n");
return;
}
int main(int argc, char **argv)
{
uint32_t testNum, ifNum;
char switch_os_revision_string[100];
if (argc < 3)
{
printAppMenu();
exit(1);
}
testNum = atoi(argv[1]);
ifNum = atoi(argv[2]);
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 Private VLAN 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 (verifyArgCount(argc, 3))
{
pvlanIntfModeGet(&clientHandle, ifNum);
}
break;
case 2:
if (verifyArgCount(argc, 3))
{
pvlanIntfHostAssocGet(&clientHandle, ifNum);
}
break;
case 3:
if (verifyArgCount(argc, 3))
{
pvlanIntfPromiscAssocGet(&clientHandle, ifNum);
}
break;
case 4:
if (verifyArgCount(argc, 3))
{
pvlanIntfOperAssocGet(&clientHandle, ifNum);
}
break;
case 5:
if (verifyArgCount(argc, 3))
{
pvlanIntfPromiscTrunkAssocList(&clientHandle, ifNum);
}
break;
case 6:
if (verifyArgCount(argc, 3))
{
pvlanIntfIsolatedTrunkAssocList(&clientHandle, ifNum);
}
break;
case 7:
if (verifyArgCount(argc, 3))
{
pvlanIntfTrunkNativeVlanGet(&clientHandle, ifNum);
}
break;
case 8:
if (verifyArgCount(argc, 3))
{
pvlanIntfTrunkNormalVlanList(&clientHandle, ifNum);
}
break;
case 9:
if (verifyArgCount(argc, 3))
{
pvlanOpENAPIsTestSanity(&clientHandle, ifNum);
}
break;
default:
printAppMenu();
break;
}
L7PROC_LOGF(L7PROC_LOG_SEVERITY_INFO, 0, "Stopping Private VLAN API example application");
return 0;
}