OpenSolaris_b135/lib/librstp/common/stpmgmt.c

/************************************************************************ 
 * 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. 
 **********************************************************************/

/* This file contains API from an operation system to the RSTP library */

#include "base.h"
#include "stpm.h"
#include "stp_in.h" /* for bridge defaults */
#include "stp_to.h"


int
STP_IN_stpm_create (int vlan_id, char* name)
{
  register STPM_T*  this;
  int               err_code;
  UID_STP_CFG_T		init_cfg;
		   
  stp_trace ("STP_IN_stpm_create(%s)", name);

  init_cfg.field_mask = BR_CFG_ALL;
  STP_OUT_get_init_stpm_cfg (vlan_id, &init_cfg);
  init_cfg.field_mask = 0;

  RSTP_CRITICAL_PATH_START;  
  this = stp_in_stpm_create (vlan_id, name, &err_code);
  if (this) {
    this->BrId.prio = init_cfg.bridge_priority;
    this->BrTimes.MaxAge = init_cfg.max_age;
    this->BrTimes.HelloTime = init_cfg.hello_time;
    this->BrTimes.ForwardDelay = init_cfg.forward_delay;
    this->ForceVersion = (PROTOCOL_VERSION_T) init_cfg.force_version;
  }

  RSTP_CRITICAL_PATH_END;
  return err_code;  
}

int
STP_IN_stpm_delete (int vlan_id)
{
  register STPM_T* this;
  int iret = 0;

  RSTP_CRITICAL_PATH_START;  
  this = stpapi_stpm_find (vlan_id);

  if (! this) { /* it had not yet been created :( */
    iret = STP_Vlan_Had_Not_Yet_Been_Created;
  } else {

    if (STP_ENABLED == this->admin_state) {
      if (0 != STP_stpm_enable (this, STP_DISABLED)) {/* can't disable :( */
        iret = STP_Another_Error;
      } else
        STP_OUT_set_hardware_mode (vlan_id, STP_DISABLED);
    }

    if (0 == iret) {
      STP_stpm_delete (this);   
    }
  }
  RSTP_CRITICAL_PATH_END;
  return iret;
}

int
STP_IN_stpm_get_vlan_id_by_name (char* name, int* vlan_id)
{
  register STPM_T* stpm;
  int iret = STP_Cannot_Find_Vlan;

  RSTP_CRITICAL_PATH_START;  
  for (stpm = STP_stpm_get_the_list (); stpm; stpm = stpm->next) {
    if (stpm->name && ! strcmp (stpm->name, name)) {
      *vlan_id = stpm->vlan_id;
      iret = 0;
      break;
    }
  }
  RSTP_CRITICAL_PATH_END;

  return iret;
}
    

Bool
STP_IN_get_is_stpm_enabled (int vlan_id)
{
  STPM_T* this;
  Bool iret = False;

  RSTP_CRITICAL_PATH_START;  
  this = stpapi_stpm_find (vlan_id);
  
  if (this) { 
    if (this->admin_state == STP_ENABLED) {
      iret = True;
    }
#ifdef notdef
  } else {
    ;   /* it had not yet been created :( */
#endif
  }
  
  RSTP_CRITICAL_PATH_END;
  return iret;
}

int
STP_IN_stop_all (void)
{
  register STPM_T* stpm;

  RSTP_CRITICAL_PATH_START;
  
  for (stpm = STP_stpm_get_the_list (); stpm; stpm = stpm->next) {
    if (STP_DISABLED != stpm->admin_state) {
      STP_OUT_set_hardware_mode (stpm->vlan_id, STP_DISABLED);
      (void) STP_stpm_enable (stpm, STP_DISABLED);
    }
  }

  RSTP_CRITICAL_PATH_END;
  return 0;
} 

int
STP_IN_delete_all (void)
{
  register STPM_T* stpm;

  RSTP_CRITICAL_PATH_START;
  for (stpm = STP_stpm_get_the_list (); stpm; stpm = stpm->next) {
    (void) STP_stpm_enable (stpm, STP_DISABLED);
    STP_stpm_delete (stpm);
  }

  RSTP_CRITICAL_PATH_END;
  return 0;
}