📄 macbrini.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 + -