Skip to content

Commit

Permalink
[nes]: ETHERNET + BRIDGE changes ...
Browse files Browse the repository at this point in the history
  • Loading branch information
nes-repo committed Dec 4, 2014
1 parent ae0c2d3 commit 9c04c2f
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 11 deletions.
122 changes: 121 additions & 1 deletion bridge/bridgeUtils.c
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,8 @@ ieee8021PbbVipRowStatus_update (

ieee8021PbbVipRowStatus_update_newISid:

if (poEntry->u32ISid == 0)
if (poEntry->u32ISid == 0 ||
ieee8021PbbVipTable_ISid_getByIndex (poEntry->u32ChassisId, poEntry->u32ISid) != NULL)
{
goto ieee8021PbbVipRowStatus_update_cleanup;
}
Expand Down Expand Up @@ -740,6 +741,125 @@ ieee8021PbbVipToPipMappingRowStatus_update (
return bRetCode;
}

bool
ieee8021PbbCbpServiceMappingRowStatus_update (
ieee8021PbbCbpEntry_t *poCbpPort,
ieee8021PbbCbpServiceMappingEntry_t *poEntry, uint8_t u8RowStatus)
{
register bool bRetCode = false;
register ieee8021BridgeBasePortEntry_t *poIeee8021BridgeBasePortEntry = NULL;

if ((poIeee8021BridgeBasePortEntry = ieee8021BridgeBasePortTable_getByIndex (poEntry->u32BridgeBasePortComponentId, poEntry->u32BridgeBasePort)) == NULL)
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_cleanup;
}


switch (u8RowStatus)
{
case xRowStatus_active_c:
goto ieee8021PbbCbpServiceMappingRowStatus_update_updateLocal;

case xRowStatus_notInService_c:
case xRowStatus_destroy_c:
if (poEntry->pOldEntry == NULL)
{
if ((poEntry->pOldEntry = xBuffer_alloc (sizeof (*poEntry->pOldEntry))) == NULL)
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_cleanup;
}
memcpy (poEntry->pOldEntry, poEntry, sizeof (*poEntry->pOldEntry));
}

if (u8RowStatus == xRowStatus_destroy_c)
{
poEntry->u32LocalSid = 0;
goto ieee8021PbbCbpServiceMappingRowStatus_update_updateLocal;
}
else
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_success;
}
break;
}


ieee8021PbbCbpServiceMappingRowStatus_update_updateLocal:


if (poCbpPort->bExternal ||
(poEntry->pOldEntry != NULL && poEntry->pOldEntry->u32LocalSid == poEntry->u32LocalSid))
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_sidDone;
}

if (poEntry->pOldEntry == NULL || poEntry->pOldEntry->u32LocalSid == 0)
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_newSid;
}

{
register ieee8021PbbVipEntry_t *poIeee8021PbbVipEntry = NULL;

if ((poIeee8021PbbVipEntry = ieee8021PbbVipTable_ISid_getByIndex (poCbpPort->u32ChassisId, poEntry->pOldEntry->u32LocalSid)) != NULL)
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_cleanup;
}

if (!ifStackTable_removeRegister (poIeee8021PbbVipEntry->u32PipIfIndex, poIeee8021BridgeBasePortEntry->u32IfIndex))
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_cleanup;
}

poEntry->pOldEntry->u32LocalSid = 0;
}

ieee8021PbbCbpServiceMappingRowStatus_update_newSid:

if (poEntry->u32LocalSid == 0)
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_sidDone;
}

{
register ieee8021PbbVipEntry_t *poIeee8021PbbVipEntry = NULL;

if ((poIeee8021PbbVipEntry = ieee8021PbbVipTable_ISid_getByIndex (poCbpPort->u32ChassisId, poEntry->u32LocalSid)) != NULL)
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_cleanup;
}

if (!ifStackTable_createRegister (poIeee8021PbbVipEntry->u32PipIfIndex, poIeee8021BridgeBasePortEntry->u32IfIndex))
{
goto ieee8021PbbCbpServiceMappingRowStatus_update_cleanup;
}
}

ieee8021PbbCbpServiceMappingRowStatus_update_sidDone:

/* TODO */

ieee8021PbbCbpServiceMappingRowStatus_update_success:

switch (u8RowStatus)
{
case xRowStatus_active_c:
case xRowStatus_destroy_c:
if (poEntry->pOldEntry != NULL)
{
xBuffer_free (poEntry->pOldEntry);
poEntry->pOldEntry = NULL;
}
break;
}

bRetCode = true;

ieee8021PbbCbpServiceMappingRowStatus_update_cleanup:

return bRetCode;
}

