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 23 /* Point To Point MAC mode selection machine : 6.4.3, 6.5.1 */ 24 25 #include "base.h" 26 #include "stpm.h" 27 #include "stp_to.h" /* for STP_OUT_get_duplex */ 28 29 #define STATES { \ 30 CHOOSE(INIT), \ 31 CHOOSE(RECOMPUTE), \ 32 CHOOSE(STABLE) \ 33 } 34 35 #define GET_STATE_NAME STP_p2p_get_state_name 36 #include "choose.h" 37 38 static Bool 39 computeP2P (PORT_T *port) 40 { 41 switch (port->adminPointToPointMac) { 42 case P2P_FORCE_TRUE: 43 return True; 44 case P2P_FORCE_FALSE: 45 return False; 46 default: 47 case P2P_AUTO: 48 return STP_OUT_get_duplex (port->port_index); 49 } 50 } 51 52 void 53 STP_p2p_enter_state (STATE_MACH_T* s) 54 { 55 register PORT_T* port = s->owner.port; 56 57 switch (s->State) { 58 case BEGIN: 59 case INIT: 60 port->p2p_recompute = True; 61 break; 62 case RECOMPUTE: 63 port->operPointToPointMac = computeP2P (port); 64 port->p2p_recompute = False; 65 break; 66 case STABLE: 67 break; 68 } 69 } 70 71 Bool 72 STP_p2p_check_conditions (STATE_MACH_T* s) 73 { 74 register PORT_T* port = s->owner.port; 75 76 switch (s->State) { 77 case BEGIN: 78 case INIT: 79 return STP_hop_2_state (s, STABLE); 80 case RECOMPUTE: 81 return STP_hop_2_state (s, STABLE); 82 case STABLE: 83 if (port->p2p_recompute) { 84 return STP_hop_2_state (s, RECOMPUTE); 85 } 86 break; 87 } 88 return False; 89 } 90 91