OpenSolaris_b135/lib/librstp/common/uid_stp.h

/************************************************************************
 * RSTP library - Rapid Spanning Tree (802.1t, 802.1w)
 * Copyright (C) 2001-2003 Optical Access
 * Author: Alex Rozin
 *
 * This file is part of RSTP library.
 *
 * RSTP library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation; version 2.1
 *
 * RSTP library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
 * General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with RSTP library; see the file COPYING.  If not, write to the Free
 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 **********************************************************************/

/* External management communication API definitions */

#ifndef _UID_STP_H__
#define _UID_STP_H__

#define STP_DBG 1

#define NAME_LEN    20

typedef enum {
  STP_DISABLED,
  STP_ENABLED
} UID_STP_MODE_T;

typedef struct {
  unsigned short  prio;
  unsigned char   addr[6];
} UID_BRIDGE_ID_T;

typedef struct {
  char      vlan_name[NAME_LEN]; /* name of the VLAN, key of the bridge */
  char      action; /* 1-create, 0- delete */
} UID_STP_BR_CTRL_T;

#define BR_CFG_STATE        (1L << 0)
#define BR_CFG_PRIO         (1L << 1)
#define BR_CFG_AGE          (1L << 2)
#define BR_CFG_HELLO        (1L << 3)
#define BR_CFG_DELAY        (1L << 4)
#define BR_CFG_FORCE_VER    (1L << 5)
#define BR_CFG_AGE_MODE     (1L << 6)
#define BR_CFG_AGE_TIME     (1L << 7)
#define BR_CFG_HOLD_TIME    (1L << 8)
#define BR_CFG_ALL BR_CFG_STATE     | \
                   BR_CFG_PRIO      | \
                   BR_CFG_AGE       | \
                   BR_CFG_HELLO     | \
                   BR_CFG_DELAY     | \
                   BR_CFG_FORCE_VER | \
                   BR_CFG_AGE_MODE  | \
                   BR_CFG_AGE_TIME  | \
                   BR_CFG_HOLD_TIME

typedef struct {
  /* service data */
  unsigned long     field_mask; /* which fields to change */
  UID_STP_MODE_T    stp_enabled;
  char              vlan_name[NAME_LEN]; /* name of the VLAN, key of the bridge */

  /* protocol data */
  int           bridge_priority;
  int           max_age;
  int           hello_time;
  int           forward_delay;
  int           force_version;
  int           hold_time;
} UID_STP_CFG_T;

typedef struct {
  /* service data */
  char              vlan_name[NAME_LEN]; /* name of the VLAN, key of the bridge */
  unsigned long     vlan_id;
  UID_STP_MODE_T    stp_enabled;

  /* protocol data */
  UID_BRIDGE_ID_T   designated_root;
  unsigned long     root_path_cost;

  unsigned long     timeSince_Topo_Change; /* 14.8.1.1.3.b: TBD */
  unsigned long     Topo_Change_Count;     /* 14.8.1.1.3.c: TBD */
  unsigned char     Topo_Change;           /* 14.8.1.1.3.d: TBD */

  unsigned short    root_port;
  int               max_age;
  int               hello_time;
  int               forward_delay;
  UID_BRIDGE_ID_T   bridge_id;
} UID_STP_STATE_T;

typedef enum {
  UID_PORT_DISABLED = 0,
  UID_PORT_DISCARDING,
  UID_PORT_LEARNING,
  UID_PORT_FORWARDING,
  UID_PORT_NON_STP,
  UID_PORT_BADSDU
} RSTP_PORT_STATE;

typedef unsigned short  UID_PORT_ID;

typedef enum {
  P2P_FORCE_TRUE,
  P2P_FORCE_FALSE,
  P2P_AUTO
} ADMIN_P2P_T;

#define PT_CFG_STATE    (1L << 0)
#define PT_CFG_COST     (1L << 1)
#define PT_CFG_PRIO     (1L << 2)
#define PT_CFG_P2P      (1L << 3)
#define PT_CFG_EDGE     (1L << 4)
#define PT_CFG_MCHECK   (1L << 5)
#define PT_CFG_NON_STP  (1L << 6)
#ifdef STP_DBG
#define PT_CFG_DBG_SKIP_RX (1L << 16)
#define PT_CFG_DBG_SKIP_TX (1L << 17)
#endif

#define PT_CFG_ALL PT_CFG_STATE  | \
                   PT_CFG_COST   | \
                   PT_CFG_PRIO   | \
                   PT_CFG_P2P    | \
                   PT_CFG_EDGE   | \
                   PT_CFG_MCHECK | \
                   PT_CFG_NON_STP                  

#define ADMIN_PORT_PATH_COST_AUTO   0

typedef struct {
  /* service data */
  unsigned long field_mask; /* which fields to change */
  char          vlan_name[NAME_LEN]; /* name of the VLAN, key of the bridge */

  /* protocol data */
  int           port_priority;
  unsigned long admin_port_path_cost; /* ADMIN_PORT_PATH_COST_AUTO - auto sence */
  ADMIN_P2P_T   admin_point2point;
  unsigned char admin_edge;
  unsigned char admin_non_stp; /* 1- doesn't participate in STP, 1 - regular */
#ifdef STP_DBG
  unsigned int	skip_rx;
  unsigned int	skip_tx;
#endif

} UID_STP_PORT_CFG_T;

typedef struct {
  /* service data */
  char              vlan_name[NAME_LEN]; /* name of the VLAN, key of the bridge */
  unsigned int      port_no; /* key of the entry */

  /* protocol data */
  UID_PORT_ID       port_id;
  RSTP_PORT_STATE   state;
  unsigned long     path_cost;

  UID_BRIDGE_ID_T   designated_root;
  unsigned long     designated_cost;
  UID_BRIDGE_ID_T   designated_bridge;
  UID_PORT_ID       designated_port;

#if 0
  int               infoIs;
  unsigned short    handshake_flags;
#endif

  unsigned long     rx_cfg_bpdu_cnt;
  unsigned long     rx_rstp_bpdu_cnt;
  unsigned long     rx_tcn_bpdu_cnt;
  int               fdWhile;      /* 17.15.1 */
  int               helloWhen;    /* 17.15.2 */
  int               mdelayWhile;  /* 17.15.3 */
  int               rbWhile;      /* 17.15.4 */
  int               rcvdInfoWhile;/* 17.15.5 */
  int               rrWhile;      /* 17.15.6 */
  int               tcWhile;      /* 17.15.7 */
  int               txCount;      /* 17.18.40 */
  int               lnkWhile;

  unsigned long     uptime;       /* 14.8.2.1.3.a */
  unsigned long     oper_port_path_cost;
  unsigned char     role;
  unsigned char     oper_point2point;
  unsigned char     oper_edge;
  unsigned char     oper_stp_neigb;
  unsigned char     top_change_ack;
  unsigned char     tc;
} UID_STP_PORT_STATE_T;

#endif