1*4eaa4710SRishi Srivatsavai /************************************************************************ 2*4eaa4710SRishi Srivatsavai * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 3*4eaa4710SRishi Srivatsavai * Copyright (C) 2001-2003 Optical Access 4*4eaa4710SRishi Srivatsavai * Author: Alex Rozin 5*4eaa4710SRishi Srivatsavai * 6*4eaa4710SRishi Srivatsavai * This file is part of RSTP library. 7*4eaa4710SRishi Srivatsavai * 8*4eaa4710SRishi Srivatsavai * RSTP library is free software; you can redistribute it and/or modify it 9*4eaa4710SRishi Srivatsavai * under the terms of the GNU Lesser General Public License as published by the 10*4eaa4710SRishi Srivatsavai * Free Software Foundation; version 2.1 11*4eaa4710SRishi Srivatsavai * 12*4eaa4710SRishi Srivatsavai * RSTP library is distributed in the hope that it will be useful, but 13*4eaa4710SRishi Srivatsavai * WITHOUT ANY WARRANTY; without even the implied warranty of 14*4eaa4710SRishi Srivatsavai * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 15*4eaa4710SRishi Srivatsavai * General Public License for more details. 16*4eaa4710SRishi Srivatsavai * 17*4eaa4710SRishi Srivatsavai * You should have received a copy of the GNU Lesser General Public License 18*4eaa4710SRishi Srivatsavai * along with RSTP library; see the file COPYING. If not, write to the Free 19*4eaa4710SRishi Srivatsavai * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20*4eaa4710SRishi Srivatsavai * 02111-1307, USA. 21*4eaa4710SRishi Srivatsavai **********************************************************************/ 22*4eaa4710SRishi Srivatsavai 23*4eaa4710SRishi Srivatsavai /* This file contains prototypes for API from an operation 24*4eaa4710SRishi Srivatsavai system to the RSTP */ 25*4eaa4710SRishi Srivatsavai 26*4eaa4710SRishi Srivatsavai #ifndef _STP_API_H__ 27*4eaa4710SRishi Srivatsavai #define _STP_API_H__ 28*4eaa4710SRishi Srivatsavai 29*4eaa4710SRishi Srivatsavai #include <sys/types.h> 30*4eaa4710SRishi Srivatsavai 31*4eaa4710SRishi Srivatsavai #define STP_DBG 1 32*4eaa4710SRishi Srivatsavai 33*4eaa4710SRishi Srivatsavai /************************ 34*4eaa4710SRishi Srivatsavai * Common base constants 35*4eaa4710SRishi Srivatsavai ************************/ 36*4eaa4710SRishi Srivatsavai 37*4eaa4710SRishi Srivatsavai #ifndef INOUT 38*4eaa4710SRishi Srivatsavai # define IN /* consider as comments near 'input' parameters */ 39*4eaa4710SRishi Srivatsavai # define OUT /* consider as comments near 'output' parameters */ 40*4eaa4710SRishi Srivatsavai # define INOUT /* consider as comments near 'input/output' parameters */ 41*4eaa4710SRishi Srivatsavai #endif 42*4eaa4710SRishi Srivatsavai 43*4eaa4710SRishi Srivatsavai #ifndef Zero 44*4eaa4710SRishi Srivatsavai # define Zero 0 45*4eaa4710SRishi Srivatsavai # define One 1 46*4eaa4710SRishi Srivatsavai #endif 47*4eaa4710SRishi Srivatsavai 48*4eaa4710SRishi Srivatsavai #ifndef Bool 49*4eaa4710SRishi Srivatsavai # define Bool int 50*4eaa4710SRishi Srivatsavai # define False 0 51*4eaa4710SRishi Srivatsavai # define True 1 52*4eaa4710SRishi Srivatsavai #endif 53*4eaa4710SRishi Srivatsavai 54*4eaa4710SRishi Srivatsavai /******************************************** 55*4eaa4710SRishi Srivatsavai * constants: default values and linitations 56*4eaa4710SRishi Srivatsavai *********************************************/ 57*4eaa4710SRishi Srivatsavai 58*4eaa4710SRishi Srivatsavai /* bridge configuration */ 59*4eaa4710SRishi Srivatsavai 60*4eaa4710SRishi Srivatsavai #define DEF_BR_PRIO 32768 61*4eaa4710SRishi Srivatsavai #define MIN_BR_PRIO 0 62*4eaa4710SRishi Srivatsavai #define MAX_BR_PRIO 61440 63*4eaa4710SRishi Srivatsavai 64*4eaa4710SRishi Srivatsavai #define DEF_BR_HELLOT 2 65*4eaa4710SRishi Srivatsavai #define MIN_BR_HELLOT 1 66*4eaa4710SRishi Srivatsavai #define MAX_BR_HELLOT 10 67*4eaa4710SRishi Srivatsavai 68*4eaa4710SRishi Srivatsavai #define DEF_BR_MAXAGE 20 69*4eaa4710SRishi Srivatsavai #define MIN_BR_MAXAGE 6 70*4eaa4710SRishi Srivatsavai #define MAX_BR_MAXAGE 40 71*4eaa4710SRishi Srivatsavai 72*4eaa4710SRishi Srivatsavai #define DEF_BR_FWDELAY 15 73*4eaa4710SRishi Srivatsavai #define MIN_BR_FWDELAY 4 74*4eaa4710SRishi Srivatsavai #define MAX_BR_FWDELAY 30 75*4eaa4710SRishi Srivatsavai 76*4eaa4710SRishi Srivatsavai #define IEEE_TIMER_SCALE 256 77*4eaa4710SRishi Srivatsavai 78*4eaa4710SRishi Srivatsavai /* Note that this works with unscaled values */ 79*4eaa4710SRishi Srivatsavai #define CHECK_BRIDGE_CONFIG(cfg) \ 80*4eaa4710SRishi Srivatsavai (2 * (cfg.forward_delay - 1) >= cfg.max_age && \ 81*4eaa4710SRishi Srivatsavai cfg.max_age >= 2 * (cfg.hello_time + 1)) 82*4eaa4710SRishi Srivatsavai 83*4eaa4710SRishi Srivatsavai /* 84*4eaa4710SRishi Srivatsavai * These macros provide limits and tests for displaying comprehensible errors. 85*4eaa4710SRishi Srivatsavai */ 86*4eaa4710SRishi Srivatsavai #define NO_MAXAGE(cfg) ((cfg.forward_delay - 1) < (cfg.hello_time + 1)) 87*4eaa4710SRishi Srivatsavai #define MIN_FWDELAY_NOM(cfg) \ 88*4eaa4710SRishi Srivatsavai (cfg.hello_time < MIN_BR_FWDELAY - 2 ? MIN_BR_FWDELAY : \ 89*4eaa4710SRishi Srivatsavai cfg.hello_time + 2) 90*4eaa4710SRishi Srivatsavai #define MAX_HELLOTIME_NOM(cfg) \ 91*4eaa4710SRishi Srivatsavai (cfg.forward_delay > MAX_BR_HELLOT + 2 ? MAX_BR_HELLOT : \ 92*4eaa4710SRishi Srivatsavai cfg.forward_delay - 2) 93*4eaa4710SRishi Srivatsavai 94*4eaa4710SRishi Srivatsavai #define SMALL_MAXAGE(cfg) (cfg.max_age < 2 * (cfg.hello_time + 1)) 95*4eaa4710SRishi Srivatsavai #define MIN_MAXAGE(cfg) \ 96*4eaa4710SRishi Srivatsavai (cfg.hello_time < (MIN_BR_MAXAGE / 2 - 1) ? MIN_BR_MAXAGE : \ 97*4eaa4710SRishi Srivatsavai (2 * (cfg.hello_time + 1))) 98*4eaa4710SRishi Srivatsavai #define MAX_HELLOTIME(cfg) \ 99*4eaa4710SRishi Srivatsavai (cfg.max_age > 2 * (MAX_BR_HELLOT + 1) ? MAX_BR_HELLOT : \ 100*4eaa4710SRishi Srivatsavai (cfg.max_age / 2 - 1)) 101*4eaa4710SRishi Srivatsavai 102*4eaa4710SRishi Srivatsavai #define MIN_FWDELAY(cfg) (cfg.max_age / 2 + 1) 103*4eaa4710SRishi Srivatsavai #define MAX_MAXAGE(cfg) \ 104*4eaa4710SRishi Srivatsavai (cfg.forward_delay > (MAX_BR_MAXAGE / 2 + 1) ? MAX_BR_MAXAGE : \ 105*4eaa4710SRishi Srivatsavai (2 * (cfg.forward_delay - 1))) 106*4eaa4710SRishi Srivatsavai 107*4eaa4710SRishi Srivatsavai #define CAPPED_MAXAGE(cfg) (cfg.forward_delay < (MAX_BR_MAXAGE / 2 + 1)) 108*4eaa4710SRishi Srivatsavai #define FLOORED_MAXAGE(cfg) (cfg.hello_time > (MIN_BR_MAXAGE / 2 - 1)) 109*4eaa4710SRishi Srivatsavai 110*4eaa4710SRishi Srivatsavai #define DEF_FORCE_VERS 2 /* NORMAL_RSTP */ 111*4eaa4710SRishi Srivatsavai 112*4eaa4710SRishi Srivatsavai /* port configuration */ 113*4eaa4710SRishi Srivatsavai 114*4eaa4710SRishi Srivatsavai #define DEF_PORT_PRIO 128 115*4eaa4710SRishi Srivatsavai #define MIN_PORT_PRIO 0 116*4eaa4710SRishi Srivatsavai #define MAX_PORT_PRIO 240 /* in steps of 16 */ 117*4eaa4710SRishi Srivatsavai 118*4eaa4710SRishi Srivatsavai #define DEF_ADMIN_NON_STP False 119*4eaa4710SRishi Srivatsavai #define DEF_ADMIN_EDGE True 120*4eaa4710SRishi Srivatsavai #define DEF_LINK_DELAY 3 /* see edge.c */ 121*4eaa4710SRishi Srivatsavai #define DEF_P2P P2P_AUTO 122*4eaa4710SRishi Srivatsavai 123*4eaa4710SRishi Srivatsavai #include <uid_stp.h> 124*4eaa4710SRishi Srivatsavai #include <stp_bpdu.h> 125*4eaa4710SRishi Srivatsavai 126*4eaa4710SRishi Srivatsavai #ifndef __STPM_T__ 127*4eaa4710SRishi Srivatsavai #define __STPM_T__ 128*4eaa4710SRishi Srivatsavai struct stpm_t; 129*4eaa4710SRishi Srivatsavai typedef struct stpm_t STPM_T; 130*4eaa4710SRishi Srivatsavai #endif 131*4eaa4710SRishi Srivatsavai #ifndef __STP_VECTORS_T__ 132*4eaa4710SRishi Srivatsavai #define __STP_VECTORS_T__ 133*4eaa4710SRishi Srivatsavai struct stp_vectors; 134*4eaa4710SRishi Srivatsavai typedef struct stp_vectors STP_VECTORS_T; 135*4eaa4710SRishi Srivatsavai #endif 136*4eaa4710SRishi Srivatsavai 137*4eaa4710SRishi Srivatsavai /* Section 1: Create/Delete/Start/Stop the RSTP instance */ 138*4eaa4710SRishi Srivatsavai 139*4eaa4710SRishi Srivatsavai void /* init the engine */ 140*4eaa4710SRishi Srivatsavai STP_IN_init (STP_VECTORS_T *vectors); 141*4eaa4710SRishi Srivatsavai 142*4eaa4710SRishi Srivatsavai int 143*4eaa4710SRishi Srivatsavai STP_IN_stpm_create (int vlan_id, char* name); 144*4eaa4710SRishi Srivatsavai 145*4eaa4710SRishi Srivatsavai int 146*4eaa4710SRishi Srivatsavai STP_IN_stpm_delete (int vlan_id); 147*4eaa4710SRishi Srivatsavai 148*4eaa4710SRishi Srivatsavai int 149*4eaa4710SRishi Srivatsavai STP_IN_port_add (int vlan_id, int port_index); 150*4eaa4710SRishi Srivatsavai 151*4eaa4710SRishi Srivatsavai int 152*4eaa4710SRishi Srivatsavai STP_IN_port_remove (int vlan_id, int port_index); 153*4eaa4710SRishi Srivatsavai 154*4eaa4710SRishi Srivatsavai int 155*4eaa4710SRishi Srivatsavai STP_IN_stop_all (void); 156*4eaa4710SRishi Srivatsavai 157*4eaa4710SRishi Srivatsavai int 158*4eaa4710SRishi Srivatsavai STP_IN_delete_all (void); 159*4eaa4710SRishi Srivatsavai 160*4eaa4710SRishi Srivatsavai /* Section 2. "Get" management */ 161*4eaa4710SRishi Srivatsavai 162*4eaa4710SRishi Srivatsavai Bool 163*4eaa4710SRishi Srivatsavai STP_IN_get_is_stpm_enabled (int vlan_id); 164*4eaa4710SRishi Srivatsavai 165*4eaa4710SRishi Srivatsavai int 166*4eaa4710SRishi Srivatsavai STP_IN_stpm_get_vlan_id_by_name (char* name, int* vlan_id); 167*4eaa4710SRishi Srivatsavai 168*4eaa4710SRishi Srivatsavai int 169*4eaa4710SRishi Srivatsavai STP_IN_stpm_get_name_by_vlan_id (int vlan_id, char* name, size_t buffsize); 170*4eaa4710SRishi Srivatsavai 171*4eaa4710SRishi Srivatsavai const char* 172*4eaa4710SRishi Srivatsavai STP_IN_get_error_explanation (int rstp_err_no); 173*4eaa4710SRishi Srivatsavai 174*4eaa4710SRishi Srivatsavai int 175*4eaa4710SRishi Srivatsavai STP_IN_stpm_get_cfg (int vlan_id, UID_STP_CFG_T* uid_cfg); 176*4eaa4710SRishi Srivatsavai 177*4eaa4710SRishi Srivatsavai int 178*4eaa4710SRishi Srivatsavai STP_IN_stpm_get_state (int vlan_id, UID_STP_STATE_T* entry); 179*4eaa4710SRishi Srivatsavai 180*4eaa4710SRishi Srivatsavai int 181*4eaa4710SRishi Srivatsavai STP_IN_port_get_cfg (int vlan_id, int port_index, UID_STP_PORT_CFG_T* uid_cfg); 182*4eaa4710SRishi Srivatsavai 183*4eaa4710SRishi Srivatsavai int 184*4eaa4710SRishi Srivatsavai STP_IN_port_get_state (int vlan_id, UID_STP_PORT_STATE_T* entry); 185*4eaa4710SRishi Srivatsavai 186*4eaa4710SRishi Srivatsavai const char * 187*4eaa4710SRishi Srivatsavai STP_IN_state2str(RSTP_PORT_STATE); 188*4eaa4710SRishi Srivatsavai 189*4eaa4710SRishi Srivatsavai /* Section 3. "Set" management */ 190*4eaa4710SRishi Srivatsavai 191*4eaa4710SRishi Srivatsavai int 192*4eaa4710SRishi Srivatsavai STP_IN_stpm_set_cfg (int vlan_id, 193*4eaa4710SRishi Srivatsavai UID_STP_CFG_T* uid_cfg); 194*4eaa4710SRishi Srivatsavai 195*4eaa4710SRishi Srivatsavai int 196*4eaa4710SRishi Srivatsavai STP_IN_port_set_cfg (int vlan_id, int port_index, 197*4eaa4710SRishi Srivatsavai UID_STP_PORT_CFG_T* uid_cfg); 198*4eaa4710SRishi Srivatsavai 199*4eaa4710SRishi Srivatsavai #ifdef STP_DBG 200*4eaa4710SRishi Srivatsavai int STP_IN_dbg_set_port_trace (char *mach_name, int enadis, 201*4eaa4710SRishi Srivatsavai int vlan_id, int port_index); 202*4eaa4710SRishi Srivatsavai #endif 203*4eaa4710SRishi Srivatsavai 204*4eaa4710SRishi Srivatsavai /* Section 4. RSTP functionality events */ 205*4eaa4710SRishi Srivatsavai 206*4eaa4710SRishi Srivatsavai int 207*4eaa4710SRishi Srivatsavai STP_IN_one_second (void); 208*4eaa4710SRishi Srivatsavai 209*4eaa4710SRishi Srivatsavai int /* for Link UP/DOWN */ 210*4eaa4710SRishi Srivatsavai STP_IN_enable_port (int port_index, Bool enable); 211*4eaa4710SRishi Srivatsavai 212*4eaa4710SRishi Srivatsavai int /* call it, when port speed has been changed, speed in Kb/s */ 213*4eaa4710SRishi Srivatsavai STP_IN_changed_port_speed (int port_index, long speed); 214*4eaa4710SRishi Srivatsavai 215*4eaa4710SRishi Srivatsavai int /* call it, when current port duplex mode has been changed */ 216*4eaa4710SRishi Srivatsavai STP_IN_changed_port_duplex (int port_index); 217*4eaa4710SRishi Srivatsavai 218*4eaa4710SRishi Srivatsavai int 219*4eaa4710SRishi Srivatsavai STP_IN_check_bpdu_header (BPDU_T* bpdu, size_t len); 220*4eaa4710SRishi Srivatsavai 221*4eaa4710SRishi Srivatsavai int 222*4eaa4710SRishi Srivatsavai STP_IN_rx_bpdu (int vlan_id, int port_index, BPDU_T* bpdu, size_t len); 223*4eaa4710SRishi Srivatsavai 224*4eaa4710SRishi Srivatsavai void 225*4eaa4710SRishi Srivatsavai STP_IN_get_bridge_id(int vlan_id, unsigned short *priority, unsigned char *mac); 226*4eaa4710SRishi Srivatsavai 227*4eaa4710SRishi Srivatsavai #endif /* _STP_API_H__ */ 228