xref: /illumos-gate/usr/src/lib/librstp/common/port.h (revision 55fea89d)
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