DiscoveryCommand.cc

Go to the documentation of this file.
00001 /*
00002  *    Copyright 2006 Baylor University
00003  * 
00004  *    Licensed under the Apache License, Version 2.0 (the "License");
00005  *    you may not use this file except in compliance with the License.
00006  *    You may obtain a copy of the License at
00007  * 
00008  *        http://www.apache.org/licenses/LICENSE-2.0
00009  * 
00010  *    Unless required by applicable law or agreed to in writing, software
00011  *    distributed under the License is distributed on an "AS IS" BASIS,
00012  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  *    See the License for the specific language governing permissions and
00014  *    limitations under the License.
00015  */
00016 
00017 #include "DiscoveryCommand.h"
00018 #include "discovery/Discovery.h"
00019 #include "discovery/DiscoveryTable.h"
00020 #include "conv_layers/ConvergenceLayer.h"
00021 #include <oasys/util/StringBuffer.h>
00022 
00023 namespace dtn {
00024 
00025 DiscoveryCommand::DiscoveryCommand()
00026     : TclCommand("discovery")
00027 {
00028     add_to_help("add <discovery_name> <address_family> <port=N> "
00029                 "[<addr=A.B.C.D> <local_addr=A.B.C.D> <multicast_ttl=N> "
00030                 "<channel=N> <unicast=true|false>]",
00031                 "add discovery agent (address family can be ip or bt "
00032                 "[Bluetooth])");
00033     add_to_help("del <discovery_name>","remove discovery agent"); 
00034     // discovery add_cl <name> <discovery name> <cl type> [<args>]
00035     add_to_help("announce <cl_name> <discovery_name> <cl_type> "
00036                 "<interval=N> [<cl_addr=A.B.C.D> <cl_port=N>]",
00037                 "announce the address of a local interface (convergence "
00038                 "layer)");
00039     add_to_help("remove <name>","remove announcement for local interface");
00040     add_to_help("list","list all discovery agents and announcements");
00041 }
00042 
00043 int
00044 DiscoveryCommand::exec(int argc, const char** argv, Tcl_Interp* interp)
00045 {
00046     (void)interp;
00047     if (strncasecmp("list",argv[1],4) == 0)
00048     {
00049         if (argc > 2)
00050         {
00051             wrong_num_args(argc, argv, 1, 2, 2);
00052         }
00053 
00054         oasys::StringBuffer buf;
00055         DiscoveryTable::instance()->dump(&buf);
00056         set_result(buf.c_str());
00057 
00058         return TCL_OK;
00059     }
00060     else
00061     // discovery add <name> <address family> <port>
00062     // [<local_addr> <addr> <multicast_ttl>  <channel>]
00063     if (strncasecmp("add",argv[1],3) == 0)
00064     {
00065         if (argc < 4)
00066         {
00067             wrong_num_args(argc, argv, 2, 4, INT_MAX);
00068             return TCL_ERROR;
00069         }
00070 
00071         const char* name = argv[2];
00072         const char* afname = argv[3];
00073 
00074         if (! DiscoveryTable::instance()->add(name,afname,argc - 4,argv + 4))
00075         {
00076             resultf("error adding agent %s", name);
00077             return TCL_ERROR;
00078         }
00079         return TCL_OK;
00080     }
00081     else
00082     // discovery del <name>
00083     if (strncasecmp("del",argv[1],3) == 0)
00084     {
00085         if (argc != 3)
00086         {
00087             wrong_num_args(argc,argv,2,3,3);
00088             return TCL_ERROR;
00089         }
00090 
00091         const char* name = argv[2];
00092         
00093         if (! DiscoveryTable::instance()->del(name))
00094         {
00095             resultf("error removing agent %s", name);
00096             return TCL_ERROR;
00097         }
00098 
00099         return TCL_OK;
00100     }
00101     // discovery announce <name> <discovery name> <cl type> <interval> 
00102     //                    [<cl_addr> <cl_port>]
00103     else
00104     if (strncasecmp("announce",argv[1],8) == 0)
00105     {
00106         if (argc < 6)
00107         {
00108             wrong_num_args(argc,argv,2,6,INT_MAX);
00109             return TCL_ERROR;
00110         }
00111 
00112         const char* name = argv[2];
00113         const char* dname = argv[3];
00114 
00115         DiscoveryList::iterator iter;
00116         if (! DiscoveryTable::instance()->find(dname,&iter))
00117         {
00118             resultf("error adding announce %s to %s: "
00119                     "no such discovery agent",
00120                     name,dname);
00121             return TCL_ERROR;
00122         }
00123 
00124         Discovery* disc = *iter;
00125         if (! disc->announce(name,argc - 4,argv + 4))
00126         {
00127             resultf("error adding announce %s to %s",name,dname);
00128             return TCL_ERROR;
00129         }
00130         return TCL_OK;
00131     }
00132     else
00133     // discovery remove <name> <discovery name>
00134     if (strncasecmp("remove",argv[1],6) == 0)
00135     {
00136         if (argc != 4)
00137         {
00138             wrong_num_args(argc,argv,2,4,4);
00139             return TCL_ERROR;
00140         }
00141 
00142         const char* name = argv[2];
00143         const char* dname = argv[3];
00144 
00145         DiscoveryList::iterator iter;
00146         if (! DiscoveryTable::instance()->find(dname,&iter))
00147         {
00148             resultf("error removing announce %s from %s: no such discovery agent",
00149                     name,dname);
00150             return TCL_ERROR;
00151         }
00152 
00153         Discovery* disc = *iter;
00154         if (! disc->remove(name))
00155         {
00156             resultf("error removing announce %s from %s: no such announce",
00157                     name,dname);
00158             return TCL_ERROR;
00159         }
00160         return TCL_OK;
00161     }
00162 
00163     resultf("invalid discovery command: %s",argv[1]);
00164     return TCL_ERROR;
00165 }
00166 
00167 } // namespace dtn

Generated on Thu Jun 7 16:56:49 2007 for DTN Reference Implementation by  doxygen 1.5.1