bool
ieee8021PbbCbpRowStatus_update (
ieee8021BridgeBaseEntry_t *poComponent,
Expand Down
4 changes: 4 additions & 0 deletions bridge/bridgeUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ bool
bool
ieee8021PbbVipToPipMappingRowStatus_update (
ieee8021PbbVipToPipMappingEntry_t *poEntry, uint8_t u8RowStatus);
bool
ieee8021PbbCbpServiceMappingRowStatus_update (
ieee8021PbbCbpEntry_t *poCbpPort,
ieee8021PbbCbpServiceMappingEntry_t *poEntry, uint8_t u8RowStatus);
bool
ieee8021PbbCbpRowStatus_update (
ieee8021BridgeBaseEntry_t *poComponent,
Expand Down
96 changes: 94 additions & 2 deletions bridge/ieee8021PbbMib.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@ ieee8021PbbVipTable_removeEntry (ieee8021PbbVipEntry_t *poEntry)
}

xBTree_nodeRemove (&poEntry->oBTreeNode, &oIeee8021PbbVipTable_BTree);
xBTree_nodeRemove (&poEntry->oISid_BTreeNode, &oIeee8021PbbVipTable_ISid_BTree);
xBuffer_free (poEntry); /* XXX - release any other internal resources */
return;
}
Expand Down Expand Up @@ -486,11 +487,14 @@ ieee8021PbbVipTable_createHier (
register ieee8021BridgeBaseEntry_t *poIeee8021BridgeBaseEntry = NULL;

if ((poIeee8021BridgeBaseEntry = ieee8021BridgeBaseTable_getByIndex (poEntry->u32BridgeBasePortComponentId)) == NULL ||
(poIeee8021BridgeBaseEntry->u8RowStatus == xRowStatus_active_c && poIeee8021BridgeBaseEntry->i32ComponentType != ieee8021BridgeBaseComponentType_iComponent_c))
(poIeee8021BridgeBaseEntry->u8RowStatus == xRowStatus_active_c && poIeee8021BridgeBaseEntry->i32ComponentType != ieee8021BridgeBaseComponentType_iComponent_c) ||
poIeee8021BridgeBaseEntry->u32ChassisId == 0)
{
goto ieee8021PbbVipTable_createHier_cleanup;
}

poEntry->u32ChassisId = poIeee8021BridgeBaseEntry->u32ChassisId;

register ieee8021BridgeBasePortEntry_t *poIeee8021BridgeBasePortEntry = NULL;

if ((poIeee8021BridgeBasePortEntry = ieee8021BridgeBasePortTable_getByIndex (poEntry->u32BridgeBasePortComponentId, poEntry->u32BridgeBasePort)) == NULL &&
Expand Down Expand Up @@ -1608,6 +1612,7 @@ ieee8021PbbPipTable_createHier (
}

poEntry->bExternal = poPipPhyData->u32PhyPort != 0;
poEntry->u32ChassisId = poPipPhyData->u32ChassisId;
xBitmap_setBitRev (poPipPhyData->au8TypeCapabilities, ieee8021BridgeBasePortTypeCapabilities_providerInstancePort_c, 1);

bRetCode = true;
Expand Down Expand Up @@ -4120,6 +4125,90 @@ ieee8021PbbCbpServiceMappingTable_removeHier (
return true;
}

bool
ieee8021PbbCbpServiceMappingRowStatus_handler (
ieee8021PbbCbpServiceMappingEntry_t *poEntry, uint8_t u8RowStatus)
{
register bool bRetCode = false;
register uint8_t u8RealStatus = u8RowStatus & xRowStatus_mask_c;
register ieee8021PbbCbpEntry_t *poIeee8021PbbCbpEntry = NULL;

if ((poIeee8021PbbCbpEntry = ieee8021PbbCbpTable_getByIndex (poEntry->u32BridgeBasePortComponentId, poEntry->u32BridgeBasePort)) == NULL)
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup;
}

if (poEntry->u8RowStatus == u8RealStatus)
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_success;
}
if (u8RowStatus & xRowStatus_fromParent_c &&
((u8RealStatus == xRowStatus_active_c && poEntry->u8RowStatus != xRowStatus_notReady_c) ||
(u8RealStatus == xRowStatus_notInService_c && poEntry->u8RowStatus != xRowStatus_active_c)))
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_success;
}


switch (u8RealStatus)
{
case xRowStatus_active_c:
if (poEntry->u32BVid == 0 || poEntry->u32LocalSid == 0 ||
xBitmap_checkBitRange (poEntry->au8DefaultBackboneDest, 0, xBitmap_bitLength (poEntry->u16DefaultBackboneDest_len) - 1, 1) == xBitmap_index_invalid_c ||
xBitmap_checkBitRange (poEntry->au8Type, 0, xBitmap_bitLength (poEntry->u16Type_len) - 1, 1) == xBitmap_index_invalid_c)
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup;
}

if (!(u8RowStatus & xRowStatus_fromParent_c) && poIeee8021PbbCbpEntry->u8RowStatus != xRowStatus_active_c)
{
u8RealStatus = xRowStatus_notReady_c;
}

if (!ieee8021PbbCbpServiceMappingRowStatus_update (poIeee8021PbbCbpEntry, poEntry, u8RealStatus))
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup;
}

poEntry->u8RowStatus = u8RealStatus;
break;

case xRowStatus_notInService_c:
if (!ieee8021PbbCbpServiceMappingRowStatus_update (poIeee8021PbbCbpEntry, poEntry, u8RealStatus))
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup;
}

poEntry->u8RowStatus =
poEntry->u8RowStatus == xRowStatus_active_c && (u8RowStatus & xRowStatus_fromParent_c) ? xRowStatus_notReady_c: xRowStatus_notInService_c;
break;

case xRowStatus_createAndGo_c:
goto ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup;

case xRowStatus_createAndWait_c:
poEntry->u8RowStatus = xRowStatus_notInService_c;
break;

case xRowStatus_destroy_c:
if (!ieee8021PbbCbpServiceMappingRowStatus_update (poIeee8021PbbCbpEntry, poEntry, u8RealStatus))
{
goto ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup;
}

poEntry->u8RowStatus = xRowStatus_notInService_c;
break;
}

ieee8021PbbCbpServiceMappingRowStatus_handler_success:

bRetCode = true;

ieee8021PbbCbpServiceMappingRowStatus_handler_cleanup:

return bRetCode || (u8RowStatus & xRowStatus_fromParent_c);
}

/* example iterator hook routines - using 'getNext' to do most of the work */
netsnmp_variable_list *
ieee8021PbbCbpServiceMappingTable_getFirst (
Expand Down Expand Up @@ -4734,11 +4823,14 @@ ieee8021PbbCbpTable_createHier (
register ieee8021BridgeBaseEntry_t *poIeee8021BridgeBaseEntry = NULL;

if ((poIeee8021BridgeBaseEntry = ieee8021BridgeBaseTable_getByIndex (poEntry->u32BridgeBasePortComponentId)) == NULL ||
(poIeee8021BridgeBaseEntry->u8RowStatus == xRowStatus_active_c && poIeee8021BridgeBaseEntry->i32ComponentType != ieee8021BridgeBaseComponentType_bComponent_c))
(poIeee8021BridgeBaseEntry->u8RowStatus == xRowStatus_active_c && poIeee8021BridgeBaseEntry->i32ComponentType != ieee8021BridgeBaseComponentType_bComponent_c) ||
poIeee8021BridgeBaseEntry->u32ChassisId == 0)
{
goto ieee8021PbbCbpTable_createHier_cleanup;
}

poEntry->u32ChassisId = poIeee8021BridgeBaseEntry->u32ChassisId;

register ieee8021BridgeBasePortEntry_t *poIeee8021BridgeBasePortEntry = NULL;

if ((poIeee8021BridgeBasePortEntry = ieee8021BridgeBasePortTable_getByIndex (poEntry->u32BridgeBasePortComponentId, poEntry->u32BridgeBasePort)) == NULL &&
Expand Down
6 changes: 6 additions & 0 deletions bridge/ieee8021PbbMib.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ typedef struct ieee8021PbbPipEntry_t
uint8_t u8RowStatus;

bool bExternal;
uint32_t u32ChassisId;

xBTree_Node_t oBTreeNode;
xBTree_Node_t oComp_BTreeNode;
Expand Down Expand Up @@ -579,6 +580,8 @@ typedef struct ieee8021PbbCbpServiceMappingEntry_t
uint32_t u32LocalSid;
uint8_t u8RowStatus;

struct ieee8021PbbCbpServiceMappingEntry_t *pOldEntry;

xBTree_Node_t oBTreeNode;
} ieee8021PbbCbpServiceMappingEntry_t;

Expand Down Expand Up @@ -606,6 +609,8 @@ ieee8021PbbCbpServiceMappingEntry_t * ieee8021PbbCbpServiceMappingTable_createEx
bool ieee8021PbbCbpServiceMappingTable_removeExt (ieee8021PbbCbpServiceMappingEntry_t *poEntry);
bool ieee8021PbbCbpServiceMappingTable_createHier (ieee8021PbbCbpServiceMappingEntry_t *poEntry);
bool ieee8021PbbCbpServiceMappingTable_removeHier (ieee8021PbbCbpServiceMappingEntry_t *poEntry);
bool ieee8021PbbCbpServiceMappingRowStatus_handler (
ieee8021PbbCbpServiceMappingEntry_t *poEntry, uint8_t u8RowStatus);
#ifdef SNMP_SRC
Netsnmp_First_Data_Point ieee8021PbbCbpServiceMappingTable_getFirst;
Netsnmp_Next_Data_Point ieee8021PbbCbpServiceMappingTable_getNext;
Expand Down Expand Up @@ -641,6 +646,7 @@ typedef struct ieee8021PbbCbpEntry_t
uint8_t u8RowStatus;

bool bExternal;
uint32_t u32ChassisId;

xBTree_Node_t oBTreeNode;
} ieee8021PbbCbpEntry_t;
Expand Down
19 changes: 11 additions & 8 deletions ethernet/ieee8021BridgeMib.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ typedef struct ieee8021BridgeBaseEntry_t
int32_t i32MmrpEnabledStatus;
uint8_t u8RowStatus;

uint32_t u32ChassisId;
uint8_t au8Ports[ETHERNET_PORT_MAP_SIZE];
size_t u16Ports_len; /* # of uint8_t elements */
uint32_t u32TpIfIndex;
Expand Down Expand Up @@ -213,6 +214,7 @@ enum
ieee8021BridgeBasePortTypeCapabilities_stationFacingBridgePort_c = 8,
ieee8021BridgeBasePortTypeCapabilities_uplinkAccessPort_c = 9,
ieee8021BridgeBasePortTypeCapabilities_uplinkRelayPort_c = 10,
ieee8021BridgeBasePortTypeCapabilities_providerEdgePort_c = 11,
ieee8021BridgeBasePortTypeCapabilities_providerInstancePort_c = 12,

/* enums for column ieee8021BridgeBasePortType */
Expand All @@ -228,7 +230,7 @@ enum
ieee8021BridgeBasePortType_stationFacingBridgePort_c = 10,
ieee8021BridgeBasePortType_uplinkAccessPort_c = 11,
ieee8021BridgeBasePortType_uplinkRelayPort_c = 12,
ieee8021BridgeBasePortType_providerEdgePort_c = 101,
ieee8021BridgeBasePortType_providerEdgePort_c = 13,
ieee8021BridgeBasePortType_providerInstancePort_c = 14,

/* enums for column ieee8021BridgeBasePortExternal */
Expand Down Expand Up @@ -288,22 +290,22 @@ ieee8021BridgeBasePortEntry_t * ieee8021BridgeBasePortTable_getNextIndex (
uint32_t u32Port);
void ieee8021BridgeBasePortTable_removeEntry (ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortTable_allocateIndex (
ieee8021BridgeBaseEntry_t *pComponent,
ieee8021BridgeBaseEntry_t *poComponent,
uint32_t *pu32Port);
bool ieee8021BridgeBasePortTable_removeIndex (
ieee8021BridgeBaseEntry_t *pComponent,
ieee8021BridgeBaseEntry_t *poComponent,
uint32_t u32Port);
ieee8021BridgeBasePortEntry_t *ieee8021BridgeBasePortTable_createExt (
ieee8021BridgeBaseEntry_t *pComponent,
ieee8021BridgeBaseEntry_t *poComponent,
uint32_t u32Port);
bool ieee8021BridgeBasePortTable_removeExt (ieee8021BridgeBaseEntry_t *pComponent, ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortTable_createHier (ieee8021BridgeBaseEntry_t *pComponent, ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortTable_removeHier (ieee8021BridgeBaseEntry_t *pComponent, ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortTable_removeExt (ieee8021BridgeBaseEntry_t *poComponent, ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortTable_createHier (ieee8021BridgeBaseEntry_t *poComponent, ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortTable_removeHier (ieee8021BridgeBaseEntry_t *poComponent, ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortIfIndex_handler (
ieee8021BridgeBaseEntry_t *poComponent,
ieee8021BridgeBasePortEntry_t *poEntry);
bool ieee8021BridgeBasePortRowStatus_handler (
ieee8021BridgeBaseEntry_t *pComponent,
ieee8021BridgeBaseEntry_t *poComponent,
ieee8021BridgeBasePortEntry_t *poEntry, uint8_t u8RowStatus);
#ifdef SNMP_SRC
Netsnmp_First_Data_Point ieee8021BridgeBasePortTable_getFirst;
Expand Down Expand Up @@ -416,6 +418,7 @@ typedef struct ieee8021BridgePhyData_t

uint32_t u32ComponentId;
uint32_t u32Port;
uint32_t u32ChassisId;
uint8_t au8TypeCapabilities[2];
size_t u16TypeCapabilities_len; /* # of uint8_t elements */

Expand Down

0 comments on commit 9c04c2f

Please sign in to comment.