📄 spantask.c
字号:
Config_bpdu *bpdu = &span_Config_bpdu;
uchar_t *p;
p = (uchar_t *) cp;
bpdu->type = p[3];
bcopy((char *)&p[5], (char *)&bpdu->root_id, sizeof(Identifier));
bpdu->root_path_cost = glong(&p[13]);
bcopy((char *)&p[17], (char *)&bpdu->bridge_id, sizeof(Identifier));
bpdu->port_id = gshort(&p[25]);
bpdu->message_age = (gshort(&p[27]) >> 8);
bpdu->max_age = (gshort(&p[29]) >> 8);
bpdu->hello_time = (gshort(&p[31]) >> 8);
bpdu->forward_delay = (gshort(&p[33]) >> 8);
bpdu->topology_change_acknowledgment = p[4] & 0x80;
bpdu->topology_change = p[4] & 0x01;
/*lint -save -e740 */
dprintf("Config BPDU\n");
dprintf(" Type %02x\n RootId %08x%08x\n RootPathCost %04x\n BridgeId %08x%08x\n",
bpdu->type,
*(ulong_t *) & bpdu->root_id,
*(ulong_t *) ((ulong_t) & bpdu->root_id + 4),
bpdu->root_path_cost,
*(ulong_t *) & bpdu->bridge_id,
*(ulong_t *) ((ulong_t) & bpdu->bridge_id + 4));
dprintf(" PortId %04x MessageAge %04x MaxAge %04x HelloTime %04x\n",
bpdu->port_id, bpdu->message_age,
bpdu->root_path_cost, bpdu->hello_time);
dprintf(" ForwardDelay %04x\n", bpdu->forward_delay);
/*lint -restore */
#if 0 /* Accept the values the ROOT bridge is telling us. */
if ((bpdu->max_age < 6) || (bpdu->max_age > 40))
bpdu->max_age = DEFAULT_MAX_AGE;
if ((bpdu->hello_time < 1) || (bpdu->hello_time > 10))
bpdu->hello_time = DEFAULT_HELLO_TIME;
if ((bpdu->forward_delay < 4) || (bpdu->forward_delay > 30))
bpdu->forward_delay = DEFAULT_FORWARD_DELAY;
#endif
/* Must validate the values to the STP formalus. */
if ( ((2 * (bpdu->forward_delay - 1)) >= bpdu->max_age) &&
(bpdu->max_age >= (2 * (bpdu->hello_time + 1))) )
{
/* Do nothing valid values. */
}
else
{
/* Invalid values set to the defaults. */
bpdu->forward_delay = DEFAULT_FORWARD_DELAY;
bpdu->hello_time = DEFAULT_HELLO_TIME;
bpdu->max_age = DEFAULT_MAX_AGE;
}
dprintf("xpan_receive_config() ack %d top %d\n\n",
bpdu->topology_change_acknowledgment,
bpdu->topology_change);
/* now call config bpdu receive */
received_config_bpdu((int)port, bpdu);
return (0);
}
/*******************************************************************************
* span_receive_tcn -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
LOCAL ulong_t span_receive_tcn
(
Tcn_pkt_t * tp,
ulong_t port
)
{
Tcn_bpdu *bpdu = &span_Tcn_bpdu;
bpdu->type = tp->header.type;
dprintf("TCN BPDU\n");
/* now call topology change bpdu receive */
received_tcn_bpdu((int)port, bpdu);
return (0);
}
/*******************************************************************************
* span_process -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
LOCAL void span_process
(
Bpdu_header_t * bpdu,
ulong_t port
)
{
Protocol_identifier identifier;
bcopy((char*)bpdu, (char*)&identifier, sizeof(Protocol_identifier));
/*lint -save -e740 */
if ((identifier == 0) && (bpdu->version == 0) &&
((((Config_pkt_t *)bpdu)->flags & 0x7E) == 0))
{
/* 802.1d packet at this point */
if (bpdu->type == Config_bpdu_type)
span_receive_config((Config_pkt_t *) bpdu, port);
else if (bpdu->type == Tcn_bpdu_type)
span_receive_tcn((Tcn_pkt_t *) bpdu, port);
else
dprintf("span_process: BPDU Type not valid %02x\n", bpdu->type);
}
/*lint -restore */
}
/*******************************************************************************
* span_set_aging -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
void span_set_aging
(
ulong_t value
)
{
LOCAL ulong_t aging = 0;
if (!aging)
{
/* NOT Supported */
}
if (value)
{
/* NOT Supported */
}
else
{
/* NOT Supported */
}
}
/*******************************************************************************
* spanRecv -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
LOCAL BOOL spanRecv
(
void * pCookie, /* protocol/device binding from muxBind() */
long type, /* Protocol type. */
M_BLK_ID pMblk, /* The whole packet. */
LL_HDR_INFO * pLinkHdrInfo, /* pointer to link level header info */
void * pSpare
)
{
#ifdef _lint
type = type;
#endif
if(type!=STP_ETHER_TYPE)return False;
printf("***");
if (stpQSend( SPAN_RX_BPDU, (void *)pMblk, (ulong_t)pSpare))
netMblkClChainFree(pMblk);
#if 0
if ( netCallbackId )
{
if (stpQSend( SPAN_RX_BPDU, (void *)pMblk, (ulong_t)pSpareData ) )
netMblkClChainFree(pMblk);
}
else
netMblkClChainFree(pMblk);
#endif
return (1);
}
/*******************************************************************************
* spanErrorRtn -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
LOCAL void spanErrorRtn
(
END_OBJ * pEnd, /* END reporting the error */
END_ERR * pError, /* the error message */
void * pSpare /* spare pointer from muxBind() */
)
{
#ifdef _lint
pError = pError;
#endif
return;
printf("spanErrorRtn for %s%d with Error of ",
pError->pMesg, (int)pError->pSpare);
switch( pError->errCode )
{
case END_ERR_INFO: printf("END_ERR_INFO\n"); break;
case END_ERR_WARN: printf("END_ERR_WARN\n"); break;
case END_ERR_RESET: printf("END_ERR_RESET\n"); break;
case END_ERR_DOWN: printf("END_ERR_DOWN\n"); break;
case END_ERR_UP: printf("END_ERR_UP\n"); break;
case END_ERR_FLAGS: printf("END_ERR_FLAGS\n"); break;
default: printf("Unknown\n"); break;
}
}
/*******************************************************************************
* spanTxShutdownRtn -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
LOCAL BOOL spanTxShutdownRtn
(
void * pCookie, /* protocol/device binding from muxBind() */
void * pSpare /* spare pointer from muxBind() */
)
{
printf("spanTxShutdownRtn\n");
return 1;
}
/*******************************************************************************
* spanTxRestartRtn -
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* NOMANUAL <this will be removed later>
*/
LOCAL BOOL spanTxRestartRtn
(
void * pCookie, /* device identifier (from muxDevLoad) */
void * pSpare /* spare pointer from muxBind() */
)
{
printf("spanTxRestartRtn\n");
return 1;
}
/******************************************************************************
* spanShow - show spanning tree port states like Cisco does
*
* INPUTS:
*
* RETURNS:
*
* ERRORS:
*
* ERRNO:
*
* SEE_ALSO:
*
* NOMANUAL <this will be removed later>
*/
extern Boolean root_bridge();
static char *stp_states[] =
{ "Internal Error",
"Disabled",
"Blocking",
"Listening",
"Learning",
"Forwarding",
"Broken"
};
void spanShowPort
(
int port
)
{
printf("Port %d (Ethernet%d) of Bridge group %d is %s\n",
port,0,0,stp_states[port_info[port].state]);
printf("\tPort path cost %d, Port priority %d\n",
port_info[port].path_cost, port_info[port].port_id);
printf("\tDesignated root has priority %d, "
"address 0x%04x%02x%02x%02x%02x%02x%02x\n",
(int)get_stp_priority(),
bridge_info.designated_root.priority,
bridge_info.designated_root.mac[0],
bridge_info.designated_root.mac[1],
bridge_info.designated_root.mac[2],
bridge_info.designated_root.mac[3],
bridge_info.designated_root.mac[4],
bridge_info.designated_root.mac[5]);
printf("\tDesignated bridge has priority %d, "
"address 0x%04x%02x%02x%02x%02x%02x%02x\n",
(int)get_stp_priority(),
bridge_info.designated_root.priority,
bridge_info.designated_root.mac[0],
bridge_info.designated_root.mac[1],
bridge_info.designated_root.mac[2],
bridge_info.designated_root.mac[3],
bridge_info.designated_root.mac[4],
bridge_info.designated_root.mac[5]);
printf("\tDesignated port is %d, path cost %d\n",
(int)port_info[port].designated_port, (int)port_info[port].path_cost);
printf("\tTimers: message age %d, forward delay %d, hold %d\n",
(int)message_age_timer[port].value,
(int)forward_delay_timer[port].value,
(int)hold_timer[port].value);
/*
* @@ TODO -- stats on TCN/CONFIG BPDU's
* printf("\tBPDU: sent 184, received 0\n");
*/
}
void spanShow(int port)
{
int i;
if(!port_info)
return;
/* Show Bridge parameters */
printf("Spanning Tree Protocol (STP) 802.1D/D17\n");
printf("Bridge Identifier has priority %d, "
"address 0x%04x%02x%02x%02x%02x%02x%02x\n",
(int)get_stp_priority(),
bridge_info.bridge_id.priority,
bridge_info.bridge_id.mac[0],
bridge_info.bridge_id.mac[1],
bridge_info.bridge_id.mac[2],
bridge_info.bridge_id.mac[3],
bridge_info.bridge_id.mac[4],
bridge_info.bridge_id.mac[5]);
printf("Configured hello time %d, max age %d, forward delay %d\n",
bridge_info.bridge_hello_time,
bridge_info.bridge_max_age,
bridge_info.bridge_forward_delay);
if (root_bridge())
printf("We are the root of the spanning tree, root port=%d\n",
bridge_info.root_port);
else
printf("Root bridge "
"address 0x%04x%02x%02x%02x%02x%02x%02x\n",
bridge_info.designated_root.priority,
bridge_info.designated_root.mac[0],
bridge_info.designated_root.mac[1],
bridge_info.designated_root.mac[2],
bridge_info.designated_root.mac[3],
bridge_info.designated_root.mac[4],
bridge_info.designated_root.mac[5]);
printf("Hold time %ld, topology change time %d\n\n",
get_stp_hold_time(), bridge_info.topology_change_time);
return;
/* Show just the specified port */
if(port && (port >= 1) && (port <= SpanDrvCtrl->numPorts))
spanShowPort(port);
else
{
/* Show each port's parameters */
for (i = One; i <= SpanDrvCtrl->numPorts; i++)
spanShowPort(i);
}
}
/*****************************************************************************
*
* stpPortBitmask - modify or retrieve bitmask of ports in Forwarding states
*
* DESCRIPTION:
* This function allows to modify or retrieve a bitmask of all ports which
* are currently in a Forwarding state.
*
* RETURNS: zero, one, or ERROR
*/
int stpPortBitmask
(
int event,
int port
)
{
if ( (SpanDrvCtrl->portBitList == NULL) && (event != INIT_BITMAP) )
return ERROR;
/* Make sure the port is a one based value and within range */
if ( (port <= 0) || (port > SpanDrvCtrl->numPorts) )
return ERROR;
/* Change the one based port number to zero based value */
port = port - 1;
switch (event)
{
case ADD_PORT:
/* aaaa bitListSet( SpanDrvCtrl->portBitList, port ); */
break;
case REMOVE_PORT:
/* aaaa bitListClr( SpanDrvCtrl->portBitList, port );*/
break;
case TEST_BITMAP:
/* aaaa return bitListTstAll( SpanDrvCtrl->portBitList,
SpanDrvCtrl->numPorts ) ? True : False; */
case INIT_BITMAP:
/* Setup the port bit mask for forwarding state. */
SpanDrvCtrl->portBitList = (char *)calloc( (port/8)+1, 1 );
if ( SpanDrvCtrl->portBitList == NULL )
return ERROR;
break;
case FREE_BITMAP:
if ( SpanDrvCtrl->portBitList )
cfree( (char *)SpanDrvCtrl->portBitList );
SpanDrvCtrl->portBitList = NULL;
break;
default:
return ERROR;
}
return False;
}
/*lint -e(766) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -