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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1990-1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * $Header: /cvsroot/nsnam/ns-2/routing/address.cc,v 1.27 2005/07/27 01:13:44 tomh Exp $
  35.  */
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <assert.h>
  39. #include "address.h"
  40. #include "route.h"
  41. static class AddressClass : public TclClass {
  42. public:
  43. AddressClass() : TclClass("Address") {} 
  44. TclObject* create(int, const char*const*) {
  45. return (new Address());
  46. }
  47. } class_address;
  48. Address* Address::instance_;
  49. Address::Address() : 
  50. NodeShift_(NULL), NodeMask_(NULL), McastShift_(0), McastMask_(0), 
  51. levels_(0)
  52. {
  53. }
  54. Address::~Address() 
  55. delete [] NodeShift_;
  56. delete [] NodeMask_;
  57. }
  58. int Address::command(int argc, const char*const* argv)
  59. {
  60. int i, c, temp=0;
  61. Tcl& tcl = Tcl::instance();
  62. if ((instance_ == 0) || (instance_ != this))
  63. instance_ = this;
  64. if (argc == 3) {
  65. if (strcmp(argv[1], "str2addr") == 0) {
  66. tcl.resultf("%d", str2addr(argv[2]));
  67. return (TCL_OK);
  68. }
  69. }
  70. if (argc >= 3) {
  71. if (strcmp(argv[1], "bpl-are") == 0) {
  72. if (levels_ != (argc-2)) {
  73. tcl.resultf("#bpl don't match with #hier levelsn");
  74. return (TCL_ERROR);
  75. }
  76. bpl_ = new int[levels_ + 1];
  77. for (c=1; c<=levels_; c++)
  78. bpl_[c] = atoi(argv[c+1]);
  79. return TCL_OK;
  80. }
  81. }
  82.   if (argc == 4) {
  83. if (strcmp(argv[1], "mcastbits-are") == 0) {
  84. McastShift_ = atoi(argv[2]);
  85. McastMask_ = atoi(argv[3]);
  86. return (TCL_OK);
  87. }
  88. }
  89. if (argc >= 4) {
  90. if (strcmp(argv[1], "add-hier") == 0) {
  91. /*
  92.  * <address> add-hier <level> <mask> <shift>
  93.  */
  94. int level = atoi(argv[2]);
  95. int mask = atoi(argv[3]);
  96. int shift = atoi(argv[4]);
  97. if (levels_ < level)
  98. levels_ = level;
  99. NodeShift_[level] = shift;
  100. NodeMask_[level] = mask;
  101. return (TCL_OK);
  102. }
  103. if (strcmp(argv[1], "idsbits-are") == 0) {
  104. temp = (argc - 2)/2;
  105. if (levels_) { 
  106. if (temp != levels_) {
  107. tcl.resultf("#idshiftbits don't match with #hier levelsn");
  108. return (TCL_ERROR);
  109. }
  110. }
  111. else 
  112. levels_ = temp;
  113. NodeShift_ = new int[levels_ + 1];
  114. for (i = 3, c = 1; c <= levels_; c++, i+=2)
  115. NodeShift_[c] = atoi(argv[i]);
  116. return (TCL_OK); 
  117. }
  118. if (strcmp(argv[1], "idmbits-are") == 0) {
  119. temp = (argc - 2)/2;
  120. if (levels_) { 
  121. if (temp != levels_) {
  122. tcl.resultf("#idmaskbits don't match with #hier levelsn");
  123. return (TCL_ERROR);
  124. }
  125. }
  126. else 
  127. levels_ = temp;
  128. NodeMask_ = new int[levels_ + 1];
  129. for (i = 3, c = 1; c <= levels_; c++, i+=2) 
  130. NodeMask_[c] = atoi(argv[i]);
  131. return (TCL_OK);
  132. }
  133. }
  134. return TclObject::command(argc, argv);
  135. }
  136. char *Address::print_nodeaddr(int address)
  137. {
  138. int a;
  139. char temp[SMALL_LEN];
  140. char str[SMALL_LEN];
  141. char *addrstr;
  142. str[0] = '';
  143. for (int i=1; i <= levels_; i++) {
  144. a = address >> NodeShift_[i];
  145. if (levels_ > 1)
  146. a = a & NodeMask_[i];
  147. //if (i < levels_)
  148. sprintf(temp, "%d.", a);
  149. //else
  150. //sprintf(temp, "%d", a);
  151. strcat(str, temp);
  152. }
  153. int len;
  154. len = strlen(str);
  155. addrstr = new char[len+1];
  156. str[len-1]= 0; //kill the last dot
  157. strcpy(addrstr, str);
  158. // printf("Nodeaddr - %sn",addrstr);
  159. return(addrstr);
  160. }
  161. int Address::hier_addr(int address, int level) {
  162. if (level <= levels_) {
  163. return ( (address >> NodeShift_[level]) & NodeMask_[level]);
  164. }
  165. perror("Address::hier_addr: levels greater than total h_levels_n");
  166. return -1;
  167. }
  168. char *Address::get_subnetaddr(int address)
  169. {
  170. int a;
  171. char temp[SMALL_LEN];
  172. char str[SMALL_LEN];
  173. char *addrstr;
  174. if (levels_ > 1) {
  175. str[0] = '';
  176. for (int i=1; i < levels_; i++) {
  177. a = address >> NodeShift_[i];
  178. a = a & NodeMask_[i];
  179. if (i < (levels_-1))
  180. sprintf(temp, "%d.", a);
  181. else
  182. sprintf(temp, "%d", a);
  183. strcat(str, temp);
  184. }
  185. addrstr = new char[strlen(str)+1];
  186. strcpy(addrstr, str);
  187. //printf("Subnet_addr - %sn",addrstr);
  188. return(addrstr);
  189. }
  190. return NULL;
  191. }
  192. // returns nodeaddr in integer form (relevant especially for hier-addr)
  193. int Address::get_nodeaddr(int address)
  194. {
  195. int a;
  196. char *temp;
  197. temp = print_nodeaddr(address);
  198. a = str2addr(temp);
  199. delete [] temp;
  200. return a;
  201. }
  202. //Sets address in pkthdr format (having port and node fields)
  203. int Address::create_ipaddr(int nodeid, int)
  204. {
  205. return nodeid;
  206. // The following code is obsolete
  207. #if 0
  208. int address;
  209. if (levels_ < 2) 
  210. address = (nodeid & NodeMask_[1]) << NodeShift_[1];
  211. else 
  212. address = nodeid;
  213. address = ((portid & PortMask_) << PortShift_) | 
  214. ((~(PortMask_) << PortShift_) & address);
  215. return address;
  216. #endif
  217. }
  218. int Address::get_lastaddr(int address)
  219. {
  220.   int a;
  221.   a = address >> NodeShift_[levels_];
  222.   a = a & NodeMask_[levels_];
  223.   return a;
  224.  }
  225. char *Address::print_portaddr(int address)
  226. {
  227. char str[SMALL_LEN];
  228. char *addrstr;
  229. str[0] = '';
  230. #if 0
  231. int a;
  232. a = address >> PortShift_;
  233. a = a & PortMask_;
  234. #endif
  235. sprintf(str, "%d", address);
  236. addrstr = new char[strlen(str)+1];
  237. strcpy(addrstr, str);
  238. // printf("Portaddr - %sn",addrstr);
  239. return(addrstr);
  240. }
  241. // Convert address in string format to binary format (int). 
  242. int Address::str2addr(const char *str) const
  243. {
  244. if (levels_ < 2) {
  245. int tmp = atoi(str);
  246. if (tmp < 0)     
  247. return (tmp);
  248. u_int uitmp = (u_int) tmp;
  249. if (uitmp > ((unsigned long)(1 << bpl_[1])) ) {
  250. fprintf(stderr, "Error!!nstr2addr:Address %u outside range of address field length %lun", 
  251. uitmp, ((unsigned long)(1<< bpl_[1])));
  252. exit(1);
  253. }
  254. return tmp;
  255. }
  256. /*
  257.   int istr[levels_], addr= 0;
  258. */
  259. /*
  260.  * for VC++
  261.  */
  262. int *istr= new int[levels_];
  263. int addr= 0;
  264. RouteLogic::ns_strtok((char*)str, istr);
  265. for (int i = 0; i < levels_; i++) {
  266. assert (istr[i] - 1 >= 0);
  267. if (((unsigned long)--istr[i]) > ((unsigned long)(1 << bpl_[i+1])) ) {
  268. fprintf(stderr, "Error!!nstr2addr:Address %d outside range of address field length %lun", 
  269. istr[i], ((unsigned long)(1<< bpl_[i+1])));
  270. exit(1);
  271. }
  272. addr = set_word_field(addr, istr[i],
  273.       NodeShift_[i+1], NodeMask_[i+1]);
  274. }
  275. delete [] istr;
  276. return addr;
  277. }