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

📄 macbrini.c

📁 以太网交换机协议平台stp协议的设计与实现源代码。
💻 C
字号:
/*
 * $Log:: /OEM Source Code/Spantree/macbrin $
 * 
 * 1     12/04/98 2:36p Release Engineer
 * code cleanup, bug fixes, code style
 * changes, linted, system level test
 * STP v4.3.0
 * 
 * 2     3/27/96 7:07p Ross
 * Initial check in with source safe
 * 
 * 1     2/06/96 11:06p Ross
 * Adding new version control
*/
/*	$Modname: macbrini.c$  $version: 1.20$      $date: 02/09/95$   */
/*
* 	$lgb$
1.0 01/05/92 ross
1.1 01/25/92 ross
1.2 04/22/92 ross
1.3 07/30/92 ross
1.4 07/30/92 ross
1.5 08/05/92 ross
1.6 08/21/92 ross
1.7 08/22/92 ross Added support for multiple instances of stp_class
1.8 10/16/92 ross changed handling of big_e/little_e of BPDUs (for frame relay).
1.9 11/23/92 ross added comments.
1.10 11/23/92 ross changed ETHERNET_ADDRESS to MAC_ADDRESS to appear more generic (cosmetic)
1.11 01/15/93 ross
1.12 07/16/93 ross added some mib statistics
1.13 07/23/93 ross added check for enable/disable.
1.14 08/09/93 ross added STAND_ALONE ifdef.
1.15 10/28/93 ross remove C++ comment.
1.16 10/28/93 ross delete nvram header
1.17 12/03/93 ross changes for lsl version 3.0
1.18 03/07/94 ross removed external references to mac_address, function used instead.
1.19 06/15/94 ross cosmetic changes and snmp access routines.
1.20 02/09/95 ross modified root path cast to swap_long instead of swap.
* 	$lge$
*/
/************************************************************************/
/*	Copyright (C) 1989-1998 RouterWare, Inc. 										*/
/*	Unpublished - rights reserved under the Copyright Laws of the			*/
/*	United States.  Use, duplication, or disclosure by the 					*/
/*	Government is subject to restrictions as set forth in 					*/
/*	subparagraph (c)(1)(ii) of the Rights in Technical Data and 			*/
/*	Computer Software clause at 252.227-7013.										*/
/*	RouterWare, Inc., 3961 MacArthur Blvd. Suite 212, Newport Beach Ca   */
/************************************************************************/
#include	<stdarg.h>
#include "macbridg.h"
/****************************************************************************/
static void check_for_stp_initialization_breakpoint (void);
static void set_stp_default_values (void);
/****************************************************************************/
#if defined (BIG_ENDIAN)
	GLOBAL	MAC_ADDRESS	bridge_group_address = { 0x0180c200L,0x0000 };
	GLOBAL	MAC_ADDRESS	bridge_management_group_address = { 0x0180c200L,0x0010 };
	GLOBAL	MAC_ADDRESS	token_ring_bridge_group_address = { 0xc0000000L,0x0100 };
#else
	GLOBAL	MAC_ADDRESS	bridge_group_address = { 0x00c28001L,0x0000 };
	GLOBAL	MAC_ADDRESS	bridge_management_group_address = { 0x00c28001L,0x1000 };
	GLOBAL	MAC_ADDRESS	token_ring_bridge_group_address = { 0x000000c0L,0x0001 };
#endif
/****************************************************************************/
enum TEST initialize_bridge (ULONG clock_ticks_per_second)
{
	BYTE hash_key_bit;
	ULONG number_of_hash_table_entries;

	check_for_stp_initialization_breakpoint ();

	stp_class.clock_ticks_per_second = clock_ticks_per_second;

	if (stp_class.enabled == FALSE)
		{
		return (PASS);
		}

	set_stp_default_values ( );

	stp_class.dot1dBaseType = SRT;
	stp_class.dot1dStpProtocolSpecification = IEEE_8021D;

	if (lsl_control (REGISTER_PROTOCOL_STACK,"Spanning Tree",
		(enum RX_PACKET_STATE (*) (USHORT port_number,void *vptr_buffer,USHORT number_of_bytes))mac_bridge_rx,mac_bridge_timer,
		mac_bridge_control,&stp_class.stack_id,stp_get_spanning_tree_mib_variable) == FAIL)
		{
		return (FAIL);
		}

	for (number_of_hash_table_entries = stp_class.number_of_hash_table_entries,hash_key_bit = 0x00;
		hash_key_bit < 31; hash_key_bit += (BYTE) 1)
		{
		number_of_hash_table_entries >>= 1; /* number_of_hash_table_entries MUST BE A POWER OF 2!!!!!!! */

		if (number_of_hash_table_entries & 0x0001)
			{
			stp_class.size_of_hash_key = hash_key_bit;
			break;
			}
		}

	++stp_class.size_of_hash_key;

	stp_class.hash_mask = (USHORT) (0xffffffffL >> (32 - stp_class.size_of_hash_key));

	stp_class.mac_bridge_enabled = TRUE;
	stp_class.timer_enabled = FALSE;

	initialize_hashing_table ();

	initialize_bridge_spanning_tree ();

	stp_class.timer_enabled = TRUE;

	
	stp_printf (STP_ALGORITHM_PRINTF,"STP: Total size of Filtering Database (%u entries @ %u bytes/entry) = % u.\n\r",stp_class.number_of_fd_entries,
				sizeof (FILTERING_DATABASE_ENTRY),(stp_class.number_of_fd_entries * sizeof (FILTERING_DATABASE_ENTRY)) );

	
	stp_printf (STP_ALGORITHM_PRINTF,"STP: Total size of Hash Table (%u entries @ %u bytes/entry) = %u .\n\r",stp_class.number_of_hash_table_entries ,sizeof (LINK) ,stp_class.number_of_hash_table_entries * sizeof (LINK));


