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

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 priority vectors API : 17.4.2 */
  23.  
  24. #include "base.h"
  25. #include "stp_bpdu.h"
  26. #include "vector.h"
  27. int
  28. STP_VECT_compare_bridge_id (BRIDGE_ID* b1, BRIDGE_ID* b2)
  29. {
  30.   if (b1->prio < b2->prio)
  31.     return -1;
  32.   if (b1->prio > b2->prio)
  33.     return 1;
  34.   return memcmp (b1->addr, b2->addr, 6);
  35. }
  36. void
  37. STP_VECT_copy (OUT PRIO_VECTOR_T* t, IN PRIO_VECTOR_T* f)
  38. {
  39.   memcpy (t, f, sizeof (PRIO_VECTOR_T));
  40. }
  41. void
  42. STP_VECT_create (OUT PRIO_VECTOR_T* t,
  43.                  IN BRIDGE_ID* root_br,
  44.                  IN unsigned long root_path_cost,
  45.                  IN BRIDGE_ID* design_bridge,
  46.                  IN PORT_ID design_port,
  47.                  IN PORT_ID bridge_port)
  48. {
  49.   memcpy (&t->root_bridge, root_br, sizeof (BRIDGE_ID));
  50.   t->root_path_cost = root_path_cost;
  51.   memcpy (&t->design_bridge, design_bridge, sizeof (BRIDGE_ID));
  52.   t->design_port = design_port;
  53.   t->bridge_port = bridge_port;
  54. }
  55. int
  56. STP_VECT_compare_vector (PRIO_VECTOR_T* v1, PRIO_VECTOR_T* v2)
  57. {
  58.   int bridcmp;
  59.   bridcmp = STP_VECT_compare_bridge_id (&v1->root_bridge, &v2->root_bridge);
  60.   if (bridcmp < 0) return bridcmp;
  61.   if (! bridcmp) {
  62.     bridcmp = v1->root_path_cost - v2->root_path_cost;
  63.     if (bridcmp < 0) return bridcmp;
  64.     if (! bridcmp) {
  65.       bridcmp = STP_VECT_compare_bridge_id (&v1->design_bridge, &v2->design_bridge);
  66.       if (bridcmp < 0) return bridcmp;
  67.       if (! bridcmp) {
  68.         bridcmp = v1->design_port - v2->design_port;
  69.         if (bridcmp < 0) return bridcmp;
  70.         if (! bridcmp)
  71.           return v1->bridge_port - v2->bridge_port;
  72.       }
  73.     }
  74.   }
  75.   return bridcmp;
  76. }
  77. static unsigned short
  78. stp_vect_get_short (IN unsigned char* f)
  79. {
  80.   return ntohs (*(unsigned short *)f);
  81. }
  82. static void
  83. stp_vect_set_short (IN unsigned short f, OUT unsigned char* t)
  84. {
  85.   *(unsigned short *)t = htons (f);
  86. }
  87. static void
  88. stp_vect_get_bridge_id (IN unsigned char* c_br, OUT BRIDGE_ID* bridge_id)
  89. {
  90.   bridge_id->prio = stp_vect_get_short (c_br);
  91.   memcpy (bridge_id->addr, c_br + 2, 6);
  92. }
  93. static void
  94. stp_vect_set_bridge_id (IN BRIDGE_ID* bridge_id, OUT unsigned char* c_br)
  95. {
  96.   stp_vect_set_short (bridge_id->prio, c_br);
  97.   memcpy (c_br + 2, bridge_id->addr, 6);
  98. }
  99. void
  100. STP_VECT_get_vector (IN BPDU_BODY_T* b, OUT PRIO_VECTOR_T* v)
  101. {
  102.   stp_vect_get_bridge_id (b->root_id, &v->root_bridge);
  103.   v->root_path_cost = ntohl (*((long*) b->root_path_cost));
  104.   stp_vect_get_bridge_id (b->bridge_id, &v->design_bridge);
  105.   v->design_port = stp_vect_get_short (b->port_id);
  106. }
  107. void
  108. STP_VECT_set_vector (IN PRIO_VECTOR_T* v, OUT BPDU_BODY_T* b)
  109. {
  110.   unsigned long root_path_cost;
  111.   stp_vect_set_bridge_id (&v->root_bridge, b->root_id);
  112.   root_path_cost = htonl (v->root_path_cost);
  113.   memcpy (b->root_path_cost, &root_path_cost, 4);
  114.   stp_vect_set_bridge_id (&v->design_bridge, b->bridge_id);
  115.   stp_vect_set_short (v->design_port, b->port_id);
  116. }
  117. #ifdef STP_DBG
  118. void
  119. STP_VECT_br_id_print (IN char *title, IN BRIDGE_ID* br_id, IN Bool cr)
  120. {
  121.   Print ("%s=%04lX-%02x%02x%02x%02x%02x%02x",
  122.             title,
  123.           (unsigned long) br_id->prio,
  124.           (unsigned char) br_id->addr[0],
  125.           (unsigned char) br_id->addr[1],
  126.           (unsigned char) br_id->addr[2],
  127.           (unsigned char) br_id->addr[3],
  128.           (unsigned char) br_id->addr[4],
  129.           (unsigned char) br_id->addr[5]);
  130.   Print (cr ? "n" : " ");
  131. }
  132. void
  133. STP_VECT_print (IN char *title, IN PRIO_VECTOR_T *v)
  134. {
  135.   Print ("%s:", title);
  136.   STP_VECT_br_id_print ("rootBr", &v->root_bridge, False);
  137.     
  138. /****
  139.   Print (" rpc=%ld ", (long) v->root_path_cost);
  140. ****/
  141.   STP_VECT_br_id_print ("designBr", &v->design_bridge, False);
  142. /****/
  143.   Print (" dp=%lx bp=%lx ",
  144.           (unsigned long) v->design_port,
  145.           (unsigned long) v->bridge_port);
  146. /***********/
  147.   Print ("n");
  148. }
  149. #endif