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

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. /* STP PORT instance : 17.18, 17.15 */
  23.  
  24. #include "base.h"
  25. #include "stpm.h"
  26. #include "stp_in.h"
  27. /* #include "rolesel.h" */
  28. #include "portinfo.h"
  29. #include "roletrns.h"
  30. #include "sttrans.h"
  31. #include "topoch.h"
  32. #include "migrate.h"
  33. #include "transmit.h"
  34. #include "p2p.h"
  35. #include "pcost.h"
  36. #include "edge.h"
  37. #include "stp_to.h" /* for STP_OUT_get_port_name & STP_OUT_get_port_link_status */
  38. PORT_T *
  39. STP_port_create (STPM_T* stpm, int port_index)
  40. {
  41.   PORT_T*        this;
  42.   UID_STP_PORT_CFG_T port_cfg;
  43.   register int   iii;
  44.   unsigned short port_prio;
  45.   /* check, if the port has just been added */
  46.   for (this = stpm->ports; this; this = this->next) {
  47.     if (this->port_index == port_index) {
  48.       return NULL;
  49.     }
  50.   }
  51.   STP_NEW_IN_LIST(this, PORT_T, stpm->ports, "port create");
  52.   this->owner = stpm;
  53.   this->machines = NULL;
  54.   this->port_index = port_index;
  55.   this->port_name = strdup (STP_OUT_get_port_name (port_index));
  56.   this->uptime = 0;
  57.   STP_OUT_get_init_port_cfg (stpm->vlan_id, port_index, &port_cfg);
  58.   port_prio =                  port_cfg.port_priority;
  59.   this->admin_non_stp =        port_cfg.admin_non_stp;
  60.   this->adminEdge =            port_cfg.admin_edge;
  61.   this->adminPCost =           port_cfg.admin_port_path_cost;
  62.   this->adminPointToPointMac = port_cfg.admin_point2point;
  63.   
  64.   this->LinkDelay = DEF_LINK_DELAY;
  65.   this->port_id = (port_prio << 8) + port_index;
  66.   iii = 0;
  67.   this->timers[iii++] = &this->fdWhile;
  68.   this->timers[iii++] = &this->helloWhen;
  69.   this->timers[iii++] = &this->mdelayWhile;
  70.   this->timers[iii++] = &this->rbWhile;
  71.   this->timers[iii++] = &this->rcvdInfoWhile;
  72.   this->timers[iii++] = &this->rrWhile;
  73.   this->timers[iii++] = &this->tcWhile;
  74.   this->timers[iii++] = &this->txCount;
  75.   this->timers[iii++] = &this->lnkWhile;
  76.   /* create and bind port state machines */
  77.   STP_STATE_MACH_IN_LIST(topoch);
  78.   STP_STATE_MACH_IN_LIST(migrate);
  79.   STP_STATE_MACH_IN_LIST(p2p);
  80.   STP_STATE_MACH_IN_LIST(edge);
  81.                   
  82.   STP_STATE_MACH_IN_LIST(pcost)
  83.   STP_STATE_MACH_IN_LIST(info);
  84.                   
  85.   STP_STATE_MACH_IN_LIST(roletrns);
  86.   STP_STATE_MACH_IN_LIST(sttrans);
  87.   STP_STATE_MACH_IN_LIST(transmit);
  88.                   
  89. #ifdef STP_DBG
  90. #if 0
  91.   this->roletrns->ignoreHop2State = 14; /* DESIGNATED_PORT; */
  92.   this->info->ignoreHop2State =      3; /* CURRENT */
  93.   this->transmit->ignoreHop2State =  3; /* IDLE */
  94.   this->edge->ignoreHop2State =      0; /* DISABLED; */
  95. #endif
  96. #if 0
  97.   this->info->debug = 1;
  98.   this->pcost->debug = 1;
  99.   this->p2p->debug = 1;
  100.   this->edge->debug = 1;
  101.   this->migrate->debug = 1;
  102.   this->sttrans->debug = 1;
  103.   this->topoch->debug = 1;
  104.   this->roletrns->debug = 1;
  105. #endif
  106.   this->sttrans->debug = 1;
  107. #endif
  108.   return this;
  109. }
  110. void 
  111. STP_port_init (PORT_T* this, STPM_T* stpm, Bool check_link)
  112. {
  113.   if (check_link) {
  114.     this->adminEnable = STP_OUT_get_port_link_status (this->port_index);
  115.     STP_VECT_create (&this->designPrio,
  116.                    &stpm->BrId,
  117.                    0,
  118.                    &stpm->BrId,
  119.                    this->port_id,
  120.                    this->port_id);
  121.     STP_copy_times (&this->designTimes, &stpm->rootTimes);
  122.   }
  123.   /* reset timers */
  124.   this->fdWhile =
  125.   this->helloWhen =
  126.   this->mdelayWhile =
  127.   this->rbWhile =
  128.   this->rcvdInfoWhile =
  129.   this->rrWhile =
  130.   this->tcWhile =
  131.   this->txCount = 0;
  132.   this->msgPortRole = RSTP_PORT_ROLE_UNKN;
  133.   this->selectedRole = DisabledPort;
  134.   this->sendRSTP = True;
  135.   this->operSpeed = STP_OUT_get_port_oper_speed (this->port_index);
  136.   this->p2p_recompute = True;
  137. }
  138. void
  139. STP_port_delete (PORT_T* this)
  140. {
  141.   STPM_T*                   stpm;
  142.   register PORT_T*          prev;
  143.   register PORT_T*          tmp;
  144.   register STATE_MACH_T*    stater;
  145.   register void*            pv;
  146.   stpm = this->owner;
  147.   free (this->port_name);
  148.   for (stater = this->machines; stater; ) {
  149.     pv = (void*) stater->next;
  150.     STP_state_mach_delete (stater);
  151.     stater = (STATE_MACH_T*) pv;
  152.   }
  153.                  
  154.   prev = NULL;
  155.   for (tmp = stpm->ports; tmp; tmp = tmp->next) {
  156.     if (tmp->port_index == this->port_index) {
  157.       if (prev) {
  158.         prev->next = this->next;
  159.       } else {
  160.         stpm->ports = this->next;
  161.       }
  162.       STP_FREE(this, "stp instance");
  163.       break;
  164.     }
  165.     prev = tmp;
  166.   }
  167. }
  168. int
  169. STP_port_rx_bpdu (PORT_T* this, BPDU_T* bpdu, size_t len)
  170. {
  171.   STP_info_rx_bpdu (this, bpdu, len);
  172.   return 0;
  173. }
  174. #ifdef STP_DBG
  175. int STP_port_trace_state_machine (PORT_T* this, char* mach_name, int enadis, int vlan_id)
  176. {
  177.     register struct state_mach_t* stater;
  178.     for (stater = this->machines; stater; stater = stater->next) {
  179.         if (! strcmp (mach_name, "all") || ! strcmp (mach_name, stater->name)) {
  180.             /* if (stater->debug != enadis) */
  181.             {
  182.                 stp_trace ("port %s on %s trace %-8s (was %s) now %s",
  183.                     this->port_name, this->owner->name,
  184.                     stater->name,
  185.                     stater->debug ? " enabled" :"disabled",
  186.                     enadis        ? " enabled" :"disabled");
  187.             }
  188.             stater->debug = enadis;
  189.         }
  190.     }
  191.     return 0;
  192. }
  193. void STP_port_trace_flags (char* title, PORT_T* this)
  194. {
  195. #if 0 /* it may be opened for more deep debugging */
  196.     unsigned long flag = 0L;
  197.     
  198.     if (this->reRoot)   flag |= 0x000001L;
  199.     if (this->sync)     flag |= 0x000002L;
  200.     if (this->synced)   flag |= 0x000004L;
  201.     if (this->proposed)  flag |= 0x000010L;
  202.     if (this->proposing) flag |= 0x000020L;
  203.     if (this->agreed)    flag |= 0x000040L;
  204.     if (this->updtInfo)  flag |= 0x000080L;
  205.     if (this->operEdge)   flag |= 0x000100L;
  206.     stp_trace ("         %-12s: flags=0X%04lx port=%s", title, flag, this->port_name);
  207. #endif
  208. }
  209. #endif