  	stp_printf (STP_ALGORITHM_PRINTF,"STP: Total size of port class (%u ports @ %u bytes/entry) = %u . \n\r",NUMBER_OF_SPANNING_TREE_PORTS,
		sizeof (STP_PORT_CLASS),NUMBER_OF_SPANNING_TREE_PORTS *sizeof (STP_PORT_CLASS));

	return (PASS);
}
/****************************************************************************/
enum SORT_RETURN compare_identifiers (BRIDGE_IDENTIFIER *sptr_address_1,BRIDGE_IDENTIFIER *sptr_address_2)
{
	enum SORT_RETURN sort_return_value;

	if (sptr_address_1->priority > sptr_address_2->priority)
		return (GREATER_THAN);
	else if (sptr_address_1->priority < sptr_address_2->priority)
		return (LESS_THAN);
	else 
		{
		sort_return_value = compare_addresses (&sptr_address_1->address,&sptr_address_2->address);
		return (sort_return_value);
		}
}
/****************************************************************************/
enum SORT_RETURN compare_port_identifiers (PORT_IDENTIFIER *sptr_address_1,PORT_IDENTIFIER *sptr_address_2)
{
	if (sptr_address_1->priority > sptr_address_2->priority)
		return (GREATER_THAN);
	else if (sptr_address_1->priority < sptr_address_2->priority)
		return (LESS_THAN);
	else 
		{
		if (sptr_address_1->number > sptr_address_2->number)
			return (GREATER_THAN);
		else if (sptr_address_1->number < sptr_address_2->number)
			return (LESS_THAN);
		else 
			return (EQUAL_TO);
		}
}
/****************************************************************************/
enum SORT_RETURN compare_addresses (MAC_ADDRESS *sptr_address_1,MAC_ADDRESS *sptr_address_2)
{
	BYTE	address_size = sizeof (MAC_ADDRESS); 

	BYTE	*bptr_address_1 = (BYTE *) sptr_address_1;
	BYTE	*bptr_address_2 = (BYTE *) sptr_address_2;

	while (address_size--)
		{
		if (*bptr_address_1 > *bptr_address_2)
			{
			return (GREATER_THAN);
			}
		if (*bptr_address_1 < *bptr_address_2)
			{
			return (LESS_THAN);
			}

		++bptr_address_1;
		++bptr_address_2;
		}

	return (EQUAL_TO);
}
/****************************************************************************/
void big_endianize_packet (BRIDGE_CONFIGURATION_BPDU *sptr_bridge_configuration_BPDU)
{
	sptr_bridge_configuration_BPDU->root_id.priority = swap (sptr_bridge_configuration_BPDU->root_id.priority);
	sptr_bridge_configuration_BPDU->root_path_cost = swap_long (sptr_bridge_configuration_BPDU->root_path_cost);
	sptr_bridge_configuration_BPDU->bridge_id.priority = swap (sptr_bridge_configuration_BPDU->bridge_id.priority);
	sptr_bridge_configuration_BPDU->message_age = swap (sptr_bridge_configuration_BPDU->message_age); 		
	sptr_bridge_configuration_BPDU->max_age = swap (sptr_bridge_configuration_BPDU->max_age);					
	sptr_bridge_configuration_BPDU->hello_time = swap (sptr_bridge_configuration_BPDU->hello_time);			
	sptr_bridge_configuration_BPDU->forward_delay = swap (sptr_bridge_configuration_BPDU->forward_delay);	
}
/****************************************************************************/
void little_endianize_packet (BRIDGE_CONFIGURATION_BPDU *sptr_bridge_configuration_BPDU)
{
/*	sptr_bridge_configuration_BPDU->mac_header.length = swap (sptr_bridge_configuration_BPDU->mac_header.length); */

	sptr_bridge_configuration_BPDU->root_id.priority = swap (sptr_bridge_configuration_BPDU->root_id.priority);
	sptr_bridge_configuration_BPDU->root_path_cost = swap_long (sptr_bridge_configuration_BPDU->root_path_cost);
	sptr_bridge_configuration_BPDU->bridge_id.priority = swap (sptr_bridge_configuration_BPDU->bridge_id.priority);
	sptr_bridge_configuration_BPDU->message_age = swap (sptr_bridge_configuration_BPDU->message_age);		
	sptr_bridge_configuration_BPDU->max_age = swap (sptr_bridge_configuration_BPDU->max_age);					
	sptr_bridge_configuration_BPDU->hello_time = swap (sptr_bridge_configuration_BPDU->hello_time);			
	sptr_bridge_configuration_BPDU->forward_delay = swap (sptr_bridge_configuration_BPDU->forward_delay);	
}

/*************************************************************************/
static void check_for_stp_initialization_breakpoint (void)
{
	if (stp_class.initialization_breakpoint_enabled == TRUE)
	  {
	  BREAKPOINT;
	  } 
}

/*************************************************************************/
static void set_stp_default_values (void)
{

	if (stp_class.number_of_fd_entries == 0x0000)
		{

		stp_class.number_of_fd_entries = DEFAULT_NUMBER_OF_FILTERING_DATABASE_ENTRIES; 

		}

	if (stp_class.number_of_hash_table_entries == 0x0000000)
		{

		stp_class.number_of_hash_table_entries = DEFAULT_NUMBER_OF_HASH_TABLE_ENTRIES; 

		}

	if (stp_class.number_of_spanning_tree_ports == 0x0000)
		{

		stp_class.number_of_spanning_tree_ports = NUMBER_OF_SPANNING_TREE_PORTS;

		}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -