⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spantask.c

📁 基于vxworks操作系统,Tornado2.0平台,生成树STP源码.直接在其对应的设备中添加即可.
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -