p2p.c
上传用户:allwinjm
上传日期:2021-08-29
资源大小:99k
文件大小:2k
源码类别:

Internet/IE编程

开发平台:

Unix_Linux

  1. /************************************************************************ 
  2.  * RSTP library - Rapid Spanning Tree (802.1t, 802.1w) 
  3.  * Copyright (C) 2001-2003 Optical Access 
  4.  * Author: Alex Rozin 
  5.  * 
  6.  * This file is part of RSTP library. 
  7.  * 
  8.  * RSTP library is free software; you can redistribute it and/or modify it 
  9.  * under the terms of the GNU Lesser General Public License as published by the 
  10.  * Free Software Foundation; version 2.1 
  11.  * 
  12.  * RSTP library is distributed in the hope that it will be useful, but 
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser 
  15.  * General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public License 
  18.  * along with RSTP library; see the file COPYING.  If not, write to the Free 
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 
  20.  * 02111-1307, USA. 
  21.  **********************************************************************/
  22. /* Point To Point MAC mode selection machine : 6.4.3, 6.5.1 */
  23.  
  24. #include "base.h"
  25. #include "stpm.h"
  26. #include "stp_to.h" /* for STP_OUT_get_duplex */
  27. #define STATES { 
  28.   CHOOSE(INIT),     
  29.   CHOOSE(RECOMPUTE),    
  30.   CHOOSE(STABLE),    
  31. }
  32. #define GET_STATE_NAME STP_p2p_get_state_name
  33. #include "choose.h"
  34. static Bool
  35. computeP2P (PORT_T *port)
  36. {
  37.     switch (port->adminPointToPointMac) {
  38.       case P2P_FORCE_TRUE:
  39.         return True;
  40.       case P2P_FORCE_FALSE:
  41.         return False;
  42.       default:
  43.       case P2P_AUTO:
  44.         return STP_OUT_get_duplex (port->port_index);
  45.     }
  46. }
  47. void
  48. STP_p2p_enter_state (STATE_MACH_T* s)
  49. {
  50.   register PORT_T* port = s->owner.port;
  51.   switch (s->State) {
  52.     case BEGIN:
  53.     case INIT:
  54.       port->p2p_recompute = True;
  55.       break;
  56.     case RECOMPUTE:
  57.       port->operPointToPointMac = computeP2P (port);
  58.       port->p2p_recompute = False;
  59.       break;
  60.     case STABLE:
  61.       break;
  62.   }
  63. }
  64. Bool
  65. STP_p2p_check_conditions (STATE_MACH_T* s)
  66. {
  67.   register PORT_T* port = s->owner.port;
  68.   switch (s->State) {
  69.     case BEGIN:
  70.     case INIT:
  71.       return STP_hop_2_state (s, STABLE);
  72.     case RECOMPUTE:
  73.       return STP_hop_2_state (s, STABLE);
  74.     case STABLE:
  75.       if (port->p2p_recompute) {
  76.         return STP_hop_2_state (s, RECOMPUTE);
  77.       }
  78.       break;
  79.   }
  80.   return False;
  81. }