1*55fea89dSDan Cross /************************************************************************ 2*55fea89dSDan Cross * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 3*55fea89dSDan Cross * Copyright (C) 2001-2003 Optical Access 4*55fea89dSDan Cross * Author: Alex Rozin 5*55fea89dSDan Cross * 6*55fea89dSDan Cross * This file is part of RSTP library. 7*55fea89dSDan Cross * 8*55fea89dSDan Cross * RSTP library is free software; you can redistribute it and/or modify it 9*55fea89dSDan Cross * under the terms of the GNU Lesser General Public License as published by the 10*55fea89dSDan Cross * Free Software Foundation; version 2.1 11*55fea89dSDan Cross * 12*55fea89dSDan Cross * RSTP library is distributed in the hope that it will be useful, but 13*55fea89dSDan Cross * WITHOUT ANY WARRANTY; without even the implied warranty of 14*55fea89dSDan Cross * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 15*55fea89dSDan Cross * General Public License for more details. 16*55fea89dSDan Cross * 17*55fea89dSDan Cross * You should have received a copy of the GNU Lesser General Public License 18*55fea89dSDan Cross * along with RSTP library; see the file COPYING. If not, write to the Free 19*55fea89dSDan Cross * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20*55fea89dSDan Cross * 02111-1307, USA. 214eaa4710SRishi Srivatsavai **********************************************************************/ 224eaa4710SRishi Srivatsavai 234eaa4710SRishi Srivatsavai /* This file contains prototypes for API from an operation 244eaa4710SRishi Srivatsavai system to the RSTP */ 25*55fea89dSDan Cross 264eaa4710SRishi Srivatsavai #ifndef _STP_API_H__ 274eaa4710SRishi Srivatsavai #define _STP_API_H__ 284eaa4710SRishi Srivatsavai 294eaa4710SRishi Srivatsavai #include <sys/types.h> 304eaa4710SRishi Srivatsavai 314eaa4710SRishi Srivatsavai #define STP_DBG 1 324eaa4710SRishi Srivatsavai 334eaa4710SRishi Srivatsavai /************************ 344eaa4710SRishi Srivatsavai * Common base constants 354eaa4710SRishi Srivatsavai ************************/ 364eaa4710SRishi Srivatsavai 374eaa4710SRishi Srivatsavai #ifndef INOUT 384eaa4710SRishi Srivatsavai # define IN /* consider as comments near 'input' parameters */ 394eaa4710SRishi Srivatsavai # define OUT /* consider as comments near 'output' parameters */ 404eaa4710SRishi Srivatsavai # define INOUT /* consider as comments near 'input/output' parameters */ 414eaa4710SRishi Srivatsavai #endif 424eaa4710SRishi Srivatsavai 434eaa4710SRishi Srivatsavai #ifndef Zero 444eaa4710SRishi Srivatsavai # define Zero 0 454eaa4710SRishi Srivatsavai # define One 1 464eaa4710SRishi Srivatsavai #endif 474eaa4710SRishi Srivatsavai 484eaa4710SRishi Srivatsavai #ifndef Bool 494eaa4710SRishi Srivatsavai # define Bool int 504eaa4710SRishi Srivatsavai # define False 0 514eaa4710SRishi Srivatsavai # define True 1 524eaa4710SRishi Srivatsavai #endif 534eaa4710SRishi Srivatsavai 544eaa4710SRishi Srivatsavai /******************************************** 554eaa4710SRishi Srivatsavai * constants: default values and linitations 564eaa4710SRishi Srivatsavai *********************************************/ 57*55fea89dSDan Cross 584eaa4710SRishi Srivatsavai /* bridge configuration */ 594eaa4710SRishi Srivatsavai 604eaa4710SRishi Srivatsavai #define DEF_BR_PRIO 32768 614eaa4710SRishi Srivatsavai #define MIN_BR_PRIO 0 624eaa4710SRishi Srivatsavai #define MAX_BR_PRIO 61440 634eaa4710SRishi Srivatsavai 644eaa4710SRishi Srivatsavai #define DEF_BR_HELLOT 2 654eaa4710SRishi Srivatsavai #define MIN_BR_HELLOT 1 664eaa4710SRishi Srivatsavai #define MAX_BR_HELLOT 10 674eaa4710SRishi Srivatsavai 684eaa4710SRishi Srivatsavai #define DEF_BR_MAXAGE 20 694eaa4710SRishi Srivatsavai #define MIN_BR_MAXAGE 6 704eaa4710SRishi Srivatsavai #define MAX_BR_MAXAGE 40 714eaa4710SRishi Srivatsavai 724eaa4710SRishi Srivatsavai #define DEF_BR_FWDELAY 15 734eaa4710SRishi Srivatsavai #define MIN_BR_FWDELAY 4 744eaa4710SRishi Srivatsavai #define MAX_BR_FWDELAY 30 754eaa4710SRishi Srivatsavai 764eaa4710SRishi Srivatsavai #define IEEE_TIMER_SCALE 256 774eaa4710SRishi Srivatsavai 784eaa4710SRishi Srivatsavai /* Note that this works with unscaled values */ 794eaa4710SRishi Srivatsavai #define CHECK_BRIDGE_CONFIG(cfg) \ 804eaa4710SRishi Srivatsavai (2 * (cfg.forward_delay - 1) >= cfg.max_age && \ 814eaa4710SRishi Srivatsavai cfg.max_age >= 2 * (cfg.hello_time + 1)) 824eaa4710SRishi Srivatsavai 834eaa4710SRishi Srivatsavai /* 844eaa4710SRishi Srivatsavai * These macros provide limits and tests for displaying comprehensible errors. 854eaa4710SRishi Srivatsavai */ 864eaa4710SRishi Srivatsavai #define NO_MAXAGE(cfg) ((cfg.forward_delay - 1) < (cfg.hello_time + 1)) 874eaa4710SRishi Srivatsavai #define MIN_FWDELAY_NOM(cfg) \ 884eaa4710SRishi Srivatsavai (cfg.hello_time < MIN_BR_FWDELAY - 2 ? MIN_BR_FWDELAY : \ 894eaa4710SRishi Srivatsavai cfg.hello_time + 2) 904eaa4710SRishi Srivatsavai #define MAX_HELLOTIME_NOM(cfg) \ 914eaa4710SRishi Srivatsavai (cfg.forward_delay > MAX_BR_HELLOT + 2 ? MAX_BR_HELLOT : \ 924eaa4710SRishi Srivatsavai cfg.forward_delay - 2) 934eaa4710SRishi Srivatsavai 944eaa4710SRishi Srivatsavai #define SMALL_MAXAGE(cfg) (cfg.max_age < 2 * (cfg.hello_time + 1)) 954eaa4710SRishi Srivatsavai #define MIN_MAXAGE(cfg) \ 964eaa4710SRishi Srivatsavai (cfg.hello_time < (MIN_BR_MAXAGE / 2 - 1) ? MIN_BR_MAXAGE : \ 974eaa4710SRishi Srivatsavai (2 * (cfg.hello_time + 1))) 984eaa4710SRishi Srivatsavai #define MAX_HELLOTIME(cfg) \ 994eaa4710SRishi Srivatsavai (cfg.max_age > 2 * (MAX_BR_HELLOT + 1) ? MAX_BR_HELLOT : \ 1004eaa4710SRishi Srivatsavai (cfg.max_age / 2 - 1)) 1014eaa4710SRishi Srivatsavai 1024eaa4710SRishi Srivatsavai #define MIN_FWDELAY(cfg) (cfg.max_age / 2 + 1) 1034eaa4710SRishi Srivatsavai #define MAX_MAXAGE(cfg) \ 1044eaa4710SRishi Srivatsavai (cfg.forward_delay > (MAX_BR_MAXAGE / 2 + 1) ? MAX_BR_MAXAGE : \ 1054eaa4710SRishi Srivatsavai (2 * (cfg.forward_delay - 1))) 1064eaa4710SRishi Srivatsavai 1074eaa4710SRishi Srivatsavai #define CAPPED_MAXAGE(cfg) (cfg.forward_delay < (MAX_BR_MAXAGE / 2 + 1)) 1084eaa4710SRishi Srivatsavai #define FLOORED_MAXAGE(cfg) (cfg.hello_time > (MIN_BR_MAXAGE / 2 - 1)) 1094eaa4710SRishi Srivatsavai 1104eaa4710SRishi Srivatsavai #define DEF_FORCE_VERS 2 /* NORMAL_RSTP */ 1114eaa4710SRishi Srivatsavai 1124eaa4710SRishi Srivatsavai /* port configuration */ 1134eaa4710SRishi Srivatsavai 1144eaa4710SRishi Srivatsavai #define DEF_PORT_PRIO 128 1154eaa4710SRishi Srivatsavai #define MIN_PORT_PRIO 0 1164eaa4710SRishi Srivatsavai #define MAX_PORT_PRIO 240 /* in steps of 16 */ 1174eaa4710SRishi Srivatsavai 1184eaa4710SRishi Srivatsavai #define DEF_ADMIN_NON_STP False 1194eaa4710SRishi Srivatsavai #define DEF_ADMIN_EDGE True 1204eaa4710SRishi Srivatsavai #define DEF_LINK_DELAY 3 /* see edge.c */ 1214eaa4710SRishi Srivatsavai #define DEF_P2P P2P_AUTO 1224eaa4710SRishi Srivatsavai 1234eaa4710SRishi Srivatsavai #include <uid_stp.h> 1244eaa4710SRishi Srivatsavai #include <stp_bpdu.h> 1254eaa4710SRishi Srivatsavai 1264eaa4710SRishi Srivatsavai #ifndef __STPM_T__ 1274eaa4710SRishi Srivatsavai #define __STPM_T__ 1284eaa4710SRishi Srivatsavai struct stpm_t; 1294eaa4710SRishi Srivatsavai typedef struct stpm_t STPM_T; 1304eaa4710SRishi Srivatsavai #endif 1314eaa4710SRishi Srivatsavai #ifndef __STP_VECTORS_T__ 1324eaa4710SRishi Srivatsavai #define __STP_VECTORS_T__ 1334eaa4710SRishi Srivatsavai struct stp_vectors; 1344eaa4710SRishi Srivatsavai typedef struct stp_vectors STP_VECTORS_T; 1354eaa4710SRishi Srivatsavai #endif 1364eaa4710SRishi Srivatsavai 1374eaa4710SRishi Srivatsavai /* Section 1: Create/Delete/Start/Stop the RSTP instance */ 1384eaa4710SRishi Srivatsavai 1394eaa4710SRishi Srivatsavai void /* init the engine */ 1404eaa4710SRishi Srivatsavai STP_IN_init (STP_VECTORS_T *vectors); 1414eaa4710SRishi Srivatsavai 1424eaa4710SRishi Srivatsavai int 1434eaa4710SRishi Srivatsavai STP_IN_stpm_create (int vlan_id, char* name); 1444eaa4710SRishi Srivatsavai 1454eaa4710SRishi Srivatsavai int 1464eaa4710SRishi Srivatsavai STP_IN_stpm_delete (int vlan_id); 1474eaa4710SRishi Srivatsavai 1484eaa4710SRishi Srivatsavai int 1494eaa4710SRishi Srivatsavai STP_IN_port_add (int vlan_id, int port_index); 1504eaa4710SRishi Srivatsavai 1514eaa4710SRishi Srivatsavai int 1524eaa4710SRishi Srivatsavai STP_IN_port_remove (int vlan_id, int port_index); 1534eaa4710SRishi Srivatsavai 1544eaa4710SRishi Srivatsavai int 1554eaa4710SRishi Srivatsavai STP_IN_stop_all (void); 1564eaa4710SRishi Srivatsavai 1574eaa4710SRishi Srivatsavai int 1584eaa4710SRishi Srivatsavai STP_IN_delete_all (void); 1594eaa4710SRishi Srivatsavai 1604eaa4710SRishi Srivatsavai /* Section 2. "Get" management */ 1614eaa4710SRishi Srivatsavai 1624eaa4710SRishi Srivatsavai Bool 1634eaa4710SRishi Srivatsavai STP_IN_get_is_stpm_enabled (int vlan_id); 1644eaa4710SRishi Srivatsavai 1654eaa4710SRishi Srivatsavai int 1664eaa4710SRishi Srivatsavai STP_IN_stpm_get_vlan_id_by_name (char* name, int* vlan_id); 1674eaa4710SRishi Srivatsavai 1684eaa4710SRishi Srivatsavai int 1694eaa4710SRishi Srivatsavai STP_IN_stpm_get_name_by_vlan_id (int vlan_id, char* name, size_t buffsize); 1704eaa4710SRishi Srivatsavai 1714eaa4710SRishi Srivatsavai const char* 1724eaa4710SRishi Srivatsavai STP_IN_get_error_explanation (int rstp_err_no); 1734eaa4710SRishi Srivatsavai 1744eaa4710SRishi Srivatsavai int 1754eaa4710SRishi Srivatsavai STP_IN_stpm_get_cfg (int vlan_id, UID_STP_CFG_T* uid_cfg); 1764eaa4710SRishi Srivatsavai 1774eaa4710SRishi Srivatsavai int 1784eaa4710SRishi Srivatsavai STP_IN_stpm_get_state (int vlan_id, UID_STP_STATE_T* entry); 1794eaa4710SRishi Srivatsavai 1804eaa4710SRishi Srivatsavai int 1814eaa4710SRishi Srivatsavai STP_IN_port_get_cfg (int vlan_id, int port_index, UID_STP_PORT_CFG_T* uid_cfg); 1824eaa4710SRishi Srivatsavai 1834eaa4710SRishi Srivatsavai int 1844eaa4710SRishi Srivatsavai STP_IN_port_get_state (int vlan_id, UID_STP_PORT_STATE_T* entry); 1854eaa4710SRishi Srivatsavai 1864eaa4710SRishi Srivatsavai const char * 1874eaa4710SRishi Srivatsavai STP_IN_state2str(RSTP_PORT_STATE); 1884eaa4710SRishi Srivatsavai 1894eaa4710SRishi Srivatsavai /* Section 3. "Set" management */ 1904eaa4710SRishi Srivatsavai 1914eaa4710SRishi Srivatsavai int 1924eaa4710SRishi Srivatsavai STP_IN_stpm_set_cfg (int vlan_id, 1934eaa4710SRishi Srivatsavai UID_STP_CFG_T* uid_cfg); 1944eaa4710SRishi Srivatsavai 1954eaa4710SRishi Srivatsavai int 1964eaa4710SRishi Srivatsavai STP_IN_port_set_cfg (int vlan_id, int port_index, 1974eaa4710SRishi Srivatsavai UID_STP_PORT_CFG_T* uid_cfg); 1984eaa4710SRishi Srivatsavai 1994eaa4710SRishi Srivatsavai #ifdef STP_DBG 2004eaa4710SRishi Srivatsavai int STP_IN_dbg_set_port_trace (char *mach_name, int enadis, 2014eaa4710SRishi Srivatsavai int vlan_id, int port_index); 2024eaa4710SRishi Srivatsavai #endif 2034eaa4710SRishi Srivatsavai 2044eaa4710SRishi Srivatsavai /* Section 4. RSTP functionality events */ 2054eaa4710SRishi Srivatsavai 206*55fea89dSDan Cross int 2074eaa4710SRishi Srivatsavai STP_IN_one_second (void); 2084eaa4710SRishi Srivatsavai 2094eaa4710SRishi Srivatsavai int /* for Link UP/DOWN */ 2104eaa4710SRishi Srivatsavai STP_IN_enable_port (int port_index, Bool enable); 2114eaa4710SRishi Srivatsavai 2124eaa4710SRishi Srivatsavai int /* call it, when port speed has been changed, speed in Kb/s */ 2134eaa4710SRishi Srivatsavai STP_IN_changed_port_speed (int port_index, long speed); 2144eaa4710SRishi Srivatsavai 2154eaa4710SRishi Srivatsavai int /* call it, when current port duplex mode has been changed */ 2164eaa4710SRishi Srivatsavai STP_IN_changed_port_duplex (int port_index); 2174eaa4710SRishi Srivatsavai 2184eaa4710SRishi Srivatsavai int 2194eaa4710SRishi Srivatsavai STP_IN_check_bpdu_header (BPDU_T* bpdu, size_t len); 2204eaa4710SRishi Srivatsavai 2214eaa4710SRishi Srivatsavai int 2224eaa4710SRishi Srivatsavai STP_IN_rx_bpdu (int vlan_id, int port_index, BPDU_T* bpdu, size_t len); 2234eaa4710SRishi Srivatsavai 2244eaa4710SRishi Srivatsavai void 2254eaa4710SRishi Srivatsavai STP_IN_get_bridge_id(int vlan_id, unsigned short *priority, unsigned char *mac); 2264eaa4710SRishi Srivatsavai 2274eaa4710SRishi Srivatsavai #endif /* _STP_API_H__ */ 228