address.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1990-1997 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * $Header: /cvsroot/nsnam/nam-1/address.cc,v 1.2 1998/04/24 21:09:12 haoboy Exp $
  34.  */
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include "tclcl.h"
  38. #include "address.h"
  39. #include "config.h"
  40. static class AddressClass : public TclClass {
  41. public:
  42. AddressClass() : TclClass("Address") {} 
  43. TclObject* create(int, const char*const*) {
  44. return (new Address());
  45. }
  46. } class_address;
  47. Address* Address::instance_;
  48. Address::Address() : PortShift_(0), PortMask_(0), McastShift_(0), McastMask_(0), levels_(0)
  49. {
  50.   for (int i = 0; i < 10; i++) {
  51.     NodeShift_[i] = 0;
  52.     NodeMask_[i] = 0;
  53.   }
  54.   // setting instance_ should be in constructor, instead of Address::
  55.   if ((instance_ == 0) || (instance_ != this))
  56.   instance_ = this;
  57. }
  58. Address::~Address() { }
  59. int Address::command(int argc, const char*const* argv)
  60. {
  61.     int i, c, temp=0;
  62.     
  63.     Tcl& tcl = Tcl::instance();
  64.     //    if ((instance_ == 0) || (instance_ != this))
  65.     //      instance_ = this;
  66.     if (argc == 4) {
  67. if (strcmp(argv[1], "portbits-are") == 0) {
  68.     PortShift_ = atoi(argv[2]);
  69.     PortMask_ = atoi(argv[3]);
  70.     return (TCL_OK);
  71. }
  72. if (strcmp(argv[1], "mcastbits-are") == 0) {
  73.     McastShift_ = atoi(argv[2]);
  74.     McastMask_ = atoi(argv[3]);
  75.     return (TCL_OK);
  76. }
  77.     }
  78.     if (argc >= 4) {
  79.     if (strcmp(argv[1], "add-hier") == 0) {
  80.     /*
  81.      * <address> add-hier <level> <mask> <shift>
  82.      */
  83.     int level = atoi(argv[2]);
  84.     int mask = atoi(argv[3]);
  85.     int shift = atoi(argv[4]);
  86.     if (levels_ < level)
  87.     levels_ = level;
  88.     NodeShift_[level] = shift;
  89.     NodeMask_[level] = mask;
  90.     return (TCL_OK);
  91.     }
  92. if (strcmp(argv[1], "idsbits-are") == 0) {
  93.     temp = (argc - 2)/2;
  94.     if (levels_) { 
  95. if (temp != levels_) {
  96.     tcl.resultf("#idshiftbits don't match with #hier levelsn");
  97.     return (TCL_ERROR);
  98. }
  99.     }
  100.     else 
  101. levels_ = temp;
  102.     // NodeShift_ = new int[levels_];
  103.     for (i = 3, c = 1; c <= levels_; c++, i+=2) 
  104. NodeShift_[c] = atoi(argv[i]);
  105.     return (TCL_OK); 
  106. }
  107. if (strcmp(argv[1], "idmbits-are") == 0) {
  108.     temp = (argc - 2)/2;
  109.     if (levels_) { 
  110. if (temp != levels_) {
  111.     tcl.resultf("#idmaskbits don't match with #hier levelsn");
  112.     return (TCL_ERROR);
  113. }
  114.     }
  115.     else 
  116. levels_ = temp;
  117.     // NodeMask_ = new int[levels_];
  118.     for (i = 3, c = 1; c <= levels_; c++, i+=2) 
  119. NodeMask_[c] = atoi(argv[i]);
  120.     return (TCL_OK);
  121. }
  122.     }
  123.     return TclObject::command(argc, argv);
  124. }
  125. char *Address::print_nodeaddr(int address)
  126. {
  127.   int a;
  128.   char temp[SMALL_LEN];
  129.   char str[SMALL_LEN];
  130.   char *addrstr;
  131.   
  132.   str[0] = '';
  133.   for (int i=1; i <= levels_; i++) {
  134.       a = address >> NodeShift_[i];
  135.       if (levels_ > 1)
  136.   a = a & NodeMask_[i];
  137.       sprintf(temp, "%d.", a);
  138.       strcat(str, temp);
  139.   }
  140.   addrstr = new char[strlen(str)];
  141.   strcpy(addrstr, str);
  142. //   printf("Nodeaddr - %sn",addrstr);
  143.   return(addrstr);
  144. }
  145. char *Address::print_portaddr(int address)
  146. {
  147.   int a;
  148.   char str[SMALL_LEN];
  149.   char *addrstr;
  150.   
  151.   str[0] = '';
  152.   a = address >> PortShift_;
  153.   a = a & PortMask_;
  154.   sprintf(str, "%d", a);
  155.   addrstr = new char[strlen(str)];
  156.   strcpy(addrstr, str);
  157. //   printf("Portaddr - %sn",addrstr);
  158.   return(addrstr);
  159. }
  160. // Convert address in string format to binary format (int). 
  161. int Address::str2addr(char *str)
  162. {
  163. if (levels_ == 0) 
  164. return atoi(str);
  165. char *delim = ".";
  166. char *tok;
  167. int addr;
  168. for (int i = 1; i <= levels_; i++) {
  169. if (i == 1) {
  170. tok = strtok(str, delim);
  171. addr = atoi(tok);
  172. } else {
  173. tok = strtok(NULL, delim);
  174. addr = set_word_field(addr, atoi(tok), 
  175.       NodeShift_[i], NodeMask_[i]);
  176. }
  177. }
  178. return addr;
  179. }