lanRouter.cc

Go to the documentation of this file.
00001 /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
00002 
00003 /*
00004  * Copyright (C) 1998 by the University of Southern California
00005  * $Id: lanRouter.cc,v 1.10 2005/08/25 18:58:07 johnh Exp $
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License,
00009  * version 2, as published by the Free Software Foundation.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License along
00017  * with this program; if not, write to the Free Software Foundation, Inc.,
00018  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00019  *
00020  *
00021  * The copyright of this module includes the following
00022  * linking-with-specific-other-licenses addition:
00023  *
00024  * In addition, as a special exception, the copyright holders of
00025  * this module give you permission to combine (via static or
00026  * dynamic linking) this module with free software programs or
00027  * libraries that are released under the GNU LGPL and with code
00028  * included in the standard release of ns-2 under the Apache 2.0
00029  * license or under otherwise-compatible licenses with advertising
00030  * requirements (or modified versions of such code, with unchanged
00031  * license).  You may copy and distribute such a system following the
00032  * terms of the GNU GPL for this module and the licenses of the
00033  * other code concerned, provided that you include the source code of
00034  * that other code when and as the GNU GPL requires distribution of
00035  * source code.
00036  *
00037  * Note that people who make modified versions of this module
00038  * are not obligated to grant this special exception for their
00039  * modified versions; it is their choice whether to do so.  The GNU
00040  * General Public License gives permission to release a modified
00041  * version without this exception; this exception also makes it
00042  * possible to release a modified version which carries forward this
00043  * exception.
00044  *
00045  */
00046 
00047 #ifndef lint
00048 static const char rcsid[] =
00049     "@(#) $Header: /usr/src/mash/repository/vint/ns-2/lanRouter.cc";
00050 #endif
00051 
00052 #include <tcl.h>
00053 #include "lanRouter.h"
00054 #include "address.h"
00055 #include "ip.h"
00056 
00057 static class LanRouterClass : public TclClass {
00058 public:
00059     LanRouterClass() : TclClass("LanRouter") {}
00060     TclObject* create(int, const char*const*) {
00061         return (new LanRouter());
00062     }
00063 } class_mac;
00064 
00065 int LanRouter::next_hop(Packet *p) {
00066     if (switch_ && switch_->classify(p)==1) {
00067         return -1;
00068     }
00069     if (!routelogic_) return -1;
00070 
00071     hdr_ip* iph= hdr_ip::access(p);
00072     char* adst= Address::instance().print_nodeaddr(iph->daddr());
00073     int next_hopIP;
00074 
00075     if (enableHrouting_) {
00076         char* bdst;
00077 
00078         routelogic_->lookup_hier(lanaddr_, adst, next_hopIP);
00079         // hacking: get rid of the last "."
00080         bdst = Address::instance().print_nodeaddr(next_hopIP);
00081 //      bdst[strlen(bdst)-1] = '\0';
00082         Tcl &tcl = Tcl::instance();
00083         tcl.evalf("[Simulator instance] get-node-id-by-addr %s", bdst);
00084         sscanf(tcl.result(), "%d", &next_hopIP);
00085         delete [] bdst;
00086     } else {
00087         routelogic_->lookup_flat(lanaddr_, adst, next_hopIP);
00088     }
00089     delete [] adst;
00090 
00091     return next_hopIP;
00092 }
00093 int LanRouter::command(int argc, const char*const* argv)
00094 {
00095     // Tcl& tcl = Tcl::instance();
00096     if (argc == 3) {
00097         // cmd lanaddr <addr>
00098         if (strcmp(argv[1], "lanaddr") == 0) {
00099             strcpy(lanaddr_, argv[2]);
00100             return (TCL_OK);
00101         }
00102         // cmd routing hier|flat
00103         if (strcmp(argv[1], "routing") == 0) {
00104             if (strcmp(argv[2], "hier")==0)
00105                 enableHrouting_= true;
00106             else if (strcmp(argv[2], "flat")==0)
00107                 enableHrouting_= false;
00108             else return (TCL_ERROR);
00109             return (TCL_OK);
00110         }
00111         // cmd switch <switch>
00112         if (strcmp(argv[1], "switch") == 0) {
00113             switch_ = (Classifier*) TclObject::lookup(argv[2]);
00114             return (TCL_OK);
00115         }
00116         // cmd routelogic <routelogic>
00117         if (strcmp(argv[1], "routelogic") == 0) {
00118             routelogic_ = (RouteLogic*) TclObject::lookup(argv[2]);
00119             return (TCL_OK);
00120         }
00121     }
00122     return NsObject::command(argc, argv);
00123 }
00124 
00125 
00126 
00127 
00128 
00129 

Generated on Tue Mar 6 16:47:46 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6