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 /* STP PORT instance : 17.18, 17.15 */ 24*55fea89dSDan Cross 254eaa4710SRishi Srivatsavai #ifndef _STP_PORT_H__ 264eaa4710SRishi Srivatsavai #define _STP_PORT_H__ 274eaa4710SRishi Srivatsavai 284eaa4710SRishi Srivatsavai #include "statmch.h" 294eaa4710SRishi Srivatsavai 304eaa4710SRishi Srivatsavai #define TIMERS_NUMBER 9 314eaa4710SRishi Srivatsavai typedef unsigned int PORT_TIMER_T; 324eaa4710SRishi Srivatsavai 334eaa4710SRishi Srivatsavai typedef enum { 344eaa4710SRishi Srivatsavai Mine, 354eaa4710SRishi Srivatsavai Aged, 364eaa4710SRishi Srivatsavai Received, 374eaa4710SRishi Srivatsavai Disabled 384eaa4710SRishi Srivatsavai } INFO_IS_T; 394eaa4710SRishi Srivatsavai 404eaa4710SRishi Srivatsavai typedef enum { 414eaa4710SRishi Srivatsavai SuperiorDesignateMsg, 424eaa4710SRishi Srivatsavai RepeatedDesignateMsg, 434eaa4710SRishi Srivatsavai ConfirmedRootMsg, 444eaa4710SRishi Srivatsavai OtherMsg 454eaa4710SRishi Srivatsavai } RCVD_MSG_T; 464eaa4710SRishi Srivatsavai 474eaa4710SRishi Srivatsavai typedef enum { 484eaa4710SRishi Srivatsavai DisabledPort = 0, 494eaa4710SRishi Srivatsavai AlternatePort, 504eaa4710SRishi Srivatsavai BackupPort, 514eaa4710SRishi Srivatsavai RootPort, 524eaa4710SRishi Srivatsavai DesignatedPort, 534eaa4710SRishi Srivatsavai NonStpPort 544eaa4710SRishi Srivatsavai } PORT_ROLE_T; 554eaa4710SRishi Srivatsavai 564eaa4710SRishi Srivatsavai typedef struct port_t { 574eaa4710SRishi Srivatsavai struct port_t* next; 584eaa4710SRishi Srivatsavai 594eaa4710SRishi Srivatsavai /* per Port state machines */ 604eaa4710SRishi Srivatsavai STATE_MACH_T* info; /* 17.21 */ 614eaa4710SRishi Srivatsavai STATE_MACH_T* roletrns; /* 17.23 */ 624eaa4710SRishi Srivatsavai STATE_MACH_T* sttrans; /* 17.24 */ 634eaa4710SRishi Srivatsavai STATE_MACH_T* topoch; /* 17.25 */ 644eaa4710SRishi Srivatsavai STATE_MACH_T* migrate; /* 17.26 */ 654eaa4710SRishi Srivatsavai STATE_MACH_T* transmit; /* 17.26 */ 664eaa4710SRishi Srivatsavai STATE_MACH_T* p2p; /* 6.4.3, 6.5.1 */ 674eaa4710SRishi Srivatsavai STATE_MACH_T* edge; /* */ 684eaa4710SRishi Srivatsavai STATE_MACH_T* pcost; /* */ 694eaa4710SRishi Srivatsavai 704eaa4710SRishi Srivatsavai STATE_MACH_T* machines; /* list of machines */ 714eaa4710SRishi Srivatsavai 724eaa4710SRishi Srivatsavai struct stpm_t* owner; /* Bridge, that this port belongs to */ 73*55fea89dSDan Cross 744eaa4710SRishi Srivatsavai /* per port Timers */ 754eaa4710SRishi Srivatsavai PORT_TIMER_T fdWhile; /* 17.15.1 */ 764eaa4710SRishi Srivatsavai PORT_TIMER_T helloWhen; /* 17.15.2 */ 774eaa4710SRishi Srivatsavai PORT_TIMER_T mdelayWhile; /* 17.15.3 */ 784eaa4710SRishi Srivatsavai PORT_TIMER_T rbWhile; /* 17.15.4 */ 794eaa4710SRishi Srivatsavai PORT_TIMER_T rcvdInfoWhile;/* 17.15.5 */ 804eaa4710SRishi Srivatsavai PORT_TIMER_T rrWhile; /* 17.15.6 */ 814eaa4710SRishi Srivatsavai PORT_TIMER_T tcWhile; /* 17.15.7 */ 824eaa4710SRishi Srivatsavai PORT_TIMER_T txCount; /* 17.18.40 */ 834eaa4710SRishi Srivatsavai PORT_TIMER_T lnkWhile; 844eaa4710SRishi Srivatsavai 854eaa4710SRishi Srivatsavai PORT_TIMER_T* timers[TIMERS_NUMBER]; /*list of timers */ 864eaa4710SRishi Srivatsavai 874eaa4710SRishi Srivatsavai Bool agreed; /* 17.18.1 */ 884eaa4710SRishi Srivatsavai PRIO_VECTOR_T designPrio; /* 17.18.2 */ 894eaa4710SRishi Srivatsavai TIMEVALUES_T designTimes; /* 17.18.3 */ 904eaa4710SRishi Srivatsavai Bool forward; /* 17.18.4 */ 914eaa4710SRishi Srivatsavai Bool forwarding; /* 17.18.5 */ 924eaa4710SRishi Srivatsavai INFO_IS_T infoIs; /* 17.18.6 */ 934eaa4710SRishi Srivatsavai Bool initPm; /* 17.18.7 */ 944eaa4710SRishi Srivatsavai Bool learn; /* 17.18.8 */ 954eaa4710SRishi Srivatsavai Bool learning; /* 17.18.9 */ 964eaa4710SRishi Srivatsavai Bool mcheck; /* 17.18.10 */ 974eaa4710SRishi Srivatsavai PRIO_VECTOR_T msgPrio; /* 17.18.11 */ 984eaa4710SRishi Srivatsavai TIMEVALUES_T msgTimes; /* 17.18.12 */ 994eaa4710SRishi Srivatsavai Bool newInfo; /* 17.18.13 */ 1004eaa4710SRishi Srivatsavai Bool operEdge; /* 17.18.14 */ 1014eaa4710SRishi Srivatsavai Bool adminEdge; /* 17.18.14 */ 1024eaa4710SRishi Srivatsavai Bool portEnabled; /* 17.18.15 */ 1034eaa4710SRishi Srivatsavai PORT_ID port_id; /* 17.18.16 */ 1044eaa4710SRishi Srivatsavai PRIO_VECTOR_T portPrio; /* 17.18.17 */ 1054eaa4710SRishi Srivatsavai TIMEVALUES_T portTimes; /* 17.18.18 */ 1064eaa4710SRishi Srivatsavai Bool proposed; /* 17.18.19 */ 1074eaa4710SRishi Srivatsavai Bool proposing; /* 17.18.20 */ 1084eaa4710SRishi Srivatsavai Bool rcvdBpdu; /* 17.18.21 */ 1094eaa4710SRishi Srivatsavai RCVD_MSG_T rcvdMsg; /* 17.18.22 */ 1104eaa4710SRishi Srivatsavai Bool rcvdRSTP; /* 17/18.23 */ 1114eaa4710SRishi Srivatsavai Bool rcvdSTP; /* 17.18.24 */ 1124eaa4710SRishi Srivatsavai Bool rcvdTc; /* 17.18.25 */ 1134eaa4710SRishi Srivatsavai Bool rcvdTcAck; /* 17.18.26 */ 1144eaa4710SRishi Srivatsavai Bool rcvdTcn; /* 17.18.27 */ 1154eaa4710SRishi Srivatsavai Bool reRoot; /* 17.18.28 */ 1164eaa4710SRishi Srivatsavai Bool reselect; /* 17.18.29 */ 1174eaa4710SRishi Srivatsavai PORT_ROLE_T role; /* 17.18.30 */ 1184eaa4710SRishi Srivatsavai Bool selected; /* 17.18.31 */ 1194eaa4710SRishi Srivatsavai PORT_ROLE_T selectedRole; /* 17.18.32 */ 1204eaa4710SRishi Srivatsavai Bool sendRSTP; /* 17.18.33 */ 1214eaa4710SRishi Srivatsavai Bool sync; /* 17.18.34 */ 1224eaa4710SRishi Srivatsavai Bool synced; /* 17.18.35 */ 1234eaa4710SRishi Srivatsavai Bool tc; /* 17.18.36 */ 1244eaa4710SRishi Srivatsavai Bool tcAck; /* 17.18.37 */ 1254eaa4710SRishi Srivatsavai Bool tcProp; /* 17.18.38 */ 1264eaa4710SRishi Srivatsavai 1274eaa4710SRishi Srivatsavai Bool updtInfo; /* 17.18.41 */ 1284eaa4710SRishi Srivatsavai 1294eaa4710SRishi Srivatsavai /* message information */ 1304eaa4710SRishi Srivatsavai unsigned char msgBpduVersion; 1314eaa4710SRishi Srivatsavai unsigned char msgBpduType; 1324eaa4710SRishi Srivatsavai unsigned char msgPortRole; 1334eaa4710SRishi Srivatsavai unsigned char msgFlags; 1344eaa4710SRishi Srivatsavai 1354eaa4710SRishi Srivatsavai unsigned long adminPCost; /* may be ADMIN_PORT_PATH_COST_AUTO */ 1364eaa4710SRishi Srivatsavai unsigned long operPCost; 1374eaa4710SRishi Srivatsavai unsigned long operSpeed; 1384eaa4710SRishi Srivatsavai unsigned long usedSpeed; 1394eaa4710SRishi Srivatsavai int LinkDelay; /* TBD: LinkDelay may be managed ? */ 1404eaa4710SRishi Srivatsavai Bool adminEnable; /* 'has LINK' */ 141*55fea89dSDan Cross Bool wasInitBpdu; 1424eaa4710SRishi Srivatsavai Bool admin_non_stp; 1434eaa4710SRishi Srivatsavai 1444eaa4710SRishi Srivatsavai Bool p2p_recompute; 1454eaa4710SRishi Srivatsavai Bool operPointToPointMac; 1464eaa4710SRishi Srivatsavai ADMIN_P2P_T adminPointToPointMac; 1474eaa4710SRishi Srivatsavai 1484eaa4710SRishi Srivatsavai /* statistics */ 1494eaa4710SRishi Srivatsavai unsigned long rx_cfg_bpdu_cnt; 1504eaa4710SRishi Srivatsavai unsigned long rx_rstp_bpdu_cnt; 1514eaa4710SRishi Srivatsavai unsigned long rx_tcn_bpdu_cnt; 1524eaa4710SRishi Srivatsavai 1534eaa4710SRishi Srivatsavai unsigned long uptime; /* 14.8.2.1.3.a */ 1544eaa4710SRishi Srivatsavai 1554eaa4710SRishi Srivatsavai int port_index; 1564eaa4710SRishi Srivatsavai char* port_name; 1574eaa4710SRishi Srivatsavai 1584eaa4710SRishi Srivatsavai #ifdef STP_DBG 1594eaa4710SRishi Srivatsavai unsigned int skip_rx; 1604eaa4710SRishi Srivatsavai unsigned int skip_tx; 1614eaa4710SRishi Srivatsavai #endif 1624eaa4710SRishi Srivatsavai } PORT_T; 1634eaa4710SRishi Srivatsavai 1644eaa4710SRishi Srivatsavai PORT_T* 1654eaa4710SRishi Srivatsavai STP_port_create (struct stpm_t* stpm, int port_index); 1664eaa4710SRishi Srivatsavai 1674eaa4710SRishi Srivatsavai void 1684eaa4710SRishi Srivatsavai STP_port_delete (PORT_T* this); 1694eaa4710SRishi Srivatsavai 1704eaa4710SRishi Srivatsavai int 1714eaa4710SRishi Srivatsavai STP_port_rx_bpdu (PORT_T* this, BPDU_T* bpdu, size_t len); 1724eaa4710SRishi Srivatsavai 1734eaa4710SRishi Srivatsavai void 1744eaa4710SRishi Srivatsavai STP_port_init (PORT_T* this, struct stpm_t* stpm, Bool check_link); 1754eaa4710SRishi Srivatsavai 1764eaa4710SRishi Srivatsavai #ifdef STP_DBG 1774eaa4710SRishi Srivatsavai int 1784eaa4710SRishi Srivatsavai STP_port_trace_state_machine (PORT_T* this, char* mach_name, int enadis); 1794eaa4710SRishi Srivatsavai 1804eaa4710SRishi Srivatsavai void 1814eaa4710SRishi Srivatsavai STP_port_trace_flags (char* title, PORT_T* this); 1824eaa4710SRishi Srivatsavai #endif 1834eaa4710SRishi Srivatsavai 1844eaa4710SRishi Srivatsavai #endif /* _STP_PORT_H__ */ 1854eaa4710SRishi Srivatsavai 186