00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #include <climits>
00022
00023 #include "DiscoveryCommand.h"
00024 #include "discovery/Discovery.h"
00025 #include "discovery/DiscoveryTable.h"
00026 #include "conv_layers/ConvergenceLayer.h"
00027 #include <oasys/util/StringBuffer.h>
00028
00029 namespace dtn {
00030
00031 DiscoveryCommand::DiscoveryCommand()
00032 : TclCommand("discovery")
00033 {
00034 add_to_help("add <discovery_name> <address_family> <port=N> "
00035 "[<continue_on_error=true|false> "
00036 "<addr=A.B.C.D> <local_addr=A.B.C.D> <multicast_ttl=N> "
00037 "<unicast=true|false>]",
00038 "add discovery agent (address family can be ip or bt "
00039 "[Bluetooth])");
00040
00041 add_to_help("del <discovery_name>","remove discovery agent");
00042
00043 add_to_help("announce <cl_name> <discovery_name> <cl_type> "
00044 "<interval=N> [<cl_addr=A.B.C.D> <cl_port=N>]",
00045 "announce the address of a local interface (convergence "
00046 "layer)");
00047 add_to_help("remove <name>","remove announcement for local interface");
00048 add_to_help("list","list all discovery agents and announcements");
00049 }
00050
00051 int
00052 DiscoveryCommand::exec(int argc, const char** argv, Tcl_Interp* interp)
00053 {
00054 (void)interp;
00055 if (strncasecmp("list",argv[1],4) == 0)
00056 {
00057 if (argc > 2)
00058 {
00059 wrong_num_args(argc, argv, 1, 2, 2);
00060 }
00061
00062 oasys::StringBuffer buf;
00063 DiscoveryTable::instance()->dump(&buf);
00064 set_result(buf.c_str());
00065
00066 return TCL_OK;
00067 }
00068 else
00069
00070
00071 if (strncasecmp("add",argv[1],3) == 0)
00072 {
00073 if (argc < 4)
00074 {
00075 wrong_num_args(argc, argv, 2, 4, INT_MAX);
00076 return TCL_ERROR;
00077 }
00078
00079 const char* name = argv[2];
00080 const char* afname = argv[3];
00081
00082 const char* err = "(unknown error)";
00083 if (! DiscoveryTable::instance()->add(name, afname,
00084 argc - 4, argv + 4,
00085 &err))
00086 {
00087 resultf("error adding agent %s: %s", name, err);
00088 return TCL_ERROR;
00089 }
00090 return TCL_OK;
00091 }
00092 else
00093
00094 if (strncasecmp("del",argv[1],3) == 0)
00095 {
00096 if (argc != 3)
00097 {
00098 wrong_num_args(argc,argv,2,3,3);
00099 return TCL_ERROR;
00100 }
00101
00102 const char* name = argv[2];
00103
00104 if (! DiscoveryTable::instance()->del(name))
00105 {
00106 resultf("error removing agent %s", name);
00107 return TCL_ERROR;
00108 }
00109
00110 return TCL_OK;
00111 }
00112
00113
00114 else
00115 if (strncasecmp("announce",argv[1],8) == 0)
00116 {
00117 if (argc < 6)
00118 {
00119 wrong_num_args(argc,argv,2,6,INT_MAX);
00120 return TCL_ERROR;
00121 }
00122
00123 const char* name = argv[2];
00124 const char* dname = argv[3];
00125
00126 DiscoveryList::iterator iter;
00127 if (! DiscoveryTable::instance()->find(dname,&iter))
00128 {
00129 resultf("error adding announce %s to %s: "
00130 "no such discovery agent",
00131 name,dname);
00132 return TCL_ERROR;
00133 }
00134
00135 Discovery* disc = *iter;
00136 if (! disc->announce(name,argc - 4,argv + 4))
00137 {
00138 resultf("error adding announce %s to %s",name,dname);
00139 return TCL_ERROR;
00140 }
00141 return TCL_OK;
00142 }
00143 else
00144
00145 if (strncasecmp("remove",argv[1],6) == 0)
00146 {
00147 if (argc != 4)
00148 {
00149 wrong_num_args(argc,argv,2,4,4);
00150 return TCL_ERROR;
00151 }
00152
00153 const char* name = argv[2];
00154 const char* dname = argv[3];
00155
00156 DiscoveryList::iterator iter;
00157 if (! DiscoveryTable::instance()->find(dname,&iter))
00158 {
00159 resultf("error removing announce %s from %s: no such discovery agent",
00160 name,dname);
00161 return TCL_ERROR;
00162 }
00163
00164 Discovery* disc = *iter;
00165 if (! disc->remove(name))
00166 {
00167 resultf("error removing announce %s from %s: no such announce",
00168 name,dname);
00169 return TCL_ERROR;
00170 }
00171 return TCL_OK;
00172 }
00173
00174 resultf("invalid discovery command: %s",argv[1]);
00175 return TCL_ERROR;
00176 }
00177
00178 }