📄 macbrmgt.c
字号:
/*
* $Log:: /OEM Source Code/Spantree/macbrm $
*
* 1 12/04/98 2:36p Release Engineer
* code cleanup, bug fixes, code style
* changes, linted, system level test
* STP v4.3.0
*
* 1 2/06/96 11:06p Ross
* Adding new version control
*/
/* $Modname: macbrmgt.c$ $version: 1.22$ $date: 03/31/95$ */
/*
* $lgb$
1.0 01/05/92 ross
1.1 01/25/92 ross
1.2 01/29/92 ross added port_number array stuff for line 88 and 89 read_forwarding_port_counters
1.3 04/22/92 ross
1.4 07/30/92 ross
1.5 07/30/92 ross
1.6 07/30/92 ross
1.7 08/05/92 ross
1.8 08/21/92 ross
1.9 08/22/92 ross Added support for multiple instances of stp_class
1.10 08/22/92 ross made as many functions as possible static
1.11 08/22/92 ross brought this module current.
1.12 11/23/92 ross changed ETHERNET_ADDRESS to MAC_ADDRESS to appear more generic - cosmetic
1.13 01/15/93 ross
1.14 01/18/93 ross changed aging_time to this_bridge.aging_time.
1.15 01/30/93 ross delete references to stp dlci
1.16 07/16/93 ross added some mib statistics
1.17 10/11/93 ross update for changes in LSL, bug in frame relay receive.
1.18 10/28/93 ross removed compile time printf functions.
1.19 01/10/94 ross added BIG_ENDIAN wrapper around addresses. Thanks to Rick.
1.20 05/09/94 ross added changes for configuring forwarding state for SRT
1.21 06/15/94 ross cosmetic changes and snmp access routines.
1.22 03/31/95 ross Changes for new rwutils library.
* $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 */
/************************************************************************/
#define GLOBAL_FILE
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include "macbridg.h"
#include "kmgmt.h"
#include "vmacmstr.h"
/****************************************************************************/
static void read_bridge (READ_BRIDGE_STATUS *sptr_read_bridge_status);
/****************************************************************************/
enum TEST discover_bridge (READ_BRIDGE_STATUS *sptr_read_bridge_status,MAC_ADDRESS **sptr_low_address,
MAC_ADDRESS **sptr_high_address,MAC_ADDRESS **sptr_address_exclusion_list)
{
while (*sptr_low_address != NULL)
{
if (compare_addresses (*sptr_low_address,&stp_class.this_bridge.bridge_id.address) == GREATER_THAN)
{
if (compare_addresses (*sptr_high_address,&stp_class.this_bridge.bridge_id.address) == LESS_THAN)
{
while (compare_addresses (*sptr_address_exclusion_list,&stp_class.this_bridge.bridge_id.address) != EQUAL_TO)
{
++sptr_address_exclusion_list;
}
if (sptr_address_exclusion_list == NULL)
{
read_bridge (sptr_read_bridge_status);
return (PASS);
}
}
}
++sptr_low_address;
++sptr_high_address;
}
memset (&sptr_read_bridge_status->mac_address_from_bridge_id,(int) NULL,sizeof (MAC_ADDRESS));
read_bridge (sptr_read_bridge_status);
return (FAIL);
}
/****************************************************************************/
static void read_bridge (READ_BRIDGE_STATUS *sptr_read_bridge_status)
{
memcpy (&sptr_read_bridge_status->mac_address_from_bridge_id,
&stp_class.this_bridge.bridge_id.address,sizeof (MAC_ADDRESS));
strcpy (sptr_read_bridge_status->name,(const char *) stp_class.this_bridge.name);
sptr_read_bridge_status->number_of_ports = (USHORT)stp_class.number_of_spanning_tree_ports;
sptr_read_bridge_status->uptime = (stp_class.this_bridge.time_up) + (stp_class.this_bridge.time_up / 5);
}
/****************************************************************************/
void set_bridge_name (const char *bptr_bridge_name)
{
strcpy (stp_class.this_bridge.name,bptr_bridge_name);
}
/****************************************************************************/
void reset_bridge (void)
{
table_free (stp_class.sptr_fd_table);
table_free (stp_class.sptr_hash_table);
initialize_bridge (stp_class.clock_ticks_per_second);
}
/****************************************************************************/
void read_port (USHORT port_number,char *bptr_port_name,enum PORT_TYPE *type_of_port)
{
strcpy (bptr_port_name,(const char *) stp_class.port[port_number].name);
*type_of_port = _8023;
}
/****************************************************************************/
void set_port_name (USHORT port_number,const char *bptr_port_name)
{
strcpy (stp_class.port[port_number].name,bptr_port_name);
}
/****************************************************************************/
void read_forwarding_port_counters (USHORT port_number,PORT_COUNTERS *sptr_port_counters)
{
sptr_port_counters->number_of_frames_discarded = stp_class.port[port_number].number_of_frames_discarded;
sptr_port_counters->number_of_frames_forwarded = stp_class.port[port_number].number_of_frames_forwarded;
}
/****************************************************************************/
BYTE read_transmissions_priority (USHORT port_number)
{
return (stp_class.port[port_number].port_id.priority);
}
/****************************************************************************/
void set_transmission_priority (USHORT port_number,BYTE priority)
{
stp_class.port[port_number].port_id.priority = priority;
}
/****************************************************************************/
void *read_filtering_database (void)
{
return (stp_class.sptr_fd_table);
}
/****************************************************************************/
void set_filtering_database_aging_time (ULONG time)
{
stp_class.this_bridge.aging_time_for_fd = time;
}
/****************************************************************************/
void read_permanent_database (PERMANENT_DATABASE_STATUS *sptr_permanent_database_status)
{
USHORT number_of_entries;
USHORT entry_number;
FILTERING_DATABASE_ENTRY *sptr_current_entry;
sptr_current_entry = stp_class.sptr_first_entry_in_fd_table;
for (number_of_entries = 0x0000,entry_number = 0x0000 ; entry_number <= stp_class.number_of_fd_entries;
++entry_number,++sptr_current_entry)
{
if (sptr_current_entry->port_number != 0x00)
{
++number_of_entries;
}
}
sptr_permanent_database_status->maximum_number_of_entries = 256;
sptr_permanent_database_status->current_number_of_entries = number_of_entries;
}
/****************************************************************************/
void create_filtering_entry (enum FILTERING_DATABASE_TYPE filtering_database_type,MAC_ADDRESS *sptr_mac_address_to_add,
PORT_MAP *sptr_port_map)
{
if (filtering_database_type == FILTERING_DATABASE)
add_entry_to_filtering_database (sptr_mac_address_to_add->_ushort,sptr_mac_address_to_add->_ulong,
sptr_port_map->inbound_port_number,DELETE_ENTRY_ON_TIMEOUT);
else
add_entry_to_filtering_database (sptr_mac_address_to_add->_ushort,sptr_mac_address_to_add->_ulong,
sptr_port_map->inbound_port_number,PERMANENT_TABLE_ENTRY);
}
/****************************************************************************/
void delete_filtering_entry (enum FILTERING_DATABASE_TYPE filtering_database_type,
MAC_ADDRESS *sptr_mac_address_to_delete)
{
FILTERING_DATABASE_ENTRY *sptr_matching_fde;
sptr_matching_fde =
find_source_address ((LINK *)
&stp_class.sptr_hash_table->entry[sptr_mac_address_to_delete->_ushort],
sptr_mac_address_to_delete->_ushort,sptr_mac_address_to_delete->_ulong);
if (sptr_matching_fde != NULL)
{
if (((filtering_database_type == FILTERING_DATABASE) && (sptr_matching_fde->type == DELETE_ENTRY_ON_TIMEOUT))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -