xref: /illumos-gate/usr/src/lib/librstp/common/base.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 /* Mutual RSTP definitions */
24*55fea89dSDan Cross 
254eaa4710SRishi Srivatsavai #ifndef _STP_BASE_H__
264eaa4710SRishi Srivatsavai #define _STP_BASE_H__
274eaa4710SRishi Srivatsavai 
284eaa4710SRishi Srivatsavai #include <stdlib.h>
294eaa4710SRishi Srivatsavai #include <string.h>
304eaa4710SRishi Srivatsavai 
314eaa4710SRishi Srivatsavai #define STP_DBG 1
324eaa4710SRishi Srivatsavai 
334eaa4710SRishi Srivatsavai #if defined(__LINUX__) || defined(__SUN__)
344eaa4710SRishi Srivatsavai #  include <stddef.h>
354eaa4710SRishi Srivatsavai #  include <stdio.h>
364eaa4710SRishi Srivatsavai #  include <netinet/in.h>
374eaa4710SRishi Srivatsavai #  include "uid_stp.h"
384eaa4710SRishi Srivatsavai #else
394eaa4710SRishi Srivatsavai #  include <psos.h>
404eaa4710SRishi Srivatsavai #  include "comdef.h"
41*55fea89dSDan Cross #  include "comdef.x"
424eaa4710SRishi Srivatsavai #  include "Bitmap/bitmap.h"
434eaa4710SRishi Srivatsavai #  include "Bitmap/bitmap.x"
444eaa4710SRishi Srivatsavai #  include "Ui/uid_stp.h"
454eaa4710SRishi Srivatsavai #endif
464eaa4710SRishi Srivatsavai 
474eaa4710SRishi Srivatsavai #ifndef INOUT
484eaa4710SRishi Srivatsavai #  define IN      /* consider as comments near 'input' parameters */
494eaa4710SRishi Srivatsavai #  define OUT     /* consider as comments near 'output' parameters */
504eaa4710SRishi Srivatsavai #  define INOUT   /* consider as comments near 'input/output' parameters */
514eaa4710SRishi Srivatsavai #endif
524eaa4710SRishi Srivatsavai 
534eaa4710SRishi Srivatsavai #ifndef Zero
544eaa4710SRishi Srivatsavai #  define Zero        0
554eaa4710SRishi Srivatsavai #  define One         1
564eaa4710SRishi Srivatsavai #endif
574eaa4710SRishi Srivatsavai 
584eaa4710SRishi Srivatsavai #ifndef Bool
594eaa4710SRishi Srivatsavai #  define Bool        int
604eaa4710SRishi Srivatsavai #  define False       0
614eaa4710SRishi Srivatsavai #  define True        1
624eaa4710SRishi Srivatsavai #endif
634eaa4710SRishi Srivatsavai 
644eaa4710SRishi Srivatsavai #include "stp_bpdu.h"
654eaa4710SRishi Srivatsavai #include "vector.h"
664eaa4710SRishi Srivatsavai #include "times.h"
674eaa4710SRishi Srivatsavai 
684eaa4710SRishi Srivatsavai #define RSTP_ERRORS { \
694eaa4710SRishi Srivatsavai   CHOOSE(STP_OK),                                       \
704eaa4710SRishi Srivatsavai   CHOOSE(STP_Cannot_Find_Vlan),         \
714eaa4710SRishi Srivatsavai   CHOOSE(STP_Implicit_Instance_Create_Failed),          \
724eaa4710SRishi Srivatsavai   CHOOSE(STP_Small_Bridge_Priority),                    \
734eaa4710SRishi Srivatsavai   CHOOSE(STP_Large_Bridge_Priority),                    \
744eaa4710SRishi Srivatsavai   CHOOSE(STP_Small_Hello_Time),                         \
754eaa4710SRishi Srivatsavai   CHOOSE(STP_Large_Hello_Time),                         \
764eaa4710SRishi Srivatsavai   CHOOSE(STP_Small_Max_Age),                            \
774eaa4710SRishi Srivatsavai   CHOOSE(STP_Large_Max_Age),                            \
784eaa4710SRishi Srivatsavai   CHOOSE(STP_Small_Forward_Delay),                      \
794eaa4710SRishi Srivatsavai   CHOOSE(STP_Large_Forward_Delay),                      \
804eaa4710SRishi Srivatsavai   CHOOSE(STP_Forward_Delay_And_Max_Age_Are_Inconsistent),\
814eaa4710SRishi Srivatsavai   CHOOSE(STP_Hello_Time_And_Max_Age_Are_Inconsistent),  \
824eaa4710SRishi Srivatsavai   CHOOSE(STP_Vlan_Had_Not_Yet_Been_Created),            \
834eaa4710SRishi Srivatsavai   CHOOSE(STP_Port_Is_Absent_In_The_Vlan),               \
844eaa4710SRishi Srivatsavai   CHOOSE(STP_Big_len8023_Format),                       \
854eaa4710SRishi Srivatsavai   CHOOSE(STP_Small_len8023_Format),                     \
864eaa4710SRishi Srivatsavai   CHOOSE(STP_len8023_Format_Gt_Len),                    \
874eaa4710SRishi Srivatsavai   CHOOSE(STP_Not_Proper_802_3_Packet),                  \
884eaa4710SRishi Srivatsavai   CHOOSE(STP_Invalid_Protocol),                         \
894eaa4710SRishi Srivatsavai   CHOOSE(STP_Invalid_Version),                          \
904eaa4710SRishi Srivatsavai   CHOOSE(STP_Had_Not_Yet_Been_Enabled_On_The_Vlan),     \
914eaa4710SRishi Srivatsavai   CHOOSE(STP_Cannot_Create_Instance_For_Vlan),          \
924eaa4710SRishi Srivatsavai   CHOOSE(STP_Cannot_Create_Instance_For_Port),          \
934eaa4710SRishi Srivatsavai   CHOOSE(STP_Invalid_Bridge_Priority),                  \
944eaa4710SRishi Srivatsavai   CHOOSE(STP_There_Are_No_Ports),                       \
954eaa4710SRishi Srivatsavai   CHOOSE(STP_Cannot_Compute_Bridge_Prio),               \
964eaa4710SRishi Srivatsavai   CHOOSE(STP_Another_Error),                            \
974eaa4710SRishi Srivatsavai   CHOOSE(STP_Nothing_To_Do),                            \
984eaa4710SRishi Srivatsavai   CHOOSE(STP_No_Such_State_Machine),                    \
994eaa4710SRishi Srivatsavai   CHOOSE(STP_LAST_DUMMY)                                \
1004eaa4710SRishi Srivatsavai }
1014eaa4710SRishi Srivatsavai 
1024eaa4710SRishi Srivatsavai #define CHOOSE(a) a
1034eaa4710SRishi Srivatsavai typedef enum RSTP_ERRORS RSTP_ERRORS_T;
1044eaa4710SRishi Srivatsavai #undef CHOOSE
1054eaa4710SRishi Srivatsavai 
1064eaa4710SRishi Srivatsavai #if !defined(__LINUX__) && !defined(__SUN__)
1074eaa4710SRishi Srivatsavai extern char* strdup (const char *s);
1084eaa4710SRishi Srivatsavai 
109*55fea89dSDan Cross extern USHORT Ntohs (USHORT n);
110*55fea89dSDan Cross extern ULONG Htonl (ULONG h);
1114eaa4710SRishi Srivatsavai extern USHORT Htons (USHORT h);
1124eaa4710SRishi Srivatsavai extern ULONG Ntohl (ULONG n);
1134eaa4710SRishi Srivatsavai 
1144eaa4710SRishi Srivatsavai #define htonl Htonl
1154eaa4710SRishi Srivatsavai #define htons Htons
1164eaa4710SRishi Srivatsavai #define ntohl Ntohl
1174eaa4710SRishi Srivatsavai #define ntohs Ntohs
1184eaa4710SRishi Srivatsavai 
1194eaa4710SRishi Srivatsavai #endif
1204eaa4710SRishi Srivatsavai 
1214eaa4710SRishi Srivatsavai #if defined(__LINUX__) || defined(__SUN__)
1224eaa4710SRishi Srivatsavai #ifdef STP_DBG
1234eaa4710SRishi Srivatsavai #define STP_FATAL(TXT, MSG, EXCOD)                      \
1244eaa4710SRishi Srivatsavai       {stp_trace ("FATAL:%s failed: %s:%d", TXT, MSG, EXCOD);  \
1254eaa4710SRishi Srivatsavai       exit (EXCOD);}
1264eaa4710SRishi Srivatsavai #else
1274eaa4710SRishi Srivatsavai #define STP_FATAL(TXT, MSG, EXCOD)                      \
1284eaa4710SRishi Srivatsavai       abort();
1294eaa4710SRishi Srivatsavai #endif
1304eaa4710SRishi Srivatsavai #else
1314eaa4710SRishi Srivatsavai #define STP_FATAL(TXT, MSG, EXCOD)                      \
1324eaa4710SRishi Srivatsavai       printf("FATAL: %s code %s:%d\n", TXT, MSG, EXCOD)
1334eaa4710SRishi Srivatsavai #endif
1344eaa4710SRishi Srivatsavai 
1354eaa4710SRishi Srivatsavai #define STP_MALLOC(PTR, TYPE, MSG)              \
1364eaa4710SRishi Srivatsavai   {                                             \
1374eaa4710SRishi Srivatsavai     PTR = (TYPE*) calloc (1, sizeof (TYPE));    \
1384eaa4710SRishi Srivatsavai     if (! PTR) {                                \
1394eaa4710SRishi Srivatsavai       STP_FATAL("malloc", MSG, -6);             \
1404eaa4710SRishi Srivatsavai     }                                           \
1414eaa4710SRishi Srivatsavai   }
1424eaa4710SRishi Srivatsavai 
1434eaa4710SRishi Srivatsavai #define STP_FREE(PTR, MSG)              \
1444eaa4710SRishi Srivatsavai   {                                     \
1454eaa4710SRishi Srivatsavai     if (! PTR) {                        \
1464eaa4710SRishi Srivatsavai       STP_FATAL("free", MSG, -66);      \
1474eaa4710SRishi Srivatsavai     }                                   \
1484eaa4710SRishi Srivatsavai     free (PTR);                         \
1494eaa4710SRishi Srivatsavai     PTR = NULL;                         \
1504eaa4710SRishi Srivatsavai   }
1514eaa4710SRishi Srivatsavai 
1524eaa4710SRishi Srivatsavai #define STP_STRDUP(PTR, SRC, MSG)       \
1534eaa4710SRishi Srivatsavai   {                                     \
1544eaa4710SRishi Srivatsavai     PTR = strdup (SRC);                 \
1554eaa4710SRishi Srivatsavai     if (! PTR) {                        \
1564eaa4710SRishi Srivatsavai       STP_FATAL("strdup", MSG, -7);     \
1574eaa4710SRishi Srivatsavai     }                                   \
1584eaa4710SRishi Srivatsavai   }
1594eaa4710SRishi Srivatsavai 
1604eaa4710SRishi Srivatsavai #define STP_NEW_IN_LIST(WHAT, TYPE, LIST, MSG)  \
1614eaa4710SRishi Srivatsavai   {                                             \
1624eaa4710SRishi Srivatsavai     STP_MALLOC(WHAT, TYPE, MSG);                \
1634eaa4710SRishi Srivatsavai     WHAT->next = LIST;                          \
1644eaa4710SRishi Srivatsavai     LIST = WHAT;                                \
1654eaa4710SRishi Srivatsavai   }
1664eaa4710SRishi Srivatsavai 
1674eaa4710SRishi Srivatsavai /* for debug trace messages */
1684eaa4710SRishi Srivatsavai 
1694eaa4710SRishi Srivatsavai #ifdef STP_DBG
1704eaa4710SRishi Srivatsavai #if defined(__LINUX__)
1714eaa4710SRishi Srivatsavai extern char* sprint_time_stump (void);
1724eaa4710SRishi Srivatsavai #define stp_trace(F, B...) printf("%s:" F "\n", sprint_time_stump(), ##B)
1734eaa4710SRishi Srivatsavai #elif defined(__SUN__)
1744eaa4710SRishi Srivatsavai #define	stp_trace	(*stp_vectors->trace)
1754eaa4710SRishi Srivatsavai #else
1764eaa4710SRishi Srivatsavai extern ULONG stp_trace (const char* fmt, ...);
1774eaa4710SRishi Srivatsavai #endif
1784eaa4710SRishi Srivatsavai #else /* !STP_DBG */
1794eaa4710SRishi Srivatsavai #define stp_trace(F, B...) ((void)0)
1804eaa4710SRishi Srivatsavai #endif /* STP_DBG */
1814eaa4710SRishi Srivatsavai 
1824eaa4710SRishi Srivatsavai 
1834eaa4710SRishi Srivatsavai /* Inner usage definitions & functions */
1844eaa4710SRishi Srivatsavai 
1854eaa4710SRishi Srivatsavai #if defined(__LINUX__) || defined(__SUN__)
1864eaa4710SRishi Srivatsavai #  define RSTP_INIT_CRITICAL_PATH_PROTECTIO
1874eaa4710SRishi Srivatsavai #  define RSTP_CRITICAL_PATH_START
1884eaa4710SRishi Srivatsavai #  define RSTP_CRITICAL_PATH_END
1894eaa4710SRishi Srivatsavai #else
1904eaa4710SRishi Srivatsavai #  define RSTP_INIT_CRITICAL_PATH_PROTECTIO STP_OUT_psos_init_semaphore ()
1914eaa4710SRishi Srivatsavai #  define RSTP_CRITICAL_PATH_START          STP_OUT_psos_close_semaphore ()
1924eaa4710SRishi Srivatsavai #  define RSTP_CRITICAL_PATH_END            STP_OUT_psos_open_semaphore ()
1934eaa4710SRishi Srivatsavai    extern void STP_OUT_psos_init_semaphore (void);
1944eaa4710SRishi Srivatsavai    extern void STP_OUT_psos_close_semaphore (void);
1954eaa4710SRishi Srivatsavai    extern void STP_OUT_psos_open_semaphore (void);
1964eaa4710SRishi Srivatsavai #endif
1974eaa4710SRishi Srivatsavai 
1984eaa4710SRishi Srivatsavai #endif /*  _STP_BASE_H__ */
199