/************************************************************************
* RSTP library - Rapid Spanning Tree (802.1t, 802.1w)
* Copyright (C) 2001-2003 Optical Access
* Author: Alex Rozin
*
* This file is part of RSTP library.
*
* RSTP library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation; version 2.1
*
* RSTP library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with RSTP library; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
**********************************************************************/
/* STP machine instance : bridge per VLAN: 17.17 */
/* The Clause 17.13 points: "NOTE:The operation of the Bridge as a whole can
* be represented by the interaction between Bridge Ports specified,
* and by parameters of the Bridge stored in �Port 0�. This removes the
* need for any �per Bridge� specification elements, and helps ensure
* the minimum dependencies between Bridge Ports. This in turn supports
* the development of implementations that scale well with increasing
* numbers of Bridge Ports. This shift of focus to �per Port operation�
* for the RSTP is supported by underlying technical changes from the
* Spanning Tree Algorithm and Protocol (Clause 8):"
* Newetheless, it seems to me, the behaviour of of the bridge, its variables
* and functions are so distinct from Port, that I decided to design Bridge
* instance. I called this object 'stpm' from STP machine. I'd like to see
* another procedural model, more corresponding to this note on Clause 17.13 */
#ifndef _STP_MACHINE_H__
#define _STP_MACHINE_H__
#include "port.h"
#include "rolesel.h"
#define TxHoldCount 3 /* 17.16.6, 17.28.2(Table 17-5) */
typedef enum {/* 17.12, 17.16.1 */
FORCE_STP_COMPAT = 0,
NORMAL_RSTP = 2
} PROTOCOL_VERSION_T;
struct stpm_t {
struct stpm_t* next;
struct port_t* ports;
/* The only "per bridge" state machine */
STATE_MACH_T* rolesel; /* the Port Role Selection State machione: 17.22 */
STATE_MACH_T* machines;
/* variables */
PROTOCOL_VERSION_T ForceVersion; /* 17.12, 17.16.1 */
BRIDGE_ID BrId; /* 17.17.2 */
TIMEVALUES_T BrTimes; /* 17.17.4 */
PORT_ID rootPortId; /* 17.17.5 */
PRIO_VECTOR_T rootPrio; /* 17.17.6 */
TIMEVALUES_T rootTimes; /* 17.17.7 */
int vlan_id; /* let's say: tag */
char* name; /* name of the VLAN, maily for debugging */
UID_STP_MODE_T admin_state; /* STP_DISABLED or STP_ENABLED; type see in UiD */
unsigned long timeSince_Topo_Change; /* 14.8.1.1.3.b */
unsigned long Topo_Change_Count; /* 14.8.1.1.3.c */
unsigned char Topo_Change; /* 14.8.1.1.3.d */
};
#ifndef __STPM_T__
#define __STPM_T__
typedef struct stpm_t STPM_T;
#endif
/* Functions prototypes */
void
STP_stpm_one_second (STPM_T* param);
STPM_T*
STP_stpm_create (int vlan_id, char* name);
int
STP_stpm_enable (STPM_T* this, UID_STP_MODE_T admin_state);
void
STP_stpm_delete (STPM_T* this);
int
STP_stpm_start (STPM_T* this);
void
STP_stpm_stop (STPM_T* this);
int
STP_stpm_update (STPM_T* this);
BRIDGE_ID *
STP_compute_bridge_id (STPM_T* this);
STPM_T *
STP_stpm_get_the_list (void);
void
STP_stpm_update_after_bridge_management (STPM_T* this);
int
STP_stpm_check_bridge_priority (STPM_T* this);
const char*
STP_stpm_get_port_name_by_id (STPM_T* this, PORT_ID port_id);
STPM_T* stpapi_stpm_find (int vlan_id);
int stp_in_stpm_enable (int vlan_id, char* name,
UID_STP_MODE_T admin_state);
void* stp_in_stpm_create (int vlan_id, char *name, int *err_code);
#endif /* _STP_MACHINE_H__ */